From efd27f8481f3a6f05249d9d920cf5f032cbecbd8 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Fri, 12 Jul 2013 11:55:22 +0200
Subject: [PATCH] OO-623: implement managed group/course flags and test them in
 the GUI

---
 .../quota/GenericQuotaEditController.java     |  10 +-
 .../quota/GenericQuotaViewController.java     | 124 +++++++++++++++++
 .../java/org/olat/admin/quota/QuotaForm.java  |  13 +-
 .../olat/admin/quota/QuotaManagerImpl.java    |  29 ++--
 .../org/olat/admin/quota/QuotaTableModel.java |   8 +-
 .../org/olat/admin/quota/_content/edit.html   |   4 +-
 .../olat/admin/user/UserAdminController.java  |  18 +--
 .../user/groups/GroupSearchController.java    |  38 +++--
 .../CalendarToolSettingsController.java       |  11 +-
 .../CollaborationToolsFactory.java            |   8 +-
 .../CollaborationToolsSettingsController.java |  29 +++-
 .../FolderToolSettingsController.java         |  11 +-
 .../collaboration/NewsFormController.java     |  15 +-
 .../collaboration/SimpleNewsController.java   |   2 -
 .../org/olat/core/util/vfs/QuotaManager.java  |   6 +-
 .../ui/CourseCalendarConfigController.java    |  21 ++-
 .../ui/CourseChatSettingController.java       |   7 +-
 .../config/ui/CourseChatSettingsForm.java     |  15 +-
 .../ui/CourseConfigGlossaryController.java    |   9 +-
 .../CourseEfficencyStatementController.java   |   5 +-
 .../ui/CourseEfficencyStatementForm.java      |  10 +-
 .../ui/CourseSharedFolderController.java      |  46 +++---
 .../config/ui/_content/CourseGlossary.html    |  14 +-
 .../ui/_content/CourseSharedFolder.html       |   2 +-
 .../CourseLayoutGeneratorController.java      |  30 ++--
 .../CourseBusinessGroupListController.java    |  36 +++--
 .../member/MembersOverviewController.java     |   5 +
 .../member/RemoveActionColumnDescriptor.java  |  78 +++++++++++
 .../olat/course/run/RunMainController.java    |  10 +-
 .../java/org/olat/group/BusinessGroup.java    |  11 +-
 .../org/olat/group/BusinessGroupImpl.hbm.xml  |   3 +-
 .../org/olat/group/BusinessGroupImpl.java     |  21 ++-
 .../olat/group/BusinessGroupManagedFlag.java  | 124 +++++++++++++++++
 .../org/olat/group/BusinessGroupService.java  |   3 +-
 .../org/olat/group/BusinessGroupShort.java    |   2 +
 .../org/olat/group/BusinessGroupView.java     |  24 +---
 .../olat/group/manager/BusinessGroupDAO.java  |   2 +-
 .../manager/BusinessGroupServiceImpl.java     |  15 +-
 .../group/model/BusinessGroupShortImpl.java   |  17 ++-
 .../group/model/BusinessGroupViewImpl.hbm.xml |   3 +-
 .../group/model/BusinessGroupViewImpl.java    |  18 ++-
 .../group/ui/BusinessGroupFormController.java |  16 ++-
 .../BusinessGroupEditAccessController.java    |  29 ++--
 .../BusinessGroupEditResourceController.java  |  24 +++-
 .../edit/BusinessGroupMembersController.java  |   7 +-
 .../ui/edit/DisplayMemberSwitchForm.java      |  10 ++
 .../RemoveResourceActionColumnDescriptor.java |  78 +++++++++++
 .../ui/edit/_i18n/LocalStrings_en.properties  |   4 +-
 .../AbstractBusinessGroupListController.java  |  32 ++++-
 .../ui/main/AbstractMemberListController.java |  46 +++++-
 .../org/olat/group/ui/main/BGTableItem.java   |  13 ++
 .../main/BusinessGroupTableModelWithType.java |  25 +++-
 .../ui/main/BusinessGroupViewFilter.java      |  34 +++++
 .../olat/group/ui/main/CourseMembership.java  |   9 ++
 .../ui/main/EditMembershipController.java     |  11 +-
 .../group/ui/main/LeaveColumnDescriptor.java  |  63 +++++++++
 .../org/olat/group/ui/main/MemberView.java    |  17 +++
 .../main/SelectBusinessGroupController.java   |  33 +++--
 .../group/ui/main/UnmanagedGroupFilter.java   |  44 ++++++
 .../group/ui/wizard/BGCopyBusinessGroup.java  |   6 +
 .../java/org/olat/repository/PropPupForm.java |  12 +-
 .../olat/repository/RepositoryEntry.hbm.xml   |   2 +-
 .../org/olat/repository/RepositoryEntry.java  |  15 +-
 .../RepositoryEntryManagedFlag.java           | 131 ++++++++++++++++++
 .../ReferencableEntriesSearchController.java  |  15 +-
 .../RepositoryDetailsController.java          |  10 +-
 .../RepositoryEditDescriptionController.java  |  13 +-
 .../RepositoryEditPropertiesController.java   |  28 ++--
 .../controllers/RepositoryEntryFilter.java    |  34 +++++
 .../RepositoryMembersController.java          |   8 +-
 .../RepositorySearchController.java           |  39 ++++--
 .../controllers/_content/all_member_list.html |   2 +
 .../ui/AccessConfigurationController.java     |  39 ++++--
 .../ui/_content/access_configuration.html     |   2 +
 .../ui/_content/configuration_list.html       |   2 +-
 .../repository/course/CoursesWebService.java  |   2 +-
 .../olat/restapi/support/ObjectFactory.java   |   6 +-
 .../database/mysql/alter_8_4_0_to_9_0_0.sql   |  46 ++++++
 .../database/mysql/setupDatabase.sql          |   1 +
 .../database/oracle/alter_8_4_0_to_9_0_0.sql  |  43 +++++-
 .../database/oracle/setupDatabase.sql         |   1 +
 .../postgresql/alter_8_4_0_to_9_0_0.sql       |  45 ++++++
 .../database/postgresql/setupDatabase.sql     |   1 +
 .../group/BusinessGroupManagedFlagsTest.java  |  66 +++++++++
 .../repository/RepositoryManagerTest.java     |   2 +-
 .../olat/restapi/RepositoryEntriesTest.java   |   2 +-
 .../java/org/olat/test/AllTestsJunit4.java    |   1 +
 87 files changed, 1634 insertions(+), 292 deletions(-)
 create mode 100644 src/main/java/org/olat/admin/quota/GenericQuotaViewController.java
 create mode 100644 src/main/java/org/olat/course/member/RemoveActionColumnDescriptor.java
 create mode 100644 src/main/java/org/olat/group/BusinessGroupManagedFlag.java
 create mode 100644 src/main/java/org/olat/group/ui/edit/RemoveResourceActionColumnDescriptor.java
 create mode 100644 src/main/java/org/olat/group/ui/main/BusinessGroupViewFilter.java
 create mode 100644 src/main/java/org/olat/group/ui/main/LeaveColumnDescriptor.java
 create mode 100644 src/main/java/org/olat/group/ui/main/UnmanagedGroupFilter.java
 create mode 100644 src/main/java/org/olat/repository/RepositoryEntryManagedFlag.java
 create mode 100644 src/main/java/org/olat/repository/controllers/RepositoryEntryFilter.java
 create mode 100644 src/test/java/org/olat/group/BusinessGroupManagedFlagsTest.java

