From e7f47347596d15906b4c5bc907a31fa8549ada95 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Fri, 17 May 2019 17:19:02 +0200
Subject: [PATCH] OO-4058: refactor curriculum roles

---
 .../site/ui/_i18n/LocalStrings_de.properties  |  4 +-
 .../site/ui/_i18n/LocalStrings_en.properties  |  4 +-
 .../site/ui/_i18n/LocalStrings_fr.properties  |  4 +-
 .../ui/_i18n/LocalStrings_pt_BR.properties    |  3 +-
 .../bulkChange/UserBulkChangeManager.java     |  2 +-
 .../user/course/CourseOverviewController.java |  2 +-
 .../nodes/portfolio/PortfolioConfigForm.java  |  2 +-
 .../nodes/video/VideoEditController.java      |  4 +-
 .../site/ui/CourseSiteAdminController.java    |  4 +-
 .../BusinessGroupEditResourceController.java  |  2 +-
 .../ui/main/EditMembershipController.java     |  2 +-
 .../BGConfigResourcesStepController.java      |  2 +-
 .../CurriculumElementMembership.java          |  2 +-
 .../modules/curriculum/CurriculumRoles.java   |  1 +
 .../CurriculumSecurityCallback.java           | 16 +++-
 .../CurriculumSecurityCallbackFactory.java    | 50 ++++++++--
 .../modules/curriculum/CurriculumService.java |  6 +-
 .../curriculum/manager/CurriculumDAO.java     | 47 ++++++----
 .../manager/CurriculumElementDAO.java         | 21 ++++-
 .../manager/CurriculumServiceImpl.java        | 25 +++--
 .../CurriculumElementMembershipChange.java    | 16 ++--
 .../CurriculumElementMembershipImpl.java      | 12 +--
 .../model/CurriculumSearchParameters.java     | 24 +++--
 .../restapi/CurriculumElementsWebService.java | 17 ++--
 .../restapi/CurriculumsWebService.java        | 16 ++--
 ...iculumManagerAndOwnerSecurityCallback.java |  2 +-
 .../CurriculumManagerSecurityCallback.java    |  2 +-
 .../ui/CurriculumComposerController.java      | 47 +++++-----
 ...rriculumElementResourceListController.java | 13 ++-
 ...iculumElementUserManagementController.java |  8 +-
 .../ui/CurriculumListManagerController.java   | 17 +++-
 .../curriculum/ui/CurriculumTreeModel.java    | 11 ++-
 .../CurriculumUserManagementController.java   |  2 +-
 .../ui/EditCurriculumElementController.java   | 22 +++--
 .../ui/MoveCurriculumElementController.java   | 19 +++-
 .../ui/_i18n/LocalStrings_de.properties       |  1 +
 .../ui/_i18n/LocalStrings_en.properties       |  1 +
 .../portfolio/ui/BinderListController.java    |  2 +-
 .../qpool/ui/QuestionListController.java      |  2 +-
 .../RepositoryEntryWhiteListController.java   |  2 +-
 .../wizard/AddCourseUserSearchController.java |  2 +-
 .../olat/portfolio/ui/EPMapRunController.java |  2 +-
 .../olat/repository/RepositoryManager.java    | 40 ++++----
 .../ReferencableEntriesSearchController.java  | 19 ++--
 .../RepositorySearchController.java           | 32 +++----
 .../handlers/WebDocumentHandler.java          | 14 +--
 .../repository/ui/RepositoryTableModel.java   |  9 +-
 .../ui/WebDocumentRunController.java          |  4 +-
 .../repository/ui/author/AccessRenderer.java  | 15 +++
 .../catalog/CatalogNodeManagerController.java |  2 +-
 .../java/org/olat/upgrade/OLATUpgrade.java    |  3 -
 .../org/olat/upgrade/OLATUpgrade_13_3_0.java  | 91 +++++++++++++++++--
 .../OrganisationResourceListController.java   |  2 +-
 .../curriculum/manager/CurriculumDAOTest.java | 40 ++++++--
 .../manager/CurriculumElementDAOTest.java     |  8 +-
 .../manager/CurriculumMemberQueriesTest.java  |  8 +-
 .../manager/CurriculumServiceTest.java        |  2 +-
 .../manager/EPStructureManagerTest.java       |  2 +-
 .../repository/RepositoryManagerTest.java     |  4 +-
 .../CurriculumElementsWebServiceTest.java     | 13 +--
 .../restapi/CurriculumsWebServiceTest.java    | 26 +++---
 61 files changed, 502 insertions(+), 275 deletions(-)

diff --git a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_de.properties
index 10cdf153d91..1bed045c4e5 100644
--- a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_de.properties
@@ -13,8 +13,8 @@ CourseSiteDef4=Infoseite n\u00b04
 CourseSiteDef=Infoseite n\u00b01
 courseSiteForbiddenAlt=Forbidden ctrl.
 CurriculumAdminSiteDef=Curriculumverwaltung
-curriculumManagerAndOwnerSiteSecurityCallback=Curriculumverwalter und Kursbesitzer
-curriculumManagerSiteSecurityCallback=Curriculumverwalter
+curriculumManagerAndOwnerSiteSecurityCallback=Curriculumverwalter bis zu Kursbesitzer
+curriculumManagerSiteSecurityCallback=Curriculumverwalter und Curriculumbesitzer
 defaultSiteSecurityCallback=Alle inklusive G\u00e4ste und eP-Einladung
 disabledSiteSecurityCallback=Deaktiviert
 DocumentPoolSiteDef=Dokumentenpool
diff --git a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_en.properties
index e36579aa971..10db52e1583 100644
--- a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_en.properties
@@ -25,8 +25,8 @@ adminSiteSecurityCallback=Administrators only
 authorAndPoolPrivateMembersSiteSecurityCallback=Authors, question bank admins and members
 catalogManagerSiteSecurityCallback=Catalog manager and learning resource managers
 courseSiteForbiddenAlt=Forbidden ctrl.
-curriculumManagerAndOwnerSiteSecurityCallback=Curriculum managers and course owners
-curriculumManagerSiteSecurityCallback=Curriculum managers
+curriculumManagerAndOwnerSiteSecurityCallback=Curriculum managers up to course owners
+curriculumManagerSiteSecurityCallback=Curriculum managers and curriculum owners
 defaultSiteSecurityCallback=All, including guests and invitee
 disabledSiteSecurityCallback=Disabled
 down=Down
diff --git a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_fr.properties
index d5e11ac3e26..569aee5ef5e 100644
--- a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_fr.properties
@@ -27,8 +27,8 @@ adminSiteSecurityCallback=Administrateurs
 authorAndPoolPrivateMembersSiteSecurityCallback=Auteurs, membres et administrateurs de pool de questions
 catalogManagerSiteSecurityCallback=Administrateurs du catalogue et des ressources didactiques
 courseSiteForbiddenAlt=Acc\u00E8s interdit
-curriculumManagerAndOwnerSiteSecurityCallback=Administrateurs de cursus et propri\u00E9taires de cours
-curriculumManagerSiteSecurityCallback=Administrateurs de cursus
+curriculumManagerAndOwnerSiteSecurityCallback=Administrateurs de cursus jusqu'\u00E0 propri\u00E9taires de cours
+curriculumManagerSiteSecurityCallback=Administrateurs de cursus et propri\u00E9taires de cursus 
 defaultSiteSecurityCallback=Tous y compris les invit\u00E9 et les invitations eP
 disabledSiteSecurityCallback=D\u00E9sactiv\u00E9
 down=En bas
diff --git a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_pt_BR.properties
index 9940e37df93..4660d9c4b7f 100644
--- a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_pt_BR.properties
+++ b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_pt_BR.properties
@@ -27,8 +27,7 @@ adminSiteSecurityCallback=Administradores
 authorAndPoolPrivateMembersSiteSecurityCallback=Autores, admins de banco de perguntas e membros
 catalogManagerSiteSecurityCallback=Gestores de cat\u00E1logo e recursos did\u00E1ticos
 courseSiteForbiddenAlt=Ctrl Proibido.
-curriculumManagerAndOwnerSiteSecurityCallback=Gestores de curr\u00EDculo e propriet\u00E1rios de cursos
-curriculumManagerSiteSecurityCallback=Gestores de curr\u00EDculo
+curriculumManagerSiteSecurityCallback=Gestores de curr\u00EDculo e propriet\u00E1rios de curr\u00EDculo
 defaultSiteSecurityCallback=Todos
 disabledSiteSecurityCallback=Inativo
 down=Para baixo
diff --git a/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeManager.java b/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeManager.java
index 4594c29f863..4cef2ade28a 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeManager.java
+++ b/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeManager.java
@@ -312,7 +312,7 @@ public class UserBulkChangeManager implements InitializingBean {
 			String internalGender = ((GenderPropertyHandler)handler).getInternalValue(identity.getUser());
 			if(StringHelper.containsNonWhitespace(internalGender)) {
 				Translator userPropTrans = userManager.getUserPropertiesConfig().getTranslator(translator);
-				gender = userPropTrans.translate("form.name.gender.salutation." + internalGender);
+				gender = userPropTrans.translate("form.name.gender.salutation." + internalGender.toLowerCase());
 			}
 		}
 		
