diff --git a/src/main/java/org/olat/core/commons/editor/fileeditor/FileEditor.java b/src/main/java/org/olat/core/commons/editor/fileeditor/FileEditor.java
index dcaaa49a19d1ea99f9fc7e6e0a78ea5cb579d9ed..158c13ada874be8b571f5a0e7d138b05f4ca38c7 100644
--- a/src/main/java/org/olat/core/commons/editor/fileeditor/FileEditor.java
+++ b/src/main/java/org/olat/core/commons/editor/fileeditor/FileEditor.java
@@ -31,6 +31,7 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.core.util.Util;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.core.util.vfs.VFSLockApplicationType;
@@ -74,6 +75,11 @@ public class FileEditor implements DocEditor {
 		return false;
 	}
 
+	@Override
+	public boolean isEnabledFor(Identity identity, Roles roles) {
+		return true;
+	}
+
 	@Override
 	public boolean isSupportingFormat(String suffix, Mode mode, boolean hasMeta) {
 		// Both the HTML editor and the text editor supports view and edit
diff --git a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java
index a092b8770562219b4aeccaff168b991d44f95f45..1fb3f85cf19d8901a07f5342c76fd3a20b9c2c89 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java
@@ -48,6 +48,7 @@ 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.Translator;
+import org.olat.core.id.Identity;
 import org.olat.core.logging.AssertException;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.WebappHelper;
@@ -102,7 +103,8 @@ public class CmdCreateFile extends BasicController implements FolderCommand {
 		}
 		
 		boolean hasMeta = folderComponent.getCurrentContainer().canMeta() == VFSConstants.YES;
-		DocTemplates docTemplates = DocTemplates.editables(getLocale(), hasMeta).build();
+		Identity identity = getIdentity();
+		DocTemplates docTemplates = DocTemplates.editables(identity, ureq.getUserSession().getRoles(), getLocale(), hasMeta).build();
 		createCtrl = new CreateDocumentController(ureq, wControl, folderComponent.getCurrentContainer(), docTemplates);
 		listenTo(createCtrl);
 		
@@ -157,7 +159,8 @@ public class CmdCreateFile extends BasicController implements FolderCommand {
 		boolean hasMeta = currentContainer.canMeta() == VFSConstants.YES;
 		
 		String suffix = FileUtils.getFileSuffix(vfsLeaf.getName());
-		List<DocEditor> editors = docEditorService.getEditors(suffix, DocEditor.Mode.EDIT, hasMeta);
+		List<DocEditor> editors = docEditorService.getEditors(getIdentity(), ureq.getUserSession().getRoles(), suffix,
+				DocEditor.Mode.EDIT, hasMeta);
 		// Not able to decide which editor to use -> show the folder list
 		if (editors.size() != 1) {
 			fireEvent(ureq, new FolderEvent(FolderEvent.NEW_FILE_EVENT, fileName));
diff --git a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdOpenContent.java b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdOpenContent.java
index 07158e2dc571320520d827c4a8cd43d4491fac15..0cb04de0d3a081b48ed530c2903ce41763b6f085 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdOpenContent.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdOpenContent.java
@@ -107,7 +107,7 @@ public class CmdOpenContent extends BasicController implements FolderCommand {
 		
 		VFSLeaf vfsLeaf = (VFSLeaf) currentItem;
 		
-		DocEditorSecurityCallback secCallback = getDocEditorSecCallback(vfsLeaf);
+		DocEditorSecurityCallback secCallback = getDocEditorSecCallback(ureq, vfsLeaf);
 		HTMLEditorConfig htmlEditorConfig = getHtmlEditorConfig(vfsLeaf);
 		DocEditorConfigs configs = DocEditorConfigs.builder()
 				.addConfig(htmlEditorConfig)
@@ -122,7 +122,7 @@ public class CmdOpenContent extends BasicController implements FolderCommand {
 		return this;
 	}
 	
-	private DocEditorSecurityCallback getDocEditorSecCallback(VFSLeaf vfsLeaf) {
+	private DocEditorSecurityCallback getDocEditorSecCallback(UserRequest ureq, VFSLeaf vfsLeaf) {
 		VFSContainer currentContainer = folderComponent.getCurrentContainer();
 		boolean hasMeta = currentContainer.canMeta() == VFSConstants.YES;
 		VFSContainer container = VFSManager.findInheritingSecurityCallbackContainer(currentContainer);
@@ -131,15 +131,15 @@ public class CmdOpenContent extends BasicController implements FolderCommand {
 		DocEditorSecurityCallbackBuilder secCallbackBuilder = DocEditorSecurityCallbackBuilder.builder()
 				.withVersionControlled(true)
 				.withHasMeta(hasMeta);
-		DocEditor.Mode mode = getMode(vfsLeaf, canWrite, secCallbackBuilder);
+		DocEditor.Mode mode = getMode(ureq, vfsLeaf, canWrite, secCallbackBuilder);
 		secCallbackBuilder.withMode(mode);
 		return secCallbackBuilder.build();
 	}
 	
-	private DocEditor.Mode getMode(VFSLeaf vfsLeaf, boolean canWrite, DocEditorSecurityCallbackBuilder secCallbackBuilder) {
+	private DocEditor.Mode getMode(UserRequest ureq, VFSLeaf vfsLeaf, boolean canWrite, DocEditorSecurityCallbackBuilder secCallbackBuilder) {
 		if (canWrite) {
 			DocEditorSecurityCallback editSecCallback = secCallbackBuilder.withMode(DocEditor.Mode.EDIT).build();
-			if (docEditorService.hasEditor(vfsLeaf, getIdentity(), editSecCallback)) {
+			if (docEditorService.hasEditor(getIdentity(), ureq.getUserSession().getRoles(), vfsLeaf, editSecCallback)) {
 				return DocEditor.Mode.EDIT;
 			}
 		}
diff --git a/src/main/java/org/olat/core/commons/modules/bc/components/ListRenderer.java b/src/main/java/org/olat/core/commons/modules/bc/components/ListRenderer.java
index 601a38412857d4beaea52a608ae73c8ef5628c19..82acd484c3c06267ad4f277ce419acb54046ec35 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/components/ListRenderer.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/components/ListRenderer.java
@@ -33,6 +33,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import org.apache.logging.log4j.Logger;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.modules.bc.FileSelection;
 import org.olat.core.commons.modules.bc.FolderLicenseHandler;
@@ -55,7 +56,7 @@ import org.olat.core.gui.render.URLBuilder;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.gui.util.CSSHelper;
 import org.olat.core.id.Identity;
-import org.apache.logging.log4j.Logger;
+import org.olat.core.id.Roles;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.Formatter;
 import org.olat.core.util.StringHelper;
@@ -449,7 +450,8 @@ public class ListRenderer {
 		// open
 		if (!xssErrors) {
 			Identity identity = fc.getIdentityEnvironnement().getIdentity();
-			String openIcon = getOpenIconCss(child, canWrite, identity);
+			Roles roles = fc.getIdentityEnvironnement().getRoles();
+			String openIcon = getOpenIconCss(child, canWrite, identity, roles);
 			if (openIcon != null) {
 				sb.append("<a ");
 				ubu.buildHrefAndOnclick(sb, null, iframePostEnabled, false, false,
@@ -512,7 +514,7 @@ public class ListRenderer {
 		sb.append("</td></tr>");
 	}
 	
-	private String getOpenIconCss(VFSItem child, boolean canWrite, Identity identity) {
+	private String getOpenIconCss(VFSItem child, boolean canWrite, Identity identity, Roles roles) {
 		if (child instanceof VFSLeaf) {
 			VFSLeaf vfsLeaf = (VFSLeaf) child;
 			boolean hasMeta = vfsLeaf.canMeta() == VFSConstants.YES;
@@ -521,9 +523,9 @@ public class ListRenderer {
 					.withHasMeta(hasMeta);
 			DocEditorSecurityCallback editSecCallback = secCallbackBuilder.withMode(Mode.EDIT).build();
 			DocEditorSecurityCallback viewSecCallback = secCallbackBuilder.withMode(Mode.VIEW).build();
-			if (canWrite && docEditorService.hasEditor(vfsLeaf, identity, editSecCallback)) {
+			if (canWrite && docEditorService.hasEditor(identity, roles, vfsLeaf, editSecCallback)) {
 				return "o_icon_edit";
-			} else if (docEditorService.hasEditor(vfsLeaf, identity, viewSecCallback)) {
+			} else if (docEditorService.hasEditor(identity, roles, vfsLeaf, viewSecCallback)) {
 				return "o_icon_preview";
 			}
 		}
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/DocEditor.java b/src/main/java/org/olat/core/commons/services/doceditor/DocEditor.java
index 7da27a52bade8253e2a0f2a1c7c92a5848dc27de..59784e083c947eeb5eca98b6170eaf2d59e7b806 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/DocEditor.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/DocEditor.java
@@ -25,6 +25,7 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.core.util.vfs.VFSLeaf;
 
 /**
@@ -45,6 +46,15 @@ public interface DocEditor {
 
 	boolean isDataTransferConfirmationEnabled();
 	
+	/**
+	 * Indicates whether a specific identity with specific roles is permitted to use the editor.
+	 *
+	 * @param identity 
+	 * @param roles
+	 * @return
+	 */
+	boolean isEnabledFor(Identity identity, Roles roles);
+	
 	/**
 	 * Indicates whether the editor supports the format with that suffix in the appropriate mode.
 	 *
@@ -68,5 +78,4 @@ public interface DocEditor {
 	Controller getRunController(UserRequest ureq, WindowControl wControl, Identity identity, VFSLeaf vfsLeaf,
 			DocEditorSecurityCallback securityCallback, DocEditorConfigs configs);
 
-
 }
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/DocEditorIdentityService.java b/src/main/java/org/olat/core/commons/services/doceditor/DocEditorIdentityService.java
index 73436de8f8cb61525191b6a8918fc6312bc6e828..7fb17ef2f1c847e37ffd0c8c199ac0b1271f1080 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/DocEditorIdentityService.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/DocEditorIdentityService.java
@@ -48,4 +48,6 @@ public interface DocEditorIdentityService {
 	
 	public String getUserDisplayName(Identity identity);
 
+	public boolean isCoach(Identity identity);
+
 }
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/DocTemplates.java b/src/main/java/org/olat/core/commons/services/doceditor/DocTemplates.java
index be40c55a462ccf6f6ee6e421da06dd380a39ab8a..72f953243ad7e010b26c71d7c232fda4552669f0 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/DocTemplates.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/DocTemplates.java
@@ -32,6 +32,8 @@ import java.util.Locale;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.services.doceditor.ui.CreateDocumentController;
 import org.olat.core.gui.translator.Translator;
+import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.core.util.Util;
 
 /**
@@ -56,27 +58,27 @@ public class DocTemplates {
 		return docTemplates.isEmpty();
 	}
 	
-	public static Builder editables(Locale locale, boolean hasMeta) {
+	public static Builder editables(Identity identity, Roles roles, Locale locale, boolean hasMeta) {
 		Builder builder = new Builder(locale);
 		
 		DocumentEditorService docEditorService = CoreSpringFactory.getImpl(DocumentEditorService.class);
 		
-		if (docEditorService.hasEditor("txt", EDIT, hasMeta)) {
+		if (docEditorService.hasEditor(identity, roles, "txt", EDIT, hasMeta)) {
 			builder.addTxt();
 		}
-		if (docEditorService.hasEditor("html", EDIT, hasMeta)) {
+		if (docEditorService.hasEditor(identity, roles, "html", EDIT, hasMeta)) {
 			builder.addHtml();
 		}
-		if (docEditorService.hasEditor("css", EDIT, hasMeta)) {
+		if (docEditorService.hasEditor(identity, roles, "css", EDIT, hasMeta)) {
 			builder.addCss();
 		}
-		if (docEditorService.hasEditor("docx", EDIT, hasMeta)) {
+		if (docEditorService.hasEditor(identity, roles, "docx", EDIT, hasMeta)) {
 			builder.addDocx();
 		}
-		if (docEditorService.hasEditor("xlsx", EDIT, hasMeta)) {
+		if (docEditorService.hasEditor(identity, roles, "xlsx", EDIT, hasMeta)) {
 			builder.addXlsx();
 		}
-		if (docEditorService.hasEditor("pptx", EDIT, hasMeta)) {
+		if (docEditorService.hasEditor(identity, roles, "pptx", EDIT, hasMeta)) {
 			builder.addPptx();
 		}
 			
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/DocumentEditorService.java b/src/main/java/org/olat/core/commons/services/doceditor/DocumentEditorService.java
index 0780c89a4c63d02a11df264b34ac4544460d134e..9ab921c30f7cdacc1f7ecb2f5c663df439752ec8 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/DocumentEditorService.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/DocumentEditorService.java
@@ -24,6 +24,7 @@ import java.util.Optional;
 
 import org.olat.core.commons.services.doceditor.DocEditor.Mode;
 import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.core.util.vfs.VFSLeaf;
 
 /**
@@ -36,23 +37,26 @@ public interface DocumentEditorService {
 	
 	/**
 	 * Check if file with a specific suffix is supported by any enabled editor.
-	 *
+	 * @param identity
+	 * @param roles
 	 * @param suffix
 	 * @param mode
 	 * @param hasMeta
 	 * @return
 	 */
-	public boolean hasEditor(String suffix, Mode mode, boolean hasMeta);
+	public boolean hasEditor(Identity identity, Roles roles, String suffix, Mode mode, boolean hasMeta);
 	
 	/**
 	 * Get all enabled editors which support a file with a specific suffix.
-	 *
+	 * @param identity 
+	 * @param roles 
 	 * @param suffix
 	 * @param mode
 	 * @param hasMeta
+	 *
 	 * @return
 	 */
-	public List<DocEditor> getEditors(String suffix, Mode mode, boolean hasMeta);
+	public List<DocEditor> getEditors(Identity identity, Roles roles, String suffix, Mode mode, boolean hasMeta);
 	
 	/**
 	 * Get the editor of a specific type.
@@ -66,12 +70,14 @@ public interface DocumentEditorService {
 	 * Checks whether a vfsLeaf can be opened in any editor by a user and in a
 	 * specific mode. This method checks not only if a file format is supported but
 	 * also e.g. if the vfsLeaf is not locked by an other editor or user.
-	 *
-	 * @param vfsLeaf
+	 * 
 	 * @param identity
+	 * @param roles 
+	 * @param vfsLeaf
 	 * @param secCallback
+	 *
 	 * @return
 	 */
-	public boolean hasEditor(VFSLeaf vfsLeaf, Identity identity, DocEditorSecurityCallback secCallback);
+	public boolean hasEditor(Identity identity, Roles roles, VFSLeaf vfsLeaf, DocEditorSecurityCallback secCallback);
 	
 }
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraEditor.java b/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraEditor.java
index 77234b93123e837c886fae68cd31e1415c6734e7..6650938c40e7afe4bf6ae384f1d957c62fea3b74 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraEditor.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraEditor.java
@@ -23,6 +23,7 @@ import java.util.Locale;
 
 import org.olat.core.commons.services.doceditor.DocEditor;
 import org.olat.core.commons.services.doceditor.DocEditorConfigs;
+import org.olat.core.commons.services.doceditor.DocEditorIdentityService;
 import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
 import org.olat.core.commons.services.doceditor.collabora.ui.CollaboraEditorController;
 import org.olat.core.gui.UserRequest;
@@ -30,6 +31,7 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.core.util.Util;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -48,6 +50,8 @@ public class CollaboraEditor implements DocEditor {
 	private CollaboraModule collaboraModule;
 	@Autowired
 	private CollaboraService collaboraService;
+	@Autowired
+	private DocEditorIdentityService identityService;
 
 	@Override
 	public boolean isEnable() {
@@ -70,6 +74,18 @@ public class CollaboraEditor implements DocEditor {
 		return collaboraModule.isDataTransferConfirmationEnabled();
 	}
 
+	@Override
+	public boolean isEnabledFor(Identity identity, Roles roles) {
+		if (collaboraModule.isUsageRestricted()) {
+			if (roles.isAdministrator()) return true;
+			if (collaboraModule.isUsageRestrictedToAuthors() && roles.isAuthor()) return true;
+			if (collaboraModule.isUsageRestrictedToManagers() && roles.isManager()) return true;
+			if (collaboraModule.isUsageRestrictedToCoaches() && identityService.isCoach(identity)) return true;
+			return false;
+		}
+		return true;
+	}
+
 	@Override
 	public boolean isSupportingFormat(String suffix, Mode mode, boolean hasMeta) {
 		return hasMeta && collaboraService.accepts(suffix, mode);
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraModule.java b/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraModule.java
index 6f479fc88ed0c66a61bab069a6f7f5df978dacc0..3553e7e4cb7afdec7489ed533b8255413a3758d4 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraModule.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraModule.java
@@ -39,6 +39,10 @@ public class CollaboraModule extends AbstractSpringModule implements ConfigOnOff
 	private static final String COLLABORA_ENABLED = "collabora.enabled";
 	private static final String COLLABORA_BASE_URL = "collabora.baseUrl";
 	private static final String COLLABORA_DATA_TRANSER_CONFIRMATION_ENABLED = "collabora.data.transfer.confirmation.enabled";
+	private static final String COLLABORA_USAGE_RESTRICTED = "collabora.usage.restricted";
+	private static final String COLLABORA_USAGE_AUTHORS = "collabora.usage.authors";
+	private static final String COLLABORA_USAGE_COACHES = "collabora.usage.coaches";
+	private static final String COLLABORA_USAGE_MANAGERS = "collabora.usage.managers";
 	
 	@Value("${collabora.enabled:false}")
 	private boolean enabled;
@@ -46,6 +50,14 @@ public class CollaboraModule extends AbstractSpringModule implements ConfigOnOff
 	private String baseUrl;
 	@Value("${collabora.data.transfer.confirmation.enabled:false}")
 	private boolean dataTransferConfirmationEnabled;
+	@Value("${collabora.usage.restricted:false}")
+	private boolean usageRestricted;
+	@Value("${collabora.usage.restricted.authors:false}")
+	private boolean usageRestrictedToAuthors;
+	@Value("${collabora.usage.restricted.coaches:false}")
+	private boolean usageRestrictedToCoaches;
+	@Value("${collabora.usage.restricted.managers:false}")
+	private boolean usageRestrictedToManagers;
 	
 	@Autowired
 	private CollaboraModule(CoordinatorManager coordinateManager) {
@@ -77,6 +89,26 @@ public class CollaboraModule extends AbstractSpringModule implements ConfigOnOff
 		if(StringHelper.containsNonWhitespace(dataTransferConfirmationEnabledObj)) {
 			dataTransferConfirmationEnabled = "true".equals(dataTransferConfirmationEnabledObj);
 		}
+		
+		String usageRestrictedObj = getStringPropertyValue(COLLABORA_USAGE_RESTRICTED, true);
+		if(StringHelper.containsNonWhitespace(usageRestrictedObj)) {
+			usageRestricted = "true".equals(usageRestrictedObj);
+		}
+		
+		String usageRestrictedToAuthorsObj = getStringPropertyValue(COLLABORA_USAGE_AUTHORS, true);
+		if(StringHelper.containsNonWhitespace(usageRestrictedToAuthorsObj)) {
+			usageRestrictedToAuthors = "true".equals(usageRestrictedToAuthorsObj);
+		}
+		
+		String usageRestrictedToCoachesObj = getStringPropertyValue(COLLABORA_USAGE_COACHES, true);
+		if(StringHelper.containsNonWhitespace(usageRestrictedToCoachesObj)) {
+			usageRestrictedToCoaches = "true".equals(usageRestrictedToCoachesObj);
+		}
+		
+		String usageRestrictedToManagersObj = getStringPropertyValue(COLLABORA_USAGE_MANAGERS, true);
+		if(StringHelper.containsNonWhitespace(usageRestrictedToManagersObj)) {
+			usageRestrictedToManagers = "true".equals(usageRestrictedToManagersObj);
+		}
 	}
 
 	@Override
@@ -106,4 +138,41 @@ public class CollaboraModule extends AbstractSpringModule implements ConfigOnOff
 		this.dataTransferConfirmationEnabled = dataTransferConfirmationEnabled;
 		setStringProperty(COLLABORA_DATA_TRANSER_CONFIRMATION_ENABLED, Boolean.toString(dataTransferConfirmationEnabled), true);
 	}
+
+	public boolean isUsageRestricted() {
+		return usageRestricted;
+	}
+
+	public void setUsageRestricted(boolean usageRestricted) {
+		this.usageRestricted = usageRestricted;
+		setStringProperty(COLLABORA_USAGE_RESTRICTED, Boolean.toString(usageRestricted), true);
+	}
+
+	public boolean isUsageRestrictedToAuthors() {
+		return usageRestrictedToAuthors;
+	}
+
+	public void setUsageRestrictedToAuthors(boolean usageRestrictedToAuthors) {
+		this.usageRestrictedToAuthors = usageRestrictedToAuthors;
+		setStringProperty(COLLABORA_USAGE_AUTHORS, Boolean.toString(usageRestrictedToAuthors), true);
+	}
+
+	public boolean isUsageRestrictedToCoaches() {
+		return usageRestrictedToCoaches;
+	}
+
+	public void setUsageRestrictedToCoaches(boolean usageRestrictedToCoaches) {
+		this.usageRestrictedToCoaches = usageRestrictedToCoaches;
+		setStringProperty(COLLABORA_USAGE_COACHES, Boolean.toString(usageRestrictedToCoaches), true);
+	}
+
+	public boolean isUsageRestrictedToManagers() {
+		return usageRestrictedToManagers;
+	}
+
+	public void setUsageRestrictedToManagers(boolean usageRestrictedToManagers) {
+		this.usageRestrictedToManagers = usageRestrictedToManagers;
+		setStringProperty(COLLABORA_USAGE_MANAGERS, Boolean.toString(usageRestrictedToManagers), true);
+	}
+	
 }
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraAdminController.java b/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraAdminController.java
index fbd34b6a18eb7f39aa2e7b3589d80a2ca1910b09..9ac9bbaa41c7a6f2bfa8429ffe80aa00d544ee0c 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraAdminController.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraAdminController.java
@@ -21,8 +21,11 @@ package org.olat.core.commons.services.doceditor.collabora.ui;
 
 import static org.olat.core.commons.services.doceditor.collabora.CollaboraService.REFRESH_EVENT_ORES;
 import static org.olat.core.commons.services.doceditor.collabora.ui.CollaboraUIFactory.validateIsMandatory;
+import static org.olat.core.gui.components.util.KeyValues.entry;
 import static org.olat.core.gui.translator.TranslatorHelper.translateAll;
 
+import java.util.Collection;
+
 import org.apache.logging.log4j.Logger;
 import org.olat.core.commons.services.doceditor.collabora.CollaboraModule;
 import org.olat.core.commons.services.doceditor.collabora.CollaboraRefreshDiscoveryEvent;
@@ -39,6 +42,7 @@ 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.link.Link;
+import org.olat.core.gui.components.util.KeyValues;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.helpers.Settings;
@@ -58,12 +62,17 @@ public class CollaboraAdminController extends FormBasicController {
 	private static final Logger log = Tracing.createLoggerFor(CollaboraAdminController.class);
 
 	private static final String[] ENABLED_KEYS = new String[]{"on"};
+	private static final String USAGE_AUTHOR = "author";
+	private static final String USAGE_COACH = "coach";
+	private static final String USAGE_MANAGERS = "managers";
 	
 	private MultipleSelectionElement enabledEl;
 	private TextElement baseUrlEl;
 	private FormLink refreshDiscoveryLink;
 	private FormLink testLink;
 	private MultipleSelectionElement dataTransferConfirmationEnabledEl;
+	private MultipleSelectionElement usageRestrictedEl;
+	private MultipleSelectionElement usageRolesEl;
 
 	@Autowired
 	private CollaboraModule collaboraModule;
@@ -96,6 +105,22 @@ public class CollaboraAdminController extends FormBasicController {
 				translateAll(getTranslator(), ENABLED_KEYS));
 		dataTransferConfirmationEnabledEl.select(ENABLED_KEYS[0], collaboraModule.isDataTransferConfirmationEnabled());
 		
+		usageRestrictedEl = uifactory.addCheckboxesHorizontal("admin.usage.restricted", formLayout, ENABLED_KEYS,
+				translateAll(getTranslator(), ENABLED_KEYS));
+		usageRestrictedEl.setHelpTextKey("admin.usage.restricted.help", null);
+		usageRestrictedEl.select(ENABLED_KEYS[0], collaboraModule.isUsageRestricted());
+		usageRestrictedEl.addActionListener(FormEvent.ONCHANGE);
+		
+		KeyValues usageRolesKV = new KeyValues();
+		usageRolesKV.add(entry(USAGE_AUTHOR, translate("admin.usage.roles.author")));
+		usageRolesKV.add(entry(USAGE_COACH, translate("admin.usage.roles.coach")));
+		usageRolesKV.add(entry(USAGE_MANAGERS, translate("admin.usage.roles.managers")));
+		usageRolesEl = uifactory.addCheckboxesVertical("admin.usage.roles", formLayout, usageRolesKV.keys(), usageRolesKV.values(), 1);
+		usageRolesEl.select(USAGE_AUTHOR, collaboraModule.isUsageRestrictedToAuthors());
+		usageRolesEl.select(USAGE_COACH, collaboraModule.isUsageRestrictedToCoaches());
+		usageRolesEl.select(USAGE_MANAGERS, collaboraModule.isUsageRestrictedToManagers());
+		updateUsageUI();
+		
 		if (Settings.isDebuging()) {
 			testLink = uifactory.addFormLink("admin.test", formLayout, Link.BUTTON);
 		}
@@ -109,12 +134,19 @@ public class CollaboraAdminController extends FormBasicController {
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
 		if (source == refreshDiscoveryLink) {
 			doRefreshDiscovery();
+		} else if (source == usageRestrictedEl) {
+			updateUsageUI();
 		} else if (source == testLink) {
 			doTest();
 		}
 		super.formInnerEvent(ureq, source, event);
 	}
 	
+	private void updateUsageUI() {
+		boolean usageRestricted = usageRestrictedEl.isAtLeastSelected(1);
+		usageRolesEl.setVisible(usageRestricted);
+	}
+
 	@Override
 	protected boolean validateFormLogic(UserRequest ureq) {
 		boolean allOk = true;
@@ -141,6 +173,14 @@ public class CollaboraAdminController extends FormBasicController {
 		
 		boolean dataTransferConfirmationEnabled = dataTransferConfirmationEnabledEl.isAtLeastSelected(1);
 		collaboraModule.setDataTransferConfirmationEnabled(dataTransferConfirmationEnabled);
+		
+		boolean usageRestricted = usageRestrictedEl.isAtLeastSelected(1);
+		collaboraModule.setUsageRestricted(usageRestricted);
+		
+		Collection<String> restrictionKeys = usageRolesEl.getSelectedKeys();
+		collaboraModule.setUsageRestrictedToAuthors(restrictionKeys.contains(USAGE_AUTHOR));
+		collaboraModule.setUsageRestrictedToCoaches(restrictionKeys.contains(USAGE_COACH));
+		collaboraModule.setUsageRestrictedToManagers(restrictionKeys.contains(USAGE_MANAGERS));
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/manager/DocEditorIdentityServiceImpl.java b/src/main/java/org/olat/core/commons/services/doceditor/manager/DocEditorIdentityServiceImpl.java
index 5535c39e60da1d8334ba986c6169a00508168155..fad7a80c216783c022929842ab2de66e4d947f75 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/manager/DocEditorIdentityServiceImpl.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/manager/DocEditorIdentityServiceImpl.java
@@ -19,8 +19,13 @@
  */
 package org.olat.core.commons.services.doceditor.manager;
 
+import java.util.Collections;
+import java.util.List;
+
 import org.apache.logging.log4j.Logger;
 import org.olat.basesecurity.BaseSecurityManager;
+import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.SearchIdentityParams;
 import org.olat.core.commons.services.doceditor.DocEditorIdentityService;
 import org.olat.core.id.Identity;
 import org.olat.core.logging.Tracing;
@@ -70,4 +75,13 @@ public class DocEditorIdentityServiceImpl implements DocEditorIdentityService {
 		return userManager.getUserDisplayName(identity);
 	}
 
+	@Override
+	public boolean isCoach(Identity identity) {
+		SearchIdentityParams params = new SearchIdentityParams();
+		params.setIdentityKeys(Collections.singletonList(identity.getKey()));
+		params.setRepositoryEntryRole(GroupRoles.coach);
+		List<Identity> identities = securityManager.getIdentitiesByPowerSearch(params , 0, 1);
+		return !identities.isEmpty();
+	}
+
 }
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/manager/DocumentEditorServiceImpl.java b/src/main/java/org/olat/core/commons/services/doceditor/manager/DocumentEditorServiceImpl.java
index 2078998887a292470146799df80f617450a3969d..9d6664523ee7104254834e379592c3632d00fbf6 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/manager/DocumentEditorServiceImpl.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/manager/DocumentEditorServiceImpl.java
@@ -28,6 +28,7 @@ import org.olat.core.commons.services.doceditor.DocEditor.Mode;
 import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
 import org.olat.core.commons.services.doceditor.DocumentEditorService;
 import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -46,20 +47,22 @@ public class DocumentEditorServiceImpl implements DocumentEditorService {
 	private List<DocEditor> editors;
 	
 	@Override
-	public boolean hasEditor(String suffix, Mode mode, boolean hasMeta) {
+	public boolean hasEditor(Identity identity, Roles roles, String suffix, Mode mode, boolean hasMeta) {
 		if (mode == null) return false;
 		
 		return editors.stream()
 				.filter(DocEditor::isEnable)
+				.filter(editor -> editor.isEnabledFor(identity, roles))
 				.filter(editor -> editor.isSupportingFormat(suffix, mode, hasMeta))
 				.findFirst()
 				.isPresent();
 	}
 
 	@Override
-	public List<DocEditor> getEditors(String suffix, Mode mode, boolean hasMeta) {
+	public List<DocEditor> getEditors(Identity identity, Roles roles, String suffix, Mode mode, boolean hasMeta) {
 		return editors.stream()
 				.filter(DocEditor::isEnable)
+				.filter(editor -> editor.isEnabledFor(identity, roles))
 				.filter(editor -> editor.isSupportingFormat(suffix, mode, hasMeta))
 				.collect(Collectors.toList());
 	}
@@ -73,14 +76,17 @@ public class DocumentEditorServiceImpl implements DocumentEditorService {
 	}
 	
 	@Override
-	public boolean hasEditor(VFSLeaf vfsLeaf, Identity identity, DocEditorSecurityCallback secCallback) {
+	public boolean hasEditor(Identity identity, Roles roles, VFSLeaf vfsLeaf, DocEditorSecurityCallback secCallback) {
 		String suffix = FileUtils.getFileSuffix(vfsLeaf.getName());
 		return editors.stream()
 				.filter(DocEditor::isEnable)
+				.filter(editor -> editor.isEnabledFor(identity, roles))
 				.filter(editor -> editor.isSupportingFormat(suffix, secCallback.getMode(), secCallback.hasMeta()))
 				.filter(editor -> !editor.isLockedForMe(vfsLeaf, identity, secCallback.getMode()))
 				.findFirst()
 				.isPresent();
 	}
+	
+	
 
 }
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Editor.java b/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Editor.java
index 56adbb767f7b4f66323e52980c44d87086683e96..69c031678be952bdceb794ea5c217bdea909b494 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Editor.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Editor.java
@@ -23,6 +23,7 @@ import java.util.Locale;
 
 import org.olat.core.commons.services.doceditor.DocEditor;
 import org.olat.core.commons.services.doceditor.DocEditorConfigs;
+import org.olat.core.commons.services.doceditor.DocEditorIdentityService;
 import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
 import org.olat.core.commons.services.doceditor.office365.ui.Office365EditorController;
 import org.olat.core.gui.UserRequest;
@@ -30,6 +31,7 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.core.util.Util;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -48,6 +50,8 @@ public class Office365Editor implements DocEditor {
 	private Office365Module office365Module;
 	@Autowired
 	private Office365Service office365Service;
+	@Autowired
+	private DocEditorIdentityService identityService;
 
 	@Override
 	public boolean isEnable() {
@@ -70,6 +74,18 @@ public class Office365Editor implements DocEditor {
 		return office365Module.isDataTransferConfirmationEnabled();
 	}
 
+	@Override
+	public boolean isEnabledFor(Identity identity, Roles roles) {
+		if (office365Module.isUsageRestricted()) {
+			if (roles.isAdministrator()) return true;
+			if (office365Module.isUsageRestrictedToAuthors() && roles.isAuthor()) return true;
+			if (office365Module.isUsageRestrictedToManagers() && roles.isManager()) return true;
+			if (office365Module.isUsageRestrictedToCoaches() && identityService.isCoach(identity)) return true;
+			return false;
+		}
+		return true;
+	}
+
 	@Override
 	public boolean isSupportingFormat(String suffix, Mode mode, boolean hasMeta) {
 		return hasMeta && office365Service.isSupportingFormat(suffix, mode);
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Module.java b/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Module.java
index ff547027a9b540d1adc737f097a4535f0af081d8..bb62ef740c29ac96ca307404c6500b55e6678df5 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Module.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Module.java
@@ -39,6 +39,10 @@ public class Office365Module extends AbstractSpringModule implements ConfigOnOff
 	private static final String OFFICE365_ENABLED = "office365.enabled";
 	private static final String OFFICE365_BASE_URL = "office365.baseUrl";
 	private static final String OFFICE365_DATA_TRANSER_CONFIRMATION_ENABLED = "office365.data.transfer.confirmation.enabled";
+	private static final String OFFICE365_USAGE_RESTRICTED = "office365.usage.restricted";
+	private static final String OFFICE365_USAGE_AUTHORS = "office365.usage.authors";
+	private static final String OFFICE365_USAGE_COACHES = "office365.usage.coaches";
+	private static final String OFFICE365_USAGE_MANAGERS = "office365.usage.managers";
 	
 	@Value("${office365.enabled:false}")
 	private boolean enabled;
@@ -46,6 +50,14 @@ public class Office365Module extends AbstractSpringModule implements ConfigOnOff
 	private String baseUrl;
 	@Value("${office365.data.transfer.confirmation.enabled:false}")
 	private boolean dataTransferConfirmationEnabled;
+	@Value("${office365.usage.restricted:false}")
+	private boolean usageRestricted;
+	@Value("${office365.usage.restricted.authors:false}")
+	private boolean usageRestrictedToAuthors;
+	@Value("${office365.usage.restricted.coaches:false}")
+	private boolean usageRestrictedToCoaches;
+	@Value("${office365.usage.restricted.managers:false}")
+	private boolean usageRestrictedToManagers;
 	
 	@Autowired
 	private Office365Module(CoordinatorManager coordinateManager) {
@@ -77,6 +89,26 @@ public class Office365Module extends AbstractSpringModule implements ConfigOnOff
 		if(StringHelper.containsNonWhitespace(dataTransferConfirmationEnabledObj)) {
 			dataTransferConfirmationEnabled = "true".equals(dataTransferConfirmationEnabledObj);
 		}
+		
+		String usageRestrictedObj = getStringPropertyValue(OFFICE365_USAGE_RESTRICTED, true);
+		if(StringHelper.containsNonWhitespace(usageRestrictedObj)) {
+			usageRestricted = "true".equals(usageRestrictedObj);
+		}
+		
+		String usageRestrictedToAuthorsObj = getStringPropertyValue(OFFICE365_USAGE_AUTHORS, true);
+		if(StringHelper.containsNonWhitespace(usageRestrictedToAuthorsObj)) {
+			usageRestrictedToAuthors = "true".equals(usageRestrictedToAuthorsObj);
+		}
+		
+		String usageRestrictedToCoachesObj = getStringPropertyValue(OFFICE365_USAGE_COACHES, true);
+		if(StringHelper.containsNonWhitespace(usageRestrictedToCoachesObj)) {
+			usageRestrictedToCoaches = "true".equals(usageRestrictedToCoachesObj);
+		}
+		
+		String usageRestrictedToManagersObj = getStringPropertyValue(OFFICE365_USAGE_MANAGERS, true);
+		if(StringHelper.containsNonWhitespace(usageRestrictedToManagersObj)) {
+			usageRestrictedToManagers = "true".equals(usageRestrictedToManagersObj);
+		}
 	}
 
 	@Override
@@ -106,4 +138,40 @@ public class Office365Module extends AbstractSpringModule implements ConfigOnOff
 		this.dataTransferConfirmationEnabled = dataTransferConfirmationEnabled;
 		setStringProperty(OFFICE365_DATA_TRANSER_CONFIRMATION_ENABLED, Boolean.toString(dataTransferConfirmationEnabled), true);
 	}
+
+	public boolean isUsageRestricted() {
+		return usageRestricted;
+	}
+
+	public void setUsageRestricted(boolean usageRestricted) {
+		this.usageRestricted = usageRestricted;
+		setStringProperty(OFFICE365_USAGE_RESTRICTED, Boolean.toString(usageRestricted), true);
+	}
+
+	public boolean isUsageRestrictedToAuthors() {
+		return usageRestrictedToAuthors;
+	}
+
+	public void setUsageRestrictedToAuthors(boolean usageRestrictedToAuthors) {
+		this.usageRestrictedToAuthors = usageRestrictedToAuthors;
+		setStringProperty(OFFICE365_USAGE_AUTHORS, Boolean.toString(usageRestrictedToAuthors), true);
+	}
+
+	public boolean isUsageRestrictedToCoaches() {
+		return usageRestrictedToCoaches;
+	}
+
+	public void setUsageRestrictedToCoaches(boolean usageRestrictedToCoaches) {
+		this.usageRestrictedToCoaches = usageRestrictedToCoaches;
+		setStringProperty(OFFICE365_USAGE_COACHES, Boolean.toString(usageRestrictedToCoaches), true);
+	}
+
+	public boolean isUsageRestrictedToManagers() {
+		return usageRestrictedToManagers;
+	}
+
+	public void setUsageRestrictedToManagers(boolean usageRestrictedToManagers) {
+		this.usageRestrictedToManagers = usageRestrictedToManagers;
+		setStringProperty(OFFICE365_USAGE_MANAGERS, Boolean.toString(usageRestrictedToManagers), true);
+	}
 }
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/office365/ui/Office365AdminController.java b/src/main/java/org/olat/core/commons/services/doceditor/office365/ui/Office365AdminController.java
index 2be352fe89a0016ecea5273f607f66e83ed12129..856d349baa51f246bf6493dda950f8ee54a16131 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/office365/ui/Office365AdminController.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/office365/ui/Office365AdminController.java
@@ -21,8 +21,11 @@ package org.olat.core.commons.services.doceditor.office365.ui;
 
 import static org.olat.core.commons.services.doceditor.office365.Office365Service.REFRESH_EVENT_ORES;
 import static org.olat.core.commons.services.doceditor.office365.ui.Office365UIFactory.validateIsMandatory;
+import static org.olat.core.gui.components.util.KeyValues.entry;
 import static org.olat.core.gui.translator.TranslatorHelper.translateAll;
 
+import java.util.Collection;
+
 import org.olat.core.commons.services.doceditor.office365.Office365Module;
 import org.olat.core.commons.services.doceditor.office365.Office365RefreshDiscoveryEvent;
 import org.olat.core.commons.services.doceditor.ui.DocEditorController;
@@ -36,6 +39,7 @@ 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.link.Link;
+import org.olat.core.gui.components.util.KeyValues;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.util.Util;
@@ -51,11 +55,16 @@ import org.springframework.beans.factory.annotation.Autowired;
 public class Office365AdminController extends FormBasicController {
 
 	private static final String[] ENABLED_KEYS = new String[]{"on"};
+	private static final String USAGE_AUTHOR = "author";
+	private static final String USAGE_COACH = "coach";
+	private static final String USAGE_MANAGERS = "managers";
 	
 	private MultipleSelectionElement enabledEl;
 	private TextElement baseUrlEl;
 	private FormLink refreshDiscoveryLink;
 	private MultipleSelectionElement dataTransferConfirmationEnabledEl;
+	private MultipleSelectionElement usageRestrictedEl;
+	private MultipleSelectionElement usageRolesEl;
 
 	@Autowired
 	private Office365Module office365Module;
@@ -86,6 +95,22 @@ public class Office365AdminController extends FormBasicController {
 				translateAll(getTranslator(), ENABLED_KEYS));
 		dataTransferConfirmationEnabledEl.select(ENABLED_KEYS[0], office365Module.isDataTransferConfirmationEnabled());
 		
+		usageRestrictedEl = uifactory.addCheckboxesHorizontal("admin.usage.restricted", formLayout, ENABLED_KEYS,
+				translateAll(getTranslator(), ENABLED_KEYS));
+		usageRestrictedEl.setHelpTextKey("admin.usage.restricted.help", null);
+		usageRestrictedEl.select(ENABLED_KEYS[0], office365Module.isUsageRestricted());
+		usageRestrictedEl.addActionListener(FormEvent.ONCHANGE);
+		
+		KeyValues usageRolesKV = new KeyValues();
+		usageRolesKV.add(entry(USAGE_AUTHOR, translate("admin.usage.roles.author")));
+		usageRolesKV.add(entry(USAGE_COACH, translate("admin.usage.roles.coach")));
+		usageRolesKV.add(entry(USAGE_MANAGERS, translate("admin.usage.roles.managers")));
+		usageRolesEl = uifactory.addCheckboxesVertical("admin.usage.roles", formLayout, usageRolesKV.keys(), usageRolesKV.values(), 1);
+		usageRolesEl.select(USAGE_AUTHOR, office365Module.isUsageRestrictedToAuthors());
+		usageRolesEl.select(USAGE_COACH, office365Module.isUsageRestrictedToCoaches());
+		usageRolesEl.select(USAGE_MANAGERS, office365Module.isUsageRestrictedToManagers());
+		updateUsageUI();
+		
 		FormLayoutContainer buttonLayout = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
 		formLayout.add("buttons", buttonLayout);
 		uifactory.addFormSubmitButton("save", buttonLayout);
@@ -95,10 +120,17 @@ public class Office365AdminController extends FormBasicController {
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
 		if (source == refreshDiscoveryLink) {
 			doRefreshDiscovery();
+		} else if (source == usageRestrictedEl) {
+			updateUsageUI();
 		}
 		super.formInnerEvent(ureq, source, event);
 	}
 	
+	private void updateUsageUI() {
+		boolean usageRestricted = usageRestrictedEl.isAtLeastSelected(1);
+		usageRolesEl.setVisible(usageRestricted);
+	}
+	
 	@Override
 	protected boolean validateFormLogic(UserRequest ureq) {
 		boolean allOk = true;
@@ -125,6 +157,14 @@ public class Office365AdminController extends FormBasicController {
 		
 		boolean dataTransferConfirmationEnabled = dataTransferConfirmationEnabledEl.isAtLeastSelected(1);
 		office365Module.setDataTransferConfirmationEnabled(dataTransferConfirmationEnabled);
+		
+		boolean usageRestricted = usageRestrictedEl.isAtLeastSelected(1);
+		office365Module.setUsageRestricted(usageRestricted);
+		
+		Collection<String> restrictionKeys = usageRolesEl.getSelectedKeys();
+		office365Module.setUsageRestrictedToAuthors(restrictionKeys.contains(USAGE_AUTHOR));
+		office365Module.setUsageRestrictedToCoaches(restrictionKeys.contains(USAGE_COACH));
+		office365Module.setUsageRestrictedToManagers(restrictionKeys.contains(USAGE_MANAGERS));
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/office365/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/commons/services/doceditor/office365/ui/_i18n/LocalStrings_de.properties
index ebee7f02985ebedb86e766c67e68d5dc0e9b6538..43355a5a3ad23b408a5c70f4545540556ce5f9a2 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/office365/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/core/commons/services/doceditor/office365/ui/_i18n/LocalStrings_de.properties
@@ -1,4 +1,4 @@
-dmin.desc=Office 365 erm\u00F6glicht es Ihren Benutzern, Excel-, PowerPoint- und Word-Dateien direkt im Browser anzuzeigen und zu bearbeiten. Weitere Informationen sind auf der <a href\="http\://www.office.com/" target\=_blank>Webseite</a> von Microsoft zu finden.
+admin.desc=Office 365 erm\u00F6glicht es Ihren Benutzern, Excel-, PowerPoint- und Word-Dateien direkt im Browser anzuzeigen und zu bearbeiten. Weitere Informationen sind auf der <a href\="http\://www.office.com/" target\=_blank>Webseite</a> von Microsoft zu finden.
 admin.enabled=Modul "Office 365"
 admin.title=Office 365
 admin.refresh.discovery.label=WOPI Discovery aktualisieren
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeEditor.java b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeEditor.java
index 8b8f3e867bb88b246c055aefba7b0e58d274857a..2e8ea713429e616d18591560683e62dd9e7fa03b 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeEditor.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeEditor.java
@@ -23,6 +23,7 @@ import java.util.Locale;
 
 import org.olat.core.commons.services.doceditor.DocEditor;
 import org.olat.core.commons.services.doceditor.DocEditorConfigs;
+import org.olat.core.commons.services.doceditor.DocEditorIdentityService;
 import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
 import org.olat.core.commons.services.doceditor.onlyoffice.ui.OnlyOfficeEditorController;
 import org.olat.core.gui.UserRequest;
@@ -30,6 +31,7 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.core.util.Util;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -48,6 +50,8 @@ public class OnlyOfficeEditor implements DocEditor {
 	private OnlyOfficeModule onlyOfficeModule;
 	@Autowired
 	private OnlyOfficeService onlyOfficeService;
+	@Autowired
+	private DocEditorIdentityService identityService;
 
 	@Override
 	public boolean isEnable() {
@@ -70,6 +74,18 @@ public class OnlyOfficeEditor implements DocEditor {
 		return onlyOfficeModule.isDataTransferConfirmationEnabled();
 	}
 
+	@Override
+	public boolean isEnabledFor(Identity identity, Roles roles) {
+		if (onlyOfficeModule.isUsageRestricted()) {
+			if (roles.isAdministrator()) return true;
+			if (onlyOfficeModule.isUsageRestrictedToAuthors() && roles.isAuthor()) return true;
+			if (onlyOfficeModule.isUsageRestrictedToManagers() && roles.isManager()) return true;
+			if (onlyOfficeModule.isUsageRestrictedToCoaches() && identityService.isCoach(identity)) return true;
+			return false;
+		}
+		return true;
+	}
+
 	@Override
 	public boolean isSupportingFormat(String suffix, Mode mode, boolean hasMeta) {
 		return hasMeta && onlyOfficeService.isSupportedFormat(suffix, mode);
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeModule.java b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeModule.java
index 5813d7a1f7a39d98f22dd0de95f154ae6f8d5cf3..a74644db2fb9d639091475baf14ee71ef996aca2 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeModule.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeModule.java
@@ -21,9 +21,9 @@ package org.olat.core.commons.services.doceditor.onlyoffice;
 
 import java.security.Key;
 
+import org.apache.logging.log4j.Logger;
 import org.olat.core.configuration.AbstractSpringModule;
 import org.olat.core.configuration.ConfigOnOff;
-import org.apache.logging.log4j.Logger;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.coordinate.CoordinatorManager;
@@ -48,6 +48,10 @@ public class OnlyOfficeModule extends AbstractSpringModule implements ConfigOnOf
 	private static final String ONLYOFFICE_BASE_URL = "onlyoffice.baseUrl";
 	private static final String ONLYOFFICE_JWT_SECRET = "onlyoffice.jwt.secret";
 	private static final String ONLYOFFICE_DATA_TRANSER_CONFIRMATION_ENABLED = "onlyoffice.data.transfer.confirmation.enabled";
+	private static final String ONLYOFFICE_USAGE_RESTRICTED = "onlyoffice.usage.restricted";
+	private static final String ONLYOFFICE_USAGE_AUTHORS = "onlyoffice.usage.authors";
+	private static final String ONLYOFFICE_USAGE_COACHES = "onlyoffice.usage.coaches";
+	private static final String ONLYOFFICE_USAGE_MANAGERS = "onlyoffice.usage.managers";
 	
 	@Value("${onlyoffice.enabled:false}")
 	private boolean enabled;
@@ -60,6 +64,14 @@ public class OnlyOfficeModule extends AbstractSpringModule implements ConfigOnOf
 	private Key jwtSignKey;
 	@Value("${onlyoffice.data.transfer.confirmation.enabled:false}")
 	private boolean dataTransferConfirmationEnabled;
+	@Value("${onlyoffice.usage.restricted:false}")
+	private boolean usageRestricted;
+	@Value("${onlyoffice.usage.restricted.authors:false}")
+	private boolean usageRestrictedToAuthors;
+	@Value("${onlyoffice.usage.restricted.coaches:false}")
+	private boolean usageRestrictedToCoaches;
+	@Value("${onlyoffice.usage.restricted.managers:false}")
+	private boolean usageRestrictedToManagers;
 	
 	@Autowired
 	private OnlyOfficeModule(CoordinatorManager coordinateManager) {
@@ -97,6 +109,26 @@ public class OnlyOfficeModule extends AbstractSpringModule implements ConfigOnOf
 		if(StringHelper.containsNonWhitespace(dataTransferConfirmationEnabledObj)) {
 			dataTransferConfirmationEnabled = "true".equals(dataTransferConfirmationEnabledObj);
 		}
+		
+		String usageRestrictedObj = getStringPropertyValue(ONLYOFFICE_USAGE_RESTRICTED, true);
+		if(StringHelper.containsNonWhitespace(usageRestrictedObj)) {
+			usageRestricted = "true".equals(usageRestrictedObj);
+		}
+		
+		String usageRestrictedToAuthorsObj = getStringPropertyValue(ONLYOFFICE_USAGE_AUTHORS, true);
+		if(StringHelper.containsNonWhitespace(usageRestrictedToAuthorsObj)) {
+			usageRestrictedToAuthors = "true".equals(usageRestrictedToAuthorsObj);
+		}
+		
+		String usageRestrictedToCoachesObj = getStringPropertyValue(ONLYOFFICE_USAGE_COACHES, true);
+		if(StringHelper.containsNonWhitespace(usageRestrictedToCoachesObj)) {
+			usageRestrictedToCoaches = "true".equals(usageRestrictedToCoachesObj);
+		}
+		
+		String usageRestrictedToManagersObj = getStringPropertyValue(ONLYOFFICE_USAGE_MANAGERS, true);
+		if(StringHelper.containsNonWhitespace(usageRestrictedToManagersObj)) {
+			usageRestrictedToManagers = "true".equals(usageRestrictedToManagersObj);
+		}
 	}
 
 	@Override
@@ -157,4 +189,40 @@ public class OnlyOfficeModule extends AbstractSpringModule implements ConfigOnOf
 		setStringProperty(ONLYOFFICE_DATA_TRANSER_CONFIRMATION_ENABLED, Boolean.toString(dataTransferConfirmationEnabled), true);
 	}
 
+	public boolean isUsageRestricted() {
+		return usageRestricted;
+	}
+
+	public void setUsageRestricted(boolean usageRestricted) {
+		this.usageRestricted = usageRestricted;
+		setStringProperty(ONLYOFFICE_USAGE_RESTRICTED, Boolean.toString(usageRestricted), true);
+	}
+
+	public boolean isUsageRestrictedToAuthors() {
+		return usageRestrictedToAuthors;
+	}
+
+	public void setUsageRestrictedToAuthors(boolean usageRestrictedToAuthors) {
+		this.usageRestrictedToAuthors = usageRestrictedToAuthors;
+		setStringProperty(ONLYOFFICE_USAGE_AUTHORS, Boolean.toString(usageRestrictedToAuthors), true);
+	}
+
+	public boolean isUsageRestrictedToCoaches() {
+		return usageRestrictedToCoaches;
+	}
+
+	public void setUsageRestrictedToCoaches(boolean usageRestrictedToCoaches) {
+		this.usageRestrictedToCoaches = usageRestrictedToCoaches;
+		setStringProperty(ONLYOFFICE_USAGE_COACHES, Boolean.toString(usageRestrictedToCoaches), true);
+	}
+
+	public boolean isUsageRestrictedToManagers() {
+		return usageRestrictedToManagers;
+	}
+
+	public void setUsageRestrictedToManagers(boolean usageRestrictedToManagers) {
+		this.usageRestrictedToManagers = usageRestrictedToManagers;
+		setStringProperty(ONLYOFFICE_USAGE_MANAGERS, Boolean.toString(usageRestrictedToManagers), true);
+	}
+
 }
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/ui/OnlyOfficeAdminController.java b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/ui/OnlyOfficeAdminController.java
index 27d3febc159033aeae4a89ca48f3a5c0660af700..3978b065c3817f754e214908b839845afc3da712 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/ui/OnlyOfficeAdminController.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/ui/OnlyOfficeAdminController.java
@@ -20,17 +20,23 @@
 package org.olat.core.commons.services.doceditor.onlyoffice.ui;
 
 import static org.olat.core.commons.services.doceditor.onlyoffice.ui.OnlyOfficeUIFactory.validateIsMandatory;
+import static org.olat.core.gui.components.util.KeyValues.entry;
 import static org.olat.core.gui.translator.TranslatorHelper.translateAll;
 
+import java.util.Collection;
+
 import org.olat.core.commons.services.doceditor.onlyoffice.OnlyOfficeModule;
 import org.olat.core.commons.services.doceditor.onlyoffice.OnlyOfficeSecurityService;
 import org.olat.core.commons.services.doceditor.ui.DocEditorController;
 import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
 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.util.KeyValues;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.util.Util;
@@ -45,11 +51,16 @@ import org.springframework.beans.factory.annotation.Autowired;
 public class OnlyOfficeAdminController extends FormBasicController {
 
 	private static final String[] ENABLED_KEYS = new String[]{"on"};
+	private static final String USAGE_AUTHOR = "author";
+	private static final String USAGE_COACH = "coach";
+	private static final String USAGE_MANAGERS = "managers";
 	
 	private MultipleSelectionElement enabledEl;
 	private TextElement baseUrlEl;
 	private TextElement jwtSecretEl;
 	private MultipleSelectionElement dataTransferConfirmationEnabledEl;
+	private MultipleSelectionElement usageRestrictedEl;
+	private MultipleSelectionElement usageRolesEl;
 
 	@Autowired
 	private OnlyOfficeModule onlyOfficeModule;
@@ -83,10 +94,38 @@ public class OnlyOfficeAdminController extends FormBasicController {
 				translateAll(getTranslator(), ENABLED_KEYS));
 		dataTransferConfirmationEnabledEl.select(ENABLED_KEYS[0], onlyOfficeModule.isDataTransferConfirmationEnabled());
 		
+		usageRestrictedEl = uifactory.addCheckboxesHorizontal("admin.usage.restricted", formLayout, ENABLED_KEYS,
+				translateAll(getTranslator(), ENABLED_KEYS));
+		usageRestrictedEl.setHelpTextKey("admin.usage.restricted.help", null);
+		usageRestrictedEl.select(ENABLED_KEYS[0], onlyOfficeModule.isUsageRestricted());
+		usageRestrictedEl.addActionListener(FormEvent.ONCHANGE);
+		
+		KeyValues usageRolesKV = new KeyValues();
+		usageRolesKV.add(entry(USAGE_AUTHOR, translate("admin.usage.roles.author")));
+		usageRolesKV.add(entry(USAGE_COACH, translate("admin.usage.roles.coach")));
+		usageRolesKV.add(entry(USAGE_MANAGERS, translate("admin.usage.roles.managers")));
+		usageRolesEl = uifactory.addCheckboxesVertical("admin.usage.roles", formLayout, usageRolesKV.keys(), usageRolesKV.values(), 1);
+		usageRolesEl.select(USAGE_AUTHOR, onlyOfficeModule.isUsageRestrictedToAuthors());
+		usageRolesEl.select(USAGE_COACH, onlyOfficeModule.isUsageRestrictedToCoaches());
+		usageRolesEl.select(USAGE_MANAGERS, onlyOfficeModule.isUsageRestrictedToManagers());
+		updateUsageUI();
+		
 		FormLayoutContainer buttonLayout = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
 		formLayout.add("buttons", buttonLayout);
 		uifactory.addFormSubmitButton("save", buttonLayout);
 	}
+	@Override
+	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
+		if (source == usageRestrictedEl) {
+			updateUsageUI();
+		}
+		super.formInnerEvent(ureq, source, event);
+	}
+	
+	private void updateUsageUI() {
+		boolean usageRestricted = usageRestrictedEl.isAtLeastSelected(1);
+		usageRolesEl.setVisible(usageRestricted);
+	}
 	
 	@Override
 	protected boolean validateFormLogic(UserRequest ureq) {
@@ -120,6 +159,14 @@ public class OnlyOfficeAdminController extends FormBasicController {
 		
 		boolean dataTransferConfirmationEnabled = dataTransferConfirmationEnabledEl.isAtLeastSelected(1);
 		onlyOfficeModule.setDataTransferConfirmationEnabled(dataTransferConfirmationEnabled);
+		
+		boolean usageRestricted = usageRestrictedEl.isAtLeastSelected(1);
+		onlyOfficeModule.setUsageRestricted(usageRestricted);
+		
+		Collection<String> restrictionKeys = usageRolesEl.getSelectedKeys();
+		onlyOfficeModule.setUsageRestrictedToAuthors(restrictionKeys.contains(USAGE_AUTHOR));
+		onlyOfficeModule.setUsageRestrictedToCoaches(restrictionKeys.contains(USAGE_COACH));
+		onlyOfficeModule.setUsageRestrictedToManagers(restrictionKeys.contains(USAGE_MANAGERS));
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorConfigController.java b/src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorConfigController.java
index c34c132099ab3af46d95b365e89d20580545d7db..6e91e28ccc31670ce4ebd7effa2aa6e8b3b941f6 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorConfigController.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorConfigController.java
@@ -67,7 +67,8 @@ public class DocEditorConfigController extends BasicController implements Activa
 		super(ureq, wControl);
 		this.guiEditorKey = getGuiPrefixKey(vfsLeaf);
 		String suffix = FileUtils.getFileSuffix(vfsLeaf.getName());
-		editors = editorService.getEditors(suffix, secCallback.getMode(), secCallback.hasMeta());
+		editors = editorService.getEditors(getIdentity(), ureq.getUserSession().getRoles(), suffix,
+				secCallback.getMode(), secCallback.hasMeta());
 		
 		VelocityContainer mainVC = createVelocityContainer("editor_config");
 		
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_de.properties
index 03f637b7ab71460bd27bfface00b0c276d584efc..65b5767a63494a668244041a4c2ccdfa59f23506 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_de.properties
@@ -4,6 +4,12 @@ admin.menu.title.alt=Dokumenteneditoren
 admin.menu.title=Dokumenteneditoren
 admin.office365=$org.olat.core.commons.services.doceditor.office365.ui\:editor.display.name
 admin.onlyoffice=$org.olat.core.commons.services.doceditor.onlyoffice.ui\:editor.display.name
+admin.usage.restricted.help=Wenn Sie diese Option einschalten, kann niemand ausser den explizit angegebenen Benutzerrollen den Editor verwenden. Nur Administratoren k\u00F6nnen den Editor immer verwenden.
+admin.usage.restricted=Verwendung einschr\u00E4nken
+admin.usage.roles.author=Autoren
+admin.usage.roles.coach=Betreuer
+admin.usage.roles.managers=Manager
+admin.usage.roles=auf
 create.doc.already.exists=$org.olat.core.commons.modules.bc\:cfile.already.exists
 create.doc.button=Dokument erstellen
 create.doc.name.notvalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_en.properties
index 144dedd26bebb40c1e057e7943475b9f08051af5..d1cf9fa9ca92dae52258ef951af0ae19e3debb55 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_en.properties
@@ -2,6 +2,12 @@ admin.collabora=$org.olat.core.commons.services.doceditor.collabora.ui\:editor.d
 admin.data.transfer.confirmation.enabled=Confirmation of data transfer
 admin.menu.title.alt=Document editors
 admin.menu.title=Document editors
+admin.usage.restricted.help=If you enable this option, nobody but the explicitly specified user roles can use the editor. Only administrators can always use the editor.
+admin.usage.restricted=Restrict usage
+admin.usage.roles=to
+admin.usage.roles.author=Authors
+admin.usage.roles.coach=Coaches
+admin.usage.roles.managers=Manager
 admin.office365=$org.olat.core.commons.services.doceditor.office365.ui\:editor.display.name
 admin.onlyoffice=$org.olat.core.commons.services.doceditor.onlyoffice.ui\:editor.display.name
 create.doc.already.exists=$org.olat.core.commons.modules.bc\:cfile.already.exists
diff --git a/src/main/java/org/olat/core/id/Roles.java b/src/main/java/org/olat/core/id/Roles.java
index 39bd4e77c63968191392d64e2f70405590581d5d..8d36672a28cd50fbb1dddd7938575dd6ab7f251d 100644
--- a/src/main/java/org/olat/core/id/Roles.java
+++ b/src/main/java/org/olat/core/id/Roles.java
@@ -265,6 +265,18 @@ public class Roles implements Serializable {
 	public boolean isLineManager() {
 		return hasRole(OrganisationRoles.linemanager);
 	}
+	
+	public boolean isManager() {
+		return isCurriculumManager()
+				|| isGroupManager()
+				|| isLearnResourceManager()
+				|| isLectureManager()
+				|| isLineManager()
+				|| isPoolManager()
+				|| isQualityManager()
+				|| isRolesManager()
+				|| isUserManager();
+	}
 
 	public boolean isInvitee() {
 		return isInvitee;
diff --git a/src/main/java/org/olat/course/nodes/CourseNodeFactory.java b/src/main/java/org/olat/course/nodes/CourseNodeFactory.java
index 58933d1748d420b8197fc6c3b3602ce147782cc9..dfa5fcc6afd197d98c50d5a2a3afaf991436200c 100644
--- a/src/main/java/org/olat/course/nodes/CourseNodeFactory.java
+++ b/src/main/java/org/olat/course/nodes/CourseNodeFactory.java
@@ -147,7 +147,7 @@ public class CourseNodeFactory implements PreWarm {
 		}
 		
 		RepositoryHandler typeToEdit = RepositoryHandlerFactory.getInstance().getRepositoryHandler(repositoryEntry);
-		if (typeToEdit.supportsEdit(repositoryEntry.getOlatResource()) == EditionSupport.no){
+		if (typeToEdit.supportsEdit(repositoryEntry.getOlatResource(), ureq.getIdentity(), ureq.getUserSession().getRoles()) == EditionSupport.no){
 			log.error("Trying to edit repository entry which has no associated editor: "+ typeToEdit);
 			return false;
 		}
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/AbstractAssignmentEditController.java b/src/main/java/org/olat/course/nodes/gta/ui/AbstractAssignmentEditController.java
index 1aac1f09580c78dbaf23f60583b5e817d56adac6..69f4f4f86545965d53e60602eddaf3a068e4cb47 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/AbstractAssignmentEditController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/AbstractAssignmentEditController.java
@@ -152,10 +152,10 @@ abstract class AbstractAssignmentEditController extends FormBasicController {
 		taskModel = new TaskDefinitionTableModel(columnsModel);
 		taskDefTableEl = uifactory.addTableElement(getWindowControl(), "taskTable", taskModel, getTranslator(), tasksCont);
 		taskDefTableEl.setExportEnabled(true);
-		updateModel();
+		updateModel(ureq);
 	}
 	
-	protected void updateModel() {
+	protected void updateModel(UserRequest ureq) {
 		fileExistsRenderer.setFilenames(tasksFolder.list());
 		List<TaskDefinition> taskDefinitions = gtaManager.getTaskDefinitions(courseEnv, gtaNode);
 		List<TaskDefinitionRow> rows = new ArrayList<>(taskDefinitions.size());
@@ -167,7 +167,7 @@ abstract class AbstractAssignmentEditController extends FormBasicController {
 				VFSLeaf vfsLeaf = (VFSLeaf)item;
 				downloadLink = uifactory
 					.addDownloadLink("file_" + (++linkCounter), def.getFilename(), null, vfsLeaf, taskDefTableEl);
-				mode = getOpenMode(vfsLeaf, getIdentity(), readOnly);
+				mode = getOpenMode(getIdentity(), ureq.getUserSession().getRoles(), vfsLeaf, readOnly);
 			}
 			
 			TaskDefinitionRow row = new TaskDefinitionRow(def, downloadLink, mode);
@@ -189,7 +189,7 @@ abstract class AbstractAssignmentEditController extends FormBasicController {
 				TaskDefinition newTask = addTaskCtrl.getTask();
 				gtaManager.addTaskDefinition(newTask, courseEnv, gtaNode);
 				fireEvent(ureq, Event.DONE_EVENT);
-				updateModel();
+				updateModel(ureq);
 				gtaManager.markNews(courseEnv, gtaNode);
 			}
 			cmc.deactivate();
@@ -198,7 +198,7 @@ abstract class AbstractAssignmentEditController extends FormBasicController {
 		} else if(editTaskCtrl == source) {
 			if(event == Event.DONE_EVENT) {
 				doFinishReplacementOfTask(editTaskCtrl.getFilenameToReplace(), editTaskCtrl.getTask());
-				updateModel();
+				updateModel(ureq);
 				//fireEvent(ureq, Event.DONE_EVENT);
 				gtaManager.markNews(courseEnv, gtaNode);
 			}
@@ -212,12 +212,12 @@ abstract class AbstractAssignmentEditController extends FormBasicController {
 			if(event == Event.DONE_EVENT) {
 				gtaManager.addTaskDefinition(newTask, courseEnv, gtaNode);
 				doOpen(ureq, newTask, EDIT);
-				updateModel();
+				updateModel(ureq);
 			} 
 		} else if (source == docEditorCtrl) {
 			if(event == Event.DONE_EVENT) {
 				gtaManager.markNews(courseEnv, gtaNode);
-				updateModel();
+				updateModel(ureq);
 				cleanUp();
 			}
 		} else if(confirmDeleteCtrl == source) {
@@ -302,7 +302,8 @@ abstract class AbstractAssignmentEditController extends FormBasicController {
 	}
 	
 	private void doCreateTask(UserRequest ureq) {
-		newTaskCtrl = new NewTaskController(ureq, getWindowControl(), tasksContainer, htmlOffice(getLocale()));
+		newTaskCtrl = new NewTaskController(ureq, getWindowControl(), tasksContainer,
+				htmlOffice(getIdentity(), ureq.getUserSession().getRoles(), getLocale()));
 		listenTo(newTaskCtrl);
 
 		String title = translate("create.task");
@@ -334,7 +335,7 @@ abstract class AbstractAssignmentEditController extends FormBasicController {
 	
 	private void doDelete(UserRequest ureq, TaskDefinition taskDef) {
 		gtaManager.removeTaskDefinition(taskDef, courseEnv, gtaNode);
-		updateModel();
+		updateModel(ureq);
 		fireEvent(ureq, Event.DONE_EVENT);
 	}
 	
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTASampleSolutionsEditController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTASampleSolutionsEditController.java
index 6131d7d75d5f8f29d07988f8c8f207ae88bb19f3..33d99ce850ed68928ae0786da81b7d920f5f97b4 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTASampleSolutionsEditController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTASampleSolutionsEditController.java
@@ -134,10 +134,10 @@ public class GTASampleSolutionsEditController extends FormBasicController {
 		solutionModel = new SolutionTableModel(columnsModel);
 		solutionTable = uifactory.addTableElement(getWindowControl(), "table", solutionModel, getTranslator(), formLayout);
 		solutionTable.setExportEnabled(true);
-		updateModel();
+		updateModel(ureq);
 	}
 	
-	private void updateModel() {
+	private void updateModel(UserRequest ureq) {
 		List<Solution> solutionList = gtaManager.getSolutions(courseEnv, gtaNode);
 		List<SolutionRow> rows = new ArrayList<>(solutionList.size());
 		for(Solution solution:solutionList) {
@@ -158,7 +158,7 @@ public class GTASampleSolutionsEditController extends FormBasicController {
 				VFSLeaf vfsLeaf = (VFSLeaf)item;
 				downloadLink = uifactory
 					.addDownloadLink("file_" + (++linkCounter), filename, null, vfsLeaf, solutionTable);
-				openMode = getOpenMode(vfsLeaf, getIdentity(), readOnly);
+				openMode = getOpenMode(getIdentity(), ureq.getUserSession().getRoles(), vfsLeaf, readOnly);
 			}
 
 			rows.add(new SolutionRow(solution, author, downloadLink, openMode));
@@ -179,7 +179,7 @@ public class GTASampleSolutionsEditController extends FormBasicController {
 				Solution newSolution = addSolutionCtrl.getSolution();
 				gtaManager.addSolution(newSolution, courseEnv, gtaNode);
 				fireEvent(ureq, Event.DONE_EVENT);
-				updateModel();
+				updateModel(ureq);
 				gtaManager.markNews(courseEnv, gtaNode);
 			}
 			cmc.deactivate();
@@ -188,7 +188,7 @@ public class GTASampleSolutionsEditController extends FormBasicController {
 			if(event == Event.DONE_EVENT) {
 				gtaManager.updateSolution(editSolutionCtrl.getFilenameToReplace(), editSolutionCtrl.getSolution(), courseEnv, gtaNode);
 				fireEvent(ureq, Event.DONE_EVENT);
-				updateModel();
+				updateModel(ureq);
 				gtaManager.markNews(courseEnv, gtaNode);
 			}
 			cmc.deactivate();
@@ -201,13 +201,13 @@ public class GTASampleSolutionsEditController extends FormBasicController {
 			if(event == Event.DONE_EVENT) {
 				gtaManager.addSolution(newSolution, courseEnv, gtaNode);
 				doOpen(ureq, newSolution, Mode.EDIT);
-				updateModel();
+				updateModel(ureq);
 				gtaManager.markNews(courseEnv, gtaNode);
 			}
 		} else if (source == docEditorCtrl) {
 			if(event == Event.DONE_EVENT) {
 				gtaManager.markNews(courseEnv, gtaNode);
-				updateModel();
+				updateModel(ureq);
 				cleanUp();
 			}
 		} else if(cmc == source) {
@@ -289,7 +289,8 @@ public class GTASampleSolutionsEditController extends FormBasicController {
 	}
 	
 	private void doCreateSolution(UserRequest ureq) {
-		newSolutionCtrl = new NewSolutionController(ureq, getWindowControl(), solutionContainer, htmlOffice(getLocale()));
+		newSolutionCtrl = new NewSolutionController(ureq, getWindowControl(), solutionContainer,
+				htmlOffice(getIdentity(), ureq.getUserSession().getRoles(), getLocale()));
 		listenTo(newSolutionCtrl);
 		
 		cmc = new CloseableModalController(getWindowControl(), "close", newSolutionCtrl.getInitialComponent());
@@ -305,6 +306,6 @@ public class GTASampleSolutionsEditController extends FormBasicController {
 		}
 		gtaManager.removeSolution(solution.getSolution(), courseEnv, gtaNode);
 		fireEvent(ureq, Event.DONE_EVENT);
-		updateModel();
+		updateModel(ureq);
 	}
 }
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTAUIFactory.java b/src/main/java/org/olat/course/nodes/gta/ui/GTAUIFactory.java
index 104e9f7643cf10105d61b7eefffc550b6aff9722..e49fe7146980e7f49881d8496d609bb35b2fc44b 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTAUIFactory.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTAUIFactory.java
@@ -33,6 +33,7 @@ import org.olat.core.commons.services.doceditor.DocTemplates;
 import org.olat.core.commons.services.doceditor.DocTemplates.Builder;
 import org.olat.core.commons.services.doceditor.DocumentEditorService;
 import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.modules.edusharing.VFSEdusharingProvider;
@@ -46,13 +47,13 @@ import org.olat.repository.ui.settings.LazyRepositoryEdusharingProvider;
  */
 class GTAUIFactory {
 	
-	static Mode getOpenMode(VFSLeaf vfsLeaf, Identity identity, boolean readOnly) {
+	static Mode getOpenMode(Identity identity, Roles roles, VFSLeaf vfsLeaf, boolean readOnly) {
 		DocumentEditorService docEditorService = CoreSpringFactory.getImpl(DocumentEditorService.class);
 		DocEditorSecurityCallback editSC = DocEditorSecurityCallbackBuilder.builder().withMode(Mode.EDIT).build();
 		DocEditorSecurityCallback viewSC = DocEditorSecurityCallbackBuilder.builder().withMode(Mode.VIEW).build();
-		if (!readOnly && docEditorService.hasEditor(vfsLeaf, identity, editSC)) {
+		if (!readOnly && docEditorService.hasEditor(identity, roles, vfsLeaf, editSC)) {
 			return Mode.EDIT;
-		} else if (docEditorService.hasEditor(vfsLeaf, identity, viewSC)) {
+		} else if (docEditorService.hasEditor(identity, roles, vfsLeaf, viewSC)) {
 			return Mode.VIEW;
 		}
 		return null;
@@ -73,19 +74,19 @@ class GTAUIFactory {
 				.build();
 	}
 	
-	static DocTemplates htmlOffice(Locale locale) {
+	static DocTemplates htmlOffice(Identity identity, Roles roles, Locale locale) {
 		DocumentEditorService docEditorService = CoreSpringFactory.getImpl(DocumentEditorService.class);
 		Builder builder = DocTemplates.builder(locale);
-		if (docEditorService.hasEditor("html", EDIT, true)) {
+		if (docEditorService.hasEditor(identity, roles, "html", EDIT, true)) {
 			builder.addHtml();
 		}
-		if (docEditorService.hasEditor("docx", EDIT, true)) {
+		if (docEditorService.hasEditor(identity, roles, "docx", EDIT, true)) {
 			builder.addDocx();
 		}
-		if (docEditorService.hasEditor("xlsx", EDIT, true)) {
+		if (docEditorService.hasEditor(identity, roles, "xlsx", EDIT, true)) {
 			builder.addXlsx();
 		}
-		if (docEditorService.hasEditor("pptx", EDIT, true)) {
+		if (docEditorService.hasEditor(identity, roles, "pptx", EDIT, true)) {
 			builder.addPptx();
 		}
 		return builder.build();
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java b/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java
index be6fa0afc1063250dec992a64e72c00522730b7c..ce130ea66911c6159afec6b5f7b5572e97116856 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java
@@ -130,7 +130,7 @@ class SubmitDocumentsController extends FormBasicController {
 		this.gtaNode = cNode;
 		this.courseEnv = courseEnv;
 		initForm(ureq);
-		updateModel();
+		updateModel(ureq);
 	}
 
 	public Task getAssignedTask() {
@@ -182,7 +182,7 @@ class SubmitDocumentsController extends FormBasicController {
 		tableEl.setElementCssClass("o_table_no_margin");
 	}
 	
-	private void updateModel() {
+	private void updateModel(UserRequest ureq) {
 		File[] documents = documentsDir.listFiles(SystemFileFilter.FILES_ONLY);
 		if(documents == null) {
 			documents = new File[0];
@@ -211,7 +211,7 @@ class SubmitDocumentsController extends FormBasicController {
 			
 			if(item instanceof VFSLeaf) {
 				VFSLeaf vfsLeaf = (VFSLeaf)item;
-				openMode = getOpenMode(vfsLeaf, getIdentity(), readOnly);
+				openMode = getOpenMode(getIdentity(), ureq.getUserSession().getRoles(), vfsLeaf, readOnly);
 			}
 			docList.add(new SubmittedSolution(document, uploadedBy, download, openMode));
 		}
@@ -251,7 +251,7 @@ class SubmitDocumentsController extends FormBasicController {
 			if(DialogBoxUIFactory.isYesEvent(event) || DialogBoxUIFactory.isOkEvent(event)) {
 				SubmittedSolution document = (SubmittedSolution)confirmDeleteCtrl.getUserObject();
 				String filename = document.getFile().getName();
-				doDelete(document);
+				doDelete(ureq, document);
 				fireEvent(ureq, new SubmitEvent(SubmitEvent.DELETE, filename));
 				gtaManager.markNews(courseEnv, gtaNode);
 			}
@@ -287,7 +287,7 @@ class SubmitDocumentsController extends FormBasicController {
 				fireEvent(ureq, new SubmitEvent(SubmitEvent.CREATE, filename));
 				gtaManager.markNews(courseEnv, gtaNode);
 				doOpen(ureq, filename, EDIT);
-				updateModel();
+				updateModel(ureq);
 			} 
 			checkDeadline(ureq);
 		} else if (source == docEditorCtrl) {
@@ -295,7 +295,7 @@ class SubmitDocumentsController extends FormBasicController {
 				fireEvent(ureq, new SubmitEvent(SubmitEvent.UPDATE, docEditorCtrl.getVfsLeaf().getName()));
 				gtaManager.markNews(courseEnv, gtaNode);
 			}
-			updateModel();
+			updateModel(ureq);
 			cleanUp();
 			checkDeadline(ureq);
 		} else if(cmc == source) {
@@ -389,12 +389,12 @@ class SubmitDocumentsController extends FormBasicController {
 		confirmDeleteCtrl.setUserObject(solution);
 	}
 
-	private void doDelete(SubmittedSolution solution) {
+	private void doDelete(UserRequest ureq, SubmittedSolution solution) {
 		File document = solution.getFile();
 		if(document.exists()) {
 			document.delete();
 		}
-		updateModel();
+		updateModel(ureq);
 	}
 	
 	private void doOpen(UserRequest ureq, String filename, Mode mode) {
@@ -444,7 +444,7 @@ class SubmitDocumentsController extends FormBasicController {
 			logError("", e);
 			showError("");
 		}
-		updateModel();
+		updateModel(ureq);
 	}
 	
 	private void doOpenDocumentUpload(UserRequest ureq) {
@@ -469,7 +469,8 @@ class SubmitDocumentsController extends FormBasicController {
 		if(maxDocs > 0 && maxDocs <= model.getRowCount()) {
 			showWarning("error.max.documents");
 		} else {
-			newDocCtrl = new NewDocumentController(ureq, getWindowControl(), documentsContainer, htmlOffice(getLocale()));
+			newDocCtrl = new NewDocumentController(ureq, getWindowControl(), documentsContainer,
+					htmlOffice(getIdentity(), ureq.getUserSession().getRoles(), getLocale()));
 			listenTo(newDocCtrl);
 			
 			cmc = new CloseableModalController(getWindowControl(), "close", newDocCtrl.getInitialComponent());
diff --git a/src/main/java/org/olat/ims/qti/repository/handlers/QTISurveyHandler.java b/src/main/java/org/olat/ims/qti/repository/handlers/QTISurveyHandler.java
index 5df01f893405a934d857b1321c2e161106531fb8..fe80a809f27f21c9f843e8a427361f1762032aff 100644
--- a/src/main/java/org/olat/ims/qti/repository/handlers/QTISurveyHandler.java
+++ b/src/main/java/org/olat/ims/qti/repository/handlers/QTISurveyHandler.java
@@ -42,6 +42,7 @@ import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Organisation;
+import org.olat.core.id.Roles;
 import org.olat.core.logging.AssertException;
 import org.olat.core.util.Util;
 import org.olat.course.assessment.AssessmentMode;
@@ -79,7 +80,7 @@ import org.olat.resource.references.ReferenceManager;
 public class QTISurveyHandler extends QTIHandler {
 	
 	@Override
-	public boolean supportCreate() {
+	public boolean supportCreate(Identity identity, Roles roles) {
 		return CoreSpringFactory.getImpl(QTIModule.class).isCreateSurveyResourcesEnabled();
 	}
 
@@ -143,7 +144,7 @@ public class QTISurveyHandler extends QTIHandler {
 	}
 
 	@Override
-	public EditionSupport supportsEdit(OLATResourceable resource) {
+	public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) {
 		if(resource != null && QTIResourceTypeModule.isOnyxTest(resource)) {
 			return EditionSupport.no;
 		}
diff --git a/src/main/java/org/olat/ims/qti/repository/handlers/QTITestHandler.java b/src/main/java/org/olat/ims/qti/repository/handlers/QTITestHandler.java
index fc68e0f9cb585621a74faae6059d4e6c1f86e516..cf5c7c4eac00727540e00219c9095aa0846bb8e2 100644
--- a/src/main/java/org/olat/ims/qti/repository/handlers/QTITestHandler.java
+++ b/src/main/java/org/olat/ims/qti/repository/handlers/QTITestHandler.java
@@ -42,6 +42,7 @@ import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Organisation;
+import org.olat.core.id.Roles;
 import org.olat.core.logging.AssertException;
 import org.olat.core.util.Util;
 import org.olat.course.assessment.AssessmentMode;
@@ -80,7 +81,7 @@ import org.olat.resource.references.ReferenceManager;
 public class QTITestHandler extends QTIHandler {
 	
 	@Override
-	public boolean supportCreate() {
+	public boolean supportCreate(Identity identity, Roles roles) {
 		return CoreSpringFactory.getImpl(QTIModule.class).isCreateResourcesEnabled();
 	}
 	
@@ -144,7 +145,7 @@ public class QTITestHandler extends QTIHandler {
 	}
 
 	@Override
-	public EditionSupport supportsEdit(OLATResourceable resource) { 
+	public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) { 
 		if(resource != null && QTIResourceTypeModule.isOnyxTest(resource)) {
 			return EditionSupport.no;
 		}
diff --git a/src/main/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandler.java b/src/main/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandler.java
index 71c029c6bdc007202bb5b7ce556a5baf55a6d829..a29e5f50a4f3713eaae7ac6eb043bab68a46345c 100644
--- a/src/main/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandler.java
+++ b/src/main/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandler.java
@@ -127,7 +127,7 @@ public class QTI21AssessmentTestHandler extends FileHandler {
 	}
 
 	@Override
-	public boolean supportCreate() {
+	public boolean supportCreate(Identity identity, Roles roles) {
 		return true;
 	}
 
@@ -363,7 +363,7 @@ public class QTI21AssessmentTestHandler extends FileHandler {
 	}
 
 	@Override
-	public EditionSupport supportsEdit(OLATResourceable resource) {
+	public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) {
 		return EditionSupport.yes;
 	}
 	
diff --git a/src/main/java/org/olat/modules/forms/handler/EvaluationFormHandler.java b/src/main/java/org/olat/modules/forms/handler/EvaluationFormHandler.java
index 80e7e7e08ad11355be978ec1bdc407ea41719c2e..582f6e4f2632c75f676381a0bd996bd95cf51aaa 100644
--- a/src/main/java/org/olat/modules/forms/handler/EvaluationFormHandler.java
+++ b/src/main/java/org/olat/modules/forms/handler/EvaluationFormHandler.java
@@ -114,7 +114,7 @@ public class EvaluationFormHandler implements RepositoryHandler {
 	private EvaluationFormManager evaluationFormManager;
 
 	@Override
-	public boolean supportCreate() {
+	public boolean supportCreate(Identity identity, Roles roles) {
 		return formsModule.isEnabled();
 	}
 	
@@ -224,7 +224,7 @@ public class EvaluationFormHandler implements RepositoryHandler {
 	}
 
 	@Override
-	public EditionSupport supportsEdit(OLATResourceable resource) {
+	public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) {
 		return EditionSupport.yes;
 	}
 	
diff --git a/src/main/java/org/olat/modules/portfolio/handler/BinderTemplateHandler.java b/src/main/java/org/olat/modules/portfolio/handler/BinderTemplateHandler.java
index 3fb79f7189ac1a4cae30bb13eecad59171f57373..b61113c6b64a7007e2a1a5fdd84f81d6d6cae19a 100644
--- a/src/main/java/org/olat/modules/portfolio/handler/BinderTemplateHandler.java
+++ b/src/main/java/org/olat/modules/portfolio/handler/BinderTemplateHandler.java
@@ -88,7 +88,7 @@ public class BinderTemplateHandler implements RepositoryHandler {
 	private static final Logger log = Tracing.createLoggerFor(BinderTemplateHandler.class);
 
 	@Override
-	public boolean supportCreate() {
+	public boolean supportCreate(Identity identity, Roles roles) {
 		return CoreSpringFactory.getImpl(PortfolioV2Module.class).isEnabled();
 	}
 	
@@ -196,7 +196,7 @@ public class BinderTemplateHandler implements RepositoryHandler {
 	}
 
 	@Override
-	public EditionSupport supportsEdit(OLATResourceable resource) {
+	public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) {
 		return EditionSupport.embedded;
 	}
 	
diff --git a/src/main/java/org/olat/modules/portfolio/handler/CreateFileHandler.java b/src/main/java/org/olat/modules/portfolio/handler/CreateFileHandler.java
index f2a58e3c0cd98d00b9d1adf9679ef0d35e3d3b9a..f7c1a978c641b725b79ee28aa8101f75bff63f78 100644
--- a/src/main/java/org/olat/modules/portfolio/handler/CreateFileHandler.java
+++ b/src/main/java/org/olat/modules/portfolio/handler/CreateFileHandler.java
@@ -25,10 +25,12 @@ import java.util.Locale;
 
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.services.doceditor.DocTemplates;
-import org.olat.core.commons.services.doceditor.DocumentEditorService;
 import org.olat.core.commons.services.doceditor.DocTemplates.Builder;
+import org.olat.core.commons.services.doceditor.DocumentEditorService;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.WindowControl;
+import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.modules.ceditor.PageElementAddController;
 import org.olat.modules.portfolio.ui.media.CreateFileMediaController;
 
@@ -40,16 +42,16 @@ import org.olat.modules.portfolio.ui.media.CreateFileMediaController;
  */
 public class CreateFileHandler extends FileHandler {
 	
-	public static DocTemplates getEditableTemplates(Locale locale) {
+	public static DocTemplates getEditableTemplates(Identity identity, Roles roles, Locale locale) {
 		DocumentEditorService docEditorService = CoreSpringFactory.getImpl(DocumentEditorService.class);
 		Builder builder = DocTemplates.builder(locale);
-		if (docEditorService.hasEditor("docx", EDIT, true)) {
+		if (docEditorService.hasEditor(identity, roles, "docx", EDIT, true)) {
 			builder.addDocx();
 		}
-		if (docEditorService.hasEditor("xlsx", EDIT, true)) {
+		if (docEditorService.hasEditor(identity, roles, "xlsx", EDIT, true)) {
 			builder.addXlsx();
 		}
-		if (docEditorService.hasEditor("pptx", EDIT, true)) {
+		if (docEditorService.hasEditor(identity, roles, "pptx", EDIT, true)) {
 			builder.addPptx();
 		}
 		return builder.build();
@@ -62,7 +64,8 @@ public class CreateFileHandler extends FileHandler {
 	
 	@Override
 	public PageElementAddController getAddPageElementController(UserRequest ureq, WindowControl wControl) {
-		return new CreateFileMediaController(ureq, wControl, getEditableTemplates(ureq.getLocale()));
+		return new CreateFileMediaController(ureq, wControl,
+				getEditableTemplates(ureq.getIdentity(), ureq.getUserSession().getRoles(), ureq.getLocale()));
 	}
 
 }
diff --git a/src/main/java/org/olat/modules/portfolio/ui/MediaCenterController.java b/src/main/java/org/olat/modules/portfolio/ui/MediaCenterController.java
index fbdf57e61ac65f12a13e2436e4f83b4cea49b3c8..815d3a7f7181ae50a10c1c811033c35d234bcead 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/MediaCenterController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/MediaCenterController.java
@@ -144,7 +144,7 @@ public class MediaCenterController extends FormBasicController
 		super(ureq, wControl, "medias");
 		this.stackPanel = null;
 		this.select = true;
-		this.editableFileTypes = CreateFileHandler.getEditableTemplates(getLocale());
+		this.editableFileTypes = CreateFileHandler.getEditableTemplates(getIdentity(), ureq.getUserSession().getRoles(), getLocale());
 		 
 		initForm(ureq);
 		loadModel();
@@ -154,7 +154,7 @@ public class MediaCenterController extends FormBasicController
 		super(ureq, wControl, "medias");
 		this.stackPanel = stackPanel;
 		this.select = false;
-		this.editableFileTypes = CreateFileHandler.getEditableTemplates(getLocale());
+		this.editableFileTypes = CreateFileHandler.getEditableTemplates(getIdentity(), ureq.getUserSession().getRoles(), getLocale());
 		 
 		initForm(ureq);
 		loadModel();
diff --git a/src/main/java/org/olat/modules/portfolio/ui/PageRunController.java b/src/main/java/org/olat/modules/portfolio/ui/PageRunController.java
index c2f72f736151e46a25bbd2cbf4c32e205d47db94..8427905cb00a83fa37b82778049772d89a6aaf40 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/PageRunController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/PageRunController.java
@@ -53,6 +53,7 @@ import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
 import org.olat.core.gui.media.MediaResource;
 import org.olat.core.gui.util.SyntheticUserRequest;
 import org.olat.core.id.OLATResourceable;
+import org.olat.core.id.Roles;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.StateEntry;
 import org.olat.core.util.StringHelper;
@@ -199,8 +200,9 @@ public class PageRunController extends BasicController implements TooledControll
 		putInitialPanel(mainVC);
 		
 		if(openInEditMode) {
-			pageEditCtrl = new PageEditorController(ureq, getWindowControl(), new PortfolioPageEditorProvider(),
-					new FullEditorSecurityCallback(), getTranslator());
+			pageEditCtrl = new PageEditorController(ureq, getWindowControl(),
+					new PortfolioPageEditorProvider(ureq.getUserSession().getRoles()), new FullEditorSecurityCallback(),
+					getTranslator());
 			listenTo(pageEditCtrl);
 			mainVC.contextPut("isPersonalBinder", (!secCallback.canNewAssignment() && secCallback.canEditMetadataBinder()));
 			mainVC.put("page", pageEditCtrl.getInitialComponent());
@@ -649,7 +651,8 @@ public class PageRunController extends BasicController implements TooledControll
 		} else {
 			lockEntry = coordinator.getCoordinator().getLocker().acquireLock(lockOres, getIdentity(), "");
 			if(lockEntry.isSuccess()) {
-				pageEditCtrl = new PageEditorController(ureq, getWindowControl(), new PortfolioPageEditorProvider(),
+				pageEditCtrl = new PageEditorController(ureq, getWindowControl(),
+						new PortfolioPageEditorProvider(ureq.getUserSession().getRoles()),
 						new FullEditorSecurityCallback(), getTranslator());
 				listenTo(pageEditCtrl);
 				mainVC.contextPut("isPersonalBinder", (!secCallback.canNewAssignment() && secCallback.canEditMetadataBinder()));
@@ -753,7 +756,7 @@ public class PageRunController extends BasicController implements TooledControll
 		private final List<PageElementHandler> handlers = new ArrayList<>();
 		private final List<PageElementHandler> creationHandlers = new ArrayList<>();
 		
-		public PortfolioPageEditorProvider() {
+		public PortfolioPageEditorProvider(Roles roles) {
 			//handler for title
 			TitlePageElementHandler titleRawHandler = new TitlePageElementHandler();
 			handlers.add(titleRawHandler);
@@ -768,7 +771,7 @@ public class PageRunController extends BasicController implements TooledControll
 			creationHandlers.add(tableHandler);
 			
 			// Handler only to create files
-			if (isCreateFilePossible()) {
+			if (isCreateFilePossible(roles)) {
 				CreateFileHandler createFileHandler = new CreateFileHandler();
 				creationHandlers.add(createFileHandler);
 			}
@@ -803,10 +806,10 @@ public class PageRunController extends BasicController implements TooledControll
 			creationHandlers.add(htlmRawHandler);// at the end, legacy	
 		}
 
-		private boolean isCreateFilePossible() {
-			List<DocTemplate> editableTemplates = CreateFileHandler.getEditableTemplates(getLocale()).getTemplates();
+		private boolean isCreateFilePossible(Roles roles) {
+			List<DocTemplate> editableTemplates = CreateFileHandler.getEditableTemplates(getIdentity(), roles, getLocale()).getTemplates();
 			for (DocTemplate docTemplate: editableTemplates) {
-				if (vfsRepositoryService.hasEditor(docTemplate.getSuffix(), Mode.EDIT, true)) {
+				if (vfsRepositoryService.hasEditor(getIdentity(), roles,  docTemplate.getSuffix(), Mode.EDIT, true)) {
 					return true;
 				}
 			}
diff --git a/src/main/java/org/olat/modules/portfolio/ui/media/FileMediaController.java b/src/main/java/org/olat/modules/portfolio/ui/media/FileMediaController.java
index 4790429ac0c20a52caec42779695d40466286930..efa51654f14eb26c3110f1d031983ab9bbb095ae 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/media/FileMediaController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/media/FileMediaController.java
@@ -38,6 +38,7 @@ import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.gui.util.CSSHelper;
+import org.olat.core.id.Roles;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.Formatter;
 import org.olat.core.util.StringHelper;
@@ -72,6 +73,7 @@ public class FileMediaController extends BasicController implements PageElementE
 
 	private DocEditorFullscreenController docEditorCtrl;
 
+	private final Roles roles;
 	private final Media media;
 	private final MediaRenderingHints hints;
 	private VFSLeaf vfsLeaf;
@@ -87,6 +89,7 @@ public class FileMediaController extends BasicController implements PageElementE
 	
 	public FileMediaController(UserRequest ureq, WindowControl wControl, Media media, MediaRenderingHints hints) {
 		super(ureq, wControl);
+		this.roles = ureq.getUserSession().getRoles();
 		this.media = media;
 		this.hints = hints;
 		setTranslator(Util.createPackageTranslator(PortfolioHomeController.class, getLocale(), getTranslator()));
@@ -167,9 +170,9 @@ public class FileMediaController extends BasicController implements PageElementE
 		DocEditorSecurityCallback viewSC = DocEditorSecurityCallbackBuilder.builder().withMode(Mode.VIEW).build();
 		if (isEditingExcluded()) {
 			return null;
-		} else if (editMode && docEditorService.hasEditor(vfsLeaf, getIdentity(), editSC)) {
+		} else if (editMode && docEditorService.hasEditor(getIdentity(), roles, vfsLeaf, editSC)) {
 			return editSC;
-		} else if (docEditorService.hasEditor(vfsLeaf, getIdentity(), viewSC)) {
+		} else if (docEditorService.hasEditor(getIdentity(), roles, vfsLeaf, viewSC)) {
 			return viewSC;
 		}
 		return null;
diff --git a/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java b/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java
index dc923330c2504f3f7546292e9cb959232f828686..192663b1c699ca4eba01a480f73a4302a08bdef5 100644
--- a/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java
+++ b/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java
@@ -147,7 +147,7 @@ public class ReferencableEntriesSearchController extends BasicController {
 			List<String> creatorTypes = new ArrayList<>(limitTypes.length);
 			for(String limitType:limitTypes) {
 				RepositoryHandler handler = repositoryHandlerFactory.getRepositoryHandler(limitType);
-				if(handler.supportCreate()) {
+				if(handler.supportCreate(getIdentity(), ureq.getUserSession().getRoles())) {
 					creatorTypes.add(limitType);
 				}
 			}
diff --git a/src/main/java/org/olat/repository/handlers/BlogHandler.java b/src/main/java/org/olat/repository/handlers/BlogHandler.java
index fa84d3e3ed80afef1c908d97a56c926065d3b082..79f5bf3265e532491e440a225f05ae4c5db0581d 100644
--- a/src/main/java/org/olat/repository/handlers/BlogHandler.java
+++ b/src/main/java/org/olat/repository/handlers/BlogHandler.java
@@ -79,7 +79,7 @@ import org.olat.resource.references.ReferenceManager;
 public class BlogHandler implements RepositoryHandler {
 
 	@Override
-	public boolean supportCreate() {
+	public boolean supportCreate(Identity identity, Roles roles) {
 		return true;
 	}
 
@@ -251,7 +251,7 @@ public class BlogHandler implements RepositoryHandler {
 	}
 
 	@Override
-	public EditionSupport supportsEdit(OLATResourceable resource) {
+	public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) {
 		return EditionSupport.embedded;
 	}
 	
diff --git a/src/main/java/org/olat/repository/handlers/CourseHandler.java b/src/main/java/org/olat/repository/handlers/CourseHandler.java
index bc25227b001c56091c0f834799ec391851adeb4a..4deba24665c3d081c69513d7f4e9eda60836d8e0 100644
--- a/src/main/java/org/olat/repository/handlers/CourseHandler.java
+++ b/src/main/java/org/olat/repository/handlers/CourseHandler.java
@@ -135,7 +135,7 @@ public class CourseHandler implements RepositoryHandler {
 	private static final Logger log = Tracing.createLoggerFor(CourseHandler.class);
 	
 	@Override
-	public boolean supportCreate() {
+	public boolean supportCreate(Identity identity, Roles roles) {
 		return true;
 	}
 	
@@ -521,7 +521,7 @@ public class CourseHandler implements RepositoryHandler {
 	}
 	
 	@Override
-	public EditionSupport supportsEdit(OLATResourceable resource) {
+	public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) {
 		return EditionSupport.yes;
 	}
 	
diff --git a/src/main/java/org/olat/repository/handlers/DocumentEditorDelegate.java b/src/main/java/org/olat/repository/handlers/DocumentEditorDelegate.java
index 8860b59066c181f382937fa14035b3b9eab0f907..5d6b1689a0e888e4208c48743881c0f8600adc60 100644
--- a/src/main/java/org/olat/repository/handlers/DocumentEditorDelegate.java
+++ b/src/main/java/org/olat/repository/handlers/DocumentEditorDelegate.java
@@ -37,6 +37,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.id.Organisation;
+import org.olat.core.id.Roles;
 import org.olat.core.logging.AssertException;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.vfs.LocalFileImpl;
@@ -73,13 +74,13 @@ public class DocumentEditorDelegate implements WebDocumentCreateDelegate, WebDoc
 	}
 	
 	@Override
-	public boolean supportCreate() {
-		return canEdit();
+	public boolean supportCreate(Identity identity, Roles roles) {
+		return canEdit(identity, roles);
 	}
 
-	private boolean canEdit() {
+	private boolean canEdit(Identity identity, Roles roles) {
 		DocumentEditorService docEditorService = CoreSpringFactory.getImpl(DocumentEditorService.class);
-		return docEditorService.hasEditor(type.getSuffix(), Mode.EDIT, true);
+		return docEditorService.hasEditor(identity, roles, type.getSuffix(), Mode.EDIT, true);
 	}
 	
 	@Override
@@ -100,8 +101,8 @@ public class DocumentEditorDelegate implements WebDocumentCreateDelegate, WebDoc
 	}
 	
 	@Override
-	public EditionSupport supportsEdit() {
-		return canEdit()? EditionSupport.yes: EditionSupport.no;
+	public EditionSupport supportsEdit(Identity identity, Roles roles) {
+		return canEdit(identity, roles)? EditionSupport.yes: EditionSupport.no;
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/repository/handlers/GlossaryHandler.java b/src/main/java/org/olat/repository/handlers/GlossaryHandler.java
index c3ec77c6c48818444a227e216a650e335548e9c8..a106206acbd786ce6105bff9e37a6681bd2263df 100644
--- a/src/main/java/org/olat/repository/handlers/GlossaryHandler.java
+++ b/src/main/java/org/olat/repository/handlers/GlossaryHandler.java
@@ -87,7 +87,7 @@ public class GlossaryHandler implements RepositoryHandler {
 	public static final String PROCESS_UPLOAD = "pu";
 
 	@Override
-	public boolean supportCreate() {
+	public boolean supportCreate(Identity identity, Roles roles) {
 		return true;
 	}
 	
@@ -177,7 +177,7 @@ public class GlossaryHandler implements RepositoryHandler {
 	}
 
 	@Override
-	public EditionSupport supportsEdit(OLATResourceable resource) {
+	public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) {
 		return EditionSupport.embedded;
 	}
 	
diff --git a/src/main/java/org/olat/repository/handlers/ImsCPHandler.java b/src/main/java/org/olat/repository/handlers/ImsCPHandler.java
index f8f4ea5896f51fceb1ce00b01065d64b2ed8d3b3..5934f00048886968773c077b8fd96e6f8fea4990 100644
--- a/src/main/java/org/olat/repository/handlers/ImsCPHandler.java
+++ b/src/main/java/org/olat/repository/handlers/ImsCPHandler.java
@@ -45,6 +45,7 @@ import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Organisation;
+import org.olat.core.id.Roles;
 import org.olat.core.logging.AssertException;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.Util;
@@ -87,7 +88,7 @@ import org.olat.resource.OLATResourceManager;
 public class ImsCPHandler extends FileHandler {
 	
 	@Override
-	public boolean supportCreate() {
+	public boolean supportCreate(Identity identity, Roles roles) {
 		return true;
 	}
 	
@@ -201,7 +202,7 @@ public class ImsCPHandler extends FileHandler {
 	}
 
 	@Override
-	public EditionSupport supportsEdit(OLATResourceable resource) {
+	public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) {
 		return EditionSupport.yes;
 	}
 	
diff --git a/src/main/java/org/olat/repository/handlers/PodcastHandler.java b/src/main/java/org/olat/repository/handlers/PodcastHandler.java
index 158d1aeb5b5a0e2b031989673836314a29043ee0..807ef8123af795be1b6a4ff6191172bc2705667d 100644
--- a/src/main/java/org/olat/repository/handlers/PodcastHandler.java
+++ b/src/main/java/org/olat/repository/handlers/PodcastHandler.java
@@ -79,7 +79,7 @@ import org.olat.resource.references.ReferenceManager;
 public class PodcastHandler implements RepositoryHandler {
 	
 	@Override
-	public boolean supportCreate() {
+	public boolean supportCreate(Identity identity, Roles roles) {
 		return true;
 	}
 	
@@ -251,7 +251,7 @@ public class PodcastHandler implements RepositoryHandler {
 	}
 
 	@Override
-	public EditionSupport supportsEdit(OLATResourceable resource) {
+	public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) {
 		return EditionSupport.embedded;
 	}
 	
diff --git a/src/main/java/org/olat/repository/handlers/PortfolioHandler.java b/src/main/java/org/olat/repository/handlers/PortfolioHandler.java
index bd3b68814cd2c4dd2cbc6d38774290562e0724c4..a7b681ea3c6f1a3f6e434b049c95e7dac033854f 100644
--- a/src/main/java/org/olat/repository/handlers/PortfolioHandler.java
+++ b/src/main/java/org/olat/repository/handlers/PortfolioHandler.java
@@ -84,7 +84,7 @@ public class PortfolioHandler implements RepositoryHandler {
 	private static final Logger log = Tracing.createLoggerFor(PortfolioHandler.class);
 	
 	@Override
-	public boolean supportCreate() {
+	public boolean supportCreate(Identity identity, Roles roles) {
 		return false;
 	}
 	
@@ -182,7 +182,7 @@ public class PortfolioHandler implements RepositoryHandler {
 	}
 
 	@Override
-	public EditionSupport supportsEdit(OLATResourceable resource) {
+	public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) {
 		return EditionSupport.embedded;
 	}
 	
diff --git a/src/main/java/org/olat/repository/handlers/RepositoryHandler.java b/src/main/java/org/olat/repository/handlers/RepositoryHandler.java
index 390995eea7cdbf637077525d457447b67e0750f7..647852f3d30a617f4f2a0b2e20735192c0b1315f 100644
--- a/src/main/java/org/olat/repository/handlers/RepositoryHandler.java
+++ b/src/main/java/org/olat/repository/handlers/RepositoryHandler.java
@@ -48,13 +48,12 @@ import org.olat.repository.model.RepositoryEntrySecurity;
 import org.olat.repository.ui.author.CreateEntryController;
 import org.olat.repository.ui.author.CreateRepositoryEntryController;
 
-
 /**
- * Initial Date:  Apr 5, 2004
+ * Initial Date: Apr 5, 2004
  *
  * @author Mike Stock
  * 
- * Comment:  
+ *         Comment:
  * 
  */
 public interface RepositoryHandler {
@@ -63,30 +62,35 @@ public interface RepositoryHandler {
 	 * @return Return the typeNames of OLATResourceable this Handler can handle.
 	 */
 	public String getSupportedType();
-	
+
 	/**
 	 * This resource support creation within OpenOLAT.
+	 * 
+	 * @param identity Identity who wants to create the the resource
+	 * @param roles    Roles of the identity who wants to create the the resource
 	 * @return
 	 */
-	public boolean supportCreate();
-	
+	public boolean supportCreate(Identity identity, Roles roles);
+
 	public String getCreateLabelI18nKey();
-	
-	public RepositoryEntry createResource(Identity initialAuthor, String displayname, String description, Object createObject, Organisation organisation, Locale locale);
-	
+
+	public RepositoryEntry createResource(Identity initialAuthor, String displayname, String description,
+			Object createObject, Organisation organisation, Locale locale);
+
 	/**
 	 * Typically for course wizard
+	 * 
 	 * @return
 	 */
 	public boolean isPostCreateWizardAvailable();
-	
+
 	/**
 	 * This resource support import of files.
 	 * 
 	 * @return
 	 */
 	public boolean supportImport();
-	
+
 	/**
 	 * 
 	 * @param file
@@ -94,30 +98,32 @@ public interface RepositoryHandler {
 	 * @return
 	 */
 	public ResourceEvaluation acceptImport(File file, String filename);
-	
+
 	/**
 	 * This resource support import with an URL.
+	 * 
 	 * @return
 	 */
 	public boolean supportImportUrl();
-	
+
 	public ResourceEvaluation acceptImport(String url);
-	
+
 	/**
 	 * 
 	 * @param initialAuthor
-	 * @param initialAuthorAlt 
+	 * @param initialAuthorAlt
 	 * @param displayname
 	 * @param description
-	 * @param withReferences if true import references
+	 * @param withReferences   if true import references
 	 * @param locale
 	 * @param file
 	 * @param filename
 	 * @return
 	 */
 	public RepositoryEntry importResource(Identity initialAuthor, String initialAuthorAlt, String displayname,
-			String description, boolean withReferences, Organisation organisation, Locale locale, File file, String filename);
-	
+			String description, boolean withReferences, Organisation organisation, Locale locale, File file,
+			String filename);
+
 	public RepositoryEntry importResource(Identity initialAuthor, String initialAuthorAlt, String displayname,
 			String description, Organisation organisation, Locale locale, String url);
 
@@ -128,27 +134,33 @@ public interface RepositoryHandler {
 	 * @return The target repository entry
 	 */
 	public RepositoryEntry copy(Identity author, RepositoryEntry source, RepositoryEntry target);
-	
+
 	/**
 	 * @return true if this handler supports donwloading Resourceables of its type.
 	 */
 	public boolean supportsDownload();
 
 	/**
-	 * @return true if this handler supports an editor for Resourceables of its type.
+	 * @param resource the reource to edit
+	 * @param identity Identity who wants to edit the the resource
+	 * @param roles    Roles of the identity who wants to edit the the resource
+	 * @return true if this handler supports an editor for Resourceables of its
+	 *         type.
 	 */
-	public EditionSupport supportsEdit(OLATResourceable resource);
-	
+	public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles);
+
 	/**
-	 * If the resource handler can deliver an assessment details controller,
-	 * it returns true.
+	 * If the resource handler can deliver an assessment details controller, it
+	 * returns true.
+	 * 
 	 * @return
 	 */
 	public boolean supportsAssessmentDetails();
-	
+
 	/**
-	 * Return the container where image and files can be saved for the description field.
-	 * the folder MUST be under the root folder has its name "media".
+	 * Return the container where image and files can be saved for the description
+	 * field. the folder MUST be under the root folder has its name "media".
+	 * 
 	 * @param repoEntry
 	 * @return
 	 */
@@ -156,38 +168,48 @@ public interface RepositoryHandler {
 
 	/**
 	 * Called if a user launches a Resourceable that this handler can handle.
-	 * @param reSecurity The permissions wrapper
+	 * 
+	 * @param reSecurity            The permissions wrapper
 	 * @param ureq
 	 * @param wControl
 	 * @param res
-	 * @param initialViewIdentifier if null the default view will be started, otherwise a controllerfactory type dependant view will be activated (subscription subtype)
+	 * @param initialViewIdentifier if null the default view will be started,
+	 *                              otherwise a controllerfactory type dependant
+	 *                              view will be activated (subscription subtype)
 	 * @return Controller able to launch resourceable.
 	 */
-	public MainLayoutController createLaunchController(RepositoryEntry re, RepositoryEntrySecurity reSecurity, UserRequest ureq, WindowControl wControl);
-	
+	public MainLayoutController createLaunchController(RepositoryEntry re, RepositoryEntrySecurity reSecurity,
+			UserRequest ureq, WindowControl wControl);
+
 	/**
-	 * Called if a user wants to edit a Resourceable that this handler can provide an editor for. 
-	 * (it is given here that this method 
-	 * can only be called when the current user is either olat admin or in the owning group of this resource
+	 * Called if a user wants to edit a Resourceable that this handler can provide
+	 * an editor for. (it is given here that this method can only be called when the
+	 * current user is either olat admin or in the owning group of this resource
+	 * 
 	 * @param ureq
 	 * @param wControl
 	 * @param toolbar
 	 * @param res
 	 * @return Controler able to edit resourceable.
 	 */
-	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbar);
-	
+	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl,
+			TooledStackedPanel toolbar);
+
 	/**
 	 * Called if a user wants to create a Resourceable via wizard.
+	 * 
 	 * @param res
 	 * @param ureq
 	 * @param wControl
 	 * @return Controller that guides trough the creation workflow via wizard.
 	 */
-	public StepsMainRunController createWizardController(OLATResourceable res, UserRequest ureq, WindowControl wControl);
-	
+	public StepsMainRunController createWizardController(OLATResourceable res, UserRequest ureq,
+			WindowControl wControl);
+
 	/**
-	 * Called if a user wants to open the create repository entry dialog for a Resourceable
+	 * Called if a user wants to open the create repository entry dialog for a
+	 * Resourceable
+	 * 
 	 * @param ureq
 	 * @param wControl
 	 * @return Controller able to create resourceable.
@@ -195,7 +217,7 @@ public interface RepositoryHandler {
 	default CreateEntryController createCreateRepositoryEntryController(UserRequest ureq, WindowControl wControl) {
 		return new CreateRepositoryEntryController(ureq, wControl, this);
 	}
-	
+
 	/**
 	 * Return the details controller for the assessed identity.
 	 * 
@@ -206,19 +228,23 @@ public interface RepositoryHandler {
 	 * @param assessedIdentity
 	 * @return
 	 */
-	public Controller createAssessmentDetailsController(RepositoryEntry re, UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbar, Identity assessedIdentity);
-	
+	public Controller createAssessmentDetailsController(RepositoryEntry re, UserRequest ureq, WindowControl wControl,
+			TooledStackedPanel toolbar, Identity assessedIdentity);
+
 	/**
 	 * Called if a user downloads a Resourceable that this handler can handle.
+	 * 
 	 * @param res The OLAT resource
 	 * @return MediaResource delivering resourceable.
 	 */
 	public MediaResource getAsMediaResource(OLATResourceable res);
-	
+
 	/**
-	 * Called if the repository entry referencing the given Resourceable will be deleted
-	 * from the repository. Do any necessary cleanup work specific to this handler's type.
-	 * The handler is responsible for deleting the resourceable as well.
+	 * Called if the repository entry referencing the given Resourceable will be
+	 * deleted from the repository. Do any necessary cleanup work specific to this
+	 * handler's type. The handler is responsible for deleting the resourceable as
+	 * well.
+	 * 
 	 * @param res
 	 * @param ureq
 	 * @param wControl
@@ -227,9 +253,10 @@ public interface RepositoryHandler {
 	public boolean cleanupOnDelete(RepositoryEntry entry, OLATResourceable res);
 
 	/**
-	 * Called if the repository entry referencing the given Resourceable will be deleted
-	 * from the repository. Return status whether to proceed with the delete action. If
-	 * this method returns false, the entry will not be deleted.
+	 * Called if the repository entry referencing the given Resourceable will be
+	 * deleted from the repository. Return status whether to proceed with the delete
+	 * action. If this method returns false, the entry will not be deleted.
+	 * 
 	 * @param res
 	 * @param identity
 	 * @param roles
@@ -237,36 +264,39 @@ public interface RepositoryHandler {
 	 * @param errors
 	 * @return true if ressource is ready to delete, false if not.
 	 */
-	public boolean readyToDelete(RepositoryEntry entry, Identity identity, Roles roles, Locale locale, ErrorList errors);
-	
+	public boolean readyToDelete(RepositoryEntry entry, Identity identity, Roles roles, Locale locale,
+			ErrorList errors);
+
 	/**
 	 * Acquires lock for the input ores and identity.
+	 * 
 	 * @param ores
 	 * @param identity
 	 * @return the LockResult or null if no locking supported.
 	 */
 	public LockResult acquireLock(OLATResourceable ores, Identity identity);
-	
+
 	/**
 	 * Releases the lock.
 	 * 
 	 * @param lockResult the LockResult received when locking
 	 */
 	public void releaseLock(LockResult lockResult);
-	
+
 	/**
 	 * 
 	 * @param ores
 	 * @return
 	 */
-	public boolean isLocked(OLATResourceable ores); 
-	
+	public boolean isLocked(OLATResourceable ores);
+
 	/**
 	 * Called when the repository entry of that Resourceable changed.
-	 * @param entry 
+	 * 
+	 * @param entry
 	 */
 	default public void onDescriptionChanged(RepositoryEntry entry) {
 		// nothing to do
 	}
-	
+
 }
diff --git a/src/main/java/org/olat/repository/handlers/SCORMCPHandler.java b/src/main/java/org/olat/repository/handlers/SCORMCPHandler.java
index 5deb3ade6982e195424176597e4f19e23c1a41a4..30670d0d3e82577f99c59691710a9658c25be4bf 100644
--- a/src/main/java/org/olat/repository/handlers/SCORMCPHandler.java
+++ b/src/main/java/org/olat/repository/handlers/SCORMCPHandler.java
@@ -41,6 +41,7 @@ import org.olat.core.gui.media.ZippedDirectoryMediaResource;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Organisation;
+import org.olat.core.id.Roles;
 import org.olat.core.logging.AssertException;
 import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
 import org.olat.core.util.FileUtils;
@@ -73,7 +74,7 @@ import org.olat.util.logging.activity.LoggingResourceable;
 public class SCORMCPHandler extends FileHandler {
 	
 	@Override
-	public boolean supportCreate() {
+	public boolean supportCreate(Identity identity, Roles roles) {
 		return false;
 	}
 	
@@ -175,7 +176,7 @@ public class SCORMCPHandler extends FileHandler {
 	}
 
 	@Override
-	public EditionSupport supportsEdit(OLATResourceable resource) {
+	public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) {
 		return EditionSupport.no;
 	}
 	
diff --git a/src/main/java/org/olat/repository/handlers/SharedFolderHandler.java b/src/main/java/org/olat/repository/handlers/SharedFolderHandler.java
index 4757dc43463400ea1c4a6ad4cf3c85cc5465d15a..9b3bc1adfdd212d459b35fdcffe4db93b1afcc7e 100644
--- a/src/main/java/org/olat/repository/handlers/SharedFolderHandler.java
+++ b/src/main/java/org/olat/repository/handlers/SharedFolderHandler.java
@@ -77,7 +77,7 @@ import org.olat.resource.references.ReferenceManager;
 public class SharedFolderHandler implements RepositoryHandler {
 	
 	@Override
-	public boolean supportCreate() {
+	public boolean supportCreate(Identity identity, Roles roles) {
 		return true;
 	}
 	
@@ -156,7 +156,7 @@ public class SharedFolderHandler implements RepositoryHandler {
 	}
 
 	@Override
-	public EditionSupport supportsEdit(OLATResourceable resource) {
+	public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) {
 		return EditionSupport.embedded;
 	}
 	
diff --git a/src/main/java/org/olat/repository/handlers/VideoHandler.java b/src/main/java/org/olat/repository/handlers/VideoHandler.java
index 3decc1c7eaae25f74ab7d8f4c4090f57478ef2ca..f627e55aafac08cacaabcf9877a395ba613cc4e2 100644
--- a/src/main/java/org/olat/repository/handlers/VideoHandler.java
+++ b/src/main/java/org/olat/repository/handlers/VideoHandler.java
@@ -40,6 +40,7 @@ import org.olat.core.gui.media.NotFoundMediaResource;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Organisation;
+import org.olat.core.id.Roles;
 import org.olat.core.logging.AssertException;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.StringHelper;
@@ -88,7 +89,7 @@ public class VideoHandler extends FileHandler {
 	private RepositoryService repositoryService;
 	
 	@Override
-	public boolean supportCreate() {
+	public boolean supportCreate(Identity identity, Roles roles) {
 		return false;
 	}
 
@@ -227,7 +228,7 @@ public class VideoHandler extends FileHandler {
 	}
 
 	@Override
-	public EditionSupport supportsEdit(OLATResourceable resource) {
+	public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) {
 		return EditionSupport.no;
 	}
 	
diff --git a/src/main/java/org/olat/repository/handlers/WebDocumentCreateDelegate.java b/src/main/java/org/olat/repository/handlers/WebDocumentCreateDelegate.java
index 3ff2ee0bc8b1857c9278e882f974a4d2aacd4e90..767d8e0ba76d7382846fc2f18791b710e26f7ac1 100644
--- a/src/main/java/org/olat/repository/handlers/WebDocumentCreateDelegate.java
+++ b/src/main/java/org/olat/repository/handlers/WebDocumentCreateDelegate.java
@@ -23,6 +23,7 @@ import java.util.Locale;
 
 import org.olat.core.id.Identity;
 import org.olat.core.id.Organisation;
+import org.olat.core.id.Roles;
 import org.olat.repository.RepositoryEntry;
 
 /**
@@ -33,7 +34,7 @@ import org.olat.repository.RepositoryEntry;
  */
 public interface WebDocumentCreateDelegate {
 	
-	public boolean supportCreate();
+	public boolean supportCreate(Identity identity, Roles roles);
 	
 	public String getCreateLabelI18nKey();
 	
diff --git a/src/main/java/org/olat/repository/handlers/WebDocumentEditDelegate.java b/src/main/java/org/olat/repository/handlers/WebDocumentEditDelegate.java
index 1d54e89301886f9db39a6c4324206f2488a45908..81596c29b4684dd0bae7d5f99b48809618a80c76 100644
--- a/src/main/java/org/olat/repository/handlers/WebDocumentEditDelegate.java
+++ b/src/main/java/org/olat/repository/handlers/WebDocumentEditDelegate.java
@@ -23,6 +23,8 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.stack.TooledStackedPanel;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
+import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.repository.RepositoryEntry;
 
 /**
@@ -33,7 +35,7 @@ import org.olat.repository.RepositoryEntry;
  */
 public interface WebDocumentEditDelegate {
 	
-	public EditionSupport supportsEdit();
+	public EditionSupport supportsEdit(Identity identity, Roles roles);
 	
 	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbar);
 
diff --git a/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java b/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java
index 75a98cfde5c1d7620b88f7f52fb9ea5acdb49833..ecdac318ca43adaf7f7668859470bec68daf2fd9 100644
--- a/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java
+++ b/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java
@@ -31,6 +31,7 @@ import java.nio.file.Files;
 import java.nio.file.StandardCopyOption;
 import java.util.Locale;
 
+import org.apache.logging.log4j.Logger;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.persistence.DBFactory;
 import org.olat.core.gui.UserRequest;
@@ -43,8 +44,8 @@ import org.olat.core.gui.media.MediaResource;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Organisation;
+import org.olat.core.id.Roles;
 import org.olat.core.logging.AssertException;
-import org.apache.logging.log4j.Logger;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.StringHelper;
@@ -97,8 +98,8 @@ public class WebDocumentHandler extends FileHandler {
 	}
 	
 	@Override
-	public boolean supportCreate() {
-		return createDelegate.supportCreate();
+	public boolean supportCreate(Identity identity, Roles roles) {
+		return createDelegate.supportCreate(identity, roles);
 	}
 
 	@Override
@@ -235,8 +236,8 @@ public class WebDocumentHandler extends FileHandler {
 	}
 
 	@Override
-	public EditionSupport supportsEdit(OLATResourceable resource) {
-		return editDelegate.supportsEdit();
+	public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) {
+		return editDelegate.supportsEdit(identity, roles);
 	}
 	
 	@Override
@@ -304,7 +305,7 @@ public class WebDocumentHandler extends FileHandler {
 	private static class NullCreateDelegate implements WebDocumentCreateDelegate {
 
 		@Override
-		public boolean supportCreate() {
+		public boolean supportCreate(Identity identity, Roles roles) {
 			return false;
 		}
 
@@ -324,7 +325,7 @@ public class WebDocumentHandler extends FileHandler {
 	private static class NullEditDelegate implements WebDocumentEditDelegate {
 
 		@Override
-		public EditionSupport supportsEdit() {
+		public EditionSupport supportsEdit(Identity identity, Roles roles) {
 			return EditionSupport.no;
 		}
 
diff --git a/src/main/java/org/olat/repository/handlers/WikiHandler.java b/src/main/java/org/olat/repository/handlers/WikiHandler.java
index cea1e1cf5a67c975d40575af403994d13552e679..37930e695c3c85830b0cc05a61c983f2cd016ac0 100644
--- a/src/main/java/org/olat/repository/handlers/WikiHandler.java
+++ b/src/main/java/org/olat/repository/handlers/WikiHandler.java
@@ -91,7 +91,7 @@ import org.olat.resource.references.ReferenceManager;
 public class WikiHandler implements RepositoryHandler {
 
 	@Override
-	public boolean supportCreate() {
+	public boolean supportCreate(Identity identity, Roles roles) {
 		return CoreSpringFactory.getImpl(WikiModule.class).isWikiEnabled();
 	}
 	
@@ -178,7 +178,7 @@ public class WikiHandler implements RepositoryHandler {
 	}
 
 	@Override
-	public EditionSupport supportsEdit(OLATResourceable resource) {
+	public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) {
 		return EditionSupport.embedded;
 	}
 	
diff --git a/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java
index 78bbb656f9fa730c6af63addd5cc01cba8d718ea..1006254e1c75c476a9f8083f2f2cad30aabd64e1 100644
--- a/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java
+++ b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java
@@ -405,7 +405,7 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 	}
 	
 	protected void initToolsMenuEditor(Dropdown toolsDropdown) {
-		if (reSecurity.isEntryAdmin() && handler.supportsEdit(re.getOlatResource()) == EditionSupport.yes) {
+		if (reSecurity.isEntryAdmin() && handler.supportsEdit(re.getOlatResource(), getIdentity(), roles) == EditionSupport.yes) {
 			toolsDropdown.addComponent(new Spacer("editors-tools"));
 			
 			boolean managed = RepositoryEntryManagedFlag.isManaged(getRepositoryEntry(), RepositoryEntryManagedFlag.editcontent);
@@ -496,7 +496,7 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 		if(entries != null && !entries.isEmpty()) {
 			String type = entries.get(0).getOLATResourceable().getResourceableTypeName();
 			if("Editor".equalsIgnoreCase(type)) {
-				if(handler.supportsEdit(re) == EditionSupport.yes
+				if(handler.supportsEdit(re, ureq.getIdentity(), ureq.getUserSession().getRoles()) == EditionSupport.yes
 						&& re.getEntryStatus() != RepositoryEntryStatusEnum.closed) {
 					doEdit(ureq);
 				}
diff --git a/src/main/java/org/olat/repository/ui/WebDocumentRunController.java b/src/main/java/org/olat/repository/ui/WebDocumentRunController.java
index 46ca748a839d12997d2d61e7648bb1d260dc4627..17bc1fc539a89c81a155a6f187dd693fa46af2da 100644
--- a/src/main/java/org/olat/repository/ui/WebDocumentRunController.java
+++ b/src/main/java/org/olat/repository/ui/WebDocumentRunController.java
@@ -102,7 +102,7 @@ public class WebDocumentRunController extends BasicController {
 					mainVC.contextPut("height", 480);
 					mainVC.contextPut("width", 640);
 				}
-			} else if (docEditorService.hasEditor(extension, Mode.VIEW, true)) {
+			} else if (docEditorService.hasEditor(getIdentity(), ureq.getUserSession().getRoles(), extension, Mode.VIEW, true)) {
 				DocEditorSecurityCallback secCallback = DocEditorSecurityCallbackBuilder.builder()
 						.withMode(Mode.VIEW)
 						.canClose(false)
diff --git a/src/main/java/org/olat/repository/ui/author/AuthorDeletedListController.java b/src/main/java/org/olat/repository/ui/author/AuthorDeletedListController.java
index 7ba5f4c28c34044e6451ea25f57824c037650aaf..67cb8c728eb6c5f6296471d81bab7712e93c4e9a 100644
--- a/src/main/java/org/olat/repository/ui/author/AuthorDeletedListController.java
+++ b/src/main/java/org/olat/repository/ui/author/AuthorDeletedListController.java
@@ -74,7 +74,7 @@ public class AuthorDeletedListController extends AuthorListController {
 	}
 
 	@Override
-	protected void initTools() {
+	protected void initTools(UserRequest ureq) {
 		//
 	}
 
diff --git a/src/main/java/org/olat/repository/ui/author/AuthorListController.java b/src/main/java/org/olat/repository/ui/author/AuthorListController.java
index 243f37ad9640c8f5c7a01b05f4eaa6a927533233..7a1d59d61567d3233261f7887f415099bf310be3 100644
--- a/src/main/java/org/olat/repository/ui/author/AuthorListController.java
+++ b/src/main/java/org/olat/repository/ui/author/AuthorListController.java
@@ -212,10 +212,10 @@ public class AuthorListController extends FormBasicController implements Activat
 
 		stackPanel = new TooledStackedPanel(i18nName, getTranslator(), this);
 		stackPanel.pushController(translate(i18nName), this);
-		initTools();
+		initTools(ureq);
 	}
 	
-	protected void initTools() {
+	protected void initTools(UserRequest ureq) {
 		if(!withSearch && hasAuthorRight) {
 			importLink = LinkFactory.createLink("cmd.import.ressource", getTranslator(), this);
 			importLink.setDomReplacementWrapperRequired(false);
@@ -237,7 +237,7 @@ public class AuthorListController extends FormBasicController implements Activat
 			for(OrderedRepositoryHandler orderedHandler:handlers) {
 				RepositoryHandler handler = orderedHandler.getHandler();
 				
-				if(handler != null && handler.supportCreate()) {
+				if(handler != null && handler.supportCreate(getIdentity(), ureq.getUserSession().getRoles())) {
 					// for each 10-group, create a separator
 					int group = orderedHandler.getOrder() / 10;
 					if (group > lastGroup) {
@@ -350,7 +350,7 @@ public class AuthorListController extends FormBasicController implements Activat
 		
 		initActionsColumns(columnsModel);
 		
-		model = new AuthoringEntryDataModel(dataSource, columnsModel);
+		model = new AuthoringEntryDataModel(dataSource, columnsModel, getIdentity(), ureq.getUserSession().getRoles());
 		tableEl = uifactory.addTableElement(getWindowControl(), "table", model, 20, false, getTranslator(), formLayout);
 		tableEl.setSearchEnabled(withSearch);
 		tableEl.setCssDelegate(this);
diff --git a/src/main/java/org/olat/repository/ui/author/AuthoringEntryDataModel.java b/src/main/java/org/olat/repository/ui/author/AuthoringEntryDataModel.java
index 5b37e2dcf8c56c916e249bc805bc904cc6c8e53c..38e467ed8feedccacc98af64812404c808c61450 100644
--- a/src/main/java/org/olat/repository/ui/author/AuthoringEntryDataModel.java
+++ b/src/main/java/org/olat/repository/ui/author/AuthoringEntryDataModel.java
@@ -25,6 +25,8 @@ import java.util.List;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataSourceModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
+import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.repository.RepositoryEntryStatusEnum;
 import org.olat.repository.handlers.EditionSupport;
 import org.olat.repository.handlers.RepositoryHandler;
@@ -39,15 +41,20 @@ import org.olat.repository.handlers.RepositoryHandlerFactory;
 class AuthoringEntryDataModel extends DefaultFlexiTableDataSourceModel<AuthoringEntryRow> {
 
 	private final RepositoryHandlerFactory handlerFactory;
+	private Identity identity;
+	private Roles roles;
 	
-	public AuthoringEntryDataModel(AuthoringEntryDataSource source, FlexiTableColumnModel columnModel) {
+	public AuthoringEntryDataModel(AuthoringEntryDataSource source, FlexiTableColumnModel columnModel,
+			Identity identity, Roles roles) {
 		super(source, columnModel);
+		this.identity = identity;
+		this.roles = roles;
 		handlerFactory = CoreSpringFactory.getImpl(RepositoryHandlerFactory.class);
 	}
 
 	@Override
 	public DefaultFlexiTableDataSourceModel<AuthoringEntryRow> createCopyWithEmptyList() {
-		return new AuthoringEntryDataModel(getSourceDelegate(), getTableColumnModel());
+		return new AuthoringEntryDataModel(getSourceDelegate(), getTableColumnModel(), identity, roles);
 	}
 	
 	public boolean isAuthoringEntryRowLoaded(List<Long> repoEntryKeys) {
@@ -126,7 +133,7 @@ class AuthoringEntryDataModel extends DefaultFlexiTableDataSourceModel<Authoring
 				if(handler == null) {
 					return Boolean.FALSE;
 				}
-				if(handler.supportsEdit(item.getOLATResourceable()) == EditionSupport.no) {
+				if(handler.supportsEdit(item.getOLATResourceable(), identity, roles) == EditionSupport.no) {
 					return Boolean.FALSE;
 				}
 				RepositoryEntryStatusEnum status = item.getEntryStatus();
diff --git a/src/main/resources/serviceconfig/olat.properties b/src/main/resources/serviceconfig/olat.properties
index b5c6b99120347bb88a844cb338fc8bdb18527c93..0e7e02f7e4322bc8517c04fd4f071284cc07e8ca 100644
--- a/src/main/resources/serviceconfig/olat.properties
+++ b/src/main/resources/serviceconfig/olat.properties
@@ -1476,6 +1476,10 @@ edusharing.auth.affiliation.name=${instance.id}
 collabora.enabled=false
 collabora.baseUrl=https://collabora.example.org/
 collabora.data.transfer.confirmation.enabled=false
+collabora.usage.restricted=false
+collabora.usage.restricted.authors=false
+collabora.usage.restricted.coaches=false
+collabora.usage.restricted.managers=false
 
 
 ########################################
@@ -1485,6 +1489,10 @@ onlyoffice.enabled=false
 onlyoffice.baseUrl=https://onlyoffice.example.org/
 onlyoffice.api.path=web-apps/apps/api/documents/api.js
 onlyoffice.data.transfer.confirmation.enabled=false
+onlyoffice.usage.restricted=false
+onlyoffice.usage.restricted.authors=false
+onlyofficeusage.restricted.coaches=false
+onlyoffice.usage.restricted.managers=false
 
 
 ########################################
@@ -1493,6 +1501,10 @@ onlyoffice.data.transfer.confirmation.enabled=false
 office365.enabled=false
 office365.baseUrl=https://office365.example.org/
 office365.data.transfer.confirmation.enabled=false
+office365.usage.restricted=false
+office365.usage.restricted.authors=false
+office365.usage.restricted.coaches=false
+office365.usage.restricted.managers=false
 
 
 ########################################