diff --git a/src/main/java/org/olat/admin/quota/GenericQuotaEditController.java b/src/main/java/org/olat/admin/quota/GenericQuotaEditController.java
index eecaebcfe1d..4e7bea196df 100644
--- a/src/main/java/org/olat/admin/quota/GenericQuotaEditController.java
+++ b/src/main/java/org/olat/admin/quota/GenericQuotaEditController.java
@@ -83,11 +83,11 @@ public class GenericQuotaEditController extends BasicController {
 		
 		// check if quota foqf.cannot.del.defaultr this path already exists
 		QuotaManager qm = QuotaManager.getInstance();
-		this.currentQuota = qm.getCustomQuota(relPath);
+		currentQuota = qm.getCustomQuota(relPath);
 		// init velocity context
 		initMyContent(ureq);
 		if (currentQuota == null) {
-			this.currentQuota = qm.createQuota(relPath, null, null);
+			currentQuota = qm.createQuota(relPath, null, null);
 			myContent.contextPut("editQuota", Boolean.FALSE);			
 		} else {
 			initQuotaForm(ureq, currentQuota);			
@@ -110,10 +110,10 @@ public class GenericQuotaEditController extends BasicController {
 		
 		// start with neq quota if quota is empty
 		if (quota == null) {
-			this.currentQuota = QuotaManager.getInstance().createQuota(null, null, null);
+			currentQuota = QuotaManager.getInstance().createQuota(null, null, null);
 			myContent.contextPut("isEmptyQuota", true);
 		} else {
-			this.currentQuota = quota;
+			currentQuota = quota;
 		}
 		initQuotaForm(ureq, currentQuota);
 		
@@ -146,7 +146,7 @@ public class GenericQuotaEditController extends BasicController {
 		if (quotaForm != null) {
 			removeAsListenerAndDispose(quotaForm);
 		}
-		quotaForm = new QuotaForm(ureq, getWindowControl(), quota);
+		quotaForm = new QuotaForm(ureq, getWindowControl(), quota, true);
 		listenTo(quotaForm);
 		myContent.put("quotaform", quotaForm.getInitialComponent());
 		myContent.contextPut("editQuota", Boolean.TRUE);
diff --git a/src/main/java/org/olat/admin/quota/GenericQuotaViewController.java b/src/main/java/org/olat/admin/quota/GenericQuotaViewController.java
new file mode 100644
index 00000000000..900fd214b77
--- /dev/null
+++ b/src/main/java/org/olat/admin/quota/GenericQuotaViewController.java
@@ -0,0 +1,124 @@
+/**
+* OLAT - Online Learning and Training<br>
+* http://www.olat.org
+* <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
+* <p>
+* http://www.apache.org/licenses/LICENSE-2.0
+* <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>
+* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
+* University of Zurich, Switzerland.
+* <hr>
+* <a href="http://www.openolat.org">
+* OpenOLAT - Online Learning and Training</a><br>
+* This file has been modified by the OpenOLAT community. Changes are licensed
+* under the Apache 2.0 license as the original file.
+*/
+
+package org.olat.admin.quota;
+
+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.logging.OLATSecurityException;
+import org.olat.core.util.vfs.Quota;
+import org.olat.core.util.vfs.QuotaManager;
+
+/**
+ * 
+ * Initial date: 12.07.2013<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class GenericQuotaViewController extends BasicController {
+
+	private VelocityContainer myContent;
+	private QuotaForm quotaForm;
+	private boolean modalMode;
+	private Quota currentQuota;
+
+
+	/**
+	 * Constructor for the generic quota edit controller used to change a quota anywhere in the 
+	 * system not using the generic quota management. Instead of using a quota the 
+	 * constructor takes the folder path for which the quota will be changed.
+	 * <p>
+	 * To create an instance of this controller, use QuotaManager's factory method 
+	 * @param ureq
+	 * @param wControl
+	 * @param quotaPath The path for which the quota should be edited
+	 * @param modalMode true: window will push to fullscreen and pop itself when finished. false: normal
+	 * controller mode, get initial component using getInitialComponent()
+	 */
+	GenericQuotaViewController(UserRequest ureq, WindowControl wControl, String relPath, boolean modalMode) {
+		super(ureq, wControl);
+		this.modalMode = modalMode;
+		
+		// check if quota foqf.cannot.del.defaultr this path already exists
+		QuotaManager qm = QuotaManager.getInstance();
+		currentQuota = qm.getCustomQuota(relPath);
+		// init velocity context
+		initMyContent(ureq);
+		if (currentQuota == null) {
+			currentQuota = qm.createQuota(relPath, null, null);		
+		} else {
+			initQuotaForm(ureq, currentQuota);			
+		}
+		myContent.contextPut("editQuota", Boolean.FALSE);	
+	  putInitialPanel(myContent);
+	}
+
+	private void initMyContent(UserRequest ureq) {
+		QuotaManager qm = QuotaManager.getInstance();
+		if (!qm.hasQuotaEditRights(ureq.getIdentity()))
+			throw new OLATSecurityException("Insufficient permissions to access QuotaController");
+
+		myContent = createVelocityContainer("edit");
+		myContent.contextPut("modalMode", Boolean.valueOf(modalMode));
+		
+		//TODO loop over QuotaManager.getDefaultQuotaIdentifyers instead
+		myContent.contextPut("users",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_USERS));
+		myContent.contextPut("powerusers",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_POWER));
+		myContent.contextPut("groups",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_GROUPS));
+		myContent.contextPut("repository",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_REPO));
+		myContent.contextPut("coursefolder",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_COURSE));
+		myContent.contextPut("nodefolder",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_NODES));
+		myContent.contextPut("feeds",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_FEEDS));
+		
+	}
+	
+	private void initQuotaForm(UserRequest ureq, Quota quota) {
+		if (quotaForm != null) {
+			removeAsListenerAndDispose(quotaForm);
+		}
+		quotaForm = new QuotaForm(ureq, getWindowControl(), quota, false);
+		listenTo(quotaForm);
+		myContent.put("quotaform", quotaForm.getInitialComponent());
+		myContent.contextPut("editQuota", Boolean.TRUE);
+	}
+
+	/**
+	 * @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)
+	 */
+	public void event(UserRequest ureq, Component source, Event event) {
+		//
+	}
+		
+	/**
+	 * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
+	 */
+	protected void doDispose() {
+		//
+	}
+}
diff --git a/src/main/java/org/olat/admin/quota/QuotaForm.java b/src/main/java/org/olat/admin/quota/QuotaForm.java
index 0fede689afe..8d349e4f167 100644
--- a/src/main/java/org/olat/admin/quota/QuotaForm.java
+++ b/src/main/java/org/olat/admin/quota/QuotaForm.java
@@ -49,14 +49,16 @@ public class QuotaForm extends FormBasicController {
 	private IntegerElement ulLimitKB;
 	
 	private Quota quota;
+	private final boolean editable;
 	
 	/**
 	 * @param name component name of form
 	 * @param quota the quota used to initialize the form or null if empty form is used
 	 */
-	public QuotaForm(UserRequest ureq, WindowControl wControl, Quota quota) {
+	public QuotaForm(UserRequest ureq, WindowControl wControl, Quota quota, boolean editable) {
 		super(ureq, wControl);
 		this.quota = quota;
+		this.editable = editable;
 		initForm(ureq);
 	}
 
@@ -88,12 +90,10 @@ public class QuotaForm extends FormBasicController {
 	
 	@Override
 	protected boolean validateFormLogic (UserRequest ureq) {
-		
 		if (!QuotaManager.getInstance().isValidQuotaPath(path.getValue())) {
 			path.setErrorKey("qf.error.path.invalid", null);
 			return false;	
 		}
-		
 		return true;
 	}
 
@@ -108,6 +108,7 @@ public class QuotaForm extends FormBasicController {
 			path.setNotEmptyCheck("qf.error.path.invalid");
 			path.setMandatory(true);
 		}
+		path.setEnabled(editable);
 		
 		if (quota != null && quota.getQuotaKB() != null) {
 			quotaKB = uifactory.addIntegerElement("qf_quota", "qf.quota", quota.getQuotaKB().intValue(), formLayout);
@@ -115,6 +116,7 @@ public class QuotaForm extends FormBasicController {
 			quotaKB = uifactory.addIntegerElement("qf_quota", "qf.quota",(int)FolderConfig.getDefaultQuotaKB() , formLayout);
 		}
 		quotaKB.setMandatory(true);
+		quotaKB.setEnabled(editable);
 		
 		if (quota != null && quota.getUlLimitKB() != null) {
 			ulLimitKB = uifactory.addIntegerElement("qf_limit", "qf.limit", quota.getUlLimitKB().intValue(), formLayout);
@@ -122,8 +124,11 @@ public class QuotaForm extends FormBasicController {
 			ulLimitKB = uifactory.addIntegerElement("qf_limit", "qf.limit",(int)FolderConfig.getLimitULKB() , formLayout);
 		}
 		ulLimitKB.setMandatory(true);
+		ulLimitKB.setEnabled(editable);
 		
-		uifactory.addFormSubmitButton("submit", formLayout);
+		if(editable) {
+			uifactory.addFormSubmitButton("submit", formLayout);
+		}
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java b/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java
index 03147b8d6ca..70a775a9d77 100644
--- a/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java
+++ b/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java
@@ -43,6 +43,7 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.id.Identity;
 import org.olat.core.logging.OLATRuntimeException;
+import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.core.util.vfs.Quota;
@@ -64,6 +65,7 @@ import org.olat.resource.OLATResourceManager;
  * @author Florian Gnaegi, frentix GmbH, http://www.frentix.com
  */
 public class QuotaManagerImpl extends QuotaManager {
+	private static final OLog log = Tracing.createLoggerFor(QuotaManagerImpl.class);
 
 	private static final String QUOTA_CATEGORY = "quot";
 	private OLATResource quotaResource;
@@ -95,7 +97,7 @@ public class QuotaManagerImpl extends QuotaManager {
 		quotaResource = resourceManager.findOrPersistResourceable(OresHelper.lookupType(Quota.class));
 		initDefaultQuotas(); // initialize default quotas
 		DBFactory.getInstance(false).intermediateCommit();
-		Tracing.logInfo("Successfully initialized Quota Manager", QuotaManagerImpl.class);
+		log.info("Successfully initialized Quota Manager");
 	}
 
 	private void initDefaultQuotas() {
@@ -137,7 +139,8 @@ public class QuotaManagerImpl extends QuotaManager {
 	 * Get the identifyers for the default quotas
 	 * @return
 	 */
-	public Set getDefaultQuotaIdentifyers() {
+	@Override
+	public Set<String> getDefaultQuotaIdentifyers() {
 		if (defaultQuotas == null) {
 			throw new OLATRuntimeException(QuotaManagerImpl.class, "Quota manager has not been initialized properly! Must call init() first.", null);
 		}
@@ -239,16 +242,17 @@ public class QuotaManagerImpl extends QuotaManager {
 	 * 
 	 * @return list of quotas.
 	 */
-	public List listCustomQuotasKB() {
+	@Override
+	public List<Quota> listCustomQuotasKB() {
 		if (defaultQuotas == null) {
 			throw new OLATRuntimeException(QuotaManagerImpl.class, "Quota manager has not been initialized properly! Must call init() first.", null);
 		}
-		List results = new ArrayList();
+		List<Quota> results = new ArrayList<Quota>();
 		PropertyManager pm = PropertyManager.getInstance();
-		List props = pm.listProperties(null, null, quotaResource, QUOTA_CATEGORY, null);
+		List<Property> props = pm.listProperties(null, null, quotaResource, QUOTA_CATEGORY, null);
 		if (props == null || props.size() == 0) return results;
-		for (Iterator iter = props.iterator(); iter.hasNext();) {
-			Property prop = (Property) iter.next();
+		for (Iterator<Property> iter = props.iterator(); iter.hasNext();) {
+			Property prop = iter.next();
 			results.add(parseQuota(prop));
 		}
 		return results;
@@ -388,6 +392,7 @@ public class QuotaManagerImpl extends QuotaManager {
 	 * @param path
 	 * @return
 	 */
+	@Override
 	public boolean isValidQuotaPath(String path) {
 		if (path.startsWith(QuotaConstants.IDENTIFIER_DEFAULT) && !defaultQuotas.containsKey(path)) {
 			return false;
@@ -399,9 +404,15 @@ public class QuotaManagerImpl extends QuotaManager {
 	/**
 	 * @see org.olat.core.util.vfs.QuotaManager#getQuotaEditorInstance(org.olat.core.gui.UserRequest, org.olat.core.gui.control.WindowControl, java.lang.String, boolean)
 	 */
+	@Override
 	public Controller getQuotaEditorInstance(UserRequest ureq, WindowControl wControl, String relPath, boolean modalMode) {
-		Controller ctr = new GenericQuotaEditController(ureq, wControl, relPath, modalMode);
-		return ctr;
+		return new GenericQuotaEditController(ureq, wControl, relPath, modalMode);
+	}
+	
+
+	@Override
+	public Controller getQuotaViewInstance(UserRequest ureq, WindowControl wControl, String relPath, boolean modalMode) {
+		return new GenericQuotaViewController(ureq, wControl, relPath, modalMode);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/admin/quota/QuotaTableModel.java b/src/main/java/org/olat/admin/quota/QuotaTableModel.java
index 9d55eb08d5a..8db917db57d 100644
--- a/src/main/java/org/olat/admin/quota/QuotaTableModel.java
+++ b/src/main/java/org/olat/admin/quota/QuotaTableModel.java
@@ -36,9 +36,9 @@ import org.olat.core.util.vfs.QuotaManager;
  * Initial Date: Mar 30, 2004
  * @author Mike Stock 
  */
-public class QuotaTableModel extends BaseTableDataModelWithoutFilter implements TableDataModel {
+public class QuotaTableModel extends BaseTableDataModelWithoutFilter<Quota> implements TableDataModel<Quota> {
 
-	private List quotaList;
+	private List<Quota> quotaList;
 
 	/**
 	 * 
@@ -60,7 +60,7 @@ public class QuotaTableModel extends BaseTableDataModelWithoutFilter implements
 	 * @return Quota.
 	 */
 	public Quota getRowData(int row) {
-		return (Quota) quotaList.get(row);
+		return quotaList.get(row);
 	}
 
 	/**
@@ -81,7 +81,7 @@ public class QuotaTableModel extends BaseTableDataModelWithoutFilter implements
 	 * @see org.olat.core.gui.components.table.TableDataModel#getValueAt(int, int)
 	 */
 	public Object getValueAt(int row, int col) {
-		Quota q = (Quota) quotaList.get(row);
+		Quota q = quotaList.get(row);
 		switch (col) {
 			case 0:
 				return q.getPath();
diff --git a/src/main/java/org/olat/admin/quota/_content/edit.html b/src/main/java/org/olat/admin/quota/_content/edit.html
index fef31f3ab0b..69bf9b43302 100644
--- a/src/main/java/org/olat/admin/quota/_content/edit.html
+++ b/src/main/java/org/olat/admin/quota/_content/edit.html
@@ -9,7 +9,9 @@
 #else
 	<fieldset class="b_clearfix">
 		<legend>$r.translate("qf.new")</legend>
-		<div class="b_float_right">$r.render("qf.new")</div>
+		#if($r.available("qf.new"))
+			<div class="b_float_right">$r.render("qf.new")</div>
+		#end
 		$r.translate("qf.noquota")
 		#if ($modalMode)
 			&nbsp;
diff --git a/src/main/java/org/olat/admin/user/UserAdminController.java b/src/main/java/org/olat/admin/user/UserAdminController.java
index ec97ce5046b..0a8a3bb432c 100644
--- a/src/main/java/org/olat/admin/user/UserAdminController.java
+++ b/src/main/java/org/olat/admin/user/UserAdminController.java
@@ -26,7 +26,6 @@
 package org.olat.admin.user;
 
 import java.util.List;
-import java.util.Locale;
 
 import org.olat.admin.policy.PolicyController;
 import org.olat.admin.user.groups.GroupOverviewController;
@@ -36,7 +35,6 @@ import org.olat.basesecurity.BaseSecurityManager;
 import org.olat.basesecurity.BaseSecurityModule;
 import org.olat.basesecurity.Constants;
 import org.olat.basesecurity.SecurityGroup;
-import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.modules.bc.FolderConfig;
 import org.olat.core.commons.persistence.DBFactory;
 import org.olat.core.gui.UserRequest;
@@ -52,7 +50,6 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.gui.control.generic.dtabs.Activateable2;
 import org.olat.core.id.Identity;
-import org.olat.core.id.UserConstants;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.StateEntry;
 import org.olat.core.logging.OLATSecurityException;
@@ -109,9 +106,7 @@ public class UserAdminController extends BasicController implements Activateable
 	private Link backLink;
 	private ProfileAndHomePageEditController userProfileCtr;
 	private GroupOverviewController grpCtr;
-	
-	private final boolean isAdministrativeUser;
-	private final BaseSecurityModule securityModule;
+
 
 	/**
 	 * Constructor that creates a back - link as default
@@ -121,10 +116,7 @@ public class UserAdminController extends BasicController implements Activateable
 	 */
 	public UserAdminController(UserRequest ureq, WindowControl wControl, Identity identity) {
 		super(ureq, wControl);
-		
-		securityModule = CoreSpringFactory.getImpl(BaseSecurityModule.class);
-		isAdministrativeUser = securityModule.isUserAllowedAdminProps(ureq.getUserSession().getRoles());
-		
+
 		BaseSecurity mgr = BaseSecurityManager.getInstance();
 		if (!mgr.isIdentityPermittedOnResourceable(
 				ureq.getIdentity(), 
@@ -143,11 +135,11 @@ public class UserAdminController extends BasicController implements Activateable
 			setBackButtonEnabled(true); // default
 			initTabbedPane(myIdentity, ureq);
 			exposeUserDataToVC(ureq, myIdentity);					
-			this.putInitialPanel(myContent);
+			putInitialPanel(myContent);
 		} else {
 			String supportAddr = WebappHelper.getMailConfig("mailSupport");			
-			this.showWarning(NLS_ERROR_NOACCESS_TO_USER, supportAddr);			
-			this.putInitialPanel(new Panel("empty"));
+			showWarning(NLS_ERROR_NOACCESS_TO_USER, supportAddr);			
+			putInitialPanel(new Panel("empty"));
 		}
 	}
 	
diff --git a/src/main/java/org/olat/admin/user/groups/GroupSearchController.java b/src/main/java/org/olat/admin/user/groups/GroupSearchController.java
index ca6ede70469..9e7796b9112 100644
--- a/src/main/java/org/olat/admin/user/groups/GroupSearchController.java
+++ b/src/main/java/org/olat/admin/user/groups/GroupSearchController.java
@@ -21,6 +21,7 @@ package org.olat.admin.user.groups;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.List;
 
 import org.olat.core.CoreSpringFactory;
@@ -52,6 +53,7 @@ import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupManagedFlag;
 import org.olat.group.BusinessGroupService;
 import org.olat.group.model.AddToGroupsEvent;
 import org.olat.group.model.BGRepositoryEntryRelation;
@@ -60,7 +62,9 @@ import org.olat.group.ui.BusinessGroupTableModel;
 
 /**
  * Description:<br>
- * Searches for groups from the whole system.
+ * Searches for groups from the whole system. The list of
+ * groups doesn't contain any managed groups with the flags
+ * "membermanagement" and higher.
  * 
  * <P>
  * Initial Date: 11.04.2011 <br>
@@ -183,18 +187,22 @@ public class GroupSearchController extends StepFormBasicController {
 			SearchBusinessGroupParams param1s = new SearchBusinessGroupParams();
 			param1s.setNameOrDesc(searchValue);
 			List<BusinessGroup> group1s = businessGroupService.findBusinessGroups(param1s, null, 0, -1);
-
+			filterGroups(group1s);
+			
 			SearchBusinessGroupParams param2s = new SearchBusinessGroupParams();
 			param2s.setCourseTitle(searchValue);
 			List<BusinessGroup> group2s = businessGroupService.findBusinessGroups(param2s, null, 0, -1);
-
-			List<Long> groupKeysWithRelations = PersistenceHelper.toKeys(group1s);
-			groupKeysWithRelations.addAll(PersistenceHelper.toKeys(group2s));
+			filterGroups(group2s);
+			
+			List<BusinessGroup> groups = new ArrayList<BusinessGroup>(group1s.size() + group2s.size());
+			groups.addAll(group1s);
+			groups.addAll(group2s);
+			
+			List<Long> groupKeysWithRelations = PersistenceHelper.toKeys(groups);
 			List<BGRepositoryEntryRelation> resources = businessGroupService.findRelationToRepositoryEntries(groupKeysWithRelations, 0, -1);
 
-			List<GroupWrapper> groups = new ArrayList<GroupWrapper>();
-			for(BusinessGroup group:group1s) {
-				
+			List<GroupWrapper> groupWrappers = new ArrayList<GroupWrapper>();
+			for(BusinessGroup group:groups) {
 				StringBuilder sb = new StringBuilder();
 				for(BGRepositoryEntryRelation resource:resources) {
 					if(resource.getGroupKey().equals(group.getKey())) {
@@ -206,14 +214,22 @@ public class GroupSearchController extends StepFormBasicController {
 				GroupWrapper wrapper = new GroupWrapper(group, sb.toString());
 				wrapper.setTutor(createSelection("tutor_" + group.getKey()));
 				wrapper.setParticipant(createSelection("participant_" + group.getKey()));
-				groups.add(wrapper);
+				groupWrappers.add(wrapper);
 			}
 
 			table.reset();
-			tableDataModel.setObjects(groups);
+			tableDataModel.setObjects(groupWrappers);
 			errorComp.clearError();
 		}
-	} 
+	}
+	
+	private void filterGroups(List<BusinessGroup> groups) {
+		for(Iterator<BusinessGroup> groupIt=groups.iterator(); groupIt.hasNext(); ) {
+			if(BusinessGroupManagedFlag.isManaged(groupIt.next(), BusinessGroupManagedFlag.membersmanagement)) {
+				groupIt.remove();
+			}
+		}
+	}
 	
 	private MultipleSelectionElement createSelection(String name) {
 		MultipleSelectionElement selection = new MultipleSelectionElementImpl(name, MultipleSelectionElementImpl.createVerticalLayout("checkbox",1));
diff --git a/src/main/java/org/olat/collaboration/CalendarToolSettingsController.java b/src/main/java/org/olat/collaboration/CalendarToolSettingsController.java
index 72e537726f7..ce4f5460805 100644
--- a/src/main/java/org/olat/collaboration/CalendarToolSettingsController.java
+++ b/src/main/java/org/olat/collaboration/CalendarToolSettingsController.java
@@ -29,6 +29,7 @@ import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.elements.SingleSelection;
 import org.olat.core.gui.components.form.flexible.impl.Form;
 import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
+import org.olat.core.gui.components.form.flexible.impl.elements.FormSubmit;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
@@ -39,6 +40,7 @@ import org.olat.core.gui.control.WindowControl;
  */
 public class CalendarToolSettingsController extends FormBasicController {
 	
+	private FormSubmit submit;
 	private SingleSelection access;
 	private final int calendarAccess;
 	private final boolean canSave;
@@ -91,7 +93,14 @@ public class CalendarToolSettingsController extends FormBasicController {
 		else access.select("owner", true);
 		
 		if(canSave) {
-			uifactory.addFormSubmitButton("submit", formLayout);
+			submit = uifactory.addFormSubmitButton("submit", formLayout);
+		}
+	}
+	
+	public void setEnabled(boolean enabled) {
+		access.setEnabled(enabled);
+		if(submit != null) {
+			submit.setVisible(enabled);
 		}
 	}
 
diff --git a/src/main/java/org/olat/collaboration/CollaborationToolsFactory.java b/src/main/java/org/olat/collaboration/CollaborationToolsFactory.java
index e45c33162b4..18e1ba86f9d 100644
--- a/src/main/java/org/olat/collaboration/CollaborationToolsFactory.java
+++ b/src/main/java/org/olat/collaboration/CollaborationToolsFactory.java
@@ -45,9 +45,9 @@ import org.olat.group.BusinessGroup;
  * @author guido
  */
 public class CollaborationToolsFactory {
+	private static final OLog log = Tracing.createLoggerFor(CollaborationToolsFactory.class);
 	private static CollaborationToolsFactory instance;
-	CacheWrapper cache;
-	OLog log = Tracing.createLoggerFor(this.getClass());
+	private CacheWrapper<String,CollaborationTools> cache;
 	private CoordinatorManager coordinatorManager;
 	
 	/**
@@ -84,7 +84,7 @@ public class CollaborationToolsFactory {
 				if (cache == null) {
 					cache = coordinatorManager.getCoordinator().getCacher().getCache(CollaborationToolsFactory.class.getSimpleName(), "tools");
 				}
-				CollaborationTools collabTools = (CollaborationTools) cache.get(cacheKey);
+				CollaborationTools collabTools = cache.get(cacheKey);
 				if (collabTools != null) {
 					
 					if (log.isDebug()) log .debug("loading collabTool from cache. Ores: " + ores.getResourceableId());
@@ -116,7 +116,7 @@ public class CollaborationToolsFactory {
 	 */
 	public CollaborationTools getCollaborationToolsIfExists(OLATResourceable ores) {
 		String cacheKey = Long.valueOf(ores.getResourceableId()).toString();
-		return (CollaborationTools) cache.get(cacheKey);
+		return cache.get(cacheKey);
 	}
 
 	
diff --git a/src/main/java/org/olat/collaboration/CollaborationToolsSettingsController.java b/src/main/java/org/olat/collaboration/CollaborationToolsSettingsController.java
index 5624a942851..1a8f7da9607 100644
--- a/src/main/java/org/olat/collaboration/CollaborationToolsSettingsController.java
+++ b/src/main/java/org/olat/collaboration/CollaborationToolsSettingsController.java
@@ -47,6 +47,7 @@ import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.core.util.vfs.QuotaManager;
 import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupManagedFlag;
 import org.olat.instantMessaging.InstantMessagingModule;
 
 /**
@@ -65,9 +66,10 @@ public class CollaborationToolsSettingsController extends BasicController {
 	private CalendarToolSettingsController calendarForm;
 	private FolderToolSettingsController folderForm;
 
-	boolean lastCalendarEnabledState;
+	private boolean lastCalendarEnabledState;
 	private Controller quotaCtr;
-	private BusinessGroup businessGroup;
+	private final boolean managed;
+	private final BusinessGroup businessGroup;
 
 	/**
 	 * @param ureq
@@ -76,11 +78,13 @@ public class CollaborationToolsSettingsController extends BasicController {
 	public CollaborationToolsSettingsController(UserRequest ureq, WindowControl wControl, BusinessGroup businessGroup) {
 		super(ureq, wControl);
 		this.businessGroup = businessGroup;
+		managed = BusinessGroupManagedFlag.isManaged(businessGroup, BusinessGroupManagedFlag.tools);
 		CollaborationTools collabTools = CollaborationToolsFactory.getInstance().getOrCreateCollaborationTools(businessGroup);
 		
 		vc_collabtools = createVelocityContainer ("collaborationtools");
 
 		cots = new ChoiceOfToolsForm (ureq, wControl, collabTools);
+		cots.setEnabled(!managed);
 		listenTo(cots);
 		vc_collabtools.put("choiceOfTools", cots.getInitialComponent());
 		
@@ -92,7 +96,11 @@ public class CollaborationToolsSettingsController extends BasicController {
 		
 		if (ureq.getUserSession().getRoles().isOLATAdmin()) {
 			vc_collabtools.contextPut("isOlatAdmin", Boolean.TRUE);
-			quotaCtr = QuotaManager.getInstance().getQuotaEditorInstance(ureq, getWindowControl(), collabTools.getFolderRelPath(), false);
+			if(managed) {
+				quotaCtr = QuotaManager.getInstance().getQuotaViewInstance(ureq, getWindowControl(), collabTools.getFolderRelPath(), false);
+			} else {
+				quotaCtr = QuotaManager.getInstance().getQuotaEditorInstance(ureq, getWindowControl(), collabTools.getFolderRelPath(), false);
+			}
 			listenTo(quotaCtr);
 		} else {
 			vc_collabtools.contextPut("isOlatAdmin", Boolean.FALSE);
@@ -106,6 +114,7 @@ public class CollaborationToolsSettingsController extends BasicController {
 			Long lCalendarAccess = collabTools.lookupCalendarAccess();
 			if (lCalendarAccess != null) iCalendarAccess = lCalendarAccess.intValue();
 			calendarForm = new CalendarToolSettingsController(ureq, getWindowControl(), iCalendarAccess);
+			calendarForm.setEnabled(!managed);
 			listenTo(calendarForm);
 			
 			vc_collabtools.put("calendarform", calendarForm.getInitialComponent());
@@ -128,6 +137,7 @@ public class CollaborationToolsSettingsController extends BasicController {
 			Long lFolderAccess = collabTools.lookupFolderAccess();
 			int access = lFolderAccess == null ? CollaborationTools.FOLDER_ACCESS_ALL : lFolderAccess.intValue();
 			folderForm = new FolderToolSettingsController(ureq, getWindowControl(), access);
+			folderForm.setEnabled(!managed);
 			listenTo(folderForm);
 			vc_collabtools.put("folderform", folderForm.getInitialComponent());
 		} else {
@@ -145,6 +155,7 @@ public class CollaborationToolsSettingsController extends BasicController {
 			removeAsListenerAndDispose(newsController);
 		}
 		newsController = new NewsFormController(ureq, getWindowControl(), (newsValue == null ? "" : newsValue));
+		newsController.setEnabled(!managed);
 		listenTo(newsController);
 		
 		vc_collabtools.contextPut("newsToolEnabled", Boolean.TRUE);
@@ -189,6 +200,7 @@ public class CollaborationToolsSettingsController extends BasicController {
 						this.removeAsListenerAndDispose(calendarForm);
 					}
 					calendarForm = new CalendarToolSettingsController(ureq, getWindowControl(), iCalendarAccess);
+					calendarForm.setEnabled(!managed);
 					listenTo(calendarForm);
 					vc_collabtools.put("calendarform", calendarForm.getInitialComponent());
 
@@ -214,6 +226,7 @@ public class CollaborationToolsSettingsController extends BasicController {
 				Long lFolderAccess = collabTools.lookupFolderAccess();
 				int access = lFolderAccess == null ? CollaborationTools.FOLDER_ACCESS_ALL : lFolderAccess.intValue();
 				folderForm = new FolderToolSettingsController(ureq, getWindowControl(), access);
+				folderForm.setEnabled(!managed);
 				listenTo(folderForm);
 				vc_collabtools.put("folderform", folderForm.getInitialComponent());
 				if (ureq.getUserSession().getRoles().isOLATAdmin()) {
@@ -223,13 +236,13 @@ public class CollaborationToolsSettingsController extends BasicController {
 				vc_collabtools.contextPut("folderToolEnabled", Boolean.FALSE);
 			}
 			
-		} else if (source == this.newsController) {
+		} else if (source == newsController) {
 			if (event.equals(Event.DONE_EVENT)) {
-				String news = this.newsController.getNewsValue();
+				String news = newsController.getNewsValue();
 				collabTools.saveNews(news);
 			}
 			
-		} else if (source == this.calendarForm) {	
+		} else if (source == calendarForm) {	
 			collabTools.saveCalendarAccess(new Long(calendarForm.getCalendarAccess()));
 			// notify calendar components to refresh their calendars
 			CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(
@@ -279,6 +292,10 @@ class ChoiceOfToolsForm extends FormBasicController {
 		
 		initForm(ureq);
 	}
+	
+	public void setEnabled(boolean enabled) {
+		ms.setEnabled(enabled);
+	}
 
 	@Override
 	protected void formOK(UserRequest ureq) {
diff --git a/src/main/java/org/olat/collaboration/FolderToolSettingsController.java b/src/main/java/org/olat/collaboration/FolderToolSettingsController.java
index dba2e87de04..02920684f3b 100644
--- a/src/main/java/org/olat/collaboration/FolderToolSettingsController.java
+++ b/src/main/java/org/olat/collaboration/FolderToolSettingsController.java
@@ -29,6 +29,7 @@ import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.elements.SingleSelection;
 import org.olat.core.gui.components.form.flexible.impl.Form;
 import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
+import org.olat.core.gui.components.form.flexible.impl.elements.FormSubmit;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
@@ -39,6 +40,7 @@ import org.olat.core.gui.control.WindowControl;
  */
 public class FolderToolSettingsController extends FormBasicController {
 	
+	private FormSubmit submit;
 	private SingleSelection folderAccessEl;
 	private final int folderAccess;
 	private final boolean canSave;
@@ -78,7 +80,14 @@ public class FolderToolSettingsController extends FormBasicController {
 		String selectedKey = (folderAccess == CollaborationTools.FOLDER_ACCESS_ALL) ? "all" : "owner";
 		folderAccessEl.select(selectedKey, true);
 		if(canSave) {
-			uifactory.addFormSubmitButton("submit", formLayout);
+			submit = uifactory.addFormSubmitButton("submit", formLayout);
+		}
+	}
+	
+	public void setEnabled(boolean enabled) {
+		folderAccessEl.setEnabled(enabled);
+		if(submit != null) {
+			submit.setVisible(enabled);
 		}
 	}
 	
diff --git a/src/main/java/org/olat/collaboration/NewsFormController.java b/src/main/java/org/olat/collaboration/NewsFormController.java
index 682bc473d24..fb7949b4cbc 100644
--- a/src/main/java/org/olat/collaboration/NewsFormController.java
+++ b/src/main/java/org/olat/collaboration/NewsFormController.java
@@ -24,6 +24,7 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.elements.RichTextElement;
 import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
+import org.olat.core.gui.components.form.flexible.impl.elements.FormSubmit;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
@@ -38,6 +39,7 @@ import org.olat.core.util.StringHelper;
  */
 public class NewsFormController extends FormBasicController {
 
+	private FormSubmit submit;
 	/**
 	 * The rich text element for the information text.
 	 */
@@ -92,12 +94,17 @@ public class NewsFormController extends FormBasicController {
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		setFormTitle("news.content");
-		this.newsInputElement = uifactory.addRichTextElementForStringData("news.content", "news.content", this.news, 10, -1, false, false, null,
+		newsInputElement = uifactory.addRichTextElementForStringData("news.content", "news.content", this.news, 10, -1, false, false, null,
 				null, formLayout, ureq.getUserSession(), getWindowControl());
-		this.newsInputElement.setMandatory(true);
+		newsInputElement.setMandatory(true);
 
 		// Create submit button
-		uifactory.addFormSubmitButton("submit", formLayout);
+		submit = uifactory.addFormSubmitButton("submit", formLayout);
+	}
+	
+	public void setEnabled(boolean enabled) {
+		newsInputElement.setEnabled(enabled);
+		submit.setVisible(enabled);
 	}
 
 	/**
@@ -106,7 +113,7 @@ public class NewsFormController extends FormBasicController {
 	 * @return The information text.
 	 */
 	public String getNewsValue() {
-		return this.newsInputElement.getValue();
+		return newsInputElement.getValue();
 	}
 
 	/**
diff --git a/src/main/java/org/olat/collaboration/SimpleNewsController.java b/src/main/java/org/olat/collaboration/SimpleNewsController.java
index fb19c04aece..f8b0f3ac022 100644
--- a/src/main/java/org/olat/collaboration/SimpleNewsController.java
+++ b/src/main/java/org/olat/collaboration/SimpleNewsController.java
@@ -68,7 +68,6 @@ public class SimpleNewsController extends BasicController {
 	 *      org.olat.core.gui.components.Component,
 	 *      org.olat.core.gui.control.Event)
 	 */
-	@SuppressWarnings("unused")
 	public void event(UserRequest ureq, Component source, Event event) {
 	//
 	}
@@ -77,7 +76,6 @@ public class SimpleNewsController extends BasicController {
 	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
 	 *      org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event)
 	 */
-	@SuppressWarnings("unused")
 	public void event(UserRequest ureq, Controller source, Event event) {
 	//
 	}
diff --git a/src/main/java/org/olat/core/util/vfs/QuotaManager.java b/src/main/java/org/olat/core/util/vfs/QuotaManager.java
index a1e6467fd96..59661c6bf72 100644
--- a/src/main/java/org/olat/core/util/vfs/QuotaManager.java
+++ b/src/main/java/org/olat/core/util/vfs/QuotaManager.java
@@ -75,7 +75,7 @@ public abstract class QuotaManager extends BasicManager{
 	 * Get the identifyers for the default quotas
 	 * @return
 	 */
-	public abstract Set getDefaultQuotaIdentifyers();
+	public abstract Set<String> getDefaultQuotaIdentifyers();
 	
 	/**
 	 * Get the default quota for the given identifyer or NULL if no such quota
@@ -115,7 +115,7 @@ public abstract class QuotaManager extends BasicManager{
 	 * 
 	 * @return list of quotas.
 	 */
-	public abstract List listCustomQuotasKB();
+	public abstract List<Quota> listCustomQuotasKB();
 
 	/**
 	 * call to get appropriate quota depending on role. Authors have normally
@@ -168,6 +168,8 @@ public abstract class QuotaManager extends BasicManager{
 	 */
 	public abstract Controller getQuotaEditorInstance(UserRequest ureq, WindowControl wControl, String relPath, boolean modalMode);
 	
+	public abstract Controller getQuotaViewInstance(UserRequest ureq, WindowControl wControl, String relPath, boolean modalMode);
+	
 	/**
 	 * Check if a user has the rights to launch the quota editor tool
 	 * 
diff --git a/src/main/java/org/olat/course/config/ui/CourseCalendarConfigController.java b/src/main/java/org/olat/course/config/ui/CourseCalendarConfigController.java
index 90a4f6f0e57..7b4b934d2e4 100644
--- a/src/main/java/org/olat/course/config/ui/CourseCalendarConfigController.java
+++ b/src/main/java/org/olat/course/config/ui/CourseCalendarConfigController.java
@@ -60,12 +60,12 @@ public class CourseCalendarConfigController extends BasicController implements C
 	 * @param ureq
 	 * @param wControl
 	 */
-	public CourseCalendarConfigController(UserRequest ureq, WindowControl wControl, CourseConfig courseConfig) {
+	public CourseCalendarConfigController(UserRequest ureq, WindowControl wControl, CourseConfig courseConfig, boolean editable) {
 		super(ureq, wControl);
 		this.courseConfig = courseConfig;
 		
 		myContent = createVelocityContainer("CourseCalendar");
-		calConfigForm = new CourseCalendarConfigForm(ureq, wControl, courseConfig.isCalendarEnabled());
+		calConfigForm = new CourseCalendarConfigForm(ureq, wControl, courseConfig.isCalendarEnabled(), editable);
 		listenTo (calConfigForm);
 		myContent.put("calendarForm", calConfigForm.getInitialComponent());
 		//		
@@ -96,27 +96,26 @@ public class CourseCalendarConfigController extends BasicController implements C
 	}
 
 	/**
-	 * 
 	 * @return Return the log message if any, else null.
 	 */
 	public ILoggingAction getLoggingAction() {
 		return loggingAction;
 	}
-
-
 }
 
 class CourseCalendarConfigForm extends FormBasicController {
 
 	private SelectionElement isOn;
 	private boolean calendarEnabled;
+	private final boolean editable;
 
 	/**
 	 * @param name
 	 * @param chatEnabled
 	 */
-	public CourseCalendarConfigForm(UserRequest ureq, WindowControl wControl, boolean calendarEnabled) {
+	public CourseCalendarConfigForm(UserRequest ureq, WindowControl wControl, boolean calendarEnabled, boolean editable) {
 		super(ureq, wControl);
+		this.editable = editable;
 		this.calendarEnabled = calendarEnabled;
 		initForm (ureq);
 	}
@@ -135,17 +134,17 @@ class CourseCalendarConfigForm extends FormBasicController {
 
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-
 		isOn = uifactory.addCheckboxesVertical("isOn", "chkbx.calendar.onoff", formLayout, new String[] {"xx"}, new String[] {""}, null, 1);
 		isOn.select("xx", calendarEnabled);
+		isOn.setEnabled(editable);
 		
-		uifactory.addFormSubmitButton("save", "save", formLayout);
-
+		if(editable) {
+			uifactory.addFormSubmitButton("save", "save", formLayout);
+		}
 	}
 
 	@Override
 	protected void doDispose() {
 		// 
 	}
-
-}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/config/ui/CourseChatSettingController.java b/src/main/java/org/olat/course/config/ui/CourseChatSettingController.java
index 2a7f07a6af4..7ae2add9d10 100644
--- a/src/main/java/org/olat/course/config/ui/CourseChatSettingController.java
+++ b/src/main/java/org/olat/course/config/ui/CourseChatSettingController.java
@@ -51,15 +51,15 @@ public class CourseChatSettingController extends BasicController implements Cont
 	 * @param ureq
 	 * @param wControl
 	 */
-	public CourseChatSettingController(UserRequest ureq, WindowControl wControl, CourseConfig courseConfig) {
+	public CourseChatSettingController(UserRequest ureq, WindowControl wControl, CourseConfig courseConfig, boolean editable) {
 		super(ureq, wControl);
 		this.courseConfig = courseConfig;
 		
 		myContent = createVelocityContainer("CourseChat");
-		chatForm = new CourseChatSettingsForm(ureq, wControl, courseConfig.isChatEnabled());
+		chatForm = new CourseChatSettingsForm(ureq, wControl, courseConfig.isChatEnabled(), editable);
 		listenTo (chatForm);
 		myContent.put("chatForm", chatForm.getInitialComponent());
-		//		
+	
 		putInitialPanel(myContent);
 	}
 
@@ -82,5 +82,4 @@ public class CourseChatSettingController extends BasicController implements Cont
 	protected void doDispose() {
 		//
 	}
-
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/config/ui/CourseChatSettingsForm.java b/src/main/java/org/olat/course/config/ui/CourseChatSettingsForm.java
index 07b407c8ab6..b8968432e06 100644
--- a/src/main/java/org/olat/course/config/ui/CourseChatSettingsForm.java
+++ b/src/main/java/org/olat/course/config/ui/CourseChatSettingsForm.java
@@ -43,14 +43,16 @@ import org.olat.core.gui.control.WindowControl;
 public class CourseChatSettingsForm extends FormBasicController {
 
 	private SelectionElement isOn;
-	private boolean chatEnabled;
+	private final boolean chatEnabled;
+	private final boolean editable;
 
 	/**
 	 * @param name
 	 * @param chatEnabled
 	 */
-	public CourseChatSettingsForm(UserRequest ureq, WindowControl wControl, boolean chatEnabled) {
+	public CourseChatSettingsForm(UserRequest ureq, WindowControl wControl, boolean chatEnabled, boolean editable) {
 		super(ureq, wControl);
+		this.editable = editable;
 		this.chatEnabled = chatEnabled;
 		initForm (ureq);
 	}
@@ -69,16 +71,17 @@ public class CourseChatSettingsForm extends FormBasicController {
 
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-
 		isOn = uifactory.addCheckboxesVertical("isOn", "chkbx.chat.onoff", formLayout, new String[] {"xx"}, new String[] {""}, null, 1);
 		isOn.select("xx", chatEnabled);
-		
-		uifactory.addFormSubmitButton("save", "save", formLayout);
+		isOn.setEnabled(editable);
+
+		if(editable) {
+			uifactory.addFormSubmitButton("save", "save", formLayout);
+		}
 	}
 
 	@Override
 	protected void doDispose() {
 		//
 	}
-
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/config/ui/CourseConfigGlossaryController.java b/src/main/java/org/olat/course/config/ui/CourseConfigGlossaryController.java
index 0831c082de2..1e401a30d69 100644
--- a/src/main/java/org/olat/course/config/ui/CourseConfigGlossaryController.java
+++ b/src/main/java/org/olat/course/config/ui/CourseConfigGlossaryController.java
@@ -79,7 +79,8 @@ public class CourseConfigGlossaryController extends BasicController implements C
 	 * @param wControl
 	 * @param course
 	 */
-	public CourseConfigGlossaryController(UserRequest ureq, WindowControl wControl, CourseConfig courseConfig, Long courseResourceableId) {
+	public CourseConfigGlossaryController(UserRequest ureq, WindowControl wControl, CourseConfig courseConfig,
+			Long courseResourceableId, boolean editable) {
 		super(ureq, wControl);
 		this.courseConfig = courseConfig;
 		this.courseResourceableId = courseResourceableId;
@@ -95,10 +96,12 @@ public class CourseConfigGlossaryController extends BasicController implements C
 				log.warn("Course with ID::" + courseResourceableId + " had a config for a glossary softkey::"
 						+ courseConfig.getGlossarySoftKey() + " but no such glossary was found");				
 			} else {
-				removeCommand = LinkFactory.createButton(COMMAND_REMOVE, myContent, this);
+				if(editable) {
+					removeCommand = LinkFactory.createButton(COMMAND_REMOVE, myContent, this);
+				}
 				myContent.contextPut("repoEntry", repoEntry);
 			}
-		} else {
+		} else if(editable) {
 			addCommand = LinkFactory.createButton(COMMAND_ADD, myContent, this);
 		}		
 		putInitialPanel(myContent);
diff --git a/src/main/java/org/olat/course/config/ui/CourseEfficencyStatementController.java b/src/main/java/org/olat/course/config/ui/CourseEfficencyStatementController.java
index a07ee23520b..91bfca04732 100644
--- a/src/main/java/org/olat/course/config/ui/CourseEfficencyStatementController.java
+++ b/src/main/java/org/olat/course/config/ui/CourseEfficencyStatementController.java
@@ -62,12 +62,13 @@ public class CourseEfficencyStatementController extends BasicController {
 	 * @param ureq
 	 * @param wControl
 	 */
-	public CourseEfficencyStatementController(UserRequest ureq, WindowControl wControl, CourseConfig courseConfig) {
+	public CourseEfficencyStatementController(UserRequest ureq, WindowControl wControl, CourseConfig courseConfig, boolean editable) {
 		super(ureq, wControl);		
 		this.courseConfig = courseConfig;
 		//
 		myContent = createVelocityContainer("CourseEfficencyStatement");
-		efficencyForm = new CourseEfficencyStatementForm(ureq, wControl, courseConfig.isEfficencyStatementEnabled());
+		efficencyForm = new CourseEfficencyStatementForm(ureq, wControl,
+				courseConfig.isEfficencyStatementEnabled(), editable);
 		previousValue = courseConfig.isEfficencyStatementEnabled();
 		listenTo(efficencyForm);
 		myContent.put("efficencyForm", efficencyForm.getInitialComponent());
diff --git a/src/main/java/org/olat/course/config/ui/CourseEfficencyStatementForm.java b/src/main/java/org/olat/course/config/ui/CourseEfficencyStatementForm.java
index 619a3c6861a..83bd8c67035 100644
--- a/src/main/java/org/olat/course/config/ui/CourseEfficencyStatementForm.java
+++ b/src/main/java/org/olat/course/config/ui/CourseEfficencyStatementForm.java
@@ -42,14 +42,16 @@ public class CourseEfficencyStatementForm extends FormBasicController {
 
 	private SelectionElement isOn;
 	private boolean enabled;
+	private final boolean editable;
 
 	/**
 	 * @param name
 	 * @param chatEnabled
 	 */
-	public CourseEfficencyStatementForm(UserRequest ureq, WindowControl wControl, boolean enabled) {
+	public CourseEfficencyStatementForm(UserRequest ureq, WindowControl wControl, boolean enabled, boolean editable) {
 		super(ureq, wControl);
 		this.enabled = enabled;
+		this.editable = editable;
 		initForm (ureq);
 	}
 
@@ -71,11 +73,13 @@ public class CourseEfficencyStatementForm extends FormBasicController {
 
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-		
 		isOn = uifactory.addCheckboxesVertical("isOn", "chkbx.efficency.onoff", formLayout, new String[] {"xx"}, new String[] {""}, null, 1);
 		isOn.select("xx", enabled);
+		isOn.setEnabled(editable);
 		
-		uifactory.addFormSubmitButton("save", "save", formLayout);
+		if(editable) {
+			uifactory.addFormSubmitButton("save", "save", formLayout);
+		}
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/config/ui/CourseSharedFolderController.java b/src/main/java/org/olat/course/config/ui/CourseSharedFolderController.java
index ef369bc8a33..b61a2da29c0 100644
--- a/src/main/java/org/olat/course/config/ui/CourseSharedFolderController.java
+++ b/src/main/java/org/olat/course/config/ui/CourseSharedFolderController.java
@@ -34,15 +34,12 @@ import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
-import org.olat.core.gui.control.ControllerEventListener;
-import org.olat.core.gui.control.DefaultController;
 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.gui.control.generic.closablewrapper.CloseableModalController;
-import org.olat.core.gui.translator.PackageTranslator;
 import org.olat.core.logging.activity.ILoggingAction;
 import org.olat.core.logging.activity.LearningResourceLoggingAction;
-import org.olat.core.util.Util;
 import org.olat.course.ICourse;
 import org.olat.course.config.CourseConfig;
 import org.olat.fileresource.types.SharedFolderFileResource;
@@ -63,14 +60,10 @@ import org.olat.resource.references.ReferenceManager;
  * @version Initial Date: July 11, 2005
  * @author Alexander Schneider
  */
-public class CourseSharedFolderController extends DefaultController implements ControllerEventListener {
+public class CourseSharedFolderController extends BasicController  {
 
-	private static final String PACKAGE = Util.getPackageName(CourseSharedFolderController.class);
-	private static final String VELOCITY_ROOT = Util.getPackageVelocityRoot(PACKAGE);
 	private static final String SHAREDFOLDERREF = "sharedfolderref";
 	
-	//private ICourse course;
-	private PackageTranslator translator;
 	private VelocityContainer myContent;
 
 	private ReferencableEntriesSearchController searchController;
@@ -91,22 +84,23 @@ public class CourseSharedFolderController extends DefaultController implements C
 	 * @param wControl
 	 * @param theCourse
 	 */
-	public CourseSharedFolderController(UserRequest ureq, WindowControl wControl, CourseConfig courseConfig) {
-		super(wControl);
+	public CourseSharedFolderController(UserRequest ureq, WindowControl wControl, CourseConfig courseConfig, boolean editable) {
+		super(ureq, wControl);
 
 		this.courseConfig = courseConfig;
-		translator = new PackageTranslator(PACKAGE, ureq.getLocale());
 		
-		myContent = new VelocityContainer("courseSharedFolderTab", VELOCITY_ROOT + "/CourseSharedFolder.html", translator, this);
-		changeSFResButton = LinkFactory.createButton("sf.changesfresource", myContent, this);
-		unselectSFResButton = LinkFactory.createButton("sf.unselectsfresource", myContent, this);
-		selectSFResButton = LinkFactory.createButton("sf.selectsfresource", myContent, this);
+		myContent = createVelocityContainer("CourseSharedFolder");
+		if(editable) {
+			changeSFResButton = LinkFactory.createButton("sf.changesfresource", myContent, this);
+			unselectSFResButton = LinkFactory.createButton("sf.unselectsfresource", myContent, this);
+			selectSFResButton = LinkFactory.createButton("sf.selectsfresource", myContent, this);
+		}
 		
 		String softkey = courseConfig.getSharedFolderSoftkey();
 		String name;
 
 		if (!courseConfig.hasCustomSharedFolder()) {
-			name = translator.translate("sf.notconfigured");
+			name = translate("sf.notconfigured");
 			hasSF = false;
 			myContent.contextPut("hasSharedFolder", new Boolean(hasSF));
 		} else {
@@ -114,7 +108,7 @@ public class CourseSharedFolderController extends DefaultController implements C
 			if (re == null) {
 				//log.warning("Removed configured sahred folder from course config, because repo entry does not exist anymore.");
 				courseConfig.setSharedFolderSoftkey(CourseConfig.VALUE_EMPTY_SHAREDFOLDER_SOFTKEY);
-				name = translator.translate("sf.notconfigured");
+				name = translate("sf.notconfigured");
 				hasSF = false;
 				myContent.contextPut("hasSharedFolder", new Boolean(hasSF));
 			} else {
@@ -125,7 +119,7 @@ public class CourseSharedFolderController extends DefaultController implements C
 		}
 		myContent.contextPut("resourceTitle", name);
 
-		setInitialComponent(myContent);
+		putInitialPanel(myContent);
 	}
 
 	/**
@@ -136,9 +130,9 @@ public class CourseSharedFolderController extends DefaultController implements C
 		if (source == selectSFResButton || source == changeSFResButton) { // select or change shared folder
 			// let user choose a shared folder
 			searchController = new ReferencableEntriesSearchController(getWindowControl(), ureq, 
-					SharedFolderFileResource.TYPE_NAME, translator.translate("command.choose"));
+					SharedFolderFileResource.TYPE_NAME, translate("command.choose"));
 			searchController.addControllerListener(this);
-			cmc = new CloseableModalController(getWindowControl(), translator.translate("close"), searchController.getInitialComponent());
+			cmc = new CloseableModalController(getWindowControl(), translate("close"), searchController.getInitialComponent());
 			cmc.activate();		
 		} else if (source == unselectSFResButton) { // unselect shared folder			
 			if (courseConfig.hasCustomSharedFolder()) {
@@ -151,7 +145,7 @@ public class CourseSharedFolderController extends DefaultController implements C
 				courseConfig.setSharedFolderSoftkey(CourseConfig.VALUE_EMPTY_SHAREDFOLDER_SOFTKEY);
 				//deleteRefTo(course);
 				//course.getCourseEnvironment().setCourseConfig(cc);
-				String emptyKey = translator.translate(CourseConfig.VALUE_EMPTY_SHAREDFOLDER_SOFTKEY);
+				String emptyKey = translate(CourseConfig.VALUE_EMPTY_SHAREDFOLDER_SOFTKEY);
 				myContent.contextPut("resourceTitle", emptyKey);
 				hasSF = false;
 				myContent.contextPut("hasSharedFolder", new Boolean(hasSF));
@@ -209,9 +203,9 @@ public class CourseSharedFolderController extends DefaultController implements C
 	 */
 	public static void deleteRefTo(ICourse course) {
 		ReferenceManager refM = ReferenceManager.getInstance();
-		List repoRefs = refM.getReferences(course);
-		for (Iterator iter = repoRefs.iterator(); iter.hasNext();) {
-			ReferenceImpl ref = (ReferenceImpl) iter.next();
+		List<ReferenceImpl> repoRefs = refM.getReferences(course);
+		for (Iterator<ReferenceImpl> iter = repoRefs.iterator(); iter.hasNext();) {
+			ReferenceImpl ref = iter.next();
 			if (ref.getUserdata().equals(SHAREDFOLDERREF)) {
 				refM.delete(ref);
 				return;
@@ -227,7 +221,6 @@ public class CourseSharedFolderController extends DefaultController implements C
 			searchController.dispose();
 			searchController = null;
 		}
-
 	}
 
 	/**
@@ -241,5 +234,4 @@ public class CourseSharedFolderController extends DefaultController implements C
 	public RepositoryEntry getSharedFolderRepositoryEntry() {
 		return sharedFolderRepositoryEntry;
 	}
-
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/config/ui/_content/CourseGlossary.html b/src/main/java/org/olat/course/config/ui/_content/CourseGlossary.html
index 49584e48f5a..ea2968bfe39 100644
--- a/src/main/java/org/olat/course/config/ui/_content/CourseGlossary.html
+++ b/src/main/java/org/olat/course/config/ui/_content/CourseGlossary.html
@@ -7,13 +7,13 @@
 		<div class="b_button_group">
 			$r.render("command.glossary.add")
 		</div>
-	#elseif ($r.available("command.glossary.remove"))
+	#elseif ($repoEntry)
 		$repoEntry.getDisplayname()
-		<p>
-			$r.translate("glossary.description"): $r.formatLatexFormulas($repoEntry.getDescription())
-		</p>
-		<div class="b_button_group">
-			$r.render("command.glossary.remove")	
-		</div>
+		<p>$r.translate("glossary.description"): $r.formatLatexFormulas($repoEntry.getDescription())</p>
+		#if($r.available("command.glossary.remove"))
+			<div class="b_button_group">
+				$r.render("command.glossary.remove")	
+			</div>
+		#end
 	#end
 </fieldset>
diff --git a/src/main/java/org/olat/course/config/ui/_content/CourseSharedFolder.html b/src/main/java/org/olat/course/config/ui/_content/CourseSharedFolder.html
index 4eb9bca7b26..a2b622ef564 100644
--- a/src/main/java/org/olat/course/config/ui/_content/CourseSharedFolder.html
+++ b/src/main/java/org/olat/course/config/ui/_content/CourseSharedFolder.html
@@ -6,7 +6,7 @@
 		#if($hasSharedFolder)
 			$r.render("sf.changesfresource")
 			$r.render("sf.unselectsfresource")
-		#else
+		#elseif($r.available("sf.selectsfresource"))
 			$r.render("sf.selectsfresource")
 		#end
 	</div>
diff --git a/src/main/java/org/olat/course/config/ui/courselayout/CourseLayoutGeneratorController.java b/src/main/java/org/olat/course/config/ui/courselayout/CourseLayoutGeneratorController.java
index edc2ec483f4..fe9776e4826 100644
--- a/src/main/java/org/olat/course/config/ui/courselayout/CourseLayoutGeneratorController.java
+++ b/src/main/java/org/olat/course/config/ui/courselayout/CourseLayoutGeneratorController.java
@@ -90,11 +90,13 @@ public class CourseLayoutGeneratorController extends FormBasicController {
 	private FormLayoutContainer logoImgFlc;
 	private FormLink logoDel;
 	private boolean elWithErrorExists = false;
+	private final boolean editable;
 
 	public CourseLayoutGeneratorController(UserRequest ureq, WindowControl wControl, CourseConfig courseConfig,
-			CourseEnvironment courseEnvironment) {
+			CourseEnvironment courseEnvironment, boolean editable) {
 		super(ureq, wControl);
 		
+		this.editable = editable;
 		this.courseConfig = courseConfig;
 		this.courseEnvironment = courseEnvironment;
 		customCMgr = (CustomConfigManager) CoreSpringFactory.getBean("courseConfigManager");
@@ -109,7 +111,6 @@ public class CourseLayoutGeneratorController extends FormBasicController {
 	/**
 	 * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#initForm(org.olat.core.gui.components.form.flexible.FormItemContainer, org.olat.core.gui.control.Controller, org.olat.core.gui.UserRequest)
 	 */
-	@SuppressWarnings("unused")
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		setFormTitle("tab.layout.title");
@@ -178,6 +179,7 @@ public class CourseLayoutGeneratorController extends FormBasicController {
 		
 		styleSel = uifactory.addDropdownSingleselect("course.layout.selector", formLayout, theKeys, theValues, theCssClasses);
 		styleSel.addActionListener(this, FormEvent.ONCHANGE);
+		styleSel.setEnabled(editable);
 		if (keys.contains(actualCSSSettings)){
 			styleSel.select(actualCSSSettings, true);
 		} else {
@@ -195,12 +197,14 @@ public class CourseLayoutGeneratorController extends FormBasicController {
 		refreshLogoImage();	
 		
 		// offer upload for 2nd logo
-		logoUpl = uifactory.addFileElement("upload.second.logo", formLayout);
-		logoUpl.addActionListener(this, FormEvent.ONCHANGE);
-		Set<String> mimeTypes = new HashSet<String>();
-		mimeTypes.add("image/*");
-		logoUpl.limitToMimeType(mimeTypes, "logo.file.type.error", null);
-		logoUpl.setMaxUploadSizeKB(2048, "logo.size.error", null);
+		if(editable) {
+			logoUpl = uifactory.addFileElement("upload.second.logo", formLayout);
+			logoUpl.addActionListener(this, FormEvent.ONCHANGE);
+			Set<String> mimeTypes = new HashSet<String>();
+			mimeTypes.add("image/*");
+			logoUpl.limitToMimeType(mimeTypes, "logo.file.type.error", null);
+			logoUpl.setMaxUploadSizeKB(2048, "logo.size.error", null);
+		}
 		
 		// prepare the custom layouter
 		styleFlc = FormLayoutContainer.createCustomFormLayout("style", getTranslator(), velocity_root + "/style.html");
@@ -208,14 +212,16 @@ public class CourseLayoutGeneratorController extends FormBasicController {
 		styleFlc.setLabel(null, null);
 		enableDisableCustom(CourseLayoutHelper.CONFIG_KEY_CUSTOM.equals(actualCSSSettings));
 		
-		uifactory.addFormSubmitButton("course.layout.save", formLayout);		
+		if(editable) {
+			uifactory.addFormSubmitButton("course.layout.save", formLayout);
+		}
 	}
 
 	/**
 	 * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#formInnerEvent(org.olat.core.gui.UserRequest, org.olat.core.gui.components.form.flexible.FormItem, org.olat.core.gui.components.form.flexible.impl.FormEvent)
 	 */
 	@Override
-	protected void formInnerEvent(@SuppressWarnings("unused") UserRequest ureq, FormItem source, FormEvent event) {
+	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
 		if (source == styleSel) {
 			String selection = styleSel.getSelectedKey();
 			if (CourseLayoutHelper.CONFIG_KEY_CUSTOM.equals(selection)) {
@@ -256,7 +262,8 @@ public class CourseLayoutGeneratorController extends FormBasicController {
 	private void enableDisableCustom(boolean onOff){
 		if (onOff) prepareStyleEditor(persistedCustomConfig);
 		styleFlc.setVisible(onOff);
-		logoUpl.setVisible(onOff);
+		styleFlc.setEnabled(editable);
+		if(logoUpl != null) logoUpl.setVisible(onOff);
 		logoImgFlc.setVisible(onOff);
 	}
 	
@@ -343,6 +350,7 @@ public class CourseLayoutGeneratorController extends FormBasicController {
 			image.setMaxWithAndHeightToFitWithin(300, 300);
 			logoDel = uifactory.addFormLink("logo.delete", logoImgFlc, Link.BUTTON_XSMALL);
 			logoDel.setUserObject(logo);
+			logoDel.setVisible(editable);
 			return;
 		}	
 		logoImgFlc.setVisible(false);
diff --git a/src/main/java/org/olat/course/member/CourseBusinessGroupListController.java b/src/main/java/org/olat/course/member/CourseBusinessGroupListController.java
index 16b69398659..a72b69b9f46 100644
--- a/src/main/java/org/olat/course/member/CourseBusinessGroupListController.java
+++ b/src/main/java/org/olat/course/member/CourseBusinessGroupListController.java
@@ -42,6 +42,7 @@ import org.olat.core.gui.control.generic.closablewrapper.CloseableModalControlle
 import org.olat.core.gui.control.generic.modal.DialogBoxController;
 import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
 import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupManagedFlag;
 import org.olat.group.model.BusinessGroupSelectionEvent;
 import org.olat.group.model.SearchBusinessGroupParams;
 import org.olat.group.ui.main.AbstractBusinessGroupListController;
@@ -49,8 +50,11 @@ import org.olat.group.ui.main.BGAccessControlledCellRenderer;
 import org.olat.group.ui.main.BGTableItem;
 import org.olat.group.ui.main.BusinessGroupNameCellRenderer;
 import org.olat.group.ui.main.BusinessGroupTableModelWithType.Cols;
+import org.olat.group.ui.main.BusinessGroupViewFilter;
 import org.olat.group.ui.main.SelectBusinessGroupController;
+import org.olat.group.ui.main.UnmanagedGroupFilter;
 import org.olat.repository.RepositoryEntry;
+import org.olat.repository.RepositoryEntryManagedFlag;
 import org.olat.resource.OLATResource;
 
 /**
@@ -59,8 +63,8 @@ import org.olat.resource.OLATResource;
  */
 public class CourseBusinessGroupListController extends AbstractBusinessGroupListController {
 	
-	private static String TABLE_ACTION_UNLINK = "tblUnlink";
-	private static String TABLE_ACTION_MULTI_UNLINK = "tblMultiUnlink";
+	public static String TABLE_ACTION_UNLINK = "tblUnlink";
+	public static String TABLE_ACTION_MULTI_UNLINK = "tblMultiUnlink";
 	
 	private final RepositoryEntry re;
 	private final Link createGroup;
@@ -71,12 +75,15 @@ public class CourseBusinessGroupListController extends AbstractBusinessGroupList
 	private SelectBusinessGroupController selectController;
 	
 	public CourseBusinessGroupListController(UserRequest ureq, WindowControl wControl, RepositoryEntry re) {
-		super(ureq, wControl, "group_list");
+		super(ureq, wControl, "group_list", re);
 		this.re = re;
 		
+		boolean managed = RepositoryEntryManagedFlag.isManaged(re, RepositoryEntryManagedFlag.groups);
 		createGroup = LinkFactory.createButton("group.create", mainVC, this);
+		createGroup.setVisible(!managed);
 		mainVC.put("createGroup", createGroup);
 		addGroup = LinkFactory.createButton("group.add", mainVC, this);
+		addGroup.setVisible(!managed);
 		mainVC.put("addGroup", addGroup);
 	}
 
@@ -84,16 +91,26 @@ public class CourseBusinessGroupListController extends AbstractBusinessGroupList
 	protected void initButtons(UserRequest ureq) {
 		initButtons(ureq, true);
 		groupListCtr.setMultiSelect(true);
-		groupListCtr.addMultiSelectAction("table.duplicate", TABLE_ACTION_DUPLICATE);
-		groupListCtr.addMultiSelectAction("table.merge", TABLE_ACTION_MERGE);
+		
+		RepositoryEntry re = (RepositoryEntry)getUserObject();
+		boolean managed = RepositoryEntryManagedFlag.isManaged(re, RepositoryEntryManagedFlag.groups);
+		if(!managed) {
+			groupListCtr.addMultiSelectAction("table.duplicate", TABLE_ACTION_DUPLICATE);
+			groupListCtr.addMultiSelectAction("table.merge", TABLE_ACTION_MERGE);
+		}
 		groupListCtr.addMultiSelectAction("table.users.management", TABLE_ACTION_USERS);
 		groupListCtr.addMultiSelectAction("table.config", TABLE_ACTION_CONFIG);
 		groupListCtr.addMultiSelectAction("table.email", TABLE_ACTION_EMAIL);
-		groupListCtr.addMultiSelectAction("table.header.remove", TABLE_ACTION_MULTI_UNLINK);
+		if(!managed) {
+			groupListCtr.addMultiSelectAction("table.header.remove", TABLE_ACTION_MULTI_UNLINK);
+		}
 	}
 
 	@Override
 	protected int initColumns() {
+		RepositoryEntry re = (RepositoryEntry)getUserObject();
+		boolean managed = RepositoryEntryManagedFlag.isManaged(re, RepositoryEntryManagedFlag.groups);
+		
 		CustomCssCellRenderer nameRenderer = new BusinessGroupNameCellRenderer();
 		groupListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.name.i18n(), Cols.name.ordinal(), TABLE_ACTION_LAUNCH, getLocale(), ColumnDescriptor.ALIGNMENT_LEFT, nameRenderer));
 		groupListCtr.addColumnDescriptor(false, new DefaultColumnDescriptor(Cols.key.i18n(), Cols.key.ordinal(), null, getLocale()));
@@ -106,7 +123,9 @@ public class CourseBusinessGroupListController extends AbstractBusinessGroupList
 		CustomCellRenderer acRenderer = new BGAccessControlledCellRenderer();
 		groupListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.accessTypes.i18n(), Cols.accessTypes.ordinal(), null, getLocale(), ColumnDescriptor.ALIGNMENT_LEFT, acRenderer));
 		groupListCtr.addColumnDescriptor(new StaticColumnDescriptor(TABLE_ACTION_EDIT, "table.header.edit", translate("table.header.edit")));
-		groupListCtr.addColumnDescriptor(new StaticColumnDescriptor(TABLE_ACTION_UNLINK, "table.header.remove", translate("table.header.remove")));
+		if(!managed) {
+			groupListCtr.addColumnDescriptor(new RemoveActionColumnDescriptor("table.header.remove", Cols.wrapper.ordinal(), getTranslator()));
+		}
 		return 11;
 	}
 
@@ -185,7 +204,8 @@ public class CourseBusinessGroupListController extends AbstractBusinessGroupList
 
 	protected void doSelectGroups(UserRequest ureq) {
 		removeAsListenerAndDispose(selectController);
-		selectController = new SelectBusinessGroupController(ureq, getWindowControl());
+		BusinessGroupViewFilter filter = new UnmanagedGroupFilter(BusinessGroupManagedFlag.resources);
+		selectController = new SelectBusinessGroupController(ureq, getWindowControl(), filter);
 		listenTo(selectController);
 		
 		cmc = new CloseableModalController(getWindowControl(), translate("close"),
diff --git a/src/main/java/org/olat/course/member/MembersOverviewController.java b/src/main/java/org/olat/course/member/MembersOverviewController.java
index d0023a92a01..eab7c77aba6 100644
--- a/src/main/java/org/olat/course/member/MembersOverviewController.java
+++ b/src/main/java/org/olat/course/member/MembersOverviewController.java
@@ -61,6 +61,7 @@ import org.olat.group.ui.main.DedupMembersConfirmationController;
 import org.olat.group.ui.main.MemberPermissionChangeEvent;
 import org.olat.group.ui.main.SearchMembersParams;
 import org.olat.repository.RepositoryEntry;
+import org.olat.repository.RepositoryEntryManagedFlag;
 import org.olat.repository.RepositoryManager;
 import org.olat.repository.model.RepositoryEntryPermissionChangeEvent;
 import org.olat.util.logging.activity.LoggingResourceable;
@@ -125,11 +126,15 @@ public class MembersOverviewController extends BasicController implements Activa
 		
 		selectedCtrl = updateAllMembers(ureq);
 		
+		boolean managed = RepositoryEntryManagedFlag.isManaged(repoEntry, RepositoryEntryManagedFlag.membersmanagement);
 		addMemberLink = LinkFactory.createButton("add.member", mainVC, this);
+		addMemberLink.setVisible(!managed);
 		mainVC.put("addMembers", addMemberLink);
 		importMemberLink = LinkFactory.createButton("import.member", mainVC, this);
+		importMemberLink.setVisible(!managed);
 		mainVC.put("importMembers", importMemberLink);
 		dedupLink = LinkFactory.createButton("dedup.members", mainVC, this);
+		dedupLink.setVisible(!managed);
 		mainVC.put("dedupMembers", dedupLink);
 		
 		putInitialPanel(mainVC);
diff --git a/src/main/java/org/olat/course/member/RemoveActionColumnDescriptor.java b/src/main/java/org/olat/course/member/RemoveActionColumnDescriptor.java
new file mode 100644
index 00000000000..c3362952559
--- /dev/null
+++ b/src/main/java/org/olat/course/member/RemoveActionColumnDescriptor.java
@@ -0,0 +1,78 @@
+/**
+ * <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.course.member;
+
+import org.olat.core.gui.components.table.DefaultColumnDescriptor;
+import org.olat.core.gui.render.Renderer;
+import org.olat.core.gui.render.StringOutput;
+import org.olat.core.gui.translator.Translator;
+import org.olat.group.BusinessGroupManagedFlag;
+import org.olat.group.ui.main.BGTableItem;
+import org.olat.group.ui.main.BusinessGroupTableModelWithType;
+
+/**
+ * The remove link appear only if the group is not managed
+ * 
+ * Initial date: 10.07.2013<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class RemoveActionColumnDescriptor extends DefaultColumnDescriptor {
+
+	private final Translator translator;
+	
+	public RemoveActionColumnDescriptor(final String headerKey, final int dataColumn, final Translator translator) {
+		super(headerKey, dataColumn, null, translator.getLocale());
+		this.translator = translator;
+	}
+
+	@Override
+	public String getAction(int row) {
+		int sortedRow = table.getSortedRow(row);
+		
+		Object memberObj = table.getTableDataModel().getValueAt(sortedRow, BusinessGroupTableModelWithType.Cols.wrapper.ordinal());
+		if(memberObj instanceof BGTableItem) {
+			//owner, participant, or in waiting list can leave
+			BGTableItem item = (BGTableItem)memberObj;
+			boolean managed = BusinessGroupManagedFlag.isManaged(item.getManagedFlags(), BusinessGroupManagedFlag.resources);
+			if(managed) {
+				return null;
+			}
+		}
+		return CourseBusinessGroupListController.TABLE_ACTION_UNLINK;
+	}
+
+	@Override
+	public void renderValue(StringOutput sb, int row, Renderer renderer) {
+		int sortedRow = table.getSortedRow(row);
+		Object memberObj = table.getTableDataModel().getValueAt(sortedRow, BusinessGroupTableModelWithType.Cols.wrapper.ordinal());
+		
+		boolean managed = false;
+		if(memberObj instanceof BGTableItem) {
+			//owner, participant, or in waiting list can leave
+			BGTableItem item = (BGTableItem)memberObj;
+			managed = BusinessGroupManagedFlag.isManaged(item.getManagedFlags(), BusinessGroupManagedFlag.resources);
+		}
+		
+		if(!managed) {
+			sb.append(translator.translate(getHeaderKey()));
+		}
+	}
+}
diff --git a/src/main/java/org/olat/course/run/RunMainController.java b/src/main/java/org/olat/course/run/RunMainController.java
index cce4fe0a0a0..c3e040cacc8 100644
--- a/src/main/java/org/olat/course/run/RunMainController.java
+++ b/src/main/java/org/olat/course/run/RunMainController.java
@@ -120,6 +120,7 @@ import org.olat.instantMessaging.OpenInstantMessageEvent;
 import org.olat.modules.cp.TreeNodeEvent;
 import org.olat.note.NoteController;
 import org.olat.repository.RepositoryEntry;
+import org.olat.repository.RepositoryEntryManagedFlag;
 import org.olat.repository.RepositoryEntryStatus;
 import org.olat.repository.RepositoryManager;
 import org.olat.repository.controllers.EntryChangedEvent;
@@ -1022,7 +1023,9 @@ public class RunMainController extends MainLayoutBasicController implements Gene
 				|| hasCourseRight(CourseRights.RIGHT_ASSESSMENT)) {
 			myTool.addHeader(translate("header.tools"));
 			if (hasCourseRight(CourseRights.RIGHT_COURSEEDITOR) || isCourseAdmin) {
-				myTool.addLink(COMMAND_EDIT, translate("command.openeditor"), null, null, "o_sel_course_open_editor", false);
+				boolean managed = RepositoryEntryManagedFlag.isManaged(courseRepositoryEntry, RepositoryEntryManagedFlag.editcontent);
+				myTool.addLink(COMMAND_EDIT, translate("command.openeditor"), "edit.cmd", null, "o_sel_course_open_editor", false);
+				myTool.setEnabled("edit.cmd", !managed);
 			}
 			if (hasCourseRight(CourseRights.RIGHT_GROUPMANAGEMENT) || isCourseAdmin) {
 				//fxdiff VCRP-1,2: access control of resources
@@ -1261,7 +1264,10 @@ public class RunMainController extends MainLayoutBasicController implements Gene
 				//the wrong link to the wrong person
 			}
 		} else if(RepositoryDetailsController.ACTIVATE_EDITOR.equals(type)) {
-			doEdit(ureq);
+			boolean managed = RepositoryEntryManagedFlag.isManaged(courseRepositoryEntry, RepositoryEntryManagedFlag.editcontent);
+			if(!managed) {
+				doEdit(ureq);
+			}
 		}
 	}
 
diff --git a/src/main/java/org/olat/group/BusinessGroup.java b/src/main/java/org/olat/group/BusinessGroup.java
index 3cadf26ac7a..d0efe89944d 100644
--- a/src/main/java/org/olat/group/BusinessGroup.java
+++ b/src/main/java/org/olat/group/BusinessGroup.java
@@ -85,13 +85,20 @@ public interface BusinessGroup extends BusinessGroupShort, Persistable, CreateIn
 	 * 
 	 * @return List of flags which say what features are externally managed
 	 */
-	public String getManagedFlags();
+	public BusinessGroupManagedFlag[] getManagedFlags();
+
+	/**
+	 * Return the list of managed flags as a string with the
+	 * flags separated by comma.
+	 * @return
+	 */
+	public String getManagedFlagsString();
 	
 	/**
 	 * A list of flags
 	 * @param flags
 	 */
-	public void setManagedFlags(String flags);
+	public void setManagedFlagsString(String flags);
 
 	/**
 	 * BusinessGroup was active, lastUsage will be used to determine which groups
diff --git a/src/main/java/org/olat/group/BusinessGroupImpl.hbm.xml b/src/main/java/org/olat/group/BusinessGroupImpl.hbm.xml
index 193affd39c0..73af71595cd 100644
--- a/src/main/java/org/olat/group/BusinessGroupImpl.hbm.xml
+++ b/src/main/java/org/olat/group/BusinessGroupImpl.hbm.xml
@@ -31,7 +31,7 @@
   		<property name="lastUsage" column="lastusage" type="timestamp" />   
 		<property name="type" column="businessgrouptype" unique="false" length="15" not-null="true" index="gp_type_idx"/>	
 		<property name="externalId" column="external_id" unique="false" not-null="false" type="string"/>
-		<property name="managedFlags" column="managed_flags" unique="false" not-null="false" type="string"/>
+		<property name="managedFlagsString" column="managed_flags" unique="false" not-null="false" type="string"/>
 		
 			 		
 		<property name="name" type="string" column="groupname" unique="false" length="255" index="gp_name_idx"/>	
@@ -105,5 +105,6 @@
 		</id>
 
   		<property name="name" type="string" column="groupname" unique="false" length="255"/>
+		<property name="managedFlagsString" column="managed_flags" unique="false" not-null="false" type="string"/>
 	</class>
 </hibernate-mapping>
\ No newline at end of file
diff --git a/src/main/java/org/olat/group/BusinessGroupImpl.java b/src/main/java/org/olat/group/BusinessGroupImpl.java
index df1ce28dc88..2472ee31571 100644
--- a/src/main/java/org/olat/group/BusinessGroupImpl.java
+++ b/src/main/java/org/olat/group/BusinessGroupImpl.java
@@ -32,6 +32,7 @@ import org.olat.core.commons.persistence.PersistentObject;
 import org.olat.core.logging.AssertException;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
+import org.olat.core.util.StringHelper;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.resource.OLATResource;
 
@@ -53,7 +54,7 @@ public class BusinessGroupImpl extends PersistentObject implements BusinessGroup
 	private String name;
 	private String type;
 	private String externalId;
-	private String managedFlags;
+	private String managedFlagsString;
 	private Integer minParticipants;
 	private Integer maxParticipants;
 	private OLATResource resource;
@@ -144,12 +145,22 @@ public class BusinessGroupImpl extends PersistentObject implements BusinessGroup
 		this.externalId = externalId;
 	}
 
-	public String getManagedFlags() {
-		return managedFlags;
+	@Override
+	public BusinessGroupManagedFlag[] getManagedFlags() {
+		if(StringHelper.containsNonWhitespace(managedFlagsString)) {
+			return BusinessGroupManagedFlag.toEnum(managedFlagsString);
+		}
+		return new BusinessGroupManagedFlag[0];
+	}
+
+	@Override
+	public String getManagedFlagsString() {
+		return managedFlagsString;
 	}
 
-	public void setManagedFlags(String managedFlags) {
-		this.managedFlags = managedFlags;
+	@Override
+	public void setManagedFlagsString(String managedFlags) {
+		this.managedFlagsString = managedFlags;
 	}
 
 	/**
diff --git a/src/main/java/org/olat/group/BusinessGroupManagedFlag.java b/src/main/java/org/olat/group/BusinessGroupManagedFlag.java
new file mode 100644
index 00000000000..196e349ad8e
--- /dev/null
+++ b/src/main/java/org/olat/group/BusinessGroupManagedFlag.java
@@ -0,0 +1,124 @@
+/**
+ * <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.group;
+
+import java.util.Arrays;
+
+import org.olat.core.logging.OLog;
+import org.olat.core.logging.Tracing;
+import org.olat.core.util.StringHelper;
+
+/**
+ * List of flags for managed groups
+ * 
+ * Initial date: 10.07.2013<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ */
+public enum BusinessGroupManagedFlag {
+	
+	all,
+	  details(all),//details tab
+	    title(details,all),
+	    description(details,all),
+	    settings(details,all),//max num of participants...
+	  tools(all),//tools tab
+	  members(all),//members tab
+	    display(members,all),// members display options
+	    membersmanagement(members,all),
+	  resources(all),//add/remove courses
+	  bookings(all),// change booking rules
+	  delete(all);
+	
+	
+	private BusinessGroupManagedFlag[] parents;
+	private static final OLog log = Tracing.createLoggerFor(BusinessGroupManagedFlag.class);
+	public static final BusinessGroupManagedFlag[] EMPTY_ARRAY = new BusinessGroupManagedFlag[0];
+	
+	private BusinessGroupManagedFlag() {
+		//
+	}
+	
+	private BusinessGroupManagedFlag(BusinessGroupManagedFlag... parents) {
+		if(parents == null) {
+			this.parents = new BusinessGroupManagedFlag[0];
+		} else {
+			this.parents = parents;
+		}
+	}
+	
+	public static BusinessGroupManagedFlag[] toEnum(String flags) {
+		if(StringHelper.containsNonWhitespace(flags)) {
+			String[] flagArr = flags.split(",");
+			BusinessGroupManagedFlag[] flagEnums = new BusinessGroupManagedFlag[flagArr.length];
+	
+			int count = 0;
+			for(String flag:flagArr) {
+				if(StringHelper.containsNonWhitespace(flag)) {
+					try {
+						BusinessGroupManagedFlag flagEnum = valueOf(flag);
+						flagEnums[count++] = flagEnum;
+					} catch (Exception e) {
+						log.warn("Cannot parse this managed flag: " + flag, e);
+					}
+				}
+			}
+			
+			if(count != flagEnums.length) {
+				flagEnums = Arrays.copyOf(flagEnums, count);
+			}
+			return flagEnums;
+		} else {
+			return EMPTY_ARRAY;
+		}
+	}
+	
+	public static boolean isManaged(BusinessGroup group, BusinessGroupManagedFlag marker) {
+		if(group != null && (contains(group, marker) || contains(group, marker.parents))) {
+			return true;
+		}
+		return false;
+	}
+	
+	public static boolean isManaged(BusinessGroupManagedFlag[] flags, BusinessGroupManagedFlag marker) {
+		if(flags != null && (contains(flags, marker) || contains(flags, marker.parents))) {
+			return true;
+		}
+		return false;
+	}
+	
+	private static boolean contains(BusinessGroup group, BusinessGroupManagedFlag... markers) {
+		if(group == null) return false;
+		BusinessGroupManagedFlag[] flags = group.getManagedFlags();
+		return contains(flags, markers);
+	}
+
+	private static boolean contains(BusinessGroupManagedFlag[] flags, BusinessGroupManagedFlag... markers) {
+		if(flags == null || flags.length == 0) return false;
+
+		for(BusinessGroupManagedFlag flag:flags) {
+			for(BusinessGroupManagedFlag marker:markers) {
+				if(flag.equals(marker)) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+}
diff --git a/src/main/java/org/olat/group/BusinessGroupService.java b/src/main/java/org/olat/group/BusinessGroupService.java
index 0c5b8df0b5d..71bd2d5d5c1 100644
--- a/src/main/java/org/olat/group/BusinessGroupService.java
+++ b/src/main/java/org/olat/group/BusinessGroupService.java
@@ -420,7 +420,8 @@ public interface BusinessGroupService {
 	/**
 	 * Remove the members (tutors and participants) from all business groups connected
 	 * to the resource (the resource can be a BusinessGroup) by cancelling their membership
-	 * or their reservations.
+	 * or their reservations.<br/>
+	 * This method respect the managed flags.
 	 * 
 	 * @param ureqIdentity
 	 * @param identities
diff --git a/src/main/java/org/olat/group/BusinessGroupShort.java b/src/main/java/org/olat/group/BusinessGroupShort.java
index 0d5640a7e8a..6f4813d6bf2 100644
--- a/src/main/java/org/olat/group/BusinessGroupShort.java
+++ b/src/main/java/org/olat/group/BusinessGroupShort.java
@@ -32,5 +32,7 @@ public interface BusinessGroupShort extends OLATResourceable {
 	public Long getKey();
 	
 	public String getName();
+	
+	public BusinessGroupManagedFlag[] getManagedFlags();
 
 }
diff --git a/src/main/java/org/olat/group/BusinessGroupView.java b/src/main/java/org/olat/group/BusinessGroupView.java
index 36ed10a3b09..82d9eab947b 100644
--- a/src/main/java/org/olat/group/BusinessGroupView.java
+++ b/src/main/java/org/olat/group/BusinessGroupView.java
@@ -21,7 +21,6 @@ package org.olat.group;
 
 import java.util.Date;
 
-import org.olat.basesecurity.SecurityGroup;
 import org.olat.core.id.CreateInfo;
 import org.olat.core.id.ModifiedInfo;
 import org.olat.core.id.OLATResourceable;
@@ -74,26 +73,6 @@ public interface BusinessGroupView extends BusinessGroupShort, Persistable, Crea
 	 */
 	public long getNumOfValidOffers();
 
-	/**
-	 * The BusinessGroup has 1..n Owners acting as <i>administrators </i>.
-	 * 
-	 * @return the owners
-	 */
-	public SecurityGroup getOwnerGroup();
-
-	/**
-	 * The BusinessGroup has 0..n Partipiciants.
-	 * 
-	 * @return the partipiciants
-	 */
-	public SecurityGroup getPartipiciantGroup();
-
-	/**
-	 * The BusinessGroup has 0..n people in the waiting group.
-	 * 
-	 * @return the waiting group
-	 */
-	public SecurityGroup getWaitingGroup();
 
 	/**
 	 * @return last usage of this group
@@ -119,6 +98,9 @@ public interface BusinessGroupView extends BusinessGroupShort, Persistable, Crea
 	 * @return true: if waiting-list is enabled
 	 */
 	public Boolean getWaitingListEnabled();
+	
+	
+	public BusinessGroupManagedFlag[] getManagedFlags();
 
 	
 }
diff --git a/src/main/java/org/olat/group/manager/BusinessGroupDAO.java b/src/main/java/org/olat/group/manager/BusinessGroupDAO.java
index 8e714e06efa..f767f2d6e7f 100644
--- a/src/main/java/org/olat/group/manager/BusinessGroupDAO.java
+++ b/src/main/java/org/olat/group/manager/BusinessGroupDAO.java
@@ -111,7 +111,7 @@ public class BusinessGroupDAO {
 			businessgroup.setExternalId(externalId);
 		}
 		if(StringHelper.containsNonWhitespace(managedFlags)) {
-			businessgroup.setManagedFlags(managedFlags);
+			businessgroup.setManagedFlagsString(managedFlags);
 		}
 		
 		businessgroup.setWaitingListEnabled(waitingListEnabled);
diff --git a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
index a2b0fcd463b..8345c392ee8 100644
--- a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
+++ b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
@@ -67,6 +67,7 @@ import org.olat.core.util.resource.OLATResourceableJustBeforeDeletedEvent;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.group.BusinessGroup;
 import org.olat.group.BusinessGroupAddResponse;
+import org.olat.group.BusinessGroupManagedFlag;
 import org.olat.group.BusinessGroupMembership;
 import org.olat.group.BusinessGroupModule;
 import org.olat.group.BusinessGroupOrder;
@@ -225,7 +226,7 @@ public class BusinessGroupServiceImpl implements BusinessGroupService, UserDataD
 		if("none".equals(managedFlags) || "".equals(managedFlags)) {
 			managedFlags = null;
 		}
-		bg.setManagedFlags(managedFlags);
+		bg.setManagedFlagsString(managedFlags);
 
 		//auto rank if possible
 		List<BusinessGroupModifiedEvent.Deferred> events = new ArrayList<BusinessGroupModifiedEvent.Deferred>();
@@ -1070,6 +1071,18 @@ public class BusinessGroupServiceImpl implements BusinessGroupService, UserDataD
 		if(groups == null || groups.isEmpty()) {
 			return;//nothing to do
 		}
+		
+		//remove managed groups
+		for(Iterator<BusinessGroup> groupIt=groups.iterator(); groupIt.hasNext(); ) {
+			boolean managed = BusinessGroupManagedFlag.isManaged(groupIt.next(), BusinessGroupManagedFlag.membersmanagement);
+			if(managed) {
+				groupIt.remove();
+			}
+		}
+		
+		if(groups.isEmpty()) {
+			return;//nothing to do
+		}
 
 		List<OLATResource> groupResources = new ArrayList<OLATResource>();
 		Map<Long,BusinessGroup> keyToGroupMap = new HashMap<Long,BusinessGroup>();
diff --git a/src/main/java/org/olat/group/model/BusinessGroupShortImpl.java b/src/main/java/org/olat/group/model/BusinessGroupShortImpl.java
index 04961c36962..b1064064bf8 100644
--- a/src/main/java/org/olat/group/model/BusinessGroupShortImpl.java
+++ b/src/main/java/org/olat/group/model/BusinessGroupShortImpl.java
@@ -22,6 +22,7 @@ package org.olat.group.model;
 import org.olat.core.commons.persistence.PersistentObject;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupManagedFlag;
 import org.olat.group.BusinessGroupShort;
 
 /**
@@ -37,6 +38,7 @@ public class BusinessGroupShortImpl extends PersistentObject implements Business
 	private static final long serialVersionUID = -5404538852842562897L;
 	
 	private String name;
+	private String managedFlagsString;
 
 	public String getName() {
 		return name;
@@ -46,8 +48,14 @@ public class BusinessGroupShortImpl extends PersistentObject implements Business
 		this.name = name;
 	}
 	
-	
-	
+	public String getManagedFlagsString() {
+		return managedFlagsString;
+	}
+
+	public void setManagedFlagsString(String managedFlagsString) {
+		this.managedFlagsString = managedFlagsString;
+	}
+
 	@Override
 	public String getResourceableTypeName() {
 		return OresHelper.calculateTypeName(BusinessGroup.class);
@@ -58,6 +66,11 @@ public class BusinessGroupShortImpl extends PersistentObject implements Business
 		return getKey();
 	}
 
+	@Override
+	public BusinessGroupManagedFlag[] getManagedFlags() {
+		return BusinessGroupManagedFlag.toEnum(managedFlagsString);
+	}
+
 	/**
 	 * Compares the keys.
 	 * @see java.lang.Object#equals(java.lang.Object)
diff --git a/src/main/java/org/olat/group/model/BusinessGroupViewImpl.hbm.xml b/src/main/java/org/olat/group/model/BusinessGroupViewImpl.hbm.xml
index a8a3287f287..007c3ac9d70 100644
--- a/src/main/java/org/olat/group/model/BusinessGroupViewImpl.hbm.xml
+++ b/src/main/java/org/olat/group/model/BusinessGroupViewImpl.hbm.xml
@@ -19,7 +19,8 @@
 		<property name="minParticipants" column="minparticipants" not-null="false"/>
 		<property name="maxParticipants" column="maxparticipants" not-null="false"/>
 		<property name="waitingListEnabled" type="boolean" column="waitinglist_enabled" unique="false" not-null="false"/>	
-		<property name="autoCloseRanksEnabled" type="boolean" column="autocloseranks_enabled" unique="false" not-null="false"/>	
+		<property name="autoCloseRanksEnabled" type="boolean" column="autocloseranks_enabled" unique="false" not-null="false"/>
+		<property name="managedFlagsString" column="managed_flags" unique="false" not-null="false" type="string"/>
 		<!--  statistics informations -->
   		<property name="numOfOwners" column="num_of_owners" type="long" />
   		<property name="numOfParticipants" column="num_of_participants" type="long" />
diff --git a/src/main/java/org/olat/group/model/BusinessGroupViewImpl.java b/src/main/java/org/olat/group/model/BusinessGroupViewImpl.java
index c70dfb0c2d1..4e0a27d9851 100644
--- a/src/main/java/org/olat/group/model/BusinessGroupViewImpl.java
+++ b/src/main/java/org/olat/group/model/BusinessGroupViewImpl.java
@@ -25,6 +25,7 @@ import org.olat.basesecurity.SecurityGroup;
 import org.olat.core.commons.persistence.PersistentObject;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupManagedFlag;
 import org.olat.group.BusinessGroupView;
 import org.olat.resource.OLATResource;
 
@@ -49,6 +50,7 @@ public class BusinessGroupViewImpl extends PersistentObject implements BusinessG
 	private Boolean waitingListEnabled;
 	private Boolean autoCloseRanksEnabled;
 	private Date lastModified;
+	private String managedFlagsString;
 
 	private long numOfOwners;
 	private long numOfParticipants;
@@ -176,6 +178,19 @@ public class BusinessGroupViewImpl extends PersistentObject implements BusinessG
 		this.lastUsage = lastUsage;
 	}
 
+	public String getManagedFlagsString() {
+		return managedFlagsString;
+	}
+
+	public void setManagedFlagsString(String managedFlagsString) {
+		this.managedFlagsString = managedFlagsString;
+	}
+
+	@Override
+	public BusinessGroupManagedFlag[] getManagedFlags() {
+		return BusinessGroupManagedFlag.toEnum(managedFlagsString);
+	}
+
 	@Override
 	public OLATResource getResource() {
 		return resource;
@@ -186,7 +201,6 @@ public class BusinessGroupViewImpl extends PersistentObject implements BusinessG
 		this.resource = resource;
 	}
 
-	@Override
 	public SecurityGroup getOwnerGroup() {
 		return ownerGroup;
 	}
@@ -195,7 +209,6 @@ public class BusinessGroupViewImpl extends PersistentObject implements BusinessG
 		this.ownerGroup = ownerGroup;
 	}
 
-	@Override
 	public SecurityGroup getPartipiciantGroup() {
 		return partipiciantGroup;
 	}
@@ -204,7 +217,6 @@ public class BusinessGroupViewImpl extends PersistentObject implements BusinessG
 		this.partipiciantGroup = partipiciantGroup;
 	}
 
-	@Override
 	public SecurityGroup getWaitingGroup() {
 		return waitingGroup;
 	}
diff --git a/src/main/java/org/olat/group/ui/BusinessGroupFormController.java b/src/main/java/org/olat/group/ui/BusinessGroupFormController.java
index 4638bbf55d1..3c94b636d63 100644
--- a/src/main/java/org/olat/group/ui/BusinessGroupFormController.java
+++ b/src/main/java/org/olat/group/ui/BusinessGroupFormController.java
@@ -34,6 +34,7 @@ import org.olat.core.gui.components.form.flexible.elements.TextElement;
 import org.olat.core.gui.components.form.flexible.impl.Form;
 import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
 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.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
@@ -41,6 +42,7 @@ import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.util.StringHelper;
 import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupManagedFlag;
 
 /**
  * Implements a Business group creation dialog using FlexiForms.
@@ -151,12 +153,14 @@ public class BusinessGroupFormController extends FormBasicController {
 			businessGroupName.setRegexMatchCheck(BusinessGroup.VALID_GROUPNAME_REGEXP, "create.form.error.illegalName");
 		}
 		businessGroupName.setMandatory(true);
+		businessGroupName.setEnabled(!BusinessGroupManagedFlag.isManaged(businessGroup, BusinessGroupManagedFlag.title));
 		
 		formLayout.setElementCssClass("o_sel_group_edit_group_form");
 
 		// Create the business group description input rich text element
 		businessGroupDescription = uifactory.addRichTextElementForStringDataMinimalistic("create.form.title.description",
 				"create.form.title.description", "", 10, -1, false, formLayout, ureq.getUserSession(), getWindowControl());
+		businessGroupDescription.setEnabled(!BusinessGroupManagedFlag.isManaged(businessGroup, BusinessGroupManagedFlag.description));
 
 		if(businessGroup != null && !bulkMode) {
 			// link to group direct jump in business path
@@ -195,6 +199,12 @@ public class BusinessGroupFormController extends FormBasicController {
 		businessGroupMaximumMembers.setVisible(true);
 		enableWaitingList.setVisible(true);
 		enableAutoCloseRanks.setVisible(true);
+		
+		boolean managedSettings = BusinessGroupManagedFlag.isManaged(businessGroup, BusinessGroupManagedFlag.settings);
+		businessGroupMinimumMembers.setEnabled(!managedSettings);
+		businessGroupMaximumMembers.setEnabled(!managedSettings);
+		enableWaitingList.setEnabled(!managedSettings);
+		enableAutoCloseRanks.setEnabled(!managedSettings);
 
 		if ((businessGroup != null) && (!bulkMode)) {
 			businessGroupName.setValue(businessGroup.getName());
@@ -215,13 +225,15 @@ public class BusinessGroupFormController extends FormBasicController {
 			// Create submit and cancel buttons
 			final FormLayoutContainer buttonLayout = FormLayoutContainer.createButtonLayout("buttonLayout", getTranslator());
 			formLayout.add(buttonLayout);
-			uifactory.addFormSubmitButton("finish", buttonLayout);
+			FormSubmit submit = uifactory.addFormSubmitButton("finish", buttonLayout);
+			submit.setEnabled(!BusinessGroupManagedFlag.isManaged(businessGroup, BusinessGroupManagedFlag.details));
 			uifactory.addFormCancelButton("cancel", buttonLayout, ureq, getWindowControl());
 		}
 	}
 	
 	public void setAllowWaitingList(boolean allowWaitingList) {
-		enableWaitingList.setEnabled(allowWaitingList);
+		boolean managed = BusinessGroupManagedFlag.isManaged(businessGroup, BusinessGroupManagedFlag.settings);
+		enableWaitingList.setEnabled(allowWaitingList && !managed);
 	}
 
 	/**
diff --git a/src/main/java/org/olat/group/ui/edit/BusinessGroupEditAccessController.java b/src/main/java/org/olat/group/ui/edit/BusinessGroupEditAccessController.java
index eb8e225bf8c..6785a564740 100644
--- a/src/main/java/org/olat/group/ui/edit/BusinessGroupEditAccessController.java
+++ b/src/main/java/org/olat/group/ui/edit/BusinessGroupEditAccessController.java
@@ -30,6 +30,7 @@ import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.util.Util;
 import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupManagedFlag;
 import org.olat.resource.OLATResource;
 import org.olat.resource.accesscontrol.AccessControlModule;
 import org.olat.resource.accesscontrol.ui.AccessConfigurationController;
@@ -46,17 +47,20 @@ import org.olat.resource.accesscontrol.ui.AccessConfigurationController;
 //fxdiff VCRP-1,2: access control of resources
 public class BusinessGroupEditAccessController extends FormBasicController {
 	
+	private final boolean managed;
 	private AccessConfigurationController configController;
 	
 	public BusinessGroupEditAccessController(UserRequest ureq, WindowControl wControl, BusinessGroup businessGroup) {
 		super(ureq, wControl, LAYOUT_VERTICAL);
 		setTranslator(Util.createPackageTranslator(AccessConfigurationController.class, getLocale(), getTranslator()));
+
+		managed = BusinessGroupManagedFlag.isManaged(businessGroup, BusinessGroupManagedFlag.bookings);
 		
 		AccessControlModule acModule = CoreSpringFactory.getImpl(AccessControlModule.class);
 		if(acModule.isEnabled()) {
 			OLATResource resource = businessGroup.getResource();
 			boolean waitingList = businessGroup.getWaitingListEnabled();
-			configController = new AccessConfigurationController(ureq, wControl, resource, businessGroup.getName(), !waitingList, mainForm);
+			configController = new AccessConfigurationController(ureq, wControl, resource, businessGroup.getName(), !waitingList, !managed, mainForm);
 			listenTo(configController);
 		}
 		
@@ -65,20 +69,25 @@ public class BusinessGroupEditAccessController extends FormBasicController {
 
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-		if(configController != null) {
-			formLayout.add(configController.getInitialFormItem());
-			uifactory.addSpacerElement("spacer1", formLayout, false);
-		}
-
 		setFormTitle("accesscontrol.title");
 		setFormDescription("accesscontrol_group.desc");
 		setFormContextHelp(AccessConfigurationController.class.getPackage().getName(), "accesscontrol_group.html", "chelp.accesscontrol_group.hover");
 
-		final FormLayoutContainer buttonGroupLayout = FormLayoutContainer.createButtonLayout("buttonLayout", getTranslator());
-		buttonGroupLayout.setRootForm(mainForm);
-		formLayout.add(buttonGroupLayout);
+		if(configController != null) {
+			formLayout.add(configController.getInitialFormItem());
+		}
+		
+		if(configController != null && !managed) {
+			uifactory.addSpacerElement("spacer1", formLayout, false);
+		}
 		
-		uifactory.addFormSubmitButton("save", formLayout);
+		if(!managed) {
+			final FormLayoutContainer buttonGroupLayout = FormLayoutContainer.createButtonLayout("buttonLayout", getTranslator());
+			buttonGroupLayout.setRootForm(mainForm);
+			formLayout.add(buttonGroupLayout);
+			
+			uifactory.addFormSubmitButton("save", formLayout);
+		}
 	}
 	
 	public void updateBusinessGroup(BusinessGroup businessGroup) {
diff --git a/src/main/java/org/olat/group/ui/edit/BusinessGroupEditResourceController.java b/src/main/java/org/olat/group/ui/edit/BusinessGroupEditResourceController.java
index 9aee7e3ad7f..b841d32d7dc 100644
--- a/src/main/java/org/olat/group/ui/edit/BusinessGroupEditResourceController.java
+++ b/src/main/java/org/olat/group/ui/edit/BusinessGroupEditResourceController.java
@@ -51,10 +51,13 @@ import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
 import org.olat.course.CourseModule;
 import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupManagedFlag;
 import org.olat.group.BusinessGroupService;
 import org.olat.repository.RepositoryEntry;
+import org.olat.repository.RepositoryEntryManagedFlag;
 import org.olat.repository.RepositoryTableModel;
 import org.olat.repository.controllers.ReferencableEntriesSearchController;
+import org.olat.repository.controllers.RepositoryEntryFilter;
 
 /**
  * Description:<BR>
@@ -80,6 +83,7 @@ public class BusinessGroupEditResourceController extends BasicController impleme
 	private Link addTabResourcesButton;
 
 	private BusinessGroup group;
+	private final boolean managed;
 	private final BusinessGroupService businessGroupService;
 
 	/**
@@ -93,6 +97,7 @@ public class BusinessGroupEditResourceController extends BasicController impleme
 		super(ureq, wControl);
 		businessGroupService = CoreSpringFactory.getImpl(BusinessGroupService.class);
 		this.group = group;
+		managed = BusinessGroupManagedFlag.isManaged(group, BusinessGroupManagedFlag.resources);
 		
 		Translator resourceTrans = Util.createPackageTranslator(RepositoryTableModel.class, getLocale(), getTranslator());
 		TableGuiConfiguration tableConfig = new TableGuiConfiguration();
@@ -103,11 +108,16 @@ public class BusinessGroupEditResourceController extends BasicController impleme
 		repoTableModel = new RepositoryTableModel(resourceTrans);
 		List<RepositoryEntry> repoTableModelEntries = businessGroupService.findRepositoryEntries(Collections.singletonList(group), 0, -1);
 		repoTableModel.setObjects(repoTableModelEntries);
-		repoTableModel.addColumnDescriptors(resourcesCtr, translate("resources.remove"), false);
+		
+		repoTableModel.addColumnDescriptors(resourcesCtr, null, false);	
+		if(!managed) {
+			resourcesCtr.addColumnDescriptor(new RemoveResourceActionColumnDescriptor("resources.remove", 1, getTranslator()));
+		}
 		resourcesCtr.setTableDataModel(repoTableModel);
 		
 		mainVC = createVelocityContainer("tab_bgResources");
 		addTabResourcesButton = LinkFactory.createButtonSmall("cmd.addresource", mainVC, this);
+		addTabResourcesButton.setVisible(!managed);
 		mainVC.put("resources", resourcesCtr.getInitialComponent());
 		putInitialPanel(mainVC);
 	}
@@ -122,7 +132,9 @@ public class BusinessGroupEditResourceController extends BasicController impleme
 			removeAsListenerAndDispose(repoSearchCtr);
 			removeAsListenerAndDispose(cmc);
 			
-			repoSearchCtr = new ReferencableEntriesSearchController(getWindowControl(), ureq, new String[]{ CourseModule.getCourseTypeName() },
+			RepositoryEntryFilter filter = new ManagedEntryfilter();
+			repoSearchCtr = new ReferencableEntriesSearchController(getWindowControl(), ureq,
+					new String[]{ CourseModule.getCourseTypeName() }, filter,
 					translate("resources.add"), true, true, true, true, true);
 			listenTo(repoSearchCtr);
 			cmc = new CloseableModalController(getWindowControl(), translate("close"), repoSearchCtr.getInitialComponent(), true, translate("resources.add.title"));
@@ -203,4 +215,12 @@ public class BusinessGroupEditResourceController extends BasicController impleme
 	protected void doDispose() {
 		//
 	}
+	
+	private static class ManagedEntryfilter implements RepositoryEntryFilter {
+
+		@Override
+		public boolean accept(RepositoryEntry re) {
+			return !RepositoryEntryManagedFlag.isManaged(re, RepositoryEntryManagedFlag.groups);
+		}
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/group/ui/edit/BusinessGroupMembersController.java b/src/main/java/org/olat/group/ui/edit/BusinessGroupMembersController.java
index 63b600599d9..cdd3071527f 100644
--- a/src/main/java/org/olat/group/ui/edit/BusinessGroupMembersController.java
+++ b/src/main/java/org/olat/group/ui/edit/BusinessGroupMembersController.java
@@ -43,6 +43,7 @@ import org.olat.core.util.mail.MailTemplate;
 import org.olat.course.member.wizard.ImportMember_1a_LoginListStep;
 import org.olat.course.member.wizard.ImportMember_1b_ChooseMemberStep;
 import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupManagedFlag;
 import org.olat.group.BusinessGroupService;
 import org.olat.group.GroupLoggingAction;
 import org.olat.group.model.BusinessGroupMembershipChange;
@@ -58,7 +59,7 @@ public class BusinessGroupMembersController extends BasicController {
 	
 	private final VelocityContainer mainVC;
 
-	private DisplayMemberSwitchForm dmsForm;
+	private final DisplayMemberSwitchForm dmsForm;
 	private MemberListController membersController;
 	private final Link importMemberLink, addMemberLink;
 	private StepsMainRunController importMembersWizard;
@@ -83,11 +84,13 @@ public class BusinessGroupMembersController extends BasicController {
 		// configure the form with checkboxes for owners and/or partips according
 		// the booleans
 		dmsForm = new DisplayMemberSwitchForm(ureq, getWindowControl(), true, true, hasWaitingList);
+		dmsForm.setEnabled(!BusinessGroupManagedFlag.isManaged(businessGroup, BusinessGroupManagedFlag.display));
 		listenTo(dmsForm);
 		// set if the checkboxes are checked or not.
 		dmsForm.setDisplayMembers(displayMembers);
 		mainVC.put("displayMembers", dmsForm.getInitialComponent());
 		
+		boolean managed = BusinessGroupManagedFlag.isManaged(businessGroup, BusinessGroupManagedFlag.membersmanagement);
 		SearchMembersParams searchParams = new SearchMembersParams(false, false, false, true, true, true, true);
 		membersController = new MemberListController(ureq, getWindowControl(), businessGroup, searchParams);
 		listenTo(membersController);
@@ -98,9 +101,11 @@ public class BusinessGroupMembersController extends BasicController {
 		
 		addMemberLink = LinkFactory.createButton("add.member", mainVC, this);
 		addMemberLink.setElementCssClass("o_sel_group_add_member");
+		addMemberLink.setVisible(!managed);
 		mainVC.put("addMembers", addMemberLink);
 		importMemberLink = LinkFactory.createButton("import.member", mainVC, this);
 		importMemberLink.setElementCssClass("o_sel_group_import_members");
+		importMemberLink.setVisible(!managed);
 		mainVC.put("importMembers", importMemberLink);
 	}
 	
diff --git a/src/main/java/org/olat/group/ui/edit/DisplayMemberSwitchForm.java b/src/main/java/org/olat/group/ui/edit/DisplayMemberSwitchForm.java
index d5f77b3e39e..e2a210e8539 100644
--- a/src/main/java/org/olat/group/ui/edit/DisplayMemberSwitchForm.java
+++ b/src/main/java/org/olat/group/ui/edit/DisplayMemberSwitchForm.java
@@ -101,6 +101,16 @@ public class DisplayMemberSwitchForm extends FormBasicController {
 		showWaitingList.setVisible(b);
 		openWaitingList.setVisible(b);
 	}
+	
+	public void setEnabled(boolean enabled) {
+		showOwners.setEnabled(enabled);
+		showPartips.setEnabled(enabled);
+		showWaitingList.setEnabled(enabled);
+		openOwners.setEnabled(enabled);
+		openPartips.setEnabled(enabled);
+		openWaitingList.setEnabled(enabled);
+		downloadList.setEnabled(enabled);
+	}
 
 	@Override
 	protected void formOK(UserRequest ureq) {
diff --git a/src/main/java/org/olat/group/ui/edit/RemoveResourceActionColumnDescriptor.java b/src/main/java/org/olat/group/ui/edit/RemoveResourceActionColumnDescriptor.java
new file mode 100644
index 00000000000..eaf2850129a
--- /dev/null
+++ b/src/main/java/org/olat/group/ui/edit/RemoveResourceActionColumnDescriptor.java
@@ -0,0 +1,78 @@
+/**
+ * <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.group.ui.edit;
+
+import org.olat.core.gui.components.table.DefaultColumnDescriptor;
+import org.olat.core.gui.render.Renderer;
+import org.olat.core.gui.render.StringOutput;
+import org.olat.core.gui.translator.Translator;
+import org.olat.repository.RepositoryEntry;
+import org.olat.repository.RepositoryEntryManagedFlag;
+import org.olat.repository.RepositoryTableModel;
+
+/**
+ * The remove link appear only if the repository is not managed (flag groups)
+ * 
+ * Initial date: 12.07.2013<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class RemoveResourceActionColumnDescriptor extends DefaultColumnDescriptor {
+
+	private final Translator translator;
+	
+	public RemoveResourceActionColumnDescriptor(final String headerKey, final int dataColumn, final Translator translator) {
+		super(headerKey, dataColumn, null, translator.getLocale());
+		this.translator = translator;
+	}
+
+	@Override
+	public String getAction(int row) {
+		int sortedRow = table.getSortedRow(row);
+		
+		Object memberObj = table.getTableDataModel().getValueAt(sortedRow, getDataColumn());
+		if(memberObj instanceof RepositoryEntry) {
+			//owner, participant, or in waiting list can leave
+			RepositoryEntry item = (RepositoryEntry)memberObj;
+			boolean managed = RepositoryEntryManagedFlag.isManaged(item.getManagedFlags(), RepositoryEntryManagedFlag.groups);
+			if(managed) {
+				return null;
+			}
+		}
+		return RepositoryTableModel.TABLE_ACTION_SELECT_LINK;
+	}
+
+	@Override
+	public void renderValue(StringOutput sb, int row, Renderer renderer) {
+		int sortedRow = table.getSortedRow(row);
+		Object memberObj = table.getTableDataModel().getValueAt(sortedRow, getDataColumn());
+		
+		boolean managed = false;
+		if(memberObj instanceof RepositoryEntry) {
+			//owner, participant, or in waiting list can leave
+			RepositoryEntry item = (RepositoryEntry)memberObj;
+			managed = RepositoryEntryManagedFlag.isManaged(item.getManagedFlags(), RepositoryEntryManagedFlag.groups);
+		}
+		
+		if(!managed) {
+			sb.append(translator.translate(getHeaderKey()));
+		}
+	}
+}
diff --git a/src/main/java/org/olat/group/ui/edit/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/group/ui/edit/_i18n/LocalStrings_en.properties
index a2ac81c9449..aca6760e486 100644
--- a/src/main/java/org/olat/group/ui/edit/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/group/ui/edit/_i18n/LocalStrings_en.properties
@@ -110,7 +110,7 @@ resource.remove=Do you really want to remove the group "{0}" from course "{1}"?
 resources.add=Link course
 resources.add.title=Select course
 resources.noresources=This group is not used in any courses. Choose "Add course" to link the course to this group.
-resources.remove=remove
+resources.remove=Remove
 table.header.edit=$org.olat.group.ui.main\:table.header.edit
 table.header.firstName=$org.olat.group.ui.main\:table.header.firstName
 table.header.firstTime=$org.olat.group.ui.main\:table.header.firstTime
@@ -119,7 +119,7 @@ table.header.graduate=$org.olat.group.ui.main\:table.header.graduate
 table.header.groups=$org.olat.group.ui.main\:table.header.groups
 table.header.lastName=$org.olat.group.ui.main\:table.header.lastName
 table.header.lastTime=$org.olat.group.ui.main\:table.header.lastTime
-table.header.login=org.olat.group.ui.main\:table.header.login
+table.header.login=$org.olat.group.ui.main\:table.header.login
 table.header.mail=$org.olat.group.ui.main\:table.header.mail
 table.header.participants=$org.olat.group.ui.main\:table.header.participants
 table.header.participantsCount=$org.olat.group.ui.main\:table.header.participantsCount
diff --git a/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java b/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java
index 0c463373a9f..c735740a214 100644
--- a/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java
+++ b/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java
@@ -24,6 +24,7 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -151,9 +152,16 @@ public abstract class AbstractBusinessGroupListController extends BasicControlle
 	protected final BusinessGroupService businessGroupService;
 	protected final CollaborationToolsFactory collaborationTools;
 	
+	private BusinessGroupViewFilter filter;
+	private Object userObject;
+	
 	public AbstractBusinessGroupListController(UserRequest ureq, WindowControl wControl, String page) {
+		this(ureq, wControl, page, null);
+	}
+	
+	public AbstractBusinessGroupListController(UserRequest ureq, WindowControl wControl, String page, Object userObject) {
 		super(ureq, wControl, Util.createPackageTranslator(AbstractBusinessGroupListController.class, ureq.getLocale()));
-		
+
 		admin = ureq.getUserSession().getRoles().isOLATAdmin() || ureq.getUserSession().getRoles().isGroupManager();
 		businessGroupService = CoreSpringFactory.getImpl(BusinessGroupService.class);
 		areaManager = CoreSpringFactory.getImpl(BGAreaManager.class);
@@ -164,6 +172,8 @@ public abstract class AbstractBusinessGroupListController extends BasicControlle
 		markManager = CoreSpringFactory.getImpl(MarkManager.class);
 		collaborationTools = CollaborationToolsFactory.getInstance();
 		
+		this.userObject = userObject;
+		
 		mainVC = createVelocityContainer(page);
 
 		//table
@@ -184,6 +194,18 @@ public abstract class AbstractBusinessGroupListController extends BasicControlle
 		putInitialPanel(mainVC);
 	}
 	
+	public Object getUserObject() {
+		return userObject;
+	}
+	
+	public BusinessGroupViewFilter getFilter() {
+		return filter;
+	}
+
+	public void setFilter(BusinessGroupViewFilter filter) {
+		this.filter = filter;
+	}
+
 	protected abstract void initButtons(UserRequest ureq);
 
 	protected void initButtons(UserRequest ureq, boolean create) {
@@ -781,6 +803,14 @@ public abstract class AbstractBusinessGroupListController extends BasicControlle
 			groups = new ArrayList<BusinessGroupView>();
 		} else {
 			groups = businessGroupService.findBusinessGroupViews(params, getResource(), 0, -1);
+			
+			if(filter != null) {
+				for(Iterator<BusinessGroupView> groupIt=groups.iterator(); groupIt.hasNext(); ) {
+					if(!filter.accept(groupIt.next())) {
+						groupIt.remove();
+					}
+				}
+			}
 		}
 		return groups;
 	}
diff --git a/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java b/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java
index 972d493216e..e13baf63e62 100644
--- a/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java
+++ b/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java
@@ -67,6 +67,7 @@ import org.olat.core.util.mail.MailPackage;
 import org.olat.core.util.session.UserSessionManager;
 import org.olat.course.member.MemberListController;
 import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupManagedFlag;
 import org.olat.group.BusinessGroupMembership;
 import org.olat.group.BusinessGroupModule;
 import org.olat.group.BusinessGroupService;
@@ -80,6 +81,7 @@ import org.olat.instantMessaging.model.Buddy;
 import org.olat.instantMessaging.model.Presence;
 import org.olat.modules.co.ContactFormController;
 import org.olat.repository.RepositoryEntry;
+import org.olat.repository.RepositoryEntryManagedFlag;
 import org.olat.repository.RepositoryManager;
 import org.olat.repository.model.RepositoryEntryMembership;
 import org.olat.repository.model.RepositoryEntryPermissionChangeEvent;
@@ -119,6 +121,7 @@ public abstract class AbstractMemberListController extends BasicController imple
 	private final boolean isLastVisitVisible;
 	private final boolean isAdministrativeUser;
 	private final boolean chatEnabled;
+	private final boolean globallyManaged;
 	
 	private final UserManager userManager;
 	
@@ -135,15 +138,18 @@ public abstract class AbstractMemberListController extends BasicController imple
 	private final GroupMemberViewComparator memberViewComparator;
 	private static final CourseMembershipComparator MEMBERSHIP_COMPARATOR = new CourseMembershipComparator();
 	
-	public AbstractMemberListController(UserRequest ureq, WindowControl wControl, RepositoryEntry repoEntry, String page) {
+	public AbstractMemberListController(UserRequest ureq, WindowControl wControl, RepositoryEntry repoEntry,
+			String page) {
 		this(ureq, wControl, repoEntry, null, page);
 	}
 	
-	public AbstractMemberListController(UserRequest ureq, WindowControl wControl, BusinessGroup group, String page) {
+	public AbstractMemberListController(UserRequest ureq, WindowControl wControl, BusinessGroup group,
+			String page) {
 		this(ureq, wControl, null, group, page);
 	}
 	
-	private AbstractMemberListController(UserRequest ureq, WindowControl wControl, RepositoryEntry repoEntry, BusinessGroup group, String page) {
+	private AbstractMemberListController(UserRequest ureq, WindowControl wControl, RepositoryEntry repoEntry, BusinessGroup group,
+			String page) {
 		super(ureq, wControl, Util.createPackageTranslator(UserPropertyHandler.class, ureq.getLocale()));
 		
 		this.businessGroup = group;
@@ -160,6 +166,8 @@ public abstract class AbstractMemberListController extends BasicController imple
 		imService = CoreSpringFactory.getImpl(InstantMessagingService.class);
 		sessionManager = CoreSpringFactory.getImpl(UserSessionManager.class);
 		memberViewComparator = new GroupMemberViewComparator(Collator.getInstance(getLocale()));
+
+		globallyManaged = calcGloballyManaged();
 		
 		Roles roles = ureq.getUserSession().getRoles();
 		chatEnabled = imModule.isEnabled() && imModule.isPrivateEnabled();
@@ -180,15 +188,36 @@ public abstract class AbstractMemberListController extends BasicController imple
 		MemberListTableModel memberListModel = new MemberListTableModel(userPropertyHandlers);
 		memberListCtr.setTableDataModel(memberListModel);
 		memberListCtr.setMultiSelect(true);
-		memberListCtr.addMultiSelectAction("table.header.edit", TABLE_ACTION_EDIT);
+		if(!globallyManaged) {
+			memberListCtr.addMultiSelectAction("table.header.edit", TABLE_ACTION_EDIT);
+		}
 		memberListCtr.addMultiSelectAction("table.header.mail", TABLE_ACTION_MAIL);
-		memberListCtr.addMultiSelectAction("table.header.remove", TABLE_ACTION_REMOVE);
+		if(!globallyManaged) {
+			memberListCtr.addMultiSelectAction("table.header.remove", TABLE_ACTION_REMOVE);
+		}
 
 		mainVC.put("memberList", memberListCtr.getInitialComponent());
 		
 		putInitialPanel(mainVC);
 	}
 	
+	private boolean calcGloballyManaged() {
+		boolean managed = true;
+		if(businessGroup != null) {
+			managed &= BusinessGroupManagedFlag.isManaged(businessGroup, BusinessGroupManagedFlag.membersmanagement);
+		}
+		if(repoEntry != null) {
+			boolean managedEntry = RepositoryEntryManagedFlag.isManaged(repoEntry, RepositoryEntryManagedFlag.membersmanagement);
+			managed &= managedEntry;
+			
+			List<BusinessGroup> groups = businessGroupService.findBusinessGroups(null, repoEntry.getOlatResource(), 0, -1);
+			for(BusinessGroup group:groups) {
+				managed &= BusinessGroupManagedFlag.isManaged(group, BusinessGroupManagedFlag.membersmanagement);
+			}
+		}
+		return managed;
+	}
+	
 	@Override
 	protected void doDispose() {
 		//
@@ -244,7 +273,9 @@ public abstract class AbstractMemberListController extends BasicController imple
 		
 		memberListCtr.addColumnDescriptor(new GraduateColumnDescriptor("table.header.graduate", TABLE_ACTION_GRADUATE, getTranslator()));
 		memberListCtr.addColumnDescriptor(new StaticColumnDescriptor(TABLE_ACTION_EDIT, "table.header.edit", translate("table.header.edit")));
-		memberListCtr.addColumnDescriptor(new StaticColumnDescriptor(TABLE_ACTION_REMOVE, "table.header.remove", translate("table.header.remove")));
+		if(!globallyManaged) {
+			memberListCtr.addColumnDescriptor(new LeaveColumnDescriptor("table.header.remove", TABLE_ACTION_REMOVE, getTranslator()));
+		}
 	}
 
 	@Override
@@ -510,6 +541,8 @@ public abstract class AbstractMemberListController extends BasicController imple
 
 	protected List<MemberView> updateTableModel(SearchMembersParams params) {
 		//course membership
+		boolean managedMembersRepo = 
+				RepositoryEntryManagedFlag.isManaged(repoEntry, RepositoryEntryManagedFlag.membersmanagement);
 		List<RepositoryEntryMembership> repoMemberships =
 				repoEntry == null ? Collections.<RepositoryEntryMembership>emptyList()
 				: repositoryManager.getRepositoryEntryMembership(repoEntry);
@@ -634,6 +667,7 @@ public abstract class AbstractMemberListController extends BasicController imple
 			if(memberView != null) {
 				memberView.setFirstTime(membership.getCreationDate());
 				memberView.setLastTime(membership.getLastModified());
+				memberView.getMembership().setManagedMembersRepo(managedMembersRepo);
 				if(membership.getOwnerRepoKey() != null) {
 					memberView.getMembership().setRepoOwner(true);
 				}
diff --git a/src/main/java/org/olat/group/ui/main/BGTableItem.java b/src/main/java/org/olat/group/ui/main/BGTableItem.java
index d54bd3a96fd..2d6ad869aaa 100644
--- a/src/main/java/org/olat/group/ui/main/BGTableItem.java
+++ b/src/main/java/org/olat/group/ui/main/BGTableItem.java
@@ -24,6 +24,7 @@ import java.util.Date;
 import java.util.List;
 
 import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupManagedFlag;
 import org.olat.group.BusinessGroupMembership;
 import org.olat.group.BusinessGroupShort;
 import org.olat.group.BusinessGroupView;
@@ -110,6 +111,10 @@ public class BGTableItem {
 		return businessGroup.isAutoCloseRanksEnabled();
 	}
 	
+	public BusinessGroupManagedFlag[] getManagedFlags() {
+		return businessGroup.getManagedFlags();
+	}
+	
 	public boolean isFull() {
 		Integer maxParticipants = businessGroup.getMaxParticipants();
 		if(maxParticipants == null || maxParticipants.intValue() <= 0) {
@@ -208,6 +213,7 @@ public class BGTableItem {
 		private long numOfPendings;
 		private final boolean waitingListEnabled;
 		private final boolean autoCloseRanksEnabled;
+		private final BusinessGroupManagedFlag[] managedflags;
 		
 		public BGShort(BusinessGroup group) {
 			key = group.getKey();
@@ -215,6 +221,7 @@ public class BGTableItem {
 			maxParticipants = group.getMaxParticipants();
 			waitingListEnabled = group.getWaitingListEnabled() == null ? false : group.getWaitingListEnabled().booleanValue();
 			autoCloseRanksEnabled = group.getAutoCloseRanksEnabled() == null ? false : group.getAutoCloseRanksEnabled().booleanValue();
+			managedflags = group.getManagedFlags();
 		}
 		
 		public BGShort(BusinessGroupView group) {
@@ -227,6 +234,7 @@ public class BGTableItem {
 			numOfPendings = group.getNumOfPendings();
 			waitingListEnabled = group.getWaitingListEnabled() == null ? false : group.getWaitingListEnabled().booleanValue();
 			autoCloseRanksEnabled = group.getAutoCloseRanksEnabled() == null ? false : group.getAutoCloseRanksEnabled().booleanValue();
+			managedflags = group.getManagedFlags();
 		}
 
 		@Override
@@ -277,6 +285,11 @@ public class BGTableItem {
 			return autoCloseRanksEnabled;
 		}
 
+		@Override
+		public BusinessGroupManagedFlag[] getManagedFlags() {
+			return managedflags;
+		}
+
 		@Override
 		public int hashCode() {
 			return key.hashCode();
diff --git a/src/main/java/org/olat/group/ui/main/BusinessGroupTableModelWithType.java b/src/main/java/org/olat/group/ui/main/BusinessGroupTableModelWithType.java
index 56f3e500991..1624285e887 100644
--- a/src/main/java/org/olat/group/ui/main/BusinessGroupTableModelWithType.java
+++ b/src/main/java/org/olat/group/ui/main/BusinessGroupTableModelWithType.java
@@ -34,6 +34,7 @@ import org.olat.core.gui.components.table.DefaultTableDataModel;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Formatter;
 import org.olat.core.util.filter.FilterFactory;
+import org.olat.group.BusinessGroupManagedFlag;
 import org.olat.group.BusinessGroupMembership;
 
 /**
@@ -74,10 +75,26 @@ public class BusinessGroupTableModelWithType extends DefaultTableDataModel<BGTab
 				description = FilterFactory.getHtmlTagsFilter().filter(description);
 				description = Formatter.truncate(description, 256);
 				return description;
-			case allowLeave:
-				return wrapped.getAllowLeave();
-			case allowDelete:
-				return wrapped.getAllowDelete();
+			case allowLeave: {
+				Boolean allowed = wrapped.getAllowLeave();
+				if(allowed != null && allowed.booleanValue()) {
+					//check managed groups
+					if(BusinessGroupManagedFlag.isManaged(wrapped.getManagedFlags(), BusinessGroupManagedFlag.membersmanagement)) {
+						return Boolean.FALSE;
+					}
+				}
+				return allowed;
+			}
+			case allowDelete: {
+				Boolean allowed =  wrapped.getAllowDelete();
+				if(allowed != null && allowed.booleanValue()) {
+					//check managed groups
+					if(BusinessGroupManagedFlag.isManaged(wrapped.getManagedFlags(), BusinessGroupManagedFlag.delete)) {
+						return Boolean.FALSE;
+					}
+				}
+				return allowed;
+			}
 			case resources:
 				return wrapped;
 			//fxdiff VCRP-1,2: access control of resources
diff --git a/src/main/java/org/olat/group/ui/main/BusinessGroupViewFilter.java b/src/main/java/org/olat/group/ui/main/BusinessGroupViewFilter.java
new file mode 100644
index 00000000000..1213ec37a91
--- /dev/null
+++ b/src/main/java/org/olat/group/ui/main/BusinessGroupViewFilter.java
@@ -0,0 +1,34 @@
+/**
+ * <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.group.ui.main;
+
+import org.olat.group.BusinessGroupView;
+
+/**
+ * 
+ * Initial date: 10.07.2013<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public interface BusinessGroupViewFilter {
+	
+	public boolean accept(BusinessGroupView view);
+
+}
diff --git a/src/main/java/org/olat/group/ui/main/CourseMembership.java b/src/main/java/org/olat/group/ui/main/CourseMembership.java
index 66f1c543ee7..926e0ed192e 100644
--- a/src/main/java/org/olat/group/ui/main/CourseMembership.java
+++ b/src/main/java/org/olat/group/ui/main/CourseMembership.java
@@ -32,6 +32,7 @@ public class CourseMembership {
 	private boolean groupParticipant;
 	private boolean groupWaiting;
 	private boolean pending;
+	private boolean managedMembersRepo;
 	
 	public CourseMembership() {
 		//
@@ -61,6 +62,14 @@ public class CourseMembership {
 		this.pending = pending;
 	}
 
+	public boolean isManagedMembersRepo() {
+		return managedMembersRepo;
+	}
+
+	public void setManagedMembersRepo(boolean managedMembersRepo) {
+		this.managedMembersRepo = managedMembersRepo;
+	}
+
 	public boolean isRepoOwner() {
 		return repoOwner;
 	}
diff --git a/src/main/java/org/olat/group/ui/main/EditMembershipController.java b/src/main/java/org/olat/group/ui/main/EditMembershipController.java
index ba584a93c33..10f9d7ab167 100644
--- a/src/main/java/org/olat/group/ui/main/EditMembershipController.java
+++ b/src/main/java/org/olat/group/ui/main/EditMembershipController.java
@@ -47,12 +47,14 @@ import org.olat.course.member.PermissionHelper;
 import org.olat.course.member.PermissionHelper.BGPermission;
 import org.olat.course.member.PermissionHelper.RepoPermission;
 import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupManagedFlag;
 import org.olat.group.BusinessGroupMembership;
 import org.olat.group.BusinessGroupService;
 import org.olat.group.BusinessGroupView;
 import org.olat.group.model.BusinessGroupMembershipChange;
 import org.olat.group.model.SearchBusinessGroupParams;
 import org.olat.repository.RepositoryEntry;
+import org.olat.repository.RepositoryEntryManagedFlag;
 import org.olat.repository.RepositoryManager;
 import org.olat.repository.model.RepositoryEntryMembership;
 import org.olat.resource.OLATResource;
@@ -168,11 +170,12 @@ public class EditMembershipController extends FormBasicController {
 				Collections.<BusinessGroupMembership>emptyList() : businessGroupService.getBusinessGroupMembership(businessGroupKeys, member);
 		List<MemberOption> options = new ArrayList<MemberOption>();
 		for(BusinessGroupView group:groups) {
+			boolean managed = BusinessGroupManagedFlag.isManaged(group.getManagedFlags(), BusinessGroupManagedFlag.membersmanagement);
 			MemberOption option = new MemberOption(group);
 			BGPermission bgPermission = PermissionHelper.getPermission(group.getKey(), member, groupMemberships);
-			option.setTutor(createSelection(bgPermission.isTutor(), true));
-			option.setParticipant(createSelection(bgPermission.isParticipant(), true));
-			boolean waitingListEnable = group.getWaitingListEnabled() != null && group.getWaitingListEnabled().booleanValue();
+			option.setTutor(createSelection(bgPermission.isTutor(), !managed));
+			option.setParticipant(createSelection(bgPermission.isParticipant(), !managed));
+			boolean waitingListEnable = !managed && group.getWaitingListEnabled() != null && group.getWaitingListEnabled().booleanValue();
 			option.setWaiting(createSelection(bgPermission.isWaitingList(), waitingListEnable));
 			options.add(option);
 		}
@@ -204,7 +207,9 @@ public class EditMembershipController extends FormBasicController {
 			String[] repoValues = new String[] {
 					translate("role.repo.owner"), translate("role.repo.tutor"), translate("role.repo.participant")
 			};
+			boolean managed = RepositoryEntryManagedFlag.isManaged(repoEntry, RepositoryEntryManagedFlag.membersmanagement);
 			repoRightsEl = uifactory.addCheckboxesVertical("repoRights", formLayout, repoRightsKeys, repoValues, null, 1);
+			repoRightsEl.setEnabled(!managed);
 			if(member != null) {
 				RepoPermission repoPermission = PermissionHelper.getPermission(repoEntry, member, memberships);
 				repoRightsEl.select("owner", repoPermission.isOwner());
diff --git a/src/main/java/org/olat/group/ui/main/LeaveColumnDescriptor.java b/src/main/java/org/olat/group/ui/main/LeaveColumnDescriptor.java
new file mode 100644
index 00000000000..e3507315c63
--- /dev/null
+++ b/src/main/java/org/olat/group/ui/main/LeaveColumnDescriptor.java
@@ -0,0 +1,63 @@
+/**
+ * <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.group.ui.main;
+
+import org.olat.core.gui.components.table.DefaultColumnDescriptor;
+import org.olat.core.gui.render.Renderer;
+import org.olat.core.gui.render.StringOutput;
+import org.olat.core.gui.translator.Translator;
+
+/**
+ * 
+ * Check the managed flags to present the link or not.
+ * 
+ * Initial date: 10.07.2013<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class LeaveColumnDescriptor extends DefaultColumnDescriptor {
+	
+	private final Translator translator;
+	
+	public LeaveColumnDescriptor(String headerKey, String action,  Translator translator) {
+		super(headerKey, 1, action, translator.getLocale());
+		this.translator = translator;
+	}
+
+	@Override
+	public String getAction(int row) {
+		int sortedRow = table.getSortedRow(row);
+		MemberView membership = (MemberView)table.getTableDataModel()
+				.getValueAt(sortedRow, MemberListTableModel.Cols.groups.ordinal());
+		
+		return membership.isFullyManaged() ? null : super.getAction(row);
+	}
+
+	@Override
+	public void renderValue(StringOutput sb, int row, Renderer renderer) {
+		int sortedRow = table.getSortedRow(row);
+		MemberView membership = (MemberView)table.getTableDataModel()
+				.getValueAt(sortedRow, MemberListTableModel.Cols.groups.ordinal());
+		
+		if(!membership.isFullyManaged()) {
+			sb.append(translator.translate(getHeaderKey()));
+		}
+	}
+}
diff --git a/src/main/java/org/olat/group/ui/main/MemberView.java b/src/main/java/org/olat/group/ui/main/MemberView.java
index 655412eb16e..7f129051640 100644
--- a/src/main/java/org/olat/group/ui/main/MemberView.java
+++ b/src/main/java/org/olat/group/ui/main/MemberView.java
@@ -24,6 +24,7 @@ import java.util.Date;
 import java.util.List;
 
 import org.olat.core.id.Identity;
+import org.olat.group.BusinessGroupManagedFlag;
 import org.olat.group.BusinessGroupShort;
 
 /**
@@ -79,6 +80,22 @@ public class MemberView {
 		groups.add(group);
 	}
 	
+	public boolean isFullyManaged() {
+		if(membership != null && !membership.isManagedMembersRepo() &&
+				(membership.isRepoOwner() || membership.isRepoTutor() || membership.isRepoParticipant())) {
+			return false;
+		}
+
+		if(groups != null) {
+			for(BusinessGroupShort group:groups) {
+				if(!BusinessGroupManagedFlag.isManaged(group.getManagedFlags(), BusinessGroupManagedFlag.membersmanagement)) {
+					return false;
+				}
+			}
+		}
+		return true;
+	}
+	
 	public Date getFirstTime() {
 		return firstTime;
 	}
diff --git a/src/main/java/org/olat/group/ui/main/SelectBusinessGroupController.java b/src/main/java/org/olat/group/ui/main/SelectBusinessGroupController.java
index 262e3a43e0b..40cb53717d4 100644
--- a/src/main/java/org/olat/group/ui/main/SelectBusinessGroupController.java
+++ b/src/main/java/org/olat/group/ui/main/SelectBusinessGroupController.java
@@ -62,9 +62,15 @@ public class SelectBusinessGroupController extends BasicController {
 	
 	private final boolean enableCreate;
 	private Object userObject;
-	
+	private final BusinessGroupViewFilter filter;
+
 	public SelectBusinessGroupController(UserRequest ureq, WindowControl wControl) {
+		this(ureq, wControl, null);
+	}
+	
+	public SelectBusinessGroupController(UserRequest ureq, WindowControl wControl, BusinessGroupViewFilter filter) {
 		super(ureq, wControl);
+		this.filter = filter;
 		enableCreate = CoreSpringFactory.getImpl(BusinessGroupModule.class)
 				.isAllowedCreate(ureq.getUserSession().getRoles());
 		mainVC = createVelocityContainer("group_list_overview");
@@ -74,7 +80,7 @@ public class SelectBusinessGroupController extends BasicController {
 			mainVC.put("create", createGroup);
 		}
 		
-		boolean marked = updateMarkedGroups(ureq).updateMarkedGroups();
+		boolean marked = updateMarkedGroups(ureq);
 		if(!marked) {
 			updateOwnedGroups(ureq);
 		}
@@ -177,53 +183,54 @@ public class SelectBusinessGroupController extends BasicController {
 		listenTo(cmc);
 	}
 
-	private SelectFavoritBusinessGroupController updateMarkedGroups(UserRequest ureq) {
+	private boolean updateMarkedGroups(UserRequest ureq) {
 		if(favoritGroupsCtrl == null) {
 			favoritGroupsCtrl = new SelectFavoritBusinessGroupController(ureq, getWindowControl());
+			favoritGroupsCtrl.setFilter(filter);
 			listenTo(favoritGroupsCtrl);
 		}
-		favoritGroupsCtrl.updateMarkedGroups();
+		boolean markedFound = favoritGroupsCtrl.updateMarkedGroups();
 		mainVC.put("groupList", favoritGroupsCtrl.getInitialComponent());
-		return favoritGroupsCtrl;
+		return markedFound;
 	}
 	
-	private SelectOwnedBusinessGroupController updateOwnedGroups(UserRequest ureq) {
+	private void updateOwnedGroups(UserRequest ureq) {
 		if(ownedGroupsCtrl == null) {
 			ownedGroupsCtrl = new SelectOwnedBusinessGroupController(ureq, getWindowControl());
+			ownedGroupsCtrl.setFilter(filter);
 			listenTo(ownedGroupsCtrl);
 		}
 		ownedGroupsCtrl.updateOwnedGroups();
 		mainVC.put("groupList", ownedGroupsCtrl.getInitialComponent());
-		return ownedGroupsCtrl;
 	}
 	
-	private SelectBusinessGroupCourseAuthorController updateCourseGroups(UserRequest ureq) {
+	private void updateCourseGroups(UserRequest ureq) {
 		if(authorGroupsCtrL == null) {
 			authorGroupsCtrL = new SelectBusinessGroupCourseAuthorController(ureq, getWindowControl());
+			authorGroupsCtrL.setFilter(filter);
 			listenTo(authorGroupsCtrL);
 		}
 		authorGroupsCtrL.updateOwnedGroups();
 		mainVC.put("groupList", authorGroupsCtrL.getInitialComponent());
-		return authorGroupsCtrL;
 	}
 	
-	private SelectSearchBusinessGroupController updateSearch(UserRequest ureq) {
+	private void updateSearch(UserRequest ureq) {
 		if(searchGroupsCtrl == null) {
 			searchGroupsCtrl = new SelectSearchBusinessGroupController(ureq, getWindowControl(), true);
+			searchGroupsCtrl.setFilter(filter);
 			listenTo(searchGroupsCtrl);
 		}
 		searchGroupsCtrl.updateSearch(ureq);
 		mainVC.put("groupList", searchGroupsCtrl.getInitialComponent());
-		return searchGroupsCtrl;
 	}
 	
-	private SelectSearchBusinessGroupController updateAdminSearch(UserRequest ureq) {
+	private void updateAdminSearch(UserRequest ureq) {
 		if(searchAdminGroupsCtrl == null) {
 			searchAdminGroupsCtrl = new SelectSearchBusinessGroupController(ureq, getWindowControl(), false);
+			searchAdminGroupsCtrl.setFilter(filter);
 			listenTo(searchAdminGroupsCtrl);
 		}
 		searchAdminGroupsCtrl.updateSearch(ureq);
 		mainVC.put("groupList", searchAdminGroupsCtrl.getInitialComponent());
-		return searchAdminGroupsCtrl;
 	}
 }
diff --git a/src/main/java/org/olat/group/ui/main/UnmanagedGroupFilter.java b/src/main/java/org/olat/group/ui/main/UnmanagedGroupFilter.java
new file mode 100644
index 00000000000..ea6511e9a5b
--- /dev/null
+++ b/src/main/java/org/olat/group/ui/main/UnmanagedGroupFilter.java
@@ -0,0 +1,44 @@
+/**
+ * <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.group.ui.main;
+
+import org.olat.group.BusinessGroupManagedFlag;
+import org.olat.group.BusinessGroupView;
+
+/**
+ * Accept only NOT managed groups.
+ * 
+ * Initial date: 10.07.2013<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class UnmanagedGroupFilter implements BusinessGroupViewFilter {
+	
+	private final BusinessGroupManagedFlag flag;
+	
+	public UnmanagedGroupFilter(BusinessGroupManagedFlag flag) {
+		this.flag = flag;
+	}
+
+	@Override
+	public boolean accept(BusinessGroupView view) {
+		return !BusinessGroupManagedFlag.isManaged(view.getManagedFlags(), flag);
+	}
+}
diff --git a/src/main/java/org/olat/group/ui/wizard/BGCopyBusinessGroup.java b/src/main/java/org/olat/group/ui/wizard/BGCopyBusinessGroup.java
index 16387c2cec3..8ddc5a48e5a 100644
--- a/src/main/java/org/olat/group/ui/wizard/BGCopyBusinessGroup.java
+++ b/src/main/java/org/olat/group/ui/wizard/BGCopyBusinessGroup.java
@@ -20,6 +20,7 @@
 package org.olat.group.ui.wizard;
 
 import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupManagedFlag;
 import org.olat.group.BusinessGroupShort;
 
 /**
@@ -68,6 +69,11 @@ public class BGCopyBusinessGroup implements BusinessGroupShort {
 		this.name = name;
 	}
 	
+	@Override
+	public BusinessGroupManagedFlag[] getManagedFlags() {
+		return BusinessGroupManagedFlag.EMPTY_ARRAY;
+	}
+
 	public String getDescription() {
 		return description;
 	}
diff --git a/src/main/java/org/olat/repository/PropPupForm.java b/src/main/java/org/olat/repository/PropPupForm.java
index 72585faf035..0fe468b067c 100644
--- a/src/main/java/org/olat/repository/PropPupForm.java
+++ b/src/main/java/org/olat/repository/PropPupForm.java
@@ -180,18 +180,24 @@ public class PropPupForm extends FormBasicController {
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		
+		final boolean managedSettings = RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.settings);
+		
 		canCopy = uifactory.addCheckboxesVertical("cif_canCopy", "cif.canCopy", formLayout, new String[]{"xx"}, new String[]{null}, null, 1);
 		canCopy.select("xx", entry.getCanCopy());
+		canCopy.setEnabled(!managedSettings);
 		
 		canReference = uifactory.addCheckboxesVertical("cif_canReference", "cif.canReference", formLayout, new String[]{"xx"}, new String[]{null}, null, 1);
 		canReference.select("xx", entry.getCanReference());
+		canReference.setEnabled(!managedSettings);
 		
 		canLaunch = uifactory.addCheckboxesVertical("cif_canLaunch", "cif.canLaunch", formLayout, new String[]{"xx"}, new String[]{null}, null, 1);
 		canLaunch.select("xx", entry.getCanLaunch());
+		canLaunch.setEnabled(!managedSettings);
 		canLaunch.setVisible(handler != null && handler.supportsLaunch(this.entry));
 		
 		canDownload = uifactory.addCheckboxesVertical("cif_canDownload", "cif.canDownload", formLayout, new String[]{"xx"}, new String[]{null}, null, 1);
 		canDownload.select("xx", entry.getCanDownload());
+		canLaunch.setEnabled(!managedSettings);
 		canDownload.setVisible(handler != null && handler.supportsDownload(this.entry));
 			
 		access = uifactory.addRadiosVertical("cif_access", "cif.access", formLayout, keys, values);
@@ -202,8 +208,12 @@ public class PropPupForm extends FormBasicController {
 		} else {
 			access.select(Integer.toString(entry.getAccess()), true);
 		}
+		final boolean managedAccess = RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.access);
+		access.setEnabled(!managedAccess);
 	
-		uifactory.addFormSubmitButton("submit", formLayout);
+		if(!managedAccess || !managedSettings) {
+			uifactory.addFormSubmitButton("submit", formLayout);
+		}
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/repository/RepositoryEntry.hbm.xml b/src/main/java/org/olat/repository/RepositoryEntry.hbm.xml
index cb6af134f2b..949f0562f4a 100644
--- a/src/main/java/org/olat/repository/RepositoryEntry.hbm.xml
+++ b/src/main/java/org/olat/repository/RepositoryEntry.hbm.xml
@@ -29,7 +29,7 @@
 		
 		<property name="externalId" column="external_id" unique="false" not-null="false" type="string"/>
 		<property name="externalRef" column="external_ref" unique="false" not-null="false" type="string"/>
-		<property name="managedFlags" column="managed_flags" unique="false" not-null="false" type="string"/>
+		<property name="managedFlagsString" column="managed_flags" unique="false" not-null="false" type="string"/>
 
 		<many-to-one name="olatResource"
                      column="fk_olatresource"
diff --git a/src/main/java/org/olat/repository/RepositoryEntry.java b/src/main/java/org/olat/repository/RepositoryEntry.java
index a8dee8b6813..47c9f0bd52b 100644
--- a/src/main/java/org/olat/repository/RepositoryEntry.java
+++ b/src/main/java/org/olat/repository/RepositoryEntry.java
@@ -79,7 +79,7 @@ public class RepositoryEntry extends PersistentObject implements ModifiedInfo, O
 	
 	private String externalId;
 	private String externalRef;
-	private String managedFlags;
+	private String managedFlagsString;
 	private RepositoryEntryLifecycle lifecycle;
 	
 	private int access;
@@ -410,12 +410,17 @@ public class RepositoryEntry extends PersistentObject implements ModifiedInfo, O
 		this.externalRef = externalRef;
 	}
 
-	public String getManagedFlags() {
-		return managedFlags;
+	public RepositoryEntryManagedFlag[] getManagedFlags() {
+		return RepositoryEntryManagedFlag.toEnum(managedFlagsString);
 	}
 
-	public void setManagedFlags(String managedFlags) {
-		this.managedFlags = managedFlags;
+
+	public String getManagedFlagsString() {
+		return managedFlagsString;
+	}
+
+	public void setManagedFlagsString(String managedFlagsString) {
+		this.managedFlagsString = managedFlagsString;
 	}
 
 	public RepositoryEntryLifecycle getLifecycle() {
diff --git a/src/main/java/org/olat/repository/RepositoryEntryManagedFlag.java b/src/main/java/org/olat/repository/RepositoryEntryManagedFlag.java
new file mode 100644
index 00000000000..5245bfecf6f
--- /dev/null
+++ b/src/main/java/org/olat/repository/RepositoryEntryManagedFlag.java
@@ -0,0 +1,131 @@
+/**
+ * <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;
+
+import java.util.Arrays;
+
+import org.olat.core.logging.OLog;
+import org.olat.core.logging.Tracing;
+import org.olat.core.util.StringHelper;
+
+/**
+ * 
+ * Initial date: 11.07.2013<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public enum RepositoryEntryManagedFlag {
+	
+	all,
+	  editcontent(all),
+    details(all),//details tab
+      title(details,all),
+      description(details,all),  
+    settings(all),//max num of participants...
+      access(settings,all),
+      chat(settings,all),
+      layout(settings,all),
+      resourcefolder(settings,all),
+      efficencystatement(settings,all),
+      calendar(settings,all),
+      glossary(settings,all), 
+    bookings(all),// change booking rules
+    membersmanagement(all),
+    groups(all),
+    close(all),
+    delete(all);
+	
+
+	private RepositoryEntryManagedFlag[] parents;
+	private static final OLog log = Tracing.createLoggerFor(RepositoryEntryManagedFlag.class);
+	public static final RepositoryEntryManagedFlag[] EMPTY_ARRAY = new RepositoryEntryManagedFlag[0];
+	
+	private RepositoryEntryManagedFlag() {
+		//
+	}
+	
+	private RepositoryEntryManagedFlag(RepositoryEntryManagedFlag... parents) {
+		if(parents == null) {
+			this.parents = new RepositoryEntryManagedFlag[0];
+		} else {
+			this.parents = parents;
+		}
+	}
+	
+	public static RepositoryEntryManagedFlag[] toEnum(String flags) {
+		if(StringHelper.containsNonWhitespace(flags)) {
+			String[] flagArr = flags.split(",");
+			RepositoryEntryManagedFlag[] flagEnums = new RepositoryEntryManagedFlag[flagArr.length];
+	
+			int count = 0;
+			for(String flag:flagArr) {
+				if(StringHelper.containsNonWhitespace(flag)) {
+					try {
+						RepositoryEntryManagedFlag flagEnum = valueOf(flag);
+						flagEnums[count++] = flagEnum;
+					} catch (Exception e) {
+						log.warn("Cannot parse this managed flag: " + flag, e);
+					}
+				}
+			}
+			
+			if(count != flagEnums.length) {
+				flagEnums = Arrays.copyOf(flagEnums, count);
+			}
+			return flagEnums;
+		} else {
+			return EMPTY_ARRAY;
+		}
+	}
+	
+	public static boolean isManaged(RepositoryEntry re, RepositoryEntryManagedFlag marker) {
+		if(re != null && (contains(re, marker) || contains(re, marker.parents))) {
+			return true;
+		}
+		return false;
+	}
+	
+	public static boolean isManaged(RepositoryEntryManagedFlag[] flags, RepositoryEntryManagedFlag marker) {
+		if(flags != null && (contains(flags, marker) || contains(flags, marker.parents))) {
+			return true;
+		}
+		return false;
+	}
+	
+	private static boolean contains(RepositoryEntry re, RepositoryEntryManagedFlag... markers) {
+		if(re == null) return false;
+		RepositoryEntryManagedFlag[] flags = re.getManagedFlags();
+		return contains(flags, markers);
+	}
+
+	private static boolean contains(RepositoryEntryManagedFlag[] flags, RepositoryEntryManagedFlag... markers) {
+		if(flags == null || flags.length == 0) return false;
+
+		for(RepositoryEntryManagedFlag flag:flags) {
+			for(RepositoryEntryManagedFlag marker:markers) {
+				if(flag.equals(marker)) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+}
diff --git a/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java b/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java
index 5972c341622..d561a53f783 100644
--- a/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java
+++ b/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java
@@ -102,16 +102,23 @@ public class ReferencableEntriesSearchController extends BasicController {
 	private final boolean canCreate;
 
 	public ReferencableEntriesSearchController(WindowControl wControl, UserRequest ureq, String limitType, String commandLabel) {
-		this(wControl, ureq, new String[]{limitType},commandLabel, true, true, true, false, false);
+		this(wControl, ureq, new String[]{limitType}, null, commandLabel, true, true, true, false, false);
 		setBasePackage(RepositoryManager.class);
 	}
 	
 	public ReferencableEntriesSearchController(WindowControl wControl, UserRequest ureq, String[] limitTypes, String commandLabel) {
-		this(wControl, ureq, limitTypes,commandLabel, true, true, true, false, false);
+		this(wControl, ureq, limitTypes, null, commandLabel, true, true, true, false, false);
 	}
-
+	
 	public ReferencableEntriesSearchController(WindowControl wControl, UserRequest ureq, String[] limitTypes, String commandLabel,
 			boolean canImport, boolean canCreate, boolean canDirectLaunch, boolean multiSelect, boolean adminSearch) {
+		this(wControl, ureq, limitTypes, null, commandLabel, canImport, canCreate, canDirectLaunch, multiSelect, adminSearch);
+	}
+
+	public ReferencableEntriesSearchController(WindowControl wControl, UserRequest ureq,
+			String[] limitTypes, RepositoryEntryFilter filter, String commandLabel,
+			boolean canImport, boolean canCreate, boolean canDirectLaunch, boolean multiSelect, boolean adminSearch) {
+
 		super(ureq, wControl);
 		this.canImport = canImport;
 		this.canCreate = canCreate;
@@ -124,7 +131,7 @@ public class ReferencableEntriesSearchController extends BasicController {
 		}
 
 		// add repo search controller
-		searchCtr = new RepositorySearchController(commandLabel, ureq, getWindowControl(), false, canDirectLaunch, multiSelect, limitTypes);
+		searchCtr = new RepositorySearchController(commandLabel, ureq, getWindowControl(), false, canDirectLaunch, multiSelect, limitTypes, filter);
 		listenTo(searchCtr);
 		
 		// do instantiate buttons
diff --git a/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java b/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java
index d4f03e6c2f4..b4493dad0fb 100644
--- a/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java
+++ b/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java
@@ -90,6 +90,7 @@ import org.olat.repository.DisplayCourseInfoForm;
 import org.olat.repository.DisplayInfoForm;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryIconRenderer;
+import org.olat.repository.RepositoryEntryManagedFlag;
 import org.olat.repository.RepositoryEntryStatus;
 import org.olat.repository.RepositoryManager;
 import org.olat.repository.handlers.CourseHandler;
@@ -497,7 +498,11 @@ public class RepositoryDetailsController extends BasicController implements Gene
 					detailsToolC.addLink(ACTION_ADD_CATALOG, translate("details.catadd"), TOOL_CATALOG, null, "o_sel_repo_add_to_catalog", false);
 					
 					detailsToolC.addHeader(translate("table.action"));
-					if ((OresHelper.isOfType(repositoryEntry.getOlatResource(), CourseModule.class)) && (!RepositoryManager.getInstance().createRepositoryEntryStatus(repositoryEntry.getStatusCode()).isClosed())) {
+
+					boolean closeManaged = RepositoryEntryManagedFlag.isManaged(repositoryEntry, RepositoryEntryManagedFlag.close);
+					if ((OresHelper.isOfType(repositoryEntry.getOlatResource(), CourseModule.class))
+							&& !closeManaged
+							&& (!RepositoryManager.getInstance().createRepositoryEntryStatus(repositoryEntry.getStatusCode()).isClosed())) {
 						detailsToolC.addLink(ACTION_CLOSE_RESSOURCE, translate("details.close.ressoure"), TOOL_CLOSE_RESSOURCE, null, "o_sel_repo_close_resource", false);
 						if(corrupted) {
 							detailsToolC.setEnabled(TOOL_CLOSE_RESSOURCE, false);
@@ -524,7 +529,8 @@ public class RepositoryDetailsController extends BasicController implements Gene
 				}
 				// enable
 				if(isAuthor) {
-					detailsToolC.setEnabled(TOOL_EDIT, handler.supportsEdit(repositoryEntry) && !corrupted);
+					boolean editManaged = RepositoryEntryManagedFlag.isManaged(repositoryEntry, RepositoryEntryManagedFlag.editcontent);
+					detailsToolC.setEnabled(TOOL_EDIT, handler.supportsEdit(repositoryEntry) && !corrupted && !editManaged);
 					detailsToolC.setEnabled(TOOL_CHDESC, !corrupted);
 					detailsToolC.setEnabled(TOOL_CHPROP, !corrupted);
 				}
diff --git a/src/main/java/org/olat/repository/controllers/RepositoryEditDescriptionController.java b/src/main/java/org/olat/repository/controllers/RepositoryEditDescriptionController.java
index 31b468420c1..8e38c3c9afa 100644
--- a/src/main/java/org/olat/repository/controllers/RepositoryEditDescriptionController.java
+++ b/src/main/java/org/olat/repository/controllers/RepositoryEditDescriptionController.java
@@ -42,6 +42,7 @@ import org.olat.core.gui.components.form.flexible.elements.TextElement;
 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.image.ImageFormItem;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.control.Controller;
@@ -56,6 +57,7 @@ import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.core.util.vfs.VFSMediaResource;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryIconRenderer;
+import org.olat.repository.RepositoryEntryManagedFlag;
 import org.olat.repository.RepositoryManager;
 import org.olat.resource.OLATResource;
 import org.olat.user.UserManager;
@@ -79,6 +81,7 @@ public class RepositoryEditDescriptionController extends FormBasicController {
 	private RichTextElement description;
 	private ImageFormItem imageEl;
 	private FormLink deleteImage;
+	private FormSubmit submit;
 
 	private final UserManager userManager;
 	private final RepositoryManager repositoryManager;
@@ -142,14 +145,18 @@ public class RepositoryEditDescriptionController extends FormBasicController {
 		displayName = uifactory.addTextElement("cif.displayname", "cif.displayname", 100, repositoryEntry.getDisplayname(), descCont);
 		displayName.setDisplaySize(30);
 		displayName.setMandatory(true);
+		displayName.setEnabled(!RepositoryEntryManagedFlag.isManaged(repositoryEntry, RepositoryEntryManagedFlag.title));
 
 		String desc = (repositoryEntry.getDescription() != null ? repositoryEntry.getDescription() : " ");
 		description = uifactory.addRichTextElementForStringDataMinimalistic("cif.description", "cif.description",
 				desc, 10, -1, false, descCont, ureq.getUserSession(), getWindowControl());
+		description.setEnabled(!RepositoryEntryManagedFlag.isManaged(repositoryEntry, RepositoryEntryManagedFlag.description));
 		description.setMandatory(true);
 
 		uifactory.addSpacerElement("spacer2", descCont, false);
 		
+		boolean managed = RepositoryEntryManagedFlag.isManaged(repositoryEntry, RepositoryEntryManagedFlag.details);
+		
 		VFSLeaf img = repositoryManager.getImage(repositoryEntry);
 		imageEl = new ImageFormItem("imageEl");
 		imageEl.setLabel("rentry.pic", null);
@@ -163,7 +170,7 @@ public class RepositoryEditDescriptionController extends FormBasicController {
 		descCont.add(imageEl);
 		
 		deleteImage = uifactory.addFormLink("delete", "cmd.delete", null, descCont, Link.BUTTON);
-		deleteImage.setVisible(img != null);
+		deleteImage.setVisible(img != null && !managed);
 
 		fileUpload = uifactory.addFileElement("rentry.pic", "rentry.pic", descCont);
 		if(img != null) {
@@ -171,6 +178,7 @@ public class RepositoryEditDescriptionController extends FormBasicController {
 		}
 		fileUpload.setMaxUploadSizeKB(picUploadlimitKB, null, null);
 		fileUpload.addActionListener(this, FormEvent.ONCHANGE);
+		fileUpload.setVisible(!managed);
 		
 		Set<String> mimeTypes = new HashSet<String>();
 		mimeTypes.add("image/gif");
@@ -182,7 +190,8 @@ public class RepositoryEditDescriptionController extends FormBasicController {
 		FormLayoutContainer buttonContainer = FormLayoutContainer.createButtonLayout("buttonContainer", getTranslator());
 		formLayout.add("buttonContainer", buttonContainer);
 		buttonContainer.setElementCssClass("o_sel_repo_save_details");
-		uifactory.addFormSubmitButton("submit", buttonContainer);
+		submit = uifactory.addFormSubmitButton("submit", buttonContainer);
+		submit.setVisible(!managed);
 		if (!isSubWorkflow) {
 			uifactory.addFormCancelButton("cancel", buttonContainer, ureq, getWindowControl());
 		}
diff --git a/src/main/java/org/olat/repository/controllers/RepositoryEditPropertiesController.java b/src/main/java/org/olat/repository/controllers/RepositoryEditPropertiesController.java
index 6760f8d193d..a3e6f338a72 100644
--- a/src/main/java/org/olat/repository/controllers/RepositoryEditPropertiesController.java
+++ b/src/main/java/org/olat/repository/controllers/RepositoryEditPropertiesController.java
@@ -91,6 +91,7 @@ import org.olat.modules.scorm.ScormMainManager;
 import org.olat.modules.scorm.ScormPackageConfig;
 import org.olat.repository.PropPupForm;
 import org.olat.repository.RepositoryEntry;
+import org.olat.repository.RepositoryEntryManagedFlag;
 import org.olat.repository.RepositoryManager;
 import org.olat.resource.accesscontrol.ui.AccessConfigurationController;
 import org.olat.resource.references.ReferenceImpl;
@@ -173,7 +174,9 @@ public class RepositoryEditPropertiesController extends BasicController implemen
 		editproptabpubVC.put("proppupform", propPupForm.getInitialComponent());
 		
 		//fxdiff VCRP-1,2: access control of resources
-	  acCtr = new AccessConfigurationController(ureq, getWindowControl(), repositoryEntry.getOlatResource(), repositoryEntry.getDisplayname(), true);
+		boolean managedBookings = RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.bookings);
+	  acCtr = new AccessConfigurationController(ureq, getWindowControl(), repositoryEntry.getOlatResource(), repositoryEntry.getDisplayname(),
+	  		true, !managedBookings);
 	  int access = propPupForm.getAccess();
 	  if(access == RepositoryEntry.ACC_USERS || access == RepositoryEntry.ACC_USERS_GUESTS) {
 	  	editproptabpubVC.put("accesscontrol", acCtr.getInitialComponent());
@@ -208,28 +211,37 @@ public class RepositoryEditPropertiesController extends BasicController implemen
 			  // and course chat is enabled.
 				InstantMessagingModule imModule = CoreSpringFactory.getImpl(InstantMessagingModule.class);
 			  if (imModule.isEnabled() && imModule.isCourseEnabled() && CourseModule.isCourseChatEnabled()) {
-				  ccc = new CourseChatSettingController(ureq, getWindowControl(), changedCourseConfig);
+			  	boolean managedChat = RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.chat);
+				  ccc = new CourseChatSettingController(ureq, getWindowControl(), changedCourseConfig, !managedChat);
 				  listenTo(ccc);
 				  // push on controller stack and register <this> as controllerlistener
 				  tabbedPane.addTab(translate("tab.chat"), ccc.getInitialComponent());
 			  }
-			  clayoutC = new CourseLayoutGeneratorController(ureq, getWindowControl(), changedCourseConfig, course.getCourseEnvironment());
+			  
+			  boolean managedLayout = RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.layout);
+			  clayoutC = new CourseLayoutGeneratorController(ureq, getWindowControl(), changedCourseConfig,
+			  		course.getCourseEnvironment(), !managedLayout);
 			  listenTo(clayoutC);
 			  tabbedPane.addTab(translate("tab.layout"), clayoutC.getInitialComponent());
 
-			  csfC = new CourseSharedFolderController(ureq, getWindowControl(), changedCourseConfig);
+			  boolean managedFolder = RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.resourcefolder);
+			  csfC = new CourseSharedFolderController(ureq, getWindowControl(), changedCourseConfig, !managedFolder);
 			  listenTo(csfC);
 			  tabbedPane.addTab(translate("tab.sharedfolder"), csfC.getInitialComponent());
 
-			  ceffC = new CourseEfficencyStatementController(ureq, getWindowControl(), changedCourseConfig);
+			  boolean managedStatement = RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.efficencystatement);
+			  ceffC = new CourseEfficencyStatementController(ureq, getWindowControl(), changedCourseConfig, !managedStatement);
 			  listenTo(ceffC);
 			  efficiencyConfigPos = tabbedPane.addTab(translate("tab.efficencystatement"), ceffC.getInitialComponent());
-			
-			  calCfgCtr = new CourseCalendarConfigController(ureq, getWindowControl(), changedCourseConfig);
+
+			  boolean managedCalendar = RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.calendar);
+			  calCfgCtr = new CourseCalendarConfigController(ureq, getWindowControl(), changedCourseConfig, !managedCalendar);
 			  listenTo(calCfgCtr);
 			  tabbedPane.addTab(translate("tab.calendar"), calCfgCtr.getInitialComponent());
 
-			  cglosCtr = new CourseConfigGlossaryController(ureq, getWindowControl(), changedCourseConfig, course.getResourceableId());
+			  boolean managedGlossary = RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.glossary);
+			  cglosCtr = new CourseConfigGlossaryController(ureq, getWindowControl(), changedCourseConfig,
+			  		course.getResourceableId(), !managedGlossary);
 			  listenTo(cglosCtr);
 			  tabbedPane.addTab(translate("tab.glossary"), cglosCtr.getInitialComponent());		
 			}     
diff --git a/src/main/java/org/olat/repository/controllers/RepositoryEntryFilter.java b/src/main/java/org/olat/repository/controllers/RepositoryEntryFilter.java
new file mode 100644
index 00000000000..6060066120c
--- /dev/null
+++ b/src/main/java/org/olat/repository/controllers/RepositoryEntryFilter.java
@@ -0,0 +1,34 @@
+/**
+ * <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.controllers;
+
+import org.olat.repository.RepositoryEntry;
+
+/**
+ * 
+ * Initial date: 12.07.2013<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public interface RepositoryEntryFilter {
+	
+	public boolean accept(RepositoryEntry re);
+
+}
diff --git a/src/main/java/org/olat/repository/controllers/RepositoryMembersController.java b/src/main/java/org/olat/repository/controllers/RepositoryMembersController.java
index 0185d756e86..a7253e1e7cf 100644
--- a/src/main/java/org/olat/repository/controllers/RepositoryMembersController.java
+++ b/src/main/java/org/olat/repository/controllers/RepositoryMembersController.java
@@ -46,6 +46,7 @@ import org.olat.group.ui.main.AbstractMemberListController;
 import org.olat.group.ui.main.MemberPermissionChangeEvent;
 import org.olat.group.ui.main.SearchMembersParams;
 import org.olat.repository.RepositoryEntry;
+import org.olat.repository.RepositoryEntryManagedFlag;
 import org.olat.repository.RepositoryManager;
 import org.olat.repository.model.RepositoryEntryPermissionChangeEvent;
 
@@ -58,7 +59,7 @@ public class RepositoryMembersController extends AbstractMemberListController {
 	
 	private final SearchMembersParams params;
 	private final RepositoryEntry repoEntry;
-	private final Link importMemberLink, addMemberLink;
+	private Link importMemberLink, addMemberLink;
 	private StepsMainRunController importMembersWizard;
 	
 	private final RepositoryManager repositoryManager;
@@ -71,11 +72,14 @@ public class RepositoryMembersController extends AbstractMemberListController {
 		businessGroupService = CoreSpringFactory.getImpl(BusinessGroupService.class);
 
 		this.repoEntry = repoEntry;
+		boolean managed = RepositoryEntryManagedFlag.isManaged(repoEntry, RepositoryEntryManagedFlag.membersmanagement);
 		addMemberLink = LinkFactory.createButton("add.member", mainVC, this);
+		addMemberLink.setVisible(!managed);
 		mainVC.put("addMembers", addMemberLink);
 		importMemberLink = LinkFactory.createButton("import.member", mainVC, this);
+		importMemberLink.setVisible(!managed);
 		mainVC.put("importMembers", importMemberLink);
-		
+
 		params = new SearchMembersParams(true, true, true, true, true, true, true);
 		reloadModel();
 	}
diff --git a/src/main/java/org/olat/repository/controllers/RepositorySearchController.java b/src/main/java/org/olat/repository/controllers/RepositorySearchController.java
index d0e303c16ab..459ddc4964b 100644
--- a/src/main/java/org/olat/repository/controllers/RepositorySearchController.java
+++ b/src/main/java/org/olat/repository/controllers/RepositorySearchController.java
@@ -93,6 +93,7 @@ public class RepositorySearchController extends BasicController implements Activ
 	private boolean enableSearchforAllReferencalbeInSearchForm = false;
 	private Link loginLink;
 	private SearchType searchType;
+	private RepositoryEntryFilter filter;
 	
 	
 	/**
@@ -107,7 +108,7 @@ public class RepositorySearchController extends BasicController implements Activ
 			boolean withCancel, boolean enableDirectLaunch, boolean multiSelect) {
 		//fxdiff VCRP-10: repository search with type filter
 		super(ureq, myWControl, Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale()));
-		init(selectButtonLabel, ureq, withCancel, enableDirectLaunch, multiSelect, new String[]{});
+		init(selectButtonLabel, ureq, withCancel, enableDirectLaunch, multiSelect, new String[]{}, null);
 	}
 	
 	/**
@@ -121,14 +122,14 @@ public class RepositorySearchController extends BasicController implements Activ
 	 */
 	public RepositorySearchController(String selectButtonLabel, UserRequest ureq, WindowControl myWControl,
 			boolean withCancel, boolean enableDirectLaunch, boolean multiSelect, String limitType) {
-		this(selectButtonLabel, ureq,  myWControl,  withCancel,  enableDirectLaunch, multiSelect, new String[]{limitType});
+		this(selectButtonLabel, ureq,  myWControl,  withCancel,  enableDirectLaunch, multiSelect, new String[]{limitType}, null);
 	}
 
 	public RepositorySearchController(String selectButtonLabel, UserRequest ureq, WindowControl myWControl,
-			boolean withCancel, boolean enableDirectLaunch, boolean multiSelect, String[] limitTypes) {
+			boolean withCancel, boolean enableDirectLaunch, boolean multiSelect, String[] limitTypes, RepositoryEntryFilter filter) {
 		//fxdiff VCRP-10: repository search with type filter
 		super(ureq, myWControl, Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale()));
-		init(selectButtonLabel, ureq, withCancel, enableDirectLaunch, multiSelect, limitTypes);
+		init(selectButtonLabel, ureq, withCancel, enableDirectLaunch, multiSelect, limitTypes, filter);
 	}
 	
 	/**
@@ -139,7 +140,10 @@ public class RepositorySearchController extends BasicController implements Activ
 		super(ureq, myWControl, Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale()));
 	}
 
-	private void init(String selectButtonLabel, UserRequest ureq, boolean withCancel, boolean enableDirectLaunch, boolean multiSelect, String[] limitTypes) {
+	private void init(String selectButtonLabel, UserRequest ureq, boolean withCancel, boolean enableDirectLaunch, boolean multiSelect,
+			String[] limitTypes, RepositoryEntryFilter filter) {
+		
+		this.filter = filter;
 		translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale());
 		Roles roles = ureq.getUserSession().getRoles();
 		
@@ -223,6 +227,16 @@ public class RepositorySearchController extends BasicController implements Activ
 			DispatcherAction.redirectToDefaultDispatcher(ureq.getHttpResp());
 		}
 	}
+	
+	private void filterRepositoryEntries(List<RepositoryEntry> entries) {
+		if(filter != null && entries != null && !entries.isEmpty()) {
+			for(Iterator<RepositoryEntry> entryIt=entries.iterator(); entryIt.hasNext(); ) {
+				if(!filter.accept(entryIt.next())) {
+					entryIt.remove();
+				}
+			}
+		}
+	}
 
 	/**
 	 * Implementation normal search: find repo entries that are public
@@ -245,10 +259,7 @@ public class RepositorySearchController extends BasicController implements Activ
 						restrictedTypes, ureq.getIdentity(), ureq.getUserSession().getRoles(),
 						ureq.getIdentity().getUser().getProperty(UserConstants.INSTITUTIONALNAME, null));
 		List<RepositoryEntry> entries = rm.genericANDQueryWithRolesRestriction(params, 0, -1, true);		
-		//List<RepositoryEntry> entries =	rm.genericANDQueryWithRolesRestriction(searchForm.getDisplayName(), searchForm.getAuthor(),
-		//	searchForm.getDescription(), restrictedTypes, ureq.getIdentity(), ureq.getUserSession().getRoles(), ureq.getIdentity().getUser().getProperty(UserConstants.INSTITUTIONALNAME, null));
-
-		//fxdiff VCRP-1,2: access control of resources
+		filterRepositoryEntries(entries);
 		repoTableModel.setObjects(entries);
 		//fxdiff VCRP-10: repository search with type filter
 		if(updateFilters) {
@@ -285,6 +296,7 @@ public class RepositorySearchController extends BasicController implements Activ
 		} else {
 			entries = rm.queryReferencableResourcesLimitType(ident, roles, restrictedTypes, name, author, desc);
 		}
+		filterRepositoryEntries(entries);
 		repoTableModel.setObjects(entries);
 		//fxdiff VCRP-10: repository search with type filter
 		if(updateFilters) {
@@ -327,7 +339,7 @@ public class RepositorySearchController extends BasicController implements Activ
 			restrictedTypes.addAll(Arrays.asList(limitTypes));
 		}
 		List<RepositoryEntry> entries = rm.queryReferencableResourcesLimitType(owner, roles, restrictedTypes, null, null, null);
-		
+		filterRepositoryEntries(entries);
 		repoTableModel.setObjects(entries);
 		//fxdiff VCRP-10: repository search with type filter
 		tableCtr.setFilters(null, null);
@@ -364,6 +376,7 @@ public class RepositorySearchController extends BasicController implements Activ
 		searchType = SearchType.byOwner;
 		RepositoryManager rm = RepositoryManager.getInstance();
 		List<RepositoryEntry> entries = rm.queryByOwner(owner, limitTypes);
+		filterRepositoryEntries(entries);
 		if(updateFilters) {
 			updateFilters(entries, owner);
 		}
@@ -381,7 +394,7 @@ public class RepositorySearchController extends BasicController implements Activ
 		RepositoryManager rm = RepositoryManager.getInstance();
 		//fxdiff VCRP-1,2: access control of resources
 		List<RepositoryEntry> entries = rm.queryByOwnerLimitAccess(owner, RepositoryEntry.ACC_USERS, Boolean.TRUE);
-
+		filterRepositoryEntries(entries);
 		repoTableModel.setObjects(entries);
 		//fxdiff VCRP-10: repository search with type filter
 		tableCtr.setFilters(null, null);
@@ -399,6 +412,7 @@ public class RepositorySearchController extends BasicController implements Activ
 		searchType = null;
 		RepositoryManager rm = RepositoryManager.getInstance();
 		List<RepositoryEntry> entries = rm.queryByTypeLimitAccess(ureq.getIdentity(), ureq.getUserSession().getRoles(), type);
+		filterRepositoryEntries(entries);
 		repoTableModel.setObjects(entries);
 		//fxdiff VCRP-10: repository search with type filter
 		tableCtr.setFilters(null, null);
@@ -411,6 +425,7 @@ public class RepositorySearchController extends BasicController implements Activ
 		RepositoryEntry entry = rm.lookupRepositoryEntry(id);
 		List<RepositoryEntry> entries = new ArrayList<RepositoryEntry>(1);
 		if (entry != null) entries.add(entry);
+		filterRepositoryEntries(entries);
 		repoTableModel.setObjects(entries);
 		tableCtr.modelChanged();
 		displaySearchResults(null);
@@ -425,6 +440,7 @@ public class RepositorySearchController extends BasicController implements Activ
 		RepositoryManager rm = RepositoryManager.getInstance();
 		List<RepositoryEntry> entries = rm.getLearningResourcesAsStudent(ureq.getIdentity(), 0, -1);
 		//fxdiff VCRP-10: repository search with type filter
+		filterRepositoryEntries(entries);
 		doSearchMyRepositoryEntries(ureq, entries, limitType, updateFilters);
 	}
 	
@@ -436,6 +452,7 @@ public class RepositorySearchController extends BasicController implements Activ
 		searchType = SearchType.myAsTeacher;
 		RepositoryManager rm = RepositoryManager.getInstance();
 		List<RepositoryEntry> entries = rm.getLearningResourcesAsTeacher(ureq.getIdentity(), 0, -1);
+		filterRepositoryEntries(entries);
 		//fxdiff VCRP-10: repository search with type filter
 		doSearchMyRepositoryEntries(ureq, entries, limitType, updateFilters);
 	}
diff --git a/src/main/java/org/olat/repository/controllers/_content/all_member_list.html b/src/main/java/org/olat/repository/controllers/_content/all_member_list.html
index bd38ba2676e..c858af8e103 100644
--- a/src/main/java/org/olat/repository/controllers/_content/all_member_list.html
+++ b/src/main/java/org/olat/repository/controllers/_content/all_member_list.html
@@ -1,3 +1,4 @@
+#if($r.available("addMembers") || $r.available("importMembers"))
 <div class="o_buttons_box_right">
 	#if($r.available("addMembers"))
 		$r.render("addMembers")
@@ -6,6 +7,7 @@
 		$r.render("importMembers")
 	#end
 </div>
+#end
 
 #if($infos)
 	<br/>
diff --git a/src/main/java/org/olat/resource/accesscontrol/ui/AccessConfigurationController.java b/src/main/java/org/olat/resource/accesscontrol/ui/AccessConfigurationController.java
index 986a46c1085..79486b34651 100644
--- a/src/main/java/org/olat/resource/accesscontrol/ui/AccessConfigurationController.java
+++ b/src/main/java/org/olat/resource/accesscontrol/ui/AccessConfigurationController.java
@@ -84,9 +84,10 @@ public class AccessConfigurationController extends FormBasicController {
 	private final boolean embbed;
 	private final boolean emptyConfigGrantsFullAccess;
 	private boolean allowPaymentMethod;
+	private final boolean editable;
 	
 	public AccessConfigurationController(UserRequest ureq, WindowControl wControl, OLATResource resource,
-			String displayName, boolean allowPaymentMethod) {
+			String displayName, boolean allowPaymentMethod, boolean editable) {
 		super(ureq, wControl, "access_configuration");
 		
 		this.resource = resource;
@@ -95,15 +96,17 @@ public class AccessConfigurationController extends FormBasicController {
 		acModule = (AccessControlModule)CoreSpringFactory.getBean("acModule");
 		acService = CoreSpringFactory.getImpl(ACService.class);
 		embbed = false;
+		this.editable = editable;
 		emptyConfigGrantsFullAccess = true; 
 		
 		initForm(ureq);
 	}
 		
 	public AccessConfigurationController(UserRequest ureq, WindowControl wControl, OLATResource resource,
-			String displayName, boolean allowPaymentMethod, Form form) {
+			String displayName, boolean allowPaymentMethod, boolean editable, Form form) {
 		super(ureq, wControl, FormBasicController.LAYOUT_CUSTOM, "access_configuration", form);
 		
+		this.editable = editable;
 		this.resource = resource;
 		this.displayName = displayName;
 		this.allowPaymentMethod = allowPaymentMethod;
@@ -121,8 +124,10 @@ public class AccessConfigurationController extends FormBasicController {
 
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-		createLink = uifactory.addFormLink("add.accesscontrol", formLayout, Link.BUTTON);
-		createLink.setElementCssClass("o_sel_accesscontrol_create");
+		if(editable) {
+			createLink = uifactory.addFormLink("add.accesscontrol", formLayout, Link.BUTTON);
+			createLink.setElementCssClass("o_sel_accesscontrol_create");
+		}
 		
 		String confPage = velocity_root + "/configuration_list.html";
 		confControllerContainer = FormLayoutContainer.createCustomFormLayout("conf-controllers", getTranslator(), confPage);
@@ -138,12 +143,14 @@ public class AccessConfigurationController extends FormBasicController {
 			setFormDescription("accesscontrol.desc");
 			setFormContextHelp(AccessConfigurationController.class.getPackage().getName(), "accesscontrol.html", "chelp.accesscontrol.hover");
 			
-			final FormLayoutContainer buttonGroupLayout = FormLayoutContainer.createButtonLayout("buttonLayout", getTranslator());
-			buttonGroupLayout.setRootForm(mainForm);
-			formLayout.add(buttonGroupLayout);
-			formLayout.add("buttonLayout", buttonGroupLayout);
-			
-			uifactory.addFormSubmitButton("save", buttonGroupLayout);
+			if(editable) {
+				final FormLayoutContainer buttonGroupLayout = FormLayoutContainer.createButtonLayout("buttonLayout", getTranslator());
+				buttonGroupLayout.setRootForm(mainForm);
+				formLayout.add(buttonGroupLayout);
+				formLayout.add("buttonLayout", buttonGroupLayout);
+
+				uifactory.addFormSubmitButton("save", buttonGroupLayout);
+			}
 		}
 		
 		confControllerContainer.contextPut("emptyConfigGrantsFullAccess", Boolean.valueOf(emptyConfigGrantsFullAccess));		
@@ -285,18 +292,22 @@ public class AccessConfigurationController extends FormBasicController {
 
 		DateChooser dateFrom = uifactory.addDateChooser("from_" + link.getKey(), "from", null, confControllerContainer);
 		dateFrom.setUserObject(infos);
+		dateFrom.setEnabled(editable);
 		dateFrom.setDate(link.getValidFrom());
 		confControllerContainer.add(dateFrom.getName(), dateFrom);
 		
 		DateChooser dateTo = uifactory.addDateChooser("to_" + link.getKey(), "to", null, confControllerContainer);
+		dateTo.setEnabled(editable);
 		dateTo.setUserObject(infos);
 		dateTo.setDate(link.getValidTo());
 		confControllerContainer.add(dateTo.getName(), dateTo);
 		
-		FormLink delLink = uifactory.addFormLink("del_" + link.getKey(), "delete", null, confControllerContainer, Link.LINK);
-		delLink.setUserObject(infos);
-		delLink.setCustomEnabledLinkCSS("b_with_small_icon_left b_delete_icon");
-		confControllerContainer.add(delLink.getName(), delLink);
+		if(editable) {
+			FormLink delLink = uifactory.addFormLink("del_" + link.getKey(), "delete", null, confControllerContainer, Link.LINK);
+			delLink.setUserObject(infos);
+			delLink.setCustomEnabledLinkCSS("b_with_small_icon_left b_delete_icon");
+			confControllerContainer.add(delLink.getName(), delLink);
+		}
 	}
 	
 	protected void addMethod(UserRequest ureq, AccessMethod method) {
diff --git a/src/main/java/org/olat/resource/accesscontrol/ui/_content/access_configuration.html b/src/main/java/org/olat/resource/accesscontrol/ui/_content/access_configuration.html
index 64463aa072b..e2c26a9f6d6 100644
--- a/src/main/java/org/olat/resource/accesscontrol/ui/_content/access_configuration.html
+++ b/src/main/java/org/olat/resource/accesscontrol/ui/_content/access_configuration.html
@@ -5,11 +5,13 @@
 #if ($off_warn) <div class="b_warning">$off_warn</div> #end
 #if ($off_info) <div class="b_info">$off_info</div> #end
 
+#if($r.available("add.accesscontrol")) 
 	<div class="b_clearfix">
 		<div class="b_float_right">
 			$r.render("add.accesscontrol")
 		</div>
 	</div>
+#end
 	<div class="b_clearfix">
 		$r.render("conf-controllers")
 	</div>
diff --git a/src/main/java/org/olat/resource/accesscontrol/ui/_content/configuration_list.html b/src/main/java/org/olat/resource/accesscontrol/ui/_content/configuration_list.html
index d5962f2c5dd..ec6c4512a72 100644
--- a/src/main/java/org/olat/resource/accesscontrol/ui/_content/configuration_list.html
+++ b/src/main/java/org/olat/resource/accesscontrol/ui/_content/configuration_list.html
@@ -17,7 +17,7 @@
 				<td><span class="b_access_infos">$confController.infos</span></td>
 				<td><div class="b_form_element">$r.render("from_$confController.link.key")</div></td>
 				<td><div class="b_form_element">$r.render("to_$confController.link.key")</div></td>
-				<td>$r.render("del_$confController.link.key")</td>
+				<td>#if($r.available("del_$confController.link.key")) $r.render("del_$confController.link.key") #end</td>
 			</tr>
 			#set($desc = $confController.getLink().getOffer().getDescription())
 			#if ($desc)
diff --git a/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java b/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java
index f7b67dfa3e5..af2ca899e9a 100644
--- a/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java
+++ b/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java
@@ -491,7 +491,7 @@ public class CoursesWebService {
 		}
 		addedEntry.setExternalId(externalId);
 		addedEntry.setExternalRef(externalRef);
-		addedEntry.setManagedFlags(managedFlags);
+		addedEntry.setManagedFlagsString(managedFlags);
 		
 		// Do set access for owner at the end, because unfinished course should be
 		// invisible
diff --git a/src/main/java/org/olat/restapi/support/ObjectFactory.java b/src/main/java/org/olat/restapi/support/ObjectFactory.java
index f00924b2453..9fcd0b4deac 100644
--- a/src/main/java/org/olat/restapi/support/ObjectFactory.java
+++ b/src/main/java/org/olat/restapi/support/ObjectFactory.java
@@ -96,7 +96,7 @@ public class ObjectFactory {
 		vo.setMaxParticipants(grp.getMaxParticipants());
 		vo.setMinParticipants(grp.getMinParticipants());
 		vo.setExternalId(grp.getExternalId());
-		vo.setManagedFlags(grp.getManagedFlags());
+		vo.setManagedFlags(grp.getManagedFlagsString());
 		vo.setType(grp.getType());
 		return vo;
 	}
@@ -165,7 +165,7 @@ public class ObjectFactory {
 		}
 		vo.setExternalId(entry.getExternalId());
 		vo.setExternalRef(entry.getExternalRef());
-		vo.setManagedFlags(entry.getManagedFlags());
+		vo.setManagedFlags(entry.getManagedFlagsString());
 		if(entry.getLifecycle() != null) {
 			vo.setLifecycle(new RepositoryEntryLifecycleVO(entry.getLifecycle()));
 		}
@@ -188,7 +188,7 @@ public class ObjectFactory {
 		vo.setRepoEntryKey(re.getKey());
 		vo.setExternalId(re.getExternalId());
 		vo.setExternalRef(re.getExternalRef());
-		vo.setManagedFlags(re.getManagedFlags());
+		vo.setManagedFlags(re.getManagedFlagsString());
 		if(re.getLifecycle() != null) {
 			vo.setLifecycle(new RepositoryEntryLifecycleVO(re.getLifecycle()));
 		}
diff --git a/src/main/resources/database/mysql/alter_8_4_0_to_9_0_0.sql b/src/main/resources/database/mysql/alter_8_4_0_to_9_0_0.sql
index b4bc1e6213d..f92edadc627 100644
--- a/src/main/resources/database/mysql/alter_8_4_0_to_9_0_0.sql
+++ b/src/main/resources/database/mysql/alter_8_4_0_to_9_0_0.sql
@@ -414,5 +414,51 @@ create table o_ex_task (
 );
 alter table o_ex_task ENGINE = InnoDB;
 
+-- managed groups
+create or replace view o_gp_business_v  as (
+   select
+      gp.group_id as group_id,
+      gp.groupname as groupname,
+      gp.lastmodified as lastmodified,
+      gp.creationdate as creationdate,
+      gp.lastusage as lastusage,
+      gp.descr as descr,
+      gp.minparticipants as minparticipants,
+      gp.maxparticipants as maxparticipants,
+      gp.waitinglist_enabled as waitinglist_enabled,
+      gp.autocloseranks_enabled as autocloseranks_enabled,
+      gp.managed_flags as managed_flags,
+      (select count(part.id) from o_bs_membership as part where part.secgroup_id = gp.fk_partipiciantgroup) as num_of_participants,
+      (select count(pending.reservation_id) from o_ac_reservation as pending where pending.fk_resource = gp.fk_resource) as num_of_pendings,
+      (select count(own.id) from o_bs_membership as own where own.secgroup_id = gp.fk_ownergroup) as num_of_owners,
+      (case when gp.waitinglist_enabled = 1
+         then 
+           (select count(waiting.id) from o_bs_membership as waiting where waiting.secgroup_id = gp.fk_partipiciantgroup)
+         else
+           0
+      end) as num_waiting,
+      (select count(offer.offer_id) from o_ac_offer as offer 
+         where offer.fk_resource_id = gp.fk_resource
+         and offer.is_valid=1
+         and (offer.validfrom is null or offer.validfrom <= current_timestamp())
+         and (offer.validto is null or offer.validto >= current_timestamp())
+      ) as num_of_valid_offers,
+      (select count(offer.offer_id) from o_ac_offer as offer 
+         where offer.fk_resource_id = gp.fk_resource
+         and offer.is_valid=1
+      ) as num_of_offers,
+      (select count(relation.fk_resource) from o_gp_business_to_resource as relation 
+         where relation.fk_group = gp.group_id
+      ) as num_of_relations,
+      gp.fk_resource as fk_resource,
+      gp.fk_ownergroup as fk_ownergroup,
+      gp.fk_partipiciantgroup as fk_partipiciantgroup,
+      gp.fk_waitinggroup as fk_waitinggroup
+   from o_gp_business as gp
+);
+
+
+
+
 
 
diff --git a/src/main/resources/database/mysql/setupDatabase.sql b/src/main/resources/database/mysql/setupDatabase.sql
index 6b3a7311321..5c16322da5e 100644
--- a/src/main/resources/database/mysql/setupDatabase.sql
+++ b/src/main/resources/database/mysql/setupDatabase.sql
@@ -1391,6 +1391,7 @@ create or replace view o_gp_business_v  as (
       gp.maxparticipants as maxparticipants,
       gp.waitinglist_enabled as waitinglist_enabled,
       gp.autocloseranks_enabled as autocloseranks_enabled,
+      gp.managed_flags as managed_flags,
       (select count(part.id) from o_bs_membership as part where part.secgroup_id = gp.fk_partipiciantgroup) as num_of_participants,
       (select count(pending.reservation_id) from o_ac_reservation as pending where pending.fk_resource = gp.fk_resource) as num_of_pendings,
       (select count(own.id) from o_bs_membership as own where own.secgroup_id = gp.fk_ownergroup) as num_of_owners,
diff --git a/src/main/resources/database/oracle/alter_8_4_0_to_9_0_0.sql b/src/main/resources/database/oracle/alter_8_4_0_to_9_0_0.sql
index 3e80bace5f7..998a48e2137 100644
--- a/src/main/resources/database/oracle/alter_8_4_0_to_9_0_0.sql
+++ b/src/main/resources/database/oracle/alter_8_4_0_to_9_0_0.sql
@@ -495,7 +495,48 @@ create table o_ex_task (
    primary key (id)
 );
 
-
+drop view o_gp_business_v;
+create or replace view o_gp_business_v  as (
+   select
+      gp.group_id as group_id,
+      gp.groupname as groupname,
+      gp.lastmodified as lastmodified,
+      gp.creationdate as creationdate,
+      gp.lastusage as lastusage,
+      gp.descr as descr,
+      gp.minparticipants as minparticipants,
+      gp.maxparticipants as maxparticipants,
+      gp.waitinglist_enabled as waitinglist_enabled,
+      gp.autocloseranks_enabled as autocloseranks_enabled,
+      gp.managed_flags as managed_flags,
+      (select count(part.id) from o_bs_membership part where part.secgroup_id = gp.fk_partipiciantgroup) as num_of_participants,
+      (select count(pending.reservation_id) from o_ac_reservation pending where pending.fk_resource = gp.fk_resource) as num_of_pendings,
+      (select count(own.id) from o_bs_membership own where own.secgroup_id = gp.fk_ownergroup) as num_of_owners,
+      (case when gp.waitinglist_enabled = 1
+         then 
+           (select count(waiting.id) from o_bs_membership waiting where waiting.secgroup_id = gp.fk_partipiciantgroup)
+         else
+           0
+      end) as num_waiting,
+      (select count(offer.offer_id) from o_ac_offer offer 
+         where offer.fk_resource_id = gp.fk_resource
+         and offer.is_valid=1
+         and (offer.validfrom is null or offer.validfrom <= current_date)
+         and (offer.validto is null or offer.validto >= current_date)
+      ) as num_of_valid_offers,
+      (select count(offer.offer_id) from o_ac_offer offer 
+         where offer.fk_resource_id = gp.fk_resource
+         and offer.is_valid=1
+      ) as num_of_offers,
+      (select count(relation.fk_resource) from o_gp_business_to_resource relation 
+         where relation.fk_group = gp.group_id
+      ) as num_of_relations,
+      gp.fk_resource as fk_resource,
+      gp.fk_ownergroup as fk_ownergroup,
+      gp.fk_partipiciantgroup as fk_partipiciantgroup,
+      gp.fk_waitinggroup as fk_waitinggroup
+   from o_gp_business gp
+);
 
 
 
diff --git a/src/main/resources/database/oracle/setupDatabase.sql b/src/main/resources/database/oracle/setupDatabase.sql
index 034da1c876e..5b493662bb4 100644
--- a/src/main/resources/database/oracle/setupDatabase.sql
+++ b/src/main/resources/database/oracle/setupDatabase.sql
@@ -1518,6 +1518,7 @@ create or replace view o_gp_business_v  as (
       gp.maxparticipants as maxparticipants,
       gp.waitinglist_enabled as waitinglist_enabled,
       gp.autocloseranks_enabled as autocloseranks_enabled,
+      gp.managed_flags as managed_flags,
       (select count(part.id) from o_bs_membership part where part.secgroup_id = gp.fk_partipiciantgroup) as num_of_participants,
       (select count(pending.reservation_id) from o_ac_reservation pending where pending.fk_resource = gp.fk_resource) as num_of_pendings,
       (select count(own.id) from o_bs_membership own where own.secgroup_id = gp.fk_ownergroup) as num_of_owners,
diff --git a/src/main/resources/database/postgresql/alter_8_4_0_to_9_0_0.sql b/src/main/resources/database/postgresql/alter_8_4_0_to_9_0_0.sql
index e239f941216..a059833c72c 100644
--- a/src/main/resources/database/postgresql/alter_8_4_0_to_9_0_0.sql
+++ b/src/main/resources/database/postgresql/alter_8_4_0_to_9_0_0.sql
@@ -550,6 +550,51 @@ create table o_ex_task (
    primary key (id)
 );
 
+-- managed groups
+
+drop view o_gp_business_v;
+create or replace view o_gp_business_v  as (
+   select
+      gp.group_id as group_id,
+      gp.groupname as groupname,
+      gp.lastmodified as lastmodified,
+      gp.creationdate as creationdate,
+      gp.lastusage as lastusage,
+      gp.descr as descr,
+      gp.minparticipants as minparticipants,
+      gp.maxparticipants as maxparticipants,
+      gp.waitinglist_enabled as waitinglist_enabled,
+      gp.autocloseranks_enabled as autocloseranks_enabled,
+      gp.managed_flags as managed_flags,
+      (select count(part.id) from o_bs_membership as part where part.secgroup_id = gp.fk_partipiciantgroup) as num_of_participants,
+      (select count(pending.reservation_id) from o_ac_reservation as pending where pending.fk_resource = gp.fk_resource) as num_of_pendings,
+      (select count(own.id) from o_bs_membership as own where own.secgroup_id = gp.fk_ownergroup) as num_of_owners,
+      (case when gp.waitinglist_enabled = true
+         then 
+           (select count(waiting.id) from o_bs_membership as waiting where waiting.secgroup_id = gp.fk_partipiciantgroup)
+         else
+           0
+      end) as num_waiting,
+      (select count(offer.offer_id) from o_ac_offer as offer 
+         where offer.fk_resource_id = gp.fk_resource
+         and offer.is_valid=true
+         and (offer.validfrom is null or offer.validfrom <= current_timestamp)
+         and (offer.validto is null or offer.validto >= current_timestamp)
+      ) as num_of_valid_offers,
+      (select count(offer.offer_id) from o_ac_offer as offer 
+         where offer.fk_resource_id = gp.fk_resource
+         and offer.is_valid=true
+      ) as num_of_offers,
+      (select count(relation.fk_resource) from o_gp_business_to_resource as relation 
+         where relation.fk_group = gp.group_id
+      ) as num_of_relations,
+      gp.fk_resource as fk_resource,
+      gp.fk_ownergroup as fk_ownergroup,
+      gp.fk_partipiciantgroup as fk_partipiciantgroup,
+      gp.fk_waitinggroup as fk_waitinggroup
+   from o_gp_business as gp
+);
+
 
 
 
diff --git a/src/main/resources/database/postgresql/setupDatabase.sql b/src/main/resources/database/postgresql/setupDatabase.sql
index 26d3632ff7c..1520f771b0b 100644
--- a/src/main/resources/database/postgresql/setupDatabase.sql
+++ b/src/main/resources/database/postgresql/setupDatabase.sql
@@ -1386,6 +1386,7 @@ create or replace view o_gp_business_v  as (
       gp.maxparticipants as maxparticipants,
       gp.waitinglist_enabled as waitinglist_enabled,
       gp.autocloseranks_enabled as autocloseranks_enabled,
+      gp.managed_flags as managed_flags,
       (select count(part.id) from o_bs_membership as part where part.secgroup_id = gp.fk_partipiciantgroup) as num_of_participants,
       (select count(pending.reservation_id) from o_ac_reservation as pending where pending.fk_resource = gp.fk_resource) as num_of_pendings,
       (select count(own.id) from o_bs_membership as own where own.secgroup_id = gp.fk_ownergroup) as num_of_owners,
diff --git a/src/test/java/org/olat/group/BusinessGroupManagedFlagsTest.java b/src/test/java/org/olat/group/BusinessGroupManagedFlagsTest.java
new file mode 100644
index 00000000000..d27d1f1bd61
--- /dev/null
+++ b/src/test/java/org/olat/group/BusinessGroupManagedFlagsTest.java
@@ -0,0 +1,66 @@
+/**
+ * <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.group;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+
+/**
+ * 
+ * Test if the mconversion methos of the managed flags are fault tolerant
+ * 
+ * Initial date: 10.07.2013<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class BusinessGroupManagedFlagsTest {
+	
+	@Test
+	public void testManagedConversion() {
+		String flags = "all,details";
+		BusinessGroupManagedFlag[] arr = BusinessGroupManagedFlag.toEnum(flags);
+		Assert.assertNotNull(arr);
+		Assert.assertEquals(2, arr.length);
+		Assert.assertEquals(arr[0], BusinessGroupManagedFlag.all);
+		Assert.assertEquals(arr[1], BusinessGroupManagedFlag.details);
+	}
+	
+	@Test
+	public void testManagedConversion_badData_empty() {
+		String flags = "all,details,,,,";
+		BusinessGroupManagedFlag[] arr = BusinessGroupManagedFlag.toEnum(flags);
+		Assert.assertNotNull(arr);
+		Assert.assertEquals(2, arr.length);
+		Assert.assertEquals(arr[0], BusinessGroupManagedFlag.all);
+		Assert.assertEquals(arr[1], BusinessGroupManagedFlag.details);
+	}
+
+	@Test
+	public void testManagedConversion_badData_wrongFlag() {
+		String flags = "all,details,dru,gnu,tools";
+		BusinessGroupManagedFlag[] arr = BusinessGroupManagedFlag.toEnum(flags);
+		Assert.assertNotNull(arr);
+		Assert.assertEquals(3, arr.length);
+		Assert.assertEquals(arr[0], BusinessGroupManagedFlag.all);
+		Assert.assertEquals(arr[1], BusinessGroupManagedFlag.details);
+		Assert.assertEquals(arr[2], BusinessGroupManagedFlag.tools);
+	}
+}
diff --git a/src/test/java/org/olat/repository/RepositoryManagerTest.java b/src/test/java/org/olat/repository/RepositoryManagerTest.java
index 33cf83a35e0..2c6fb3ed455 100644
--- a/src/test/java/org/olat/repository/RepositoryManagerTest.java
+++ b/src/test/java/org/olat/repository/RepositoryManagerTest.java
@@ -700,7 +700,7 @@ public class RepositoryManagerTest extends OlatTestCase {
 	@Test
 	public void genericANDQueryWithRoles_managed() {
 		RepositoryEntry managedRe = JunitTestHelper.createAndPersistRepositoryEntry();
-		managedRe.setManagedFlags("all");
+		managedRe.setManagedFlagsString("all");
 		managedRe = dbInstance.getCurrentEntityManager().merge(managedRe);
 		RepositoryEntry freeRe = JunitTestHelper.createAndPersistRepositoryEntry();
 		dbInstance.commitAndCloseSession();
diff --git a/src/test/java/org/olat/restapi/RepositoryEntriesTest.java b/src/test/java/org/olat/restapi/RepositoryEntriesTest.java
index 43096b504b4..57e19c0f172 100644
--- a/src/test/java/org/olat/restapi/RepositoryEntriesTest.java
+++ b/src/test/java/org/olat/restapi/RepositoryEntriesTest.java
@@ -145,7 +145,7 @@ public class RepositoryEntriesTest extends OlatJerseyTestCase {
 	@Test
 	public void testGetEntry_managed() throws IOException, URISyntaxException {
 		RepositoryEntry re = createRepository("Test GET repo entry");
-		re.setManagedFlags("all");
+		re.setManagedFlagsString("all");
 		re = dbInstance.getCurrentEntityManager().merge(re);
 		dbInstance.commitAndCloseSession();
 
diff --git a/src/test/java/org/olat/test/AllTestsJunit4.java b/src/test/java/org/olat/test/AllTestsJunit4.java
index b9c5608981a..d8521dfa520 100644
--- a/src/test/java/org/olat/test/AllTestsJunit4.java
+++ b/src/test/java/org/olat/test/AllTestsJunit4.java
@@ -82,6 +82,7 @@ import org.junit.runners.Suite;
 	org.olat.core.commons.taskExecutor.PersistentTaskDAOTest.class,//ok
 	org.olat.core.commons.taskExecutor.TaskExecutorManagerTest.class,//ok
 	org.olat.admin.user.delete.service.UserDeletionManagerTest.class,//ok
+	org.olat.group.BusinessGroupManagedFlagsTest.class,//ok
 	org.olat.group.test.BGRightManagerTest.class,//ok
 	org.olat.group.test.BGAreaManagerTest.class,//ok
 	org.olat.group.test.BusinessGroupServiceTest.class,//ok
-- 
GitLab