diff --git a/src/main/java/org/olat/admin/user/course/CourseOverviewController.java b/src/main/java/org/olat/admin/user/course/CourseOverviewController.java
index 7127820f914..5e2f5b33c80 100644
--- a/src/main/java/org/olat/admin/user/course/CourseOverviewController.java
+++ b/src/main/java/org/olat/admin/user/course/CourseOverviewController.java
@@ -375,7 +375,7 @@ public class CourseOverviewController extends BasicController  {
 		RepositoryEntryFilter filter = new ManagedEntryfilter();
 		repoSearchCtr = new ReferencableEntriesSearchController(getWindowControl(), ureq,
 				new String[]{ CourseModule.getCourseTypeName() }, filter,
-				translate("choose"), false, false, true, true, Can.all);
+				translate("choose"), false, false, true, false, true, Can.all);
 		repoSearchCtr.setUserObject(type);
 		listenTo(repoSearchCtr);
 		cmc = new CloseableModalController(getWindowControl(), translate("close"), repoSearchCtr.getInitialComponent(),
diff --git a/src/main/java/org/olat/course/nodes/portfolio/PortfolioConfigForm.java b/src/main/java/org/olat/course/nodes/portfolio/PortfolioConfigForm.java
index 1bdf8f2ea41..19f1289cf37 100644
--- a/src/main/java/org/olat/course/nodes/portfolio/PortfolioConfigForm.java
+++ b/src/main/java/org/olat/course/nodes/portfolio/PortfolioConfigForm.java
@@ -248,7 +248,7 @@ public class PortfolioConfigForm extends FormBasicController {
 		
 		searchController = new ReferencableEntriesSearchController(getWindowControl(), ureq,
 				new String[]{ EPTemplateMapResource.TYPE_NAME, BinderTemplateResource.TYPE_NAME},
-				translate("select.map2"), false, true, false, false);			
+				translate("select.map2"), false, true, false, false, false);			
 		listenTo(searchController);
 		
 		cmc = new CloseableModalController(getWindowControl(), translate("close"), searchController.getInitialComponent(), true, translate("select.map"));
diff --git a/src/main/java/org/olat/course/nodes/video/VideoEditController.java b/src/main/java/org/olat/course/nodes/video/VideoEditController.java
index 28c5de2f91c..71ba02dc3dd 100644
--- a/src/main/java/org/olat/course/nodes/video/VideoEditController.java
+++ b/src/main/java/org/olat/course/nodes/video/VideoEditController.java
@@ -232,7 +232,9 @@ public class VideoEditController extends ActivateableTabbableDefaultController i
 		removeAsListenerAndDispose(cmc);
 		removeAsListenerAndDispose(searchController);
 		
-		searchController = new ReferencableEntriesSearchController(getWindowControl(), ureq, new String[] {VideoFileResource.TYPE_NAME}, translate(NLS_COMMAND_CHOOSEVIDEO), true, false, false, false);
+		searchController = new ReferencableEntriesSearchController(getWindowControl(), ureq,
+				new String[] {VideoFileResource.TYPE_NAME}, translate(NLS_COMMAND_CHOOSEVIDEO),
+				true, false, false, false, false);
 		listenTo(searchController);
 
 		cmc = new CloseableModalController(getWindowControl(), translate("close"), searchController.getInitialComponent(), true, translate(NLS_COMMAND_CHOOSEVIDEO));
diff --git a/src/main/java/org/olat/course/site/ui/CourseSiteAdminController.java b/src/main/java/org/olat/course/site/ui/CourseSiteAdminController.java
index 66e426c58ad..e12f40aec60 100644
--- a/src/main/java/org/olat/course/site/ui/CourseSiteAdminController.java
+++ b/src/main/java/org/olat/course/site/ui/CourseSiteAdminController.java
@@ -222,7 +222,7 @@ public class CourseSiteAdminController extends FormBasicController {
 	private void doSelecCourse(UserRequest ureq, LanguageConfigurationRow row) {
 		removeAsListenerAndDispose(selectCtrl);
 		selectCtrl = new ReferencableEntriesSearchController(getWindowControl(), ureq, new String[]{ "CourseModule" }, translate("select"),
-				true, true, false, true);
+				true, true, false, false, true);
 		selectCtrl.setUserObject(row);
 		listenTo(selectCtrl);
 		
@@ -238,7 +238,7 @@ public class CourseSiteAdminController extends FormBasicController {
 	}
 	
 	public CourseSiteConfiguration saveConfiguration() {
-		List<LanguageConfiguration> langConfigList = new ArrayList<LanguageConfiguration>();
+		List<LanguageConfiguration> langConfigList = new ArrayList<>();
 		for(LanguageConfigurationRow row:model.getObjects()) {
 			if(StringHelper.containsNonWhitespace(row.getSoftKey())) {
 				langConfigList.add(row.getRawObject());
diff --git a/src/main/java/org/olat/group/ui/edit/BusinessGroupEditResourceController.java b/src/main/java/org/olat/group/ui/edit/BusinessGroupEditResourceController.java
index 4d2978ee119..65278e558fc 100644
--- a/src/main/java/org/olat/group/ui/edit/BusinessGroupEditResourceController.java
+++ b/src/main/java/org/olat/group/ui/edit/BusinessGroupEditResourceController.java
@@ -143,7 +143,7 @@ public class BusinessGroupEditResourceController extends BasicController impleme
 			RepositoryEntryFilter filter = new ManagedEntryfilter();
 			repoSearchCtr = new ReferencableEntriesSearchController(getWindowControl(), ureq,
 					new String[]{ CourseModule.getCourseTypeName() }, filter,
-					translate("resources.add"), true, true, true, true, Can.referenceable);
+					translate("resources.add"), true, true, true, false, true, Can.referenceable);
 			listenTo(repoSearchCtr);
 			cmc = new CloseableModalController(getWindowControl(), translate("close"), repoSearchCtr.getInitialComponent(), true, translate("resources.add.title"));
 			listenTo(cmc);
diff --git a/src/main/java/org/olat/group/ui/main/EditMembershipController.java b/src/main/java/org/olat/group/ui/main/EditMembershipController.java
index dde0edb1896..1f5c8cd4f85 100644
--- a/src/main/java/org/olat/group/ui/main/EditMembershipController.java
+++ b/src/main/java/org/olat/group/ui/main/EditMembershipController.java
@@ -542,7 +542,7 @@ public class EditMembershipController extends FormBasicController {
 			change.setCoach(rePermission.isTutor() == cCoach ? null : Boolean.valueOf(cCoach));
 			boolean cParticipant = option.getParticipant().isAtLeastSelected(1);
 			change.setParticipant(rePermission.isParticipant() == cParticipant ? null : Boolean.valueOf(cParticipant));
-			if(change.getCurriculumManager() != null || change.getRepositoryEntryOwner() != null || change.getCoach() != null || change.getParticipant() != null) {
+			if(change.getCurriculumElementOwner() != null || change.getRepositoryEntryOwner() != null || change.getCoach() != null || change.getParticipant() != null) {
 				changes.add(change);
 			}
 		}
diff --git a/src/main/java/org/olat/group/ui/wizard/BGConfigResourcesStepController.java b/src/main/java/org/olat/group/ui/wizard/BGConfigResourcesStepController.java
index 9fec71b6cfd..af28862a274 100644
--- a/src/main/java/org/olat/group/ui/wizard/BGConfigResourcesStepController.java
+++ b/src/main/java/org/olat/group/ui/wizard/BGConfigResourcesStepController.java
@@ -155,7 +155,7 @@ public class BGConfigResourcesStepController extends StepFormBasicController {
 			removeAsListenerAndDispose(cmc);
 			
 			repoSearchCtr = new ReferencableEntriesSearchController(getWindowControl(), ureq, new String[]{CourseModule.getCourseTypeName()},
-					translate("resources.add"), true, true, true, true);
+					translate("resources.add"), true, true, true, false, true);
 			listenTo(repoSearchCtr);
 			cmc = new CloseableModalController(getWindowControl(), translate("close"), this.repoSearchCtr.getInitialComponent(), true, translate("resources.add.title"));
 			listenTo(cmc);
diff --git a/src/main/java/org/olat/modules/curriculum/CurriculumElementMembership.java b/src/main/java/org/olat/modules/curriculum/CurriculumElementMembership.java
index 07b6bbc1539..ee5e7ccb6f2 100644
--- a/src/main/java/org/olat/modules/curriculum/CurriculumElementMembership.java
+++ b/src/main/java/org/olat/modules/curriculum/CurriculumElementMembership.java
@@ -37,7 +37,7 @@ public interface CurriculumElementMembership {
 	
 	public boolean isParticipant();
 	
-	public boolean isCurriculumManager();
+	public boolean isCurriculumElementOwner();
 	
 	/**
 	 * @return true if the identity has at least one role on the curriculum element
diff --git a/src/main/java/org/olat/modules/curriculum/CurriculumRoles.java b/src/main/java/org/olat/modules/curriculum/CurriculumRoles.java
index 8cadc674d26..a251b9131f0 100644
--- a/src/main/java/org/olat/modules/curriculum/CurriculumRoles.java
+++ b/src/main/java/org/olat/modules/curriculum/CurriculumRoles.java
@@ -35,6 +35,7 @@ public enum CurriculumRoles {
 	
 	curriculummanager,
 	curriculumowner,// own a piece of a curriculum
+	curriculumelementowner,// own a piece of curriculum
 	owner, //same as GroupRoles
 	coach, //same as GroupRoles
 	participant; //same as GroupRoles
diff --git a/src/main/java/org/olat/modules/curriculum/CurriculumSecurityCallback.java b/src/main/java/org/olat/modules/curriculum/CurriculumSecurityCallback.java
index 61ab3e77756..da9e227045b 100644
--- a/src/main/java/org/olat/modules/curriculum/CurriculumSecurityCallback.java
+++ b/src/main/java/org/olat/modules/curriculum/CurriculumSecurityCallback.java
@@ -35,11 +35,21 @@ public interface CurriculumSecurityCallback {
 	
 	public boolean canNewCurriculumElement();
 	
-	public boolean canEditCurriculumElement();
+	public boolean canEditCurriculumElements();
 	
-	public boolean canManagerCurriculumElementUsers();
+	/**
+	 * @param element The curriculum element
+	 * @return true if the user can edit the specified curriculum element
+	 */
+	public boolean canEditCurriculumElement(CurriculumElement element);
 	
-	public boolean canManagerCurriculumElementResources();
+	public boolean canEditCurriculumTree();
+	
+	public boolean canManagerCurriculumElementsUsers();
+	
+	public boolean canManagerCurriculumElementUsers(CurriculumElement element);
+	
+	public boolean canManagerCurriculumElementResources(CurriculumElement element);
 	
 	public boolean canViewAllCalendars();
 	
diff --git a/src/main/java/org/olat/modules/curriculum/CurriculumSecurityCallbackFactory.java b/src/main/java/org/olat/modules/curriculum/CurriculumSecurityCallbackFactory.java
index 5fa97c42b9a..4f58624415f 100644
--- a/src/main/java/org/olat/modules/curriculum/CurriculumSecurityCallbackFactory.java
+++ b/src/main/java/org/olat/modules/curriculum/CurriculumSecurityCallbackFactory.java
@@ -19,6 +19,11 @@
  */
 package org.olat.modules.curriculum;
 
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 import org.olat.core.id.Roles;
 
 /**
@@ -37,24 +42,28 @@ public class CurriculumSecurityCallbackFactory {
 	 * @return A security callback without any administration permissions.
 	 */
 	public static final CurriculumSecurityCallback createDefaultCallback() {
-		return new DefaultCurriculumSecurityCallback(false);
+		return new DefaultCurriculumSecurityCallback(false, Collections.emptyList());
 	}
 	
 	public static final CurriculumSecurityCallback createCallback(Roles roles) {
 		boolean admin = roles.isCurriculumManager() || roles.isAdministrator();
-		return new DefaultCurriculumSecurityCallback(admin);
+		return new DefaultCurriculumSecurityCallback(admin, Collections.emptyList());
 	}
 	
-	public static final CurriculumSecurityCallback createCallback(boolean canManage) {
-		return new DefaultCurriculumSecurityCallback(canManage);
+	public static final CurriculumSecurityCallback createCallback(boolean canManage, List<CurriculumElementRef> ownedRefs) {
+		return new DefaultCurriculumSecurityCallback(canManage, ownedRefs);
 	}
 	
 	private static class DefaultCurriculumSecurityCallback implements CurriculumSecurityCallback {
 		
 		private final boolean admin;
+		private final Set<Long> ownedElementKeys;
 		
-		public DefaultCurriculumSecurityCallback(boolean admin) {
+		public DefaultCurriculumSecurityCallback(boolean admin, List<CurriculumElementRef> ownedElementRefs) {
 			this.admin = admin;
+			ownedElementKeys = ownedElementRefs.stream()
+					.map(CurriculumElementRef::getKey)
+					.collect(Collectors.toSet());
 		}
 
 		@Override
@@ -78,20 +87,43 @@ public class CurriculumSecurityCallbackFactory {
 		}
 
 		@Override
-		public boolean canEditCurriculumElement() {
-			return admin;
+		public boolean canEditCurriculumElements() {
+			return admin || !ownedElementKeys.isEmpty();
+		}
+		
+		@Override
+		public boolean canEditCurriculumElement(CurriculumElement element) {
+			if(element == null) return false;
+			if(admin) return true;
+			
+			for(CurriculumElement el=element ; el != null; el=el.getParent()) {
+				if(ownedElementKeys.contains(el.getKey())) {
+					return true;
+				}
+			}
+			return false;
 		}
 
 		@Override
-		public boolean canManagerCurriculumElementUsers() {
+		public boolean canEditCurriculumTree() {
 			return admin;
 		}
 
 		@Override
-		public boolean canManagerCurriculumElementResources() {
+		public boolean canManagerCurriculumElementsUsers() {
 			return admin;
 		}
 
+		@Override
+		public boolean canManagerCurriculumElementUsers(CurriculumElement element) {
+			return element != null &&  (admin || ownedElementKeys.contains(element.getKey()));
+		}
+
+		@Override
+		public boolean canManagerCurriculumElementResources(CurriculumElement element) {
+			return element != null &&  (admin || ownedElementKeys.contains(element.getKey()));
+		}
+
 		@Override
 		public boolean canViewAllCalendars() {
 			return admin;
diff --git a/src/main/java/org/olat/modules/curriculum/CurriculumService.java b/src/main/java/org/olat/modules/curriculum/CurriculumService.java
index 6237bbd9069..7c9b1c8c995 100644
--- a/src/main/java/org/olat/modules/curriculum/CurriculumService.java
+++ b/src/main/java/org/olat/modules/curriculum/CurriculumService.java
@@ -127,14 +127,14 @@ public interface CurriculumService {
 	 * @param identity The identity
 	 * @return true if the identity is manager of at least one curriculum
 	 */
-	public boolean isCurriculumManager(IdentityRef identity);
+	public boolean isCurriculumOwner(IdentityRef identity);
 	
 	/**
 	 * @param identity The identity
 	 * @return true if the identity is manager of at least one curriculum or
 	 * 		is course owner of a course in a curriculum.
 	 */
-	public boolean isCurriculumManagerOrOwner(IdentityRef identity);
+	public boolean isCurriculumOwnerUptoEntryOwner(IdentityRef identity);
 	
 	/**
 	 * Add a member to the curriculum with the specified role.
@@ -357,6 +357,8 @@ public interface CurriculumService {
 	 */
 	public List<Identity> getMembersIdentity(CurriculumElementRef element, CurriculumRoles role);
 	
+	public List<CurriculumElementMembership> getCurriculumElementMemberships(Curriculum curriculum, Identity identity);
+	
 	public List<CurriculumElementMembership> getCurriculumElementMemberships(Collection<CurriculumElement> elements, Identity... identities);
 	
 	public void updateCurriculumElementMemberships(Identity doer, Roles roles, List<CurriculumElementMembershipChange> changes);
diff --git a/src/main/java/org/olat/modules/curriculum/manager/CurriculumDAO.java b/src/main/java/org/olat/modules/curriculum/manager/CurriculumDAO.java
index 735988d98a1..2089919a597 100644
--- a/src/main/java/org/olat/modules/curriculum/manager/CurriculumDAO.java
+++ b/src/main/java/org/olat/modules/curriculum/manager/CurriculumDAO.java
@@ -76,6 +76,16 @@ public class CurriculumDAO {
 		return curriculum;
 	}
 	
+	public List<Curriculum> loadAllCurriculums() {
+		StringBuilder sb = new StringBuilder(128);
+		sb.append("select cur from curriculum cur")
+		  .append(" left join fetch cur.organisation org")
+		  .append(" inner join fetch cur.group baseGroup");
+		return dbInstance.getCurrentEntityManager()
+			.createQuery(sb.toString(), Curriculum.class)
+			.getResultList();
+	}
+	
 	public Curriculum loadByKey(Long key) {
 		StringBuilder sb = new StringBuilder(128);
 		sb.append("select cur from curriculum cur")
@@ -174,12 +184,12 @@ public class CurriculumDAO {
 			sb.append(")");	
 		}
 		
-		if(params.getManagerIdentity() != null) {
+		if(params.getCurriculumAdmin() != null) {
 			sb.and()
 			  .append("exists (select membership.key from bgroupmember as membership")
 			  .append("  where membership.identity.key=:managerKey")
 			  .append("  and (membership.group.key=baseGroup.key or organis.group.key=baseGroup.key)")
-			  .append("  and role in ('").append(CurriculumRoles.curriculummanager).append("')")
+			  .append("  and role ").in(CurriculumRoles.curriculummanager, CurriculumRoles.curriculumowner)
 			  .append(")");
 		}
 
@@ -199,8 +209,8 @@ public class CurriculumDAO {
 		if(fuzzyRef != null) {
 			query.setParameter("fuzzyRef", fuzzyRef);
 		}
-		if(params.getManagerIdentity() != null) {
-			query.setParameter("managerKey", params.getManagerIdentity().getKey());
+		if(params.getCurriculumAdmin() != null) {
+			query.setParameter("managerKey", params.getCurriculumAdmin().getKey());
 		}
 		return query.getResultList();
 	}
@@ -242,29 +252,34 @@ public class CurriculumDAO {
 			sb.append(")");	
 		}
 		
-		if(params.getOwnerIdentity() != null || params.getManagerIdentity() != null) {
+		if(params.getElementOwner() != null || params.getCurriculumAdmin() != null) {
 			sb.and()
 			  .append("(");
 		
-			if(params.getOwnerIdentity() != null) {
-				sb.append("exists (select courseMembership.key from curriculumelement as courseCurEl")
+			if(params.getElementOwner() != null) {
+				sb.append("exists (select courseCurEl.key from curriculumelement as courseCurEl")
 				  .append(" inner join repoentrytogroup as curRelGroup on (courseCurEl.group.key=curRelGroup.group.key)")
 				  .append(" inner join repoentrytogroup as courseRelGroup on (courseRelGroup.entry.key=curRelGroup.entry.key)")
 				  .append(" inner join courseRelGroup.group as courseBaseGroup")
 				  .append(" inner join courseBaseGroup.members as courseMembership")
 				  .append(" where courseMembership.identity.key=:ownerKey and courseMembership.role='").append(GroupRoles.owner.name()).append("'")
 				  .append(" and courseCurEl.curriculum.key=cur.key")
+				  .append(") or exists (select ownedCurEl.key from curriculumelement as ownedCurEl")
+				  .append(" inner join ownedCurEl.group as ownedBaseGroup")
+				  .append(" inner join ownedBaseGroup.members as ownedMembership")
+				  .append(" where ownedMembership.identity.key=:ownerKey and ownedMembership.role ").in(CurriculumRoles.curriculumelementowner, CurriculumRoles.owner)
+				  .append(" and ownedCurEl.curriculum.key=cur.key")
 				  .append(")");
 			}
 			
-			if(params.getManagerIdentity() != null) {
-				if(params.getOwnerIdentity() != null) {
+			if(params.getCurriculumAdmin() != null) {
+				if(params.getElementOwner() != null) {
 					sb.append(" or ");
 				}
 				sb.append("exists (select membership.key from bgroupmember as membership")
 				  .append("  where membership.identity.key=:managerKey")
 				  .append("  and (membership.group.key=baseGroup.key or membership.group.key=organis.group.key)")
-				  .append("  and role in ('").append(CurriculumRoles.curriculummanager).append("','").append(OrganisationRoles.administrator).append("','").append(OrganisationRoles.principal).append("')")
+				  .append("  and role ").in(CurriculumRoles.curriculummanager, OrganisationRoles.administrator, OrganisationRoles.principal)
 				  .append(")");
 			}
 			
@@ -287,11 +302,11 @@ public class CurriculumDAO {
 		if(fuzzyRef != null) {
 			query.setParameter("fuzzyRef", fuzzyRef);
 		}
-		if(params.getManagerIdentity() != null) {
-			query.setParameter("managerKey", params.getManagerIdentity().getKey());
+		if(params.getCurriculumAdmin() != null) {
+			query.setParameter("managerKey", params.getCurriculumAdmin().getKey());
 		}
-		if(params.getOwnerIdentity() != null) {
-			query.setParameter("ownerKey", params.getOwnerIdentity().getKey());
+		if(params.getElementOwner() != null) {
+			query.setParameter("ownerKey", params.getElementOwner().getKey());
 		}
 		
 		List<Object[]> rawObjects = query.getResultList();
@@ -340,8 +355,8 @@ public class CurriculumDAO {
 		return has != null && !has.isEmpty() && has.get(0) != null;
 	}
 	
-	public boolean hasOwnerRoleInCurriculum(IdentityRef identity) {
-		StringBuilder sb = new StringBuilder(256);
+	public boolean hasOwnerRoleInCurriculumElement(IdentityRef identity) {
+		QueryBuilder sb = new QueryBuilder(256);
 		sb.append("select v.key from repositoryentry v")
 		  .append(" inner join v.groups as relGroup")
 		  .append(" inner join relGroup.group as baseGroup")
diff --git a/src/main/java/org/olat/modules/curriculum/manager/CurriculumElementDAO.java b/src/main/java/org/olat/modules/curriculum/manager/CurriculumElementDAO.java
index 5c172fe8d2a..1dc5277223d 100644
--- a/src/main/java/org/olat/modules/curriculum/manager/CurriculumElementDAO.java
+++ b/src/main/java/org/olat/modules/curriculum/manager/CurriculumElementDAO.java
@@ -39,6 +39,7 @@ import javax.persistence.TypedQuery;
 import org.olat.basesecurity.Group;
 import org.olat.basesecurity.GroupMembership;
 import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.IdentityRef;
 import org.olat.basesecurity.OrganisationRoles;
 import org.olat.basesecurity.manager.GroupDAO;
 import org.olat.core.commons.persistence.DB;
@@ -797,6 +798,22 @@ public class CurriculumElementDAO {
 				.getResultList();
 	}
 	
+	public boolean hasCurriculumElementRole(IdentityRef identity, String role) {
+		QueryBuilder sb = new QueryBuilder(256);
+		sb.append("select el.key from curriculumelement el")
+		  .append(" inner join el.group baseGroup")
+		  .append(" inner join baseGroup.members membership")
+		  .append(" where membership.identity.key=:identityKey and membership.role=:role");
+		List<Long> has = dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString(), Long.class)
+				.setParameter("identityKey", identity.getKey())
+				.setParameter("role", role)
+				.setFirstResult(0)
+				.setMaxResults(1)
+				.getResultList();
+		return has != null && !has.isEmpty() && has.get(0) != null;
+	}
+	
 	public List<Identity> getMembers(List<CurriculumElementRef> elements, String... roles) {
 		if(elements == null || elements.isEmpty()) return new ArrayList<>();
 		
@@ -870,8 +887,8 @@ public class CurriculumElementDAO {
 			CurriculumElementMembershipImpl membership = memberships
 					.computeIfAbsent(key, k -> new CurriculumElementMembershipImpl(k.getIdentityKey(), k.getCurriculumElementKey()));
 			
-			if(CurriculumRoles.curriculummanager.name().equals(role)) {
-				membership.setCurriculumManager(true);
+			if(CurriculumRoles.curriculumelementowner.name().equals(role)) {
+				membership.setCurriculumElementOwner(true);
 			} else if(CurriculumRoles.owner.name().equals(role)) {
 				membership.setRepositoryEntryOwner(true);
 			} else if(CurriculumRoles.coach.name().equals(role)) {
diff --git a/src/main/java/org/olat/modules/curriculum/manager/CurriculumServiceImpl.java b/src/main/java/org/olat/modules/curriculum/manager/CurriculumServiceImpl.java
index 5159c8ea214..f8ba5b3ac81 100644
--- a/src/main/java/org/olat/modules/curriculum/manager/CurriculumServiceImpl.java
+++ b/src/main/java/org/olat/modules/curriculum/manager/CurriculumServiceImpl.java
@@ -157,14 +157,15 @@ public class CurriculumServiceImpl implements CurriculumService, OrganisationDat
 	}
 
 	@Override
-	public boolean isCurriculumManager(IdentityRef identity) {
-		return curriculumDao.hasCurriculumRole(identity, CurriculumRoles.curriculummanager.name());
+	public boolean isCurriculumOwner(IdentityRef identity) {
+		return curriculumDao.hasCurriculumRole(identity, CurriculumRoles.curriculumowner.name());
 	}
 
 	@Override
-	public boolean isCurriculumManagerOrOwner(IdentityRef identity) {
-		return curriculumDao.hasCurriculumRole(identity, CurriculumRoles.curriculummanager.name())
-				|| curriculumDao.hasOwnerRoleInCurriculum(identity);
+	public boolean isCurriculumOwnerUptoEntryOwner(IdentityRef identity) {
+		return curriculumDao.hasCurriculumRole(identity, CurriculumRoles.curriculumowner.name())
+				|| curriculumDao.hasOwnerRoleInCurriculumElement(identity)
+				|| curriculumElementDao.hasCurriculumElementRole(identity, CurriculumRoles.curriculumelementowner.name());
 	}
 
 	@Override
@@ -453,6 +454,12 @@ public class CurriculumServiceImpl implements CurriculumService, OrganisationDat
 		return curriculumElementDao.getMembersIdentity(element, role.name());
 	}
 	
+	@Override
+	public List<CurriculumElementMembership> getCurriculumElementMemberships(Curriculum curriculum, Identity identity) {
+		if(identity == null) return new ArrayList<>();
+		return curriculumElementDao.getMembershipInfos(Collections.singletonList(curriculum), null, identity);
+	}
+
 	@Override
 	public List<CurriculumElementMembership> getCurriculumElementMemberships(Collection<CurriculumElement> elements, Identity... identities) {
 		return curriculumElementDao.getMembershipInfos(null, elements, identities);
@@ -483,11 +490,11 @@ public class CurriculumServiceImpl implements CurriculumService, OrganisationDat
 	private void updateCurriculumElementMembership(CurriculumElementMembershipChange changes) {
 		CurriculumElement element = changes.getElement();
 		
-		if(changes.getCurriculumManager() != null) {
-			if(changes.getCurriculumManager().booleanValue()) {
-				addMember(element, changes.getMember(), CurriculumRoles.curriculummanager);
+		if(changes.getCurriculumElementOwner() != null) {
+			if(changes.getCurriculumElementOwner().booleanValue()) {
+				addMember(element, changes.getMember(), CurriculumRoles.curriculumelementowner);
 			} else {
-				removeMember(element, changes.getMember(), CurriculumRoles.curriculummanager);
+				removeMember(element, changes.getMember(), CurriculumRoles.curriculumelementowner);
 			}
 		}
 		
diff --git a/src/main/java/org/olat/modules/curriculum/model/CurriculumElementMembershipChange.java b/src/main/java/org/olat/modules/curriculum/model/CurriculumElementMembershipChange.java
index bccd21458f3..8f770b5d716 100644
--- a/src/main/java/org/olat/modules/curriculum/model/CurriculumElementMembershipChange.java
+++ b/src/main/java/org/olat/modules/curriculum/model/CurriculumElementMembershipChange.java
@@ -36,7 +36,7 @@ public class CurriculumElementMembershipChange extends Event {
 	private CurriculumElement element;
 	private final Long groupKey;
 
-	private Boolean curriculumManager;
+	private Boolean curriculumElementOwner;
 	private Boolean repositoryEntryOwner;
 	private Boolean coach;
 	private Boolean participant;
@@ -48,7 +48,7 @@ public class CurriculumElementMembershipChange extends Event {
 	
 	public CurriculumElementMembershipChange(Identity member, CurriculumElementMembershipChange origin) {
 		this(member, origin.getElement());
-		curriculumManager = origin.curriculumManager;
+		curriculumElementOwner = origin.curriculumElementOwner;
 		repositoryEntryOwner = origin.repositoryEntryOwner;
 		participant = origin.participant;
 		coach = origin.coach;
@@ -80,12 +80,12 @@ public class CurriculumElementMembershipChange extends Event {
 		this.participant = participant;
 	}
 
-	public Boolean getCurriculumManager() {
-		return curriculumManager;
+	public Boolean getCurriculumElementOwner() {
+		return curriculumElementOwner;
 	}
 
-	public void setCurriculumManager(Boolean curriculumManager) {
-		this.curriculumManager = curriculumManager;
+	public void setCurriculumElementOwner(Boolean curriculumElementOwner) {
+		this.curriculumElementOwner = curriculumElementOwner;
 	}
 
 	public Boolean getRepositoryEntryOwner() {
@@ -103,8 +103,4 @@ public class CurriculumElementMembershipChange extends Event {
 	public void setCoach(Boolean coach) {
 		this.coach = coach;
 	}
-
-
-
-
 }
diff --git a/src/main/java/org/olat/modules/curriculum/model/CurriculumElementMembershipImpl.java b/src/main/java/org/olat/modules/curriculum/model/CurriculumElementMembershipImpl.java
index fe3a9ed331c..969ede28918 100644
--- a/src/main/java/org/olat/modules/curriculum/model/CurriculumElementMembershipImpl.java
+++ b/src/main/java/org/olat/modules/curriculum/model/CurriculumElementMembershipImpl.java
@@ -32,7 +32,7 @@ public class CurriculumElementMembershipImpl implements CurriculumElementMembers
 	private final Long identityKey;
 	private final Long curriculumElementKey;
 	
-	private boolean curriculumManager;
+	private boolean curriculumElementOwner;
 	private boolean repositoryEntryOwner;
 	private boolean coach;
 	private boolean participant;
@@ -55,7 +55,7 @@ public class CurriculumElementMembershipImpl implements CurriculumElementMembers
 	
 	@Override
 	public boolean hasMembership() {
-		return repositoryEntryOwner || coach || participant || curriculumManager;
+		return repositoryEntryOwner || coach || participant || curriculumElementOwner;
 	}
 
 	@Override
@@ -86,12 +86,12 @@ public class CurriculumElementMembershipImpl implements CurriculumElementMembers
 	}
 
 	@Override
-	public boolean isCurriculumManager() {
-		return curriculumManager;
+	public boolean isCurriculumElementOwner() {
+		return curriculumElementOwner;
 	}
 
-	public void setCurriculumManager(boolean curriculumManager) {
-		this.curriculumManager = curriculumManager;
+	public void setCurriculumElementOwner(boolean curriculumElementOwner) {
+		this.curriculumElementOwner = curriculumElementOwner;
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/modules/curriculum/model/CurriculumSearchParameters.java b/src/main/java/org/olat/modules/curriculum/model/CurriculumSearchParameters.java
index 872ed15cba5..fc44967fc02 100644
--- a/src/main/java/org/olat/modules/curriculum/model/CurriculumSearchParameters.java
+++ b/src/main/java/org/olat/modules/curriculum/model/CurriculumSearchParameters.java
@@ -34,7 +34,7 @@ import org.olat.core.id.OrganisationRef;
 public class CurriculumSearchParameters {
 	
 	private String searchString;
-	private Identity ownerIdentity;
+	private Identity elementOwner;
 	private Identity managerIdentity;
 	private List<? extends OrganisationRef> organisations;
 
@@ -57,19 +57,29 @@ public class CurriculumSearchParameters {
 		this.searchString = searchString;
 	}
 
-	public Identity getManagerIdentity() {
+	public Identity getCurriculumAdmin() {
 		return managerIdentity;
 	}
 
-	public void setManagerIdentity(Identity managerIdentity) {
+	/**
+	 * Set for curriculum owners and managers
+	 * 
+	 * @param managerIdentity
+	 */
+	public void setCurriculumAdmin(Identity managerIdentity) {
 		this.managerIdentity = managerIdentity;
 	}
 
-	public Identity getOwnerIdentity() {
-		return ownerIdentity;
+	public Identity getElementOwner() {
+		return elementOwner;
 	}
 
-	public void setOwnerIdentity(Identity ownerIdentity) {
-		this.ownerIdentity = ownerIdentity;
+	/**
+	 * Set for repository entry owners and curriculum elements owners
+	 * 
+	 * @param elementOwner
+	 */
+	public void setElementOwner(Identity elementOwner) {
+		this.elementOwner = elementOwner;
 	}
 }
diff --git a/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementsWebService.java b/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementsWebService.java
index f5cc47b7ecc..76bfaa7d450 100644
--- a/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementsWebService.java
+++ b/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementsWebService.java
@@ -285,7 +285,6 @@ public class CurriculumElementsWebService {
 		} else if(moveAsCurriculumRoot) {
 			dbInstance.commit();// make sure all is flushed on the database before such a move
 			curriculum = curriculumService.getCurriculum(curriculum);
-			System.out.println(curriculum.getDisplayName());
 			savedElement = curriculumService.moveCurriculumElement(savedElement, curriculum);
 		}
 		return savedElement;
@@ -703,10 +702,10 @@ public class CurriculumElementsWebService {
 	 * @return It returns an array of <code>UserVO</code>
 	 */
 	@GET
-	@Path("{curriculumElementKey}/curriculummanagers")
+	@Path("{curriculumElementKey}/curriculumelementowners")
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	public Response getCurriculumManagers(@PathParam("curriculumElementKey") Long curriculumElementKey) {
-		return getMembers(curriculumElementKey, CurriculumRoles.curriculummanager);
+		return getMembers(curriculumElementKey, CurriculumRoles.curriculumelementowner);
 	}
 	
 	private Response getMembers(Long curriculumElementKey, CurriculumRoles role) {
@@ -784,9 +783,9 @@ public class CurriculumElementsWebService {
 	 * @return Nothing
 	 */
 	@PUT
-	@Path("{curriculumElementKey}/curriculummanagers/{identityKey}")
+	@Path("{curriculumElementKey}/curriculumelementowners/{identityKey}")
 	public Response putCurriculumManager(@PathParam("curriculumElementKey") Long curriculumElementKey, @PathParam("identityKey") Long identityKey) {
-		return putMember(curriculumElementKey, identityKey, CurriculumRoles.curriculummanager);
+		return putMember(curriculumElementKey, identityKey, CurriculumRoles.curriculumelementowner);
 	}
 	
 	private Response putMember(Long curriculumElementKey, Long identityKey, CurriculumRoles role) {
@@ -888,10 +887,10 @@ public class CurriculumElementsWebService {
 	 * @return Nothing
 	 */
 	@PUT
-	@Path("{curriculumElementKey}/curriculummanagers")
+	@Path("{curriculumElementKey}/curriculumelementowners")
 	@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	public Response putCurriculumManagers(@PathParam("curriculumElementKey") Long curriculumElementKey, UserVO[] coaches) {
-		return putMembers(curriculumElementKey, coaches, CurriculumRoles.curriculummanager);
+		return putMembers(curriculumElementKey, coaches, CurriculumRoles.curriculumelementowner);
 	}
 	
 	private Response putMembers(Long curriculumElementKey, UserVO[] members, CurriculumRoles role) {
@@ -974,10 +973,10 @@ public class CurriculumElementsWebService {
 	 * @return Nothing
 	 */
 	@DELETE
-	@Path("{curriculumElementKey}/curriculummanagers/{identityKey}")
+	@Path("{curriculumElementKey}/curriculumelementowners/{identityKey}")
 	public Response deleteCurriculumManager(@PathParam("curriculumElementKey") Long curriculumElementKey,
 			@PathParam("identityKey") Long identityKey) {
-		return deleteMember(curriculumElementKey, identityKey, CurriculumRoles.curriculummanager);
+		return deleteMember(curriculumElementKey, identityKey, CurriculumRoles.curriculumelementowner);
 	}
 	
 	private Response deleteMember(Long curriculumElementKey, Long identityKey, CurriculumRoles role) {
diff --git a/src/main/java/org/olat/modules/curriculum/restapi/CurriculumsWebService.java b/src/main/java/org/olat/modules/curriculum/restapi/CurriculumsWebService.java
index ff0469e5736..0ab4beac467 100644
--- a/src/main/java/org/olat/modules/curriculum/restapi/CurriculumsWebService.java
+++ b/src/main/java/org/olat/modules/curriculum/restapi/CurriculumsWebService.java
@@ -96,7 +96,7 @@ public class CurriculumsWebService {
 	}
 	
 	/**
-	 * Return the curriculums an administrative user is allowed to see.
+	 * Return the curriculums a manager user is allowed to see.
 	 * 
 	 * @response.representation.200.qname {http://www.example.com}curriculumVO
 	 * @response.representation.200.mediaType application/xml, application/json
@@ -346,9 +346,9 @@ public class CurriculumsWebService {
 	 * @return It returns an array of <code>UserVO</code>
 	 */
 	@GET
-	@Path("{curriculumKey}/curriculummanagers")
+	@Path("{curriculumKey}/curriculumowners")
 	public Response getCurriculumManagers(@PathParam("curriculumKey") Long curriculumKey, @Context HttpServletRequest httpRequest) {
-		return getMembers(curriculumKey, CurriculumRoles.curriculummanager, httpRequest);
+		return getMembers(curriculumKey, CurriculumRoles.curriculumowner, httpRequest);
 	}
 
 	private Response getMembers(Long curriculumKey, CurriculumRoles role, HttpServletRequest httpRequest) {
@@ -379,10 +379,10 @@ public class CurriculumsWebService {
 	 * @return Nothing
 	 */
 	@PUT
-	@Path("{curriculumKey}/curriculummanagers/{identityKey}")
-	public Response putCurriculumManager(@PathParam("curriculumKey") Long curriculumKey,
+	@Path("{curriculumKey}/curriculumowners/{identityKey}")
+	public Response putCurriculumOwner(@PathParam("curriculumKey") Long curriculumKey,
 			@PathParam("identityKey") Long identityKey, @Context HttpServletRequest httpRequest) {
-		return putMember(curriculumKey, identityKey, CurriculumRoles.curriculummanager, httpRequest);
+		return putMember(curriculumKey, identityKey, CurriculumRoles.curriculumowner, httpRequest);
 	}
 	
 	private Response putMember(Long curriculumKey, Long identityKey, CurriculumRoles role, HttpServletRequest httpRequest) {
@@ -413,10 +413,10 @@ public class CurriculumsWebService {
 	 * @return Nothing
 	 */
 	@DELETE
-	@Path("{curriculumKey}/curriculummanagers/{identityKey}")
+	@Path("{curriculumKey}/curriculumowners/{identityKey}")
 	public Response deleteCurriculumManager(@PathParam("curriculumKey") Long curriculumKey,
 			@PathParam("identityKey") Long identityKey, @Context HttpServletRequest httpRequest) {
-		return deleteMember(curriculumKey, identityKey, CurriculumRoles.curriculummanager, httpRequest);
+		return deleteMember(curriculumKey, identityKey, CurriculumRoles.curriculumowner, httpRequest);
 	}
 	
 	private Response deleteMember(Long curriculumKey, Long identityKey, CurriculumRoles role, HttpServletRequest httpRequest) {
diff --git a/src/main/java/org/olat/modules/curriculum/site/CurriculumManagerAndOwnerSecurityCallback.java b/src/main/java/org/olat/modules/curriculum/site/CurriculumManagerAndOwnerSecurityCallback.java
index 7231ff054d8..0638078d3cd 100644
--- a/src/main/java/org/olat/modules/curriculum/site/CurriculumManagerAndOwnerSecurityCallback.java
+++ b/src/main/java/org/olat/modules/curriculum/site/CurriculumManagerAndOwnerSecurityCallback.java
@@ -46,6 +46,6 @@ public class CurriculumManagerAndOwnerSecurityCallback implements SiteSecurityCa
 		
 		Roles roles = usess.getRoles();
 		return roles != null && (roles.isAdministrator() || roles.isPrincipal() || roles.isCurriculumManager()
-				|| curriculumService.isCurriculumManagerOrOwner(ureq.getIdentity()));
+				|| curriculumService.isCurriculumOwnerUptoEntryOwner(ureq.getIdentity()));
 	}
 }
diff --git a/src/main/java/org/olat/modules/curriculum/site/CurriculumManagerSecurityCallback.java b/src/main/java/org/olat/modules/curriculum/site/CurriculumManagerSecurityCallback.java
index 9754944822b..3f8c03d52ba 100644
--- a/src/main/java/org/olat/modules/curriculum/site/CurriculumManagerSecurityCallback.java
+++ b/src/main/java/org/olat/modules/curriculum/site/CurriculumManagerSecurityCallback.java
@@ -46,6 +46,6 @@ public class CurriculumManagerSecurityCallback implements SiteSecurityCallback {
 		
 		Roles roles = usess.getRoles();
 		return roles != null && (roles.isAdministrator() || roles.isPrincipal() || roles.isCurriculumManager()
-				|| curriculumService.isCurriculumManager(ureq.getIdentity()));
+				|| curriculumService.isCurriculumOwner(ureq.getIdentity()));
 	}
 }
diff --git a/src/main/java/org/olat/modules/curriculum/ui/CurriculumComposerController.java b/src/main/java/org/olat/modules/curriculum/ui/CurriculumComposerController.java
index 924ca282a86..7f84447b50a 100644
--- a/src/main/java/org/olat/modules/curriculum/ui/CurriculumComposerController.java
+++ b/src/main/java/org/olat/modules/curriculum/ui/CurriculumComposerController.java
@@ -163,7 +163,7 @@ public class CurriculumComposerController extends FormBasicController implements
 
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-		if(secCallback.canManagerCurriculumElementUsers()) {
+		if(secCallback.canManagerCurriculumElementsUsers()) {
 			if(managed && isAllowedToOverrideManaged(ureq)) {
 				overrideLink = uifactory.addFormLink("override.member", formLayout, Link.BUTTON);
 				overrideLink.setIconLeftCSS("o_icon o_icon-fw o_icon_refresh");
@@ -205,7 +205,7 @@ public class CurriculumComposerController extends FormBasicController implements
 		zoomColumn.setExportable(false);
 		zoomColumn.setAlwaysVisible(true);
 		columnsModel.addFlexiColumnModel(zoomColumn);
-		if(secCallback.canEditCurriculumElement()) {
+		if(secCallback.canEditCurriculumElements()) {
 			DefaultFlexiColumnModel toolsColumn = new DefaultFlexiColumnModel(ElementCols.tools);
 			toolsColumn.setExportable(false);
 			toolsColumn.setAlwaysVisible(true);
@@ -299,8 +299,12 @@ public class CurriculumComposerController extends FormBasicController implements
 	}
 	
 	private CurriculumElementRow forgeRow(CurriculumElementInfos element) {
-		FormLink toolsLink = uifactory.addFormLink("tools_" + (++counter), "tools", "", null, null, Link.NONTRANSLATED);
-		toolsLink.setIconLeftCSS("o_icon o_icon_actions o_icon-lg");
+		FormLink toolsLink = null;
+		boolean tooled = secCallback.canEditCurriculumTree() || secCallback.canEditCurriculumElement(element.getCurriculumElement());
+		if(tooled) {
+			toolsLink = uifactory.addFormLink("tools_" + (++counter), "tools", "", null, null, Link.NONTRANSLATED);
+			toolsLink.setIconLeftCSS("o_icon o_icon_actions o_icon-lg");
+		}
 		
 		FormLink resourcesLink = null;
 		if(element.getNumOfResources() > 0) {
@@ -309,7 +313,9 @@ public class CurriculumComposerController extends FormBasicController implements
 		CurriculumElementRow row = new CurriculumElementRow(element.getCurriculumElement(), element.getNumOfResources(),
 				element.getNumOfParticipants(), element.getNumOfCoaches(), element.getNumOfOwners(),
 				toolsLink, resourcesLink);
-		toolsLink.setUserObject(row);
+		if(toolsLink != null) {
+			toolsLink.setUserObject(row);
+		}
 		if(resourcesLink != null) {
 			resourcesLink.setUserObject(row);
 		}
@@ -535,7 +541,7 @@ public class CurriculumComposerController extends FormBasicController implements
 			showWarning("warning.curriculum.element.deleted");
 		} else {
 			List<CurriculumElement> elementsToMove = Collections.singletonList(element);
-			moveElementCtrl = new MoveCurriculumElementController(ureq, getWindowControl(), elementsToMove, curriculum);
+			moveElementCtrl = new MoveCurriculumElementController(ureq, getWindowControl(), elementsToMove, curriculum, secCallback);
 			listenTo(moveElementCtrl);
 			
 			String title = translate("move.element.title", new String[] { StringHelper.escapeHtml(row.getDisplayName() )});
@@ -694,22 +700,21 @@ public class CurriculumComposerController extends FormBasicController implements
 			this.row = row;
 			
 			mainVC = createVelocityContainer("tools");
-			
+
 			List<String> links = new ArrayList<>(4);
-			
-			//edit
-			editLink = addLink("edit", "o_icon_edit", links);
-			if(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.move)) {
-				moveLink = addLink("move.element", "o_icon_move", links);
-			}
-			if(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.addChildren)) {
-				newLink = addLink("add.element.under", "o_icon_levels", links);
-			}
-			copyLink = addLink("copy.element", "o_icon_copy", links);
-			
-			if(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.delete)) {
-				links.add("-");
-				deleteLink = addLink("delete", "o_icon_delete_item", links);
+			if(secCallback.canEditCurriculumElement(element)) {
+				editLink = addLink("edit", "o_icon_edit", links);
+				if(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.move)) {
+						moveLink = addLink("move.element", "o_icon_move", links);
+				}
+				if(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.addChildren)) {
+						newLink = addLink("add.element.under", "o_icon_levels", links);
+				}
+				copyLink = addLink("copy.element", "o_icon_copy", links);
+				if(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.delete)) {
+					links.add("-");
+					deleteLink = addLink("delete", "o_icon_delete_item", links);
+				}
 			}
 			mainVC.contextPut("links", links);
 			
diff --git a/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementResourceListController.java b/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementResourceListController.java
index 533a4e98014..7156c7189e0 100644
--- a/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementResourceListController.java
+++ b/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementResourceListController.java
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.Set;
 
 import org.olat.NewControllerFactory;
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
@@ -46,6 +47,7 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
 import org.olat.core.gui.control.generic.modal.DialogBoxController;
 import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
+import org.olat.core.id.Roles;
 import org.olat.core.util.Util;
 import org.olat.course.CourseModule;
 import org.olat.login.LoginModule;
@@ -106,7 +108,7 @@ public class CurriculumElementResourceListController extends FormBasicController
 
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-		if(!resourcesManaged && secCallback.canManagerCurriculumElementResources()) {
+		if(!resourcesManaged && secCallback.canManagerCurriculumElementResources(curriculumElement)) {
 			addResourcesButton = uifactory.addFormLink("add.resources", formLayout, Link.BUTTON);
 			addResourcesButton.setIconLeftCSS("o_icon o_icon-fw o_icon_add");
 		
@@ -228,9 +230,14 @@ public class CurriculumElementResourceListController extends FormBasicController
 	private void doChooseResources(UserRequest ureq) {
 		if(repoSearchCtr != null) return;
 		
+		Roles roles = ureq.getUserSession().getRoles();
+		boolean adminSearch = roles.hasRole(OrganisationRoles.administrator)
+				|| roles.hasRole(OrganisationRoles.learnresourcemanager)
+				|| roles.hasRole(OrganisationRoles.curriculummanager);
+		boolean orgSearch = secCallback.canEditCurriculumElement(curriculumElement) && !adminSearch;
 		repoSearchCtr = new ReferencableEntriesSearchController(getWindowControl(), ureq,
-				new String[]{ CourseModule.getCourseTypeName() }, null,
-				translate("add.resources"), false, false, true, true, Can.referenceable);
+				new String[]{ CourseModule.getCourseTypeName() }, null, translate("add.resources"),
+				false, false, true, orgSearch, adminSearch, Can.referenceable);
 		listenTo(repoSearchCtr);
 		
 		cmc = new CloseableModalController(getWindowControl(), translate("close"), repoSearchCtr.getInitialComponent(), true, translate("add.resources"));
diff --git a/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementUserManagementController.java b/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementUserManagementController.java
index 39a80c775ce..a102a9332d1 100644
--- a/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementUserManagementController.java
+++ b/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementUserManagementController.java
@@ -120,7 +120,7 @@ public class CurriculumElementUserManagementController extends FormBasicControll
 
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-		if(!membersManaged && secCallback.canManagerCurriculumElementUsers()) {
+		if(!membersManaged && secCallback.canManagerCurriculumElementUsers(curriculumElement)) {
 			addMemberButton = uifactory.addFormLink("add.member", formLayout, Link.BUTTON);
 			addMemberButton.setIconLeftCSS("o_icon o_icon-fw o_icon_add_member");
 			addMemberButton.setIconRightCSS("o_icon o_icon_caret");
@@ -266,7 +266,11 @@ public class CurriculumElementUserManagementController extends FormBasicControll
 		removeAsListenerAndDispose(roleListCtrl);
 		
 		String title = translate("add.member");
-		roleListCtrl = new RoleListController(ureq, getWindowControl(), CurriculumRoles.values());
+		CurriculumRoles[] roles = new CurriculumRoles[] {
+				CurriculumRoles.curriculumelementowner,
+				CurriculumRoles.owner, CurriculumRoles.coach, CurriculumRoles.participant
+		};
+		roleListCtrl = new RoleListController(ureq, getWindowControl(), roles);
 		listenTo(roleListCtrl);
 		
 		calloutCtrl = new CloseableCalloutWindowController(ureq, getWindowControl(), roleListCtrl.getInitialComponent(), addMemberButton, title, true, null);
diff --git a/src/main/java/org/olat/modules/curriculum/ui/CurriculumListManagerController.java b/src/main/java/org/olat/modules/curriculum/ui/CurriculumListManagerController.java
index 4e6d196a5b5..1bb56c42409 100644
--- a/src/main/java/org/olat/modules/curriculum/ui/CurriculumListManagerController.java
+++ b/src/main/java/org/olat/modules/curriculum/ui/CurriculumListManagerController.java
@@ -56,10 +56,13 @@ import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.StateEntry;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.modules.curriculum.Curriculum;
+import org.olat.modules.curriculum.CurriculumElementMembership;
+import org.olat.modules.curriculum.CurriculumElementRef;
 import org.olat.modules.curriculum.CurriculumManagedFlag;
 import org.olat.modules.curriculum.CurriculumSecurityCallback;
 import org.olat.modules.curriculum.CurriculumSecurityCallbackFactory;
 import org.olat.modules.curriculum.CurriculumService;
+import org.olat.modules.curriculum.model.CurriculumElementRefImpl;
 import org.olat.modules.curriculum.model.CurriculumInfos;
 import org.olat.modules.curriculum.model.CurriculumSearchParameters;
 import org.olat.modules.curriculum.ui.CurriculumManagerDataModel.CurriculumCols;
@@ -141,14 +144,14 @@ public class CurriculumListManagerController extends FormBasicController impleme
 	private void loadModel(String searchString, boolean reset) {
 		CurriculumSearchParameters managerParams = new CurriculumSearchParameters();
 		managerParams.setSearchString(searchString);
-		managerParams.setManagerIdentity(getIdentity());
+		managerParams.setCurriculumAdmin(getIdentity());
 		List<CurriculumInfos> managerCurriculums = curriculumService.getCurriculumsWithInfos(managerParams);
 		List<CurriculumRow> rows = managerCurriculums.stream()
 				.map(this::forgeManagedRow).collect(Collectors.toList());
 		
 		CurriculumSearchParameters ownerParams = new CurriculumSearchParameters();
 		ownerParams.setSearchString(searchString);
-		ownerParams.setOwnerIdentity(getIdentity());
+		ownerParams.setElementOwner(getIdentity());
 		List<CurriculumInfos> reOwnersCurriculums = curriculumService.getCurriculumsWithInfos(ownerParams);
 		List<CurriculumRow> reOwnerRows = reOwnersCurriculums.stream()
 				.filter(c -> !managerCurriculums.contains(c))
@@ -167,8 +170,6 @@ public class CurriculumListManagerController extends FormBasicController impleme
 		toolsLink.setUserObject(row);
 		return row;
 	}
-	
-	
 
 	@Override
 	protected void doDispose() {
@@ -309,7 +310,13 @@ public class CurriculumListManagerController extends FormBasicController impleme
 			showWarning("warning.curriculum.deleted");
 		} else {
 			WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableInstance(Curriculum.class, row.getKey()), null);
-			CurriculumSecurityCallback curriculumSecCallback = CurriculumSecurityCallbackFactory.createCallback(row.canManage());
+			boolean canManage = row.canManage();
+			List<CurriculumElementMembership> memberships = curriculumService.getCurriculumElementMemberships(curriculum, getIdentity());
+			List<CurriculumElementRef> ownedElements = memberships.stream()
+					.filter(CurriculumElementMembership::isCurriculumElementOwner)
+					.map(m -> new CurriculumElementRefImpl(m.getCurriculumElementKey()))
+					.collect(Collectors.toList());
+			CurriculumSecurityCallback curriculumSecCallback = CurriculumSecurityCallbackFactory.createCallback(canManage, ownedElements);
 			composerCtrl = new CurriculumComposerController(ureq, swControl, toolbarPanel, curriculum, curriculumSecCallback);
 			listenTo(composerCtrl);
 			toolbarPanel.pushController(row.getDisplayName(), composerCtrl);
diff --git a/src/main/java/org/olat/modules/curriculum/ui/CurriculumTreeModel.java b/src/main/java/org/olat/modules/curriculum/ui/CurriculumTreeModel.java
index 3795fad39e7..2c6efc716c7 100644
--- a/src/main/java/org/olat/modules/curriculum/ui/CurriculumTreeModel.java
+++ b/src/main/java/org/olat/modules/curriculum/ui/CurriculumTreeModel.java
@@ -24,6 +24,7 @@ import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Predicate;
 
 import org.olat.core.gui.components.tree.GenericTreeModel;
 import org.olat.core.gui.components.tree.GenericTreeNode;
@@ -66,8 +67,16 @@ public class CurriculumTreeModel extends GenericTreeModel implements InsertionTr
 	}
 	
 	public void loadTreeModel(List<CurriculumElement> elements) {
+		loadTreeModel(elements, c -> true);
+	}
+	
+	public void loadTreeModel(List<CurriculumElement> elements, Predicate<CurriculumElement> filter) {
 		Map<Long,GenericTreeNode> fieldKeyToNode = new HashMap<>();
 		for(CurriculumElement element:elements) {
+			if(!filter.test(element)) {
+				continue;
+			}
+			
 			Long key = element.getKey();
 			GenericTreeNode node = fieldKeyToNode.computeIfAbsent(key, k -> {
 				GenericTreeNode newNode = new GenericTreeNode(nodeKey(element));
@@ -78,7 +87,7 @@ public class CurriculumTreeModel extends GenericTreeModel implements InsertionTr
 			});
 
 			CurriculumElement parentElement = element.getParent();
-			if(parentElement == null) {
+			if(parentElement == null || !filter.test(parentElement)) {
 				//this is a root
 				getRootNode().addChild(node);
 			} else {
diff --git a/src/main/java/org/olat/modules/curriculum/ui/CurriculumUserManagementController.java b/src/main/java/org/olat/modules/curriculum/ui/CurriculumUserManagementController.java
index 2619bae9677..6e96e5d1b12 100644
--- a/src/main/java/org/olat/modules/curriculum/ui/CurriculumUserManagementController.java
+++ b/src/main/java/org/olat/modules/curriculum/ui/CurriculumUserManagementController.java
@@ -263,7 +263,7 @@ public class CurriculumUserManagementController extends FormBasicController {
 		removeAsListenerAndDispose(roleListCtrl);
 		
 		String title = translate("add.member");
-		roleListCtrl = new RoleListController(ureq, getWindowControl(), new CurriculumRoles[] { CurriculumRoles.curriculummanager });
+		roleListCtrl = new RoleListController(ureq, getWindowControl(), new CurriculumRoles[] { CurriculumRoles.curriculumowner });
 		listenTo(roleListCtrl);
 		
 		calloutCtrl = new CloseableCalloutWindowController(ureq, getWindowControl(), roleListCtrl.getInitialComponent(), addMemberButton, title, true, null);
diff --git a/src/main/java/org/olat/modules/curriculum/ui/EditCurriculumElementController.java b/src/main/java/org/olat/modules/curriculum/ui/EditCurriculumElementController.java
index 4af2d8df1f8..44e5892a728 100644
--- a/src/main/java/org/olat/modules/curriculum/ui/EditCurriculumElementController.java
+++ b/src/main/java/org/olat/modules/curriculum/ui/EditCurriculumElementController.java
@@ -149,9 +149,11 @@ public class EditCurriculumElementController extends FormBasicController {
 			uifactory.addStaticTextElement("curriculum.element.external.id", externalId, formLayout);
 		}
 		
+		boolean canEdit = element == null ? true : secCallback.canEditCurriculumElement(element);
+		
 		String identifier = element == null ? "" : element.getIdentifier();
 		identifierEl = uifactory.addTextElement("identifier", "curriculum.element.identifier", 255, identifier, formLayout);
-		identifierEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.identifier) && secCallback.canEditCurriculumElement());
+		identifierEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.identifier) && canEdit);
 		identifierEl.setMandatory(true);
 		if(identifierEl.isEnabled() && !StringHelper.containsNonWhitespace(identifier)) {
 			identifierEl.setFocus(true);
@@ -159,14 +161,14 @@ public class EditCurriculumElementController extends FormBasicController {
 
 		String displayName = element == null ? "" : element.getDisplayName();
 		displayNameEl = uifactory.addTextElement("displayName", "curriculum.element.displayName", 255, displayName, formLayout);
-		displayNameEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.displayName) && secCallback.canEditCurriculumElement());
+		displayNameEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.displayName) && canEdit);
 		displayNameEl.setMandatory(true);
 		
 		String[] statusValues = new String[] {
 			translate("status.active"), translate("status.inactive"), translate("status.deleted")
 		};
 		statusEl = uifactory.addRadiosHorizontal("status", "curriculum.element.status", formLayout, statusKey, statusValues);
-		statusEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.status) && secCallback.canEditCurriculumElement() );
+		statusEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.status) && canEdit);
 		if(element == null || element.getElementStatus() == null) {
 			statusEl.select(CurriculumElementStatus.active.name(), true);
 		} else {
@@ -183,7 +185,7 @@ public class EditCurriculumElementController extends FormBasicController {
 			typeValues[i+1] = types.get(i).getDisplayName();
 		}
 		curriculumElementTypeEl = uifactory.addDropdownSingleselect("type", "curriculum.element.type", formLayout, typeKeys, typeValues, null);
-		curriculumElementTypeEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.type) && secCallback.canEditCurriculumElement());
+		curriculumElementTypeEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.type) && canEdit);
 		curriculumElementTypeEl.addActionListener(FormEvent.ONCHANGE);
 		boolean typeFound = false;
 		CurriculumElementType elementType = element == null ? null : element.getType();
@@ -202,12 +204,12 @@ public class EditCurriculumElementController extends FormBasicController {
 		}
 		
 		calendarsEnabledEl = uifactory.addRadiosHorizontal("type.calendars.enabled", formLayout, new String[0], new String[0]);
-		calendarsEnabledEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.calendars) && secCallback.canEditCurriculumElement());
+		calendarsEnabledEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.calendars) && canEdit);
 		CurriculumCalendars calendarsEnabled =  element == null ? CurriculumCalendars.inherited : element.getCalendars();
 		updateCalendarsEnabled(calendarsEnabled, elementType);
 		
 		lecturesEnabledEl = uifactory.addRadiosHorizontal("type.lectures.enabled", formLayout, new String[0], new String[0]);
-		lecturesEnabledEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.lectures) && secCallback.canEditCurriculumElement());
+		lecturesEnabledEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.lectures) && canEdit);
 		CurriculumLectures lecturesEnabled =  element == null ? CurriculumLectures.inherited : element.getLectures();
 		updateLecturesEnabled(lecturesEnabled, elementType);
 		
@@ -223,22 +225,22 @@ public class EditCurriculumElementController extends FormBasicController {
 		
 		Date begin = element == null ? null : element.getBeginDate();
 		beginEl = uifactory.addDateChooser("start", "curriculum.element.begin", begin, formLayout);
-		beginEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.dates) && secCallback.canEditCurriculumElement());
+		beginEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.dates) && canEdit);
 
 		Date end = element == null ? null : element.getEndDate();
 		endEl = uifactory.addDateChooser("end", "curriculum.element.end", end, formLayout);
-		endEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.dates) && secCallback.canEditCurriculumElement());
+		endEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.dates) && canEdit);
 		endEl.setDefaultValue(beginEl);
 		
 		String description = element == null ? "" : element.getDescription();
 		descriptionEl = uifactory.addRichTextElementForStringDataCompact("curriculum.description", "curriculum.description", description, 10, 60, null,
 				formLayout, ureq.getUserSession(), getWindowControl());
-		descriptionEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.description) && secCallback.canEditCurriculumElement());
+		descriptionEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.description) && canEdit);
 
 		FormLayoutContainer buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
 		formLayout.add(buttonsCont);
 		uifactory.addFormCancelButton("cancel", buttonsCont, ureq, getWindowControl());
-		if(secCallback.canEditCurriculumElement()) {
+		if(canEdit) {
 			uifactory.addFormSubmitButton("save", buttonsCont);
 		}
 	}
diff --git a/src/main/java/org/olat/modules/curriculum/ui/MoveCurriculumElementController.java b/src/main/java/org/olat/modules/curriculum/ui/MoveCurriculumElementController.java
index 543ab270e07..0ed4f972ce7 100644
--- a/src/main/java/org/olat/modules/curriculum/ui/MoveCurriculumElementController.java
+++ b/src/main/java/org/olat/modules/curriculum/ui/MoveCurriculumElementController.java
@@ -25,6 +25,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 import org.olat.core.commons.persistence.DB;
@@ -45,6 +46,7 @@ import org.olat.modules.curriculum.CurriculumElement;
 import org.olat.modules.curriculum.CurriculumElementStatus;
 import org.olat.modules.curriculum.CurriculumElementType;
 import org.olat.modules.curriculum.CurriculumElementTypeToType;
+import org.olat.modules.curriculum.CurriculumSecurityCallback;
 import org.olat.modules.curriculum.CurriculumService;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -60,20 +62,26 @@ public class MoveCurriculumElementController extends FormBasicController {
 	private final CurriculumTreeModel curriculumModel;
 	
 	private final Curriculum curriculum;
+	private final CurriculumSecurityCallback secCallback;
 	private Set<CurriculumElementType> allowedTypes = new HashSet<>();
 	private Set<CurriculumElementType> allowedSiblingTypes = new HashSet<>();
 	private List<CurriculumElement> curriculumElementsToMove;
 	private Set<TreeNode> targetableNodes = new HashSet<>();
 	
+	private Predicate<CurriculumElement> admin = c -> true;
+	private Predicate<CurriculumElement> editionOnly = c -> isEditable(c);
+	
 	@Autowired
 	private DB dbInstance;
 	@Autowired
 	private CurriculumService curriculumService;
 	
 	public MoveCurriculumElementController(UserRequest ureq, WindowControl wControl,
-			List<CurriculumElement> curriculumElementsToMove, Curriculum curriculum) {
+			List<CurriculumElement> curriculumElementsToMove, Curriculum curriculum,
+			CurriculumSecurityCallback secCallback) {
 		super(ureq, wControl, "move_curriculum_element");
 		this.curriculum = curriculum;
+		this.secCallback = secCallback;
 		this.curriculumElementsToMove = new ArrayList<>(curriculumElementsToMove);
 		curriculumModel = new CurriculumTreeModel(curriculum, curriculumElementsToMove);
 		initAllowedTypes();
@@ -96,7 +104,8 @@ public class MoveCurriculumElementController extends FormBasicController {
 	
 	private void loadModel() {
 		List<CurriculumElement> allElements = curriculumService.getCurriculumElements(curriculum, CurriculumElementStatus.notDeleted());
-		curriculumModel.loadTreeModel(allElements);
+		Predicate<CurriculumElement> filter = secCallback.canEditCurriculumTree() ? admin : editionOnly;
+		curriculumModel.loadTreeModel(allElements, filter);
 		
 		//remove children of the curriculum element to move
 		for(CurriculumElement elementToMove:curriculumElementsToMove) {
@@ -107,7 +116,7 @@ public class MoveCurriculumElementController extends FormBasicController {
 				nodeToMove.getParent().remove(nodeToMove);
 			}
 		}
-		
+
 		// remove the elements with incompatible types
 		List<TreeNode> openedNodes = new ArrayList<>();
 		filterByAllowedTypes(curriculumModel.getRootNode(), openedNodes);
@@ -241,6 +250,10 @@ public class MoveCurriculumElementController extends FormBasicController {
 		}
 		return false;
 	}
+	
+	private boolean isEditable(CurriculumElement element) {
+		return secCallback.canEditCurriculumElement(element);
+	}
 
 	@Override
 	protected void formCancelled(UserRequest ureq) {
diff --git a/src/main/java/org/olat/modules/curriculum/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/curriculum/ui/_i18n/LocalStrings_de.properties
index 27bd2a1f9f8..c0ce34ff142 100644
--- a/src/main/java/org/olat/modules/curriculum/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/modules/curriculum/ui/_i18n/LocalStrings_de.properties
@@ -73,6 +73,7 @@ remove.memberships=Entfernen
 remove.resources=Entfernen
 resources.add=$add.resources
 role.coach=Betreuer
+role.curriculumelementowner=Elementbesitzer
 role.curriculummanager=Curriculumverwalter
 role.curriculumowner=Curriculumbesitzer
 role.owner=Kursbesitzer
diff --git a/src/main/java/org/olat/modules/curriculum/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/curriculum/ui/_i18n/LocalStrings_en.properties
index 2fcefb7a7e6..5a9b288cd2d 100644
--- a/src/main/java/org/olat/modules/curriculum/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/modules/curriculum/ui/_i18n/LocalStrings_en.properties
@@ -73,6 +73,7 @@ remove.memberships=Remove
 remove.resources=Remove
 resources.add=$add.resources
 role.coach=Coach
+role.curriculumelementowner=Element owner
 role.curriculummanager=Curriculum manager
 role.curriculumowner=Curriculum owner
 role.owner=Course owner
diff --git a/src/main/java/org/olat/modules/portfolio/ui/BinderListController.java b/src/main/java/org/olat/modules/portfolio/ui/BinderListController.java
index d61a6864607..120a673efbb 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/BinderListController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/BinderListController.java
@@ -562,7 +562,7 @@ public class BinderListController extends FormBasicController
 		String commandLabel = translate("create.binder.selectTemplate");
 		removeAsListenerAndDispose(searchTemplateCtrl);
 		searchTemplateCtrl = new RepositorySearchController(commandLabel, ureq, getWindowControl(),
-				false, false, new String[]{ BinderTemplateResource.TYPE_NAME }, null);
+				false, false, new String[]{ BinderTemplateResource.TYPE_NAME }, false, null);
 		searchTemplateCtrl.enableSearchforAllXXAbleInSearchForm(Can.all);
 		searchTemplateCtrl.doSearchByTypeLimitAccess(new String[]{ BinderTemplateResource.TYPE_NAME }, ureq);
 		listenTo(searchTemplateCtrl);
diff --git a/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java b/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java
index 686128aedfc..2810942ef8f 100644
--- a/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java
@@ -872,7 +872,7 @@ public class QuestionListController extends AbstractItemListController implement
 			allowed = new String[]{ ImsQTI21Resource.TYPE_NAME };
 		}
 		importTestCtrl = new ReferencableEntriesSearchController(getWindowControl(), ureq, allowed,
-				null, translate("import.repository"), false, false, false, true, Can.copyable);
+				null, translate("import.repository"), false, false, false, false, true, Can.copyable);
 		listenTo(importTestCtrl);
 		
 		cmc = new CloseableModalController(getWindowControl(), translate("close"),
diff --git a/src/main/java/org/olat/modules/quality/generator/ui/RepositoryEntryWhiteListController.java b/src/main/java/org/olat/modules/quality/generator/ui/RepositoryEntryWhiteListController.java
index f3d2e8ab133..736f017e10c 100644
--- a/src/main/java/org/olat/modules/quality/generator/ui/RepositoryEntryWhiteListController.java
+++ b/src/main/java/org/olat/modules/quality/generator/ui/RepositoryEntryWhiteListController.java
@@ -206,7 +206,7 @@ public class RepositoryEntryWhiteListController extends FormBasicController
 	private void doSelectRepositoryEntry(UserRequest ureq) {
 		selectCtrl = new ReferencableEntriesSearchController(getWindowControl(), ureq,
 				new String[] { CourseModule.getCourseTypeName() }, translate("repository.entry.select.title"),
-				false, false, true, true);
+				false, false, true, false, true);
 		listenTo(selectCtrl);
 
 		cmc = new CloseableModalController(getWindowControl(), translate("close"),
diff --git a/src/main/java/org/olat/modules/quality/ui/wizard/AddCourseUserSearchController.java b/src/main/java/org/olat/modules/quality/ui/wizard/AddCourseUserSearchController.java
index 439aa4b80ed..acc6adccef6 100644
--- a/src/main/java/org/olat/modules/quality/ui/wizard/AddCourseUserSearchController.java
+++ b/src/main/java/org/olat/modules/quality/ui/wizard/AddCourseUserSearchController.java
@@ -53,7 +53,7 @@ public class AddCourseUserSearchController extends StepFormBasicController {
 
 		searchController = new ReferencableEntriesSearchController(getWindowControl(), ureq,
 				new String[] { "CourseModule" }, translate("participation.user.course.add.choose"),
-				false, false, true, true);
+				false, false, true, false, true);
 		listenTo(searchController);
 		initForm (ureq);
 	}
diff --git a/src/main/java/org/olat/portfolio/ui/EPMapRunController.java b/src/main/java/org/olat/portfolio/ui/EPMapRunController.java
index d749d43e232..19f58338801 100755
--- a/src/main/java/org/olat/portfolio/ui/EPMapRunController.java
+++ b/src/main/java/org/olat/portfolio/ui/EPMapRunController.java
@@ -281,7 +281,7 @@ public class EPMapRunController extends BasicController implements Activateable2
 		String commandLabel = translate("create.map.selectTemplate");
 		removeAsListenerAndDispose(searchTemplateCtrl);
 		searchTemplateCtrl = new ReferencableEntriesSearchController(getWindowControl(), ureq,
-				new String[]{EPTemplateMapResource.TYPE_NAME}, commandLabel, false, false, false, false);			
+				new String[]{EPTemplateMapResource.TYPE_NAME}, commandLabel, false, false, false, false, false);			
 		listenTo(searchTemplateCtrl);
 		createMapBox = new CloseableModalController(getWindowControl(), title, searchTemplateCtrl.getInitialComponent(), true, title);
 		createMapBox.setCustomWindowCSS("o_sel_add_map_template_window");
diff --git a/src/main/java/org/olat/repository/RepositoryManager.java b/src/main/java/org/olat/repository/RepositoryManager.java
index 3561a101e96..cf93395e67e 100644
--- a/src/main/java/org/olat/repository/RepositoryManager.java
+++ b/src/main/java/org/olat/repository/RepositoryManager.java
@@ -1139,8 +1139,9 @@ public class RepositoryManager {
 	 * This is an administrative query which need author, learn resource manager, quality manager
 	 * or higher permissions.
 	 * 
-	 * @param identity
-	 * @param roles
+	 * @param identity The searcher
+	 * @param roles The roles of the searcher
+	 * @param organisationWildCard No roles check but only organization membership instead of roles
 	 * @param resourceTypes
 	 * @param displayName
 	 * @param author
@@ -1149,8 +1150,8 @@ public class RepositoryManager {
 	 * @param checkCanCopy
 	 * @return
 	 */
-	public List<RepositoryEntry> queryResourcesLimitType(Identity identity, Roles roles, List<String> resourceTypes,
-			String displayName, String author, String desc, boolean checkCanReference, boolean checkCanCopy) {
+	public List<RepositoryEntry> queryResourcesLimitType(Identity identity, Roles roles, boolean organisationWildCard,
+			List<String> resourceTypes, String displayName, String author, String desc, boolean checkCanReference, boolean checkCanCopy) {
 		if(!checkCanReference && !checkCanCopy) {
 			return Collections.emptyList();
 		}
@@ -1160,7 +1161,7 @@ public class RepositoryManager {
 
 		// Build the query
 		// 1) Joining tables
-		QueryBuilder sb = new QueryBuilder(400);
+		QueryBuilder sb = new QueryBuilder(1024);
 		sb.append("select distinct v from repositoryentry v ")
 		  .append(" inner join fetch v.olatResource as res" )
 		  .append(" inner join fetch v.statistics as statistics")
@@ -1176,23 +1177,24 @@ public class RepositoryManager {
 		//author
 		if(roles.isAuthor()) {
 			sb.append(" or (membership.role ").in(OrganisationRoles.author)
-			  .append(" and v.status ").in(RepositoryEntryStatusEnum.reviewToClosed()).append(")");
-			if(checkCanReference) {
-				sb.append(" and v.canReference=true");
-			}
-			if(checkCanCopy) {
-				sb.append(" and v.canCopy=true");
-			}
+			  .append(" and v.status ").in(RepositoryEntryStatusEnum.reviewToClosed())
+			  .append(" and v.canReference=true", checkCanReference)
+			  .append(" and v.canCopy=true", checkCanCopy)
+			  .append(")");
 		}
 		if(roles.isQualityManager()) {
 			sb.append(" or (membership.role ").in(OrganisationRoles.qualitymanager)
-			  .append(" and v.status ").in(RepositoryEntryStatusEnum.published).append(")");
-			if(checkCanReference) {
-				sb.append(" and v.canReference=true");
-			}
-			if(checkCanCopy) {
-				sb.append(" and v.canCopy=true");
-			}
+			  .append(" and v.status ").in(RepositoryEntryStatusEnum.published)
+			  .append(" and v.canReference=true", checkCanReference)
+			  .append(" and v.canCopy=true", checkCanCopy)
+			  .append(")");
+		}
+		if(organisationWildCard) {
+			sb.append(" or (membership.role ").in(OrganisationRoles.user)
+			  .append(" and v.status ").in(RepositoryEntryStatusEnum.preparationToClosed())
+			  .append(" and v.canReference=true", checkCanReference)
+			  .append(" and v.canCopy=true", checkCanCopy)
+			  .append(")");
 		}
 		
 		sb.append(")");
diff --git a/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java b/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java
index 192663b1c69..8635495fce8 100644
--- a/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java
+++ b/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java
@@ -99,8 +99,8 @@ public class ReferencableEntriesSearchController extends BasicController {
 	private RepositoryEntry selectedRepositoryEntry;
 	private List<RepositoryEntry> selectedRepositoryEntries;
 	
-	private final boolean canImport;
 	private final Can canBe;
+	private final boolean canImport;
 	
 	private Object userObject;
 	
@@ -110,21 +110,21 @@ public class ReferencableEntriesSearchController extends BasicController {
 	private RepositoryHandlerFactory repositoryHandlerFactory;
 
 	public ReferencableEntriesSearchController(WindowControl wControl, UserRequest ureq, String limitType, String commandLabel) {
-		this(wControl, ureq, new String[]{ limitType }, null, commandLabel, true, true, false, false, Can.referenceable);
+		this(wControl, ureq, new String[]{ limitType }, null, commandLabel, true, true, false, false, false, Can.referenceable);
 	}
 	
 	public ReferencableEntriesSearchController(WindowControl wControl, UserRequest ureq, String[] limitTypes, String commandLabel) {
-		this(wControl, ureq, limitTypes, null, commandLabel, true, true, false, false, Can.referenceable);
+		this(wControl, ureq, limitTypes, null, commandLabel, true, true, false, false, false, Can.referenceable);
 	}
 	
 	public ReferencableEntriesSearchController(WindowControl wControl, UserRequest ureq, String[] limitTypes, String commandLabel,
-			boolean canImport, boolean canCreate, boolean multiSelect, boolean adminSearch) {
-		this(wControl, ureq, limitTypes, null, commandLabel, canImport, canCreate, multiSelect, adminSearch, Can.referenceable);
+			boolean canImport, boolean canCreate, boolean multiSelect, boolean organisationWildCard, boolean adminSearch) {
+		this(wControl, ureq, limitTypes, null, commandLabel, canImport, canCreate, multiSelect, organisationWildCard, adminSearch, Can.referenceable);
 	}
 
 	public ReferencableEntriesSearchController(WindowControl wControl, UserRequest ureq,
 			String[] limitTypes, RepositoryEntryFilter filter, String commandLabel,
-			boolean canImport, boolean canCreate, boolean multiSelect, boolean adminSearch,
+			boolean canImport, boolean canCreate, boolean multiSelect, boolean organisationWildCard, boolean adminSearch, 
 			Can canBe) {
 
 		super(ureq, wControl);
@@ -139,7 +139,8 @@ public class ReferencableEntriesSearchController extends BasicController {
 		}
 
 		// add repo search controller
-		searchCtr = new RepositorySearchController(commandLabel, ureq, getWindowControl(), false, multiSelect, limitTypes, filter);
+		searchCtr = new RepositorySearchController(commandLabel, ureq, getWindowControl(),
+				false, multiSelect, limitTypes, organisationWildCard, filter);
 		listenTo(searchCtr);
 		
 		// do instantiate buttons
@@ -296,10 +297,10 @@ public class ReferencableEntriesSearchController extends BasicController {
 				} else if (clickedLink == allEntriesLink){
 					switch(canBe) {
 						case referenceable:
-							searchCtr.doSearchForReferencableResourcesLimitType(ureq.getIdentity(), limitTypes, ureq.getUserSession().getRoles());
+							searchCtr.doSearchForReferencableResourcesLimitType(getIdentity(), limitTypes, ureq.getUserSession().getRoles());
 							break;
 						case copyable:
-							searchCtr.doSearchForCopyableResourcesLimitType(ureq.getIdentity(), limitTypes, ureq.getUserSession().getRoles());
+							searchCtr.doSearchForCopyableResourcesLimitType(getIdentity(), limitTypes, ureq.getUserSession().getRoles());
 							break;
 						case all:
 							searchCtr.doSearchByTypeLimitAccess(limitTypes, ureq);							
diff --git a/src/main/java/org/olat/repository/controllers/RepositorySearchController.java b/src/main/java/org/olat/repository/controllers/RepositorySearchController.java
index 55d9e746fb9..0dacad7dcc4 100644
--- a/src/main/java/org/olat/repository/controllers/RepositorySearchController.java
+++ b/src/main/java/org/olat/repository/controllers/RepositorySearchController.java
@@ -101,7 +101,8 @@ public class RepositorySearchController extends BasicController implements Activ
 	private Can enableSearchforAllInSearchForm;
 	private SearchType searchType;
 	private final Roles identityRoles;
-	private RepositoryEntryFilter filter;
+	private final RepositoryEntryFilter filter;
+	private final boolean organisationWildCard;
 	
 	@Autowired
 	private RepositoryManager repositoryManager;
@@ -109,10 +110,11 @@ public class RepositorySearchController extends BasicController implements Activ
 	private RepositoryService repositoryService;
 
 	public RepositorySearchController(String selectButtonLabel, UserRequest ureq, WindowControl myWControl,
-			boolean withCancel, boolean multiSelect, String[] limitTypes, RepositoryEntryFilter filter) {
+			boolean withCancel, boolean multiSelect, String[] limitTypes, boolean organisationWildCard, RepositoryEntryFilter filter) {
 		super(ureq, myWControl, Util.createPackageTranslator(RepositoryService.class, ureq.getLocale()));
 		
 		this.filter = filter;
+		this.organisationWildCard = organisationWildCard;
 		identityRoles = ureq.getUserSession().getRoles();
 		
 		vc = createVelocityContainer("reposearch", "search");
@@ -246,8 +248,9 @@ public class RepositorySearchController extends BasicController implements Activ
 		String name = searchForm.getDisplayName();
 		String author = searchForm.getAuthor();
 		String desc = searchForm.getDescription();
-		List<RepositoryEntry> entries = repositoryManager.queryResourcesLimitType(getIdentity(), identityRoles, restrictedTypes, name, author, desc,
-					enableSearchforAllInSearchForm == Can.referenceable, enableSearchforAllInSearchForm == Can.copyable);
+		List<RepositoryEntry> entries = repositoryManager.queryResourcesLimitType(getIdentity(),
+				identityRoles,organisationWildCard, restrictedTypes, name, author, desc,
+				enableSearchforAllInSearchForm == Can.referenceable, enableSearchforAllInSearchForm == Can.copyable);
 		filterRepositoryEntries(entries);
 		repoTableModel.setObjects(entries);
 		if(updateFilters) {
@@ -257,20 +260,6 @@ public class RepositorySearchController extends BasicController implements Activ
 		displaySearchResults(ureq);
 	}
 
-	
-	/**
-	 * Do search for all resources that the user can reference either because he 
-	 * is the owner of the resource or because he has author rights and the resource
-	 * is set to at least BA in the BARG settings and the resource has the flag
-	 * 'canReference' set to true.
-	 * @param owner The current identity
-	 * @param limitType The search limitation a specific type
-	 * @param roles The users roles
-	 */
-	public void doSearchForReferencableResourcesLimitType(Identity owner, String limitType, Roles roles) {
-		doSearchForReferencableResourcesLimitType(owner, limitType.equals("") ? null : new String[] { limitType }, roles);
-	}
-
 	/**
 	 * Do search for all resources that the user can reference either because he 
 	 * is the owner of the resource or because he has author rights and the resource
@@ -287,7 +276,9 @@ public class RepositorySearchController extends BasicController implements Activ
 		} else {
 			restrictedTypes.addAll(Arrays.asList(limitTypes));
 		}
-		List<RepositoryEntry> entries = repositoryManager.queryResourcesLimitType(owner, roles, restrictedTypes, null, null, null, true, false);
+		
+		List<RepositoryEntry> entries = repositoryManager.queryResourcesLimitType(owner, roles, organisationWildCard,
+				restrictedTypes, null, null, null, true, false);
 		filterRepositoryEntries(entries);
 		repoTableModel.setObjects(entries);
 		tableCtr.setFilters(null, null);
@@ -311,7 +302,8 @@ public class RepositorySearchController extends BasicController implements Activ
 		} else {
 			restrictedTypes.addAll(Arrays.asList(limitTypes));
 		}
-		List<RepositoryEntry> entries = repositoryManager.queryResourcesLimitType(owner, roles, restrictedTypes, null, null, null, false, true);
+		List<RepositoryEntry> entries = repositoryManager.queryResourcesLimitType(owner, roles, organisationWildCard,
+				restrictedTypes, null, null, null, false, true);
 		filterRepositoryEntries(entries);
 		repoTableModel.setObjects(entries);
 		tableCtr.setFilters(null, null);
diff --git a/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java b/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java
index ecdac318ca4..dfa13618bd3 100644
--- a/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java
+++ b/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java
@@ -50,7 +50,6 @@ import org.olat.core.logging.Tracing;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.coordinate.LockResult;
-import org.olat.course.assessment.AssessmentMode;
 import org.olat.course.assessment.manager.UserCourseInformationsManager;
 import org.olat.fileresource.FileResourceManager;
 import org.olat.fileresource.types.AnimationFileResource;
@@ -68,7 +67,6 @@ import org.olat.repository.RepositoryEntryStatusEnum;
 import org.olat.repository.RepositoryService;
 import org.olat.repository.model.RepositoryEntrySecurity;
 import org.olat.repository.ui.RepositoryEntryRuntimeController;
-import org.olat.repository.ui.RepositoryEntryRuntimeController.RuntimeControllerCreator;
 import org.olat.repository.ui.WebDocumentRunController;
 import org.olat.resource.OLATResource;
 import org.olat.resource.OLATResourceManager;
@@ -252,14 +250,10 @@ public class WebDocumentHandler extends FileHandler {
 
 	@Override
 	public MainLayoutController createLaunchController(RepositoryEntry re,  RepositoryEntrySecurity reSecurity, UserRequest ureq, WindowControl wControl) {
-		return new RepositoryEntryRuntimeController(ureq, wControl, re, reSecurity, new RuntimeControllerCreator() {
-			@Override
-			public Controller create(UserRequest uureq, WindowControl wwControl, TooledStackedPanel toolbarPanel,
-					RepositoryEntry entry, RepositoryEntrySecurity rereSecurity, AssessmentMode assessmentMode) {
-				CoreSpringFactory.getImpl(UserCourseInformationsManager.class)
-					.updateUserCourseInformations(entry.getOlatResource(), uureq.getIdentity());
-				return new WebDocumentRunController(uureq, wwControl, entry, reSecurity);
-			}
+		return new RepositoryEntryRuntimeController(ureq, wControl, re, reSecurity, (uureq, wwControl, toolbarPanel, entry, rereSecurity, assessmentMode) -> {
+			CoreSpringFactory.getImpl(UserCourseInformationsManager.class)
+				.updateUserCourseInformations(entry.getOlatResource(), uureq.getIdentity());
+			return new WebDocumentRunController(uureq, wwControl, entry);
 		});
 	}
 
diff --git a/src/main/java/org/olat/repository/ui/RepositoryTableModel.java b/src/main/java/org/olat/repository/ui/RepositoryTableModel.java
index f63f2766a78..d657953a209 100644
--- a/src/main/java/org/olat/repository/ui/RepositoryTableModel.java
+++ b/src/main/java/org/olat/repository/ui/RepositoryTableModel.java
@@ -69,7 +69,7 @@ import org.olat.user.UserManager;
  * 
  */
 public class RepositoryTableModel extends DefaultTableDataModel<RepositoryEntry> {
-
+	
 	/**
 	 * Identifies a table selection event (outer-left column)
 	 */
@@ -287,12 +287,7 @@ public class RepositoryTableModel extends DefaultTableDataModel<RepositoryEntry>
 			case repoEntry: return re; 
 			case displayname: return getDisplayName(re, translator.getLocale());
 			case author: return getFullname(re.getInitialAuthor());
-			case access: {
-				// delegate to specific access renderer
-				StringOutput sb = new StringOutput(32);
-				accessRenderer.render(sb, re.getEntryStatus());
-				return sb.toString();
-			}
+			case access: return accessRenderer.renderEntryStatus(re);
 			case creationDate: return re.getCreationDate();
 			case lastUsage: return re.getStatistics().getLastUsage();
 			case externalId: return re.getExternalId();
diff --git a/src/main/java/org/olat/repository/ui/WebDocumentRunController.java b/src/main/java/org/olat/repository/ui/WebDocumentRunController.java
index 17bc1fc539a..516853bfea3 100644
--- a/src/main/java/org/olat/repository/ui/WebDocumentRunController.java
+++ b/src/main/java/org/olat/repository/ui/WebDocumentRunController.java
@@ -52,7 +52,6 @@ import org.olat.core.util.vfs.VFSMediaResource;
 import org.olat.core.util.vfs.filters.VFSSystemItemFilter;
 import org.olat.fileresource.FileResourceManager;
 import org.olat.repository.RepositoryEntry;
-import org.olat.repository.model.RepositoryEntrySecurity;
 import org.olat.resource.OLATResource;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -69,8 +68,7 @@ public class WebDocumentRunController extends BasicController {
 	@Autowired
 	private MovieService movieService;
 
-	public WebDocumentRunController(UserRequest ureq, WindowControl wControl, RepositoryEntry entry,
-			RepositoryEntrySecurity reSecurity) {
+	public WebDocumentRunController(UserRequest ureq, WindowControl wControl, RepositoryEntry entry) {
 		super(ureq, wControl);
 
 		VelocityContainer mainVC = createVelocityContainer("web_content");
diff --git a/src/main/java/org/olat/repository/ui/author/AccessRenderer.java b/src/main/java/org/olat/repository/ui/author/AccessRenderer.java
index 5006b97d1ff..94b1fb085c3 100644
--- a/src/main/java/org/olat/repository/ui/author/AccessRenderer.java
+++ b/src/main/java/org/olat/repository/ui/author/AccessRenderer.java
@@ -19,8 +19,10 @@
  */
 package org.olat.repository.ui.author;
 
+import java.io.IOException;
 import java.util.Locale;
 
+import org.apache.logging.log4j.Logger;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiCellRenderer;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableComponent;
 import org.olat.core.gui.components.table.CustomCellRenderer;
@@ -28,6 +30,7 @@ import org.olat.core.gui.render.Renderer;
 import org.olat.core.gui.render.StringOutput;
 import org.olat.core.gui.render.URLBuilder;
 import org.olat.core.gui.translator.Translator;
+import org.olat.core.logging.Tracing;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.repository.RepositoryEntry;
@@ -42,6 +45,8 @@ import org.olat.repository.RepositoryService;
  *
  */
 public class AccessRenderer implements FlexiCellRenderer, CustomCellRenderer {
+
+	private static final Logger log = Tracing.createLoggerFor(AccessRenderer.class);
 	
 	private final Translator translator;
 	
@@ -69,6 +74,16 @@ public class AccessRenderer implements FlexiCellRenderer, CustomCellRenderer {
 		// use the FlexiCellRenderer method
 		render(renderer, sb, val, -1, null, null, null);
 	}
+	
+	public String renderEntryStatus(RepositoryEntry re) {
+		try(StringOutput sb = new StringOutput(32)) {
+			render(sb, re.getEntryStatus());
+			return sb.toString();
+		} catch(IOException e) {
+			log.error("",e);
+			return "";
+		}
+	}
 
 	public void render(StringOutput sb, RepositoryEntryStatusEnum status) {
 		sb.append("<span class='o_labeled_light o_repo_status_").append(status.name())
diff --git a/src/main/java/org/olat/repository/ui/catalog/CatalogNodeManagerController.java b/src/main/java/org/olat/repository/ui/catalog/CatalogNodeManagerController.java
index 20fc71ec6a6..dcbcae9eae6 100644
--- a/src/main/java/org/olat/repository/ui/catalog/CatalogNodeManagerController.java
+++ b/src/main/java/org/olat/repository/ui/catalog/CatalogNodeManagerController.java
@@ -680,7 +680,7 @@ public class CatalogNodeManagerController extends FormBasicController implements
 		removeAsListenerAndDispose(entrySearchCtrl);
 		removeAsListenerAndDispose(cmc);
 		
-		entrySearchCtrl = new RepositorySearchController(translate("choose"), ureq, getWindowControl(), true, false, new String[0], null);
+		entrySearchCtrl = new RepositorySearchController(translate("choose"), ureq, getWindowControl(), true, false, new String[0], false, null);
 		listenTo(entrySearchCtrl);
 		// OLAT-Admin has search form
 		if (isAdministrator) {
diff --git a/src/main/java/org/olat/upgrade/OLATUpgrade.java b/src/main/java/org/olat/upgrade/OLATUpgrade.java
index 4d3ed47a438..feff8cc92a8 100644
--- a/src/main/java/org/olat/upgrade/OLATUpgrade.java
+++ b/src/main/java/org/olat/upgrade/OLATUpgrade.java
@@ -27,8 +27,6 @@ package org.olat.upgrade;
 
 import javax.sql.DataSource;
 
-import org.apache.logging.log4j.Logger;
-import org.olat.core.logging.Tracing;
 import org.springframework.jdbc.core.JdbcTemplate;
 
 
@@ -45,7 +43,6 @@ public abstract class OLATUpgrade {
 	
 	static final String TASK_DP_UPGRADE = "Database update";
 	private String alterDbFilename;
-	private static final Logger log = Tracing.createLoggerFor(OLATUpgrade.class);
 
 	/**
 	 * @return String representing the unique version identifyer of this upgrade
diff --git a/src/main/java/org/olat/upgrade/OLATUpgrade_13_3_0.java b/src/main/java/org/olat/upgrade/OLATUpgrade_13_3_0.java
index d46652890bd..ffc1b5ddff6 100644
--- a/src/main/java/org/olat/upgrade/OLATUpgrade_13_3_0.java
+++ b/src/main/java/org/olat/upgrade/OLATUpgrade_13_3_0.java
@@ -24,14 +24,25 @@ import java.io.FilenameFilter;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.StandardCopyOption;
+import java.util.List;
 
 import org.apache.logging.log4j.Logger;
+import org.olat.basesecurity.Group;
+import org.olat.basesecurity.manager.GroupDAO;
 import org.olat.core.commons.modules.bc.FolderConfig;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.commons.services.vfs.VFSRepositoryModule;
 import org.olat.core.commons.services.vfs.manager.VFSRepositoryServiceImpl;
+import org.olat.core.id.Identity;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.StringHelper;
+import org.olat.modules.curriculum.Curriculum;
+import org.olat.modules.curriculum.CurriculumElement;
+import org.olat.modules.curriculum.CurriculumElementStatus;
+import org.olat.modules.curriculum.CurriculumRoles;
+import org.olat.modules.curriculum.manager.CurriculumDAO;
+import org.olat.modules.curriculum.manager.CurriculumElementDAO;
+import org.olat.modules.curriculum.model.CurriculumImpl;
 import org.olat.modules.library.LibraryModule;
 import org.olat.properties.Property;
 import org.olat.properties.PropertyManager;
@@ -53,10 +64,17 @@ public class OLATUpgrade_13_3_0 extends OLATUpgrade {
 	private static final String MOVE_REPO_IMAGES = "MOVE REPO IMAGES";
 	private static final String MIGRATE_FILE_METADATA = "MIGRATE FILE METADATA";
 	private static final String MIGRATE_LIBRARY_CONFIGURATION = "MIGRATE LIBRARY CONFIGURATION";
+	private static final String MIGRATE_CURRICULUM_ROLES = "MIGRATE CURRICULUM ROLES";
 	
 	@Autowired
 	private DB dbInstance;
 	@Autowired
+	private GroupDAO groupDao;
+	@Autowired
+	private CurriculumDAO curriculumDao;
+	@Autowired
+	private CurriculumElementDAO curriculumElementDao;
+	@Autowired
 	private LibraryModule libraryModule;
 	@Autowired
 	private VFSRepositoryModule vfsModule;
@@ -91,6 +109,7 @@ public class OLATUpgrade_13_3_0 extends OLATUpgrade {
 		allOk &= migrateLibrary(upgradeManager, uhd);
 		allOk &= migrateRepositoryImages(upgradeManager, uhd);
 		allOk &= migrateMetadata(upgradeManager, uhd);// need to be the last
+		allOk &= migrateCurriculumRoles(upgradeManager, uhd);// need to be the last
 
 		uhd.setInstallationComplete(allOk);
 		upgradeManager.setUpgradesHistory(uhd, VERSION);
@@ -110,6 +129,56 @@ public class OLATUpgrade_13_3_0 extends OLATUpgrade {
 		return super.doNewSystemInit();
 	}
 	
+	private boolean migrateCurriculumRoles(UpgradeManager upgradeManager, UpgradeHistoryData uhd) {
+		boolean allOk = true;
+		if (!uhd.getBooleanDataValue(MIGRATE_CURRICULUM_ROLES)) {
+			try {
+				migrateCurriculumsRoles();
+			} catch (Exception e) {
+				log.error("", e);
+				allOk = false;
+			}
+			
+			uhd.setBooleanDataValue(MIGRATE_CURRICULUM_ROLES, allOk);
+			upgradeManager.setUpgradesHistory(uhd, VERSION);
+		}
+		return allOk;
+	}
+	
+	private void migrateCurriculumsRoles() {
+		List<Curriculum> curriculums = curriculumDao.loadAllCurriculums();
+		for(Curriculum curriculum:curriculums) {
+			Group group = ((CurriculumImpl)curriculum).getGroup();
+			List<Identity> managers = groupDao.getMembers(group, CurriculumRoles.curriculummanager.name());
+			for(Identity manager:managers) {
+				groupDao.removeMembership(group, manager, CurriculumRoles.curriculummanager.name());
+				groupDao.addMembershipOneWay(group, manager, CurriculumRoles.curriculumowner.name());
+			}
+			dbInstance.commitAndCloseSession();
+			migrateCurriculumElementsRoles(curriculum);
+			dbInstance.commitAndCloseSession();
+		}
+	}
+	
+	private void migrateCurriculumElementsRoles(Curriculum curriculum) {
+		List<CurriculumElement> elements = curriculumElementDao.loadElements(curriculum, CurriculumElementStatus.values());
+		for(CurriculumElement element:elements) {
+			Group group = element.getGroup();
+			List<Identity> managers = groupDao.getMembers(group, CurriculumRoles.curriculummanager.name());
+			for(Identity manager:managers) {
+				groupDao.removeMembership(group, manager, CurriculumRoles.curriculummanager.name());
+				groupDao.addMembershipOneWay(group, manager, CurriculumRoles.curriculumowner.name());
+			}
+			
+			List<Identity> owners = groupDao.getMembers(group, CurriculumRoles.curriculumowner.name());
+			for(Identity owner:owners) {
+				groupDao.removeMembership(group, owner, CurriculumRoles.curriculumelementowner.name());
+				groupDao.addMembershipOneWay(group, owner, CurriculumRoles.curriculumelementowner.name());
+			}
+			dbInstance.commitAndCloseSession();
+		}
+	}
+	
 	private boolean migrateLibrary(UpgradeManager upgradeManager, UpgradeHistoryData uhd) {
 		boolean allOk = true;
 		if (!uhd.getBooleanDataValue(MIGRATE_LIBRARY_CONFIGURATION)) {
@@ -148,16 +217,18 @@ public class OLATUpgrade_13_3_0 extends OLATUpgrade {
 				
 				File repositoryHome = new File(FolderConfig.getCanonicalRepositoryHome());
 				File[] images = repositoryHome.listFiles(new ImageFilter());
-				for(File image:images) {
-					String name = image.getName();
-					int index = name.lastIndexOf('.');
-					String resourceId = name.substring(0, index);
-					if(StringHelper.isLong(resourceId)) {
-						migrateRepositoryImage(image, Long.valueOf(resourceId));
-					}
-					if(counter++ % 50 == 0) {
-						log.info("Images of lear resources moved: " + counter);
-						dbInstance.commitAndCloseSession();
+				if(images != null && images.length > 0) {
+					for(File image:images) {
+						String name = image.getName();
+						int index = name.lastIndexOf('.');
+						String resourceId = name.substring(0, index);
+						if(StringHelper.isLong(resourceId)) {
+							migrateRepositoryImage(image, Long.valueOf(resourceId));
+						}
+						if(counter++ % 50 == 0) {
+							log.info("Images of lear resources moved: " + counter);
+							dbInstance.commitAndCloseSession();
+						}
 					}
 				}
 			} catch (Exception e) {
diff --git a/src/main/java/org/olat/user/ui/organisation/OrganisationResourceListController.java b/src/main/java/org/olat/user/ui/organisation/OrganisationResourceListController.java
index 842902daf50..fb1083ff5bc 100644
--- a/src/main/java/org/olat/user/ui/organisation/OrganisationResourceListController.java
+++ b/src/main/java/org/olat/user/ui/organisation/OrganisationResourceListController.java
@@ -220,7 +220,7 @@ public class OrganisationResourceListController extends FormBasicController impl
 		
 		repoSearchCtr = new ReferencableEntriesSearchController(getWindowControl(), ureq,
 				new String[]{ CourseModule.getCourseTypeName() }, null,
-				translate("add.resources"), false, false, true, true, Can.referenceable);
+				translate("add.resources"), false, false, true, false, true, Can.referenceable);
 		listenTo(repoSearchCtr);
 		
 		cmc = new CloseableModalController(getWindowControl(), translate("close"), repoSearchCtr.getInitialComponent(), true, translate("add.resources"));
diff --git a/src/test/java/org/olat/modules/curriculum/manager/CurriculumDAOTest.java b/src/test/java/org/olat/modules/curriculum/manager/CurriculumDAOTest.java
index 494c2d637b8..20762c4bb84 100644
--- a/src/test/java/org/olat/modules/curriculum/manager/CurriculumDAOTest.java
+++ b/src/test/java/org/olat/modules/curriculum/manager/CurriculumDAOTest.java
@@ -187,7 +187,7 @@ public class CurriculumDAOTest extends OlatTestCase {
 		
 		// search curriculum for the manager
 		CurriculumSearchParameters managerParams = new CurriculumSearchParameters();
-		managerParams.setManagerIdentity(manager);
+		managerParams.setCurriculumAdmin(manager);
 		List<Curriculum> managedCurriculums = curriculumDao.search(managerParams);
 		Assert.assertEquals(1, managedCurriculums.size());
 		Assert.assertEquals(curriculum, managedCurriculums.get(0));
@@ -195,7 +195,7 @@ public class CurriculumDAOTest extends OlatTestCase {
 		
 		// search curriculum for the user
 		CurriculumSearchParameters userParams = new CurriculumSearchParameters();
-		userParams.setManagerIdentity(user);
+		userParams.setCurriculumAdmin(user);
 		List<Curriculum> userCurriculums = curriculumDao.search(userParams);
 		Assert.assertTrue(userCurriculums.isEmpty());
 	}
@@ -211,20 +211,20 @@ public class CurriculumDAOTest extends OlatTestCase {
 		
 		// search curriculum for the manager
 		CurriculumSearchParameters managerParams = new CurriculumSearchParameters();
-		managerParams.setManagerIdentity(manager);
+		managerParams.setCurriculumAdmin(manager);
 		List<CurriculumInfos> managedCurriculums = curriculumDao.searchWithInfos(managerParams);
 		Assert.assertEquals(1, managedCurriculums.size());
 		Assert.assertEquals(curriculum, managedCurriculums.get(0).getCurriculum());
 		
 		// search curriculum for the user
 		CurriculumSearchParameters userParams = new CurriculumSearchParameters();
-		userParams.setManagerIdentity(user);
+		userParams.setCurriculumAdmin(user);
 		List<CurriculumInfos> userCurriculums = curriculumDao.searchWithInfos(userParams);
 		Assert.assertTrue(userCurriculums.isEmpty());
 	}
 	
 	@Test
-	public void searchWithInfos_owner() {
+	public void searchWithInfos_repoOwner() {
 		Identity user = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-user-1");
 		Identity manager = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-manager-1");
 		Identity owner = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-course-owner-1");
@@ -238,20 +238,42 @@ public class CurriculumDAOTest extends OlatTestCase {
 		curriculumService.addMember(curriculum, user, CurriculumRoles.participant);
 		dbInstance.commitAndCloseSession();
 		
-		// search curriculum for the manager
+		// search curriculum for the owner of a repository entry in curriculum
 		CurriculumSearchParameters managerParams = new CurriculumSearchParameters();
-		managerParams.setOwnerIdentity(owner);
+		managerParams.setElementOwner(owner);
 		List<CurriculumInfos> managedCurriculums = curriculumDao.searchWithInfos(managerParams);
 		Assert.assertEquals(1, managedCurriculums.size());
 		Assert.assertEquals(curriculum, managedCurriculums.get(0).getCurriculum());
 		
 		// search curriculum for the user
 		CurriculumSearchParameters userParams = new CurriculumSearchParameters();
-		userParams.setOwnerIdentity(user);
+		userParams.setCurriculumAdmin(user);
 		List<CurriculumInfos> userCurriculums = curriculumDao.searchWithInfos(userParams);
 		Assert.assertTrue(userCurriculums.isEmpty());
 	}
 	
+	@Test
+	public void searchWithInfos_elementOwner() {
+		Identity manager = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-manager-1");
+		Identity owner = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-course-owner-1");
+		Curriculum curriculum = curriculumDao.createAndPersist("Curriculum for owners", "Owners", "Short desc.", null);
+		CurriculumElement element = curriculumService.createCurriculumElement("Element-1", "1. Element",  CurriculumElementStatus.active,
+				new Date(), new Date(), null, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum);
+		RepositoryEntry entry = JunitTestHelper.createRandomRepositoryEntry(owner);
+		curriculumService.addRepositoryEntry(element, entry, true);
+		dbInstance.commit();
+		curriculumService.addMember(curriculum, manager, CurriculumRoles.curriculummanager);
+		curriculumService.addMember(element, owner, CurriculumRoles.curriculumelementowner);
+		dbInstance.commitAndCloseSession();
+		
+		// search curriculum for the owner of a part of the curriculum
+		CurriculumSearchParameters managerParams = new CurriculumSearchParameters();
+		managerParams.setElementOwner(owner);
+		List<CurriculumInfos> managedCurriculums = curriculumDao.searchWithInfos(managerParams);
+		Assert.assertEquals(1, managedCurriculums.size());
+		Assert.assertEquals(curriculum, managedCurriculums.get(0).getCurriculum());
+	}
+	
 	@Test
 	public void getMembersIdentity() {
 		// add a curriculum manager
@@ -319,7 +341,7 @@ public class CurriculumDAOTest extends OlatTestCase {
 		dbInstance.commit();
 
 		// is owner within a curriculum
-		boolean isOwner = curriculumDao.hasOwnerRoleInCurriculum(owner);
+		boolean isOwner = curriculumDao.hasOwnerRoleInCurriculumElement(owner);
 		Assert.assertTrue(isOwner);
 	}
 	
diff --git a/src/test/java/org/olat/modules/curriculum/manager/CurriculumElementDAOTest.java b/src/test/java/org/olat/modules/curriculum/manager/CurriculumElementDAOTest.java
index 122907d38a6..d9bdf53ad8d 100644
--- a/src/test/java/org/olat/modules/curriculum/manager/CurriculumElementDAOTest.java
+++ b/src/test/java/org/olat/modules/curriculum/manager/CurriculumElementDAOTest.java
@@ -781,7 +781,7 @@ public class CurriculumElementDAOTest extends OlatTestCase {
 		Curriculum curriculum = curriculumService.createCurriculum("cur-for-el-4", "Curriculum for element", "Curriculum", null);
 		CurriculumElement element = curriculumService.createCurriculumElement("Element-4", "4. Element", CurriculumElementStatus.active,
 				null, null, null, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum);
-		curriculumService.addMember(element, supervisor, CurriculumRoles.curriculummanager);
+		curriculumService.addMember(element, supervisor, CurriculumRoles.curriculumelementowner);
 		dbInstance.commitAndCloseSession();
 		
 		List<CurriculumElementMembership> members = curriculumElementDao.getMembershipInfos(null, Collections.singletonList(element), supervisor);
@@ -789,7 +789,7 @@ public class CurriculumElementDAOTest extends OlatTestCase {
 		Assert.assertEquals(1, members.size());
 		Assert.assertEquals(supervisor.getKey(), members.get(0).getIdentityKey());
 		Assert.assertEquals(element.getKey(), members.get(0).getCurriculumElementKey());
-		Assert.assertTrue(members.get(0).isCurriculumManager());
+		Assert.assertTrue(members.get(0).isCurriculumElementOwner());
 		Assert.assertFalse(members.get(0).isRepositoryEntryOwner());
 		Assert.assertFalse(members.get(0).isCoach());
 		Assert.assertFalse(members.get(0).isParticipant());
@@ -801,7 +801,7 @@ public class CurriculumElementDAOTest extends OlatTestCase {
 		Curriculum curriculum = curriculumService.createCurriculum("cur-for-el-5", "Curriculum for element", "Curriculum", null);
 		CurriculumElement element = curriculumService.createCurriculumElement("Element-5", "5. Element", CurriculumElementStatus.active,
 				null, null, null, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum);
-		curriculumService.addMember(element, supervisor, CurriculumRoles.curriculummanager);
+		curriculumService.addMember(element, supervisor, CurriculumRoles.curriculumelementowner);
 		dbInstance.commitAndCloseSession();
 		
 		List<CurriculumRef> curriculumList = Collections.singletonList(curriculum);
@@ -810,7 +810,7 @@ public class CurriculumElementDAOTest extends OlatTestCase {
 		Assert.assertEquals(1, members.size());
 		Assert.assertEquals(supervisor.getKey(), members.get(0).getIdentityKey());
 		Assert.assertEquals(element.getKey(), members.get(0).getCurriculumElementKey());
-		Assert.assertTrue(members.get(0).isCurriculumManager());
+		Assert.assertTrue(members.get(0).isCurriculumElementOwner());
 		Assert.assertFalse(members.get(0).isRepositoryEntryOwner());
 		Assert.assertFalse(members.get(0).isCoach());
 		Assert.assertFalse(members.get(0).isParticipant());
diff --git a/src/test/java/org/olat/modules/curriculum/manager/CurriculumMemberQueriesTest.java b/src/test/java/org/olat/modules/curriculum/manager/CurriculumMemberQueriesTest.java
index 70a16fb0a4e..8c6a95bf603 100644
--- a/src/test/java/org/olat/modules/curriculum/manager/CurriculumMemberQueriesTest.java
+++ b/src/test/java/org/olat/modules/curriculum/manager/CurriculumMemberQueriesTest.java
@@ -59,7 +59,7 @@ public class CurriculumMemberQueriesTest extends OlatTestCase {
 		Identity manager = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-manager-1");
 		Curriculum curriculum = curriculumService.createCurriculum("CUR-1", "Curriculum 1", "Short desc.", null);
 		dbInstance.commitAndCloseSession();
-		curriculumService.addMember(curriculum, manager, CurriculumRoles.curriculummanager);
+		curriculumService.addMember(curriculum, manager, CurriculumRoles.curriculumowner);
 		dbInstance.commitAndCloseSession();
 		
 		// get memberships
@@ -67,7 +67,7 @@ public class CurriculumMemberQueriesTest extends OlatTestCase {
 		List<CurriculumMember> members = memberQueries.getMembers(curriculum, params);
 		Assert.assertNotNull(members);
 		Assert.assertEquals(1, members.size());
-		Assert.assertEquals(CurriculumRoles.curriculummanager.name(), members.get(0).getRole());
+		Assert.assertEquals(CurriculumRoles.curriculumowner.name(), members.get(0).getRole());
 		Assert.assertEquals(manager, members.get(0).getIdentity());	
 	}
 	
@@ -77,7 +77,7 @@ public class CurriculumMemberQueriesTest extends OlatTestCase {
 		Curriculum curriculum = curriculumService.createCurriculum("cur-for-el-4", "Curriculum for element", "Curriculum", null);
 		CurriculumElement element = curriculumService.createCurriculumElement("Element-4", "4. Element", CurriculumElementStatus.active,
 				null, null, null, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum);
-		curriculumService.addMember(element, supervisor, CurriculumRoles.curriculummanager);
+		curriculumService.addMember(element, supervisor, CurriculumRoles.curriculumelementowner);
 		dbInstance.commitAndCloseSession();
 		
 		SearchMemberParameters params = new SearchMemberParameters();
@@ -86,7 +86,7 @@ public class CurriculumMemberQueriesTest extends OlatTestCase {
 		Assert.assertEquals(1, members.size());
 		CurriculumMember member = members.get(0);
 		Assert.assertEquals(supervisor, member.getIdentity());
-		Assert.assertEquals(CurriculumRoles.curriculummanager.name(), member.getRole());
+		Assert.assertEquals(CurriculumRoles.curriculumelementowner.name(), member.getRole());
 	}
 
 }
diff --git a/src/test/java/org/olat/modules/curriculum/manager/CurriculumServiceTest.java b/src/test/java/org/olat/modules/curriculum/manager/CurriculumServiceTest.java
index ac100772a50..e6d3f2aae89 100644
--- a/src/test/java/org/olat/modules/curriculum/manager/CurriculumServiceTest.java
+++ b/src/test/java/org/olat/modules/curriculum/manager/CurriculumServiceTest.java
@@ -111,6 +111,6 @@ public class CurriculumServiceTest extends OlatTestCase {
 		Assert.assertTrue(membership.isParticipant());
 		Assert.assertFalse(membership.isCoach());
 		Assert.assertFalse(membership.isRepositoryEntryOwner());
-		Assert.assertFalse(membership.isCurriculumManager());
+		Assert.assertFalse(membership.isCurriculumElementOwner());
 	}
 }
diff --git a/src/test/java/org/olat/portfolio/manager/EPStructureManagerTest.java b/src/test/java/org/olat/portfolio/manager/EPStructureManagerTest.java
index e060123bd97..045dd97ecc5 100644
--- a/src/test/java/org/olat/portfolio/manager/EPStructureManagerTest.java
+++ b/src/test/java/org/olat/portfolio/manager/EPStructureManagerTest.java
@@ -699,7 +699,7 @@ public class EPStructureManagerTest extends OlatTestCase {
 		assertFalse(singleAuthor.contains(ident2));//owner
 		
 		securityGroupDao.getSecurityGroupsForIdentity(ident1);
-		repositoryManager.queryResourcesLimitType(ident1, Roles.userRoles(), null, null, null, null, true, false);
+		repositoryManager.queryResourcesLimitType(ident1, Roles.userRoles(), false, null, null, null, null, true, false);
 	}
 	
 	
diff --git a/src/test/java/org/olat/repository/RepositoryManagerTest.java b/src/test/java/org/olat/repository/RepositoryManagerTest.java
index f514b6d3a15..929b580ea1a 100644
--- a/src/test/java/org/olat/repository/RepositoryManagerTest.java
+++ b/src/test/java/org/olat/repository/RepositoryManagerTest.java
@@ -662,7 +662,7 @@ public class RepositoryManagerTest extends OlatTestCase {
 		
 		List<String> resourceTypes = Collections.singletonList(re.getOlatResource().getResourceableTypeName());
 		List<RepositoryEntry> entries = repositoryManager
-				.queryResourcesLimitType(id, Roles.authorRoles(), resourceTypes, "re-member", "me", "no", true, true);
+				.queryResourcesLimitType(id, Roles.authorRoles(), false, resourceTypes, "re-member", "me", "no", true, true);
 		Assert.assertNotNull(entries);
 	}
 	
@@ -709,7 +709,7 @@ public class RepositoryManagerTest extends OlatTestCase {
 		List<String> typelist = Collections.singletonList(resourceType);
 		// finally the search query
 		long startSearchReferencable = System.currentTimeMillis();
-		List<RepositoryEntry> results = repositoryManager.queryResourcesLimitType(id1, id1Roles, typelist, null, null, null, true, false);
+		List<RepositoryEntry> results = repositoryManager.queryResourcesLimitType(id1, id1Roles, false, typelist, null, null, null, true, false);
 		long endSearchReferencable = System.currentTimeMillis();
 		log.info("found " + results.size() + " repo entries " + (endSearchReferencable - startSearchReferencable) + "ms");
 
diff --git a/src/test/java/org/olat/restapi/CurriculumElementsWebServiceTest.java b/src/test/java/org/olat/restapi/CurriculumElementsWebServiceTest.java
index ac4f330618d..4771f4827a5 100644
--- a/src/test/java/org/olat/restapi/CurriculumElementsWebServiceTest.java
+++ b/src/test/java/org/olat/restapi/CurriculumElementsWebServiceTest.java
@@ -789,7 +789,7 @@ public class CurriculumElementsWebServiceTest extends OlatJerseyTestCase {
 	}
 	
 	@Test
-	public void getUsers_curriculumManagers()
+	public void getUsers_curriculumElementOwners()
 	throws IOException, URISyntaxException {
 		Identity member = JunitTestHelper.createAndPersistIdentityAsRndUser("element-member-6");
 		Organisation defOrganisation = organisationService.getDefaultOrganisation();
@@ -802,11 +802,12 @@ public class CurriculumElementsWebServiceTest extends OlatJerseyTestCase {
 		RestConnection conn = new RestConnection();
 		assertTrue(conn.login("administrator", "openolat"));
 		
-		curriculumService.addMember(element, member, CurriculumRoles.curriculummanager);
+		curriculumService.addMember(element, member, CurriculumRoles.curriculumelementowner);
 		dbInstance.commitAndCloseSession();
 		
 		URI request = UriBuilder.fromUri(getContextURI()).path("curriculum").path(curriculum.getKey().toString())
-				.path("elements").path(element.getKey().toString()).path("users").queryParam("role", "curriculummanager").build();
+				.path("elements").path(element.getKey().toString()).path("users")
+				.queryParam("role", "curriculumelementowner").build();
 		HttpGet method = conn.createGet(request, MediaType.APPLICATION_JSON, true);
 		
 		HttpResponse response = conn.execute(method);
@@ -879,7 +880,7 @@ public class CurriculumElementsWebServiceTest extends OlatJerseyTestCase {
 	}
 	
 	@Test
-	public void getCurriculumManagers()
+	public void getCurriculumOwners()
 	throws IOException, URISyntaxException {
 		Identity member = JunitTestHelper.createAndPersistIdentityAsRndUser("element-member-10");
 		Organisation defOrganisation = organisationService.getDefaultOrganisation();
@@ -892,11 +893,11 @@ public class CurriculumElementsWebServiceTest extends OlatJerseyTestCase {
 		RestConnection conn = new RestConnection();
 		assertTrue(conn.login("administrator", "openolat"));
 		
-		curriculumService.addMember(element, member, CurriculumRoles.curriculummanager);
+		curriculumService.addMember(element, member, CurriculumRoles.curriculumelementowner);
 		dbInstance.commitAndCloseSession();
 		
 		URI request = UriBuilder.fromUri(getContextURI()).path("curriculum").path(curriculum.getKey().toString())
-				.path("elements").path(element.getKey().toString()).path("curriculummanagers").build();
+				.path("elements").path(element.getKey().toString()).path("curriculumelementowners").build();
 		HttpGet method = conn.createGet(request, MediaType.APPLICATION_JSON, true);
 		
 		HttpResponse response = conn.execute(method);
diff --git a/src/test/java/org/olat/restapi/CurriculumsWebServiceTest.java b/src/test/java/org/olat/restapi/CurriculumsWebServiceTest.java
index 28b2f8724c9..f6c120bd61a 100644
--- a/src/test/java/org/olat/restapi/CurriculumsWebServiceTest.java
+++ b/src/test/java/org/olat/restapi/CurriculumsWebServiceTest.java
@@ -388,7 +388,7 @@ public class CurriculumsWebServiceTest extends OlatJerseyTestCase {
 	}
 	
 	@Test
-	public void getCurriculumManagers()
+	public void getCurriculumOwners()
 	throws IOException, URISyntaxException {
 		RestConnection conn = new RestConnection();
 		assertTrue(conn.login("administrator", "openolat"));
@@ -398,11 +398,11 @@ public class CurriculumsWebServiceTest extends OlatJerseyTestCase {
 		Curriculum curriculum = curriculumService.createCurriculum("REST-Curriculum-elements", "REST Curriculum", "A curriculum accessible by REST API for elemets", defOrganisation);
 		dbInstance.commit();
 		
-		curriculumService.addMember(curriculum, member, CurriculumRoles.curriculummanager);
+		curriculumService.addMember(curriculum, member, CurriculumRoles.curriculumowner);
 		dbInstance.commitAndCloseSession();
 		
 		URI request = UriBuilder.fromUri(getContextURI()).path("curriculum").path(curriculum.getKey().toString())
-				.path("curriculummanagers").build();
+				.path("curriculumowners").build();
 		HttpGet method = conn.createGet(request, MediaType.APPLICATION_JSON, true);
 		
 		HttpResponse response = conn.execute(method);
@@ -415,28 +415,28 @@ public class CurriculumsWebServiceTest extends OlatJerseyTestCase {
 	}
 	
 	@Test
-	public void addCurriculumManager()
+	public void addCurriculumOwner()
 	throws IOException, URISyntaxException {
 		RestConnection conn = new RestConnection();
 		assertTrue(conn.login("administrator", "openolat"));
 
 		Organisation defOrganisation = organisationService.getDefaultOrganisation();
-		Identity manager = JunitTestHelper.createAndPersistIdentityAsRndUser("element-member-11");
+		Identity owner = JunitTestHelper.createAndPersistIdentityAsRndUser("element-member-11");
 		Curriculum curriculum = curriculumService.createCurriculum("REST-Curriculum-elements", "REST Curriculum", "A curriculum accessible by REST API for elemets", defOrganisation);
 		dbInstance.commit();
 		
 		URI request = UriBuilder.fromUri(getContextURI()).path("curriculum").path(curriculum.getKey().toString())
-				.path("curriculummanagers").path(manager.getKey().toString()).build();
+				.path("curriculumowners").path(owner.getKey().toString()).build();
 		HttpPut method = conn.createPut(request, MediaType.APPLICATION_JSON, true);
 		
 		HttpResponse response = conn.execute(method);
 		Assert.assertEquals(200, response.getStatusLine().getStatusCode());
 		EntityUtils.consume(response.getEntity());
 		
-		List<Identity> managers = curriculumService.getMembersIdentity(curriculum, CurriculumRoles.curriculummanager);
+		List<Identity> managers = curriculumService.getMembersIdentity(curriculum, CurriculumRoles.curriculumowner);
 		Assert.assertNotNull(managers);
 		Assert.assertEquals(1, managers.size());
-		Assert.assertEquals(manager, managers.get(0));
+		Assert.assertEquals(owner, managers.get(0));
 	}
 	
 	@Test
@@ -445,26 +445,26 @@ public class CurriculumsWebServiceTest extends OlatJerseyTestCase {
 		RestConnection conn = new RestConnection();
 		assertTrue(conn.login("administrator", "openolat"));
 		
-		Identity manager = JunitTestHelper.createAndPersistIdentityAsRndUser("element-member-23");
+		Identity owner = JunitTestHelper.createAndPersistIdentityAsRndUser("element-member-23");
 		Identity coach = JunitTestHelper.createAndPersistIdentityAsRndUser("element-member-24");
 		Organisation defOrganisation = organisationService.getDefaultOrganisation();
 		Curriculum curriculum = curriculumService.createCurriculum("REST-Curriculum-elements", "REST Curriculum", "A curriculum accessible by REST API for elemets", defOrganisation);
 		dbInstance.commit();
 		
-		curriculumService.addMember(curriculum, manager, CurriculumRoles.curriculummanager);
+		curriculumService.addMember(curriculum, owner, CurriculumRoles.curriculumowner);
 		curriculumService.addMember(curriculum, coach, CurriculumRoles.coach);
 		dbInstance.commitAndCloseSession();
 
 		URI request = UriBuilder.fromUri(getContextURI()).path("curriculum").path(curriculum.getKey().toString())
-				.path("curriculummanagers").path(manager.getKey().toString()).build();
+				.path("curriculumowners").path(owner.getKey().toString()).build();
 		HttpDelete method = conn.createDelete(request, MediaType.APPLICATION_JSON);
 		
 		HttpResponse response = conn.execute(method);
 		Assert.assertEquals(200, response.getStatusLine().getStatusCode());
 		EntityUtils.consume(response.getEntity());
 		
-		List<Identity> managers = curriculumService.getMembersIdentity(curriculum, CurriculumRoles.curriculummanager);
-		Assert.assertTrue(managers.isEmpty());
+		List<Identity> owners = curriculumService.getMembersIdentity(curriculum, CurriculumRoles.curriculumowner);
+		Assert.assertTrue(owners.isEmpty());
 		List<Identity> coaches = curriculumService.getMembersIdentity(curriculum, CurriculumRoles.coach);
 		Assert.assertEquals(1, coaches.size());
 	}
-- 
GitLab