diff --git a/src/main/java/org/olat/admin/user/SystemRolesAndRightsForm.java b/src/main/java/org/olat/admin/user/SystemRolesAndRightsForm.java
index 3f59d7b6a9181273ff024c3b89774313818aadb4..d9d52808bfab0f8bea5fffa110b8b525e47a1fbf 100644
--- a/src/main/java/org/olat/admin/user/SystemRolesAndRightsForm.java
+++ b/src/main/java/org/olat/admin/user/SystemRolesAndRightsForm.java
@@ -253,8 +253,13 @@ public class SystemRolesAndRightsForm extends FormBasicController {
 	}
 	
 	private void setStatus(Integer status) {
-		statusRE.select(status.toString(), true);
-		statusRE.setEnabled(status != Identity.STATUS_DELETED);
+		String statusStr = status.toString();
+		for(String statusKey:statusKeys) {
+			if(statusStr.equals(statusKey)) {
+				statusRE.select(statusKey, true);
+			}
+		}
+		statusRE.setEnabled(!Identity.STATUS_DELETED.equals(status));
 	}
 
 	public boolean getSendLoginDeniedEmail() {
diff --git a/src/main/java/org/olat/core/commons/modules/bc/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/commons/modules/bc/_i18n/LocalStrings_de.properties
index 1092ed4ced81335b16a7904eb418a5bbda7249e8..2bd0f364fbece25ce0749a9ef8ce1c1716936f1c 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/core/commons/modules/bc/_i18n/LocalStrings_de.properties
@@ -137,7 +137,7 @@ resize_image=Bildgr\u00F6sse f\u00FCr das Web optimieren (1280 x 1280)
 searchfile=Suchen
 send=Mail versenden
 subpath.error.dir.is.file=Es existiert bereits eine Datei mit diesem Pfad
-subpath.error.characters=Der Pfad enth\u00E4lt ung\u00FClige Zeichen. Verwenden Sie ausschliesslich a-z, 0-9 sowie die Sonderzeichen '-' und '_'. Um Unterverzeichnisse zu trennen verwenden Sie '/'.
+subpath.error.characters=Der Pfad enth\u00E4lt ung\u00FCltige Zeichen. Verwenden Sie ausschliesslich a-z, 0-9 sowie die Sonderzeichen '-' und '_'. Um Unterverzeichnisse zu trennen verwenden Sie '/'.
 success=Operation erfolgreich
 text.element.error.notlongerthan=Dateien und Ordner d\u00FCrfen nicht mehr als 20 Zeichen enthalten.
 ul=Datei hochladen
diff --git a/src/main/java/org/olat/core/gui/control/navigation/callback/AdminSecurityCallback.java b/src/main/java/org/olat/core/gui/control/navigation/callback/AdminSecurityCallback.java
index 9badfcc5bd6cacce5ad42ac9c9269e34ce3c1b96..2a06d421a30d3b5de2733718e996865a7782bb14 100644
--- a/src/main/java/org/olat/core/gui/control/navigation/callback/AdminSecurityCallback.java
+++ b/src/main/java/org/olat/core/gui/control/navigation/callback/AdminSecurityCallback.java
@@ -38,10 +38,8 @@ public class AdminSecurityCallback implements SiteSecurityCallback {
 	 */
 	@Override
 	public boolean isAllowedToLaunchSite(UserRequest ureq) {
-		if (ureq.getUserSession().getRoles().isOLATAdmin()) {
-			return true;
-		} else {
-			return false; 
-		}
+		return ureq != null && ureq.getUserSession() != null
+				&& ureq.getUserSession().getRoles() != null
+				&& ureq.getUserSession().getRoles().isOLATAdmin();
 	}
 }
diff --git a/src/main/java/org/olat/course/assessment/AssessmentModeManager.java b/src/main/java/org/olat/course/assessment/AssessmentModeManager.java
index 0924eda773abe4fc199b845cff6e1c7843622927..d9df8ceb9c8dae6157e83f01f4ecc191d771cb55 100644
--- a/src/main/java/org/olat/course/assessment/AssessmentModeManager.java
+++ b/src/main/java/org/olat/course/assessment/AssessmentModeManager.java
@@ -28,6 +28,7 @@ import javax.servlet.http.HttpServletRequest;
 import org.olat.basesecurity.IdentityRef;
 import org.olat.course.assessment.model.SearchAssessmentModeParams;
 import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupRef;
 import org.olat.group.area.BGArea;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryRef;
@@ -47,8 +48,12 @@ public interface AssessmentModeManager {
 	 */
 	public AssessmentMode createAssessmentMode(RepositoryEntry entry);
 	
+
+	
 	public AssessmentModeToGroup createAssessmentModeToGroup(AssessmentMode mode, BusinessGroup group);
 	
+	public void deleteAssessmentModesToGroup(BusinessGroupRef group);
+	
 	public AssessmentModeToArea createAssessmentModeToArea(AssessmentMode mode, BGArea area);
 	
 
@@ -62,7 +67,26 @@ public interface AssessmentModeManager {
 	 */
 	public AssessmentMode merge(AssessmentMode assessmentMode, boolean forceStatus);
 	
+	/**
+	 * Delete a specific assessment mode.
+	 * 
+	 * @param assessmentMode
+	 */
 	public void delete(AssessmentMode assessmentMode);
+	
+	/**
+	 * Delete all assessment modes of a course.
+	 * 
+	 * @param entry
+	 */
+	public void delete(RepositoryEntryRef entry);
+	
+	/**
+	 * Delete the relations between assessment mode and group for the specified business group and course.
+	 * @param businessGroup
+	 * @param entry
+	 */
+	public void delete(BusinessGroupRef businessGroup, RepositoryEntryRef entry);
 
 	
 	public AssessmentMode getAssessmentModeById(Long key);
diff --git a/src/main/java/org/olat/course/assessment/manager/AssessmentModeManagerImpl.java b/src/main/java/org/olat/course/assessment/manager/AssessmentModeManagerImpl.java
index e6b798264b49a865a3725595e388b32a09dc58f7..1e5b7ba890e20f2ce20bdd7b78aaa30b570c67d5 100644
--- a/src/main/java/org/olat/course/assessment/manager/AssessmentModeManagerImpl.java
+++ b/src/main/java/org/olat/course/assessment/manager/AssessmentModeManagerImpl.java
@@ -19,7 +19,8 @@
  */
 package org.olat.course.assessment.manager;
 
-import static org.olat.core.commons.persistence.PersistenceHelper.*;
+import static org.olat.core.commons.persistence.PersistenceHelper.appendAnd;
+import static org.olat.core.commons.persistence.PersistenceHelper.appendFuzzyLike;
 
 import java.util.ArrayList;
 import java.util.Calendar;
@@ -55,6 +56,7 @@ import org.olat.course.assessment.model.AssessmentModeToGroupImpl;
 import org.olat.course.assessment.model.SearchAssessmentModeParams;
 import org.olat.group.BusinessGroup;
 import org.olat.group.BusinessGroupImpl;
+import org.olat.group.BusinessGroupRef;
 import org.olat.group.area.BGArea;
 import org.olat.group.area.BGAreaManager;
 import org.olat.group.area.BGtoAreaRelationImpl;
@@ -175,6 +177,13 @@ public class AssessmentModeManagerImpl implements AssessmentModeManager {
 		dbInstance.getCurrentEntityManager().remove(refMode);
 	}
 
+	@Override
+	public void delete(RepositoryEntryRef entry) {
+		for(AssessmentMode mode: getAssessmentModeFor(entry)) {
+			delete(mode);
+		}
+	}
+
 	@Override
 	public AssessmentMode getAssessmentModeById(Long key) {
 		List<AssessmentMode> modes = dbInstance.getCurrentEntityManager()
@@ -400,6 +409,23 @@ public class AssessmentModeManagerImpl implements AssessmentModeManager {
 		return modeToGroup;
 	}
 
+	@Override
+	public void deleteAssessmentModesToGroup(BusinessGroupRef businessGroup) {
+		String q = "delete from courseassessmentmodetogroup as modegrrel where modegrrel.businessGroup.key=:groupKey";
+		dbInstance.getCurrentEntityManager().createQuery(q)
+			.setParameter("groupKey", businessGroup.getKey())
+			.executeUpdate();
+	}
+	
+	@Override
+	public void delete(BusinessGroupRef businessGroup, RepositoryEntryRef entry) {
+		String q = "delete from courseassessmentmodetogroup as modegrrel where modegrrel.businessGroup.key=:groupKey and modegrrel.assessmentMode.key in (select amode.key from courseassessmentmode amode where amode.repositoryEntry.key=:repoKey)";
+		dbInstance.getCurrentEntityManager().createQuery(q)
+			.setParameter("groupKey", businessGroup.getKey())
+			.setParameter("repoKey", entry.getKey())
+			.executeUpdate();
+	}
+
 	@Override
 	public AssessmentModeToArea createAssessmentModeToArea(AssessmentMode mode, BGArea area) {
 		AssessmentModeToAreaImpl modeToArea = new AssessmentModeToAreaImpl();
diff --git a/src/main/java/org/olat/course/assessment/ui/AssessmentModeEditController.java b/src/main/java/org/olat/course/assessment/ui/AssessmentModeEditController.java
index fef77e4e632b69a6071d4de3325267893c2678a6..ea974540aeaed064f70d844e96633c59d377883c 100644
--- a/src/main/java/org/olat/course/assessment/ui/AssessmentModeEditController.java
+++ b/src/main/java/org/olat/course/assessment/ui/AssessmentModeEditController.java
@@ -275,8 +275,11 @@ public class AssessmentModeEditController extends FormBasicController {
 		String elements = assessmentMode.getElementList();
 		if(StringHelper.containsNonWhitespace(elements)) {
 			for(String element:elements.split(",")) {
-				elementKeys.add(element);
-				elementNames.add(getCourseNodeName(element, treeModel));
+				String courseNodeName = getCourseNodeName(element, treeModel);
+				if(StringHelper.containsNonWhitespace(courseNodeName)) {
+					elementKeys.add(element);
+					elementNames.add(courseNodeName);
+				}
 			}
 		}
 		chooseElementsCont.getFormItemComponent().contextPut("elementNames", elementNames);
@@ -447,7 +450,7 @@ public class AssessmentModeEditController extends FormBasicController {
 		if(targetEl.isOneSelected()) {
 			Target target = AssessmentMode.Target.valueOf(targetEl.getSelectedKey());
 			if(target == Target.courseAndGroups || target == Target.groups) {
-				if(groupKeys.isEmpty()) {
+				if(groupKeys.isEmpty() && areaKeys.isEmpty()) {
 					targetEl.setErrorKey("error.group.missing", null);
 					allOk &= false;
 				}	
diff --git a/src/main/java/org/olat/course/assessment/ui/ChooseElementsController.java b/src/main/java/org/olat/course/assessment/ui/ChooseElementsController.java
index 34e37e4139f1b97bea0565990c607e9c33353451..882f4cbe052b341cc94f88b9926449b6842bd388 100644
--- a/src/main/java/org/olat/course/assessment/ui/ChooseElementsController.java
+++ b/src/main/java/org/olat/course/assessment/ui/ChooseElementsController.java
@@ -117,9 +117,9 @@ public class ChooseElementsController extends FormBasicController {
 	@Override
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
 		if(selectAll == source) {
-			
+			selectTree.selectAll();
 		} else if(deselectAll == source) {
-			
+			selectTree.deselectAll();
 		}
 		super.formInnerEvent(ureq, source, event);
 	}
diff --git a/src/main/java/org/olat/course/assessment/ui/_content/choose_elements.html b/src/main/java/org/olat/course/assessment/ui/_content/choose_elements.html
index 758b234ea44d1ade3f12943a4e381f3e59e8596d..1541fa0d443768ea37ff3365e4a1814f56bb73e9 100644
--- a/src/main/java/org/olat/course/assessment/ui/_content/choose_elements.html
+++ b/src/main/java/org/olat/course/assessment/ui/_content/choose_elements.html
@@ -1,7 +1,7 @@
 #if($elementNames && $elementNames.size() > 0)
 	$r.translate("elements"):
 	#foreach($elementName in $elementNames)
-		<span>$elementName</span>
+		<span>#if($elementNames.indexOf($elementName) > 0), #end$elementName</span>
 	#end
 	<br/>
 #end
diff --git a/src/main/java/org/olat/course/run/CourseRuntimeController.java b/src/main/java/org/olat/course/run/CourseRuntimeController.java
index bde1946cfdd5d49b0c614ddcf80fbc6d934b6ec8..31027f4a306c4ab029ce9a389b7651429c4a4ec1 100644
--- a/src/main/java/org/olat/course/run/CourseRuntimeController.java
+++ b/src/main/java/org/olat/course/run/CourseRuntimeController.java
@@ -199,23 +199,25 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 			boolean offerBookmark, boolean showCourseConfigLink) {
 		super(ureq, wControl, re, reSecurity, runtimeControllerCreator, offerBookmark, showCourseConfigLink);
 		
-		ICourse course = CourseFactory.loadCourse(getOlatResourceable());
-		addLoggingResourceable(LoggingResourceable.wrap(course));
+		if(!corrupted) {
+			ICourse course = CourseFactory.loadCourse(getOlatResourceable());
+			addLoggingResourceable(LoggingResourceable.wrap(course));
 
-		coordinatorManager.getCoordinator().getEventBus().registerFor(this, getIdentity(), getOlatResourceable());
-		// - group modification events
-		coordinatorManager.getCoordinator().getEventBus().registerFor(this, getIdentity(), getRepositoryEntry());
-		
-		if (CourseModule.displayParticipantsCount()) {
-			coordinatorManager.getCoordinator().getEventBus().fireEventToListenersOf(new MultiUserEvent(JOINED), getOlatResourceable());
-			updateCurrentUserCount();
-		}
-		
-		if(enableGlossaryLink != null) {
-			Preferences prefs = ureq.getUserSession().getGuiPreferences();
-			String guiPrefsKey = CourseGlossaryFactory.createGuiPrefsKey(course);
-			Boolean state = (Boolean) prefs.get(CourseGlossaryToolLinkController.class, guiPrefsKey);
-			setGlossaryLinkTitle(ureq, state);
+			coordinatorManager.getCoordinator().getEventBus().registerFor(this, getIdentity(), getOlatResourceable());
+			// - group modification events
+			coordinatorManager.getCoordinator().getEventBus().registerFor(this, getIdentity(), getRepositoryEntry());
+			
+			if (CourseModule.displayParticipantsCount()) {
+				coordinatorManager.getCoordinator().getEventBus().fireEventToListenersOf(new MultiUserEvent(JOINED), getOlatResourceable());
+				updateCurrentUserCount();
+			}
+			
+			if(enableGlossaryLink != null) {
+				Preferences prefs = ureq.getUserSession().getGuiPreferences();
+				String guiPrefsKey = CourseGlossaryFactory.createGuiPrefsKey(course);
+				Boolean state = (Boolean) prefs.get(CourseGlossaryToolLinkController.class, guiPrefsKey);
+				setGlossaryLinkTitle(ureq, state);
+			}
 		}
 	}
 
@@ -232,6 +234,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 	@Override
 	protected void loadRights(RepositoryEntrySecurity security) {
 		super.loadRights(security);
+		if(corrupted) return;
 		
 		ICourse course = CourseFactory.loadCourse(getOlatResourceable());
 		CourseGroupManager cgm = course.getCourseEnvironment().getCourseGroupManager();
@@ -337,10 +340,11 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 
 	@Override
 	protected void initToolbar(Dropdown toolsDropdown, Dropdown settingsDropdown) {
+		toolbarPanel.removeAllTools();
+		if(corrupted) return;
+		
 		ICourse course = CourseFactory.loadCourse(getRepositoryEntry().getOlatResource());
 		UserCourseEnvironmentImpl uce = getUserCourseEnvironment();
-		
-		toolbarPanel.removeAllTools();
 		if(!isAssessmentLock()) {
 			initTools(toolsDropdown, course, uce);
 			initSettingsTools(settingsDropdown);
diff --git a/src/main/java/org/olat/course/tree/CourseEditorTreeModel.java b/src/main/java/org/olat/course/tree/CourseEditorTreeModel.java
index ea4152590d2926006485d0ab62f083d393e3ac1c..1b9841436ead9f21fe2366e3a17a9d7ac93ce8e3 100644
--- a/src/main/java/org/olat/course/tree/CourseEditorTreeModel.java
+++ b/src/main/java/org/olat/course/tree/CourseEditorTreeModel.java
@@ -67,9 +67,8 @@ public class CourseEditorTreeModel extends GenericTreeModel implements DnDTreeMo
 	 * @return the course node
 	 */
 	public CourseNode getCourseNode(String nodeId) {
-		CourseEditorTreeNode ctn = (CourseEditorTreeNode) getNodeById(nodeId);
-		CourseNode cn = ctn.getCourseNode();
-		return cn;
+		CourseEditorTreeNode ctn = (CourseEditorTreeNode)getNodeById(nodeId);
+		return ctn == null ? null : ctn.getCourseNode();
 	}
 
 	/**
diff --git a/src/main/java/org/olat/group/area/BGAreaManagerImpl.java b/src/main/java/org/olat/group/area/BGAreaManagerImpl.java
index f3dfa6768e707d0e115c7922c15dff89592dd9bd..8fff0988f4e257ffc8a9e4ff486588270f9edb26 100644
--- a/src/main/java/org/olat/group/area/BGAreaManagerImpl.java
+++ b/src/main/java/org/olat/group/area/BGAreaManagerImpl.java
@@ -121,17 +121,20 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager {
 	/**
 	 * @see org.olat.group.area.BGAreaManager#deleteBGArea(org.olat.group.area.BGArea)
 	 */
-	// o_clusterOK by:cg must be synchronized too
+	@Override
 	public void deleteBGArea(final BGArea area) {
 		final OLATResource resource = area.getResource();
 		
-		CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(resource, new SyncerExecutor(){
+		CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(resource, new SyncerExecutor() {
+			@Override
 			public void execute() {
 				BGArea reloadArea = loadArea(area.getKey());
 				if (reloadArea != null) {
 					// 1) delete all area - group relations
 					deleteBGtoAreaRelations(reloadArea);
-					// 2) delete area itself
+					// 2) delete area - assessment mode relations
+					deleteAssessmentModeToAreaRelations(reloadArea);
+					// 3) delete area itself
 					dbInstance.deleteObject(reloadArea);
 					logAudit("Deleted Business Group Area", reloadArea.toString());
 				} else {
@@ -146,6 +149,7 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager {
 	 * 
 	 * @param group
 	 */
+	@Override
 	public void deleteBGtoAreaRelations(BusinessGroup group) {
 		StringBuilder sb = new StringBuilder();
 		sb.append(" delete from ").append(BGtoAreaRelationImpl.class.getName()).append(" as bgarel where bgarel.businessGroup.key=:groupKey");
@@ -464,4 +468,13 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager {
 			.setParameter("areaKey", area.getKey())
 			.executeUpdate();
 	}
+	
+	private void deleteAssessmentModeToAreaRelations(BGArea area) {
+		StringBuilder sb = new StringBuilder();
+		sb.append("delete from courseassessmentmodetoarea as modearel where modearel.area.key=:areaKey");
+		
+		dbInstance.getCurrentEntityManager().createQuery(sb.toString())
+			.setParameter("areaKey", area.getKey())
+			.executeUpdate();
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/group/manager/BusinessGroupRelationDAO.java b/src/main/java/org/olat/group/manager/BusinessGroupRelationDAO.java
index 6940e1bd3102345466fa3bc9a27f5483e26a79e7..e009a6411797a3c10497290e5b5735c8912d6dfd 100644
--- a/src/main/java/org/olat/group/manager/BusinessGroupRelationDAO.java
+++ b/src/main/java/org/olat/group/manager/BusinessGroupRelationDAO.java
@@ -40,6 +40,7 @@ import org.olat.core.commons.persistence.DB;
 import org.olat.core.commons.persistence.PersistenceHelper;
 import org.olat.core.id.Identity;
 import org.olat.core.util.StringHelper;
+import org.olat.course.assessment.AssessmentModeManager;
 import org.olat.group.BusinessGroup;
 import org.olat.group.BusinessGroupImpl;
 import org.olat.group.BusinessGroupRef;
@@ -66,6 +67,8 @@ public class BusinessGroupRelationDAO {
 	@Autowired
 	private GroupDAO groupDao;
 	@Autowired
+	private AssessmentModeManager assessmentModeMgr;
+	@Autowired
 	private RepositoryEntryRelationDAO repositoryEntryRelationDao;
 	
 	public void addRelationToResource(BusinessGroup group, RepositoryEntry re) {
@@ -369,6 +372,7 @@ public class BusinessGroupRelationDAO {
 	}
 	
 	public void deleteRelation(BusinessGroup group, RepositoryEntryRef entry) {
+		assessmentModeMgr.delete(group, entry);
 		repositoryEntryRelationDao.removeRelation(group.getBaseGroup(), entry);
 	}
 	
diff --git a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
index 2f84d88b7f255cc3b4fcab40878d5c38331587e0..59fcf59e3ab656025cb7f651b52c6c2dc4948569 100644
--- a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
+++ b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
@@ -68,6 +68,7 @@ import org.olat.core.util.mail.MailTemplate;
 import org.olat.core.util.mail.MailerResult;
 import org.olat.core.util.resource.OLATResourceableJustBeforeDeletedEvent;
 import org.olat.core.util.resource.OresHelper;
+import org.olat.course.assessment.AssessmentModeManager;
 import org.olat.group.BusinessGroup;
 import org.olat.group.BusinessGroupAddResponse;
 import org.olat.group.BusinessGroupManagedFlag;
@@ -147,6 +148,8 @@ public class BusinessGroupServiceImpl implements BusinessGroupService, UserDataD
 	@Autowired
 	private ContactDAO contactDao;
 	@Autowired
+	private AssessmentModeManager assessmentModeMgr;
+	@Autowired
 	private BusinessGroupRelationDAO businessGroupRelationDAO;
 	@Autowired
 	private RepositoryEntryRelationDAO repositoryEntryRelationDao;
@@ -747,6 +750,7 @@ public class BusinessGroupServiceImpl implements BusinessGroupService, UserDataD
 			areaManager.deleteBGtoAreaRelations(group);
 			// 3) Delete the relations
 			businessGroupRelationDAO.deleteRelationsToRepositoryEntry(group);
+			assessmentModeMgr.deleteAssessmentModesToGroup(group);
 			// 4) delete properties
 			propertyManager.deleteProperties(null, group, null, null, null);
 			propertyManager.deleteProperties(null, null, group, null, null);
diff --git a/src/main/java/org/olat/group/ui/edit/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/group/ui/edit/_i18n/LocalStrings_de.properties
index 776ef4c1eb38e1e8f4b406906735cab0b16b53f5..60203ec8c60376bc7036038f1b7791d60e990696 100644
--- a/src/main/java/org/olat/group/ui/edit/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/group/ui/edit/_i18n/LocalStrings_de.properties
@@ -96,8 +96,8 @@ group.edit.tab.members=Mitglieder
 group.edit.tab.resources=Kurse
 group.edit.tab.rights=Berechtigungen
 group.edit.title=Gruppe <i>{0}</i> editieren
-help.hover.allowLeaving=Hile zur Konfiguration den Teilnehmer
-help.hover.bgArea=Hilfe zur Zuweisung von Lernbereichen zu Gruppe
+help.hover.allowLeaving=Hilfe zur Konfiguration der Mitgliedschaft
+help.hover.bgArea=Hilfe zur Zuweisung von Lernbereichen zu Gruppen
 help.hover.bgCollabTools=Hilfe zu den kollaborativen Werkzeugen einer Gruppe
 help.hover.bgDetail=Hilfe zur Beschreibung einer Gruppe
 help.hover.bgGrpMngmnt=Hilfe zur Anzeige von Mitgliedern in einer Gruppe
diff --git a/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java b/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java
index 52bd589c504e901b74e448df4cb1708729ffb23f..74c6186d44bc2f9a0ec14c8bfb9da598306c7aab 100755
--- a/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java
+++ b/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java
@@ -609,19 +609,17 @@ public class EPFrontendManager implements UserDataDeletable, DeletableGroupData
 	 * sync map with its former source (template)
 	*/
 	public boolean synchronizeStructuredMapToUserCopy(PortfolioStructureMap map) {
-		final EPStructuredMap userMap = (EPStructuredMap) map;
-		final EPStructureManager structMgr = structureManager; // only remove
-																														// synthetic access
-																														// warnings
-
+		if(map == null) return false;
+		
+		final EPStructuredMap userMap = (EPStructuredMap)map;
 		Boolean synched = coordinator.getSyncer().doInSync(map.getOlatResource(), new SyncerCallback<Boolean>() {
 			public Boolean execute() {
 				if (userMap.getStructuredMapSource() == null) { return Boolean.FALSE; }
 				// need to reload it, I don't know why
 				Long templateKey = userMap.getStructuredMapSource().getKey();
 				userMap.setLastSynchedDate(new Date());
-				PortfolioStructure template = structMgr.loadPortfolioStructureByKey(templateKey);
-				structMgr.syncStructureRecursively(template, userMap, true);
+				PortfolioStructure template = structureManager.loadPortfolioStructureByKey(templateKey);
+				structureManager.syncStructureRecursively(template, userMap, true);
 				return Boolean.TRUE;
 			}
 		});
diff --git a/src/main/java/org/olat/portfolio/ui/structel/EPMapViewController.java b/src/main/java/org/olat/portfolio/ui/structel/EPMapViewController.java
index a7fa6e0b4129cafaee8dc48b4d2d99d44c407663..4e0419aebd8426ce04ab61f18cb5281a30cb889f 100644
--- a/src/main/java/org/olat/portfolio/ui/structel/EPMapViewController.java
+++ b/src/main/java/org/olat/portfolio/ui/structel/EPMapViewController.java
@@ -107,7 +107,16 @@ public class EPMapViewController extends BasicController implements Activateable
 		if (map instanceof EPStructuredMap && (map.getStatus() == null || !map.getStatus().equals(StructureStatusEnum.CLOSED) )){
 			map = (PortfolioStructureMap) ePFMgr.loadPortfolioStructureByKey(map.getKey());
 			boolean syncOk = ePFMgr.synchronizeStructuredMapToUserCopy(map);
-			if (syncOk) showInfo("synced.map.success");
+			if (syncOk) {
+				showInfo("synced.map.success");
+			} else if(map == null) {
+				showWarning("synced.map.deleted");
+				putInitialPanel(createVelocityContainer("map_deleted"));
+				return;
+			} else {
+				showError("synced.map.error");
+				
+			}
 		}
 		
 		if(EPSecurityCallbackFactory.isLockNeeded(secCallback)) {
diff --git a/src/main/java/org/olat/portfolio/ui/structel/_content/map_deleted.html b/src/main/java/org/olat/portfolio/ui/structel/_content/map_deleted.html
new file mode 100644
index 0000000000000000000000000000000000000000..cd8e20c4e6b17a9bdf64926b507d942cd978797d
--- /dev/null
+++ b/src/main/java/org/olat/portfolio/ui/structel/_content/map_deleted.html
@@ -0,0 +1 @@
+<div class="o_warning">$r.translate("synced.map.deleted")</div>
\ No newline at end of file
diff --git a/src/main/java/org/olat/portfolio/ui/structel/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/portfolio/ui/structel/_i18n/LocalStrings_de.properties
index 958d727d42c84d42e680047e42acf3cc6fa41eab..855a97aac76fbcfbbef9930bdcbea0f7b5cf0699 100644
--- a/src/main/java/org/olat/portfolio/ui/structel/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/portfolio/ui/structel/_i18n/LocalStrings_de.properties
@@ -97,6 +97,8 @@ map.share.invitation.mail.success=Die eingeladenen Personen wurden erfolgreich p
 map.share.invitation.mail.failure=Fehler beim Versenden der E-Mail. Die eingeladenen Personen konnten nicht per E-Mail benachrichtigt werden. Versuchen Sie es später noch einmal oder kontaktieren Sie den Support.
 map.is.closed.hint=Mappe geschlossen
 synced.map.success=Diese Mappe wurde mit der ursprünglichen Vorlage synchronisiert.
+synced.map.deleted=Diese Mappe wurde gelöscht.
+synced.map.error=Diese Mappe konnte nicht mit der ursprünglichen Vorlage synchronisiert werden.
 map.style.default=Schlicht
 map.style.comic=Comic
 map.style.leather=Leder
diff --git a/src/main/java/org/olat/portfolio/ui/structel/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/portfolio/ui/structel/_i18n/LocalStrings_en.properties
index a78df089f26c55d187b50fc9343b6cb4a8d3771e..4b80986024d5c5940d816e4018422d9f5ed3cb8f 100644
--- a/src/main/java/org/olat/portfolio/ui/structel/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/portfolio/ui/structel/_i18n/LocalStrings_en.properties
@@ -134,6 +134,8 @@ restrict.show.limited=Show only those binders released for me
 restrictions.not.conform=You haven't abided by all restrictions. Please mind the requirements.
 save.and.open.map=Save and open binder
 synced.map.success=This folder has been synchronized with its original template.
+synced.map.deleted=This folder was deleted.
+synced.map.error=This folder cannot be synchronized with its original template.
 template.alreadyInUse=This template has already been copied by at least one user. When modifying your template this copy will be synchronized as well. It is possible to delete elements or expand your template; however, links to artefacts already existing may be lost\!
 toc=Table of contents
 view.map=Open
diff --git a/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java b/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
index 2ef2a88926ec118dd4ac70493555d2e27697ca10..8fea6e25bf641ba7e59b9216b5f91448bf5f9e3a 100644
--- a/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
+++ b/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
@@ -52,12 +52,13 @@ import org.olat.core.util.vfs.LocalFolderImpl;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
 import org.olat.core.util.vfs.VFSLeaf;
+import org.olat.course.assessment.AssessmentModeManager;
 import org.olat.course.assessment.manager.UserCourseInformationsManager;
 import org.olat.course.certificate.CertificatesManager;
 import org.olat.repository.ErrorList;
 import org.olat.repository.RepositoryEntry;
-import org.olat.repository.RepositoryEntryAuthorView;
 import org.olat.repository.RepositoryEntryAllowToLeaveOptions;
+import org.olat.repository.RepositoryEntryAuthorView;
 import org.olat.repository.RepositoryEntryMyView;
 import org.olat.repository.RepositoryEntryRef;
 import org.olat.repository.RepositoryEntryRelationType;
@@ -115,6 +116,8 @@ public class RepositoryServiceImpl implements RepositoryService {
 	private CertificatesManager certificatesManager;
 	@Autowired
 	private UserCourseInformationsManager userCourseInformationsManager;
+	@Autowired
+	private AssessmentModeManager assessmentModeMgr;
 
 	@Autowired
 	private LifeFullIndexer lifeIndexer;
@@ -305,6 +308,8 @@ public class RepositoryServiceImpl implements RepositoryService {
 		CoreSpringFactory.getImpl(MarkManager.class).deleteMarks(entry);
 		// delete all catalog entries referencing deleted entry
 		catalogManager.resourceableDeleted(entry);
+		// delete assessment modes
+		assessmentModeMgr.delete(entry);
 		
 		//delete all policies
 		securityManager.deletePolicies(resource);
diff --git a/src/main/java/org/olat/repository/ui/CorruptedCourseController.java b/src/main/java/org/olat/repository/ui/CorruptedCourseController.java
new file mode 100644
index 0000000000000000000000000000000000000000..20e9dc62bf36bb28253be0c3bec1f53a1deef98c
--- /dev/null
+++ b/src/main/java/org/olat/repository/ui/CorruptedCourseController.java
@@ -0,0 +1,56 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.repository.ui;
+
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.velocity.VelocityContainer;
+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.util.Util;
+import org.olat.repository.RepositoryService;
+
+/**
+ * 
+ * Initial date: 20.04.2015<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class CorruptedCourseController extends BasicController {
+	
+	public CorruptedCourseController(UserRequest ureq, WindowControl wControl) {
+		super(ureq, wControl);
+		setTranslator(Util.createPackageTranslator(RepositoryService.class, getLocale(), getTranslator()));
+		
+		VelocityContainer mainVC = createVelocityContainer("corrupted_course");
+		putInitialPanel(mainVC);
+	}
+
+	@Override
+	protected void event(UserRequest ureq, Component source, Event event) {
+		//
+	}
+
+	@Override
+	protected void doDispose() {
+		//
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java
index 54daf8b8343a88bbcd1a0fa8b0fd5f87b8242395..1ea2a850189879ac5e7f366ad4c3897b487520ef 100644
--- a/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java
+++ b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java
@@ -864,7 +864,11 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 	}
 	
 	protected void launchContent(UserRequest ureq, RepositoryEntrySecurity security) {
-		if(security.canLaunch()) {
+		if(corrupted) {
+			runtimeController = new CorruptedCourseController(ureq, this.getWindowControl());
+			listenTo(runtimeController);
+			toolbarPanel.rootController(re.getDisplayname(), runtimeController);
+		} else if(security.canLaunch()) {
 			runtimeController = runtimeControllerCreator.create(ureq, getWindowControl(), toolbarPanel, re, reSecurity, assessmentMode);
 			listenTo(runtimeController);
 			toolbarPanel.rootController(re.getDisplayname(), runtimeController);
diff --git a/src/main/java/org/olat/repository/ui/_content/corrupted_course.html b/src/main/java/org/olat/repository/ui/_content/corrupted_course.html
new file mode 100644
index 0000000000000000000000000000000000000000..6069b3ff0554782da44007cc5dad1d56ba9d5962
--- /dev/null
+++ b/src/main/java/org/olat/repository/ui/_content/corrupted_course.html
@@ -0,0 +1 @@
+<div class="o_error">$r.translate("cif.error.corrupted")</div>
\ No newline at end of file
diff --git a/src/test/java/org/olat/course/assessment/manager/AssessmentModeManagerTest.java b/src/test/java/org/olat/course/assessment/manager/AssessmentModeManagerTest.java
index b25e62cae21069e1f29dccc82c5592c4169c1ac7..2b7b7e69ff987dd6dd6a6c3c421e16aa5a975e27 100644
--- a/src/test/java/org/olat/course/assessment/manager/AssessmentModeManagerTest.java
+++ b/src/test/java/org/olat/course/assessment/manager/AssessmentModeManagerTest.java
@@ -696,6 +696,145 @@ public class AssessmentModeManagerTest extends OlatTestCase {
 		boolean notAllowed4 = assessmentModeMgr.isIpAllowed(ipList, "212.203.203.64");
 		Assert.assertFalse(notAllowed4);
 	}
+	
+	@Test
+	public void removeBusinessGroupFromRepositoryEntry() {
+		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
+		Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("as-mode-4");
+		Identity participant1 = JunitTestHelper.createAndPersistIdentityAsRndUser("as-mode-5");
+		Identity participant2 = JunitTestHelper.createAndPersistIdentityAsRndUser("as-mode-6");
+		BusinessGroup businessGroup1 = businessGroupService.createBusinessGroup(author, "as-mode-7", "", null, null, null, null, false, false, entry);
+		BusinessGroup businessGroup2 = businessGroupService.createBusinessGroup(author, "as-mode-8", "", null, null, null, null, false, false, entry);
+		businessGroupRelationDao.addRole(participant1, businessGroup1, GroupRoles.participant.name());
+		businessGroupRelationDao.addRole(participant2, businessGroup2, GroupRoles.participant.name());
+		
+		AssessmentMode mode = createMinimalAssessmentmode(entry);
+		mode.setTargetAudience(AssessmentMode.Target.groups);
+		mode.setApplySettingsForCoach(false);
+		mode = assessmentModeMgr.persist(mode);
+		
+		AssessmentModeToGroup modeToGroup1 = assessmentModeMgr.createAssessmentModeToGroup(mode, businessGroup1);
+		AssessmentModeToGroup modeToGroup2 = assessmentModeMgr.createAssessmentModeToGroup(mode, businessGroup2);
+		mode.getGroups().add(modeToGroup1);
+		mode.getGroups().add(modeToGroup2);
+		mode = assessmentModeMgr.merge(mode, true);
+		dbInstance.commitAndCloseSession();
+		Assert.assertNotNull(mode);
+		
+		//check participant 1
+		List<AssessmentMode> currentModes1 = assessmentModeMgr.getAssessmentModeFor(participant1);
+		Assert.assertNotNull(currentModes1);
+		Assert.assertEquals(1, currentModes1.size());
+		Assert.assertTrue(currentModes1.contains(mode));
+		//check participant 2
+		List<AssessmentMode> currentModes2 = assessmentModeMgr.getAssessmentModeFor(participant2);
+		Assert.assertNotNull(currentModes2);
+		Assert.assertEquals(1, currentModes2.size());
+		Assert.assertTrue(currentModes2.contains(mode));
+		
+		//remove business group 1
+		businessGroupRelationDao.deleteRelation(businessGroup1, entry);
+		dbInstance.commitAndCloseSession();
+		
+		//check participant 1
+		List<AssessmentMode> afterDeleteModes1 = assessmentModeMgr.getAssessmentModeFor(participant1);
+		Assert.assertNotNull(afterDeleteModes1);
+		Assert.assertEquals(0, afterDeleteModes1.size());
+		//check participant 2
+		List<AssessmentMode> afterDeleteModes2 = assessmentModeMgr.getAssessmentModeFor(participant2);
+		Assert.assertNotNull(afterDeleteModes2);
+		Assert.assertEquals(1, afterDeleteModes2.size());
+		Assert.assertTrue(afterDeleteModes2.contains(mode));	
+	}
+	
+	@Test
+	public void deleteBusinessGroupFromRepositoryEntry() {
+		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
+		Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("as-mode-9");
+		Identity participant1 = JunitTestHelper.createAndPersistIdentityAsRndUser("as-mode-10");
+		Identity participant2 = JunitTestHelper.createAndPersistIdentityAsRndUser("as-mode-11");
+		BusinessGroup businessGroup1 = businessGroupService.createBusinessGroup(author, "as-mode-12", "", null, null, null, null, false, false, entry);
+		BusinessGroup businessGroup2 = businessGroupService.createBusinessGroup(author, "as-mode-13", "", null, null, null, null, false, false, entry);
+		businessGroupRelationDao.addRole(participant1, businessGroup1, GroupRoles.participant.name());
+		businessGroupRelationDao.addRole(participant2, businessGroup2, GroupRoles.participant.name());
+		
+		AssessmentMode mode = createMinimalAssessmentmode(entry);
+		mode.setTargetAudience(AssessmentMode.Target.groups);
+		mode.setApplySettingsForCoach(false);
+		mode = assessmentModeMgr.persist(mode);
+		
+		AssessmentModeToGroup modeToGroup1 = assessmentModeMgr.createAssessmentModeToGroup(mode, businessGroup1);
+		AssessmentModeToGroup modeToGroup2 = assessmentModeMgr.createAssessmentModeToGroup(mode, businessGroup2);
+		mode.getGroups().add(modeToGroup1);
+		mode.getGroups().add(modeToGroup2);
+		mode = assessmentModeMgr.merge(mode, true);
+		dbInstance.commitAndCloseSession();
+		Assert.assertNotNull(mode);
+		
+		//check participant 1
+		List<AssessmentMode> currentModes1 = assessmentModeMgr.getAssessmentModeFor(participant1);
+		Assert.assertNotNull(currentModes1);
+		Assert.assertEquals(1, currentModes1.size());
+		Assert.assertTrue(currentModes1.contains(mode));
+		//check participant 2
+		List<AssessmentMode> currentModes2 = assessmentModeMgr.getAssessmentModeFor(participant2);
+		Assert.assertNotNull(currentModes2);
+		Assert.assertEquals(1, currentModes2.size());
+		Assert.assertTrue(currentModes2.contains(mode));
+		
+		//remove business group 1
+		businessGroupService.deleteBusinessGroup(businessGroup2);
+		dbInstance.commitAndCloseSession();
+
+		//check participant 1
+		List<AssessmentMode> afterDeleteModes1 = assessmentModeMgr.getAssessmentModeFor(participant1);
+		Assert.assertNotNull(afterDeleteModes1);
+		Assert.assertEquals(1, afterDeleteModes1.size());
+		Assert.assertTrue(afterDeleteModes1.contains(mode));
+		//check participant 2
+		List<AssessmentMode> afterDeleteModes2 = assessmentModeMgr.getAssessmentModeFor(participant2);
+		Assert.assertNotNull(afterDeleteModes2);
+		Assert.assertEquals(0, afterDeleteModes2.size());
+	}
+	
+	@Test
+	public void deleteAreaFromRepositoryEntry() {
+		//prepare the setup
+		Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("as-mode-14");
+		Identity participant = JunitTestHelper.createAndPersistIdentityAsRndUser("as-mode-15");
+		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
+		
+		AssessmentMode mode = createMinimalAssessmentmode(entry);
+		mode.setTargetAudience(AssessmentMode.Target.groups);
+		mode = assessmentModeMgr.persist(mode);
+		dbInstance.commitAndCloseSession();
+		Assert.assertNotNull(mode);
+
+		BusinessGroup businessGroupForArea = businessGroupService.createBusinessGroup(author, "as_mode_1", "", null, null, null, null, false, false, null);
+		businessGroupRelationDao.addRole(participant, businessGroupForArea, GroupRoles.participant.name());
+		BGArea area = areaMgr.createAndPersistBGArea("little area", "My little secret area", entry.getOlatResource());
+		areaMgr.addBGToBGArea(businessGroupForArea, area);
+		dbInstance.commitAndCloseSession();
+		AssessmentModeToArea modeToArea = assessmentModeMgr.createAssessmentModeToArea(mode, area);
+		mode.getAreas().add(modeToArea);
+		mode = assessmentModeMgr.merge(mode, true);
+		dbInstance.commitAndCloseSession();
+		
+		//check the participant modes
+		List<AssessmentMode> currentModes = assessmentModeMgr.getAssessmentModeFor(participant);
+		Assert.assertNotNull(currentModes);
+		Assert.assertEquals(1, currentModes.size());
+		Assert.assertTrue(currentModes.contains(mode));
+		
+		//delete
+		areaMgr.deleteBGArea(area);
+		dbInstance.commitAndCloseSession();
+
+		//check the participant modes after deleting the area
+		List<AssessmentMode> afterDeleteModes = assessmentModeMgr.getAssessmentModeFor(participant);
+		Assert.assertNotNull(afterDeleteModes);
+		Assert.assertEquals(0, afterDeleteModes.size());
+	}
 
 	/**
 	 * Create a minimal assessment mode which start one hour before now