From 314322197d58da1a60ca9750ad9293aae05b4d18 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Tue, 10 Jul 2018 16:10:33 +0200
Subject: [PATCH] OO-3296: start implementation administrator and other roles
 per organization, implement segment view for user visit card to better inline
 in user management, implements several features for all roles (allow
 enrollment, mandatory confirmation email by enrollment, allow autocomplete,
 bulk changes...), add roles like lecture manager, quality manager..., enhance
 the roles editor in user management

---
 .../bps/course/nodes/ChecklistCourseNode.java |   4 +-
 .../de/bps/course/nodes/VCCourseNode.java     |  27 +-
 .../den/DENManageParticipantsController.java  |  13 +-
 .../ChecklistManageCheckpointsController.java |   4 +-
 .../links/LinksPortletRunController.java      |  30 +-
 .../landingpages/LandingPagesModule.java      |   2 +-
 .../admin/landingpages/model/RoleToRule.java  |  65 ++
 .../olat/admin/landingpages/model/Rule.java   |  19 +-
 .../ui/LandingPagesAdminController.java       |  28 +-
 .../ui/_i18n/LocalStrings_de.properties       |  20 +-
 .../ui/_i18n/LocalStrings_en.properties       |  20 +-
 .../ui/_i18n/LocalStrings_fr.properties       |  12 +-
 .../ui/_i18n/LocalStrings_it.properties       |  12 +-
 .../ui/_i18n/LocalStrings_pt_BR.properties    |  12 +-
 .../ui/_i18n/LocalStrings_zh_CN.properties    |  12 +-
 .../admin/privacy/PrivacyAdminController.java |  73 +--
 .../privacy/_i18n/LocalStrings_de.properties  |  11 +-
 .../privacy/_i18n/LocalStrings_en.properties  |  11 +-
 .../org/olat/admin/quota/QuotaController.java |   2 +-
 .../securitygroup/gui/GroupController.java    |   8 +-
 .../gui/UserControllerFactory.java            |  62 --
 .../org/olat/admin/site/AdminSiteDef.java     |   7 +-
 .../org/olat/admin/site/UserAdminSiteDef.java |  12 +-
 .../user/NewUsersNotificationsController.java |  10 +-
 .../user/SystemRolesAndRightsController.java  | 270 ++++----
 .../olat/admin/user/UserAdminController.java  | 168 +++--
 .../olat/admin/user/UserSearchController.java |   5 +-
 .../admin/user/UserSearchFlexiController.java |  12 +-
 .../org/olat/admin/user/UserSearchForm.java   |  18 +-
 .../user/UsermanagerUserSearchController.java | 364 +----------
 .../olat/admin/user/_content/udispatcher.html |   2 +
 .../user/_i18n/LocalStrings_de.properties     |   6 +-
 .../user/_i18n/LocalStrings_en.properties     |   6 +-
 .../bulkChange/UserBulkChangeManager.java     |   2 +-
 .../user/bulkChange/UserBulkChangeStep00.java |  36 +-
 .../user/bulkChange/UserBulkChangeStep01.java | 195 +++---
 .../user/bulkChange/UserBulkChangeStep02.java | 170 +++---
 .../_i18n/LocalStrings_ar.properties          |   4 +-
 .../_i18n/LocalStrings_bg.properties          |   6 +-
 .../_i18n/LocalStrings_cs.properties          |   6 +-
 .../_i18n/LocalStrings_de.properties          |  19 +-
 .../_i18n/LocalStrings_el.properties          |   6 +-
 .../_i18n/LocalStrings_en.properties          |  19 +-
 .../_i18n/LocalStrings_es.properties          |   6 +-
 .../_i18n/LocalStrings_fr.properties          |  10 +-
 .../_i18n/LocalStrings_it.properties          |   6 +-
 .../_i18n/LocalStrings_jp.properties          |   6 +-
 .../_i18n/LocalStrings_nl_NL.properties       |   6 +-
 .../_i18n/LocalStrings_pl.properties          |   6 +-
 .../_i18n/LocalStrings_pt_BR.properties       |  10 +-
 .../_i18n/LocalStrings_sq.properties          |   6 +-
 .../_i18n/LocalStrings_zh_CN.properties       |   6 +-
 .../_i18n/LocalStrings_zh_TW.properties       |   6 +-
 .../user/course/CourseOverviewController.java |  19 +-
 .../user/delete/BulkDeleteController.java     |  35 +-
 .../user/groups/GroupOverviewController.java  |  19 +-
 .../org/olat/basesecurity/AuthHelper.java     |   7 +-
 .../org/olat/basesecurity/BaseSecurity.java   |  22 +-
 .../basesecurity/BaseSecurityManager.java     | 206 ++-----
 .../olat/basesecurity/BaseSecurityModule.java | 578 ++++++++++--------
 .../olat/basesecurity/GroupMembership.java    |  14 +
 .../olat/basesecurity/OrganisationRoles.java  |   7 +-
 .../basesecurity/SearchIdentityParams.java    |  16 +
 .../IdentityPowerSearchQueriesImpl.java       |  39 +-
 .../manager/OrganisationServiceImpl.java      |  11 +-
 .../model/GroupMembershipImpl.java            |   7 +-
 .../CollaborationToolsSettingsController.java |   2 +-
 .../fullWebApp/BaseFullWebappController.java  |  19 +-
 .../modules/bc/FolderRunController.java       |   2 +-
 .../modules/bc/commands/CmdEditQuota.java     |   2 +-
 .../iframe/IframePortletRunController.java    |  14 +-
 .../manager/NotificationsManagerImpl.java     |  45 +-
 .../configuration/AbstractSpringModule.java   |  13 +-
 ...pManagerOnlyExtensionSecurityCallback.java |   2 +-
 .../elements/table/TextFlexiCellRenderer.java |   4 -
 .../gui/control/_spring/sitedefContext.xml    |  10 +-
 .../generic/portal/PortalMainController.java  |  13 +-
 .../callback/AdminSecurityCallback.java       |   5 +-
 .../callback/ManagersSecurityCallback.java    |  14 +-
 ...eSecurityCallbackWithRolesRestriction.java |  29 +-
 .../gui/control/winmgr/AjaxController.java    |   3 -
 .../control/winmgr/_content/serverpart.html   |   2 -
 src/main/java/org/olat/core/id/Roles.java     | 252 ++++----
 .../org/olat/core/id/RolesByOrganisation.java |  75 ++-
 .../core/util/mail/ui/MailListController.java |   5 +-
 .../ui/SendDocumentsByEMailController.java    |   9 +-
 .../core/util/session/UserSessionManager.java |  18 +-
 .../java/org/olat/course/CourseFactory.java   |  21 +-
 .../olat/course/MergedCourseContainer.java    |  10 +-
 .../archiver/CourseLogsArchiveController.java |  17 +-
 ...icateAndEfficiencyStatementController.java |   5 +-
 .../org/olat/course/config/CourseConfig.java  |   4 +-
 .../groupsandrights/CourseGroupManager.java   |  16 +-
 .../PersistingCourseGroupManager.java         |  36 +-
 .../CourseBusinessGroupListController.java    |   6 +-
 .../member/MembersOverviewController.java     |   4 +-
 .../org/olat/course/nodes/BlogCourseNode.java |  55 +-
 .../org/olat/course/nodes/FOCourseNode.java   |   2 +-
 .../course/nodes/GoToMeetingCourseNode.java   |  35 +-
 .../course/nodes/OpenMeetingsCourseNode.java  |  34 +-
 .../olat/course/nodes/PodcastCourseNode.java  |  46 +-
 .../olat/course/nodes/ViteroCourseNode.java   |  25 +-
 .../nodes/basiclti/LTIRunController.java      |   2 +-
 .../nodes/bc/BCCourseNodeRunController.java   |  48 +-
 .../course/nodes/bc/FolderNodeCallback.java   |  16 +-
 .../course/nodes/cal/CourseCalendars.java     |   8 +-
 .../course/nodes/cp/CPEditController.java     |  34 +-
 .../nodes/dialog/DialogNodeForumCallback.java |  27 +-
 .../ui/DialogCourseNodeRunController.java     |  32 +-
 .../nodes/feed/FeedNodeSecurityCallback.java  |  35 +-
 .../nodes/feed/FeedPeekviewController.java    |   6 -
 .../ui/GTAAssessmentDetailsController.java    |  15 +-
 .../course/nodes/info/InfoRunController.java  |  16 +-
 .../nodes/iq/IQConfigurationController.java   |  26 +-
 .../nodes/projectbroker/GroupController.java  |  21 +-
 .../projectbroker/ProjectGroupController.java |   6 +-
 .../projectbroker/ProjectListController.java  |   5 +-
 .../service/ProjectGroupManagerImpl.java      |   3 +-
 .../olat/course/nodes/sp/SPRunController.java |  23 +-
 .../nodes/ta/TACourseNodeEditController.java  |   6 +-
 .../course/nodes/wiki/WikiEditController.java |  96 ++-
 .../course/nodes/wiki/WikiRunController.java  |  62 +-
 .../calendar/CourseCalendarController.java    |  17 +-
 .../run/preview/PreviewConfigController.java  |  45 +-
 .../preview/PreviewCourseGroupManager.java    |   6 -
 .../userview/UserCourseEnvironmentImpl.java   |   7 +-
 ...essGroupContextEntryControllerCreator.java |   5 +-
 .../org/olat/group/BusinessGroupModule.java   | 390 +++++++-----
 .../manager/BusinessGroupServiceImpl.java     |   2 +-
 .../olat/group/manager/MemberViewQueries.java |  94 ++-
 .../java/org/olat/group/model/MemberView.java |   6 +
 .../BusinessGroupModuleAdminController.java   |  73 ++-
 .../group/ui/_i18n/LocalStrings_de.properties |  20 +-
 .../group/ui/_i18n/LocalStrings_en.properties |  21 +-
 .../AbstractBusinessGroupListController.java  |  11 +-
 .../main/SelectBusinessGroupController.java   |   2 +-
 .../QTI21ResultsExportMediaResource.java      |   3 +-
 .../ldap/manager/LDAPLoginManagerImpl.java    |  31 +-
 src/main/java/org/olat/login/LoginModule.java |   2 +-
 .../modules/co/ContactFormController.java     |   5 +-
 .../olat/modules/coach/site/CoachSiteDef.java |   7 +-
 .../modules/coach/ui/CoachMainController.java |   2 +-
 .../CurriculumSecurityCallbackFactory.java    |   2 +-
 .../model/CurriculumElementInfos.java         |  19 +
 .../CurriculumManagerSecurityCallback.java    |   2 +-
 .../ui/coach/LecturesSearchController.java    |   3 +-
 .../QPoolSecurityCallbackFactory.java         |   4 +-
 .../security/QPoolSecurityCallbackImpl.java   |   4 +-
 ...AndPoolPrivateMembersSecurityCallback.java |   9 +-
 .../PoolPrivateMembersSecurityCallback.java   |  10 +-
 .../site/PoolTaxonomySecurityCallback.java    |   2 +-
 .../qpool/site/QuestionPoolSiteDef.java       |   2 +-
 .../ui/datasource/SharedItemsSource.java      |   2 +-
 .../restapi/ViteroBookingWebService.java      |   7 +-
 .../webFeed/FeedResourceSecurityCallback.java |  36 +-
 .../portfolio/LiveBlogArtefactHandler.java    |  27 +-
 ...LiveBlogContextEntryControllerCreator.java |   2 +-
 .../wiki/WikiSecurityCallbackImpl.java        |  36 +-
 .../modules/wiki/restapi/WikiWebService.java  |  75 ++-
 .../modules/wiki/restapi/WikisWebService.java |  38 +-
 .../portfolio/EPSecurityCallbackFactory.java  |  32 +-
 .../olat/repository/RepositoryManager.java    |  94 +--
 .../olat/repository/RepositoryService.java    |  12 +-
 .../ReferencableEntriesSearchController.java  |   2 +-
 .../olat/repository/handlers/BlogHandler.java |  31 +-
 .../repository/handlers/CourseHandler.java    |   4 +-
 .../repository/handlers/PodcastHandler.java   |   5 +-
 .../olat/repository/handlers/WikiHandler.java |   2 +-
 .../manager/RepositoryEntryQueries.java       |   2 +-
 .../manager/RepositoryEntryRelationDAO.java   |  45 +-
 .../manager/RepositoryServiceImpl.java        |  13 +-
 .../model/RepositoryEntrySecurity.java        |  11 +-
 .../site/CatalogManagerSecurityCallback.java  |   7 +-
 .../repository/site/RepositorySiteDef.java    |   2 +-
 .../ui/RepositoryEntryRuntimeController.java  |   8 +-
 .../author/AuthorDeletedListController.java   |  41 +-
 .../ui/author/AuthorListController.java       |  60 +-
 .../ConfirmDeletePermanentlyController.java   |   6 +-
 .../author/ConfirmDeleteSoftlyController.java |   2 +-
 .../author/RepositoryMembersController.java   |   3 +-
 .../wizard/UnpublishResourceCallback.java     |  11 +-
 .../catalog/CatalogEntryMoveController.java   |   2 +-
 .../model/AuthorACSecurityCallback.java       |   2 +-
 .../resource/references/ReferenceManager.java |  24 +-
 .../RepositoryEntryLifecycleWebService.java   |   2 +-
 .../repository/RepositoryEntryWebService.java |  13 +-
 .../repository/course/CourseWebService.java   | 113 ++--
 .../repository/course/CoursesWebService.java  |   8 +-
 .../restapi/security/RestApiLoginFilter.java  |  12 +-
 .../restapi/security/RestSecurityHelper.java  |  49 +-
 .../java/org/olat/search/SearchModule.java    |  16 +-
 .../org/olat/search/_spring/searchContext.xml |   1 +
 .../identity/UserManagerSecurityCallback.java |   2 +-
 .../indexer/repository/RepositoryIndexer.java |  33 +-
 .../service/searcher/SearchResultsImpl.java   |   2 +-
 .../org/olat/upgrade/OLATUpgrade_10_3_0.java  |   2 +-
 .../org/olat/upgrade/OLATUpgrade_11_0_0.java  |   4 +-
 .../org/olat/upgrade/OLATUpgrade_11_2_1.java  |   2 +-
 .../org/olat/upgrade/OLATUpgrade_12_0_0.java  |   2 +-
 .../org/olat/user/ProfileFormController.java  |  26 +-
 .../org/olat/user/UserInfoMainController.java | 156 +----
 .../olat/user/UserPropertiesController.java   |  93 ++-
 .../UsersSubscriptionManagerImpl.java         |  29 +-
 .../user/propertyhandlers/EmailProperty.java  |   2 +-
 .../_i18n/LocalStrings_ar.properties          |   2 +-
 .../_i18n/LocalStrings_cs.properties          |   2 +-
 .../_i18n/LocalStrings_da.properties          |   2 +-
 .../_i18n/LocalStrings_de.properties          |   2 +-
 .../_i18n/LocalStrings_es.properties          |   2 +-
 .../_i18n/LocalStrings_fa.properties          |   2 +-
 .../_i18n/LocalStrings_fr.properties          |   2 +-
 .../_i18n/LocalStrings_hu.properties          |   2 +-
 .../_i18n/LocalStrings_it.properties          |   2 +-
 .../_i18n/LocalStrings_lt.properties          |   2 +-
 .../_i18n/LocalStrings_pl.properties          |   2 +-
 .../_i18n/LocalStrings_pt_BR.properties       |   2 +-
 .../_i18n/LocalStrings_pt_PT.properties       |   2 +-
 .../_i18n/LocalStrings_ru.properties          |   2 +-
 .../_i18n/LocalStrings_sq.properties          |   2 +-
 .../_i18n/LocalStrings_zh_CN.properties       |   2 +-
 .../user/restapi/OrganisationsWebService.java |   2 -
 .../java/org/olat/user/restapi/RolesVO.java   |   8 +-
 .../org/olat/user/restapi/UserWebService.java | 165 ++---
 .../ui/admin/UserAdminMainController.java     | 130 ++--
 .../ui/admin/UserSearchTableController.java   | 292 ++++++++-
 .../user/ui/admin/_content/search_table.html  |  10 +-
 .../ui/admin/_i18n/LocalStrings_de.properties |   2 +
 .../ui/admin/_i18n/LocalStrings_en.properties |   2 +
 .../AbstractUserInfoMainController.java       | 183 ++++++
 .../identity/UserInfoSegmentedController.java | 125 ++++
 .../ui/identity/_content/infos_segment.html   |  10 +
 .../resources/serviceconfig/olat.properties   |  47 ++
 .../themes/light/theme_ie_completions.css     |   2 +-
 .../service/UserDeletionManagerTest.java      |   4 +-
 .../basesecurity/BaseSecurityManagerTest.java |  22 +-
 .../services/webdav/WebDAVCommandsTest.java   |   4 +-
 .../olat/core/id/IdentityEnvironmentTest.java |   8 +-
 .../manager/CertificatesManagerTest.java      |   4 +-
 .../olat/course/condition/ConditionTest.java  |   5 +-
 .../en/EnrollmentManagerConcurrentTest.java   |   2 +-
 .../EfficiencyStatementManagerGatling.java    |   2 +-
 .../group/test/BusinessGroupServiceTest.java  |   7 +-
 .../olat/portfolio/EPFrontendManagerTest.java |   2 +-
 .../org/olat/portfolio/EPPerformanceTest.java |   4 +-
 .../manager/EPStructureManagerTest.java       |   2 +-
 .../repository/RepositoryManagerTest.java     |  89 +--
 .../manager/RepositoryEntryQueriesTest.java   |  25 +-
 .../RepositoryEntryRelationDAOTest.java       |  12 +
 .../manager/RepositoryServiceImplTest.java    |  62 +-
 .../accesscontrol/ACFrontendManagerTest.java  |   2 +-
 .../references/ReferenceManagerTest.java      |  27 +-
 .../java/org/olat/restapi/CourseTest.java     |   2 +-
 .../java/org/olat/restapi/MyForumsTest.java   |   2 +-
 .../restapi/NotificationsSubscribersTest.java |   4 +-
 .../RepositoryEntryWebServiceTest.java        |   7 +-
 .../org/olat/restapi/UserFoldersTest.java     |   2 +-
 .../java/org/olat/restapi/UserMgmtTest.java   |   4 +-
 .../page/core/AdministrationPage.java         |   4 +-
 .../selenium/page/user/ImportUserPage.java    |   2 +-
 .../java/org/olat/test/JunitTestHelper.java   |  14 +-
 260 files changed, 3788 insertions(+), 3742 deletions(-)
 create mode 100644 src/main/java/org/olat/admin/landingpages/model/RoleToRule.java
 delete mode 100644 src/main/java/org/olat/admin/securitygroup/gui/UserControllerFactory.java
 create mode 100644 src/main/java/org/olat/user/ui/identity/AbstractUserInfoMainController.java
 create mode 100644 src/main/java/org/olat/user/ui/identity/UserInfoSegmentedController.java
 create mode 100644 src/main/java/org/olat/user/ui/identity/_content/infos_segment.html

diff --git a/src/main/java/de/bps/course/nodes/ChecklistCourseNode.java b/src/main/java/de/bps/course/nodes/ChecklistCourseNode.java
index 79bf6c8445e..f16873bae26 100644
--- a/src/main/java/de/bps/course/nodes/ChecklistCourseNode.java
+++ b/src/main/java/de/bps/course/nodes/ChecklistCourseNode.java
@@ -196,8 +196,7 @@ public class ChecklistCourseNode extends AbstractAccessableCourseNode {
 			UserCourseEnvironment userCourseEnv, NodeEvaluation ne, String nodecmd) {
 		ICourse course = CourseFactory.loadCourse(userCourseEnv.getCourseEnvironment().getCourseResourceableId());
 		CourseGroupManager cgm = course.getCourseEnvironment().getCourseGroupManager();
-		boolean canEdit = ureq.getUserSession().getRoles().isOLATAdmin()
-				|| cgm.isIdentityCourseAdministrator(ureq.getIdentity());
+		boolean canEdit = cgm.isIdentityCourseAdministrator(ureq.getIdentity());
 		boolean canManage;
 		if(canEdit) {
 			canManage = true;
@@ -284,7 +283,6 @@ public class ChecklistCourseNode extends AbstractAccessableCourseNode {
 		// delete checklist in db
 		Checklist checklist = loadOrCreateChecklist(course.getCourseEnvironment().getCoursePropertyManager());
 		ChecklistManager.getInstance().deleteChecklist(checklist);
-		checklist = null;
 		// delete node configuration
 		deleteChecklistKeyConf(course.getCourseEnvironment().getCoursePropertyManager());
 	}
diff --git a/src/main/java/de/bps/course/nodes/VCCourseNode.java b/src/main/java/de/bps/course/nodes/VCCourseNode.java
index 73ec2d81d72..35b5aa4f04f 100644
--- a/src/main/java/de/bps/course/nodes/VCCourseNode.java
+++ b/src/main/java/de/bps/course/nodes/VCCourseNode.java
@@ -28,7 +28,6 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.tabbable.TabbableController;
 import org.olat.core.gui.control.generic.tabbable.TabbableDefaultController;
-import org.olat.core.id.Roles;
 import org.olat.core.util.Util;
 import org.olat.core.util.ValidationStatus;
 import org.olat.course.ICourse;
@@ -36,6 +35,7 @@ import org.olat.course.condition.ConditionEditController;
 import org.olat.course.editor.CourseEditorEnv;
 import org.olat.course.editor.NodeEditController;
 import org.olat.course.editor.StatusDescription;
+import org.olat.course.groupsandrights.CourseGroupManager;
 import org.olat.course.nodes.AbstractAccessableCourseNode;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.StatusDescriptionHelper;
@@ -44,7 +44,6 @@ import org.olat.course.run.navigation.NodeRunConstructionResult;
 import org.olat.course.run.userview.NodeEvaluation;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.repository.RepositoryEntry;
-import org.olat.repository.RepositoryManager;
 
 import de.bps.course.nodes.vc.NoProviderController;
 import de.bps.course.nodes.vc.VCConfiguration;
@@ -69,7 +68,7 @@ public class VCCourseNode extends AbstractAccessableCourseNode {
 
 	// configuration
 	public static final String CONF_VC_CONFIGURATION = "vc_configuration";
-	public final static String CONF_PROVIDER_ID = "vc_provider_id";
+	public static final String CONF_PROVIDER_ID = "vc_provider_id";
 
 	public VCCourseNode() {
 		super(TYPE);
@@ -135,26 +134,15 @@ public class VCCourseNode extends AbstractAccessableCourseNode {
 			UserCourseEnvironment userCourseEnv, NodeEvaluation ne, String nodecmd) {
 		updateModuleConfigDefaults(false);
 		// check if user is moderator of the virtual classroom
-		Roles roles = ureq.getUserSession().getRoles();
-		boolean moderator = roles.isOLATAdmin();
-		Long key = userCourseEnv.getCourseEnvironment().getCourseResourceableId();
-		if (!moderator) {
-			if(roles.isLearnResourceManager() || roles.isAuthor() || roles.isOLATAdmin()) {
-				RepositoryManager rm = RepositoryManager.getInstance();
-				RepositoryEntry re = userCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
-				if (re != null) {
-					moderator = rm.isOwnerOfRepositoryEntry(ureq.getIdentity(), re);
-					if(!moderator) {
-						moderator = rm.isLearnResourceManagerFor(ureq.getUserSession().getRoles(), re);
-					}
-				}
-			}
-		}
+		CourseGroupManager cgm = userCourseEnv.getCourseEnvironment().getCourseGroupManager();
+		boolean moderator = cgm.isIdentityCourseAdministrator(ureq.getIdentity());
+
 		// load configuration
 		final String providerId = getModuleConfiguration().getStringValue(CONF_PROVIDER_ID);
 		VCProvider provider = providerId == null ? VCProviderFactory.createDefaultProvider() : VCProviderFactory.createProvider(providerId);
 		VCConfiguration config = handleConfig(provider);
 		// create run controller
+		Long key = userCourseEnv.getCourseEnvironment().getCourseResourceableId();
 		Controller runCtr = new VCRunController(ureq, wControl, key + "_" + getIdent(), getShortName(), getLongTitle(), config, provider,
 				moderator, userCourseEnv.isCourseReadOnly());
 		Controller controller = TitledWrapperHelper.getWrapper(ureq, wControl, runCtr, this, "o_vc_icon");
@@ -174,10 +162,12 @@ public class VCCourseNode extends AbstractAccessableCourseNode {
 		return StatusDescriptionHelper.sort(statusDescs);
 	}
 
+	@Override
 	public RepositoryEntry getReferencedRepositoryEntry() {
 		return null;
 	}
 
+	@Override
 	public StatusDescription isConfigValid() {
 		if (oneClickStatusCache != null) { return oneClickStatusCache[0]; }
 		StatusDescription status = StatusDescription.NOERROR;
@@ -199,6 +189,7 @@ public class VCCourseNode extends AbstractAccessableCourseNode {
 		return status;
 	}
 
+	@Override
 	public boolean needsReferenceToARepositoryEntry() {
 		return false;
 	}
diff --git a/src/main/java/de/bps/course/nodes/den/DENManageParticipantsController.java b/src/main/java/de/bps/course/nodes/den/DENManageParticipantsController.java
index 2a256914f0e..4a91e7eb42f 100644
--- a/src/main/java/de/bps/course/nodes/den/DENManageParticipantsController.java
+++ b/src/main/java/de/bps/course/nodes/den/DENManageParticipantsController.java
@@ -46,6 +46,7 @@ import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
+import org.olat.core.id.Roles;
 import org.olat.core.util.mail.ContactList;
 import org.olat.core.util.mail.ContactMessage;
 import org.olat.core.util.mail.MailBundle;
@@ -88,7 +89,7 @@ public class DENManageParticipantsController extends BasicController {
 	private MailNotificationEditController notificationCtr;
 	private ContactFormController contactCtr;
 	private CloseableModalController notificationCmc;
-	private List<Identity> selectedIds = new ArrayList<Identity>();
+	private List<Identity> selectedIds = new ArrayList<>();
 	
 	private CloseableModalController manageParticipantsModalCntrl;
 	
@@ -177,11 +178,11 @@ public class DENManageParticipantsController extends BasicController {
 				userSearchCMC.deactivate();
 			} else {
 				List<Identity> toAdd = null;
-				selectedIds = new ArrayList<Identity>();
+				selectedIds = new ArrayList<>();
 				if (event instanceof SingleIdentityChosenEvent) {
 					SingleIdentityChosenEvent singleEvent = (SingleIdentityChosenEvent) event;
 					Identity choosenIdentity = singleEvent.getChosenIdentity();
-					toAdd = new ArrayList<Identity>();
+					toAdd = new ArrayList<>();
 					toAdd.add(choosenIdentity);
 				} else if (event instanceof MultiIdentityChosenEvent) {
 					MultiIdentityChosenEvent multiEvent = (MultiIdentityChosenEvent) event;
@@ -224,7 +225,7 @@ public class DENManageParticipantsController extends BasicController {
 					refreshTables();
 				//write email to single user
 				} else if(tableEvent.getActionId().equals(DENParticipantsTableDataModel.MAIL_ACTION)) {
-					List<Identity> participants = new ArrayList<Identity>();
+					List<Identity> participants = new ArrayList<>();
 					participants.add(participantsTableData.getEntryAt(tableEvent.getRowId()));
 					createParticipantsMail(ureq, participants);
 				}
@@ -241,7 +242,9 @@ public class DENManageParticipantsController extends BasicController {
 					MailBundle ccBundles = mailManager.makeMailBundle(context, sender, notificationCtr.getMailTemplate(), sender, metaId, result);
 					result.append(mailManager.sendMessage(ccBundles));
 				}
-				MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getUserSession().getRoles().isOLATAdmin(), ureq.getLocale());
+				Roles roles = ureq.getUserSession().getRoles();
+				boolean detailedErrorOutput = roles.isAdministrator() || roles.isSystemAdmin();
+				MailHelper.printErrorsAndWarnings(result, getWindowControl(), detailedErrorOutput, ureq.getLocale());
 			}
 			notificationCmc.deactivate();
 			selectedIds.clear();
diff --git a/src/main/java/de/bps/olat/modules/cl/ChecklistManageCheckpointsController.java b/src/main/java/de/bps/olat/modules/cl/ChecklistManageCheckpointsController.java
index 97fe75681d4..ccf3d00eab8 100644
--- a/src/main/java/de/bps/olat/modules/cl/ChecklistManageCheckpointsController.java
+++ b/src/main/java/de/bps/olat/modules/cl/ChecklistManageCheckpointsController.java
@@ -129,7 +129,7 @@ public class ChecklistManageCheckpointsController extends BasicController {
 	
 		cgm = course.getCourseEnvironment().getCourseGroupManager();
 		Identity identity = ureq.getIdentity();
-		boolean isAdmin = ureq.getUserSession().getRoles().isOLATAdmin() || cgm.isIdentityCourseAdministrator(identity);
+		boolean isAdmin = cgm.isIdentityCourseAdministrator(identity);
 		if(isAdmin) {
 			// collect all identities with results
 			Set<Identity> identitiesWithResult = new HashSet<>();
@@ -146,7 +146,7 @@ public class ChecklistManageCheckpointsController extends BasicController {
 			identitiesInGroups.addAll(cgm.getParticipants());
 			
 			// all identities with result and/or in learning groups
-			Set<Identity> identitiesAll = new HashSet<Identity>();
+			Set<Identity> identitiesAll = new HashSet<>();
 			identitiesAll.addAll(identitiesInGroups);
 			identitiesAll.addAll(identitiesWithResult);
 			allIdentities.addAll(identitiesAll);
diff --git a/src/main/java/de/bps/olat/portal/links/LinksPortletRunController.java b/src/main/java/de/bps/olat/portal/links/LinksPortletRunController.java
index 209120917e9..3f855d8cb69 100644
--- a/src/main/java/de/bps/olat/portal/links/LinksPortletRunController.java
+++ b/src/main/java/de/bps/olat/portal/links/LinksPortletRunController.java
@@ -68,7 +68,7 @@ public class LinksPortletRunController extends BasicController {
 		initOrUpdatePortletView(ureq);
 		
 		//edit link
-		if (ureq.getUserSession().getRoles().isOLATAdmin()){
+		if (ureq.getUserSession().getRoles().isAdministrator()){
 			editButton = LinkFactory.createButtonXSmall("editor.button", portletVC, this);
 			editButton.setIconLeftCSS("o_icon o_icon-fw o_icon_edit");
 		}
@@ -93,7 +93,7 @@ public class LinksPortletRunController extends BasicController {
 		String inst = new String();
 		if(!isGuest) inst = ureq.getIdentity().getUser().getProperty(UserConstants.INSTITUTIONALNAME, getLocale());
 		
-		StringBuffer sb = new StringBuffer();
+		StringBuilder sb = new StringBuilder();
 		
 		// Inhalt verarbeiten
 		Map<String, PortletInstitution> content = LinksPortlet.getContent();
@@ -131,7 +131,7 @@ public class LinksPortletRunController extends BasicController {
 	 * @param StringBuffer to append the link
 	 */
 	private void appendContentFor(Map<String, PortletInstitution> content,
-			String inst, String lang, StringBuffer sb) {
+			String inst, String lang, StringBuilder sb) {
 		String linkLang = "";
 		int underlinePos = -1;
 		for( PortletLink link : content.get(inst).getLinks() ) {
@@ -140,7 +140,7 @@ public class LinksPortletRunController extends BasicController {
 			if (underlinePos != -1){
 				linkLang= linkLang.substring(0,underlinePos);
 			}
-			if(linkLang.equals(lang) | linkLang.equals(LinksPortlet.LANG_ALL))
+			if(linkLang.equals(lang) || linkLang.equals(LinksPortlet.LANG_ALL))
 				appendContent(link, sb);
 		}
 	}
@@ -150,8 +150,8 @@ public class LinksPortletRunController extends BasicController {
 	 * @param PortletLink
 	 * @param StringBuffer to append
 	 */
-	private void appendContent(PortletLink link, StringBuffer sb) {
-		sb.append("<li>" + buildContentLine(link.getTitle(), link.getUrl(), link.getDescription(), link.getTarget()) + "</li>");
+	private void appendContent(PortletLink link, StringBuilder sb) {
+		sb.append("<li>").append(buildContentLine(link.getTitle(), link.getUrl(), link.getDescription(), link.getTarget())).append("</li>");
 	}
 	
 	/**
@@ -163,10 +163,10 @@ public class LinksPortletRunController extends BasicController {
 	 * @param String lang
 	 * @return
 	 */
-	private String buildContentLine(String title, String URL, String descr, String target) {
-		StringBuffer sb = new StringBuffer();
+	private String buildContentLine(String title, String url, String descr, String target) {
+		StringBuilder sb = new StringBuilder();
 		sb.append("<a href=\"");
-		sb.append(URL);
+		sb.append(url);
 		sb.append("\" title=\"");
 		sb.append(title);
 		sb.append("\" target=\"_");
@@ -246,9 +246,9 @@ public class LinksPortletRunController extends BasicController {
 		VelocityContainer editorVC = this.createVelocityContainer("editorLinkOverview");
 		Map<String, PortletInstitution> content = LinksPortlet.getContent();
 		if (content != null && !content.isEmpty() ) {
-			ArrayList<String> allInst = new ArrayList<String>();
-			ArrayList<String> allInstTranslated = new ArrayList<String>();
-			HashMap<Integer, ArrayList<String>> allInstWithLinkIds = new HashMap<Integer, ArrayList<String>>();
+			ArrayList<String> allInst = new ArrayList<>();
+			ArrayList<String> allInstTranslated = new ArrayList<>();
+			HashMap<Integer, ArrayList<String>> allInstWithLinkIds = new HashMap<>();
 			int instCount = 1;
 			for (Iterator<String> iterator = content.keySet().iterator(); iterator.hasNext();) {
 				String inst = iterator.next();
@@ -261,7 +261,7 @@ public class LinksPortletRunController extends BasicController {
 				
 				PortletInstitution portletsForInst = content.get(inst);
 				// collect identifiers to find them in VC.
-				ArrayList<String> instLinksIdentifiers = new ArrayList<String>();
+				ArrayList<String> instLinksIdentifiers = new ArrayList<>();
 				
 				// add add-link per institution
 				LinkFactory.createCustomLink(LINKADD + inst, LINKADD + inst, "add.link", Link.BUTTON_XSMALL, editorVC, this);
@@ -288,9 +288,7 @@ public class LinksPortletRunController extends BasicController {
 		viewPanel.setContent(editorVC);
 	}
 
-	/**
-	 * @see org.olat.gui.control.DefaultController#doDispose(boolean)
-	 */
+	@Override
 	protected void doDispose() {
 		if(portletVC != null) portletVC = null;
 	}
diff --git a/src/main/java/org/olat/admin/landingpages/LandingPagesModule.java b/src/main/java/org/olat/admin/landingpages/LandingPagesModule.java
index 28779381af0..2a209d8abb4 100644
--- a/src/main/java/org/olat/admin/landingpages/LandingPagesModule.java
+++ b/src/main/java/org/olat/admin/landingpages/LandingPagesModule.java
@@ -62,7 +62,7 @@ public class LandingPagesModule extends AbstractSpringModule {
 			rules = (Rules)rulesXStream.fromXML(rulesObj);
 		} else {
 			rules = new Rules();
-			rules.setRules(new ArrayList<Rule>(1));
+			rules.setRules(new ArrayList<>(1));
 		}
 	}
 	
diff --git a/src/main/java/org/olat/admin/landingpages/model/RoleToRule.java b/src/main/java/org/olat/admin/landingpages/model/RoleToRule.java
new file mode 100644
index 00000000000..50c5849c6ae
--- /dev/null
+++ b/src/main/java/org/olat/admin/landingpages/model/RoleToRule.java
@@ -0,0 +1,65 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.admin.landingpages.model;
+
+import org.olat.basesecurity.OrganisationRoles;
+
+/**
+ * 
+ * Initial date: 8 juil. 2018<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public enum RoleToRule {
+	
+	AUTHOR("author", OrganisationRoles.author),
+	USER_MGR("userManager", OrganisationRoles.usermanager),
+	ROLE_MGR(OrganisationRoles.rolesmanager),
+	GROUP_MGR("groupManager", OrganisationRoles.groupmanager),
+	RSRC_MGR("institutionalResourceManager", OrganisationRoles.learnresourcemanager),
+	POOL_MGR("poolAdmin", OrganisationRoles.poolmanager),
+	LECTURE_MGR(OrganisationRoles.lecturemanager),
+	QUALITY_MGR(OrganisationRoles.qualitymanager),
+	LINE_MGR(OrganisationRoles.linemanager),
+	PRINCIPAL(OrganisationRoles.principal),
+	ADMIN("olatAdmin", OrganisationRoles.administrator),
+	SYS_ADMIN( OrganisationRoles.sysadmin);
+	
+	private final String roleName;
+	private final OrganisationRoles role;
+	
+	private RoleToRule(OrganisationRoles role) {
+		this.roleName = role.name();
+		this.role = role;
+	}
+	
+	private RoleToRule(String roleName, OrganisationRoles role) {
+		this.roleName = roleName;
+		this.role = role;
+	}
+	
+	public final String ruleName() {
+		return roleName;
+	}
+	
+	public final OrganisationRoles role() {
+		return role;
+	}
+}
diff --git a/src/main/java/org/olat/admin/landingpages/model/Rule.java b/src/main/java/org/olat/admin/landingpages/model/Rule.java
index f5351a19a24..ef101797f9a 100644
--- a/src/main/java/org/olat/admin/landingpages/model/Rule.java
+++ b/src/main/java/org/olat/admin/landingpages/model/Rule.java
@@ -32,13 +32,6 @@ import org.olat.core.util.UserSession;
  */
 public class Rule {
 	
-	public static final String AUTHOR = "author";
-	public static final String USER_MGR = "userManager";
-	public static final String GROUP_MGR = "groupManager";
-	public static final String RSRC_MGR = "institutionalResourceManager";
-	public static final String POOL_MGR = "poolAdmin";
-	public static final String ADMIN = "olatAdmin";
-	
 	private String role;
 	private String userAttributeKey;
 	private String userAttributeValue;
@@ -86,17 +79,7 @@ public class Rule {
 		//match the role?
 		if(!"none".equals(role) && StringHelper.containsNonWhitespace(role)) {
 			Roles roles = userSession.getRoles();
-			switch(role) {
-				case AUTHOR: match &= roles.isAuthor(); break;
-				case USER_MGR: match &= roles.isUserManager(); break;
-				case GROUP_MGR: match &= roles.isGroupManager(); break;
-				case RSRC_MGR: match &= roles.isLearnResourceManager(); break;
-				case POOL_MGR: match &= roles.isQPoolManager(); break;
-				case ADMIN: match &= roles.isOLATAdmin(); break;
-				default: {
-					match &= false;
-				}
-			}
+			match &= roles.hasRole(RoleToRule.valueOf(role).role());
 		}
 		
 		if(StringHelper.containsNonWhitespace(userAttributeKey)) {
diff --git a/src/main/java/org/olat/admin/landingpages/ui/LandingPagesAdminController.java b/src/main/java/org/olat/admin/landingpages/ui/LandingPagesAdminController.java
index 2d3c16c7826..1206304e580 100644
--- a/src/main/java/org/olat/admin/landingpages/ui/LandingPagesAdminController.java
+++ b/src/main/java/org/olat/admin/landingpages/ui/LandingPagesAdminController.java
@@ -19,18 +19,12 @@
  */
 package org.olat.admin.landingpages.ui;
 
-import static org.olat.admin.landingpages.model.Rule.ADMIN;
-import static org.olat.admin.landingpages.model.Rule.AUTHOR;
-import static org.olat.admin.landingpages.model.Rule.GROUP_MGR;
-import static org.olat.admin.landingpages.model.Rule.POOL_MGR;
-import static org.olat.admin.landingpages.model.Rule.RSRC_MGR;
-import static org.olat.admin.landingpages.model.Rule.USER_MGR;
-
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.olat.admin.landingpages.LandingPagesModule;
+import org.olat.admin.landingpages.model.RoleToRule;
 import org.olat.admin.landingpages.model.Rule;
 import org.olat.admin.landingpages.model.Rules;
 import org.olat.admin.landingpages.ui.RulesDataModel.RCols;
@@ -78,10 +72,9 @@ public class LandingPagesAdminController extends FormBasicController {
 
 	private RulesDataModel model;
 	private FlexiTableElement tableEl;
-	private static final String[] roleKeys = new String[]{ "none",
-		AUTHOR, USER_MGR, GROUP_MGR, RSRC_MGR, POOL_MGR, ADMIN
-	};
-	private final String[] roleValues;
+	
+	private String[] roleKeys;
+	private String[] roleValues;
 	private final String[] attrKeys;
 	private final String[] attrValues;
 
@@ -102,9 +95,14 @@ public class LandingPagesAdminController extends FormBasicController {
 		super(ureq, wControl, "rules");
 		setTranslator(Util.createPackageTranslator(UserPropertyHandler.class, getLocale(), getTranslator()));
 		
-		roleValues = new String[roleKeys.length];
-		for(int i=0; i<roleKeys.length; i++) {
-			roleValues[i] = translate(roleKeys[i]);
+		RoleToRule[] roles = RoleToRule.values();
+		roleKeys = new String[roles.length + 1];
+		roleValues = new String[roles.length + 1];
+		roleKeys[0] = "none";
+		roleValues[0] = translate("none");
+		for(int i=0; i<roles.length; i++) {
+			roleKeys[i + 1] = roles[i].name();
+			roleValues[i + 1] = translate("roles." + roles[i].role() + "s");
 		}
 		
 		boolean isAdministrativeUser = securityModule.isUserAllowedAdminProps(ureq.getUserSession().getRoles());
@@ -219,7 +217,7 @@ public class LandingPagesAdminController extends FormBasicController {
 	@Override
 	protected void formOK(UserRequest ureq) {
 		int rowCount = model.getRowCount();
-		List<Rule> ruleList = new ArrayList<Rule>(rowCount);
+		List<Rule> ruleList = new ArrayList<>(rowCount);
 		for(int i=0; i<rowCount; i++) {
 			ruleList.add(model.getObject(i).save());
 		}
diff --git a/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_de.properties
index 4756d54fba7..5f810f7581e 100644
--- a/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_de.properties
@@ -1,13 +1,9 @@
 #Tue Jul 27 11:51:00 CEST 2010
 add=Hinzuf\u00FCgen
-author=$org.olat.admin.user\:rightsForm.isAuthor
 delete=L\u00F6schen
 down=Runter
-groupManager=$org.olat.admin.user\:rightsForm.isGroupmanager
-institutionalResourceManager=$org.olat.admin.user\:rightsForm.isInstitutionalResourceManager
 landingpages.title=Startseite
 none=-
-olatAdmin=$org.olat.admin.user\:rightsForm.isAdmin
 page.catalog=Katalog (wenn als eigener Bereich verf\u00FCgbar)
 page.coursesCatalog=Katalog im Kursbereich
 page.groups=Gruppenbereich
@@ -20,7 +16,20 @@ page.myFavoritGroups=Favoriten im Gruppenbereich
 page.myNotifications=Meine Abonnements
 page.myPortfolio=Mein e-Portfolio
 page.portal=Portal (wenn als eigener Bereich verf\u00FCgbar)
-poolAdmin=$org.olat.admin.user\:rightsForm.isPoolmanager
+roles.administrators=Administratoren
+roles.authors=Kursautoren
+roles.curriculummanagers=Curriculumverwalter
+roles.groupmanagers=Gruppenverwalter
+roles.learnresourcemanagers=Lernressourcenverwalter
+roles.lecturemanagers=Lektionenblockverwalter
+roles.linemanagers=Linemanagers
+roles.qualitymanagers=Quality managers
+roles.poolmanagers=Poolverwalter
+roles.principals=Principals
+roles.rolesmanagers=Rollenverwalter
+roles.sysadmins=Systemadministratoren
+roles.usermanagers=Benutzerverwalter
+roles.users=Lernende
 rules.landing.page=Startseite
 rules.landing.page.chooser=Auswahl
 rules.position=Position
@@ -28,4 +37,3 @@ rules.role=Rolle
 rules.user.attribute.key=Benutzerattribut
 rules.user.attribute.value=Wert
 up=Hoch
-userManager=$org.olat.admin.user\:rightsForm.isUsermanager
diff --git a/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_en.properties
index 102bf9b70c8..f8ffe3a5dfa 100644
--- a/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_en.properties
@@ -1,13 +1,9 @@
 #Tue Dec 16 09:07:59 CET 2014
 add=Add
-author=$org.olat.admin.user\:rightsForm.isAuthor
 delete=Delete
 down=Down
-groupManager=$org.olat.admin.user\:rightsForm.isGroupmanager
-institutionalResourceManager=$org.olat.admin.user\:rightsForm.isInstitutionalResourceManager
 landingpages.title=Landing pages
 none=-
-olatAdmin=$org.olat.admin.user\:rightsForm.isAdmin
 page.catalog=Catalog (if available as own area)
 page.coursesCatalog=Catalog in course area
 page.groups=Group area
@@ -20,7 +16,20 @@ page.myFavoritGroups=Bookmarks in group area
 page.myNotifications=My subscriptions
 page.myPortfolio=My e-portfolio
 page.portal=Portal (if available as own area)
-poolAdmin=$org.olat.admin.user\:rightsForm.isPoolmanager
+roles.administrators=Administrators
+roles.authors=Course authors
+roles.curriculummanagers=Curriculum managers
+roles.groupmanagers=Group administrators
+roles.learnresourcemanagers=Learn ressource manager
+roles.lecturemanagers=Lectures managers
+roles.linemanagers=Line managers
+roles.qualitymanagers=Quality managers
+roles.poolmanagers=Pool managers
+roles.principals=Principals
+roles.rolesmanagers=Roles managers
+roles.sysadmins=System administrators
+roles.usermanagers=User managers
+roles.users=Learner
 rules.landing.page=Landing page
 rules.landing.page.chooser=Selection
 rules.position=Position
@@ -28,4 +37,3 @@ rules.role=Role
 rules.user.attribute.key=User attribute
 rules.user.attribute.value=Value
 up=Up
-userManager=$org.olat.admin.user\:rightsForm.isUsermanager
diff --git a/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_fr.properties
index 2c03f124720..a05eb398e0f 100644
--- a/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_fr.properties
@@ -1,13 +1,13 @@
 #Mon Aug 25 14:57:24 CEST 2014
 add=Ajouter
-author=$org.olat.admin.user\:rightsForm.isAuthor
+roles.authors=$org.olat.admin.user\:rightsForm.isAuthor
 delete=Effacer
 down=En bas
-groupManager=$org.olat.admin.user\:rightsForm.isGroupmanager
-institutionalResourceManager=$org.olat.admin.user\:rightsForm.isInstitutionalResourceManager
+roles.groupmanagers=$org.olat.admin.user\:rightsForm.isGroupmanager
+roles.learnresourcemanagers=$org.olat.admin.user\:rightsForm.isInstitutionalResourceManager
 landingpages.title=Page de d\u00E9part
 none=-
-olatAdmin=$org.olat.admin.user\:rightsForm.isAdmin
+roles.administrators=$org.olat.admin.user\:rightsForm.isAdmin
 page.catalog=Catalogue
 page.coursesCatalog=Catalogue dans la partie cours
 page.groups=Groupes
@@ -20,7 +20,7 @@ page.myFavoritGroups=Groupes favoris
 page.myNotifications=Abonnements
 page.myPortfolio=ePortfolio
 page.portal=Portail ( si disponible comme zone propre)
-poolAdmin=$org.olat.admin.user\:rightsForm.isPoolmanager
+roles.poolmanagers=$org.olat.admin.user\:rightsForm.isPoolmanager
 rules.landing.page=Page de d\u00E9part
 rules.landing.page.chooser=Choix
 rules.position=Position
@@ -28,4 +28,4 @@ rules.role=R\u00F4le
 rules.user.attribute.key=Attribut utilisateur
 rules.user.attribute.value=Valeur
 up=En haut
-userManager=$org.olat.admin.user\:rightsForm.isUsermanager
+roles.usermanagers=$org.olat.admin.user\:rightsForm.isUsermanager
diff --git a/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_it.properties b/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_it.properties
index 0ad97d979ba..fb1a66ed92e 100644
--- a/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_it.properties
+++ b/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_it.properties
@@ -1,13 +1,13 @@
 #Tue Feb 07 13:52:48 CET 2017
 add=Aggiungere
-author=$org.olat.admin.user\:rightsForm.isAuthor
+roles.authors=$org.olat.admin.user\:rightsForm.isAuthor
 delete=Eliminare
 down=Gi\u00F9
-groupManager=$org.olat.admin.user\:rightsForm.isGroupmanager
-institutionalResourceManager=$org.olat.admin.user\:rightsForm.isInstitutionalResourceManager
+roles.groupmanagers=$org.olat.admin.user\:rightsForm.isGroupmanager
+roles.learnresourcemanagers=$org.olat.admin.user\:rightsForm.isInstitutionalResourceManager
 landingpages.title=Landing pages
 none=-
-olatAdmin=$org.olat.admin.user\:rightsForm.isAdmin
+roles.administrators=$org.olat.admin.user\:rightsForm.isAdmin
 page.catalog=Catalogo (se disponibile come sito proprio)
 page.coursesCatalog=Catalogo in area corsi
 page.groups=Area gruppi
@@ -20,7 +20,7 @@ page.myFavoritGroups=Preferiti nell'area gruppi
 page.myNotifications=I miei abbonamenti
 page.myPortfolio=I miei e-Portfolio
 page.portal=Portale (se disponibile come area propria)
-poolAdmin=$org.olat.admin.user\:rightsForm.isPoolmanager
+roles.poolmanagers=$org.olat.admin.user\:rightsForm.isPoolmanager
 rules.landing.page=Landing page
 rules.landing.page.chooser=Selezione
 rules.position=Posizione
@@ -28,4 +28,4 @@ rules.role=Ruolo
 rules.user.attribute.key=Attributo utente
 rules.user.attribute.value=Valore
 up=Su
-userManager=$org.olat.admin.user\:rightsForm.isUsermanager
+roles.usermanagers=$org.olat.admin.user\:rightsForm.isUsermanager
diff --git a/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_pt_BR.properties
index 8f7a9622d34..13490bdc479 100644
--- a/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_pt_BR.properties
+++ b/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_pt_BR.properties
@@ -1,13 +1,13 @@
 #Wed Sep 03 14:37:24 CEST 2014
 add=Adicionar
-author=$org.olat.admin.user\:rightsForm.isAuthor
+roles.authors=$org.olat.admin.user\:rightsForm.isAuthor
 delete=Excluir
 down=Abaixo
-groupManager=$org.olat.admin.user\:rightsForm.isGroupmanager
-institutionalResourceManager=$org.olat.admin.user\:rightsForm.isInstitutionalResourceManager
+roles.groupmanagers=$org.olat.admin.user\:rightsForm.isGroupmanager
+roles.learnresourcemanagers=$org.olat.admin.user\:rightsForm.isInstitutionalResourceManager
 landingpages.title=P\u00E1gina inicial
 none=-
-olatAdmin=$org.olat.admin.user\:rightsForm.isAdmin
+roles.administrators=$org.olat.admin.user\:rightsForm.isAdmin
 page.catalog=Cat\u00E1logo
 page.coursesCatalog=Cat\u00E1logo em \u00E1rea de curso
 page.groups=Grupos
@@ -20,7 +20,7 @@ page.myFavoritGroups=Grupos favoritos
 page.myNotifications=Assinatura
 page.myPortfolio=e-Portfolio
 page.portal=Portal (se dispon\u00EDvel como \u00E1rea pr\u00F3pria)
-poolAdmin=$org.olat.admin.user\:rightsForm.isPoolmanager
+roles.poolmanagers=$org.olat.admin.user\:rightsForm.isPoolmanager
 rules.landing.page=P\u00E1gina inicial
 rules.landing.page.chooser=Sele\u00E7\u00E3o
 rules.position=Posi\u00E7\u00E3o
@@ -28,4 +28,4 @@ rules.role=Fun\u00E7\u00E3o
 rules.user.attribute.key=Atributo do usu\u00E1rio
 rules.user.attribute.value=Valor
 up=Subir
-userManager=$org.olat.admin.user\:rightsForm.isUsermanager
+roles.usermanagers=$org.olat.admin.user\:rightsForm.isUsermanager
diff --git a/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_zh_CN.properties b/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_zh_CN.properties
index 85a3cb12c46..32e095d5d2d 100644
--- a/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_zh_CN.properties
+++ b/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_zh_CN.properties
@@ -1,13 +1,13 @@
 #Thu Nov 20 00:40:26 CET 2014
 add=\u6DFB\u52A0
-author=$org.olat.admin.user\:rightsForm.isAuthor
+roles.authors=$org.olat.admin.user\:rightsForm.isAuthor
 delete=\u5220\u9664
 down=\u5411\u4E0B
-groupManager=$org.olat.admin.user\:rightsForm.isGroupmanager
-institutionalResourceManager=$org.olat.admin.user\:rightsForm.isInstitutionalResourceManager
+roles.groupmanagers=$org.olat.admin.user\:rightsForm.isGroupmanager
+roles.learnresourcemanagers=$org.olat.admin.user\:rightsForm.isInstitutionalResourceManager
 landingpages.title=\u9996\u9875
 none=-
-olatAdmin=$org.olat.admin.user\:rightsForm.isAdmin
+roles.administrators=$org.olat.admin.user\:rightsForm.isAdmin
 page.catalog=\u76EE\u5F55\uFF08\u4EC5\u4F5C\u4E3A\u72EC\u7ACB\u533A\u57DF\u53EF\u7528\uFF09
 page.coursesCatalog=\u8BFE\u7A0B\u533A\u57DF\u7684\u76EE\u5F55
 page.groups=\u7FA4\u7EC4\u533A\u57DF
@@ -20,7 +20,7 @@ page.myFavoritGroups=\u7FA4\u7EC4\u533A\u57DF\u559C\u597D
 page.myNotifications=\u6211\u7684\u8BA2\u9605
 page.myPortfolio=\u6211\u7684e-Portfolio
 page.portal=\u95E8\u6237\uFF08\u4EC5\u4F5C\u4E3A\u72EC\u7ACB\u533A\u57DF\u53EF\u7528\uFF09
-poolAdmin=$org.olat.admin.user\:rightsForm.isPoolmanager
+roles.poolmanagers=$org.olat.admin.user\:rightsForm.isPoolmanager
 rules.landing.page=\u9996\u9875
 rules.landing.page.chooser=\u9009\u62E9
 rules.position=\u4F4D\u7F6E
@@ -28,4 +28,4 @@ rules.role=\u89D2\u8272
 rules.user.attribute.key=\u7528\u6237\u5C5E\u6027
 rules.user.attribute.value=\u503C
 up=\u9AD8
-userManager=$org.olat.admin.user\:rightsForm.isUsermanager
+roles.usermanagers=$org.olat.admin.user\:rightsForm.isUsermanager
diff --git a/src/main/java/org/olat/admin/privacy/PrivacyAdminController.java b/src/main/java/org/olat/admin/privacy/PrivacyAdminController.java
index 35735d03446..e294ffb5704 100644
--- a/src/main/java/org/olat/admin/privacy/PrivacyAdminController.java
+++ b/src/main/java/org/olat/admin/privacy/PrivacyAdminController.java
@@ -22,7 +22,7 @@ package org.olat.admin.privacy;
 import java.util.Collection;
 
 import org.olat.basesecurity.BaseSecurityModule;
-import org.olat.core.CoreSpringFactory;
+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;
@@ -32,6 +32,7 @@ import org.olat.core.gui.components.form.flexible.impl.FormEvent;
 import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * 
@@ -39,54 +40,52 @@ import org.olat.core.gui.control.WindowControl;
  */
 public class PrivacyAdminController extends FormBasicController {
 	
+	private static final String[] onKeys = new String[]{ "on" };
+	
 	private MultipleSelectionElement adminPropsEl;
 	private MultipleSelectionElement lastloginEl;
 	private MultipleSelectionElement tunnelEl;
 
-	private final BaseSecurityModule module;
+	@Autowired
+	private BaseSecurityModule module;
 	
-	private String[] adminPropKeys = new String[]{
-			"users","authors", "usermanagers", "groupmanagers", "administrators"
-	};
-	private String[] onKeys = new String[]{ "on" };
 	
 	public PrivacyAdminController(UserRequest ureq, WindowControl wControl) {
 		super(ureq, wControl, LAYOUT_VERTICAL);
-		module = CoreSpringFactory.getImpl(BaseSecurityModule.class);
 		initForm(ureq);
 	}
 
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-
 		FormLayoutContainer propsCont = FormLayoutContainer.createDefaultFormLayout("props", getTranslator());
 		formLayout.add(propsCont);
 		propsCont.setFormTitle(translate("admin.menu.title"));
 		propsCont.setFormDescription(translate("admin.props.desc"));
-		
-		String[] adminPropValues = new String[]{
-				translate("admin.props.users"),
-				translate("admin.props.authors"),
-				translate("admin.props.usermanagers"),
-				translate("admin.props.groupmanagers"),
-				translate("admin.props.administrators")
-		};
+
+		OrganisationRoles[] roles = BaseSecurityModule.getUserAllowedRoles();
+		String[] adminPropKeys = new String[roles.length];
+		String[] adminPropValues = new String[roles.length];
+		for(int i=roles.length; i-->0; ) {
+			adminPropKeys[i] = roles[i].name();
+			adminPropValues[i] = translate("admin.props." + roles[i].name() + "s");
+		}
+
 		adminPropsEl = uifactory.addCheckboxesVertical("admin.props", propsCont, adminPropKeys, adminPropValues, 1);
-		adminPropsEl.select("users", "enabled".equals(module.getUserSearchAdminPropsForUsers()));
-		adminPropsEl.select("authors", "enabled".equals(module.getUserSearchAdminPropsForAuthors()));
-		adminPropsEl.select("usermanagers", "enabled".equals(module.getUserSearchAdminPropsForUsermanagers()));
-		adminPropsEl.select("groupmanagers", "enabled".equals(module.getUserSearchAdminPropsForGroupmanagers()));
-		adminPropsEl.select("administrators", "enabled".equals(module.getUserSearchAdminPropsForAdministrators()));
+		for(OrganisationRoles adminProp:roles) {
+			if("enabled".equals(module.getUserSearchAdminPropsFor(adminProp))) {
+				adminPropsEl.select(adminProp.name(), true);
+			}
+		}
 		adminPropsEl.addActionListener(FormEvent.ONCHANGE);
 		
 		uifactory.addSpacerElement("admin.space.1", propsCont, true);
 
 		lastloginEl = uifactory.addCheckboxesVertical("last.login", propsCont, adminPropKeys, adminPropValues, 1);
-		lastloginEl.select("users", "enabled".equals(module.getUserLastLoginVisibleForUsers()));
-		lastloginEl.select("authors", "enabled".equals(module.getUserLastLoginVisibleForAuthors()));
-		lastloginEl.select("usermanagers", "enabled".equals(module.getUserLastLoginVisibleForUsermanagers()));
-		lastloginEl.select("groupmanagers", "enabled".equals(module.getUserLastLoginVisibleForGroupmanagers()));
-		lastloginEl.select("administrators", "enabled".equals(module.getUserLastLoginVisibleForAdministrators()));
+		for(OrganisationRoles role:roles) {
+			if("enabled".equals(module.getUserLastLoginVisibleFor(role))) {
+				lastloginEl.select(role.name(), true);
+			}
+		}
 		lastloginEl.addActionListener(FormEvent.ONCHANGE);
 		
 		FormLayoutContainer tuCont = FormLayoutContainer.createDefaultFormLayout("tu", getTranslator());
@@ -108,23 +107,25 @@ public class PrivacyAdminController extends FormBasicController {
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
 		if(source == adminPropsEl) {
 			Collection<String> selectedKeys = adminPropsEl.getSelectedKeys();
-			module.setUserSearchAdminPropsForUsers(selectedKeys.contains("users") ? "enabled" : "disabled");
-			module.setUserSearchAdminPropsForAuthors(selectedKeys.contains("authors") ? "enabled" : "disabled");
-			module.setUserSearchAdminPropsForUsermanagers(selectedKeys.contains("usermanagers") ? "enabled" : "disabled");
-			module.setUserSearchAdminPropsForGroupmanagers(selectedKeys.contains("groupmanagers") ? "enabled" : "disabled");
-			module.setUserSearchAdminPropsForAdministrators(selectedKeys.contains("administrators") ? "enabled" : "disabled");
+			OrganisationRoles[] roleArray = BaseSecurityModule.getUserAllowedRoles();
+			for(OrganisationRoles adminProp:roleArray) {
+				module.setUserSearchAdminPropsFor(adminProp, getEnable(selectedKeys.contains(adminProp.name())));
+			}
 		} else if(source == lastloginEl) {
 			Collection<String> selectedKeys = lastloginEl.getSelectedKeys();
-			module.setUserLastLoginVisibleForUsers(selectedKeys.contains("users") ? "enabled" : "disabled");
-			module.setUserLastLoginVisibleForAuthors(selectedKeys.contains("authors") ? "enabled" : "disabled");
-			module.setUserLastLoginVisibleForUsermanagers(selectedKeys.contains("usermanagers") ? "enabled" : "disabled");
-			module.setUserLastLoginVisibleForGroupmanagers(selectedKeys.contains("groupmanagers") ? "enabled" : "disabled");
-			module.setUserLastLoginVisibleForAdministrators(selectedKeys.contains("administrators") ? "enabled" : "disabled");
+			OrganisationRoles[] roleArray = BaseSecurityModule.getUserAllowedRoles();
+			for(OrganisationRoles adminProp:roleArray) {
+				module.setUserLastLoginVisibleFor(adminProp, getEnable(selectedKeys.contains(adminProp.name())));
+			}
 		} else if (source == tunnelEl) {
 			Collection<String> selectedKeys = tunnelEl.getSelectedKeys();
 			module.setUserInfosTunnelCourseBuildingBlock(selectedKeys.contains("on") ? "enabled" : "disabled");
 		}
 	}
+	
+	private String getEnable(boolean enabled) {
+		return enabled ?  "enabled" : "disabled";
+	}
 
 	@Override
 	protected void formOK(UserRequest ureq) {
diff --git a/src/main/java/org/olat/admin/privacy/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/privacy/_i18n/LocalStrings_de.properties
index 39aaaaaf315..1aa100ab732 100644
--- a/src/main/java/org/olat/admin/privacy/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/admin/privacy/_i18n/LocalStrings_de.properties
@@ -2,10 +2,19 @@
 admin.menu.title=Datenschutz
 admin.menu.title.alt=Datenschutz
 admin.props=Administrative Benutzerproperties
-admin.props.administrators=Systemadministratoren
+admin.props.administrators=Administratoren
 admin.props.authors=Kursautoren
+admin.props.curriculummanagers=Curriculumverwalter
 admin.props.desc=Systemrollen, welche die administrativen Benutzerproperties z.B. bei der Benutzersuche oder in Listen sehen d\u00FCrfen. Welche Benutzerproperties als administrativ gelten wird bei den Benutzerproperties konfiguriert.
 admin.props.groupmanagers=Gruppenverwalter
+admin.props.learnresourcemanagers=Lernressourcenverwalter
+admin.props.lecturemanagers=Lektionenblockverwalter
+admin.props.linemanagers=Linemanagers
+admin.props.qualitymanagers=Quality managers
+admin.props.poolmanagers=Poolverwalter
+admin.props.principals=Principals
+admin.props.rolesmanagers=Rollenverwalter
+admin.props.sysadmins=Systemadministratoren
 admin.props.usermanagers=Benutzerverwalter
 admin.props.users=Lernende
 last.login=Sichtbarkeit des letzten Besuchs
diff --git a/src/main/java/org/olat/admin/privacy/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/admin/privacy/_i18n/LocalStrings_en.properties
index 204c4203bc2..1993ff6b3de 100644
--- a/src/main/java/org/olat/admin/privacy/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/admin/privacy/_i18n/LocalStrings_en.properties
@@ -2,10 +2,19 @@
 admin.menu.title=Privacy
 admin.menu.title.alt=Privacy
 admin.props=Administrative user properties
-admin.props.administrators=System administrators
+admin.props.administrators=Administrators
 admin.props.authors=Course authors
+admin.props.curriculummanagers=Curriculum managers
 admin.props.desc=System roles for whom the administrative user properties are visible, e.g. in user search forms or lists. Which user properties are considered as administrative is defined in the user properties configuration.
 admin.props.groupmanagers=Group administrators
+admin.props.learnresourcemanagers=Learn ressource manager
+admin.props.lecturemanagers=Lectures managers
+admin.props.linemanagers=Line managers
+admin.props.qualitymanagers=Quality managers
+admin.props.poolmanagers=Pool managers
+admin.props.principals=Principals
+admin.props.rolesmanagers=Roles managers
+admin.props.sysadmins=System administrators
 admin.props.usermanagers=User managers
 admin.props.users=Learner
 last.login=Visibility of the last visit date
diff --git a/src/main/java/org/olat/admin/quota/QuotaController.java b/src/main/java/org/olat/admin/quota/QuotaController.java
index 8932fc83f63..611bbcafc48 100644
--- a/src/main/java/org/olat/admin/quota/QuotaController.java
+++ b/src/main/java/org/olat/admin/quota/QuotaController.java
@@ -77,7 +77,7 @@ public class QuotaController extends BasicController {
 		super(ureq, wControl);
 
 		UserSession usess = ureq.getUserSession();
-		if (usess.getRoles().isOLATAdmin() || usess.getRoles().isSystemAdmin()) {
+		if (!usess.getRoles().isOLATAdmin() && !usess.getRoles().isSystemAdmin()) {
 			throw new OLATSecurityException("Insufficient permissions to access QuotaController");
 		}
 
diff --git a/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java b/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java
index 9c87d68b9e5..52c88322e5e 100644
--- a/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java
+++ b/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java
@@ -541,7 +541,9 @@ public class GroupController extends BasicController {
 				MailBundle ccBundle = mailManager.makeMailBundle(context, ureq.getIdentity(), mailTemplate, sender, metaId, result);
 				result.append(mailManager.sendMessage(ccBundle));
 			}
-			MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getUserSession().getRoles().isOLATAdmin(), ureq.getLocale());
+			Roles roles = ureq.getUserSession().getRoles();
+			boolean detailedErrorOutput = roles.isAdministrator() || roles.isSystemAdmin();
+			MailHelper.printErrorsAndWarnings(result, getWindowControl(), detailedErrorOutput, ureq.getLocale());
 		}
 	}
 
@@ -588,7 +590,9 @@ public class GroupController extends BasicController {
 				MailBundle ccBundle = mailManager.makeMailBundle(context, ureq.getIdentity(), mailTemplate, sender, metaId, result);
 				result.append(mailManager.sendMessage(ccBundle));
 			}
-			MailHelper.appendErrorsAndWarnings(result, errorMessage, infoMessage, ureq.getUserSession().getRoles().isOLATAdmin(), ureq.getLocale());
+			Roles roles = ureq.getUserSession().getRoles();
+			boolean detailedErrorOutput = roles.isAdministrator() || roles.isSystemAdmin();
+			MailHelper.appendErrorsAndWarnings(result, errorMessage, infoMessage, detailedErrorOutput, ureq.getLocale());
 		}
 		// report any errors on screen
 		if (infoMessage.length() > 0) getWindowControl().setWarning(infoMessage.toString());
diff --git a/src/main/java/org/olat/admin/securitygroup/gui/UserControllerFactory.java b/src/main/java/org/olat/admin/securitygroup/gui/UserControllerFactory.java
deleted file mode 100644
index c31542244ef..00000000000
--- a/src/main/java/org/olat/admin/securitygroup/gui/UserControllerFactory.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
-* OLAT - Online Learning and Training<br>
-* http://www.olat.org
-* <p>
-* Licensed under the Apache License, Version 2.0 (the "License"); <br>
-* you may not use this file except in compliance with the License.<br>
-* You may obtain a copy of the License at
-* <p>
-* http://www.apache.org/licenses/LICENSE-2.0
-* <p>
-* Unless required by applicable law or agreed to in writing,<br>
-* software distributed under the License is distributed on an "AS IS" BASIS, <br>
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
-* See the License for the specific language governing permissions and <br>
-* limitations under the License.
-* <p>
-* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
-* University of Zurich, Switzerland.
-* <hr>
-* <a href="http://www.openolat.org">
-* OpenOLAT - Online Learning and Training</a><br>
-* This file has been modified by the OpenOLAT community. Changes are licensed
-* under the Apache 2.0 license as the original file.
-*/
-
-package org.olat.admin.securitygroup.gui;
-
-import java.util.List;
-import java.util.Locale;
-
-import org.olat.admin.user.UserTableDataModel;
-import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.table.TableController;
-import org.olat.core.gui.components.table.TableGuiConfiguration;
-import org.olat.core.gui.control.WindowControl;
-import org.olat.core.gui.translator.Translator;
-import org.olat.core.id.Identity;
-import org.olat.core.id.Roles;
-import org.olat.core.util.Util;
-import org.olat.user.UserManager;
-/**
- * 
- * Description:<br>
- * Factory to create a user table controller
- */
-public class UserControllerFactory {
-
-	public static TableController createTableControllerFor(TableGuiConfiguration tableConfig, List<Identity> identities, UserRequest ureq,
-			WindowControl wControl, String actionCommand) {
-		Locale loc = ureq.getLocale();
-		Translator trans = Util.createPackageTranslator(UserControllerFactory.class, loc);
-		trans = UserManager.getInstance().getPropertyHandlerTranslator(trans);
-		TableController tableCtr = new TableController(tableConfig, ureq, wControl, trans);
-		Roles roles = ureq.getUserSession().getRoles();
-		boolean isAdministrativeUser = (roles.isAuthor() || roles.isGroupManager() || roles.isUserManager() || roles.isOLATAdmin());
-		UserTableDataModel userDataModel = new UserTableDataModel(identities, loc, isAdministrativeUser);
-		userDataModel.addColumnDescriptors(tableCtr, actionCommand);
-		tableCtr.setTableDataModel(userDataModel);
-		return tableCtr;
-	}
-
-}
diff --git a/src/main/java/org/olat/admin/site/AdminSiteDef.java b/src/main/java/org/olat/admin/site/AdminSiteDef.java
index b868ecb9153..36add20d923 100644
--- a/src/main/java/org/olat/admin/site/AdminSiteDef.java
+++ b/src/main/java/org/olat/admin/site/AdminSiteDef.java
@@ -31,6 +31,7 @@ import org.olat.core.gui.control.navigation.AbstractSiteDefinition;
 import org.olat.core.gui.control.navigation.SiteConfiguration;
 import org.olat.core.gui.control.navigation.SiteDefinition;
 import org.olat.core.gui.control.navigation.SiteInstance;
+import org.olat.core.util.UserSession;
 
 /**
  * Description:<br>
@@ -49,7 +50,11 @@ public class AdminSiteDef extends AbstractSiteDefinition implements SiteDefiniti
 
 	@Override
 	public SiteInstance createSite(UserRequest ureq, WindowControl wControl, SiteConfiguration config) {
-		if (ureq.getUserSession().getRoles().isOLATAdmin()) {
+		if(ureq == null) return null;
+		
+		UserSession usess = ureq.getUserSession();
+		if (usess != null && usess.getRoles() != null
+				&& (usess.getRoles().isAdministrator() || usess.getRoles().isSystemAdmin())) {
 			// only open for olat-admins
 			return new AdminSite(this, ureq.getLocale());
 		} 
diff --git a/src/main/java/org/olat/admin/site/UserAdminSiteDef.java b/src/main/java/org/olat/admin/site/UserAdminSiteDef.java
index 6cd26fe9129..f1b5fa5cf4c 100644
--- a/src/main/java/org/olat/admin/site/UserAdminSiteDef.java
+++ b/src/main/java/org/olat/admin/site/UserAdminSiteDef.java
@@ -31,6 +31,7 @@ import org.olat.core.gui.control.navigation.AbstractSiteDefinition;
 import org.olat.core.gui.control.navigation.SiteConfiguration;
 import org.olat.core.gui.control.navigation.SiteDefinition;
 import org.olat.core.gui.control.navigation.SiteInstance;
+import org.olat.core.id.Roles;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.UserSession;
 
@@ -46,11 +47,18 @@ public class UserAdminSiteDef extends AbstractSiteDefinition implements SiteDefi
 
 	@Override
 	public SiteInstance createSite(UserRequest ureq, WindowControl wControl, SiteConfiguration config) {
+		if(ureq == null) return null;
+		
+		UserSession usess = ureq.getUserSession();
+		if(usess.getRoles() == null) {
+			return null;
+		}
 		if(StringHelper.containsNonWhitespace(config.getSecurityCallbackBeanId())) {
 			return new UserAdminSite(this, ureq.getLocale());
 		} 
-		UserSession usess = ureq.getUserSession();
-		if (usess.getRoles().isOLATAdmin() || usess.getRoles().isUserManager()) {
+		
+		Roles roles = usess.getRoles();
+		if (roles.isAdministrator() || roles.isUserManager() || roles.isRolesManager()) {
 			// only open for olat-usermanagers
 			return new UserAdminSite(this, ureq.getLocale());
 		} 
diff --git a/src/main/java/org/olat/admin/user/NewUsersNotificationsController.java b/src/main/java/org/olat/admin/user/NewUsersNotificationsController.java
index 4bd3ee5fc39..8e75c3d5b73 100644
--- a/src/main/java/org/olat/admin/user/NewUsersNotificationsController.java
+++ b/src/main/java/org/olat/admin/user/NewUsersNotificationsController.java
@@ -93,7 +93,7 @@ public class NewUsersNotificationsController extends BasicController {
 		}
 		
 		List<Identity> identities = usersSubscriptionManager.getNewIdentityCreated(compareDate, getIdentity(), ureq.getUserSession().getRoles());
-		searchController = new UsermanagerUserSearchController(ureq, getWindowControl(), stackedPanel, identities, Identity.STATUS_VISIBLE_LIMIT, true, false);
+		searchController = new UsermanagerUserSearchController(ureq, getWindowControl(), stackedPanel, identities, true, false);
 		listenTo(searchController);
 		mainVC.put("notificationsList", searchController.getInitialComponent());
 
@@ -123,13 +123,7 @@ public class NewUsersNotificationsController extends BasicController {
 		}
 		else if(source == subscriptionController) {
 			String cmd = event.getCommand();
-			if("command.subscribe".equals(cmd)) {
-				updateUI(ureq, dateChooserController.getChoosenDate());
-			}
-			else if("command.unsubscribe".equals(cmd)) {
-				updateUI(ureq, dateChooserController.getChoosenDate());
-			}
-			else if("command.markread".equals(cmd)) {
+			if("command.subscribe".equals(cmd) || "command.unsubscribe".equals(cmd) || "command.markread".equals(cmd)) {
 				updateUI(ureq, dateChooserController.getChoosenDate());
 			}
 		} else if(source == dateChooserController) {
diff --git a/src/main/java/org/olat/admin/user/SystemRolesAndRightsController.java b/src/main/java/org/olat/admin/user/SystemRolesAndRightsController.java
index d1605a541a9..c6b0df153e7 100644
--- a/src/main/java/org/olat/admin/user/SystemRolesAndRightsController.java
+++ b/src/main/java/org/olat/admin/user/SystemRolesAndRightsController.java
@@ -26,7 +26,9 @@
 package org.olat.admin.user;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.olat.admin.user.bulkChange.UserBulkChangeManager;
 import org.olat.basesecurity.BaseSecurity;
@@ -51,9 +53,9 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
 import org.olat.core.id.Identity;
 import org.olat.core.id.Organisation;
+import org.olat.core.id.OrganisationRef;
 import org.olat.core.id.Roles;
 import org.olat.core.id.RolesByOrganisation;
-import org.olat.core.util.UserSession;
 import org.springframework.beans.factory.annotation.Autowired;
 
 /**
@@ -84,9 +86,14 @@ public class SystemRolesAndRightsController extends FormBasicController {
 	private MultipleSelectionElement sendLoginDeniedEmailEl;
 	private final List<MultipleSelectionElement> rolesEls = new ArrayList<>();
 
-	private 	List<String> statusKeys;
-	private 	List<String> statusValues;
+	private int counter = 0;
+	private List<String> statusKeys;
+	private List<String> statusValues;
 	
+	/**
+	 * The roles without inheritance
+	 */
+	private Roles editedRoles;
 	private Identity editedIdentity;
 	private List<Organisation> organisations;
 	
@@ -115,11 +122,18 @@ public class SystemRolesAndRightsController extends FormBasicController {
 	public SystemRolesAndRightsController(WindowControl wControl, UserRequest ureq, Identity identity) {
 		super(ureq, wControl, LAYOUT_BAREBONE);
 		this.editedIdentity = identity;
-		organisations = organisationService.getOrganisations(editedIdentity, OrganisationRoles.values());
+		
+		editedRoles = securityManager.getRoles(editedIdentity, false);
+		editedRoles.getOrganisations();
+		
+		organisations = new ArrayList<>();
+		for(OrganisationRef organisation: editedRoles.getOrganisations()) {
+			organisations.add(organisationService.getOrganisation(organisation));
+		}
 
 		managerRoles = ureq.getUserSession().getRoles();
 		manageableOrganisations = organisationService.getOrganisations(getIdentity(), managerRoles,
-				OrganisationRoles.administrator, OrganisationRoles.usermanager);
+				OrganisationRoles.administrator, OrganisationRoles.usermanager, OrganisationRoles.rolesmanager);
 		
 		initStatusKeysAndValues();
 		initForm(ureq);
@@ -137,7 +151,7 @@ public class SystemRolesAndRightsController extends FormBasicController {
 		statusValues.add(translate("rightsForm.status.permanent"));
 		statusValues.add(translate("rightsForm.status.login_denied"));
 		
-		if (editedIdentity.getStatus() == Identity.STATUS_DELETED) {
+		if (editedIdentity.getStatus() != null && editedIdentity.getStatus().equals(Identity.STATUS_DELETED)) {
 			statusKeys.add(Integer.toString(Identity.STATUS_DELETED));
 			statusValues.add(translate("rightsForm.status.deleted"));
 		}
@@ -145,8 +159,10 @@ public class SystemRolesAndRightsController extends FormBasicController {
 
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-		boolean iAmOlatAdmin = managerRoles.isOLATAdmin();
-		
+		boolean iAmAdmin = managerRoles.isManagerOf(OrganisationRoles.administrator, editedRoles)
+				|| managerRoles.isManagerOf(OrganisationRoles.rolesmanager, editedRoles);
+		boolean iAmUserManager = managerRoles.isManagerOf(OrganisationRoles.usermanager, editedRoles);
+	
 		// anonymous
 		FormLayoutContainer anonymousCont = FormLayoutContainer.createDefaultFormLayout("anonc", getTranslator());
 		formLayout.add(anonymousCont);
@@ -157,7 +173,7 @@ public class SystemRolesAndRightsController extends FormBasicController {
 				new String[]{translate("rightsForm.isAnonymous.true"), translate("rightsForm.isAnonymous.false")}
 		);
 		uifactory.addSpacerElement("syssep", anonymousCont, false);
-		if (iAmOlatAdmin || BaseSecurityModule.USERMANAGER_CAN_MANAGE_GUESTS.booleanValue()) {
+		if (iAmAdmin || BaseSecurityModule.USERMANAGER_CAN_MANAGE_GUESTS.booleanValue()) {
 			anonymousEl.addActionListener(FormEvent.ONCLICK);
 		} else {
 			anonymousCont.setVisible(false);
@@ -181,8 +197,8 @@ public class SystemRolesAndRightsController extends FormBasicController {
 		sendLoginDeniedEmailEl = uifactory.addCheckboxesHorizontal("rightsForm.sendLoginDeniedEmail", statusCont, new String[]{"y"}, new String[]{translate("rightsForm.sendLoginDeniedEmail")});
 		sendLoginDeniedEmailEl.setLabel(null, null);
 		
-		rolesSep.setVisible(iAmOlatAdmin);
-		statusEl.setVisible(iAmOlatAdmin || BaseSecurityModule.USERMANAGER_CAN_MANAGE_INSTITUTIONAL_RESOURCE_MANAGER.booleanValue());
+		rolesSep.setVisible(iAmAdmin);
+		statusEl.setVisible(iAmAdmin || iAmUserManager);
 		sendLoginDeniedEmailEl.setVisible(false);
 		
 		FormLayoutContainer buttonGroupLayout = FormLayoutContainer.createButtonLayout("buttonGroupLayout", getTranslator());
@@ -205,83 +221,85 @@ public class SystemRolesAndRightsController extends FormBasicController {
 	}
 	
 	private void initFormRoles(FormItemContainer formLayout, Organisation organisation) {
-		boolean iAmAdmin = managerRoles.isOLATAdmin() || managerRoles.hasRoleInParentLine(organisation, OrganisationRoles.administrator); 
+		boolean admin = managerRoles.hasRoleInParentLine(organisation, OrganisationRoles.administrator)
+				|| managerRoles.hasRoleInParentLine(organisation, OrganisationRoles.rolesmanager); 
+		boolean userManager = managerRoles.hasRoleInParentLine(organisation, OrganisationRoles.usermanager); 
 		
 		List<String> roleKeys = new ArrayList<>();
 		List<String> roleValues = new ArrayList<>();
-		
+
 		roleKeys.add(OrganisationRoles.invitee.name());
 		roleValues.add(translate("rightsForm.isInvitee"));
 
 		roleKeys.add(OrganisationRoles.user.name());
 		roleValues.add(translate("rightsForm.isUser"));
 
-		roleKeys.add(OrganisationRoles.coach.name());
-		roleValues.add(translate("rightsForm.isCoach"));
+		roleKeys.add(OrganisationRoles.author.name());
+		roleValues.add(translate("rightsForm.isAuthor"));
 
-		if (iAmAdmin) {
-			roleKeys.add(OrganisationRoles.usermanager.name());
-			roleValues.add(translate("rightsForm.isUsermanager"));
-		}
-		
-		if (iAmAdmin || BaseSecurityModule.USERMANAGER_CAN_MANAGE_GROUPMANAGERS.booleanValue()) {
-			roleKeys.add(OrganisationRoles.groupmanager.name());
-			roleValues.add(translate("rightsForm.isGroupmanager"));
-		}
+		roleKeys.add(OrganisationRoles.usermanager.name());
+		roleValues.add(translate("rightsForm.isUsermanager"));
 
-		if (iAmAdmin || BaseSecurityModule.USERMANAGER_CAN_MANAGE_POOLMANAGERS.booleanValue()) {
-			roleKeys.add(OrganisationRoles.poolmanager.name());
-			roleValues.add(translate("rightsForm.isPoolmanager"));
-		}
-		
-		if (iAmAdmin || BaseSecurityModule.USERMANAGER_CAN_MANAGE_CURRICULUMMANAGERS.booleanValue()) {
-			roleKeys.add(OrganisationRoles.curriculummanager.name());
-			roleValues.add(translate("rightsForm.isCurriculummanager"));
-		}
+		roleKeys.add(OrganisationRoles.rolesmanager.name());
+		roleValues.add(translate("rightsForm.isRolesmanager"));
 
-		if (iAmAdmin || BaseSecurityModule.USERMANAGER_CAN_MANAGE_AUTHORS.booleanValue()) {
-			roleKeys.add(OrganisationRoles.author.name());
-			roleValues.add(translate("rightsForm.isAuthor"));
-		}
+		roleKeys.add(OrganisationRoles.groupmanager.name());
+		roleValues.add(translate("rightsForm.isGroupmanager"));
 
-		if (iAmAdmin) {
-			roleKeys.add(OrganisationRoles.administrator.name());
-			roleValues.add(translate("rightsForm.isAdmin"));
-		}
+		roleKeys.add(OrganisationRoles.poolmanager.name());
+		roleValues.add(translate("rightsForm.isPoolmanager"));
+
+		roleKeys.add(OrganisationRoles.curriculummanager.name());
+		roleValues.add(translate("rightsForm.isCurriculummanager"));
+
+		roleKeys.add(OrganisationRoles.lecturemanager.name());
+		roleValues.add(translate("rightsForm.isLecturemanager"));
+
+		roleKeys.add(OrganisationRoles.qualitymanager.name());
+		roleValues.add(translate("rightsForm.isQualitymanager"));
+
+		roleKeys.add(OrganisationRoles.linemanager.name());
+		roleValues.add(translate("rightsForm.isLinemanager"));
+
+		roleKeys.add(OrganisationRoles.principal.name());
+		roleValues.add(translate("rightsForm.isPrincipal"));
+
+		roleKeys.add(OrganisationRoles.administrator.name());
+		roleValues.add(translate("rightsForm.isAdmin"));
+
+		roleKeys.add(OrganisationRoles.learnresourcemanager.name());
+		roleValues.add(translate("rightsForm.isInstitutionalResourceManager"));
 
-		if (iAmAdmin || BaseSecurityModule.USERMANAGER_CAN_MANAGE_INSTITUTIONAL_RESOURCE_MANAGER.booleanValue()) {
-			roleKeys.add(OrganisationRoles.learnresourcemanager.name());
-			String iname = editedIdentity.getUser().getProperty("institutionalName", null);
-			roleValues.add(
-				iname != null
-				? translate("rightsForm.isInstitutionalResourceManager.institution",iname)
-				: translate("rightsForm.isInstitutionalResourceManager")
-			);
-		}
 		
-		MultipleSelectionElement rolesEl;
-		if(organisations.size() == 1) {
-			rolesEl = uifactory.addCheckboxesVertical(
-					"roles-" + organisation.getKey(), "rightsForm.roles", formLayout,
-					roleKeys.toArray(new String[roleKeys.size()]),
-					roleValues.toArray(new String[roleValues.size()]), 1);
-		} else {
-			rolesEl = uifactory.addCheckboxesHorizontal(
-					"roles-" + organisation.getKey(), "rightsForm.roles", formLayout,
+		MultipleSelectionElement rolesEl = uifactory.addCheckboxesHorizontal(
+					"roles_" + (++counter), "rightsForm.roles", formLayout,
 					roleKeys.toArray(new String[roleKeys.size()]),
 					roleValues.toArray(new String[roleValues.size()]));
-		}
-		if(organisation.getParent() != null) {
+		if(organisations.size() > 1 || !organisation.getIdentifier().equals(OrganisationService.DEFAULT_ORGANISATION_IDENTIFIER)) {
 			rolesEl.setLabel("rightsForm.roles.for", new String[] { organisation.getDisplayName() });
 		}
 		rolesEl.setUserObject(new RolesElement(roleKeys, organisation, rolesEl));
-		rolesEl.setEnabled(iAmAdmin || managerRoles.hasRoleInParentLine(organisation, OrganisationRoles.usermanager));
+		
+		if(admin) {
+			rolesEl.setEnabled(new HashSet<>(roleKeys), true);
+		} else if(userManager) {
+			Set<String> enabled = new HashSet<>();
+			enabled.add(OrganisationRoles.invitee.name());
+			enabled.add(OrganisationRoles.user.name());
+			enabled.add(OrganisationRoles.author.name());
+			rolesEl.setEnabled(enabled, true);
+			Set<String> disabled = new HashSet<>(roleKeys);
+			disabled.removeAll(enabled);
+			rolesEl.setEnabled(disabled, false);
+		} else {
+			rolesEl.setEnabled(new HashSet<>(roleKeys), false);
+		}
 		
 		rolesEls.add(rolesEl);
 	}
 	
 	private void update() {
-		Roles editedRoles = securityManager.getRoles(editedIdentity);
+		editedRoles = securityManager.getRoles(editedIdentity, false);
 		if(editedRoles.isGuestOnly()) {
 			anonymousEl.select("true", true);
 		} else {
@@ -308,24 +326,15 @@ public class SystemRolesAndRightsController extends FormBasicController {
 		update();
 	}
 	
-	private void update(RolesElement wrapper, RolesByOrganisation editedRoles) {
-		wrapper.setRole(OrganisationRoles.user, editedRoles.isUser());
-		wrapper.setRole(OrganisationRoles.invitee, editedRoles.isInvitee());
-	
-		wrapper.setRole(OrganisationRoles.coach, editedRoles.isCoach());
-		wrapper.setRole(OrganisationRoles.author, editedRoles.isAuthor());
-
-		wrapper.setRole(OrganisationRoles.usermanager, editedRoles.isUserManager());
-		wrapper.setRole(OrganisationRoles.groupmanager, editedRoles.isGroupManager());
-		wrapper.setRole(OrganisationRoles.learnresourcemanager, editedRoles.isLearnResourceManager());
-		wrapper.setRole(OrganisationRoles.poolmanager, editedRoles.isPoolManager());
-		wrapper.setRole(OrganisationRoles.curriculummanager, editedRoles.isCurriculumManager());
+	private void update(RolesElement wrapper, RolesByOrganisation editedRolesByOrg) {
+		for(OrganisationRoles role:OrganisationRoles.values()) {
+			wrapper.setRole(role, editedRolesByOrg.hasRole(role));
+		}
 		
-		wrapper.setRole(OrganisationRoles.administrator, editedRoles.isAdministrator());
-		if(editedRoles.isAdministrator()) {
+		if(editedRolesByOrg.hasSomeRoles(OrganisationRoles.administrator, OrganisationRoles.sysadmin, OrganisationRoles.rolesmanager)) {
 			statusEl.setEnabled(false);
 		}
-		
+
 		setStatus(editedIdentity.getStatus());
 		wrapper.getRolesEl().setVisible(!isAnonymous());
 		rolesSep.setVisible(!isAnonymous());
@@ -346,7 +355,7 @@ public class SystemRolesAndRightsController extends FormBasicController {
 	}
 
 	private Integer getStatus() {
-		return new Integer(statusEl.getSelectedKey());
+		return Integer.valueOf(statusEl.getSelectedKey());
 	}
 	
 	public boolean getSendLoginDeniedEmail() {
@@ -395,7 +404,6 @@ public class SystemRolesAndRightsController extends FormBasicController {
 		listenTo(cmc);
 		cmc.activate();	
 	}
-	
 
 	private void doAddIdentityToOrganisation(Organisation organisation) {
 		organisationService.addMember(organisation, editedIdentity, OrganisationRoles.user);
@@ -407,7 +415,7 @@ public class SystemRolesAndRightsController extends FormBasicController {
 
 	@Override
 	protected void formOK(UserRequest ureq) {
-		saveFormData(ureq);
+		saveFormData();
 		update();
 	}
 
@@ -418,32 +426,29 @@ public class SystemRolesAndRightsController extends FormBasicController {
 	 * @param myIdentity
 	 * @param form
 	 */
-	private void saveFormData(UserRequest ureq) {
-		UserSession usess = ureq.getUserSession();
-		Roles editorRoles = usess.getRoles();
-		boolean iAmOlatAdmin = editorRoles.isOLATAdmin();
+	private void saveFormData() {
+		boolean admin = managerRoles.isAdministrator() || managerRoles.isRolesManager();
 	
-		Roles editedRoles = securityManager.getRoles(editedIdentity);
+		editedRoles = securityManager.getRoles(editedIdentity, false);
 		
 		// 1) general user type - anonymous or user
 		// anonymous users
 		boolean isAnonymous = editedRoles.isGuestOnly();
-		if (iAmOlatAdmin || BaseSecurityModule.USERMANAGER_CAN_MANAGE_GUESTS.booleanValue()) {
+		if (admin || BaseSecurityModule.USERMANAGER_CAN_MANAGE_GUESTS.booleanValue()) {
 			isAnonymous = anonymousEl.getSelectedKey().equals("true");
 		}
 		
 		if(isAnonymous) {
-			saveAnonymousData(ureq);
+			saveAnonymousData();
 		} else {
 			for(MultipleSelectionElement rolesEl:rolesEls) {
 				if(rolesEl.isEnabled()) {
-					RolesElement wrapper = (RolesElement)rolesEl.getUserObject();
-					saveOrganisationRolesFormData(wrapper, editedRoles, editorRoles);
+					saveOrganisationRolesFormData((RolesElement)rolesEl.getUserObject());
 				}
 			}
 		}
 		
-		if ((iAmOlatAdmin || BaseSecurityModule.USERMANAGER_CAN_MANAGE_STATUS.booleanValue()) &&  !editedIdentity.getStatus().equals(getStatus()) ) {			
+		if ((admin || BaseSecurityModule.USERMANAGER_CAN_MANAGE_STATUS.booleanValue()) &&  !editedIdentity.getStatus().equals(getStatus()) ) {			
 			int oldStatus = editedIdentity.getStatus();
 			String oldStatusText = (oldStatus == Identity.STATUS_PERMANENT ? "permanent" : (oldStatus == Identity.STATUS_ACTIV ? "active" : (oldStatus == Identity.STATUS_LOGIN_DENIED ? "login_denied" : (oldStatus == Identity.STATUS_DELETED ? "deleted" : "unknown"))));
 			int newStatus = getStatus();
@@ -457,66 +462,49 @@ public class SystemRolesAndRightsController extends FormBasicController {
 		}
 	}
 	
-	private void saveAnonymousData(UserRequest ureq) {
+	private void saveAnonymousData() {
 		organisationService.setAsGuest(editedIdentity);
 		dbInstance.commit();
 		organisations = organisationService.getOrganisations(editedIdentity, OrganisationRoles.values());
 		updateRoles();
 	}
 	
-	private void saveOrganisationRolesFormData(RolesElement wrapper, Roles editedRoles, Roles editorRoles) {
-		
+	private void saveOrganisationRolesFormData(RolesElement wrapper) {
 		Organisation organisation = wrapper.getOrganisation();
-		boolean iAmUserManager = editorRoles.hasRoleInParentLine(organisation, OrganisationRoles.usermanager);
-		boolean iAmAdmin = editorRoles.isOLATAdmin() || editorRoles.hasRoleInParentLine(organisation, OrganisationRoles.administrator);
+		boolean iAmUserManager = managerRoles.hasRoleInParentLine(organisation, OrganisationRoles.usermanager);
+		boolean iAmAdmin = managerRoles.hasRoleInParentLine(organisation, OrganisationRoles.administrator)
+				|| managerRoles.hasRoleInParentLine(organisation, OrganisationRoles.rolesmanager);
 		
 		RolesByOrganisation editedOrganisationRoles = editedRoles.getRoles(wrapper.getOrganisation());
 
 		// 2) system roles
-		boolean invitee = wrapper.getRole(OrganisationRoles.invitee);
-		boolean user = wrapper.getRole(OrganisationRoles.user);
-		boolean coach = wrapper.getRole(OrganisationRoles.coach);
-
-		// group manager
-		boolean groupManager = editedOrganisationRoles.hasRole(OrganisationRoles.groupmanager);
-		if (iAmAdmin || BaseSecurityModule.USERMANAGER_CAN_MANAGE_GROUPMANAGERS.booleanValue()) {
-			groupManager = wrapper.getRole(OrganisationRoles.groupmanager);
-		}
-		// pool manager
-		boolean poolmanager = editedOrganisationRoles.hasRole(OrganisationRoles.poolmanager);
-		if (iAmAdmin || BaseSecurityModule.USERMANAGER_CAN_MANAGE_POOLMANAGERS.booleanValue()) {
-			poolmanager = wrapper.getRole(OrganisationRoles.poolmanager);
-		}
-		// curriculum manager
-		boolean curriculummanager = editedOrganisationRoles.hasRole(OrganisationRoles.curriculummanager);
-		if (iAmAdmin || BaseSecurityModule.USERMANAGER_CAN_MANAGE_POOLMANAGERS.booleanValue()) {
-			curriculummanager = wrapper.getRole(OrganisationRoles.curriculummanager);
-		}
+		List<OrganisationRoles> rolesToAdd = new ArrayList<>();
+		List<OrganisationRoles> rolesToRemove = new ArrayList<>();
+		wrapper.commit(OrganisationRoles.invitee, rolesToAdd, rolesToRemove);
+		wrapper.commit(OrganisationRoles.user, rolesToAdd, rolesToRemove);
+
 		// author
-		boolean author = editedOrganisationRoles.hasRole(OrganisationRoles.author);
-		if (iAmAdmin || BaseSecurityModule.USERMANAGER_CAN_MANAGE_AUTHORS.booleanValue()) {
-			author = wrapper.getRole(OrganisationRoles.author);
+		if (iAmAdmin || iAmUserManager) {
+			wrapper.commit(OrganisationRoles.author, rolesToAdd, rolesToRemove);
 		}
+
 		// user manager, only allowed by admin
-		boolean usermanager = editedOrganisationRoles.hasRole(OrganisationRoles.usermanager);
-		if (iAmAdmin) {
-			usermanager = wrapper.getRole(OrganisationRoles.usermanager);
-		}
-	 	// institutional resource manager, only allowed by admin
-		boolean learnresourcemanager = editedOrganisationRoles.hasRole(OrganisationRoles.learnresourcemanager);
-		if (iAmUserManager || iAmAdmin) {
-			learnresourcemanager = wrapper.getRole(OrganisationRoles.learnresourcemanager);
-		}
-		// system administrator, only allowed by admin
-		boolean admin = editedOrganisationRoles.hasRole(OrganisationRoles.administrator);
 		if (iAmAdmin) {
-			admin = wrapper.getRole(OrganisationRoles.administrator);
-		}
-		
-		RolesByOrganisation updatedRoles = RolesByOrganisation.roles(wrapper.getOrganisation(),
-				false, invitee, user, coach, author,
-				groupManager, poolmanager, curriculummanager,
-				usermanager, learnresourcemanager, admin);
+			wrapper.commit(OrganisationRoles.groupmanager, rolesToAdd, rolesToRemove);
+			wrapper.commit(OrganisationRoles.poolmanager, rolesToAdd, rolesToRemove);
+			wrapper.commit(OrganisationRoles.curriculummanager, rolesToAdd, rolesToRemove);
+			wrapper.commit(OrganisationRoles.principal, rolesToAdd, rolesToRemove);
+			wrapper.commit(OrganisationRoles.linemanager, rolesToAdd, rolesToRemove);
+			wrapper.commit(OrganisationRoles.qualitymanager, rolesToAdd, rolesToRemove);
+			wrapper.commit(OrganisationRoles.lecturemanager, rolesToAdd, rolesToRemove);
+			wrapper.commit(OrganisationRoles.usermanager, rolesToAdd, rolesToRemove);
+			wrapper.commit(OrganisationRoles.rolesmanager, rolesToAdd, rolesToRemove);
+			wrapper.commit(OrganisationRoles.learnresourcemanager, rolesToAdd, rolesToRemove);
+			wrapper.commit(OrganisationRoles.administrator, rolesToAdd, rolesToRemove);
+			wrapper.commit(OrganisationRoles.sysadmin, rolesToAdd, rolesToRemove);
+		}
+		
+		RolesByOrganisation updatedRoles = RolesByOrganisation.enhance(editedOrganisationRoles, rolesToAdd, rolesToRemove);
 		securityManager.updateRoles(getIdentity(), editedIdentity, updatedRoles);
 	}
 
@@ -545,6 +533,16 @@ public class SystemRolesAndRightsController extends FormBasicController {
 			return organisation;
 		}
 		
+		public void commit(OrganisationRoles k, List<OrganisationRoles> rolesToAdd, List<OrganisationRoles> rolesToRemove) {
+			if(roleKeys.contains(k.name())) {
+				if(getRole(k)) {
+					rolesToAdd.add(k);
+				} else {
+					rolesToRemove.add(k);
+				}
+			}
+		}
+		
 		private boolean getRole(OrganisationRoles k) {
 			return roleKeys.contains(k.name()) && rolesEl.getSelectedKeys().contains(k.name());
 		}
diff --git a/src/main/java/org/olat/admin/user/UserAdminController.java b/src/main/java/org/olat/admin/user/UserAdminController.java
index 6c42ee5c9cf..804374fd79b 100644
--- a/src/main/java/org/olat/admin/user/UserAdminController.java
+++ b/src/main/java/org/olat/admin/user/UserAdminController.java
@@ -42,6 +42,9 @@ import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
 import org.olat.core.gui.components.panel.Panel;
 import org.olat.core.gui.components.stack.BreadcrumbedStackedPanel;
+import org.olat.core.gui.components.stack.TooledController;
+import org.olat.core.gui.components.stack.TooledStackedPanel;
+import org.olat.core.gui.components.stack.TooledStackedPanel.Align;
 import org.olat.core.gui.components.tabbedpane.TabbedPane;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
@@ -87,7 +90,7 @@ import org.springframework.beans.factory.annotation.Autowired;
  *
  * </pre>
  */
-public class UserAdminController extends BasicController implements Activateable2 {
+public class UserAdminController extends BasicController implements Activateable2, TooledController {
 
 	// NLS support
 	private static final String NLS_ERROR_NOACCESS_TO_USER = "error.noaccess.to.user";
@@ -108,8 +111,12 @@ public class UserAdminController extends BasicController implements Activateable
 	private static final String NLS_VIEW_COMPETENCES		= "view.competences";
 
 	private VelocityContainer myContent;
+	private final TooledStackedPanel stackPanel;
 
-	private Identity myIdentity = null;
+	private final Roles managerRoles;
+	private Identity editedIdentity;
+	private final Roles editedRoles;
+	private final boolean allowedToManage;
 
 	// controllers used in tabbed pane
 	private TabbedPane userTabP;
@@ -127,8 +134,6 @@ public class UserAdminController extends BasicController implements Activateable
 	private ParticipantLecturesOverviewController lecturesCtrl;
 	private CertificateAndEfficiencyStatementListController efficicencyCtrl;
 
-	private final boolean isOlatAdmin;
-
 	@Autowired
 	private UserManager userManager;
 	@Autowired
@@ -152,17 +157,21 @@ public class UserAdminController extends BasicController implements Activateable
 	 * @param wControl
 	 * @param identity
 	 */
-	public UserAdminController(UserRequest ureq, WindowControl wControl, Identity identity) {
+	public UserAdminController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel, Identity identity) {
 		super(ureq, wControl);
-		isOlatAdmin = ureq.getUserSession().getRoles().isOLATAdmin();
-
-		myIdentity = identity;
+		this.stackPanel = stackPanel;
+		managerRoles = ureq.getUserSession().getRoles();
+		editedIdentity = identity;
+		editedRoles = securityManager.getRoles(editedIdentity);
 
-		if (allowedToManageUser(ureq, myIdentity)) {
+		allowedToManage = allowedToManageUser(ureq);
+		if (allowedToManage) {
 			myContent = createVelocityContainer("udispatcher");
 			backLink = LinkFactory.createLinkBack(myContent, this);
-			exportDataButton = LinkFactory.createButton("export.user.data", myContent, this);
-			exportDataButton.setIconLeftCSS("o_icon o_icon_download");
+			if(stackPanel == null) {
+				exportDataButton = LinkFactory.createButton("export.user.data", myContent, this);
+				exportDataButton.setIconLeftCSS("o_icon o_icon_download");
+			}
 			
 			userShortDescrCtr = new UserShortDescription(ureq, wControl, identity);
 			listenTo(userShortDescrCtr);
@@ -170,8 +179,8 @@ public class UserAdminController extends BasicController implements Activateable
 
 			setBackButtonEnabled(true); // default
 			setShowTitle(true);
-			initTabbedPane(myIdentity, ureq);
-			exposeUserDataToVC(ureq, myIdentity);
+			initTabbedPane(editedIdentity, ureq);
+			exposeUserDataToVC(ureq, editedIdentity);
 			putInitialPanel(myContent);
 		} else {
 			String supportAddr = WebappHelper.getMailConfig("mailSupport");
@@ -181,7 +190,15 @@ public class UserAdminController extends BasicController implements Activateable
 	}
 	
 	public Identity getEditedIdentity() {
-		return myIdentity;
+		return editedIdentity;
+	}
+
+	@Override
+	public void initTools() {
+		if(allowedToManage && stackPanel != null) {
+			exportDataButton = LinkFactory.createToolLink("exportUserData", translate("export.user.data"), this, "o_icon_download");
+			stackPanel.addTool(exportDataButton, Align.left);
+		}
 	}
 
 	@Override
@@ -243,8 +260,8 @@ public class UserAdminController extends BasicController implements Activateable
 		} else if (source == userProfileCtr){
 			if (event == Event.DONE_EVENT){
 				//reload profile data on top
-				myIdentity = securityManager.loadIdentityByKey(myIdentity.getKey());
-				exposeUserDataToVC(ureq, myIdentity);
+				editedIdentity = securityManager.loadIdentityByKey(editedIdentity.getKey());
+				exposeUserDataToVC(ureq, editedIdentity);
 				userProfileCtr.resetForm(ureq);
 			}
 		} else if(source == exportDataCtrl) {
@@ -265,10 +282,10 @@ public class UserAdminController extends BasicController implements Activateable
 	private void doExportData(UserRequest ureq) {
 		if(exportDataCtrl != null) return;
 		
-		exportDataCtrl = new UserDataExportController(ureq, getWindowControl(), myIdentity);
+		exportDataCtrl = new UserDataExportController(ureq, getWindowControl(), editedIdentity);
 		listenTo(exportDataCtrl);
 		
-		String fullname = userManager.getUserDisplayName(myIdentity);
+		String fullname = userManager.getUserDisplayName(editedIdentity);
 		String title = translate("export.user.data.title", new String[] { fullname });
 		cmc = new CloseableModalController(getWindowControl(), translate("close"), exportDataCtrl.getInitialComponent(),
 				true, title);
@@ -285,42 +302,23 @@ public class UserAdminController extends BasicController implements Activateable
 	 * @param identity
 	 * @return boolean
 	 */
-	private boolean allowedToManageUser(UserRequest ureq, Identity identity) {
+	private boolean allowedToManageUser(UserRequest ureq) {
 		// prevent editing of users that are in sysadmin / superadmin group
-		if(organisationService.hasRole(identity, OrganisationRoles.sysadmin)){
-			return getIdentity().equals(identity) || organisationService.hasRole(getIdentity(), OrganisationRoles.sysadmin);
-		}
-		if (isOlatAdmin) {
-			return true;
+		Roles identityRoles = securityManager.getRoles(editedIdentity);
+		if(identityRoles.hasRole(OrganisationRoles.sysadmin)){
+			return getIdentity().equals(editedIdentity)
+					|| organisationService.hasRole(getIdentity(), OrganisationRoles.sysadmin)
+					|| managerRoles.isManagerOf(OrganisationRoles.administrator, identityRoles)
+					|| managerRoles.isManagerOf(OrganisationRoles.rolesmanager, identityRoles);
 		}
-		
-		Roles identityRoles = securityManager.getRoles(identity);
 
-		// only admins can administrate admin and usermanager users
-		boolean isAdmin = identityRoles.isOLATAdmin();
-		boolean isUserManager = identityRoles.isUserManager();
-		if (isAdmin || isUserManager) {
-			return false;
-		}
-		// if user is author ony allowed to edit if configured
-		boolean isAuthor = identityRoles.isAuthor();
-		Boolean canManageAuthor = BaseSecurityModule.USERMANAGER_CAN_MANAGE_AUTHORS;
-		if (isAuthor && !canManageAuthor.booleanValue()) {
-			return false;
-		}
-		// if user is groupmanager ony allowed to edit if configured
-		boolean isGroupManager = identityRoles.isGroupManager();
-		Boolean canManageGroupmanager = BaseSecurityModule.USERMANAGER_CAN_MANAGE_GROUPMANAGERS;
-		if (isGroupManager && !canManageGroupmanager.booleanValue()) {
-			return false;
-		}
-		// if user is guest ony allowed to edit if configured
-		boolean isGuestOnly = identityRoles.isGuestOnly();
-		if (isGuestOnly) {
+		// if user is guest only allowed to edit if configured
+		if(identityRoles.isGuestOnly()) {
 			return false;
 		}
-		// passed all tests, current user is allowed to edit given identity
-		return true;
+		return managerRoles.isManagerOf(OrganisationRoles.administrator, identityRoles)
+				|| managerRoles.isManagerOf(OrganisationRoles.rolesmanager, identityRoles)
+				|| managerRoles.isManagerOf(OrganisationRoles.usermanager, identityRoles);
 	}
 
 	/**
@@ -334,13 +332,7 @@ public class UserAdminController extends BasicController implements Activateable
 		userTabP = new TabbedPane("userTabP", ureq.getLocale());
 		userTabP.addListener(this);
 
-		/**
-		 *  Determine, whether the user admin is or is not able to edit all fields in user
-		 *  profile form. The system admin is always able to do so.
-		 */
-		Boolean canEditAllFields = BaseSecurityModule.USERMANAGER_CAN_EDIT_ALL_PROFILE_FIELDS;
-
-		userProfileCtr = new ProfileAndHomePageEditController(ureq, getWindowControl(), identity, canEditAllFields.booleanValue());
+		userProfileCtr = new ProfileAndHomePageEditController(ureq, getWindowControl(), identity, true);
 		listenTo(userProfileCtr);
 		userTabP.addTab(translate(NLS_EDIT_UPROFILE), userProfileCtr.getInitialComponent());
 
@@ -357,26 +349,26 @@ public class UserAdminController extends BasicController implements Activateable
 				return pwdCtr.getInitialComponent();
 			});
 		}
+		
+		boolean isAdminOf = managerRoles.isManagerOf(OrganisationRoles.administrator, editedRoles);
+		boolean isUserManagerOf = managerRoles.isManagerOf(OrganisationRoles.usermanager, editedRoles);
+		boolean isRolesManagerOf = managerRoles.isManagerOf(OrganisationRoles.rolesmanager, editedRoles);
 
-		Boolean canAuth = BaseSecurityModule.USERMANAGER_ACCESS_TO_AUTH;
-		if (canAuth.booleanValue() || isOlatAdmin) {
+		if (isAdminOf) {
 			userTabP.addTab(translate(NLS_EDIT_UAUTH),  uureq -> {
 				authenticationsCtr =  new UserAuthenticationsEditorController(uureq, getWindowControl(), identity);
 				listenTo(authenticationsCtr);
 				return authenticationsCtr.getInitialComponent();
 			});
-		}
 
-		Boolean canProp = BaseSecurityModule.USERMANAGER_ACCESS_TO_PROP;
-		if (canProp.booleanValue() || isOlatAdmin) {
 			userTabP.addTab(translate(NLS_EDIT_UPROP), uureq -> {
-				propertiesCtr = new UserPropertiesController(uureq, getWindowControl(), identity);
+				propertiesCtr = new UserPropertiesController(uureq, getWindowControl(), identity, editedRoles);
 				listenTo(propertiesCtr);
 				return propertiesCtr.getInitialComponent();
 			});
 		}
 
-		Boolean canStartGroups = BaseSecurityModule.USERMANAGER_CAN_START_GROUPS;
+		Boolean canStartGroups = BaseSecurityModule.USERMANAGER_CAN_START_GROUPS;//true
 		userTabP.addTab(translate(NLS_VIEW_GROUPS),  uureq -> {
 			grpCtr = new GroupOverviewController(uureq, getWindowControl(), identity, canStartGroups);
 			listenTo(grpCtr);
@@ -389,28 +381,25 @@ public class UserAdminController extends BasicController implements Activateable
 			return courseCtr.getInitialComponent();
 		});
 
-		if (isOlatAdmin) {
+		if (isAdminOf) {
 			userTabP.addTab(translate(NLS_VIEW_ACCESS), uureq -> {
 				Controller accessCtr = new UserOrderController(uureq, getWindowControl(), identity);
 				listenTo(accessCtr);
 				return accessCtr.getInitialComponent();
 			});
-		}
 
-		if (isOlatAdmin) {
 			userTabP.addTab(translate(NLS_VIEW_EFF_STATEMENTS),  uureq -> {
 				efficicencyCtrl = new CertificateAndEfficiencyStatementListController(uureq, getWindowControl(), identity, true);
 				listenTo(efficicencyCtrl);
-				BreadcrumbedStackedPanel stackPanel = new BreadcrumbedStackedPanel("statements", getTranslator(), efficicencyCtrl);
-				stackPanel.pushController(translate(NLS_VIEW_EFF_STATEMENTS), efficicencyCtrl);
-				efficicencyCtrl.setBreadcrumbPanel(stackPanel);
-				stackPanel.setInvisibleCrumb(1);
-				return stackPanel;
+				BreadcrumbedStackedPanel efficiencyPanel = new BreadcrumbedStackedPanel("statements", getTranslator(), efficicencyCtrl);
+				efficiencyPanel.pushController(translate(NLS_VIEW_EFF_STATEMENTS), efficicencyCtrl);
+				efficicencyCtrl.setBreadcrumbPanel(efficiencyPanel);
+				efficiencyPanel.setInvisibleCrumb(1);
+				return efficiencyPanel;
 			});
 		}
 
-		Boolean canSubscriptions = BaseSecurityModule.USERMANAGER_CAN_MODIFY_SUBSCRIPTIONS;
-		if (canSubscriptions.booleanValue() || isOlatAdmin) {
+		if (isUserManagerOf || isRolesManagerOf || isAdminOf) {
 			userTabP.addTab(translate(NLS_VIEW_SUBSCRIPTIONS),  uureq -> {
 				Controller subscriptionsCtr = new NotificationSubscriptionController(uureq, getWindowControl(), identity, true, true);
 				listenTo(subscriptionsCtr);
@@ -424,8 +413,7 @@ public class UserAdminController extends BasicController implements Activateable
 			return rolesCtr.getInitialComponent();
 		});
 
-		Boolean canQuota = BaseSecurityModule.USERMANAGER_ACCESS_TO_QUOTA;
-		if (canQuota.booleanValue() || isOlatAdmin) {
+		if (isUserManagerOf || isRolesManagerOf || isAdminOf) {
 			userTabP.addTab(translate(NLS_EDIT_UQUOTA),  uureq -> {
 				String relPath = FolderConfig.getUserHomes() + "/" + identity.getName();
 				List<Organisation> identityOrganisations = organisationService.getOrganisations(identity, OrganisationRoles.values());
@@ -438,11 +426,11 @@ public class UserAdminController extends BasicController implements Activateable
 			userTabP.addTab(translate(NLS_VIEW_LECTURES),  uureq -> {
 				lecturesCtrl = new ParticipantLecturesOverviewController(uureq, getWindowControl(), identity, true, true, true, true);
 				listenTo(lecturesCtrl);
-				BreadcrumbedStackedPanel stackPanel = new BreadcrumbedStackedPanel("lectures", getTranslator(), lecturesCtrl);
-				stackPanel.pushController(translate(NLS_VIEW_LECTURES), lecturesCtrl);
-				lecturesCtrl.setBreadcrumbPanel(stackPanel);
-				stackPanel.setInvisibleCrumb(1);
-				return stackPanel;
+				BreadcrumbedStackedPanel lecturesPanel = new BreadcrumbedStackedPanel("lectures", getTranslator(), lecturesCtrl);
+				lecturesPanel.pushController(translate(NLS_VIEW_LECTURES), lecturesCtrl);
+				lecturesCtrl.setBreadcrumbPanel(lecturesPanel);
+				lecturesPanel.setInvisibleCrumb(1);
+				return lecturesPanel;
 			});
 		}
 		
@@ -450,11 +438,11 @@ public class UserAdminController extends BasicController implements Activateable
 			userTabP.addTab(translate(NLS_VIEW_COMPETENCES),  uureq -> {
 				competencesCtrl = new IdentityCompetencesController(uureq, getWindowControl(), identity);
 				listenTo(competencesCtrl);
-				BreadcrumbedStackedPanel stackPanel = new BreadcrumbedStackedPanel("competences", getTranslator(), competencesCtrl);
-				stackPanel.pushController(translate(NLS_VIEW_COMPETENCES), competencesCtrl);
-				competencesCtrl.setBreadcrumbPanel(stackPanel);
-				stackPanel.setInvisibleCrumb(1);
-				return stackPanel;
+				BreadcrumbedStackedPanel competencePanel = new BreadcrumbedStackedPanel("competences", getTranslator(), competencesCtrl);
+				competencePanel.pushController(translate(NLS_VIEW_COMPETENCES), competencesCtrl);
+				competencesCtrl.setBreadcrumbPanel(competencePanel);
+				competencePanel.setInvisibleCrumb(1);
+				return competencePanel;
 			});
 		}
 
@@ -463,8 +451,9 @@ public class UserAdminController extends BasicController implements Activateable
 	}
 
 	private boolean isPasswordChangesAllowed(Identity identity) {
-		Boolean canChangePwd = BaseSecurityModule.USERMANAGER_CAN_MODIFY_PWD;
-		if (canChangePwd.booleanValue()  || isOlatAdmin) {
+		if (managerRoles.isManagerOf(OrganisationRoles.administrator, editedRoles)
+				|| managerRoles.isManagerOf(OrganisationRoles.rolesmanager, editedRoles)
+				|| managerRoles.isManagerOf(OrganisationRoles.usermanager, editedRoles)) {
 			// show pwd form only if user has also right to create new passwords in case
 			// of a user that has no password yet
 			if(ldapLoginModule.isLDAPEnabled() && ldapLoginManager.isIdentityInLDAPSecGroup(identity)) {
@@ -472,11 +461,8 @@ public class UserAdminController extends BasicController implements Activateable
 				return ldapLoginModule.isPropagatePasswordChangedOnLdapServer();
 			}
 
-			Boolean canCreatePwd = BaseSecurityModule.USERMANAGER_CAN_CREATE_PWD;
 			Authentication olatAuth = securityManager.findAuthentication(identity, BaseSecurityModule.getDefaultAuthProviderIdentifier());
-			if (olatAuth != null || canCreatePwd.booleanValue() || isOlatAdmin) {
-				return true;
-			}
+			return olatAuth != null;
 		}
 
 		return false;
diff --git a/src/main/java/org/olat/admin/user/UserSearchController.java b/src/main/java/org/olat/admin/user/UserSearchController.java
index 17d45d06446..fcf19000b40 100644
--- a/src/main/java/org/olat/admin/user/UserSearchController.java
+++ b/src/main/java/org/olat/admin/user/UserSearchController.java
@@ -27,6 +27,7 @@ import java.util.Map;
 
 import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.BaseSecurityModule;
+import org.olat.basesecurity.IdentityPowerSearchQueries;
 import org.olat.basesecurity.OrganisationRoles;
 import org.olat.basesecurity.OrganisationService;
 import org.olat.basesecurity.SearchIdentityParams;
@@ -128,6 +129,8 @@ public class UserSearchController extends BasicController {
 	protected BaseSecurityModule securityModule;
 	@Autowired
 	protected OrganisationService organisationService;
+	@Autowired
+	private IdentityPowerSearchQueries identitySearchQueries;
 	
 	/**
 	 * 
@@ -353,6 +356,6 @@ public class UserSearchController extends BasicController {
 		SearchIdentityParams params = new SearchIdentityParams(login, userPropertiesSearch, userPropertiesAsIntersectionSearch, null, 
 				null, null, null, null, null, Identity.STATUS_VISIBLE_LIMIT);
 		params.setOrganisations(searchableOrganisations);
-		return securityManager.getIdentitiesByPowerSearch(params, 0, maxResults);
+		return identitySearchQueries.getIdentitiesByPowerSearch(params, 0, maxResults);
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/admin/user/UserSearchFlexiController.java b/src/main/java/org/olat/admin/user/UserSearchFlexiController.java
index f868aec1e6b..348eca9ef64 100644
--- a/src/main/java/org/olat/admin/user/UserSearchFlexiController.java
+++ b/src/main/java/org/olat/admin/user/UserSearchFlexiController.java
@@ -29,6 +29,7 @@ import java.util.Set;
 
 import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.BaseSecurityModule;
+import org.olat.basesecurity.IdentityPowerSearchQueries;
 import org.olat.basesecurity.OrganisationRoles;
 import org.olat.basesecurity.OrganisationService;
 import org.olat.basesecurity.SearchIdentityParams;
@@ -119,6 +120,8 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController {
 	private BaseSecurityModule securityModule;
 	@Autowired
 	private OrganisationService organisationService;
+	@Autowired
+	private IdentityPowerSearchQueries identitySearchQueries;
 
 	/**
 	 * @param ureq
@@ -270,7 +273,7 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController {
 						List<Identity> selectedIdentities = Collections.singletonList(chosenIdent);
 						userTableModel.setObjects(selectedIdentities);
 						Set<Integer> selectedIndex = new HashSet<>();
-						selectedIndex.add(new Integer(0));
+						selectedIndex.add(Integer.valueOf(0));
 						tableEl.setMultiSelectedIndex(selectedIndex);
 					}
 				}
@@ -289,8 +292,9 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController {
 	
 	private boolean validateForm(UserRequest ureq) {
 		// override for sys admins
-		if (ureq.getUserSession() != null && ureq.getUserSession().getRoles() != null
-				&& ureq.getUserSession().getRoles().isOLATAdmin()) {
+		UserSession usess = ureq.getUserSession();
+		if (usess != null && usess.getRoles() != null
+				&& (usess.getRoles().isAdministrator() || usess.getRoles().isRolesManager())) {
 			return true;
 		}
 		
@@ -456,6 +460,6 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController {
 				userPropertiesSearch, userPropertiesAsIntersectionSearch, null, 
 				null, null, null, null, null, Identity.STATUS_VISIBLE_LIMIT);
 		params.setOrganisations(searchableOrganisations);
-		return securityManager.getIdentitiesByPowerSearch(params, 0, -1);
+		return identitySearchQueries.getIdentitiesByPowerSearch(params, 0, -1);
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/admin/user/UserSearchForm.java b/src/main/java/org/olat/admin/user/UserSearchForm.java
index 5e5f21adcbe..eaac2c44869 100644
--- a/src/main/java/org/olat/admin/user/UserSearchForm.java
+++ b/src/main/java/org/olat/admin/user/UserSearchForm.java
@@ -37,6 +37,7 @@ import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.StringHelper;
+import org.olat.core.util.UserSession;
 import org.olat.core.util.Util;
 import org.olat.user.UserManager;
 import org.olat.user.propertyhandlers.EmailProperty;
@@ -94,8 +95,9 @@ public class UserSearchForm extends FormBasicController {
 	
 	private boolean validateForm(UserRequest ureq) {
 		// override for sys admins
-		if (ureq.getUserSession() != null && ureq.getUserSession().getRoles() != null
-				&& ureq.getUserSession().getRoles().isOLATAdmin()) {
+		UserSession usess = ureq.getUserSession();
+		if (usess != null && usess.getRoles() != null
+				&& (usess.getRoles().isAdministrator() || usess.getRoles().isRolesManager())) {
 			return true;
 		}
 		
@@ -115,9 +117,6 @@ public class UserSearchForm extends FormBasicController {
 			if (StringHelper.containsNonWhitespace(uiValue)) {
 				full.append(uiValue.trim());
 				filled = true;
-			}else{
-				//its an empty field
-				filled = filled || false;
 			}
 
 			lastFormElement = ui;
@@ -137,8 +136,8 @@ public class UserSearchForm extends FormBasicController {
 			lastFormElement.setErrorKey("error.search.form.no.wildcard.dublicates", null);
 			return false;
 		}		
-		int MIN_LENGTH = 4;
-		if ( fullString.length() < MIN_LENGTH ) {
+		int minLength = 4;
+		if ( fullString.length() < minLength ) {
 			lastFormElement.setErrorKey("error.search.form.to.short", null);
 			return false;
 		}
@@ -184,11 +183,6 @@ public class UserSearchForm extends FormBasicController {
 		}
 	}
 
-	/**
-	 * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#formInnerEvent(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.components.form.flexible.FormItem,
-	 *      org.olat.core.gui.components.form.flexible.impl.FormEvent)
-	 */
 	@Override
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
 		if (source == searchButton) {
diff --git a/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java b/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java
index e28296913e9..058c124ae83 100644
--- a/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java
+++ b/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java
@@ -24,42 +24,19 @@
 */
 package org.olat.admin.user;
 
-import java.util.ArrayList;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
 
-import org.olat.admin.user.bulkChange.UserBulkChangeManager;
-import org.olat.admin.user.bulkChange.UserBulkChangeStep00;
-import org.olat.admin.user.bulkChange.UserBulkChanges;
-import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.BaseSecurityModule;
-import org.olat.basesecurity.OrganisationRoles;
 import org.olat.basesecurity.SearchIdentityParams;
-import org.olat.basesecurity.events.SingleIdentityChosenEvent;
-import org.olat.core.commons.fullWebApp.popup.BaseFullWebappPopupLayoutFactory;
-import org.olat.core.commons.persistence.PersistenceHelper;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
-import org.olat.core.gui.components.link.Link;
-import org.olat.core.gui.components.link.LinkFactory;
 import org.olat.core.gui.components.stack.TooledStackedPanel;
-import org.olat.core.gui.components.table.Table;
-import org.olat.core.gui.components.table.TableEvent;
-import org.olat.core.gui.components.table.TableGuiConfiguration;
-import org.olat.core.gui.components.table.TableMultiSelectEvent;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
-import org.olat.core.gui.control.creator.ControllerCreator;
 import org.olat.core.gui.control.generic.dtabs.Activateable2;
-import org.olat.core.gui.control.generic.popup.PopupBrowserWindow;
-import org.olat.core.gui.control.generic.wizard.Step;
-import org.olat.core.gui.control.generic.wizard.StepRunnerCallback;
-import org.olat.core.gui.control.generic.wizard.StepsMainRunController;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Organisation;
@@ -67,11 +44,7 @@ import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.StateEntry;
 import org.olat.core.id.context.StateMapped;
 import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
-import org.olat.core.util.mail.ContactList;
-import org.olat.core.util.mail.ContactMessage;
 import org.olat.core.util.resource.OresHelper;
-import org.olat.modules.co.ContactFormController;
-import org.olat.user.UserInfoMainController;
 import org.olat.user.UserManager;
 import org.olat.user.ui.admin.UserSearchTableController;
 import org.olat.util.logging.activity.LoggingResourceable;
@@ -92,26 +65,12 @@ import org.springframework.beans.factory.annotation.Autowired;
  */
 public class UsermanagerUserSearchController extends BasicController implements Activateable2 {
 
-	private static final String CMD_MAIL = "exeMail";
-	private static final String CMD_BULKEDIT = "bulkEditUsers";
-
-	private VelocityContainer userListVC, userSearchVC, mailVC;
-
 	private TooledStackedPanel stackedPanel;
 
 	private UsermanagerUserSearchForm searchFormCtrl;
 	private UserSearchTableController tableCtr;
-	private List<Identity> identitiesList;
-	private List<Identity> selectedIdentities;
-	private List<String> notUpdatedIdentities = new ArrayList<>();
-	private ExtendedIdentitiesTableDataModel tdm;
-	private ContactFormController contactCtr;
-	private Link backFromMail;
-	private Link backFromList;
-	private boolean showEmailButton = true;
-	private StepsMainRunController userBulkChangeStepsController;
-	
-	
+
+	private final boolean showEmailButton;
 	private final boolean isAdministrativeUser;
 	private List<Organisation> manageableOrganisations;
 	private SearchIdentityParams identityQueryParams;
@@ -120,10 +79,6 @@ public class UsermanagerUserSearchController extends BasicController implements
 	private UserManager userManager;
 	@Autowired
 	private BaseSecurityModule securityModule;
-	@Autowired
-	private BaseSecurity securityManager;
-	@Autowired
-	private UserBulkChangeManager ubcMan;
 
 	/**
 	 * Constructor to trigger the user search workflow using a generic search form
@@ -138,27 +93,15 @@ public class UsermanagerUserSearchController extends BasicController implements
 		
 		this.stackedPanel = stackedPanel;
 		this.manageableOrganisations = manageableOrganisations;
+		this.showEmailButton = true;
 		
 		isAdministrativeUser = securityModule.isUserAllowedAdminProps(ureq.getUserSession().getRoles());
-		
-		userSearchVC = createVelocityContainer("usermanagerUsersearch");
-
-		mailVC = createVelocityContainer("usermanagerMail");
-		backFromMail = LinkFactory.createLinkBack(mailVC, this);
-
-		userListVC = createVelocityContainer("usermanagerUserlist");
-
-		backFromList = LinkFactory.createLinkBack(userListVC, this);
-
-		userListVC.contextPut("showBackButton", Boolean.TRUE);
-		userListVC.contextPut("emptyList", Boolean.FALSE);
-		userListVC.contextPut("showTitle", Boolean.TRUE);
 
 		searchFormCtrl = new UsermanagerUserSearchForm(ureq, wControl, isAdministrativeUser, manageableOrganisations);
 		listenTo(searchFormCtrl);
 		
+		VelocityContainer userSearchVC = createVelocityContainer("usermanagerUsersearch");
 		userSearchVC.put("usersearch", searchFormCtrl.getInitialComponent());
-
 		putInitialPanel(userSearchVC);
 	}
 	
@@ -180,17 +123,12 @@ public class UsermanagerUserSearchController extends BasicController implements
 		super(ureq, wControl);
 		setTranslator(userManager.getPropertyHandlerTranslator(getTranslator()));
 		this.stackedPanel = stackedPanel;
+		this.showEmailButton = showEmailButton;
 
 		identityQueryParams = predefinedQuery;
 		isAdministrativeUser = securityModule.isUserAllowedAdminProps(ureq.getUserSession().getRoles());
-
-		mailVC = createVelocityContainer("usermanagerMail");
-		backFromMail = LinkFactory.createLinkBack(mailVC, this);
-
-		userListVC = createVelocityContainer("usermanagerUserlist");
-		this.showEmailButton = showEmailButton;
 		
-		tableCtr = new UserSearchTableController(ureq, getWindowControl(), stackedPanel, true);
+		tableCtr = new UserSearchTableController(ureq, getWindowControl(), stackedPanel, showEmailButton, true);
 		listenTo(tableCtr);
 		tableCtr.loadModel(identityQueryParams);
 		putInitialPanel(tableCtr.getInitialComponent());
@@ -207,27 +145,24 @@ public class UsermanagerUserSearchController extends BasicController implements
 	 * @param showEmailButton
 	 */
 	public UsermanagerUserSearchController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackedPanel,
-			List<Identity> identitiesList, Integer status, boolean showEmailButton, boolean showTitle) {
+			List<Identity> identitiesList, boolean showEmailButton, boolean showTitle) {
 		super(ureq, wControl);
 		setTranslator(userManager.getPropertyHandlerTranslator(getTranslator()));
 		this.stackedPanel = stackedPanel;
+		this.showEmailButton = showEmailButton;
 		
 		isAdministrativeUser = securityModule.isUserAllowedAdminProps(ureq.getUserSession().getRoles());
 
-		mailVC = createVelocityContainer("usermanagerMail");
-
-		backFromMail = LinkFactory.createLinkBack(mailVC, this);
-
-		userListVC = createVelocityContainer("usermanagerUserlist");
-		this.showEmailButton = showEmailButton;
-
-		userListVC.contextPut("showBackButton", Boolean.FALSE);
-		userListVC.contextPut("showTitle", Boolean.valueOf(showTitle));
-
-		tableCtr = new UserSearchTableController(ureq, getWindowControl(), stackedPanel, true);
+		tableCtr = new UserSearchTableController(ureq, getWindowControl(), stackedPanel, showEmailButton, true);
 		listenTo(tableCtr);
 		tableCtr.loadModel(identitiesList);
-		putInitialPanel(tableCtr.getInitialComponent());
+		
+		if(showTitle) {
+			VelocityContainer userSearchVC = createVelocityContainer("usermanagerUsersearch");
+			userSearchVC.put("usersearch", tableCtr.getInitialComponent());
+		} else {
+			putInitialPanel(tableCtr.getInitialComponent());
+		}
 	}
 	
 	public WindowControl getTableControl() {
@@ -240,7 +175,7 @@ public class UsermanagerUserSearchController extends BasicController implements
 			StateMapped searchState = (StateMapped)state;
 			searchFormCtrl.setStateEntry(searchState);
 			
-			if(entries != null && entries.size() > 0) {
+			if(entries != null && !entries.isEmpty()) {
 				String table = entries.get(0).getOLATResourceable().getResourceableTypeName();
 				if("table".equals(table)) {
 					entries.remove(0);
@@ -248,114 +183,12 @@ public class UsermanagerUserSearchController extends BasicController implements
 				}
 			}
 		}
-		
-		if(entries == null || entries.isEmpty()) return;
-		
-		for(int i=0; i<entries.size(); i++) {
-			String resourceType = entries.get(i).getOLATResourceable().getResourceableTypeName();
-			if("Identity".equalsIgnoreCase(resourceType)) {
-				Long identityKey = entries.get(i).getOLATResourceable().getResourceableId();
-				Identity found = null;
-				if(tdm != null) {
-					for(Identity identity:tdm.getObjects()) {
-						if(identityKey.equals(identity.getKey())) {
-							found = identity;
-						}
-					}
-				}
-				
-				if(found == null) {
-					found = securityManager.loadIdentityByKey(identityKey);
-					if(found == null) return;
-					
-					List<Identity> foundIdentites = new ArrayList<>();
-					foundIdentites.add(found);
-					initUserListCtr(ureq, foundIdentites, 0);
-				}
-				fireEvent(ureq, new SingleIdentityChosenEvent(found));
-			}
-		}
-	}
-
-	/**
-	 * Remove the given identites from the list of identites in the table model
-	 * and reinitialize the table controller
-	 * 
-	 * @param ureq
-	 * @param tobeRemovedIdentities
-	 */
-	public void removeIdentitiesFromSearchResult(UserRequest ureq, List<Identity> tobeRemovedIdentities) {
-		PersistenceHelper.removeObjectsFromList(identitiesList, tobeRemovedIdentities);
-		initUserListCtr(ureq, identitiesList, null);
-		userListVC.put("userlist", tableCtr.getInitialComponent());
-	}
-
-	/**
-	 * Add the given identities to the list of identities in the table model 
-	 * and reinitialize the table controller
-	 * 
-	 * @param ureq
-	 * @param tobeAddedIdentities
-	 */
-	public void addIdentitiesToSearchResult(UserRequest ureq, List<Identity> tobeAddedIdentities) {
-		Set<Identity> identitiesSet = new HashSet<>();
-		if(identitiesList != null) {
-			identitiesSet.addAll(identitiesList);
-		}
-		for (Identity toBeAdded : tobeAddedIdentities) {
-			if (!identitiesSet.contains(toBeAdded)) {
-				identitiesList.add(toBeAdded);
-			}
-		}
-		initUserListCtr(ureq, identitiesList, null);
-		userListVC.put("userlist", tableCtr.getInitialComponent());		
 	}
 
 	@Override
 	public void event(UserRequest ureq, Component source, Event event) {
 		//
 	}
-
-	/**
-	 * Initialize the table controller using the list of identities
-	 * 
-	 * @param ureq
-	 * @param identitiesList
-	 */
-	private void initUserListCtr(UserRequest ureq, List<Identity> myIdentities, Integer searchStatusField) {
-		removeAsListenerAndDispose(tableCtr);
-		
-		boolean actionEnabled = true;
-		TableGuiConfiguration tableConfig = new TableGuiConfiguration();
-		tableConfig.setTableEmptyMessage(translate("error.no.user.found"));
-		if ((searchStatusField != null) && (searchStatusField.equals(Identity.STATUS_DELETED))) {
-			actionEnabled = false;
-		}
-		tableConfig.setDownloadOffered(true);
-		tableConfig.setPreferencesOffered(true, "ExtendedIdentitiesTable");		
-		tableConfig.setTableEmptyMessage(translate("error.no.user.found"));
-		
-		tdm = new ExtendedIdentitiesTableDataModel(ureq, myIdentities, actionEnabled);
-		
-		OLATResourceable ores = OresHelper.createOLATResourceableInstance("table", 0l);
-		ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
-		WindowControl bwControl = addToHistory(ureq, ores, null);
-		tableCtr = new UserSearchTableController(ureq, bwControl, stackedPanel, true);
-		listenTo(tableCtr);
-		
-		/*
-		
-		if (showEmailButton) {
-			tableCtr.addMultiSelectAction("command.mail", CMD_MAIL);
-		}
-		if (actionEnabled){
-			tableCtr.addMultiSelectAction("action.bulkedit", CMD_BULKEDIT);
-		}
-		if (showEmailButton || actionEnabled){
-			tableCtr.setMultiSelect(true);
-		}
-		*/
-	}
 	
 	private void doPushSearch(UserRequest ureq) {
 		identityQueryParams = searchFormCtrl.getSearchIdentityParams();
@@ -366,7 +199,7 @@ public class UsermanagerUserSearchController extends BasicController implements
 		OLATResourceable ores = OresHelper.createOLATResourceableInstance("table", 0l);
 		ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
 		WindowControl bwControl = addToHistory(ureq, ores, null);
-		tableCtr = new UserSearchTableController(ureq, bwControl, stackedPanel, true);
+		tableCtr = new UserSearchTableController(ureq, bwControl, stackedPanel, showEmailButton, true);
 		listenTo(tableCtr);
 		tableCtr.loadModel(identityQueryParams);
 		stackedPanel.pushController("Results", tableCtr);
@@ -388,171 +221,12 @@ public class UsermanagerUserSearchController extends BasicController implements
 			} else if (event == Event.CANCELLED_EVENT) {
 				fireEvent(ureq, Event.CANCELLED_EVENT);
 			}
-		} else if (source == tableCtr) {
-			if (event.getCommand().equals(Table.COMMANDLINK_ROWACTION_CLICKED)) {
-				TableEvent te = (TableEvent) event;
-				String actionid = te.getActionId();
-				if (actionid.equals(ExtendedIdentitiesTableDataModel.COMMAND_SELECTUSER)) {
-					int rowid = te.getRowId();
-					Identity foundIdentity = tdm.getObject(rowid);
-					// Tell parentController that a subject has been found
-					fireEvent(ureq, new SingleIdentityChosenEvent(foundIdentity));
-				} else if (actionid.equals(ExtendedIdentitiesTableDataModel.COMMAND_VCARD)) {
-					// get identity and open new visiting card controller in new window
-					int rowid = te.getRowId();
-					final Identity identity = tdm.getObject(rowid);
-					ControllerCreator userInfoMainControllerCreator = new ControllerCreator() {
-						@Override
-						public Controller createController(UserRequest lureq, WindowControl lwControl) {
-							return new UserInfoMainController(lureq, lwControl, identity, true, false);
-						}
-					};
-					// wrap the content controller into a full header layout
-					ControllerCreator layoutCtrlr = BaseFullWebappPopupLayoutFactory.createAuthMinimalPopupLayout(ureq, userInfoMainControllerCreator);
-					// open in new browser window
-					PopupBrowserWindow pbw = getWindowControl().getWindowBackOffice().getWindowManager()
-							.createNewPopupBrowserWindowFor(ureq, layoutCtrlr);
-					pbw.open(ureq);
-				}
-			}
-			if (event instanceof TableMultiSelectEvent) {
-				// Multiselect events
-				TableMultiSelectEvent tmse = (TableMultiSelectEvent) event;
-				if (tmse.getAction().equals(CMD_BULKEDIT)) {
-					if (tmse.getSelection().isEmpty()) {
-						// empty selection
-						showWarning("msg.selectionempty");
-						return;
-					}
-					selectedIdentities = tdm.getIdentities(tmse.getSelection());
-					// valid selection: load in wizard
-					final UserBulkChanges userBulkChanges = new UserBulkChanges();
-					Step start = new UserBulkChangeStep00(ureq, selectedIdentities, userBulkChanges);
-					// callback executed in case wizard is finished.
-					StepRunnerCallback finish = (ureq1, wControl1, runContext) -> {
-						// all information to do now is within the runContext saved
-						boolean hasChanges = false;
-						try {
-							if (userBulkChanges.isValidChange()){
-								Map<String, String> attributeChangeMap = userBulkChanges.getAttributeChangeMap();
-								Map<OrganisationRoles, String> roleChangeMap = userBulkChanges.getRoleChangeMap();
-								List<Long> ownGroups = userBulkChanges.getOwnerGroups();
-								List<Long> partGroups = userBulkChanges.getParticipantGroups();
-								if (!attributeChangeMap.isEmpty() || !roleChangeMap.isEmpty() || !ownGroups.isEmpty() || !partGroups.isEmpty()){
-									Identity addingIdentity = ureq1.getIdentity();
-									ubcMan.changeSelectedIdentities(selectedIdentities, userBulkChanges, notUpdatedIdentities,
-										isAdministrativeUser, getTranslator(), addingIdentity);
-									hasChanges = true;
-								}
-							}
-						} catch (Exception e) {
-							logError("", e);
-						}
-						// signal correct completion and tell if changes were made or not.
-						return hasChanges ? StepsMainRunController.DONE_MODIFIED : StepsMainRunController.DONE_UNCHANGED;
-					};
-
-					removeAsListenerAndDispose(userBulkChangeStepsController);
-					userBulkChangeStepsController = new StepsMainRunController(ureq, getWindowControl(), start, finish, null,
-							translate("bulkChange.title"), "o_sel_user_bulk_change_wizard");
-					listenTo(userBulkChangeStepsController);
-					
-					getWindowControl().pushAsModalDialog(userBulkChangeStepsController.getInitialComponent());
-
-				} else if (tmse.getAction().equals(CMD_MAIL)) {
-					if (tmse.getSelection().isEmpty()) {
-						// empty selection
-						showWarning("msg.selectionempty");
-						return;
-					}
-					// create e-mail message
-					ContactMessage cmsg = new ContactMessage(ureq.getIdentity());
-
-					selectedIdentities = tdm.getIdentities(tmse.getSelection());
-					ContactList contacts = new ContactList(translate("mailto.userlist"));
-					contacts.addAllIdentites(selectedIdentities);
-					cmsg.addEmailTo(contacts);
-
-					// create contact form controller with ContactMessage
-					removeAsListenerAndDispose(contactCtr);
-					contactCtr = new ContactFormController(ureq, getWindowControl(), true, false, false, cmsg);
-					listenTo(contactCtr);
-
-					mailVC.put("mailform", contactCtr.getInitialComponent());
-					//panel.setContent(mailVC);
-				}
-			}
-		} else if (source == contactCtr) {
-
-		} else if (source == userBulkChangeStepsController) {
-			if (event == Event.CANCELLED_EVENT) {
-				getWindowControl().pop();
-			} else if (event == Event.CHANGED_EVENT) {
-				getWindowControl().pop();
-				Integer selIdentCount = selectedIdentities.size();
-				if (notUpdatedIdentities.size() > 0) {
-					Integer notUpdatedIdentCount = notUpdatedIdentities.size();
-					Integer sucChanges = selIdentCount - notUpdatedIdentCount;
-					String changeErrors = "";
-					for (String err : notUpdatedIdentities) {
-						changeErrors += err + "<br />";
-					}
-					getWindowControl().setError(translate("bulkChange.partialsuccess",
-							new String[] { sucChanges.toString(), selIdentCount.toString(), changeErrors }));
-				} else {
-					showInfo("bulkChange.success");
-				}
-				// update table model - has changed
-				reloadDataModel(ureq);
-
-			} else if (event == Event.DONE_EVENT){
-				showError("bulkChange.failed");
-			}
-			
-		}
-	}
-
-	/**
-	 * Reload the currently used identitiesList and rebuild the table controller
-	 * 
-	 * @param ureq
-	 */
-	private void reloadDataModel(UserRequest ureq) {
-		if (identitiesList == null) return;
-		for (int i = 0; i < identitiesList.size(); i++) {
-			Identity ident = identitiesList.get(i);
-			Identity refrshed = securityManager.loadIdentityByKey(ident.getKey());
-			identitiesList.set(i, refrshed);
-		}
-		initUserListCtr(ureq, identitiesList, null);
-		userListVC.put("userlist", tableCtr.getInitialComponent());
-	}
-
-	/**
-	 * Reload the identity used currently in the workflow and in the currently
-	 * activated user table list model. The identity will be reloaded from the
-	 * database to have accurate values.
-	 */
-	public void reloadFoundIdentity(Identity editedIdentity) {
-		if(editedIdentity == null) return;//nothing to replace
-		
-		List<Identity> identities = tdm.getObjects();
-		int index = identities.indexOf(editedIdentity);
-		if(index >= 0) {
-			// reload the found identity
-			Identity reloadedIdentity = securityManager.loadIdentityByKey(editedIdentity.getKey());
-			// replace the found identity in the table list model to display changed
-			identities.set(index, reloadedIdentity);
 		}
+		super.event(ureq, source, event);
 	}
 
-	/**
-	 * 
-	 * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
-	 */
 	@Override
 	protected void doDispose() {
 		//
 	}
-
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/admin/user/_content/udispatcher.html b/src/main/java/org/olat/admin/user/_content/udispatcher.html
index b62cb943d4f..1bee7b63589 100644
--- a/src/main/java/org/olat/admin/user/_content/udispatcher.html
+++ b/src/main/java/org/olat/admin/user/_content/udispatcher.html
@@ -10,7 +10,9 @@
 	$r.render("userShortDescription")
 	</div>
 </div>
+#if($r.available("export.user.data"))
 <div class="o_button_group o_button_group_right">
 	$r.render("export.user.data")
 </div>
+#end
 $r.render("userTabP")
\ No newline at end of file
diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_de.properties
index ca4aaf4919b..5806a7c8be1 100644
--- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_de.properties
@@ -92,14 +92,18 @@ rightsForm.isAnonymous=Benutzertyp
 rightsForm.isAnonymous.false=Registrierter Benutzer
 rightsForm.isAnonymous.true=Anonymer Gast
 rightsForm.isAuthor=Autor
-rightsForm.isCoach=Betreuer
 rightsForm.isCurriculummanager=Curriculumverwalter
 rightsForm.isGroupmanager=Gruppenverwalter
 rightsForm.isInstitutionalResourceManager=Lernressourcenverwalter
 rightsForm.isInstitutionalResourceManager.institution=Lernressourcenverwalter ({0})
 rightsForm.isInvitee=Einladung
+rightsForm.isLecturemanager=Lektionblockverwalter
+rightsForm.isLinemanager=Line manager
 rightsForm.isLoginDenied=Login gesperrt
 rightsForm.isPoolmanager=Poolverwalter
+rightsForm.isPrincipal=Principal
+rightsForm.isQualitymanager=Qualityverwalter
+rightsForm.isRolesmanager=Rollenverwalter
 rightsForm.isUser=Benutzer
 rightsForm.isUsermanager=Benutzerverwalter
 rightsForm.roles=Rollen
diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_en.properties
index 02d8a42efb2..2954ab5a3c8 100644
--- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_en.properties
@@ -92,14 +92,18 @@ rightsForm.isAnonymous=User type
 rightsForm.isAnonymous.false=System user
 rightsForm.isAnonymous.true=Anonymous guest
 rightsForm.isAuthor=Author
-rightsForm.isCoach=Coach
 rightsForm.isCurriculummanager=Curriculum manager
 rightsForm.isGroupmanager=Group management
 rightsForm.isInstitutionalResourceManager=Learning resource manager
 rightsForm.isInstitutionalResourceManager.institution=Learning resource manager ({0})
 rightsForm.isInvitee=Invitee
+rightsForm.isLecturemanager=Lectures manager
+rightsForm.isLinemanager=Line manager
 rightsForm.isLoginDenied=Login locked
 rightsForm.isPoolmanager=Question bank manager
+rightsForm.isPrincipal=Principal
+rightsForm.isQualitymanager=Quality manager
+rightsForm.isRolesmanager=Roles manager
 rightsForm.isUser=User
 rightsForm.isUsermanager=User management
 rightsForm.roles=Roles
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 dd7973fac57..366dcd295fb 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeManager.java
+++ b/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeManager.java
@@ -214,7 +214,7 @@ public class UserBulkChangeManager implements InitializingBean {
 
 			// set status
 			if (userBulkChanges.getStatus() != null) {
-				Integer status = userBulkChanges.getStatus().intValue();
+				Integer status = userBulkChanges.getStatus();
 
 				int oldStatus = identity.getStatus();
 				String oldStatusText = (oldStatus == Identity.STATUS_PERMANENT ? "permanent" : (oldStatus == Identity.STATUS_ACTIV ? "active" : (oldStatus == Identity.STATUS_LOGIN_DENIED ? "login_denied" : (oldStatus == Identity.STATUS_DELETED ? "deleted" : "unknown"))));
diff --git a/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeStep00.java b/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeStep00.java
index 4bc3fd36475..8b1cb770abf 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeStep00.java
+++ b/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeStep00.java
@@ -47,7 +47,6 @@ import org.olat.core.gui.control.generic.wizard.StepFormController;
 import org.olat.core.gui.control.generic.wizard.StepsEvent;
 import org.olat.core.gui.control.generic.wizard.StepsRunContext;
 import org.olat.core.id.Identity;
-import org.olat.core.id.Roles;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.i18n.I18nManager;
 import org.olat.user.ProfileFormController;
@@ -70,8 +69,7 @@ class UserBulkChangeStep00 extends BasicStep {
 	private static final String usageIdentifyer = UserBulkChangeStep00.class.getCanonicalName();
 	private static final String usageIdentifyerForAllProperties = ProfileFormController.class.getCanonicalName();
 	
-	private final boolean isAdministrativeUser;
-	private final boolean isOLATAdmin;
+
 	private List<Identity> identitiesToEdit;
 	private final UserBulkChanges userBulkChanges;
 
@@ -81,9 +79,6 @@ class UserBulkChangeStep00 extends BasicStep {
 		this.userBulkChanges = userBulkChanges;
 		setI18nTitleAndDescr("step0.description", null);
 		setNextStep(new UserBulkChangeStep01(ureq, userBulkChanges));
-		Roles roles = ureq.getUserSession().getRoles();
-		isOLATAdmin = roles.isOLATAdmin();
-		isAdministrativeUser = (roles.isAuthor() || roles.isGroupManager() || roles.isUserManager() || roles.isOLATAdmin());
 	}
 
 	@Override
@@ -99,6 +94,8 @@ class UserBulkChangeStep00 extends BasicStep {
 	private final class UserBulkChangeStepForm00 extends StepFormBasicController {
 		private List<UserPropertyHandler> userPropertyHandlers;
 		private final List<MultipleSelectionElement> checkBoxes = new ArrayList<>();
+
+		private final boolean isAdministrativeUser;
 		
 		@Autowired
 		private I18nManager i18nManager;
@@ -106,12 +103,16 @@ class UserBulkChangeStep00 extends BasicStep {
 		private UserManager userManager;
 		@Autowired
 		private UserBulkChangeManager ubcMan;
-
+		@Autowired
+		private BaseSecurityModule securityModule;
+		
 		public UserBulkChangeStepForm00(UserRequest ureq, WindowControl control, Form rootForm, StepsRunContext runContext) {
 			super(ureq, control, rootForm, runContext, LAYOUT_VERTICAL, null);
 			// use custom translator with fallback to user properties translator
 			setTranslator(userManager.getPropertyHandlerTranslator(getTranslator()));
 			flc.setTranslator(getTranslator());
+			isAdministrativeUser = securityModule.isUserAllowedAdminProps(ureq.getUserSession().getRoles());
+
 			initForm(ureq);
 		}
 
@@ -239,18 +240,15 @@ class UserBulkChangeStep00 extends BasicStep {
 			formLayout.add(innerFormLayout);
 
 			// add input field for password
-			Boolean canChangePwd = BaseSecurityModule.USERMANAGER_CAN_MODIFY_PWD;
-			if (canChangePwd.booleanValue() || isOLATAdmin) {
-				MultipleSelectionElement passwordCheckEl = uifactory.addCheckboxesHorizontal("checkboxPWD", "form.name.pwd", innerFormLayout, new String[] { "changePWD" }, new String[] { "" });
-				passwordCheckEl.select("changePWD", false);
-				passwordCheckEl.addActionListener(FormEvent.ONCLICK);
-				TextElement passwordTextEl = uifactory.addTextElement(UserBulkChangeManager.CRED_IDENTIFYER, "password", 127, null, innerFormLayout);
-				passwordTextEl.setDisplaySize(35);
-				passwordTextEl.setLabel(null, null);
-				passwordTextEl.setVisible(false);
-				checkBoxes.add(passwordCheckEl);
-				passwordCheckEl.setUserObject(passwordTextEl);
-			}
+			MultipleSelectionElement passwordCheckEl = uifactory.addCheckboxesHorizontal("checkboxPWD", "form.name.pwd", innerFormLayout, new String[] { "changePWD" }, new String[] { "" });
+			passwordCheckEl.select("changePWD", false);
+			passwordCheckEl.addActionListener(FormEvent.ONCLICK);
+			TextElement passwordTextEl = uifactory.addTextElement(UserBulkChangeManager.CRED_IDENTIFYER, "password", 127, null, innerFormLayout);
+			passwordTextEl.setDisplaySize(35);
+			passwordTextEl.setLabel(null, null);
+			passwordTextEl.setVisible(false);
+			checkBoxes.add(passwordCheckEl);
+			passwordCheckEl.setUserObject(passwordTextEl);
 
 			// add SingleSelect for language
 			Map<String, String> locdescs = i18nManager.getEnabledLanguagesTranslated();
diff --git a/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeStep01.java b/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeStep01.java
index d704709e2f8..356a2fcfbb0 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeStep01.java
+++ b/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeStep01.java
@@ -19,6 +19,8 @@
  */
 package org.olat.admin.user.bulkChange;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 import org.olat.admin.user.SystemRolesAndRightsController;
@@ -77,24 +79,19 @@ class UserBulkChangeStep01 extends BasicStep {
 	public StepFormController getStepController(UserRequest ureq, WindowControl windowControl, StepsRunContext stepsRunContext, Form form) {
 		return new UserBulkChangeStepForm01(ureq, windowControl, form, stepsRunContext);
 	}
+	
+
 
 	private final class UserBulkChangeStepForm01 extends StepFormBasicController {
 
-		private MultipleSelectionElement chkAuthor;
-		private SingleSelection setAuthor;
-		private MultipleSelectionElement chkUserManager;
-		private SingleSelection setUserManager;
-		private MultipleSelectionElement chkGroupManager;
-		private SingleSelection setGroupManager;
-		private MultipleSelectionElement chkPoolManager;
-		private SingleSelection setPoolManager;
-		private MultipleSelectionElement chkInstitutionManager;
-		private SingleSelection setInstitutionManager;
-		private MultipleSelectionElement chkAdmin;
-		private SingleSelection setAdmin;
-		private MultipleSelectionElement chkStatus;
 		private SingleSelection setStatus;
+		private MultipleSelectionElement chkStatus;
 		private MultipleSelectionElement sendLoginDeniedEmail;
+		private final List<RoleChange> roleChanges = new ArrayList<>();
+		
+		private int counter = 0;
+		private final String[] addremove;
+		private final String[] addremoveTranslated;
 		
 		@Autowired
 		private UserManager userManager;
@@ -104,6 +101,10 @@ class UserBulkChangeStep01 extends BasicStep {
 			// use custom translator with fallback to user properties translator
 			setTranslator(userManager.getPropertyHandlerTranslator(getTranslator()));
 			flc.setTranslator(getTranslator());
+			
+			addremove = new String[] { "add", "remove" };
+			addremoveTranslated = new String[] { translate("role.add"), translate("role.remove") };
+			
 			initForm(ureq);
 		}
 
@@ -116,34 +117,11 @@ class UserBulkChangeStep01 extends BasicStep {
 		protected void formOK(UserRequest ureq) {
 			boolean validChange = userBulkChanges.isValidChange();
 			Map<OrganisationRoles, String> roleChangeMap = userBulkChanges.getRoleChangeMap();
-			if (chkUserManager != null && chkUserManager.isAtLeastSelected(1)) {
-				roleChangeMap.put(OrganisationRoles.usermanager, setUserManager.getSelectedKey());
-				validChange = true;
-			}
-
-			if (chkGroupManager!=null && chkGroupManager.isAtLeastSelected(1)) {
-				roleChangeMap.put(OrganisationRoles.groupmanager, setGroupManager.getSelectedKey());
-				validChange = true;
-			}
-
-			if (chkAuthor!=null && chkAuthor.isAtLeastSelected(1)) {
-				roleChangeMap.put(OrganisationRoles.author, setAuthor.getSelectedKey());
-				validChange = true;
-			}
-			
-			if (chkPoolManager!=null && chkPoolManager.isAtLeastSelected(1)) {
-				roleChangeMap.put(OrganisationRoles.poolmanager, setPoolManager.getSelectedKey());
-				validChange = true;
-			}
-			
-			if (chkInstitutionManager!=null && chkInstitutionManager.isAtLeastSelected(1)) {
-				roleChangeMap.put(OrganisationRoles.learnresourcemanager, setInstitutionManager.getSelectedKey());
-				validChange = true;
-			}
-
-			if (chkAdmin!=null && chkAdmin.isAtLeastSelected(1)) {
-				roleChangeMap.put(OrganisationRoles.administrator, setAdmin.getSelectedKey());
-				validChange = true;
+			for(RoleChange change:roleChanges) {
+				if(change.getSet().isOneSelected()) {
+					roleChangeMap.put(change.getRole(), change.getSet().getSelectedKey());
+					validChange = true;
+				}
 			}
 
 			if (chkStatus!=null && chkStatus.isAtLeastSelected(1)) {
@@ -160,24 +138,16 @@ class UserBulkChangeStep01 extends BasicStep {
 		}
 
 		@Override
-		protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
-			if(chkUserManager == source) {
-				setUserManager.setVisible(chkUserManager.isAtLeastSelected(1));
-			} else if(chkGroupManager == source) {
-				setGroupManager.setVisible(chkGroupManager.isAtLeastSelected(1));
-			} else if(chkAuthor == source) {
-				setAuthor.setVisible(chkAuthor.isAtLeastSelected(1));
-			} else if(chkPoolManager == source) {
-				setPoolManager.setVisible(chkPoolManager.isAtLeastSelected(1));
-			} else if(chkInstitutionManager == source) {
-				setInstitutionManager.setVisible(chkInstitutionManager.isAtLeastSelected(1));
-			} else if(chkAdmin == source) {
-				setAdmin.setVisible(chkAdmin.isAtLeastSelected(1));
-			} else if(chkStatus == source || setStatus == source) {
+		protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {	
+			if(chkStatus == source || setStatus == source) {
 				setStatus.setVisible(chkStatus.isAtLeastSelected(1));
 				boolean loginDenied = chkStatus.isAtLeastSelected(1) && setStatus.isOneSelected()
 						&& Integer.toString(Identity.STATUS_LOGIN_DENIED).equals(setStatus.getSelectedKey());
 				sendLoginDeniedEmail.setVisible(loginDenied);
+			} else if(source instanceof MultipleSelectionElement) {
+				MultipleSelectionElement check = (MultipleSelectionElement)source;
+				RoleChange change = (RoleChange)check.getUserObject();
+				change.getSet().setVisible(change.getCheck().isAtLeastSelected(1));
 			}
 			super.formInnerEvent(ureq, source, event);
 		}
@@ -187,6 +157,20 @@ class UserBulkChangeStep01 extends BasicStep {
 			// always true, because no changes are required
 			return true;
 		}
+		
+		private void initRole(OrganisationRoles role, FormItemContainer formLayout) {
+			MultipleSelectionElement chkAuthor = uifactory.addCheckboxesHorizontal("rolechk_" + (++counter), "table.role." + role.name(), formLayout, onKeys, onValues);
+			chkAuthor.select("Author", false);
+			
+			chkAuthor.addActionListener(FormEvent.ONCLICK);
+
+			SingleSelection setAuthor = uifactory.addDropdownSingleselect("roleset_" + (++counter), null, formLayout, addremove, addremoveTranslated, null);
+			setAuthor.setVisible(false);
+			
+			RoleChange change = new RoleChange(chkAuthor, setAuthor, OrganisationRoles.author);
+			roleChanges.add(change);
+			chkAuthor.setUserObject(change);
+		}
 
 		@Override
 		protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
@@ -194,8 +178,7 @@ class UserBulkChangeStep01 extends BasicStep {
 
 			FormLayoutContainer textContainer = FormLayoutContainer.createCustomFormLayout("index", getTranslator(), this.velocity_root + "/step1.html");
 			formLayout.add(textContainer);
-			String[] addremove = new String[] { "add", "remove" };
-			String[] addremoveTranslated = new String[] { translate("role.add"), translate("role.remove") };
+			
 
 			// Main layout is a vertical layout without left side padding. To format
 			// the checkboxes properly we need a default layout for the remaining form
@@ -205,68 +188,26 @@ class UserBulkChangeStep01 extends BasicStep {
 
 			// check user rights:
 			Roles roles = ureq.getUserSession().getRoles();
-			// usermanager:
-			if (roles.isOLATAdmin() || roles.isUserManager()) {
-				chkUserManager = uifactory.addCheckboxesHorizontal("Usermanager", "table.role.useradmin", innerFormLayout, onKeys, onValues);
-				chkUserManager.select("Usermanager", false);
-				chkUserManager.addActionListener(FormEvent.ONCLICK);
-
-				setUserManager = uifactory.addDropdownSingleselect("setUserManager", null, innerFormLayout, addremove, addremoveTranslated, null);
-				setUserManager.setVisible(false);
-			}
-
-			// groupmanager
-			if (roles.isOLATAdmin() || roles.isGroupManager()) {
-				chkGroupManager = uifactory.addCheckboxesHorizontal("Groupmanager", "table.role.groupadmin", innerFormLayout, onKeys, onValues);
-				chkGroupManager.select("Groupmanager", false);
-				chkGroupManager.addActionListener(FormEvent.ONCLICK);
-
-				setGroupManager = uifactory.addDropdownSingleselect("setGroupManager", null, innerFormLayout, addremove, addremoveTranslated, null);
-				setGroupManager.setVisible(false);
-			}
-
-			// author
-			if (roles.isOLATAdmin() || roles.isAuthor()) {
-				chkAuthor = uifactory.addCheckboxesHorizontal("Author", "table.role.author", innerFormLayout, onKeys, onValues);
-				chkAuthor.select("Author", false);
-				chkAuthor.addActionListener(FormEvent.ONCLICK);
-
-				setAuthor = uifactory.addDropdownSingleselect("setAuthor", null, innerFormLayout, addremove, addremoveTranslated, null);
-				setAuthor.setVisible(false);
-			}
-			
-			//pool manager
-			if (roles.isOLATAdmin() || roles.isQPoolManager()) {
-				chkPoolManager = uifactory.addCheckboxesHorizontal("PoolManager", "table.role.poolManager", innerFormLayout, onKeys, onValues);
-				chkPoolManager.select("Author", false);
-				chkPoolManager.addActionListener(FormEvent.ONCLICK);
-
-				setPoolManager = uifactory.addDropdownSingleselect("setPoolManager", null, innerFormLayout, addremove, addremoveTranslated, null);
-				setPoolManager.setVisible(false);
-			}
-			
-			// learn resource manager
-			if (roles.isOLATAdmin() || roles.isLearnResourceManager()) {
-				chkInstitutionManager = uifactory.addCheckboxesHorizontal("InsitutionManager", "table.role.institutionManager", innerFormLayout, onKeys, onValues);
-				chkInstitutionManager.select("Author", false);
-				chkInstitutionManager.addActionListener(FormEvent.ONCLICK);
-
-				setInstitutionManager = uifactory.addDropdownSingleselect("setInstitutionManager", null, innerFormLayout, addremove, addremoveTranslated, null);
-				setInstitutionManager.setVisible(false);
+			if(roles.isUserManager()) {
+				initRole(OrganisationRoles.author, innerFormLayout);
 			}
-			
-			// sysadmin
-			if (roles.isOLATAdmin()) {
-				chkAdmin = uifactory.addCheckboxesHorizontal("Admin", "table.role.admin", innerFormLayout, onKeys, onValues);
-				chkAdmin.select("Admin", false);
-				chkAdmin.addActionListener(FormEvent.ONCLICK);
-
-				setAdmin = uifactory.addDropdownSingleselect("setAdmin",null, innerFormLayout, addremove, addremoveTranslated, null);
-				setAdmin.setVisible(false);
+			if(roles.isRolesManager() || roles.isAdministrator()) {
+				OrganisationRoles[] roleArr = new OrganisationRoles[] {
+						OrganisationRoles.usermanager, OrganisationRoles.rolesmanager,
+						OrganisationRoles.groupmanager, OrganisationRoles.learnresourcemanager,
+						OrganisationRoles.poolmanager, OrganisationRoles.curriculummanager,
+						OrganisationRoles.lecturemanager, OrganisationRoles.qualitymanager,
+						OrganisationRoles.linemanager, OrganisationRoles.principal,
+						OrganisationRoles.administrator
+				};
+				
+				for(OrganisationRoles role:roleArr) {
+					initRole(role, innerFormLayout);
+				}
 			}
 
 			// status
-			if (roles.isOLATAdmin()) {
+			if (roles.isAdministrator() || roles.isRolesManager()) {
 				chkStatus = uifactory.addCheckboxesHorizontal("Status", "table.role.status", innerFormLayout, onKeys, onValues);
 				chkStatus.select("Status", false);
 				chkStatus.addActionListener(FormEvent.ONCLICK);
@@ -296,4 +237,28 @@ class UserBulkChangeStep01 extends BasicStep {
 			}
 		}
 	}
+	
+	private static final class RoleChange {
+		private final MultipleSelectionElement check;
+		private final SingleSelection set;
+		private final OrganisationRoles role;
+		
+		public RoleChange(MultipleSelectionElement check, SingleSelection set, OrganisationRoles role) {
+			this.check = check;
+			this.set = set;
+			this.role = role;
+		}
+
+		public MultipleSelectionElement getCheck() {
+			return check;
+		}
+
+		public SingleSelection getSet() {
+			return set;
+		}
+
+		public OrganisationRoles getRole() {
+			return role;
+		}
+	}
 }
diff --git a/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeStep02.java b/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeStep02.java
index 0a9ff6123da..4afa4d606ac 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeStep02.java
+++ b/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeStep02.java
@@ -29,6 +29,7 @@ import org.apache.velocity.VelocityContext;
 import org.apache.velocity.context.Context;
 import org.olat.admin.user.groups.GroupSearchController;
 import org.olat.basesecurity.BaseSecurity;
+import org.olat.basesecurity.BaseSecurityModule;
 import org.olat.basesecurity.OrganisationRoles;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.EscapeMode;
@@ -54,7 +55,6 @@ import org.olat.core.gui.control.generic.wizard.StepsEvent;
 import org.olat.core.gui.control.generic.wizard.StepsRunContext;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
-import org.olat.core.id.Roles;
 import org.olat.core.util.Util;
 import org.olat.group.BusinessGroup;
 import org.olat.group.BusinessGroupService;
@@ -78,7 +78,6 @@ class UserBulkChangeStep02 extends BasicStep {
 	private static final String usageIdentifyer = UserBulkChangeStep00.class.getCanonicalName();
 	
 	private final UserBulkChanges userBulkChanges;
-	private List<UserPropertyHandler> userPropertyHandlers;
 
 	public UserBulkChangeStep02(UserRequest ureq, UserBulkChanges userBulkChanges) {
 		super(ureq);
@@ -98,10 +97,17 @@ class UserBulkChangeStep02 extends BasicStep {
 	}
 	
 	private final class UserBulkChangeStepForm02 extends StepFormBasicController {
+
+		private final boolean isAdministrativeUser;
+		private final List<UserPropertyHandler> userPropertyHandlers;
 		
+		@Autowired
+		private UserManager userManager;
 		@Autowired
 		private BaseSecurity securityManager;
 		@Autowired
+		private BaseSecurityModule securityModule;
+		@Autowired
 		private UserBulkChangeManager ubcMan;
 		@Autowired
 		private BusinessGroupService businessGroupService;
@@ -109,12 +115,14 @@ class UserBulkChangeStep02 extends BasicStep {
 		public UserBulkChangeStepForm02(UserRequest ureq, WindowControl control, Form rootForm, StepsRunContext runContext) {
 			super(ureq, control, rootForm, runContext, LAYOUT_VERTICAL, null);
 			// use custom translator with fallback to user properties translator
-			UserManager um = UserManager.getInstance();
-			Translator pt1 = um.getPropertyHandlerTranslator(getTranslator());
+			Translator pt1 = userManager.getPropertyHandlerTranslator(getTranslator());
 			Translator pt2 = Util.createPackageTranslator(BusinessGroupFormController.class, ureq.getLocale(), pt1);
 			Translator pt3 = Util.createPackageTranslator(GroupSearchController.class, ureq.getLocale(), pt2);
 			setTranslator(pt3);
 			flc.setTranslator(pt3);
+			isAdministrativeUser = securityModule.isUserAllowedAdminProps(ureq.getUserSession().getRoles());
+			userPropertyHandlers = userManager.getUserPropertyHandlersFor(usageIdentifyer, isAdministrativeUser);
+			
 			initForm(ureq);
 		}
 
@@ -140,7 +148,6 @@ class UserBulkChangeStep02 extends BasicStep {
 
 			setFormTitle("title");
 
-			List<List<String>> mergedDataChanges = new ArrayList<>();
 			FormLayoutContainer textContainer = FormLayoutContainer.createCustomFormLayout("index", getTranslator(), this.velocity_root + "/step2.html");
 			formLayoutVertical.add(textContainer);
 			boolean validChange = userBulkChanges.isValidChange();
@@ -149,20 +156,56 @@ class UserBulkChangeStep02 extends BasicStep {
 				return;
 			}
 
+			List<List<String>> mergedDataChanges = loadModel();	
+			TextFlexiCellRenderer textRenderer = new TextFlexiCellRenderer(EscapeMode.none);
+			FlexiTableColumnModel tableColumnModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
+			// fixed fields:
+			int colPos = 0;
+			tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("table.user.login", colPos++));
+			tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("form.name.pwd", colPos++));
+			tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(true, "form.name.language", colPos++, false, null, FlexiColumnModel.ALIGNMENT_LEFT, textRenderer));
+			for (int j = 0; j < userPropertyHandlers.size(); j++) {
+				UserPropertyHandler userPropertyHandler = userPropertyHandlers.get(j);
+				tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(true, userPropertyHandler.i18nColumnDescriptorLabelKey(), colPos++, false, null, FlexiColumnModel.ALIGNMENT_LEFT, textRenderer));
+			}
+			tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(true, "table.role.added", colPos++, false, null, FlexiColumnModel.ALIGNMENT_LEFT, textRenderer));
+			tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(true, "table.role.removed", colPos++, false, null, FlexiColumnModel.ALIGNMENT_LEFT, textRenderer));
+			tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(true, "table.role.status", colPos++, false, null, FlexiColumnModel.ALIGNMENT_LEFT, textRenderer));
+
+			FlexiTableDataModel<List<String>> tableDataModel = new FlexiTableDataModelImpl<>(new OverviewModel(mergedDataChanges, colPos), tableColumnModel);
+			uifactory.addTableElement(getWindowControl(), "newUsers", tableDataModel, getTranslator(), formLayoutVertical);
+
+			Set<Long> allGroups = new HashSet<>(); 
+			List<Long> ownGroups = userBulkChanges.getOwnerGroups();
+			List<Long> partGroups = userBulkChanges.getParticipantGroups();
+			allGroups.addAll(ownGroups);
+			allGroups.addAll(partGroups);
+			List<Long> mailGroups = userBulkChanges.getMailGroups();
+			
+			if (!allGroups.isEmpty()) {
+				uifactory.addSpacerElement("space", formLayout, true);
+				uifactory.addStaticTextElement("add.to.groups", "", formLayout);
+				FlexiTableColumnModel groupColumnModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
+				groupColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("table.group.name", 0));
+				groupColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("description", 1));
+				groupColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("table.user.role", 2));
+				groupColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("send.email", 3));
+
+				List<BusinessGroup> groups = businessGroupService.loadBusinessGroups(allGroups);
+				TableDataModel<BusinessGroup> model = new GroupAddOverviewModel(groups, ownGroups, partGroups, mailGroups, getTranslator()); 
+				FlexiTableDataModel<BusinessGroup> groupDataModel = new FlexiTableDataModelImpl<>(model, groupColumnModel);
+				
+				uifactory.addTableElement(getWindowControl(), "groupOverview", groupDataModel, getTranslator(), formLayout);
+			}
+		}
+		
+		private List<List<String>> loadModel() {
+			List<List<String>> mergedDataChanges = new ArrayList<>();
+			OrganisationRoles[] organisationRoles = OrganisationRoles.values();
 			List<Identity> selectedIdentities = userBulkChanges.getIdentitiesToEdit();
 			Map<String, String> attributeChangeMap = userBulkChanges.getAttributeChangeMap();
 			Map<OrganisationRoles, String> roleChangeMap = userBulkChanges.getRoleChangeMap();
 
-			Roles roles = ureq.getUserSession().getRoles();
-			boolean isAdministrativeUser = (roles.isAuthor() || roles.isGroupManager() || roles.isUserManager() || roles.isOLATAdmin());
-			userPropertyHandlers = UserManager.getInstance().getUserPropertyHandlersFor(usageIdentifyer, isAdministrativeUser);
-
-			OrganisationRoles[] organisationRoles = {
-					OrganisationRoles.usermanager, OrganisationRoles.groupmanager,
-					OrganisationRoles.poolmanager, OrganisationRoles.learnresourcemanager,
-					OrganisationRoles.author, OrganisationRoles.administrator
-				};
-
 			// loop over users to be edited:
 			for (Identity identity : selectedIdentities) {
 				List<String> userDataArray = new ArrayList<>();
@@ -172,7 +215,9 @@ class UserBulkChangeStep02 extends BasicStep {
 				// add columns for password
 				if (attributeChangeMap.containsKey(UserBulkChangeManager.CRED_IDENTIFYER)) {
 					userDataArray.add(attributeChangeMap.get(UserBulkChangeManager.CRED_IDENTIFYER));
-				} else userDataArray.add("***");
+				} else {
+					userDataArray.add("***");
+				}
 				// add column for language
 				String userLanguage = identity.getUser().getPreferences().getLanguage();
 				if (attributeChangeMap.containsKey(UserBulkChangeManager.LANG_IDENTIFYER)) {
@@ -219,60 +264,30 @@ class UserBulkChangeStep02 extends BasicStep {
 				// add columns with roles
 				// loop over securityGroups and get result...
 				List<String> identityRoles = securityManager.getRolesAsString(identity);
+				StringBuilder addedRole = new StringBuilder();
+				StringBuilder removedRole = new StringBuilder();
 				for (OrganisationRoles organisationRole : organisationRoles) {
-					userDataArray.add(getRoleStatusForIdentity(organisationRole, identityRoles, roleChangeMap));
+					getRoleStatusForIdentity(organisationRole, identityRoles, roleChangeMap, addedRole, removedRole);
+				}
+				
+				String addedRolesString = addedRole.toString();
+				if(addedRolesString.length() > 0) {
+					addedRolesString = decorateChangedCell(addedRolesString);
+				}
+				userDataArray.add(addedRolesString);
+				String removedRolesString = removedRole.toString();
+				if(removedRolesString.length() > 0) {
+					removedRolesString = decorateChangedCell(removedRolesString);
 				}
+				userDataArray.add(removedRolesString);
+	
 				// add column with status
 				userDataArray.add(userBulkChanges.getStatus() == null ? "" : userBulkChanges.getStatus().toString());
 
 				// add each user:
 				mergedDataChanges.add(userDataArray);
 			}
-			
-			TextFlexiCellRenderer textRenderer = new TextFlexiCellRenderer(EscapeMode.none);
-			FlexiTableColumnModel tableColumnModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
-			// fixed fields:
-			int colPos = 0;
-			tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("table.user.login", colPos++));
-			tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("form.name.pwd", colPos++));
-			tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(true, "form.name.language", colPos++, false, null, FlexiColumnModel.ALIGNMENT_LEFT, textRenderer));
-			for (int j = 0; j < userPropertyHandlers.size(); j++) {
-				UserPropertyHandler userPropertyHandler = userPropertyHandlers.get(j);
-				tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(true, userPropertyHandler.i18nColumnDescriptorLabelKey(), colPos++, false, null, FlexiColumnModel.ALIGNMENT_LEFT, textRenderer));
-			}
-			tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(true, "table.role.useradmin", colPos++, false, null, FlexiColumnModel.ALIGNMENT_LEFT, textRenderer));
-			tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(true, "table.role.groupadmin", colPos++, false, null, FlexiColumnModel.ALIGNMENT_LEFT, textRenderer));
-			tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(true, "table.role.poolManager", colPos++, false, null, FlexiColumnModel.ALIGNMENT_LEFT, textRenderer));
-			tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(true, "table.role.institutionManager", colPos++, false, null, FlexiColumnModel.ALIGNMENT_LEFT, textRenderer));
-			tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(true, "table.role.author", colPos++, false, null, FlexiColumnModel.ALIGNMENT_LEFT, textRenderer));
-			tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(true, "table.role.admin", colPos++, false, null, FlexiColumnModel.ALIGNMENT_LEFT, textRenderer));
-			tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(true, "table.role.status", colPos++, false, null, FlexiColumnModel.ALIGNMENT_LEFT, textRenderer));
-
-			FlexiTableDataModel<List<String>> tableDataModel = new FlexiTableDataModelImpl<>(new OverviewModel(mergedDataChanges, colPos), tableColumnModel);
-			uifactory.addTableElement(getWindowControl(), "newUsers", tableDataModel, getTranslator(), formLayoutVertical);
-
-			Set<Long> allGroups = new HashSet<>(); 
-			List<Long> ownGroups = userBulkChanges.getOwnerGroups();
-			List<Long> partGroups = userBulkChanges.getParticipantGroups();
-			allGroups.addAll(ownGroups);
-			allGroups.addAll(partGroups);
-			List<Long> mailGroups = userBulkChanges.getMailGroups();
-			
-			if (!allGroups.isEmpty()) {
-				uifactory.addSpacerElement("space", formLayout, true);
-				uifactory.addStaticTextElement("add.to.groups", "", formLayout);
-				FlexiTableColumnModel groupColumnModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
-				groupColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("table.group.name", 0));
-				groupColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("description", 1));
-				groupColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("table.user.role", 2));
-				groupColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("send.email", 3));
-
-				List<BusinessGroup> groups = businessGroupService.loadBusinessGroups(allGroups);
-				TableDataModel<BusinessGroup> model = new GroupAddOverviewModel(groups, ownGroups, partGroups, mailGroups, getTranslator()); 
-				FlexiTableDataModel<BusinessGroup> groupDataModel = new FlexiTableDataModelImpl<>(model, groupColumnModel);
-				
-				uifactory.addTableElement(getWindowControl(), "groupOverview", groupDataModel, getTranslator(), formLayout);
-			}
+			return mergedDataChanges;
 		}
 
 		/**
@@ -284,26 +299,25 @@ class UserBulkChangeStep02 extends BasicStep {
 		 * @param roleChangeMap
 		 * @return
 		 */
-		private String getRoleStatusForIdentity(OrganisationRoles role, List<String> currentRoles, Map<OrganisationRoles, String> roleChangeMap) {
-			boolean isInGroup = currentRoles.contains(role.name());
-
-			String thisRoleAction = "";
-			if (roleChangeMap.containsKey(role)) {
-				thisRoleAction = roleChangeMap.get(role);
-			} else {
-				return Boolean.toString(isInGroup);
-			}
+		private void getRoleStatusForIdentity(OrganisationRoles role, List<String> currentRoles, Map<OrganisationRoles, String> roleChangeMap,
+				StringBuilder addedRole, StringBuilder removedRole) {
+			if(role == OrganisationRoles.user || role == OrganisationRoles.invitee || role == OrganisationRoles.guest
+					|| !roleChangeMap.containsKey(role)) return;
 
-			if ((isInGroup && thisRoleAction.equals("add")) || (!isInGroup && thisRoleAction.equals("remove"))) { 
-				return Boolean.toString(isInGroup);
-			} else {
-				isInGroup = !isInGroup; //invert to represent the new state
-				return decorateChangedCell(isInGroup);		
+			boolean isInGroup = currentRoles.contains(role.name());
+			String thisRoleAction = roleChangeMap.get(role);
+			if (isInGroup && thisRoleAction.equals("remove")) {
+				if(removedRole.length() > 0) removedRole.append(", ");
+				removedRole.append(translate("table.role.".concat(role.name())));
+			} else if(!isInGroup && thisRoleAction.equals("add")) {
+				if(addedRole.length() > 0) addedRole.append(", ");
+				addedRole.append(translate("table.role.".concat(role.name())));
 			}
 		}
+
 		
-		private String decorateChangedCell(Object val) {
-			return "<span class='o_userbulk_changedcell'><i class='o_icon o_icon_new'> </i> " + val.toString() + "</span>";
+		private String decorateChangedCell(String val) {
+			return "<span class='o_userbulk_changedcell'><i class='o_icon o_icon_new'> </i> " + val + "</span>";
 		}
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_ar.properties b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_ar.properties
index 10503fc3024..66395c4201f 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_ar.properties
+++ b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_ar.properties
@@ -21,9 +21,9 @@ step1.title=\u0648\u0636\u0639 \u0635\u0644\u0627\u062D\u064A\u0627\u062A \u0627
 step2.content=\u0633\u064A\u062A\u0645 \u0625\u0643\u0645\u0627\u0644 \u0627\u0644\u062A\u0639\u062F\u064A\u0644\u0627\u062A \u0627\u0644\u062A\u0627\u0644\u064A\u0629 \u0628\u0648\u0627\u0633\u0637\u0629 \u0627\u0644\u0646\u0642\u0631 \u0639\u0644\u0649 \u0625\u0646\u0647\u0627\u0621.
 step2.description=\u062A\u062D\u0643\u0645/\u0646\u0638\u0631\u0629 \u0639\u0627\u0645\u0629
 step2.novalidChanges=\u0644\u0627 \u062A\u0648\u062C\u062F \u062A\u0639\u062F\u064A\u0644\u0627\u062A\u060C \u0644\u0627 \u064A\u0645\u0643\u0646 \u0625\u0643\u0645\u0627\u0644 \u0627\u0644\u0645\u0639\u0627\u0644\u062C.
-table.role.admin=\u0645\u062F\u064A\u0631 \u0627\u0644\u0646\u0638\u0627\u0645
+table.role.administrator=\u0645\u062F\u064A\u0631 \u0627\u0644\u0646\u0638\u0627\u0645
 table.role.author=\u0627\u0644\u0645\u0624\u0644\u0641
-table.role.groupadmin=\u0645\u062F\u064A\u0631 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629
+table.role.groupmanager=\u0645\u062F\u064A\u0631 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629
 table.role.status=\u0627\u0644\u062D\u0627\u0644\u0629
 table.role.useradmin=\u0645\u062F\u064A\u0631 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645
 table.user.login=\u0627\u0633\u0645 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645
diff --git a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_bg.properties b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_bg.properties
index 7d57fc7a7c1..16af69d14b1 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_bg.properties
+++ b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_bg.properties
@@ -16,10 +16,10 @@ step1.title=\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u0442\u0435 \u043F\
 step2.content=\u0421\u043B\u0435\u0434\u043D\u0438\u0442\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u0438 \u0449\u0435 \u0431\u044A\u0434\u0430\u0442 \u0437\u0430\u0432\u044A\u0440\u0448\u0435\u043D\u0438, \u043A\u043E\u0433\u0430\u0442\u043E \u043A\u043B\u0438\u043A\u043D\u0435\u0442\u0435 \u043D\u0430 "\u0417\u0430\u0432\u044A\u0440\u0448\u0435\u0442\u0435"
 step2.description=\u041A\u043E\u043D\u0442\u0440\u043E\u043B/ \u043F\u0440\u0435\u0433\u043B\u0435\u0434
 step2.novalidChanges=\u041D\u044F\u043C\u0430 \u043D\u0438\u043A\u0430\u043A\u0432\u0438 \u043F\u0440\u043E\u043C\u0435\u043D\u0438; \u0410\u0441\u0438\u0441\u0442\u0435\u043D\u0442\u044A\u0442 \u043D\u0435 \u043C\u043E\u0436\u0435 \u0434\u0430 \u0431\u044A\u0434\u0435 \u0437\u0430\u0432\u044A\u0440\u0448\u0435\u043D.
-table.role.admin=\u0421\u0438\u0441\u0442\u0435\u043C\u0435\u043D \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440
+table.role.administrator=\u0421\u0438\u0441\u0442\u0435\u043C\u0435\u043D \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440
 table.role.author=\u0410\u0432\u0442\u043E\u0440
-table.role.groupadmin=\u0410\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440 \u043D\u0430 \u0433\u0440\u0443\u043F\u0430
+table.role.groupmanager=\u0410\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440 \u043D\u0430 \u0433\u0440\u0443\u043F\u0430
 table.role.status=\u0421\u0442\u0430\u0442\u0443\u0442
-table.role.useradmin=\u0410\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440 \u043D\u0430 \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B
+table.role.usermanager=\u0410\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440 \u043D\u0430 \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B
 table.user.login=\u041F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u0441\u043A\u043E \u0438\u043C\u0435
 title=\u041F\u0440\u043E\u043C\u044F\u043D\u0430 \u043D\u0430 \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u0441\u043A\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438
diff --git a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_cs.properties b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_cs.properties
index e51592404e2..f8bb5fba7b2 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_cs.properties
+++ b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_cs.properties
@@ -15,10 +15,10 @@ step1.description=Jak p\u0159i\u0159adit pr\u00E1va
 step2.content=N\u00E1sleduj\u00EDc\u00ED \u00FApravy budou profedeny kliknut\u00EDm na "Dokon\u010Dit"
 step2.description=Monitorov\u00E1n\u00ED/ pr\u016Fzkum
 step2.novalidChanges=\u017D\u00E1dn\u00E9 \u00FApravy; pr\u016Fvodce nem\u016F\u017Ee b\u00FDt dokon\u010Den.
-table.role.admin=Syst\u00E9mov\u00FD administr\u00E1tor
+table.role.administrator=Syst\u00E9mov\u00FD administr\u00E1tor
 table.role.author=Autor
-table.role.groupadmin=Administrace skupiny
+table.role.groupmanager=Administrace skupiny
 table.role.status=Stav
-table.role.useradmin=Administrace u\u017Eivatele
+table.role.usermanager=Administrace u\u017Eivatele
 table.user.login=U\u017Eivatelsk\u00E9 jm\u00E9no
 title=\u00DAprava v\u00EDce u\u017Eivatel\u016F
diff --git a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_de.properties
index d19e4c27a8c..5e5ebcac4c9 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_de.properties
@@ -16,13 +16,22 @@ step1.title=Benutzerrechte einstellen
 step2.content=Folgende \u00C4nderungen werden bei "Fertigstellen" vorgenommen.
 step2.description=Kontrolle / \u00DCbersicht
 step2.novalidChanges=Sie haben keine \u00C4nderungen vorgenommen, der Wizard kann nicht fertig gestellt werden.
-table.role.admin=Systemadministrator
+table.role.added=Neue Rolle
+table.role.administrator=Administrator
 table.role.author=Autor
-table.role.groupadmin=Gruppenverwalter
+table.role.curriculummanager=Curriculumverwalter
+table.role.groupmanager=Gruppenverwalter
+table.role.lecturemanager=Lektionenblockverwalter
 table.role.status=Status
-table.role.useradmin=Benutzerverwalter
-table.role.poolManager=Poolverwalter
-table.role.institutionManager=Lernressourcenverwalter
+table.role.usermanager=Benutzerverwalter
+table.role.poolmanager=Poolverwalter
+table.role.linemanager=Linemanagers
+table.role.rolesmanager=Rollenverwalter
+table.role.qualitymanager=Quality managers
+table.role.learnresourcemanager=Lernressourcenverwalter
+table.role.sysadmin=Systemadministrator
+table.role.principal=Principals
+table.role.removed=Entfernte Rolle
 table.user.login=Benutzername
 title=\u00C4nderung von Benutzer-Attributen
 main.menu.title=OLAT Passwort 
diff --git a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_el.properties b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_el.properties
index a2879c4797a..1a26678a47f 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_el.properties
+++ b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_el.properties
@@ -24,10 +24,10 @@ step1.title=\u039F\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03B4\u03B9\u03BA\u03B1\
 step2.content=\u039F\u03B9 \u03B1\u03BA\u03CC\u03BB\u03BF\u03C5\u03B8\u03B5\u03C2 \u03C4\u03C1\u03BF\u03C0\u03BF\u03C0\u03BF\u03B9\u03AE\u03C3\u03B5\u03B9\u03C2 \u03B8\u03B1 \u03BF\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03C9\u03B8\u03BF\u03CD\u03BD, \u03BA\u03AC\u03BD\u03BF\u03BD\u03C4\u03B1\u03C2 \u03BA\u03BB\u03B9\u03BA \u03C3\u03C4\u03B7 "\u039B\u03AE\u03BE\u03B7"
 step2.description=\u03A0\u03B1\u03C1\u03B1\u03BA\u03BF\u03BB\u03BF\u03CD\u03B8\u03B7\u03C3\u03B7/ \u0388\u03C1\u03B5\u03C5\u03BD\u03B1
 step2.novalidChanges=\u0394\u03B5\u03BD \u03C5\u03C0\u03AC\u03C1\u03C7\u03BF\u03C5\u03BD \u03C4\u03C1\u03BF\u03C0\u03BF\u03C0\u03BF\u03B9\u03AE\u03C3\u03B5\u03B9\u03C2. \u039F \u03BF\u03B4\u03B7\u03B3\u03CC\u03C2 \u03B4\u03B5\u03BD \u03BC\u03C0\u03CC\u03C1\u03B5\u03C3\u03B5 \u03BD\u03B1 \u03BF\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03C9\u03B8\u03B5\u03AF.
-table.role.admin=\u0394\u03B9\u03B1\u03C7\u03B5\u03B9\u03C1\u03B9\u03C3\u03C4\u03AE\u03C2 \u03C3\u03C5\u03C3\u03C4\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2
+table.role.administrator=\u0394\u03B9\u03B1\u03C7\u03B5\u03B9\u03C1\u03B9\u03C3\u03C4\u03AE\u03C2 \u03C3\u03C5\u03C3\u03C4\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2
 table.role.author=\u03A3\u03C5\u03B3\u03B3\u03C1\u03B1\u03C6\u03AD\u03B1\u03C2
-table.role.groupadmin=\u0394\u03B9\u03B1\u03C7\u03B5\u03B9\u03C1\u03B9\u03C3\u03C4\u03AE\u03C2 \u03BF\u03BC\u03AC\u03B4\u03B1\u03C2 
+table.role.groupmanager=\u0394\u03B9\u03B1\u03C7\u03B5\u03B9\u03C1\u03B9\u03C3\u03C4\u03AE\u03C2 \u03BF\u03BC\u03AC\u03B4\u03B1\u03C2 
 table.role.status=\u039A\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7
-table.role.useradmin=\u0394\u03B9\u03B1\u03C7\u03B5\u03B9\u03C1\u03B9\u03C3\u03C4\u03AE\u03C2 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7
+table.role.usermanager=\u0394\u03B9\u03B1\u03C7\u03B5\u03B9\u03C1\u03B9\u03C3\u03C4\u03AE\u03C2 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7
 table.user.login=\u038C\u03BD\u03BF\u03BC\u03B1 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7
 title=\u03A4\u03C1\u03BF\u03C0\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u03B4\u03B9\u03B1\u03C6\u03CC\u03C1\u03C9\u03BD \u03C7\u03C1\u03B7\u03C3\u03C4\u03CE\u03BD
diff --git a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_en.properties
index da2a9fceb3e..dc03082029c 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_en.properties
@@ -24,13 +24,22 @@ step1.title=Set user rights
 step2.content=The following modifications will be completed by clicking on "Finish"
 step2.description=Control/overview
 step2.novalidChanges=There are no modifications; the Wizard cannot be completed.
-table.role.admin=System administrator
+table.role.added=Added role
+table.role.administrator=Administrator
 table.role.author=Author
-table.role.groupadmin=Group administrator
+table.role.curriculummanager=Curriculum managers
+table.role.groupmanager=Group administrator
 table.role.status=Status
-table.role.useradmin=User administrator
-table.role.poolManager=Question bank manager
-table.role.institutionManager=Learning resource manager
+table.role.usermanager=User administrator
+table.role.lecturemanager=Lectures managers
+table.role.linemanager=Line managers
+table.role.qualitymanager=Quality managers
+table.role.poolmanager=Question bank manager
+table.role.learnresourcemanager=Learning resource manager
+table.role.principal=Principals
+table.role.rolesmanager=Roles managers
+table.role.sysadmin=System administrator
+table.role.removed=Removed role
 table.user.login=User name
 title=Modification of user attributes
 step1a.description=Choose group(s)
diff --git a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_es.properties b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_es.properties
index 58863505820..af85d417e6e 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_es.properties
+++ b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_es.properties
@@ -15,10 +15,10 @@ step1.description=C\u00F3mo asignar permisos
 step2.content=Las siguientes modificaciones ser\u00E1n completadas al hacer clic en "Finalizar"
 step2.description=Vistazo General/Control
 step2.novalidChanges=No hay modificaciones\: el asistente (wizard) no se complet\u00F3.
-table.role.admin=Administrador de sistema
+table.role.administrator=Administrador de sistema
 table.role.author=Autor
-table.role.groupadmin=Administrador de grupo
+table.role.groupmanager=Administrador de grupo
 table.role.status=Estado
-table.role.useradmin=Administrador de usuario
+table.role.usermanager=Administrador de usuario
 table.user.login=Nombre de usuario
 title=Modificaci\u00F3n de atributos de usuario
diff --git a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_fr.properties
index 7ab76e8662e..bafa1ff3648 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_fr.properties
@@ -26,12 +26,12 @@ step1a.description=S\u00E9lectionner le(s) groupe(s)
 step2.content=Les modifications suivantes seront effectu\u00E9es avec "Finir".
 step2.description=Contr\u00F4le/Aper\u00E7u
 step2.novalidChanges=Vous n'avez  effectu\u00E9 aucune modification, l'assistant ne peut pas \u00EAtre termin\u00E9 ainsi.
-table.role.admin=Administration de syst\u00E8me
+table.role.administrator=Administration de syst\u00E8me
 table.role.author=Auteur
-table.role.groupadmin=Administrateur des groupes
+table.role.groupmanager=Administrateur des groupes
 table.role.status=Statut
-table.role.useradmin=Administrateur des utilisateurs
-table.role.poolManager=Gestion banque de questions
-table.role.institutionManager=Administrateur des ressources didactiques
+table.role.usermanager=Administrateur des utilisateurs
+table.role.poolmanager=Gestion banque de questions
+table.role.learnresourcemanager=Administrateur des ressources didactiques
 table.user.login=Nom d'utilisateur
 title=Modifications des attributs d'utilisateurs
diff --git a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_it.properties b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_it.properties
index a6c93002e1f..27eee4bd11c 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_it.properties
+++ b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_it.properties
@@ -26,10 +26,10 @@ step1a.description=Scegliere gruppo/i
 step2.content=Le modifiche seguenti vengono operate mediante "Completare"
 step2.description=Controllo/ Visione d'insieme
 step2.novalidChanges=Lei non ha operato alcuna modifica, questo wizard non pu\u00F2 dunque essere completato.
-table.role.admin=Amministratore sistema
+table.role.administrator=Amministratore sistema
 table.role.author=Autore
-table.role.groupadmin=Amministratore gruppi
+table.role.groupmanager=Amministratore gruppi
 table.role.status=Stato
-table.role.useradmin=Amministratore utenti
+table.role.usermanager=Amministratore utenti
 table.user.login=Nome d'utente
 title=Modificazione degli attributi utente
diff --git a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_jp.properties b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_jp.properties
index 53d385afdf0..ec665a4deeb 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_jp.properties
+++ b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_jp.properties
@@ -23,10 +23,10 @@ step1.title=\u30E6\u30FC\u30B6\u6A29\u9650\u3092\u8A2D\u5B9A\u3059\u308B
 step2.content=\u300C\u7D42\u4E86\u300D\u3092\u30AF\u30EA\u30C3\u30AF\u3059\u308B\u3053\u3068\u3067\u3001\u4EE5\u4E0B\u306E\u4FEE\u6B63\u304C\u5B8C\u4E86\u3057\u307E\u3059\u3002
 step2.description=\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB/\u30AA\u30FC\u30D0\u30FC\u30D3\u30E5\u30FC
 step2.novalidChanges=\u4FEE\u6B63\u306F\u3001\u3042\u308A\u307E\u305B\u3093\u3002\u30A6\u30A3\u30B6\u30FC\u30C9\u3092\u5B8C\u4E86\u3067\u304D\u307E\u305B\u3093\u3002
-table.role.admin=\u30B7\u30B9\u30C6\u30E0\u7BA1\u7406\u8005
+table.role.administrator=\u30B7\u30B9\u30C6\u30E0\u7BA1\u7406\u8005
 table.role.author=\u4F5C\u8005
-table.role.groupadmin=\u30B0\u30EB\u30FC\u30D7\u7BA1\u7406\u8005
+table.role.groupmanager=\u30B0\u30EB\u30FC\u30D7\u7BA1\u7406\u8005
 table.role.status=\u30B9\u30C6\u30FC\u30BF\u30B9
-table.role.useradmin=\u30E6\u30FC\u30B6\u7BA1\u7406\u8005
+table.role.usermanager=\u30E6\u30FC\u30B6\u7BA1\u7406\u8005
 table.user.login=\u30E6\u30FC\u30B6\u540D
 title=\u30E6\u30FC\u30B6\u5C5E\u6027\u306E\u4FEE\u6B63
diff --git a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_nl_NL.properties b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_nl_NL.properties
index e7b9da95bd9..9d8ce953c41 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_nl_NL.properties
+++ b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_nl_NL.properties
@@ -24,10 +24,10 @@ step1.title=Stel gebruikersrechten in
 step2.content=De volgende aanpassingen zullen voltooid worden wanneer u op "Finish" klikt.
 step2.description=Controle/overzicht
 step2.novalidChanges=Er zijn geen aanpassingen; de Wizard kan niet voltooid worden.
-table.role.admin=Systeemadministrator
+table.role.administrator=Systeemadministrator
 table.role.author=Auteur
-table.role.groupadmin=Groepsadministrator
+table.role.groupmanager=Groepsadministrator
 table.role.status=Status
-table.role.useradmin=Gebruikersadministrator
+table.role.usermanager=Gebruikersadministrator
 table.user.login=Gebruikersnaam
 title=Aanpassing van gebruikers- toewijzingen
diff --git a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_pl.properties b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_pl.properties
index 186ade5b6e1..c7fa9aed3e7 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_pl.properties
+++ b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_pl.properties
@@ -26,10 +26,10 @@ step1a.description=Wybierz grup\u0119(y)
 step2.content=Nast\u0119puj\u0105ce zmiany zostan\u0105 wprowadzone po wci\u015Bni\u0119ciu przycisku "Zako\u0144cz"
 step2.description=Kontrola / Przegl\u0105d
 step2.novalidChanges=Nie wprowadzono zmian, kreator nie mo\u017Ce zako\u0144czy\u0107 pracy.
-table.role.admin=Administrator systemu
+table.role.administrator=Administrator systemu
 table.role.author=Autor
-table.role.groupadmin=Administrator grup
+table.role.groupmanager=Administrator grup
 table.role.status=Status
-table.role.useradmin=Administrator u\u017Cytkownik\u00F3w
+table.role.usermanager=Administrator u\u017Cytkownik\u00F3w
 table.user.login=Nazwa u\u017Cytkownika
 title=Zmiana danych wielu u\u017Cytkownik\u00F3w
diff --git a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_pt_BR.properties
index cb167c3727d..d73080d3bd6 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_pt_BR.properties
+++ b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_pt_BR.properties
@@ -26,12 +26,12 @@ step1a.description=Escolher grupo(s)
 step2.content=As seguintes modifica\u00E7\u00F5es ir\u00E3o ser completadas cliclando em "Terminar"
 step2.description=Controle/ Vis\u00E3o Geral
 step2.novalidChanges=N\u00E3o existem modifica\u00E7\u00F5es; O Wizard n\u00E3o pode ser completado.
-table.role.admin=Administrador do Sistema
+table.role.administrator=Administrador do Sistema
 table.role.author=Autor
-table.role.groupadmin=Administrador de Grupo
-table.role.institutionManager=Gestor de recursos did\u00E1ticos
-table.role.poolManager=Gestor de banco de perguntas
+table.role.groupmanager=Administrador de Grupo
+table.role.learnresourcemanager=Gestor de recursos did\u00E1ticos
+table.role.poolmanager=Gestor de banco de perguntas
 table.role.status=Status
-table.role.useradmin=Administrador de Usu\u00E1rio
+table.role.usermanager=Administrador de Usu\u00E1rio
 table.user.login=Usu\u00E1rio
 title=Modifica\u00E7\u00E3o de atributos de usu\u00E1rio
diff --git a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_sq.properties b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_sq.properties
index 8b0aa7fb568..c95cd828b56 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_sq.properties
+++ b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_sq.properties
@@ -14,10 +14,10 @@ step1.description=Rechte verteilen
 step2.content=Die folgenden \u00C4nderungen werden mit "Fertigstellen" ausgef\u00FChrt
 step2.description=Kontrolle / \u00DCbersicht
 step2.novalidChanges=Es wurden keine \u00C4nderungen vorgenommen, der Wizard kann so nicht fertiggestellt werden.
-table.role.admin=Administrator i sistemit
+table.role.administrator=Administrator i sistemit
 table.role.author=Autor
-table.role.groupadmin=Drejtues i grupev
+table.role.groupmanager=Drejtues i grupev
 table.role.status=Status
-table.role.useradmin=Drejtues i shfryt\u00EBzuesve
+table.role.usermanager=Drejtues i shfryt\u00EBzuesve
 table.user.login=Shfryt\u00EBzuesi
 title=Ndryshime n\u00EB mas\u00EB p\u00EBr shum\u00EB shfryt\u00EBzues
diff --git a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_zh_CN.properties b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_zh_CN.properties
index 875238cf544..f773992ac94 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_zh_CN.properties
+++ b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_zh_CN.properties
@@ -22,10 +22,10 @@ step1.title=\u8BBE\u7F6E\u7528\u6237\u7684\u6743\u5229
 step2.content=\u70B9\u51FB\u201C\u5B8C\u6210\u201D\u6309\u94AE\uFF0C\u5B8C\u6210\u4E0B\u9762\u7684\u4FEE\u6539\u3002
 step2.description=\u63A7\u5236/\u6982\u89C8
 step2.novalidChanges=\u6CA1\u6709\u505A\u4EFB\u4F55\u4FEE\u6539\uFF1B\u5411\u5BFC\u4E3A\u5B8C\u6210\u3002
-table.role.admin=\u7CFB\u7EDF\u7BA1\u7406\u5458
+table.role.administrator=\u7CFB\u7EDF\u7BA1\u7406\u5458
 table.role.author=\u521B\u5EFA\u8005
-table.role.groupadmin=\u7FA4\u7EC4\u7BA1\u7406\u5458
+table.role.groupmanager=\u7FA4\u7EC4\u7BA1\u7406\u5458
 table.role.status=\u72B6\u6001
-table.role.useradmin=\u7528\u6237\u7BA1\u7406\u5458
+table.role.usermanager=\u7528\u6237\u7BA1\u7406\u5458
 table.user.login=\u7528\u6237\u540D
 title=\u4FEE\u6539\u7528\u6237\u5C5E\u6027
diff --git a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_zh_TW.properties b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_zh_TW.properties
index 4d665be59de..aa56a1ca642 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_zh_TW.properties
+++ b/src/main/java/org/olat/admin/user/bulkChange/_i18n/LocalStrings_zh_TW.properties
@@ -24,10 +24,10 @@ step1.title=\u8A2D\u5B9A\u4F7F\u7528\u8005\u6B0A\u9650
 step2.content=\u4E0B\u5217\u7684\u4FEE\u6539\u5C07\u65BC\u6309\u4E0B\u300C\u7D50\u675F\u300D\u5F8C\u5B8C\u6210
 step2.description=\u63A7\u5236/ \u6982\u89C0
 step2.novalidChanges=\u6C92\u6709\u4FEE\u6539\uFF1B\u9019\u500B\u7CBE\u9748\u7121\u6CD5\u5B8C\u6210\u3002
-table.role.admin=\u7CFB\u7D71\u7BA1\u7406\u54E1
+table.role.administrator=\u7CFB\u7D71\u7BA1\u7406\u54E1
 table.role.author=\u4F5C\u8005
-table.role.groupadmin=\u7FA4\u7D44\u7BA1\u7406\u54E1
+table.role.groupmanager=\u7FA4\u7D44\u7BA1\u7406\u54E1
 table.role.status=\u72C0\u614B
-table.role.useradmin=\u4F7F\u7528\u8005\u7BA1\u7406\u54E1
+table.role.usermanager=\u4F7F\u7528\u8005\u7BA1\u7406\u54E1
 table.user.login=\u4F7F\u7528\u8005\u540D\u7A31
 title=\u4F7F\u7528\u8005\u5C6C\u6027\u4FEE\u6539
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 f859e245b66..3032f962776 100644
--- a/src/main/java/org/olat/admin/user/course/CourseOverviewController.java
+++ b/src/main/java/org/olat/admin/user/course/CourseOverviewController.java
@@ -32,7 +32,6 @@ import org.olat.NewControllerFactory;
 import org.olat.basesecurity.BaseSecurityModule;
 import org.olat.basesecurity.GroupRoles;
 import org.olat.core.commons.persistence.DB;
-import org.olat.core.commons.persistence.DBFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
@@ -457,7 +456,7 @@ public class CourseOverviewController extends BasicController  {
 
 		businessGroupService.updateMemberships(getIdentity(), e.getGroupChanges(), mailing);
 		//make sure all is committed before loading the model again (I see issues without)
-		DBFactory.getInstance().commitAndCloseSession();
+		dbInstance.commitAndCloseSession();
 		updateModel();
 	}
 	
@@ -505,8 +504,12 @@ public class CourseOverviewController extends BasicController  {
 		}
 		
 		//make sure all is committed before loading the model again (I see issues without)
-		DBFactory.getInstance().commitAndCloseSession();
-		MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getUserSession().getRoles().isOLATAdmin(), getLocale());
+		dbInstance.commitAndCloseSession();
+		
+		// print errors
+		Roles roles = ureq.getUserSession().getRoles();
+		boolean detailedErrorOutput = roles.isAdministrator() || roles.isSystemAdmin();
+		MailHelper.printErrorsAndWarnings(result, getWindowControl(), detailedErrorOutput, getLocale());
 	}
 
 	/**
@@ -516,7 +519,7 @@ public class CourseOverviewController extends BasicController  {
 	 */
 	private void doLeave(UserRequest ureq, Collection<CourseMemberView> views) {
 		List<Long> groupKeys = new ArrayList<Long>();
-		List<RepositoryEntry> repoEntryToLeave = new ArrayList<RepositoryEntry>();
+		List<RepositoryEntry> repoEntryToLeave = new ArrayList<>();
 		for(CourseMemberView view:views) {
 			for(BusinessGroupShort group:view.getGroups()) {
 				if(!BusinessGroupManagedFlag.isManaged(group.getManagedFlags(), BusinessGroupManagedFlag.membersmanagement)) {
@@ -539,7 +542,7 @@ public class CourseOverviewController extends BasicController  {
 		
 		List<BusinessGroup> groupsToLeave = businessGroupService.loadBusinessGroups(groupKeys);
 
-		List<BusinessGroup> groupsToDelete = new ArrayList<BusinessGroup>(1);
+		List<BusinessGroup> groupsToDelete = new ArrayList<>(1);
 		for(BusinessGroup group:groupsToLeave) {
 			int numOfOwners = businessGroupService.countMembers(group, GroupRoles.coach.name());
 			int numOfParticipants = businessGroupService.countMembers(group, GroupRoles.participant.name());
@@ -577,7 +580,9 @@ public class CourseOverviewController extends BasicController  {
 				MailPackage mailing = new MailPackage(doSendMail);
 				// 2) remove as participant
 				businessGroupService.removeParticipants(getIdentity(), membersToRemove, group, mailing);
-				MailHelper.printErrorsAndWarnings(mailing.getResult(), getWindowControl(), ureq.getUserSession().getRoles().isOLATAdmin(), getLocale());
+				Roles roles = ureq.getUserSession().getRoles();
+				boolean detailedErrorOutput = roles.isAdministrator() || roles.isSystemAdmin();
+				MailHelper.printErrorsAndWarnings(mailing.getResult(), getWindowControl(), detailedErrorOutput, getLocale());
 			}
 		}
 		
diff --git a/src/main/java/org/olat/admin/user/delete/BulkDeleteController.java b/src/main/java/org/olat/admin/user/delete/BulkDeleteController.java
index c532000e78b..2c0b66660a5 100644
--- a/src/main/java/org/olat/admin/user/delete/BulkDeleteController.java
+++ b/src/main/java/org/olat/admin/user/delete/BulkDeleteController.java
@@ -24,8 +24,9 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
-import org.olat.admin.securitygroup.gui.UserControllerFactory;
+import org.olat.admin.user.UserTableDataModel;
 import org.olat.basesecurity.BaseSecurity;
+import org.olat.basesecurity.BaseSecurityModule;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
@@ -39,58 +40,70 @@ import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
+import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
 import org.olat.core.util.WebappHelper;
 import org.olat.core.util.mail.ContactList;
 import org.olat.core.util.mail.MailBundle;
 import org.olat.core.util.mail.MailManager;
+import org.olat.user.UserManager;
 import org.springframework.beans.factory.annotation.Autowired;
 
 public class BulkDeleteController extends BasicController {
 	
-	private VelocityContainer vc;
+	private final VelocityContainer vc;
 	
-	private String userlist, reason;
+	private String userlist;
+	private String reason;
 	private List<Identity> toDelete;
 	private List<String> lstLoginsFound;
 	private List<String> lstLoginsNotfound;
 	
-	private TableController tblCtrFound, tblCtrNotfound;
+	private TableController tblCtrFound;
+	private TableController tblCtrNotfound;
 	private Link btnNext;
 	
+	private final boolean isAdministrativeUser;
+	
 	@Autowired
 	private MailManager mailService;
 	@Autowired
+	private UserManager userManager;
+	@Autowired
 	private BaseSecurity securityManager;
+	@Autowired
+	private BaseSecurityModule securityModule;
 
 	public BulkDeleteController(UserRequest ureq, WindowControl wControl, String userlist, String reason) {
 		super(ureq, wControl);
-		
 		this.userlist = userlist;
 		this.reason = reason;
+		isAdministrativeUser = securityModule.isUserAllowedAdminProps(ureq.getUserSession().getRoles());
 		
 		vc = createVelocityContainer("bulkdelete");
 		processUserList(this.userlist);
 		
-		if(toDelete != null && toDelete.size() > 0) {
-			tblCtrFound = UserControllerFactory.createTableControllerFor(new TableGuiConfiguration(), toDelete, ureq, getWindowControl(), null);
+		if(toDelete != null && !toDelete.isEmpty()) {
+			Translator trans = userManager.getPropertyHandlerTranslator(getTranslator());
+			tblCtrFound = new TableController(new TableGuiConfiguration(), ureq, wControl, trans);
+			UserTableDataModel userDataModel = new UserTableDataModel(toDelete, getLocale(), isAdministrativeUser);
+			userDataModel.addColumnDescriptors(tblCtrFound, null);
+			tblCtrFound.setTableDataModel(userDataModel);
 			listenTo(tblCtrFound);
 			btnNext = LinkFactory.createButton("next", vc, this);
 			vc.put("table.users.found", tblCtrFound.getInitialComponent());
 		}
 		
-		if(lstLoginsNotfound.size() > 0) {
+		if(!lstLoginsNotfound.isEmpty()) {
 			tblCtrNotfound = new TableController(null, ureq, wControl, getTranslator());
 			listenTo(tblCtrNotfound);
 			tblCtrNotfound.addColumnDescriptor(new DefaultColumnDescriptor("table.col.login", 0, null, ureq.getLocale()));
 			TableDataModel<String> tblData = new LoginTableDataModel(lstLoginsNotfound);
 			tblCtrNotfound.setTableDataModel(tblData);
-			
 			vc.put("table.users.notfound", tblCtrNotfound.getInitialComponent());
 		}
 		
-		vc.contextPut("reason", this.reason);
-		
+		vc.contextPut("reason", reason);
 		putInitialPanel(vc);
 	}
 
diff --git a/src/main/java/org/olat/admin/user/groups/GroupOverviewController.java b/src/main/java/org/olat/admin/user/groups/GroupOverviewController.java
index cc80983c1b1..2f76122412d 100644
--- a/src/main/java/org/olat/admin/user/groups/GroupOverviewController.java
+++ b/src/main/java/org/olat/admin/user/groups/GroupOverviewController.java
@@ -51,6 +51,7 @@ import org.olat.core.gui.control.generic.closablewrapper.CloseableModalControlle
 import org.olat.core.gui.control.generic.modal.DialogBoxController;
 import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
 import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.core.util.Util;
 import org.olat.core.util.mail.MailHelper;
 import org.olat.core.util.mail.MailPackage;
@@ -149,12 +150,12 @@ public class GroupOverviewController extends BasicController {
 
 		//retrieve all user's membership if there are more than 50 groups
 		List<BusinessGroupMembership> groupsAsOwner = businessGroupService.getBusinessGroupMembership(groupKeysWithMembers, identity);
-		Map<Long, BusinessGroupMembership> memberships = new HashMap<Long, BusinessGroupMembership>();
+		Map<Long, BusinessGroupMembership> memberships = new HashMap<>();
 		for(BusinessGroupMembership membership: groupsAsOwner) {
 			memberships.put(membership.getGroupKey(), membership);
 		}
 
-		List<GroupOverviewRow> items = new ArrayList<GroupOverviewRow>();
+		List<GroupOverviewRow> items = new ArrayList<>();
 		for(BusinessGroup group:groups) {
 			BusinessGroupMembership membership =  memberships.get(group.getKey());
 			GroupOverviewRow tableItem = new GroupOverviewRow(group, membership, Boolean.TRUE);
@@ -264,7 +265,7 @@ public class GroupOverviewController extends BasicController {
 	}
 	
 	private void doAddToGroups(AddToGroupsEvent e, boolean sendMail) {
-		List<BusinessGroupMembershipChange> changes = new ArrayList<BusinessGroupMembershipChange>();
+		List<BusinessGroupMembershipChange> changes = new ArrayList<>();
 		if(e.getOwnerGroupKeys() != null && !e.getOwnerGroupKeys().isEmpty()) {
 			for(Long tutorGroupKey:e.getOwnerGroupKeys()) {
 				BusinessGroupMembershipChange change = new BusinessGroupMembershipChange(identity, tutorGroupKey);
@@ -285,7 +286,7 @@ public class GroupOverviewController extends BasicController {
 	}
 	
 	private void doLeave(UserRequest ureq, List<BusinessGroup> groupsToLeave) {
-		List<BusinessGroup> groupsToDelete = new ArrayList<BusinessGroup>(1);
+		List<BusinessGroup> groupsToDelete = new ArrayList<>(1);
 		for(BusinessGroup group:groupsToLeave) {
 			int numOfOwners = businessGroupService.countMembers(group, GroupRoles.coach.name());
 			int numOfParticipants = businessGroupService.countMembers(group, GroupRoles.participant.name());
@@ -308,6 +309,8 @@ public class GroupOverviewController extends BasicController {
 	 * @param doSendMail
 	 */
 	private void removeUserFromGroup(UserRequest ureq, List<BusinessGroup> groupsToLeave, List<BusinessGroup> groupsToDelete, boolean doSendMail) {
+		Roles roles = ureq.getUserSession().getRoles();
+		
 		for(BusinessGroup group:groupsToLeave) {
 			if (groupsToDelete.contains(group)) {
 				// really delete the group as it has no more owners/participants
@@ -325,7 +328,8 @@ public class GroupOverviewController extends BasicController {
 				MailPackage mailing = new MailPackage(doSendMail);
 				// 2) remove as participant
 				businessGroupService.removeParticipants(getIdentity(), Collections.singletonList(identity), group, mailing);
-				MailHelper.printErrorsAndWarnings(mailing.getResult(), getWindowControl(), ureq.getUserSession().getRoles().isOLATAdmin(), getLocale());
+				MailHelper.printErrorsAndWarnings(mailing.getResult(), getWindowControl(),
+						roles.isAdministrator() || roles.isSystemAdmin(), getLocale());
 			}
 		}
 
@@ -340,11 +344,10 @@ public class GroupOverviewController extends BasicController {
 	}
 	
 	private List<BusinessGroup> toBusinessGroups(List<GroupOverviewRow> items) {
-		List<Long> groupKeys = new ArrayList<Long>();
+		List<Long> groupKeys = new ArrayList<>();
 		for(GroupOverviewRow item:items) {
 			groupKeys.add(item.getKey());
 		}
-		List<BusinessGroup> groups = businessGroupService.loadBusinessGroups(groupKeys);
-		return groups;
+		return businessGroupService.loadBusinessGroups(groupKeys);
 	}
 }
diff --git a/src/main/java/org/olat/basesecurity/AuthHelper.java b/src/main/java/org/olat/basesecurity/AuthHelper.java
index ac3858d9499..7000f8c763e 100644
--- a/src/main/java/org/olat/basesecurity/AuthHelper.java
+++ b/src/main/java/org/olat/basesecurity/AuthHelper.java
@@ -309,15 +309,16 @@ public class AuthHelper {
 		setRolesFor(identity, usess);
 
 		// check if loginDenied or maxSession (only for non-admin)
-		if ( (loginBlocked && !usess.getRoles().isOLATAdmin())
-				|| ( ((maxSessions != MAX_SESSION_NO_LIMIT) && (sessionManager.getUserSessionsCnt() >= maxSessions)) && !usess.getRoles().isOLATAdmin() ) ) {
+		if ( (loginBlocked && !usess.getRoles().isAdministrator() && !usess.getRoles().isSystemAdmin())
+				|| ( ((maxSessions != MAX_SESSION_NO_LIMIT) && (sessionManager.getUserSessionsCnt() >= maxSessions))
+						&& !usess.getRoles().isAdministrator() && !usess.getRoles().isSystemAdmin())) {
 			log.audit("Login was blocked for identity=" + usess.getIdentity().getKey() + ", loginBlocked=" + loginBlocked + " NbrOfSessions=" + sessionManager.getUserSessionsCnt());
 			sessionManager.signOffAndClear(usess);
 			return LOGIN_NOTAVAILABLE;
 		}
 
 		//need to block the all things for assessment?
-		if(usess.getRoles() != null && usess.getRoles().isOLATAdmin()) {
+		if(usess.getRoles() != null && (usess.getRoles().isAdministrator() || usess.getRoles().isSystemAdmin())) {
 			usess.setAssessmentModes(Collections.<TransientAssessmentMode>emptyList());
 		} else {
 			AssessmentModule assessmentModule = CoreSpringFactory.getImpl(AssessmentModule.class);
diff --git a/src/main/java/org/olat/basesecurity/BaseSecurity.java b/src/main/java/org/olat/basesecurity/BaseSecurity.java
index a5a1b2444b2..1c52d4fce10 100644
--- a/src/main/java/org/olat/basesecurity/BaseSecurity.java
+++ b/src/main/java/org/olat/basesecurity/BaseSecurity.java
@@ -54,6 +54,8 @@ public interface BaseSecurity {
 	 */
 	public Roles getRoles(IdentityRef identity);
 	
+	public Roles getRoles(IdentityRef identity, boolean withInherited);
+	
 	/**
 	 * Get the list of roles as string without inheritance (an admin
 	 * has only admin role and not the user manager role...).
@@ -77,10 +79,8 @@ public interface BaseSecurity {
 	 * Update the roles
 	 * @param actingIdentity The identity who is performing the change
 	 * @param updatedIdentity The identity that is changed
-	 * @param roles The new roles to set on updatedIdentity
+	 * @param roles The new roles to set
 	 */
-	//public void updateRoles(Identity actingIdentity, Identity updatedIdentity, Organisation organisation, Roles roles);
-	
 	public void updateRoles(Identity actingIdentity, Identity updatedIdentity, RolesByOrganisation organisation);
 
 	public boolean isGuest(IdentityRef identity);
@@ -151,13 +151,6 @@ public interface BaseSecurity {
 	 * @return The identities
 	 */
 	public List<IdentityShort> findShortIdentitiesByKey(Collection<Long> identityKeys);
-	
-	/**
-	 * Find identities which are not in a business group
-	 * @param status
-	 * @return
-	 */
-	public List<Identity> findIdentitiesWithoutBusinessGroup(Integer status);
 
 	/**
 	 * find an identity by the key instead of the username. Prefer this method as
@@ -171,14 +164,17 @@ public interface BaseSecurity {
 	/**
 	 * 
 	 * @param search The search
-	 * @return
+	 * @return A list of identities (short version)
 	 */
 	public List<IdentityShort> searchIdentityShort(String search, int maxResults);
 	
 	/**
+	 * The search look into name, first name, last name and email.
 	 * 
-	 * @param search The search
-	 * @return
+	 * @param search Search string
+	 * @param searchableOrganisations The organisations where the identities are
+	 * @param maxResults The max results or -1
+	 * @return A list of identities (short version)
 	 */
 	public List<IdentityShort> searchIdentityShort(String search, List<? extends OrganisationRef> searchableOrganisations, int maxResults);
 
diff --git a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java
index 7e73c3deb2e..a7531f8b3cd 100644
--- a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java
+++ b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java
@@ -68,7 +68,6 @@ import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.login.LoginModule;
 import org.olat.portfolio.manager.InvitationDAO;
-import org.olat.resource.OLATResource;
 import org.olat.user.UserDataDeletable;
 import org.olat.user.UserImpl;
 import org.olat.user.UserManager;
@@ -140,6 +139,11 @@ public class BaseSecurityManager implements BaseSecurity, UserDataDeletable {
 
 	@Override
 	public Roles getRoles(IdentityRef identity) {
+		return getRoles(identity, true);
+	}
+
+	@Override
+	public Roles getRoles(IdentityRef identity, boolean withInherited) {
 		boolean isGuestOnly = false;
 		boolean isInvitee = false;
 		
@@ -148,65 +152,39 @@ public class BaseSecurityManager implements BaseSecurity, UserDataDeletable {
 		  .append(" inner join org.group baseGroup")
 		  .append(" inner join baseGroup.members membership")
 		  .append(" where membership.identity.key=:identityKey");
+		if(!withInherited) {
+			sb.append(" and membership.inheritanceModeString in ('").append(GroupMembershipInheritance.none.name()).append("','").append(GroupMembershipInheritance.root.name()).append("')");
+		}
 		
 		List<Object[]> rawObjects = dbInstance.getCurrentEntityManager()
 				.createQuery(sb.toString(), Object[].class)
 				.setParameter("identityKey", identity.getKey())
 				.getResultList();
 		Map<OrganisationRef, List<OrganisationRoles>> orgToRoles = new HashMap<>();
-		
-		boolean sysAdmin = false;
-		boolean admin = false;
-		
-		boolean groupManager = false;
-		boolean userManager = false;
-		boolean resourceManager = false;
-		boolean poolManager = false;
-		boolean curriculumnManager = false;
-		
-		boolean author = false;
-		boolean coach = false;
-		
+
 		for(Object[] rawObject:rawObjects) {
 			Long organisationKey = (Long)rawObject[0];
-			String organisationId = (String)rawObject[1];
 			String role = (String)rawObject[2];
 			if(!OrganisationRoles.isValue(role)) {
 				continue;
 			}
-			
-			boolean defOrganisation = OrganisationService.DEFAULT_ORGANISATION_IDENTIFIER.equals(organisationId);
-			
+
 			List<OrganisationRoles> roleList = orgToRoles
 					.computeIfAbsent(new OrganisationRefImpl(organisationKey), key -> new ArrayList<>());
 			roleList.add(OrganisationRoles.valueOf(role));
-			
-			sysAdmin |= role.equals(OrganisationRoles.sysadmin.name());
-			admin |= role.equals(OrganisationRoles.administrator.name());
-			
-			groupManager |= role.equals(OrganisationRoles.groupmanager.name());
-			userManager |= role.equals(OrganisationRoles.usermanager.name());
-			resourceManager |= role.equals(OrganisationRoles.learnresourcemanager.name());
-			poolManager |= role.equals(OrganisationRoles.poolmanager.name());
-			curriculumnManager |= role.equals(OrganisationRoles.curriculummanager.name());
-
-			author |= role.equals(OrganisationRoles.author.name());
-			coach |= role.equals(OrganisationRoles.coach.name());
 		}
-		
 
 		List<String> rolesStr = getRolesAsString(identity);
 		if(!rolesStr.contains(OrganisationRoles.user.name())) {
 			isInvitee = invitationDao.isInvitee(identity);
 			isGuestOnly = rolesStr.contains(OrganisationRoles.guest.name());
 		}
-		Roles roles = new Roles(sysAdmin, admin, userManager, groupManager, author, isGuestOnly, resourceManager, poolManager, curriculumnManager, coach, isInvitee);
+				
 		List<RolesByOrganisation> rolesByOrganisations = new ArrayList<>();
 		for(Map.Entry<OrganisationRef, List<OrganisationRoles>> entry:orgToRoles.entrySet()) {
 			rolesByOrganisations.add(new RolesByOrganisation(entry.getKey(), entry.getValue()));
 		}
-		roles.setRolesByOrganisation(rolesByOrganisations);
-		return roles;
+		return Roles.valueOf(rolesByOrganisations, isGuestOnly, isInvitee);
 	}
 
 	@Override
@@ -241,69 +219,43 @@ public class BaseSecurityManager implements BaseSecurity, UserDataDeletable {
 	@Override
 	public void updateRoles(Identity actingIdentity, Identity updatedIdentity, RolesByOrganisation roles) {
 		Organisation organisation = organisationService.getOrganisation(roles.getOrganisation());
-		
 		List<String> currentRoles = getRolesAsString(updatedIdentity, organisation);
 		
 		boolean hasBeenAnonymous = currentRoles.contains(OrganisationRoles.guest.name());
-		updateRolesInSecurityGroup(organisation, actingIdentity, updatedIdentity,
+		updateRolesInOrganisation(organisation, actingIdentity, updatedIdentity,
 				OrganisationRoles.guest, hasBeenAnonymous, roles.isGuestOnly());
 		
-		// system users - opposite of anonymous users
-		boolean hasBeenUser = currentRoles.contains(OrganisationRoles.user.name());
-		updateRolesInSecurityGroup(organisation, actingIdentity, updatedIdentity,
-				OrganisationRoles.user, hasBeenUser, !roles.isGuestOnly());
-
-		// coach
-		boolean hasBeenAuthor = currentRoles.contains(OrganisationRoles.author.name());
-		boolean isAuthor = (roles.isAuthor() || roles.isLearnResourceManager()) && !roles.isGuestOnly() && !roles.isInvitee();
-		updateRolesInSecurityGroup(organisation, actingIdentity, updatedIdentity,
-				OrganisationRoles.author, hasBeenAuthor, isAuthor);
-
-		// author
-		boolean hasBeenCoach = currentRoles.contains(OrganisationRoles.coach.name());
-		boolean isCoach = roles.isCoach() && !roles.isGuestOnly() && !roles.isInvitee();
-		updateRolesInSecurityGroup(organisation, actingIdentity, updatedIdentity,
-				OrganisationRoles.coach, hasBeenCoach, isCoach);
-
-		// group manager
-		boolean hasBeenGroupManager = currentRoles.contains(OrganisationRoles.groupmanager.name());
-		boolean groupManager = roles.isGroupManager() && !roles.isGuestOnly() && !roles.isInvitee();
-		updateRolesInSecurityGroup(organisation, actingIdentity, updatedIdentity,
-				OrganisationRoles.groupmanager, hasBeenGroupManager, groupManager);
-		
-		// user manager, only allowed by admin
-		boolean hasBeenUserManager = currentRoles.contains(OrganisationRoles.usermanager.name());
-		boolean userManager = roles.isUserManager() && !roles.isGuestOnly() && !roles.isInvitee();
-		updateRolesInSecurityGroup(organisation, actingIdentity, updatedIdentity,
-				OrganisationRoles.usermanager, hasBeenUserManager, userManager);
-
- 		// institutional resource manager
-		boolean hasBeenInstitutionalResourceManager = currentRoles.contains(OrganisationRoles.learnresourcemanager.name());
-		boolean institutionalResourceManager = roles.isLearnResourceManager() && !roles.isGuestOnly() && !roles.isInvitee();
-		updateRolesInSecurityGroup(organisation, actingIdentity, updatedIdentity,
-				OrganisationRoles.learnresourcemanager, hasBeenInstitutionalResourceManager, institutionalResourceManager);
-
-		// institutional resource manager
-		boolean hasBeenPoolManager = currentRoles.contains(OrganisationRoles.poolmanager.name());
-		boolean poolManager = roles.isPoolManager() && !roles.isGuestOnly() && !roles.isInvitee();
-		updateRolesInSecurityGroup(organisation, actingIdentity, updatedIdentity,
-				OrganisationRoles.poolmanager, hasBeenPoolManager, poolManager);
+		boolean hasBeenInvitee = currentRoles.contains(OrganisationRoles.invitee.name());
+		updateRolesInOrganisation(organisation, actingIdentity, updatedIdentity,
+				OrganisationRoles.invitee, hasBeenInvitee, roles.isInvitee());
+
+		updateRoles(organisation, roles, currentRoles, OrganisationRoles.user, actingIdentity, updatedIdentity);
+		updateRoles(organisation, roles, currentRoles, OrganisationRoles.author, actingIdentity, updatedIdentity);
 		
-		// institutional resource manager
-		boolean hasBeenCurriculumManager = currentRoles.contains(OrganisationRoles.curriculummanager.name());
-		boolean curriculumManager = roles.isCurriculumManager() && !roles.isGuestOnly() && !roles.isInvitee();
-		updateRolesInSecurityGroup(organisation, actingIdentity, updatedIdentity,
-				OrganisationRoles.curriculummanager, hasBeenCurriculumManager, curriculumManager);
-
-		// system administrator
-		boolean hasBeenAdmin = currentRoles.contains(OrganisationRoles.administrator.name());
-		boolean isOLATAdmin = roles.isAdministrator() && !roles.isGuestOnly() && !roles.isInvitee();
-		updateRolesInSecurityGroup(organisation, actingIdentity, updatedIdentity,
-				OrganisationRoles.administrator, hasBeenAdmin, isOLATAdmin);		
+		updateRoles(organisation, roles, currentRoles, OrganisationRoles.groupmanager, actingIdentity, updatedIdentity);
+		updateRoles(organisation, roles, currentRoles, OrganisationRoles.usermanager, actingIdentity, updatedIdentity);
+		updateRoles(organisation, roles, currentRoles, OrganisationRoles.rolesmanager, actingIdentity, updatedIdentity);
+		updateRoles(organisation, roles, currentRoles, OrganisationRoles.learnresourcemanager, actingIdentity, updatedIdentity);
+		updateRoles(organisation, roles, currentRoles, OrganisationRoles.poolmanager, actingIdentity, updatedIdentity);
+		updateRoles(organisation, roles, currentRoles, OrganisationRoles.curriculummanager, actingIdentity, updatedIdentity);
+		updateRoles(organisation, roles, currentRoles, OrganisationRoles.lecturemanager, actingIdentity, updatedIdentity);
+		updateRoles(organisation, roles, currentRoles, OrganisationRoles.qualitymanager, actingIdentity, updatedIdentity);
+		updateRoles(organisation, roles, currentRoles, OrganisationRoles.linemanager, actingIdentity, updatedIdentity);
+
+		updateRoles(organisation, roles, currentRoles, OrganisationRoles.principal, actingIdentity, updatedIdentity);
+		updateRoles(organisation, roles, currentRoles, OrganisationRoles.administrator, actingIdentity, updatedIdentity);
+		updateRoles(organisation, roles, currentRoles, OrganisationRoles.sysadmin, actingIdentity, updatedIdentity);
 	}
 	
+	private void updateRoles(Organisation organisation, RolesByOrganisation roles, List<String> currentRoles, OrganisationRoles role,
+			Identity actingIdentity, Identity updatedIdentity) {
+		boolean hasBeenAdmin = currentRoles.contains(role.name());
+		boolean isOLATAdmin = roles.hasRole(role) && !roles.isGuestOnly() && !roles.isInvitee();
+		updateRolesInOrganisation(organisation, actingIdentity, updatedIdentity,
+				role, hasBeenAdmin, isOLATAdmin);	
+	}
 	
-	private void updateRolesInSecurityGroup(Organisation organisation, Identity actingIdentity, Identity updatedIdentity,
+	private void updateRolesInOrganisation(Organisation organisation, Identity actingIdentity, Identity updatedIdentity,
 			OrganisationRoles role, boolean hasBeen, boolean isNow) {
 		if (!hasBeen && isNow) {
 			// user not yet in security group, add him
@@ -358,26 +310,6 @@ public class BaseSecurityManager implements BaseSecurity, UserDataDeletable {
 		return openolatRoles;
 	}
 
-
-	public Policy findPolicy(SecurityGroup secGroup, String permission, OLATResource olatResource) {
-		StringBuilder sb = new StringBuilder();
-		sb.append("select poi from ").append(PolicyImpl.class.getName()).append(" as poi ")
-		  .append(" where poi.permission=:permission and poi.olatResource.key=:resourceKey and poi.securityGroup.key=:secGroupKey");
-
-		List<Policy> policies = dbInstance.getCurrentEntityManager()
-				.createQuery(sb.toString(), Policy.class)
-				.setParameter("permission", permission)
-				.setParameter("resourceKey", olatResource.getKey())
-				.setParameter("secGroupKey", secGroup.getKey())
-				.getResultList();
-		  		
-
-		if (policies.isEmpty()) {
-			return null;
-		}
-		return policies.get(0);
-	}
-
 	/**
 	 * @param username The username
 	 * @param user The unpresisted User
@@ -479,8 +411,6 @@ public class BaseSecurityManager implements BaseSecurity, UserDataDeletable {
 		CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(new NewIdentityCreatedEvent(newIdentity), IDENTITY_EVENT_CHANNEL);
 	}
 
-
-
 	@Override
 	public Identity findIdentityByName(String identityName) {
 		if (identityName == null) throw new AssertException("findIdentitybyName: name was null");
@@ -576,7 +506,7 @@ public class BaseSecurityManager implements BaseSecurity, UserDataDeletable {
 		  .append(" where lower(ident.name) in (:usernames)");
 		
 		List<String> loweredIdentityNames = identityNames.stream()
-				.map(id -> id.toLowerCase()).collect(Collectors.toList());
+				.map(String::toLowerCase).collect(Collectors.toList());
 
 		return dbInstance.getCurrentEntityManager()
 				.createQuery(sb.toString(), Identity.class)
@@ -643,7 +573,7 @@ public class BaseSecurityManager implements BaseSecurity, UserDataDeletable {
 
 		int count = 0;
 		int batch = 500;
-		List<Long> names = new ArrayList<Long>(identityKeys);
+		List<Long> names = new ArrayList<>(identityKeys);
 		List<IdentityShort> shortIdentities = new ArrayList<>(names.size());
 		do {
 			int toIndex = Math.min(count + batch, names.size());
@@ -655,39 +585,7 @@ public class BaseSecurityManager implements BaseSecurity, UserDataDeletable {
 		} while(count < names.size());
 		return shortIdentities;
 	}
-	
-	public List<Identity> findIdentitiesWithoutBusinessGroup(Integer status) {
-		StringBuilder sb = new StringBuilder();
-		sb.append("select ident from ").append(IdentityImpl.class.getName()).append(" as ident ")
-		  .append(" inner join fetch ident.user user ")
-		  .append(" where not exists (")
-		  .append("   select bgroup from businessgroup bgroup, bgroupmember as me")
-		  .append("   where  me.group.key=bgroup.baseGroup.key and me.identity.key=ident.key")
-		  .append(" )");
-		if (status != null) {
-			if (status.equals(Identity.STATUS_VISIBLE_LIMIT)) {
-				// search for all status smaller than visible limit 
-				sb.append(" and ident.status < :status ");
-			} else {
-				// search for certain status
-				sb.append(" and ident.status = :status ");
-			}
-		} else {
-			sb.append(" and ident.status < ").append(Identity.STATUS_DELETED);
-		}
-		
-		TypedQuery<Identity> query = dbInstance.getCurrentEntityManager()
-				.createQuery(sb.toString(), Identity.class);
-		if (status != null) {
-			query.setParameter("status", status);
-		}
-		return query.getResultList();
-	}
 
-	/**
-	 * 
-	 * @see org.olat.basesecurity.Manager#loadIdentityByKey(java.lang.Long)
-	 */
 	@Override
 	public Identity loadIdentityByKey(Long identityKey) {
 		StringBuilder sb = new StringBuilder();
@@ -720,9 +618,6 @@ public class BaseSecurityManager implements BaseSecurity, UserDataDeletable {
 				.getResultList();
 	}
 
-	/**
-	 * @see org.olat.basesecurity.Manager#loadIdentityByKey(java.lang.Long,boolean)
-	 */
 	@Override
 	public Identity loadIdentityByKey(Long identityKey, boolean strict) {
 		if(strict) return loadIdentityByKey(identityKey);
@@ -930,9 +825,6 @@ public class BaseSecurityManager implements BaseSecurity, UserDataDeletable {
 		}
 	}
 
-	/**
-	 * @see org.olat.basesecurity.Manager#findAuthentication(org.olat.core.id.Identity, java.lang.String)
-	 */
 	@Override
 	public Authentication findAuthentication(IdentityRef identity, String provider) {
 		if (identity==null) {
@@ -988,10 +880,7 @@ public class BaseSecurityManager implements BaseSecurity, UserDataDeletable {
 		}
 		return results.get(0);
 	}
-	
-	/**
-	 * @see org.olat.basesecurity.Manager#findAuthentication(org.olat.core.id.Identity, java.lang.String)
-	 */
+
 	@Override
 	public List<Authentication> findAuthenticationByToken(String provider, String securityToken) {
 		if (provider==null || securityToken==null) {
@@ -1080,9 +969,6 @@ public class BaseSecurityManager implements BaseSecurity, UserDataDeletable {
 		return updateAuthentication(authentication);
 	}
 
-	/**
-	 * @see org.olat.basesecurity.Manager#deleteAuthentication(org.olat.basesecurity.Authentication)
-	 */
 	@Override
 	public void deleteAuthentication(Authentication auth) {
 		if(auth == null || auth.getKey() == null) return;//nothing to do
@@ -1126,9 +1012,6 @@ public class BaseSecurityManager implements BaseSecurity, UserDataDeletable {
 				.executeUpdate();
 	}
 
-	/**
-	 * @see org.olat.basesecurity.Manager#findAuthenticationByAuthusername(java.lang.String, java.lang.String)
-	 */
 	@Override
 	public Authentication findAuthenticationByAuthusername(String authusername, String provider) {
 		StringBuilder sb = new StringBuilder();
@@ -1216,9 +1099,6 @@ public class BaseSecurityManager implements BaseSecurity, UserDataDeletable {
 		return (status != null && status.intValue() < Identity.STATUS_VISIBLE_LIMIT);
 	}
 
-	/**
-	 * @see org.olat.basesecurity.Manager#saveIdentityStatus(org.olat.core.id.Identity)
-	 */
 	@Override
 	public Identity saveIdentityStatus(Identity identity, Integer status, Identity doer) {
 		IdentityImpl reloadedIdentity = loadForUpdate(identity);
diff --git a/src/main/java/org/olat/basesecurity/BaseSecurityModule.java b/src/main/java/org/olat/basesecurity/BaseSecurityModule.java
index 233d58ac319..dc7de9e22f9 100644
--- a/src/main/java/org/olat/basesecurity/BaseSecurityModule.java
+++ b/src/main/java/org/olat/basesecurity/BaseSecurityModule.java
@@ -48,24 +48,61 @@ import org.springframework.stereotype.Service;
 public class BaseSecurityModule extends AbstractSpringModule {
 	
 	private static final OLog log = Tracing.createLoggerFor(BaseSecurityModule.class);
+	
+	private static final OrganisationRoles[] privacyRoles = new OrganisationRoles[]{
+			OrganisationRoles.user, OrganisationRoles.author,
+			OrganisationRoles.usermanager, OrganisationRoles.rolesmanager,
+			OrganisationRoles.groupmanager, OrganisationRoles.learnresourcemanager,
+			OrganisationRoles.poolmanager, OrganisationRoles.curriculummanager,
+			OrganisationRoles.lecturemanager, OrganisationRoles.qualitymanager,
+			OrganisationRoles.linemanager, OrganisationRoles.principal,
+			OrganisationRoles.administrator, OrganisationRoles.sysadmin
+	};
 
 	private static final String USERSEARCH_ADMINPROPS_USERS = "userSearchAdminPropsForUsers";
 	private static final String USERSEARCH_ADMINPROPS_AUTHORS = "userSearchAdminPropsForAuthors";
 	private static final String USERSEARCH_ADMINPROPS_USERMANAGERS = "userSearchAdminPropsForUsermanagers";
+	private static final String USERSEARCH_ADMINPROPS_ROLESMANAGERS = "userSearchAdminPropsForRolesmanagers";
 	private static final String USERSEARCH_ADMINPROPS_GROUPMANAGERS = "userSearchAdminPropsForGroupmanagers";
+	private static final String USERSEARCH_ADMINPROPS_LEARNRESOURCEMANAGERS = "userSearchAdminPropsForLearnresourcemanagers";
+	private static final String USERSEARCH_ADMINPROPS_POOLMANAGERS = "userSearchAdminPropsForPoolmanagers";
+	private static final String USERSEARCH_ADMINPROPS_CURRICULUMMANAGERS = "userSearchAdminPropsForCurriculummanagers";
+	private static final String USERSEARCH_ADMINPROPS_LECTUREMANAGERS = "userSearchAdminPropsForLecturemanagers";
+	private static final String USERSEARCH_ADMINPROPS_QUALITYMANAGERS = "userSearchAdminPropsForQualitymanagers";
+	private static final String USERSEARCH_ADMINPROPS_LINEMANAGERS = "userSearchAdminPropsForLinemanagers";
+	private static final String USERSEARCH_ADMINPROPS_PRINCIPALS = "userSearchAdminPropsForPrincipals";
 	private static final String USERSEARCH_ADMINPROPS_ADMINISTRATORS = "userSearchAdminPropsForAdministrators";
+	private static final String USERSEARCH_ADMINPROPS_SYSTEMADMINS = "userSearchAdminPropsForSystemAdmins";
 	
 	private static final String USER_LASTLOGIN_VISIBLE_USERS = "userLastLoginVisibleForUsers";
 	private static final String USER_LASTLOGIN_VISIBLE_AUTHORS = "userLastLoginVisibleForAuthors";
 	private static final String USER_LASTLOGIN_VISIBLE_USERMANAGERS = "userLastLoginVisibleForUsermanagers";
+	private static final String USER_LASTLOGIN_VISIBLE_ROLESMANAGERS = "userLastLoginVisibleForRolesmanagers";
 	private static final String USER_LASTLOGIN_VISIBLE_GROUPMANAGERS = "userLastLoginVisibleForGroupmanagers";
+	private static final String USER_LASTLOGIN_VISIBLE_LEARNRESOURCEMANAGERS = "userLastLoginVisibleForLearnresourcemanagers";
+	private static final String USER_LASTLOGIN_VISIBLE_POOLMANAGERS = "userLastLoginVisibleForPoolmanagers";
+	private static final String USER_LASTLOGIN_VISIBLE_CURRICULUMMANAGERS = "userLastLoginVisibleForCurriculummanagers";
+	private static final String USER_LASTLOGIN_VISIBLE_LECTUREMANAGERS = "userLastLoginVisibleForLecturemanagers";
+	private static final String USER_LASTLOGIN_VISIBLE_QUALITYMANAGERS = "userLastLoginVisibleForQualitymanagers";
+	private static final String USER_LASTLOGIN_VISIBLE_LINEMANAGERS = "userLastLoginVisibleForLinemanagers";
+	private static final String USER_LASTLOGIN_VISIBLE_PRINCIPALS = "userLastLoginVisibleForPrincipals";
 	private static final String USER_LASTLOGIN_VISIBLE_ADMINISTRATORS = "userLastLoginVisibleForAdministrators";
+	private static final String USER_LASTLOGIN_VISIBLE_SYSTEMADMINS = "userSearchAdminPropsForSystemAdmins";
 
 	private static final String USERSEARCHAUTOCOMPLETE_USERS = "userSearchAutocompleteForUsers";
 	private static final String USERSEARCHAUTOCOMPLETE_AUTHORS = "userSearchAutocompleteForAuthors";
 	private static final String USERSEARCHAUTOCOMPLETE_USERMANAGERS = "userSearchAutocompleteForUsermanagers";
+	private static final String USERSEARCHAUTOCOMPLETE_ROLESMANAGERS = "userSearchAutocompleteForRolesmanagers";
 	private static final String USERSEARCHAUTOCOMPLETE_GROUPMANAGERS = "userSearchAutocompleteForGroupmanagers";
+	private static final String USERSEARCHAUTOCOMPLETE_LEARNRESOURCEMANAGERS = "userSearchAutocompleteForLearnresourcemanagers";
+	private static final String USERSEARCHAUTOCOMPLETE_POOLMANAGERS = "userSearchAutocompleteForPoolmanagers";
+	private static final String USERSEARCHAUTOCOMPLETE_CURRICULUMMANAGERS = "userSearchAutocompleteForCurriculummanagers";
+	private static final String USERSEARCHAUTOCOMPLETE_LECTUREMANAGERS = "userSearchAutocompleteForLecturemanagers";
+	private static final String USERSEARCHAUTOCOMPLETE_QUALITYMANAGERS = "userSearchAutocompleteForQualitymanagers";
+	private static final String USERSEARCHAUTOCOMPLETE_LINEMANAGERS = "userSearchAutocompleteForLinemanagers";
+	private static final String USERSEARCHAUTOCOMPLETE_PRINCIPALS = "userSearchAutocompleteForPrincipals";
 	private static final String USERSEARCHAUTOCOMPLETE_ADMINISTRATORS = "userSearchAutocompleteForAdministrators";
+	private static final String USERSEARCHAUTOCOMPLETE_SYSTEMADMINS = "userSearchAdminPropsForSystemAdmins";
 	private static final String USERSEARCH_MAXRESULTS = "userSearchMaxResults";
 	
 
@@ -78,23 +115,14 @@ public class BaseSecurityModule extends AbstractSpringModule {
 	 * default values
 	 */
 	public static final Boolean USERMANAGER_CAN_CREATE_USER = true;
-	public static final Boolean USERMANAGER_CAN_DELETE_USER = false;
-	public static final Boolean USERMANAGER_CAN_CREATE_PWD = true;
-	public static final Boolean USERMANAGER_CAN_MODIFY_PWD = true;
+	public static final Boolean USERMANAGER_CAN_DELETE_USER = false;// fx -> true
 	public static final Boolean USERMANAGER_CAN_START_GROUPS = true;
 	public static final Boolean USERMANAGER_CAN_MODIFY_SUBSCRIPTIONS = true;
-	public static final Boolean USERMANAGER_ACCESS_TO_QUOTA = true;
-	public static final Boolean USERMANAGER_ACCESS_TO_PROP = false;
-	public static final Boolean USERMANAGER_ACCESS_TO_AUTH = false;
 	public static final Boolean USERMANAGER_CAN_MANAGE_POOLMANAGERS = true;
 	public static final Boolean USERMANAGER_CAN_MANAGE_GROUPMANAGERS = true;
 	public static final Boolean USERMANAGER_CAN_MANAGE_CURRICULUMMANAGERS = true;
-	public static final Boolean USERMANAGER_CAN_MANAGE_INSTITUTIONAL_RESOURCE_MANAGER = true;
-	public static final Boolean USERMANAGER_CAN_MANAGE_AUTHORS = true;
 	public static final Boolean USERMANAGER_CAN_MANAGE_GUESTS = false;
 	public static final Boolean USERMANAGER_CAN_MANAGE_STATUS = true;
-	public static final Boolean USERMANAGER_CAN_BYPASS_EMAILVERIFICATION = true;
-	public static final Boolean USERMANAGER_CAN_EDIT_ALL_PROFILE_FIELDS = true;
 	
 	private static String defaultAuthProviderIdentifier;
 
@@ -104,10 +132,28 @@ public class BaseSecurityModule extends AbstractSpringModule {
 	private String userSearchAdminPropsForAuthors;
 	@Value("${usersearch.adminProps.usermanagers:enabled}")
 	private String userSearchAdminPropsForUsermanagers;
+	@Value("${usersearch.adminProps.rolesmanagers:enabled}")
+	private String userSearchAdminPropsForRolesmanagers;
 	@Value("${usersearch.adminProps.groupmanagers:enabled}")
 	private String userSearchAdminPropsForGroupmanagers;
+	@Value("${usersearch.adminProps.learnresourcemanagers:enabled}")
+	private String userSearchAdminPropsForLearnresourcemanagers;
+	@Value("${usersearch.adminProps.poolmanagers:enabled}")
+	private String userSearchAdminPropsForPoolmanagers;
+	@Value("${usersearch.adminProps.curriculummanagers:enabled}")
+	private String userSearchAdminPropsForCurriculummanagers;
+	@Value("${usersearch.adminProps.lecturemanagers:enabled}")
+	private String userSearchAdminPropsForLecturemanagers;
+	@Value("${usersearch.adminProps.qualitymanagers:enabled}")
+	private String userSearchAdminPropsForQualitymanagers;
+	@Value("${usersearch.adminProps.linemanagers:enabled}")
+	private String userSearchAdminPropsForLinemanagers;
+	@Value("${usersearch.adminProps.principals:enabled}")
+	private String userSearchAdminPropsForPrincipals;
 	@Value("${usersearch.adminProps.administrators:enabled}")
 	private String userSearchAdminPropsForAdministrators;
+	@Value("${usersearch.adminProps.systemadmins:enabled}")
+	private String userSearchAdminPropsForSystemAdmins;
 
 	@Value("${user.lastlogin.visible.users:disabled}")
 	private String userLastLoginVisibleForUsers;
@@ -115,10 +161,29 @@ public class BaseSecurityModule extends AbstractSpringModule {
 	private String userLastLoginVisibleForAuthors;
 	@Value("${user.lastlogin.visible.usermanagers:enabled}")
 	private String userLastLoginVisibleForUsermanagers;
+	@Value("${user.lastlogin.visible.rolesmanagers:enabled}")
+	private String userLastLoginVisibleForRolesmanagers;
 	@Value("${user.lastlogin.visible.groupmanagers:enabled}")
 	private String userLastLoginVisibleForGroupmanagers;
+	@Value("${user.lastlogin.visible.learnresourcemanagers:enabled}")
+	private String userLastLoginVisibleForLearnresourcemanagers;
+	@Value("${user.lastlogin.visible.poolmanagers:enabled}")
+	private String userLastLoginVisibleForPoolmanagers;
+	@Value("${user.lastlogin.visible.curriculummanagers:enabled}")
+	private String userLastLoginVisibleForCurriculummanagers;
+	@Value("${user.lastlogin.visible.lecturemanagers:enabled}")
+	private String userLastLoginVisibleForLecturemanagers;
+	@Value("${user.lastlogin.visible.qualitymanagers:enabled}")
+	private String userLastLoginVisibleForQualitymanagers;
+	@Value("${user.lastlogin.visible.linemanagers:enabled}")
+	private String userLastLoginVisibleForLinemanagers;
+	@Value("${user.lastlogin.visible.principals:enabled}")
+	private String userLastLoginVisibleForPrincipals;
 	@Value("${user.lastlogin.visible.administrators:enabled}")
 	private String userLastLoginVisibleForAdministrators;
+	@Value("${user.lastlogin.visible.systemadmins:enabled}")
+	private String userLastLoginVisibleForSystemAdmins;
+	
 	
 	@Value("${usersearch.maxResults:-1}")
 	private String userSearchMaxResults;
@@ -128,10 +193,31 @@ public class BaseSecurityModule extends AbstractSpringModule {
 	private String userSearchAutocompleteForAuthors;
 	@Value("${usersearch.autocomplete.usermanagers:enabled}")
 	private String userSearchAutocompleteForUsermanagers;
+	@Value("${usersearch.autocomplete.rolesmanagers:enabled}")
+	private String userSearchAutocompleteForRolesmanagers;
 	@Value("${usersearch.autocomplete.groupmanagers:enabled}")
 	private String userSearchAutocompleteForGroupmanagers;
+	@Value("${usersearch.autocomplete.learnresourcemanagers:enabled}")
+	private String userSearchAutocompleteForLearnresourcemanagers;
+	@Value("${usersearch.autocomplete.poolmanagers:enabled}")
+	private String userSearchAutocompleteForPoolmanagers;
+	@Value("${usersearch.autocomplete.curriculummanagers:enabled}")
+	private String userSearchAutocompleteForCurriculummanagers;
+	@Value("${usersearch.autocomplete.lecturemanagers:enabled}")
+	private String userSearchAutocompleteForLecturemanagers;
+	@Value("${usersearch.autocomplete.qualitymanagers:enabled}")
+	private String userSearchAutocompleteForQualitymanagers;
+	@Value("${usersearch.autocomplete.linemanagers:enabled}")
+	private String userSearchAutocompleteForLinemanagers;
+	@Value("${usersearch.autocomplete.principals:enabled}")
+	private String userSearchAutocompleteForPrincipals;
 	@Value("${usersearch.autocomplete.administrators:enabled}")
 	private String userSearchAutocompleteForAdministrators;
+	@Value("${usersearch.autocomplete.systemadmins:enabled}")
+	private String userSearchAutocompleteForSystemAdmins;
+	
+	
+	
 	
 	@Value("${userinfos.tunnelcoursebuildingblock}")
 	private String userInfosTunnelCourseBuildingBlock;
@@ -166,263 +252,259 @@ public class BaseSecurityModule extends AbstractSpringModule {
 	}
 	
 	private void updateProperties() {
-		String enabled = getStringPropertyValue(USERSEARCH_ADMINPROPS_USERS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			userSearchAdminPropsForUsers = enabled;
-		}
-		enabled = getStringPropertyValue(USERSEARCH_ADMINPROPS_AUTHORS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			userSearchAdminPropsForAuthors = enabled;
-		}
-		enabled = getStringPropertyValue(USERSEARCH_ADMINPROPS_USERMANAGERS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			userSearchAdminPropsForUsermanagers = enabled;
-		}
-		enabled = getStringPropertyValue(USERSEARCH_ADMINPROPS_GROUPMANAGERS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			userSearchAdminPropsForGroupmanagers = enabled;
-		}
-		enabled = getStringPropertyValue(USERSEARCH_ADMINPROPS_ADMINISTRATORS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			userSearchAdminPropsForAdministrators = enabled;
-		}
-		
-		enabled = getStringPropertyValue(USER_LASTLOGIN_VISIBLE_USERS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			userLastLoginVisibleForUsers = enabled;
-		}
-		enabled = getStringPropertyValue(USER_LASTLOGIN_VISIBLE_AUTHORS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			userLastLoginVisibleForAuthors = enabled;
-		}
-		enabled = getStringPropertyValue(USER_LASTLOGIN_VISIBLE_USERMANAGERS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			userLastLoginVisibleForUsermanagers = enabled;
-		}
-		enabled = getStringPropertyValue(USER_LASTLOGIN_VISIBLE_GROUPMANAGERS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			userLastLoginVisibleForGroupmanagers = enabled;
-		}
-		enabled = getStringPropertyValue(USER_LASTLOGIN_VISIBLE_ADMINISTRATORS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			userLastLoginVisibleForAdministrators = enabled;
-		}
-
-		enabled = getStringPropertyValue(USERSEARCHAUTOCOMPLETE_USERS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			userSearchAutocompleteForUsers = enabled;
-		}
-		enabled = getStringPropertyValue(USERSEARCHAUTOCOMPLETE_AUTHORS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			userSearchAutocompleteForAuthors = enabled;
-		}
-		enabled = getStringPropertyValue(USERSEARCHAUTOCOMPLETE_USERMANAGERS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			userSearchAutocompleteForUsermanagers = enabled;
-		}
-		enabled = getStringPropertyValue(USERSEARCHAUTOCOMPLETE_GROUPMANAGERS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			userSearchAutocompleteForGroupmanagers = enabled;
-		}
-		enabled = getStringPropertyValue(USERSEARCHAUTOCOMPLETE_ADMINISTRATORS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			userSearchAutocompleteForAdministrators = enabled;
-		}
-		
-		String maxResults = getStringPropertyValue(USERSEARCH_MAXRESULTS, true);
-		if(StringHelper.containsNonWhitespace(maxResults)) {
-			userSearchMaxResults = maxResults;
-		}
-		
-		enabled = getStringPropertyValue(USERINFOS_TUNNEL_CBB, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			userInfosTunnelCourseBuildingBlock = enabled;
-		}
-
-		enabled = getStringPropertyValue(WIKI_ENABLED, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			wikiEnabled = enabled;
-		}
+		// view admin. properties
+		userSearchAdminPropsForUsers = getStringPropertyValue(USERSEARCH_ADMINPROPS_USERS, userSearchAdminPropsForUsers);
+		userSearchAdminPropsForAuthors = getStringPropertyValue(USERSEARCH_ADMINPROPS_AUTHORS, userSearchAdminPropsForAuthors);
+		userSearchAdminPropsForUsermanagers = getStringPropertyValue(USERSEARCH_ADMINPROPS_USERMANAGERS, userSearchAdminPropsForUsermanagers);
+		userSearchAdminPropsForRolesmanagers = getStringPropertyValue(USERSEARCH_ADMINPROPS_ROLESMANAGERS, userSearchAdminPropsForRolesmanagers);
+		userSearchAdminPropsForGroupmanagers = getStringPropertyValue(USERSEARCH_ADMINPROPS_GROUPMANAGERS, userSearchAdminPropsForGroupmanagers);
+		userSearchAdminPropsForLearnresourcemanagers = getStringPropertyValue(USERSEARCH_ADMINPROPS_LEARNRESOURCEMANAGERS, userSearchAdminPropsForLearnresourcemanagers);
+		userSearchAdminPropsForPoolmanagers = getStringPropertyValue(USERSEARCH_ADMINPROPS_POOLMANAGERS, userSearchAdminPropsForPoolmanagers);
+		userSearchAdminPropsForCurriculummanagers = getStringPropertyValue(USERSEARCH_ADMINPROPS_CURRICULUMMANAGERS, userSearchAdminPropsForCurriculummanagers);
+		userSearchAdminPropsForLecturemanagers = getStringPropertyValue(USERSEARCH_ADMINPROPS_LECTUREMANAGERS, userSearchAdminPropsForLecturemanagers);
+		userSearchAdminPropsForQualitymanagers = getStringPropertyValue(USERSEARCH_ADMINPROPS_QUALITYMANAGERS, userSearchAdminPropsForQualitymanagers);
+		userSearchAdminPropsForLinemanagers = getStringPropertyValue(USERSEARCH_ADMINPROPS_LINEMANAGERS, userSearchAdminPropsForLinemanagers);
+		userSearchAdminPropsForPrincipals = getStringPropertyValue(USERSEARCH_ADMINPROPS_PRINCIPALS, userSearchAdminPropsForPrincipals);
+		userSearchAdminPropsForAdministrators = getStringPropertyValue(USERSEARCH_ADMINPROPS_ADMINISTRATORS, userSearchAdminPropsForAdministrators);
+		userSearchAdminPropsForSystemAdmins = getStringPropertyValue(USERSEARCH_ADMINPROPS_SYSTEMADMINS, userSearchAdminPropsForSystemAdmins);
+
+		// view last login
+		userLastLoginVisibleForUsers = getStringPropertyValue(USER_LASTLOGIN_VISIBLE_USERS, userLastLoginVisibleForUsers);
+		userLastLoginVisibleForAuthors = getStringPropertyValue(USER_LASTLOGIN_VISIBLE_AUTHORS, userLastLoginVisibleForAuthors);
+		userLastLoginVisibleForUsermanagers = getStringPropertyValue(USER_LASTLOGIN_VISIBLE_USERMANAGERS, userLastLoginVisibleForUsermanagers);
+		userLastLoginVisibleForRolesmanagers = getStringPropertyValue(USER_LASTLOGIN_VISIBLE_ROLESMANAGERS, userLastLoginVisibleForRolesmanagers);
+		userLastLoginVisibleForGroupmanagers = getStringPropertyValue(USER_LASTLOGIN_VISIBLE_GROUPMANAGERS, userLastLoginVisibleForGroupmanagers);
+		userLastLoginVisibleForLearnresourcemanagers = getStringPropertyValue(USER_LASTLOGIN_VISIBLE_LEARNRESOURCEMANAGERS, userLastLoginVisibleForLearnresourcemanagers);
+		userLastLoginVisibleForPoolmanagers = getStringPropertyValue(USER_LASTLOGIN_VISIBLE_POOLMANAGERS, userLastLoginVisibleForPoolmanagers);
+		userLastLoginVisibleForCurriculummanagers = getStringPropertyValue(USER_LASTLOGIN_VISIBLE_CURRICULUMMANAGERS, userLastLoginVisibleForCurriculummanagers);
+		userLastLoginVisibleForLecturemanagers = getStringPropertyValue(USER_LASTLOGIN_VISIBLE_LECTUREMANAGERS, userLastLoginVisibleForLecturemanagers);
+		userLastLoginVisibleForQualitymanagers = getStringPropertyValue(USER_LASTLOGIN_VISIBLE_QUALITYMANAGERS, userLastLoginVisibleForQualitymanagers);
+		userLastLoginVisibleForLinemanagers = getStringPropertyValue(USER_LASTLOGIN_VISIBLE_LINEMANAGERS, userLastLoginVisibleForLinemanagers);
+		userLastLoginVisibleForAdministrators = getStringPropertyValue(USER_LASTLOGIN_VISIBLE_ADMINISTRATORS, userLastLoginVisibleForAdministrators);
+		userLastLoginVisibleForPrincipals = getStringPropertyValue(USER_LASTLOGIN_VISIBLE_PRINCIPALS, userLastLoginVisibleForPrincipals);
+		userLastLoginVisibleForSystemAdmins = getStringPropertyValue(USER_LASTLOGIN_VISIBLE_SYSTEMADMINS, userLastLoginVisibleForSystemAdmins);
+
+		// autocompletion
+		userSearchAutocompleteForUsers = getStringPropertyValue(USERSEARCHAUTOCOMPLETE_USERS, userSearchAutocompleteForUsers);
+		userSearchAutocompleteForAuthors = getStringPropertyValue(USERSEARCHAUTOCOMPLETE_AUTHORS, userSearchAutocompleteForAuthors);
+		userSearchAutocompleteForUsermanagers = getStringPropertyValue(USERSEARCHAUTOCOMPLETE_USERMANAGERS, userSearchAutocompleteForUsermanagers);
+		userSearchAutocompleteForRolesmanagers = getStringPropertyValue(USERSEARCHAUTOCOMPLETE_ROLESMANAGERS, userSearchAutocompleteForRolesmanagers);
+		userSearchAutocompleteForGroupmanagers = getStringPropertyValue(USERSEARCHAUTOCOMPLETE_GROUPMANAGERS, userSearchAutocompleteForGroupmanagers);
+		userSearchAutocompleteForLearnresourcemanagers = getStringPropertyValue(USERSEARCHAUTOCOMPLETE_LEARNRESOURCEMANAGERS, userSearchAutocompleteForLearnresourcemanagers);
+		userSearchAutocompleteForPoolmanagers = getStringPropertyValue(USERSEARCHAUTOCOMPLETE_POOLMANAGERS, userSearchAutocompleteForPoolmanagers);
+		userSearchAutocompleteForCurriculummanagers = getStringPropertyValue(USERSEARCHAUTOCOMPLETE_CURRICULUMMANAGERS, userSearchAutocompleteForCurriculummanagers);
+		userSearchAutocompleteForLecturemanagers = getStringPropertyValue(USERSEARCHAUTOCOMPLETE_LECTUREMANAGERS, userSearchAutocompleteForLecturemanagers);
+		userSearchAutocompleteForQualitymanagers = getStringPropertyValue(USERSEARCHAUTOCOMPLETE_QUALITYMANAGERS, userSearchAutocompleteForQualitymanagers);
+		userSearchAutocompleteForLinemanagers = getStringPropertyValue(USERSEARCHAUTOCOMPLETE_LINEMANAGERS, userSearchAutocompleteForLinemanagers);
+		userSearchAutocompleteForPrincipals = getStringPropertyValue(USERSEARCHAUTOCOMPLETE_PRINCIPALS, userSearchAutocompleteForPrincipals);
+		userSearchAutocompleteForAdministrators = getStringPropertyValue(USERSEARCHAUTOCOMPLETE_ADMINISTRATORS, userSearchAutocompleteForAdministrators);
+		userSearchAutocompleteForSystemAdmins = getStringPropertyValue(USERSEARCHAUTOCOMPLETE_SYSTEMADMINS, userSearchAutocompleteForSystemAdmins);
+
+		// other stuff
+		userSearchMaxResults = getStringPropertyValue(USERSEARCH_MAXRESULTS, userSearchMaxResults);
+		userInfosTunnelCourseBuildingBlock = getStringPropertyValue(USERINFOS_TUNNEL_CBB, userInfosTunnelCourseBuildingBlock);
+		wikiEnabled = getStringPropertyValue(WIKI_ENABLED, wikiEnabled);
 	}
 	
-	public boolean isUserAllowedAdminProps(Roles roles) {
-		if(roles == null) return false;
-		if(roles.isOLATAdmin()) {
-			return "enabled".equals(userSearchAdminPropsForAdministrators);
-		}
-		if(roles.isGroupManager()) {
-			return "enabled".equals(userSearchAdminPropsForGroupmanagers);
-		}
-		if(roles.isUserManager()) {
-			return "enabled".equals(userSearchAdminPropsForUsermanagers);
-		}
-		if(roles.isAuthor()) {
-			return "enabled".equals(userSearchAdminPropsForAuthors);
-		}
-		if(roles.isInvitee()) {
-			return false;
-		}
-		return "enabled".equals(userSearchAdminPropsForUsers);
-	}
-
-	public String getUserSearchAdminPropsForUsers() {
-		return userSearchAdminPropsForUsers;
-	}
-
-	public void setUserSearchAdminPropsForUsers(String enable) {
-		setStringProperty(USERSEARCH_ADMINPROPS_USERS, enable, true);
-	}
-
-	public String getUserSearchAdminPropsForAuthors() {
-		return userSearchAdminPropsForAuthors;
-	}
-
-	public void setUserSearchAdminPropsForAuthors(String enable) {
-		setStringProperty(USERSEARCH_ADMINPROPS_AUTHORS, enable, true);
-	}
-
-	public String getUserSearchAdminPropsForUsermanagers() {
-		return userSearchAdminPropsForUsermanagers;
-	}
-
-	public void setUserSearchAdminPropsForUsermanagers(String enable) {
-		setStringProperty(USERSEARCH_ADMINPROPS_USERMANAGERS, enable, true);
-	}
-
-	public String getUserSearchAdminPropsForGroupmanagers() {
-		return userSearchAdminPropsForGroupmanagers;
+	public static final OrganisationRoles[] getUserAllowedRoles() {
+		OrganisationRoles[] copy = new OrganisationRoles[privacyRoles.length];
+		System.arraycopy(privacyRoles, 0, copy, 0, privacyRoles.length);
+		return copy;
 	}
+	
+	public boolean isUserAllowedAdminProps(Roles roles) {
+		if(roles == null || roles.isInvitee() || roles.isGuestOnly()) return false;
 
-	public void setUserSearchAdminPropsForGroupmanagers(String enable) {
-		setStringProperty(USERSEARCH_ADMINPROPS_GROUPMANAGERS, enable, true);
+		boolean allowed = false;
+		for(OrganisationRoles role:privacyRoles) {
+			if(roles.hasRole(role) && "enabled".equals(getUserSearchAdminPropsFor(role))) {
+				allowed = true;
+				break;
+			}
+		}
+		return allowed;
 	}
 
-	public String getUserSearchAdminPropsForAdministrators() {
-		return userSearchAdminPropsForAdministrators;
+	public String getUserSearchAdminPropsFor(OrganisationRoles role) {
+		switch(role) {
+			case user: return userSearchAdminPropsForUsers;
+			case author: return userSearchAdminPropsForAuthors;
+			case usermanager: return userSearchAdminPropsForUsermanagers;
+			case rolesmanager: return userSearchAdminPropsForRolesmanagers;
+			case groupmanager: return userSearchAdminPropsForGroupmanagers;
+			case learnresourcemanager: return userSearchAdminPropsForLearnresourcemanagers;
+			case poolmanager: return userSearchAdminPropsForPoolmanagers;
+			case curriculummanager: return userSearchAdminPropsForCurriculummanagers;
+			case lecturemanager: return userSearchAdminPropsForLecturemanagers;
+			case qualitymanager: return userSearchAdminPropsForQualitymanagers;
+			case linemanager: return userSearchAdminPropsForLinemanagers;
+			case principal: return userSearchAdminPropsForPrincipals;
+			case administrator: return userSearchAdminPropsForAdministrators;
+			case sysadmin: return userSearchAdminPropsForSystemAdmins;
+			default: return "disabled";
+		}
 	}
-
-	public void setUserSearchAdminPropsForAdministrators(String enable) {
-		setStringProperty(USERSEARCH_ADMINPROPS_ADMINISTRATORS, enable, true);
+	
+	public void setUserSearchAdminPropsFor(OrganisationRoles role, String enable) {
+		switch(role) {
+			case user:
+				userSearchAdminPropsForUsers = setStringProperty(USERSEARCH_ADMINPROPS_USERS, enable, true);
+				break;
+			case author:
+				userSearchAdminPropsForAuthors = setStringProperty(USERSEARCH_ADMINPROPS_AUTHORS, enable, true);
+				break;
+			case usermanager:
+				userSearchAdminPropsForUsermanagers = setStringProperty(USERSEARCH_ADMINPROPS_USERMANAGERS, enable, true);
+				break;
+			case rolesmanager:
+				userSearchAdminPropsForRolesmanagers = setStringProperty(USERSEARCH_ADMINPROPS_ROLESMANAGERS, enable, true);
+				break;
+			case groupmanager:
+				userSearchAdminPropsForGroupmanagers = setStringProperty(USERSEARCH_ADMINPROPS_GROUPMANAGERS, enable, true);
+				break;
+			case learnresourcemanager:
+				userSearchAdminPropsForLearnresourcemanagers = setStringProperty(USERSEARCH_ADMINPROPS_LEARNRESOURCEMANAGERS, enable, true);
+				break;
+			case poolmanager:
+				userSearchAdminPropsForPoolmanagers = setStringProperty(USERSEARCH_ADMINPROPS_POOLMANAGERS, enable, true);
+				break;
+			case curriculummanager:
+				userSearchAdminPropsForCurriculummanagers = setStringProperty(USERSEARCH_ADMINPROPS_CURRICULUMMANAGERS, enable, true);
+				break;
+			case lecturemanager:
+				userSearchAdminPropsForLecturemanagers = setStringProperty(USERSEARCH_ADMINPROPS_LECTUREMANAGERS, enable, true);
+				break;
+			case qualitymanager:
+				userSearchAdminPropsForQualitymanagers = setStringProperty(USERSEARCH_ADMINPROPS_QUALITYMANAGERS, enable, true);
+				break;
+			case linemanager:
+				userSearchAdminPropsForLinemanagers = setStringProperty(USERSEARCH_ADMINPROPS_LINEMANAGERS, enable, true);
+				break;
+			case principal:
+				userSearchAdminPropsForPrincipals = setStringProperty(USERSEARCH_ADMINPROPS_PRINCIPALS, enable, true);
+				break;
+			case administrator:
+				userSearchAdminPropsForAdministrators = setStringProperty(USERSEARCH_ADMINPROPS_ADMINISTRATORS, enable, true);
+				break;
+			case sysadmin:
+				userSearchAdminPropsForSystemAdmins = setStringProperty(USERSEARCH_ADMINPROPS_SYSTEMADMINS, enable, true);
+				break;
+			default: /* Ignore the other roles */
+		}
 	}
 	
 	public boolean isUserLastVisitVisible(Roles roles) {
-		if(roles == null) return false;
-		if(roles.isOLATAdmin()) {
-			return "enabled".equals(userLastLoginVisibleForAdministrators);
-		}
-		if(roles.isGroupManager()) {
-			return "enabled".equals(userLastLoginVisibleForGroupmanagers);
-		}
-		if(roles.isUserManager()) {
-			return "enabled".equals(userLastLoginVisibleForUsermanagers);
-		}
-		if(roles.isAuthor()) {
-			return "enabled".equals(userLastLoginVisibleForAuthors);
-		}
-		if(roles.isInvitee()) {
-			return false;
+		if(roles == null || roles.isGuestOnly() || roles.isInvitee()) return false;
+		
+		boolean allowed = false;
+		for(OrganisationRoles role:privacyRoles) {
+			if(roles.hasRole(role) && "enabled".equals(getUserLastLoginVisibleFor(role))) {
+				allowed = true;
+				break;
+			}
 		}
-		return "enabled".equals(userLastLoginVisibleForUsers);
+		return allowed;
 	}
-
-	public String getUserLastLoginVisibleForUsers() {
-		return userLastLoginVisibleForUsers;
-	}
-
-	public void setUserLastLoginVisibleForUsers(String enable) {
-		setStringProperty(USER_LASTLOGIN_VISIBLE_USERS, enable, true);
-	}
-
-	public String getUserLastLoginVisibleForAuthors() {
-		return userLastLoginVisibleForAuthors;
-	}
-
-	public void setUserLastLoginVisibleForAuthors(String enable) {
-		setStringProperty(USER_LASTLOGIN_VISIBLE_AUTHORS, enable, true);
-	}
-
-	public String getUserLastLoginVisibleForUsermanagers() {
-		return userLastLoginVisibleForUsermanagers;
-	}
-
-	public void setUserLastLoginVisibleForUsermanagers(String enable) {
-		setStringProperty(USER_LASTLOGIN_VISIBLE_USERMANAGERS, enable, true);
-	}
-
-	public String getUserLastLoginVisibleForGroupmanagers() {
-		return userLastLoginVisibleForGroupmanagers;
-	}
-
-	public void setUserLastLoginVisibleForGroupmanagers(String enable) {
-		setStringProperty(USER_LASTLOGIN_VISIBLE_GROUPMANAGERS, enable, true);
-	}
-
-	public String getUserLastLoginVisibleForAdministrators() {
-		return userLastLoginVisibleForAdministrators;
+	
+	public String getUserLastLoginVisibleFor(OrganisationRoles role) {
+		switch(role) {
+			case user: return userLastLoginVisibleForUsers;
+			case author: return userLastLoginVisibleForAuthors;
+			case usermanager: return userLastLoginVisibleForUsermanagers;
+			case rolesmanager: return userLastLoginVisibleForRolesmanagers;
+			case groupmanager: return userLastLoginVisibleForGroupmanagers;
+			case learnresourcemanager: return userLastLoginVisibleForLearnresourcemanagers;
+			case poolmanager: return userLastLoginVisibleForPoolmanagers;
+			case curriculummanager: return userLastLoginVisibleForCurriculummanagers;
+			case lecturemanager: return userLastLoginVisibleForLecturemanagers;
+			case qualitymanager: return userLastLoginVisibleForQualitymanagers;
+			case linemanager: return userLastLoginVisibleForLinemanagers;
+			case principal: return userLastLoginVisibleForPrincipals;
+			case administrator: return userLastLoginVisibleForAdministrators;
+			case sysadmin: return userLastLoginVisibleForSystemAdmins;
+			default: return "disabled";
+		}
 	}
-
-	public void setUserLastLoginVisibleForAdministrators(String enable) {
-		setStringProperty(USER_LASTLOGIN_VISIBLE_ADMINISTRATORS, enable, true);
+	
+	public void setUserLastLoginVisibleFor(OrganisationRoles role, String enable) {
+		switch(role) {
+			case user:
+				userLastLoginVisibleForUsers = setStringProperty(USER_LASTLOGIN_VISIBLE_USERS, enable, true);
+				break;
+			case author:
+				userLastLoginVisibleForAuthors = setStringProperty(USER_LASTLOGIN_VISIBLE_AUTHORS, enable, true);
+				break;
+			case usermanager:
+				userLastLoginVisibleForUsermanagers = setStringProperty(USER_LASTLOGIN_VISIBLE_USERMANAGERS, enable, true);
+				break;
+			case rolesmanager:
+				userLastLoginVisibleForRolesmanagers = setStringProperty(USER_LASTLOGIN_VISIBLE_ROLESMANAGERS, enable, true);
+				break;
+			case groupmanager:
+				userLastLoginVisibleForGroupmanagers = setStringProperty(USER_LASTLOGIN_VISIBLE_GROUPMANAGERS, enable, true);
+				break;
+			case learnresourcemanager:
+				userLastLoginVisibleForLearnresourcemanagers = setStringProperty(USER_LASTLOGIN_VISIBLE_LEARNRESOURCEMANAGERS, enable, true);
+				break;
+			case poolmanager:
+				userLastLoginVisibleForPoolmanagers = setStringProperty(USER_LASTLOGIN_VISIBLE_POOLMANAGERS, enable, true);
+				break;
+			case curriculummanager:
+				userLastLoginVisibleForCurriculummanagers = setStringProperty(USER_LASTLOGIN_VISIBLE_CURRICULUMMANAGERS, enable, true);
+				break;
+			case lecturemanager:
+				userLastLoginVisibleForLecturemanagers = setStringProperty(USER_LASTLOGIN_VISIBLE_LECTUREMANAGERS, enable, true);
+				break;
+			case qualitymanager:
+				userLastLoginVisibleForQualitymanagers = setStringProperty(USER_LASTLOGIN_VISIBLE_QUALITYMANAGERS, enable, true);
+				break;
+			case linemanager:
+				userLastLoginVisibleForLinemanagers = setStringProperty(USER_LASTLOGIN_VISIBLE_LINEMANAGERS, enable, true);
+				break;
+			case principal:
+				userLastLoginVisibleForPrincipals = setStringProperty(USER_LASTLOGIN_VISIBLE_PRINCIPALS, enable, true);
+				break;
+			case administrator:
+				userLastLoginVisibleForAdministrators = setStringProperty(USER_LASTLOGIN_VISIBLE_ADMINISTRATORS, enable, true);
+				break;
+			case sysadmin:
+				userLastLoginVisibleForSystemAdmins = setStringProperty(USER_LASTLOGIN_VISIBLE_SYSTEMADMINS, enable, true);
+				break;
+			default: /* Ignore the other roles */
+		}
 	}
 
 	public boolean isUserAllowedAutoComplete(Roles roles) {
-		if(roles == null) return false;
-		if(roles.isOLATAdmin()) {
-			return "enabled".equals(userSearchAutocompleteForAdministrators);
-		}
-		if(roles.isGroupManager()) {
-			return "enabled".equals(userSearchAutocompleteForGroupmanagers);
-		}
-		if(roles.isUserManager()) {
-			return "enabled".equals(userSearchAutocompleteForUsermanagers);
-		}
-		if(roles.isAuthor()) {
-			return "enabled".equals(userSearchAutocompleteForAuthors);
-		}
-		if(roles.isInvitee()) {
-			return false;
+		if(roles == null || roles.isGuestOnly() || roles.isInvitee()) return false;
+		
+		boolean allowed = false;
+		for(OrganisationRoles role:privacyRoles) {
+			if(roles.hasRole(role) && "enabled".equals(getUserSearchAutocompleteFor(role))) {
+				allowed = true;
+				break;
+			}
 		}
-		return "enabled".equals(userSearchAutocompleteForUsers);
+		return allowed;
 	}
 	
-	public String isUserSearchAutocompleteForUsers() {
-		return userSearchAutocompleteForUsers;
-	}
-
-	public void setUserSearchAutocompleteForUsers(String enable) {
-		setStringProperty(USERSEARCHAUTOCOMPLETE_USERS, enable, true);
-	}
-
-	public String isUserSearchAutocompleteForAuthors() {
-		return userSearchAutocompleteForAuthors;
-	}
-
-	public void setUserSearchAutocompleteForAuthors(String enable) {
-		setStringProperty(USERSEARCHAUTOCOMPLETE_AUTHORS, enable, true);
-	}
-
-	public String isUserSearchAutocompleteForUsermanagers() {
-		return userSearchAutocompleteForUsermanagers;
-	}
-
-	public void setUserSearchAutocompleteForUsermanagers(String enable) {
-		setStringProperty(USERSEARCHAUTOCOMPLETE_USERMANAGERS, enable, true);
-	}
-
-	public String isUserSearchAutocompleteForGroupmanagers() {
-		return userSearchAutocompleteForGroupmanagers;
-	}
-
-	public void setUserSearchAutocompleteForGroupmanagers(String enable) {
-		setStringProperty(USERSEARCHAUTOCOMPLETE_GROUPMANAGERS, enable, true);
-	}
-
-	public String isUserSearchAutocompleteForAdministrators() {
-		return userSearchAutocompleteForAdministrators;
-	}
-
-	public void setUserSearchAutocompleteForAdministrators(String enable) {
-		setStringProperty(USERSEARCHAUTOCOMPLETE_ADMINISTRATORS, enable, true);
+	public String getUserSearchAutocompleteFor(OrganisationRoles role) {
+		switch(role) {
+			case user: return userSearchAutocompleteForUsers;
+			case author: return userSearchAutocompleteForAuthors;
+			case usermanager: return userSearchAutocompleteForUsermanagers;
+			case rolesmanager: return userSearchAutocompleteForRolesmanagers;
+			case groupmanager: return userSearchAutocompleteForGroupmanagers;
+			case learnresourcemanager: return userSearchAutocompleteForLearnresourcemanagers;
+			case poolmanager: return userSearchAutocompleteForPoolmanagers;
+			case curriculummanager: return userSearchAutocompleteForCurriculummanagers;
+			case lecturemanager: return userSearchAutocompleteForLecturemanagers;
+			case qualitymanager: return userSearchAutocompleteForQualitymanagers;
+			case linemanager: return userSearchAutocompleteForLinemanagers;
+			case principal: return userSearchAutocompleteForPrincipals;
+			case administrator: return userSearchAutocompleteForAdministrators;
+			case sysadmin: return userSearchAutocompleteForSystemAdmins;
+			default: return "disabled";
+		}
 	}
 	
 	public int getUserSearchMaxResultsValue() {
diff --git a/src/main/java/org/olat/basesecurity/GroupMembership.java b/src/main/java/org/olat/basesecurity/GroupMembership.java
index cb985045e2d..2e069209e55 100644
--- a/src/main/java/org/olat/basesecurity/GroupMembership.java
+++ b/src/main/java/org/olat/basesecurity/GroupMembership.java
@@ -33,10 +33,24 @@ public interface GroupMembership {
 	
 	public Date getCreationDate();
 	
+	public Date getLastModified();
+	
 	public String getRole();
 	
+	/**
+	 * This property is lazy loaded.
+	 * 
+	 * @return The identity
+	 */
 	public Identity getIdentity();
 	
+	/**
+	 * This property is lazy loaded.
+	 * 
+	 * @return The group
+	 */
+	public Group getGroup();
+	
 	public GroupMembershipInheritance getInheritanceMode();
 	
 	public void setInheritanceMode(GroupMembershipInheritance inheritanceMode);
diff --git a/src/main/java/org/olat/basesecurity/OrganisationRoles.java b/src/main/java/org/olat/basesecurity/OrganisationRoles.java
index 893faf08dce..34e48eb99aa 100644
--- a/src/main/java/org/olat/basesecurity/OrganisationRoles.java
+++ b/src/main/java/org/olat/basesecurity/OrganisationRoles.java
@@ -32,17 +32,22 @@ public enum OrganisationRoles {
 	sysadmin,
 	administrator,
 	usermanager,
+	rolesmanager,
 	learnresourcemanager,
+	lecturemanager,
 	groupmanager,
 	poolmanager,
 	curriculummanager,
+	qualitymanager,
+	linemanager,
 	principal,
 	author,
-	coach,
 	user,
 	invitee,
 	guest;
 	
+	public static final OrganisationRoles[] EMPTY_ROLES = new OrganisationRoles[0];
+	
 	public static boolean isValue(String value) {
 		boolean isValue = false;
 		if(StringHelper.containsNonWhitespace(value)) {
diff --git a/src/main/java/org/olat/basesecurity/SearchIdentityParams.java b/src/main/java/org/olat/basesecurity/SearchIdentityParams.java
index c4d1aa7cc36..c35611a5dfc 100644
--- a/src/main/java/org/olat/basesecurity/SearchIdentityParams.java
+++ b/src/main/java/org/olat/basesecurity/SearchIdentityParams.java
@@ -53,6 +53,7 @@ public class SearchIdentityParams {
 	private Integer status;
 	private Collection<Long> identityKeys;
 	private Boolean managed;
+	private boolean withoutBusinessGroup;
 	
 	private List<Organisation> organisationParents;
 	private List<OrganisationRef> organisations;
@@ -110,6 +111,13 @@ public class SearchIdentityParams {
 		return params;
 	}
 	
+	public static SearchIdentityParams withBusinesGroups() {
+		SearchIdentityParams params = new SearchIdentityParams();
+		params.setWithoutBusinessGroup(true);
+		params.setStatus(Identity.STATUS_VISIBLE_LIMIT);
+		return params;
+	}
+	
 	/**
 	 * 
 	 * @return A set of parameters to search authors along co-authors
@@ -297,4 +305,12 @@ public class SearchIdentityParams {
 	public void setIdentityKeys(Collection<Long> identityKeys) {
 		this.identityKeys = identityKeys;
 	}
+
+	public boolean isWithoutBusinessGroup() {
+		return withoutBusinessGroup;
+	}
+
+	public void setWithoutBusinessGroup(boolean withoutBusinessGroup) {
+		this.withoutBusinessGroup = withoutBusinessGroup;
+	}
 }
diff --git a/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java b/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java
index a564d05a36c..444c358833e 100644
--- a/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java
+++ b/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java
@@ -40,7 +40,6 @@ import org.olat.core.commons.persistence.DB;
 import org.olat.core.commons.persistence.SortKey;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OrganisationRef;
-import org.olat.core.util.CodeHelper;
 import org.olat.user.propertyhandlers.UserPropertyHandler;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -59,19 +58,15 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie
 	
 	@Override
 	public int countIdentitiesByPowerSearch(SearchIdentityParams params) {
-		long start = System.nanoTime();
 		StringBuilder sb = new StringBuilder(5000);
 		sb.append("select count(ident.key) from org.olat.core.id.Identity as ident ")
 		  .append(" inner join ident.user as user ");
 		Number count = createIdentitiesByPowerQuery(params, null, sb, Number.class).getSingleResult();
-		CodeHelper.printNanoTime(start, "Count identity");
 		return count.intValue();
 	}
 
 	@Override
 	public List<Identity> getIdentitiesByPowerSearch(SearchIdentityParams params, int firstResult, int maxResults) {
-		long start = System.nanoTime();
-		
 		StringBuilder sb = new StringBuilder(5000);
 		sb.append("select distinct ident from org.olat.core.id.Identity as ident ")
 		  .append(" inner join fetch ident.user as user ");
@@ -82,15 +77,13 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie
 		if(maxResults > 0) {
 			dbq.setMaxResults(maxResults);
 		}
-		List<Identity> identities = dbq.getResultList();
-		CodeHelper.printNanoTime(start, "Get identity");
-		return identities;
+		return dbq.getResultList();
 	}
 
 	@Override
 	public List<IdentityPropertiesRow> getIdentitiesByPowerSearch(SearchIdentityParams params,
 			List<UserPropertyHandler> userPropertyHandlers, Locale locale, SortKey orderBy, int firstResult, int maxResults) {
-		long start = System.nanoTime();
+
 		StringBuilder sb = new StringBuilder(5000);
 		sb.append("select")
 		  .append(" ident.id as ident_id,")
@@ -128,7 +121,6 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie
 
 			rows.add(new IdentityPropertiesRow(identityKey, identityName, creationDate, lastLogin, userProperties));
 		}
-		CodeHelper.printNanoTime(start, "Get user properties");
 		return rows;
 	}
 	
@@ -152,10 +144,8 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie
 			orderBy(sb, orderBy);
 		}
 		
-		// create query object now from string
-		String query = sb.toString();
 		TypedQuery<U> dbq = dbInstance.getCurrentEntityManager()
-				.createQuery(query, resultClass);
+				.createQuery(sb.toString(), resultClass);
 		fillParameters(params, dbq);
 		return dbq;
 	}
@@ -177,10 +167,25 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie
 			sb.append(" ident.key in (select membership.identity.key from bgroupmember membership ")
 			  .append("   left join repoentrytogroup as relGroup on (relGroup.group.key=membership.group.key) ")
 			  .append("   where  membership.role in (:roles) or (relGroup.group.key is not null and membership.role=:repositoryEntryRole))");
+			if(params.hasOrganisations()) {
+				sb.append(" and ident.key in  (select orgtomember.identity.key from bgroupmember as orgtomember ")
+				  .append("  inner join organisation as org on (org.group.key=orgtomember.group.key)")
+				  .append("  where orgtomember.identity.key=ident.key and org.key in (:organisationKey))");
+			}
+		} else if(params.hasRoles() && params.hasOrganisations()) {
+			needsAnd = checkAnd(sb, needsAnd);
+			sb.append(" exists (select orgtomember.key from bgroupmember as orgtomember ")
+			  .append("  inner join organisation as org on (org.group.key=orgtomember.group.key)")
+			  .append("  where orgtomember.identity.key=ident.key and org.key in (:organisationKey) and orgtomember.role in (:roles))");
 		} else if(params.hasRoles()) {
 			needsAnd = checkAnd(sb, needsAnd);
 			sb.append(" ident.key in (select membership.identity.key from bgroupmember membership ")
 			  .append("  where  membership.role in (:roles))");
+		} else if(params.hasOrganisations()) {
+			needsAnd = checkAnd(sb, needsAnd);
+			sb.append(" exists (select orgtomember.key from bgroupmember as orgtomember ")
+			  .append("  inner join organisation as org on (org.group.key=orgtomember.group.key)")
+			  .append("  where orgtomember.identity.key=ident.key and org.key in (:organisationKey))");
 		}
 		
 		if(params.hasExcludedRoles()) {
@@ -203,11 +208,11 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie
 			sb.append("))");
 		}
 		
-		if(params.hasOrganisations()) {
+		if(params.isWithoutBusinessGroup()) {
 			needsAnd = checkAnd(sb, needsAnd);
-			sb.append(" exists (select orgtomember.key from bgroupmember as orgtomember ")
-			  .append("  inner join organisation as org on (org.group.key=orgtomember.group.key)")
-			  .append("  where orgtomember.identity.key=ident.key and org.key in (:organisationKey))");
+			sb.append(" not exists (select bgroup from businessgroup bgroup, bgroupmember as me")
+			  .append("   where me.group.key=bgroup.baseGroup.key and me.identity.key=ident.key")
+			  .append(" )");
 		}
 		
 		if(params.getBusinessGroupRole() != null) {
diff --git a/src/main/java/org/olat/basesecurity/manager/OrganisationServiceImpl.java b/src/main/java/org/olat/basesecurity/manager/OrganisationServiceImpl.java
index b805870250f..424b5aba280 100644
--- a/src/main/java/org/olat/basesecurity/manager/OrganisationServiceImpl.java
+++ b/src/main/java/org/olat/basesecurity/manager/OrganisationServiceImpl.java
@@ -370,13 +370,22 @@ public class OrganisationServiceImpl implements OrganisationService, Initializin
 	@Override
 	public void addMember(Organisation organisation, Identity member, OrganisationRoles role) {
 		GroupMembershipInheritance inheritanceMode;
-		if(role == OrganisationRoles.usermanager || role == OrganisationRoles.learnresourcemanager || role == OrganisationRoles.author) {
+		if(isRoleDefaultInherited(role)) {
 			inheritanceMode = GroupMembershipInheritance.root;
 		} else {
 			inheritanceMode = GroupMembershipInheritance.none;
 		}
 		addMember(organisation, member, role, inheritanceMode);
 	}
+	
+	private boolean isRoleDefaultInherited(OrganisationRoles role) {
+		return role == OrganisationRoles.author
+				|| role == OrganisationRoles.usermanager || role == OrganisationRoles.rolesmanager
+				|| role == OrganisationRoles.groupmanager || role == OrganisationRoles.learnresourcemanager
+				|| role == OrganisationRoles.poolmanager || role == OrganisationRoles.curriculummanager
+				|| role == OrganisationRoles.lecturemanager || role == OrganisationRoles.qualitymanager
+				|| role == OrganisationRoles.linemanager || role == OrganisationRoles.principal;
+	}
 
 	@Override
 	public void addMember(Organisation organisation, Identity member, OrganisationRoles role, GroupMembershipInheritance inheritanceMode) {
diff --git a/src/main/java/org/olat/basesecurity/model/GroupMembershipImpl.java b/src/main/java/org/olat/basesecurity/model/GroupMembershipImpl.java
index df4224974d3..5f40f1cc9eb 100644
--- a/src/main/java/org/olat/basesecurity/model/GroupMembershipImpl.java
+++ b/src/main/java/org/olat/basesecurity/model/GroupMembershipImpl.java
@@ -113,7 +113,8 @@ public class GroupMembershipImpl implements GroupMembership, ModifiedInfo, Persi
 	public void setKey(Long key) {
 		this.key = key;
 	}
-	
+
+	@Override
 	public Date getCreationDate() {
 		return creationDate;
 	}
@@ -154,11 +155,13 @@ public class GroupMembershipImpl implements GroupMembership, ModifiedInfo, Persi
 		return StringHelper.containsNonWhitespace(inheritanceModeString)
 				? GroupMembershipInheritance.valueOf(inheritanceModeString) : GroupMembershipInheritance.none;
 	}
-	
+
+	@Override
 	public void setInheritanceMode(GroupMembershipInheritance mode) {
 		inheritanceModeString = mode == null ? GroupMembershipInheritance.none.name() : mode.name(); 
 	}
 
+	@Override
 	public Group getGroup() {
 		return group;
 	}
diff --git a/src/main/java/org/olat/collaboration/CollaborationToolsSettingsController.java b/src/main/java/org/olat/collaboration/CollaborationToolsSettingsController.java
index 797ece9ca51..f4ba07b1e03 100644
--- a/src/main/java/org/olat/collaboration/CollaborationToolsSettingsController.java
+++ b/src/main/java/org/olat/collaboration/CollaborationToolsSettingsController.java
@@ -108,7 +108,7 @@ public class CollaborationToolsSettingsController extends BasicController {
 			if(managed) {
 				quotaCtr = quotaManager.getQuotaViewInstance(ureq, getWindowControl(), collabTools.getFolderRelPath());
 			} else {
-				quotaCtr = quotaManager.getQuotaEditorInstance(ureq, getWindowControl(), collabTools.getFolderRelPath(), null);//TODO roles
+				quotaCtr = quotaManager.getQuotaEditorInstance(ureq, getWindowControl(), collabTools.getFolderRelPath(), null);//TODO quota roles
 			}
 			listenTo(quotaCtr);
 		} else {
diff --git a/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java b/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java
index 52c5ecae566..82a8f888777 100644
--- a/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java
+++ b/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java
@@ -163,20 +163,20 @@ public class BaseFullWebappController extends BasicController implements DTabs,
 	private SiteInstance curSite;
 	private DTab curDTab;
 	
-	private final List<TabState> siteAndTabs = new ArrayList<TabState>();
+	private final List<TabState> siteAndTabs = new ArrayList<>();
 
 	// the dynamic tabs list
 	private List<DTab> dtabs;
 	private List<Integer> dtabsLinkNames;
 	private List<Controller> dtabsControllers;
-	private Map<DTab,HistoryPoint> dtabToBusinessPath = new HashMap<DTab,HistoryPoint>();
+	private Map<DTab,HistoryPoint> dtabToBusinessPath = new HashMap<>();
 	// used as link id which is load url safe (e.g. replayable
 	private int dtabCreateCounter = 0;
 	// the sites list
 	private SiteInstance userTools;
 	private List<SiteInstance> sites;
-	private Map<SiteInstance, BornSiteInstance> siteToBornSite = new HashMap<SiteInstance, BornSiteInstance>();
-	private Map<SiteInstance,HistoryPoint> siteToBusinessPath = new HashMap<SiteInstance,HistoryPoint>();
+	private Map<SiteInstance, BornSiteInstance> siteToBornSite = new HashMap<>();
+	private Map<SiteInstance,HistoryPoint> siteToBusinessPath = new HashMap<>();
 
 	private BaseFullWebappControllerParts baseFullWebappControllerParts;
 	protected Controller contentCtrl;
@@ -218,7 +218,7 @@ public class BaseFullWebappController extends BasicController implements DTabs,
 		
 		IdentityEnvironment identityEnv = usess.getIdentityEnvironment();
 		if(identityEnv != null && identityEnv.getRoles() != null) {	
-			isAdmin = identityEnv.getRoles().isOLATAdmin();
+			isAdmin = identityEnv.getRoles().isAdministrator();
 		} else {
 			isAdmin = false;
 		}
@@ -314,6 +314,8 @@ public class BaseFullWebappController extends BasicController implements DTabs,
 	}
 	
 	private void initializeBase(UserRequest ureq, WindowManager winman, ComponentCollection mainPanel) {
+		UserSession usess = ureq.getUserSession();
+		
 		// component-id of mainPanel for the window id
 		mainVc.contextPut("o_winid", mainPanel.getDispatchID());
 		
@@ -346,7 +348,7 @@ public class BaseFullWebappController extends BasicController implements DTabs,
 			StringBuilder sb = new StringBuilder();
 			sb.append("{ identity : ").append( ident.getKey());
 			User user = ident.getUser();
-			List<UserPropertyHandler> userPropertyHandlers = userManager.getUserPropertyHandlersFor(USER_PROPS_ID, ureq.getUserSession().getRoles().isOLATAdmin());
+			List<UserPropertyHandler> userPropertyHandlers = userManager.getUserPropertyHandlersFor(USER_PROPS_ID, usess.getRoles().isAdministrator());
 			for (UserPropertyHandler userPropertyHandler : userPropertyHandlers) {
 				String escapedValue = StringHelper.escapeJavaScript(userPropertyHandler.getUserProperty(user, getLocale()));
 				sb.append(", ").append(userPropertyHandler.getName()).append(" : \"").append(escapedValue).append("\"");				
@@ -383,9 +385,8 @@ public class BaseFullWebappController extends BasicController implements DTabs,
 		// will start the translation tool in translation mode, if the overlay
 		// feature is enabled it will start in customizing mode
 		// fxdiff: allow user-managers to use the inline translation also.
-		UserSession usess = ureq.getUserSession();
 		if (usess.isAuthenticated()
-				&& (usess.getRoles().isOLATAdmin() || usess.getRoles().isUserManager())
+				&& (usess.getRoles().isAdministrator() || usess.getRoles().isSystemAdmin())
 				&& (i18nModule.isTransToolEnabled() || i18nModule.isOverlayEnabled())) {
 			inlineTranslationC = wbo.createInlineTranslationDispatcherController(ureq, getWindowControl());
 			Preferences guiPrefs = usess.getGuiPreferences();
@@ -657,7 +658,7 @@ public class BaseFullWebappController extends BasicController implements DTabs,
 		List<ContextEntry> entries = cstate.getEntries();
 		if(entries.isEmpty()) return;
 		
-		entries = new ArrayList<ContextEntry>(entries);
+		entries = new ArrayList<>(entries);
 		
 		ContextEntry state = entries.remove(0);
 		if(state == null) return;//no red screen for this
diff --git a/src/main/java/org/olat/core/commons/modules/bc/FolderRunController.java b/src/main/java/org/olat/core/commons/modules/bc/FolderRunController.java
index 3ef83bde529..2c5b6217174 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/FolderRunController.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/FolderRunController.java
@@ -504,7 +504,7 @@ public class FolderRunController extends BasicController implements Activateable
 		} 
 		
 		Boolean newEditQuota = Boolean.FALSE;
-		if (usess.getRoles().isOLATAdmin() || usess.getRoles().isLearnResourceManager()) {//TODO roles
+		if (usess.getRoles().isOLATAdmin() || usess.getRoles().isLearnResourceManager()) {//TODO quota roles
 			// Only sys admins or institutonal resource managers can have the quota button
 			Quota q = VFSManager.isTopLevelQuotaContainer(folderComponent.getCurrentContainer());
 			newEditQuota = (q == null)? Boolean.FALSE : Boolean.TRUE;
diff --git a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdEditQuota.java b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdEditQuota.java
index b46bf216913..ce3ff8d69bb 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdEditQuota.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdEditQuota.java
@@ -67,7 +67,7 @@ public class CmdEditQuota extends DefaultController implements FolderCommand, Co
 		// cleanup old controller first
 		if (quotaEditController != null) quotaEditController.dispose();
 		// create a edit controller
-		quotaEditController = quotaManager.getQuotaEditorInstance(ureq, wControl, currentSecCallback.getQuota().getPath(), null);//TODO roles
+		quotaEditController = quotaManager.getQuotaEditorInstance(ureq, wControl, currentSecCallback.getQuota().getPath(), null);//TODO quota roles
 		quotaEditController.addControllerListener(this);
 		if (quotaEditController != null) {
 			setInitialComponent(quotaEditController.getInitialComponent());
diff --git a/src/main/java/org/olat/core/commons/portlets/iframe/IframePortletRunController.java b/src/main/java/org/olat/core/commons/portlets/iframe/IframePortletRunController.java
index 0c0896b9ef1..89da83913b6 100644
--- a/src/main/java/org/olat/core/commons/portlets/iframe/IframePortletRunController.java
+++ b/src/main/java/org/olat/core/commons/portlets/iframe/IframePortletRunController.java
@@ -57,9 +57,9 @@ import org.olat.core.util.vfs.VFSContainer;
  */
 public class IframePortletRunController extends BasicController {	
 	
-	private OLog log = Tracing.createLoggerFor(this.getClass());
+	private static final OLog log = Tracing.createLoggerFor(IframePortletRunController.class);
 	
-	private VelocityContainer iframeVC;
+	private final VelocityContainer iframeVC;
 	private Link editLink;
 	private Controller editorCtr;
 	private String fileName;
@@ -95,7 +95,7 @@ public class IframePortletRunController extends BasicController {
 		iframeVC.contextPut("name", id);
 
 		// edit Link only for administrators
-		if (ureq.getUserSession().getRoles().isOLATAdmin()) {
+		if (ureq.getUserSession().getRoles().isAdministrator()) {
 			String editFilePath = configuration.get("editFilePath");
 			boolean editLinkEnabled = false;
 			if (StringHelper.containsNonWhitespace(editFilePath)) {
@@ -160,10 +160,7 @@ public class IframePortletRunController extends BasicController {
 		
 		return true;
 	}
-	
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, org.olat.core.gui.components.Component, org.olat.core.gui.control.Event)
-	 */
+
 	@Override
 	public void event(UserRequest ureq, Component source, Event event) {
 		if (source == editLink) {
@@ -190,9 +187,6 @@ public class IframePortletRunController extends BasicController {
 		}
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
-	 */
 	@Override
 	protected void doDispose() {
     // editorCtr is registerd with listenTo and gets disposed in BasicController		
diff --git a/src/main/java/org/olat/core/commons/services/notifications/manager/NotificationsManagerImpl.java b/src/main/java/org/olat/core/commons/services/notifications/manager/NotificationsManagerImpl.java
index 546241703bc..b30f8c73f3f 100644
--- a/src/main/java/org/olat/core/commons/services/notifications/manager/NotificationsManagerImpl.java
+++ b/src/main/java/org/olat/core/commons/services/notifications/manager/NotificationsManagerImpl.java
@@ -328,7 +328,7 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us
 
 		Locale locale = new Locale(identity.getUser().getPreferences().getLanguage());
 		Date compareDate = getDefaultCompareDate();
-		List<SubscriptionInfo> sis = new ArrayList<SubscriptionInfo>();
+		List<SubscriptionInfo> sis = new ArrayList<>();
 		for(Subscriber subscriber : subscribers){
 			Publisher pub = subscriber.getPublisher();
 			NotificationsHandler notifHandler = getNotificationsHandler(pub);
@@ -354,12 +354,11 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us
 		do {
 			identities = securityManager.loadVisibleIdentities(counter, BATCH_SIZE);
 			for(Identity identity:identities) {
-				if(identity.getName().startsWith("guest_")) {
-					Roles roles = securityManager.getRoles(identity);
-					if(roles.isGuestOnly()) {
-						continue;
-					}
+				Roles roles = securityManager.getRoles(identity);
+				if(roles.isGuestOnly()) {
+					continue;
 				}
+	
 				closeConnection++;
 				processSubscribersByEmail(identity);
 				if(closeConnection % 20 == 0) {
@@ -469,16 +468,13 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us
 		dbInstance.intermediateCommit();
 	}
 
-	/**
-	 * @see org.olat.core.commons.services.notifications.NotificationsManager#getCompareDateFromInterval(java.lang.String)
-	 */
+	@Override
 	public Date getCompareDateFromInterval(String interval){
 		Calendar calNow = Calendar.getInstance();
 		// get hours to subtract from now
 		Integer diffHours = INTERVAL_DEF_MAP.get(interval);
 		calNow.add(Calendar.HOUR_OF_DAY, -diffHours);
-		Date compareDate = calNow.getTime();
-		return compareDate;		
+		return calNow.getTime();	
 	}
 	
 	/**
@@ -487,7 +483,7 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us
 	 * @return
 	 */
 	private static final Map<String, Integer> buildIntervalMap(){
-		Map<String, Integer> intervalDefMap = new HashMap<String, Integer>();		
+		Map<String, Integer> intervalDefMap = new HashMap<>();		
 		intervalDefMap.put("never", 0);
 		intervalDefMap.put("monthly", 720);
 		intervalDefMap.put("weekly", 168);
@@ -633,7 +629,7 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us
 
 		List<Subscriber> res = dbInstance.getCurrentEntityManager()
 				.createQuery(q.toString(), Subscriber.class)
-				.setParameter("aKey", key.longValue())
+				.setParameter("aKey", key)
 				.getResultList();
 		if (res.isEmpty()) return null;
 		if (res.size() > 1) throw new AssertException("more than one subscriber for key " + key);
@@ -747,7 +743,7 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us
 		return dbInstance.getCurrentEntityManager()
 				.createQuery(q, Publisher.class)
 				.setParameter("resName", resName)
-				.setParameter("resId", resId.longValue())
+				.setParameter("resId", resId)
 				.getResultList();
 	}
 	
@@ -803,8 +799,7 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us
 
 		if (res.size() == 0) return null;
 		if (res.size() != 1) throw new AssertException("only one subscriber per person and publisher!!");
-		Subscriber s = res.get(0);
-		return s;
+		return res.get(0);
 	}
 	
 	/**
@@ -975,7 +970,7 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us
 			// 1. find all subscribers which can be affected
 			List<Subscriber> subscribers = getValidSubscribersOf(publisher);
 			
-			Set<Long> subsKeys = new HashSet<Long>();
+			Set<Long> subsKeys = new HashSet<>();
 			// 2. collect all keys of the affected subscribers
 			for (Subscriber subscriber:subscribers) {
 				subsKeys.add(subscriber.getKey());
@@ -1023,7 +1018,7 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us
 			// 1. find all subscribers which can be affected
 			List<Subscriber> subscribers = getValidSubscribersOf(publisherType, data);
 			
-			Set<Long> subsKeys = new HashSet<Long>();
+			Set<Long> subsKeys = new HashSet<>();
 			// 2. collect all keys of the affected subscribers
 			for (Subscriber subscriber:subscribers) {
 				subsKeys.add(subscriber.getKey());
@@ -1126,7 +1121,7 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us
 				.createQuery(q.toString(), Number.class)
 				.setParameter("anIdentityKey", identity.getKey())
 				.setParameter("resName", subscriptionContext.getResName())
-				.setParameter("resId", subscriptionContext.getResId().longValue())
+				.setParameter("resId", subscriptionContext.getResId())
 				.setParameter("subidentifier", subscriptionContext.getSubidentifier())
 				.getSingleResult();
 
@@ -1186,6 +1181,7 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us
 	 * @param mimeType text/html or text/plain
 	 * @return the item or null if there is currently no news for this subscription
 	 */
+	@Override
 	public SubscriptionItem createSubscriptionItem(Subscriber subscriber, Locale locale, String mimeTypeTitle, String mimeTypeContent) {
 		// calculate the item based on subscriber.getLastestReadDate()
 		// used for rss-feed, no longer than 1 month
@@ -1202,8 +1198,7 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us
 	private Date getDefaultCompareDate() {
 		Calendar calNow = Calendar.getInstance();
 		calNow.add(Calendar.DAY_OF_MONTH, -30);
-		Date compareDate = calNow.getTime();
-		return compareDate;
+		return calNow.getTime();
 	}
 	
 	/**
@@ -1379,16 +1374,12 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us
 		this.defaultNotificationInterval = defaultNotificationInterval;
 	}
 
-	/**
-	 * @see org.olat.core.commons.services.notifications.NotificationsManager#getDefaultNotificationInterval()
-	 */
+	@Override
 	public String getDefaultNotificationInterval() {
 		return defaultNotificationInterval;
 	}
 
-	/**
-	 * @see org.olat.core.commons.services.notifications.NotificationsManager#getNotificationIntervals()
-	 */
+	@Override
 	public List<String> getEnabledNotificationIntervals() {
 		return notificationIntervals;
 	}
diff --git a/src/main/java/org/olat/core/configuration/AbstractSpringModule.java b/src/main/java/org/olat/core/configuration/AbstractSpringModule.java
index 57ef2204694..c7483605f16 100644
--- a/src/main/java/org/olat/core/configuration/AbstractSpringModule.java
+++ b/src/main/java/org/olat/core/configuration/AbstractSpringModule.java
@@ -152,6 +152,16 @@ public abstract class AbstractSpringModule implements GenericEventListener, Init
 		// delegate to new property based config style
 		return moduleConfigProperties.getStringPropertyValue(propertyName, allowEmptyString);
 	}
+	
+	protected String getStringPropertyValue(String propertyName, String defaultValue) {
+		// delegate to new property based config style
+		String val = moduleConfigProperties.getStringPropertyValue(propertyName, true);
+		if(StringHelper.containsNonWhitespace(val)) {
+			return val;
+		}
+		return defaultValue;
+	}
+	
 	/**
 	 * Set a string property
 	 * 
@@ -163,10 +173,11 @@ public abstract class AbstractSpringModule implements GenericEventListener, Init
 	 *            true: will save property and fire event; false: will not save,
 	 *            but set a dirty flag
 	 */
-	protected void setStringProperty(String propertyName, String value, boolean saveConfiguration) {
+	protected String setStringProperty(String propertyName, String value, boolean saveConfiguration) {
 		// delegate to new property based config style
 		moduleConfigProperties.setStringProperty(propertyName, value, saveConfiguration);
 		log.audit("change system property: " + propertyName, value);
+		return value;
 	}
 	
 	/**
diff --git a/src/main/java/org/olat/core/extensions/security/GroupManagerOnlyExtensionSecurityCallback.java b/src/main/java/org/olat/core/extensions/security/GroupManagerOnlyExtensionSecurityCallback.java
index 4f225f21de3..18c1d4c0f22 100644
--- a/src/main/java/org/olat/core/extensions/security/GroupManagerOnlyExtensionSecurityCallback.java
+++ b/src/main/java/org/olat/core/extensions/security/GroupManagerOnlyExtensionSecurityCallback.java
@@ -43,6 +43,6 @@ public class GroupManagerOnlyExtensionSecurityCallback implements ActionExtensio
 		}
 		
 		Roles roles = usess.getRoles();
-		return roles.isOLATAdmin() || roles.isGroupManager();
+		return roles.isAdministrator() || roles.isGroupManager();
 	}
 }
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/TextFlexiCellRenderer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/TextFlexiCellRenderer.java
index 4a656239941..d61b9188715 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/TextFlexiCellRenderer.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/TextFlexiCellRenderer.java
@@ -83,10 +83,6 @@ public class TextFlexiCellRenderer implements FlexiCellRenderer {
 			} else {
 				StringHelper.escapeHtml(target, str);
 			}
-		} else if (cellValue instanceof Date) {
-			Formatter formatter = Formatter.getInstance(translator.getLocale());
-			String date =  formatter.formatDateAndTime((Date)cellValue);
-			target.append(date);
 		} else if(cellValue instanceof Boolean) {
 			Boolean bool = (Boolean)cellValue;
 			if(bool.booleanValue()) {
diff --git a/src/main/java/org/olat/core/gui/control/_spring/sitedefContext.xml b/src/main/java/org/olat/core/gui/control/_spring/sitedefContext.xml
index 655a2552483..4fa490a9b18 100644
--- a/src/main/java/org/olat/core/gui/control/_spring/sitedefContext.xml
+++ b/src/main/java/org/olat/core/gui/control/_spring/sitedefContext.xml
@@ -138,23 +138,23 @@
 	</bean>
 	
 	<bean id="restrictToUserManagerSiteSecurityCallback" class="org.olat.core.gui.control.navigation.callback.SiteSecurityCallbackWithRolesRestriction">
-		<property name="limitToRole" value="usermanager"/>
+		<property name="limitToRole" value="usermanager,rolesmanager,administrator"/>
 	</bean>
 	
 	<bean id="restrictToGroupManagerSiteSecurityCallback" class="org.olat.core.gui.control.navigation.callback.SiteSecurityCallbackWithRolesRestriction">
-		<property name="limitToRole" value="groupmanager"/>
+		<property name="limitToRole" value="groupmanager,administrator"/>
 	</bean>
 	
 	<bean id="restrictToPoolAdminSiteSecurityCallback" class="org.olat.core.gui.control.navigation.callback.SiteSecurityCallbackWithRolesRestriction">
-		<property name="limitToRole" value="pooladmin"/>
+		<property name="limitToRole" value="poolmanager,administrator"/>
 	</bean>
 
 	<bean id="restrictToInstResourceManagersAndAuthorsSiteSecurityCallback" class="org.olat.core.gui.control.navigation.callback.SiteSecurityCallbackWithRolesRestriction">
-		<property name="limitToRole" value="author,institutionalresourcemanager"/>
+		<property name="limitToRole" value="author,learnresourcemanager,administrator"/>
 	</bean>
 
 	<bean id="restrictToInstResourceManagerSiteSecurityCallback" class="org.olat.core.gui.control.navigation.callback.SiteSecurityCallbackWithRolesRestriction">
-		<property name="limitToRole" value="institutionalresourcemanager,administrator"/>
+		<property name="limitToRole" value="learnresourcemanager,administrator"/>
 	</bean>
 	
 	<bean id="catalogManagerSiteSecurityCallback" class="org.olat.repository.site.CatalogManagerSecurityCallback">
diff --git a/src/main/java/org/olat/core/gui/control/generic/portal/PortalMainController.java b/src/main/java/org/olat/core/gui/control/generic/portal/PortalMainController.java
index aeb884f15d4..cc3fce3234f 100644
--- a/src/main/java/org/olat/core/gui/control/generic/portal/PortalMainController.java
+++ b/src/main/java/org/olat/core/gui/control/generic/portal/PortalMainController.java
@@ -78,9 +78,7 @@ public class PortalMainController extends BasicController {
 				portalTemplate = ((PortalImpl)CoreSpringFactory.getBean("guestportal"));
 				portalEditButton.setEnabled(false);
 				portalEditButton.setVisible(false);
-			} else if((roles.isGroupManager() || roles.isLearnResourceManager() || roles.isOLATAdmin()
-					|| roles.isQPoolManager() || roles.isUserManager() || roles.isCurriculumManager())
-					&& CoreSpringFactory.containsBean("authorportal")) {
+			} else if(isConsideredManager(roles) && CoreSpringFactory.containsBean("authorportal")) {
 				portalTemplate = ((PortalImpl)CoreSpringFactory.getBean("authorportal"));
 			} else {
 				portalTemplate = ((PortalImpl)CoreSpringFactory.getBean("homeportal"));
@@ -94,6 +92,15 @@ public class PortalMainController extends BasicController {
 		putInitialPanel(welcome);
 	}
 	
+	private boolean isConsideredManager(Roles roles) {
+		return roles.isAdministrator() || roles.isGroupManager()
+				|| roles.isUserManager() || roles.isRolesManager()
+				|| roles.isLearnResourceManager() ||  roles.isCurriculumManager()
+				|| roles.isPoolManager() || roles.isQualityManager()
+				|| roles.isLectureManager() || roles.isLineManager()
+				|| roles.isPrincipal();
+	}
+	
 	@Override
 	protected void doDispose() {
 		if (myPortal != null) {
diff --git a/src/main/java/org/olat/core/gui/control/navigation/callback/AdminSecurityCallback.java b/src/main/java/org/olat/core/gui/control/navigation/callback/AdminSecurityCallback.java
index 49fe5c69510..02b074299f0 100644
--- a/src/main/java/org/olat/core/gui/control/navigation/callback/AdminSecurityCallback.java
+++ b/src/main/java/org/olat/core/gui/control/navigation/callback/AdminSecurityCallback.java
@@ -34,15 +34,12 @@ import org.olat.core.util.UserSession;
  */
 public class AdminSecurityCallback implements SiteSecurityCallback {
 
-	/**
-	 * @see com.frentix.olat.coursesite.SiteSecurityCallback#isAllowedToLaunchSite(org.olat.core.gui.UserRequest)
-	 */
 	@Override
 	public boolean isAllowedToLaunchSite(UserRequest ureq) {
 		if(ureq == null) return false;
 		UserSession usess = ureq.getUserSession();
 		return usess != null
 				&& usess.getRoles() != null
-				&& usess.getRoles().isOLATAdmin();
+				&& usess.getRoles().isAdministrator();
 	}
 }
diff --git a/src/main/java/org/olat/core/gui/control/navigation/callback/ManagersSecurityCallback.java b/src/main/java/org/olat/core/gui/control/navigation/callback/ManagersSecurityCallback.java
index 87c99b53281..289346e1faa 100644
--- a/src/main/java/org/olat/core/gui/control/navigation/callback/ManagersSecurityCallback.java
+++ b/src/main/java/org/olat/core/gui/control/navigation/callback/ManagersSecurityCallback.java
@@ -22,6 +22,7 @@ package org.olat.core.gui.control.navigation.callback;
 
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.navigation.SiteSecurityCallback;
+import org.olat.core.id.Roles;
 import org.olat.core.util.UserSession;
 
 /**
@@ -41,11 +42,12 @@ public class ManagersSecurityCallback implements SiteSecurityCallback {
 			return false;
 		}
 		
-		return usess.getRoles().isOLATAdmin()
-				|| usess.getRoles().isGroupManager()
-				|| usess.getRoles().isLearnResourceManager()
-				|| usess.getRoles().isUserManager()
-				|| usess.getRoles().isQPoolManager()
-				|| usess.getRoles().isCurriculumManager();
+		Roles roles = usess.getRoles();
+		return roles.isAdministrator()
+				|| roles.isGroupManager() || roles.isLearnResourceManager()
+				|| roles.isUserManager() || roles.isRolesManager()
+				|| roles.isPoolManager() || roles.isQualityManager()
+				|| roles.isCurriculumManager() || roles.isLectureManager()
+				|| roles.isLineManager() || roles.isPrincipal();
 	}
 }
diff --git a/src/main/java/org/olat/core/gui/control/navigation/callback/SiteSecurityCallbackWithRolesRestriction.java b/src/main/java/org/olat/core/gui/control/navigation/callback/SiteSecurityCallbackWithRolesRestriction.java
index 996170af0a1..eb635f0ba8c 100644
--- a/src/main/java/org/olat/core/gui/control/navigation/callback/SiteSecurityCallbackWithRolesRestriction.java
+++ b/src/main/java/org/olat/core/gui/control/navigation/callback/SiteSecurityCallbackWithRolesRestriction.java
@@ -19,6 +19,7 @@
  */
 package org.olat.core.gui.control.navigation.callback;
 
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.navigation.SiteSecurityCallback;
 import org.olat.core.id.Roles;
@@ -34,33 +35,17 @@ public class SiteSecurityCallbackWithRolesRestriction implements SiteSecurityCal
 	
 	@Override
 	public boolean isAllowedToLaunchSite(UserRequest ureq) {
-		if (limitToRole == null) {
+		if (limitToRole == null || limitToRole.length == 0) {
 			// no restriction
 			return true;
 		} else {
 			Roles roles = ureq.getUserSession().getRoles();
 			if(roles != null) {
-				for (String limit : limitToRole) {				
-					String theRole = limit.trim().toLowerCase();
-					if (theRole.equals("invitee") && roles.isInvitee()) {
+				for (String limit : limitToRole) {
+					OrganisationRoles theRole = OrganisationRoles.valueOf(limit);
+					if(roles.hasRole(theRole)) {
 						return true;
-					} else if (theRole.equals("guest") && roles.isGuestOnly()) {
-						return true;
-					} else if (theRole.equals("administrator") && roles.isOLATAdmin()) {
-						return true;
-					} else if (theRole.equals("groupmanager") && (roles.isOLATAdmin() || roles.isGroupManager())) {
-						return true;
-					} else if (theRole.equals("usermanager") && (roles.isOLATAdmin() || roles.isUserManager())) {
-						return true;
-					} else if (theRole.equals("pooladmin") && (roles.isOLATAdmin() || roles.isQPoolManager())) {
-						return true;
-					} else if (theRole.equals("institutionalresourcemanager") && (roles.isOLATAdmin() || roles.isLearnResourceManager())) {
-						return true;
-					} else if (theRole.equals("author") && (roles.isOLATAdmin() || roles.isAuthor())) {
-						return true;
-					} else if (theRole.equals("coach") && (roles.isOLATAdmin() || roles.isCoach())) {
-						return true;
-					} 
+					}
 				}
 			}
 			return false;
@@ -73,7 +58,7 @@ public class SiteSecurityCallbackWithRolesRestriction implements SiteSecurityCal
 	 */
 	public void setLimitToRole(String limitToRoleConfig) {
 		if (limitToRoleConfig != null) {
-			limitToRole = limitToRoleConfig.split(",");			
+			limitToRole = limitToRoleConfig.split("[,]");			
 		}
 	}
 }
diff --git a/src/main/java/org/olat/core/gui/control/winmgr/AjaxController.java b/src/main/java/org/olat/core/gui/control/winmgr/AjaxController.java
index d6a4a1aa175..844a5036337 100644
--- a/src/main/java/org/olat/core/gui/control/winmgr/AjaxController.java
+++ b/src/main/java/org/olat/core/gui/control/winmgr/AjaxController.java
@@ -121,9 +121,6 @@ public class AjaxController extends DefaultController {
 		myContent = new VelocityContainer("jsserverpart", VELOCITY_ROOT + "/serverpart.html", null, this);
 		myContent.contextPut("pollperiod", Integer.valueOf(pollperiod));
 		
-		//more debug information: OLAT-3529
-		if (ajaxEnabled) myContent.contextPut("isAdmin", Boolean.valueOf(ureq.getUserSession().getRoles().isOLATAdmin()));
-		
 		// create a mapper to not block main traffic when polling (or vica versa)
 		final Window window = wboImpl.getWindow();
 		m = new Mapper() {
diff --git a/src/main/java/org/olat/core/gui/control/winmgr/_content/serverpart.html b/src/main/java/org/olat/core/gui/control/winmgr/_content/serverpart.html
index 8297a5e466b..f7958f60efd 100644
--- a/src/main/java/org/olat/core/gui/control/winmgr/_content/serverpart.html
+++ b/src/main/java/org/olat/core/gui/control/winmgr/_content/serverpart.html
@@ -90,7 +90,6 @@ function tick () {
 
 jQuery(document).ready(initPolling);
 
-#if ($isAdmin)
 ##check whether polling started or not. Wrap it makes it more stable
 jQuery(function() { 
 	setTimeout( function(){ if (!o_info.ajaxpp) {
@@ -98,7 +97,6 @@ jQuery(function() {
 		}},60000);
 	}
 );
-#end
 
 function onPollSuccess(content, s, response) {
 	if(response.status == 304) {
diff --git a/src/main/java/org/olat/core/id/Roles.java b/src/main/java/org/olat/core/id/Roles.java
index 920e11bfc3e..8cf3e1d7efc 100644
--- a/src/main/java/org/olat/core/id/Roles.java
+++ b/src/main/java/org/olat/core/id/Roles.java
@@ -28,6 +28,7 @@ package org.olat.core.id;
 
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -40,46 +41,21 @@ import org.olat.basesecurity.OrganisationRoles;
 */
 public class Roles implements Serializable {
 	private static final long serialVersionUID = 4726449291059674346L;
-	private final boolean isSystemAdmin;
-	private final boolean isOLATAdmin;
-	private final boolean isUserManager;
-	private final boolean isGroupManager;
-	private final boolean isAuthor;
-	private final boolean isCoach;
+
 	private final boolean isGuestOnly;
-	private final boolean isLearnResourceManager;
-	private final boolean isQPoolManager;
-	private final boolean isCurriculumManager;
 	private final boolean isInvitee;
 	
 	private List<RolesByOrganisation> rolesByOrganisations;
 
-	/**
-	 * @param isOLATAdmin
-	 * @param isUserManager
-	 * @param isGroupManager
-	 * @param isAuthor
-	 * @param isGuestOnly
-	 * @param isUniCourseManager
-	 */
-	public Roles(boolean isOLATAdmin, boolean isUserManager, boolean isGroupManager, boolean isAuthor, boolean isGuestOnly,
-			boolean isLearnResourceManager, boolean isInvitee) {
-		this(false, isOLATAdmin, isGroupManager, isUserManager, isAuthor, isGuestOnly, isLearnResourceManager, false,  false, false, isInvitee);
-	}
-	
-	public Roles(boolean isSystemAdmin, boolean isOLATAdmin, boolean isUserManager, boolean isGroupManager, boolean isAuthor, boolean isGuestOnly,
-			boolean isLearnResourceManager, boolean isQPoolManager, boolean isCurriculumManager, boolean isCoach, boolean isInvitee) {
-		this.isSystemAdmin = isSystemAdmin;
-		this.isOLATAdmin = isOLATAdmin;
-		this.isGroupManager = isGroupManager;
-		this.isUserManager = isUserManager;
-		this.isAuthor = isAuthor;
+	private Roles(List<RolesByOrganisation> rolesByOrganisations, boolean isGuestOnly, boolean isInvitee) {
+		this.rolesByOrganisations = rolesByOrganisations;
 		this.isGuestOnly = isGuestOnly;
-		this.isLearnResourceManager = isLearnResourceManager;
-		this.isQPoolManager = isQPoolManager;
-		this.isCurriculumManager = isCurriculumManager;
 		this.isInvitee = isInvitee;
-		this.isCoach = isCoach;
+	}
+	
+	public static final Roles guestRoles() {
+		RolesByOrganisation guest = new RolesByOrganisation(null, new OrganisationRoles[] {  OrganisationRoles.guest });
+		return new Roles(Collections.singletonList(guest), true, false);
 	}
 	
 	/**
@@ -88,53 +64,40 @@ public class Roles implements Serializable {
 	 * @return The roles object
 	 */
 	public static final Roles userRoles() {
-		return new Roles(false, false, false, false, false, false, false, false, false, false, false);
+		RolesByOrganisation lrm = new RolesByOrganisation(null, new OrganisationRoles[] {  OrganisationRoles.user });
+		return new Roles(Collections.singletonList(lrm), false, false);
 	}
 	
 	public static final Roles authorRoles() {
-		return new Roles(false, false, false, true, false, false, false);
+		RolesByOrganisation lrm = new RolesByOrganisation(null, new OrganisationRoles[] {  OrganisationRoles.user, OrganisationRoles.author });
+		return new Roles(Collections.singletonList(lrm), false, false);
 	}
 	
-	public static final Roles roles(OrganisationRoles... organisationRoles) {
-		boolean systemAdmin = false;
-		boolean olatAdmin = false;
-		boolean groupManager = false;
-		boolean userManager = false;
-		boolean author = false;
-		boolean guestOnly = false;
-		boolean learnResourceManager = false;
-		boolean poolAdmin = false;
-		boolean curriculumManager = false;
-		boolean invitee = false;
-		boolean coach = false;
-
-		if(organisationRoles != null && organisationRoles.length > 0) {
-			for(OrganisationRoles organisationRole:organisationRoles) {
-				if(organisationRole != null) {
-					switch(organisationRole) {
-						case sysadmin: systemAdmin = true; break;
-						case administrator: olatAdmin = true; break;
-						case usermanager: userManager = true; break;
-						case learnresourcemanager: learnResourceManager = true; break;
-						case groupmanager: groupManager = true; break;
-						case poolmanager: poolAdmin = true; break;
-						case curriculummanager: curriculumManager = true; break;
-						case author: author = true; break;
-						case coach: coach = true; break;
-						case user: break;
-						case invitee: invitee = true; break;
-						case guest: guestOnly = true; break;
-					}
-				}
-			}
-		}
-		
-		return new Roles(systemAdmin, olatAdmin, userManager, groupManager, author, guestOnly,
-				learnResourceManager, poolAdmin, curriculumManager, coach, invitee);
+	public static final Roles administratorRoles() {
+		RolesByOrganisation lrm = new RolesByOrganisation(null, new OrganisationRoles[] {  OrganisationRoles.user, OrganisationRoles.administrator });
+		return new Roles(Collections.singletonList(lrm), false, false);
+	}
+	
+	public static final Roles administratorAndManagersRoles() {
+		RolesByOrganisation lrm = new RolesByOrganisation(null, new OrganisationRoles[] {
+				OrganisationRoles.user,
+				OrganisationRoles.administrator,
+				OrganisationRoles.usermanager,
+				OrganisationRoles.poolmanager,
+				OrganisationRoles.groupmanager,
+				OrganisationRoles.curriculummanager,
+				OrganisationRoles.learnresourcemanager	
+		});
+		return new Roles(Collections.singletonList(lrm), false, false);
 	}
 	
-	public void setRolesByOrganisation(List<RolesByOrganisation> rolesByOrganisations) {
-		this.rolesByOrganisations = new ArrayList<>(rolesByOrganisations);
+	public static final Roles learnResourceManagerRoles() {
+		RolesByOrganisation lrm = new RolesByOrganisation(null, new OrganisationRoles[] {  OrganisationRoles.user, OrganisationRoles.learnresourcemanager });
+		return new Roles(Collections.singletonList(lrm), false, false);
+	}
+	
+	public static final Roles valueOf(List<RolesByOrganisation> rolesByOrganisations, boolean isGuestOnly, boolean isInvitee) {
+		return new Roles(new ArrayList<>(rolesByOrganisations), isGuestOnly, isInvitee);
 	}
 	
 	public RolesByOrganisation getRoles(OrganisationRef organisation) {
@@ -168,7 +131,8 @@ public class Roles implements Serializable {
 		List<OrganisationRef> organisations = new ArrayList<>();
 		if(rolesByOrganisations != null) {
 			for(int i=rolesByOrganisations.size(); i--> 0; ) {
-				if(rolesByOrganisations.get(i).hasRole(role)) {
+				if(rolesByOrganisations.get(i).hasRole(role)
+						&& rolesByOrganisations.get(i).getOrganisation() != null) {
 					organisations.add(rolesByOrganisations.get(i).getOrganisation());
 				}
 			}
@@ -180,7 +144,8 @@ public class Roles implements Serializable {
 		List<OrganisationRef> organisations = new ArrayList<>();
 		if(rolesByOrganisations != null) {
 			for(int i=rolesByOrganisations.size(); i--> 0; ) {
-				if(rolesByOrganisations.get(i).hasSomeRoles(roles)) {
+				if(rolesByOrganisations.get(i).hasSomeRoles(roles)
+						&& rolesByOrganisations.get(i).getOrganisation() != null) {
 					organisations.add(rolesByOrganisations.get(i).getOrganisation());
 				}
 			}
@@ -188,6 +153,18 @@ public class Roles implements Serializable {
 		return organisations;
 	}
 	
+	public boolean hasRole(OrganisationRoles role) {
+		boolean foundRole = false;
+		if(rolesByOrganisations != null) {
+			for(int i=rolesByOrganisations.size(); i--> 0; ) {
+				if(rolesByOrganisations.get(i).hasRole(role)) {
+					foundRole = true;
+				}
+			}
+		}
+		return foundRole;
+	}
+	
 	public boolean hasRole(OrganisationRef organisation, OrganisationRoles role) {
 		boolean foundRole = false;
 		if(rolesByOrganisations != null) {
@@ -238,91 +215,84 @@ public class Roles implements Serializable {
 	}
 
 	public boolean isSystemAdmin() {
-		return isSystemAdmin;
+		return hasRole(OrganisationRoles.sysadmin);
 	}
-
-	/**
-	 * @return boolean
-	 */
+	
+	public boolean isAdministrator() {
+		return hasRole(OrganisationRoles.administrator);
+	}
+	
+	public boolean isPrincipal() {
+		return hasRole(OrganisationRoles.principal);
+	}
+	
 	public boolean isOLATAdmin() {
-		return isOLATAdmin;
+		return hasRole(OrganisationRoles.administrator);
 	}
 
-	/**
-	 * @return boolean
-	 */
 	public boolean isAuthor() {
-		return isAuthor;
-	}
-	
-	public boolean isCoach() {
-		return isCoach;
+		return hasRole(OrganisationRoles.author);
 	}
 	
-	/**
-	 * @return boolean
-	 */
-	public boolean isGuestOnly() {
-		return isGuestOnly;
+	public boolean isGroupManager() {
+		return hasRole(OrganisationRoles.groupmanager);
 	}
 	
-	/**
-	 * @return boolean
-	 */
-	public boolean isGroupManager() {
-		return isGroupManager;
+	public boolean isRolesManager() {
+		return hasRole(OrganisationRoles.rolesmanager);
 	}
 
-	/**
-	 * @return boolean true if the user has the role "user manager" in some organizations.
-	 */
 	public boolean isUserManager() {
-		return isUserManager;
+		return hasRole(OrganisationRoles.usermanager);
 	}
 	
-	/**
-	 * @return boolean True if the user has the role "learn resource manager" in some organizations.
-	 */
 	public boolean isLearnResourceManager() {
-		return isLearnResourceManager;
+		return hasRole(OrganisationRoles.learnresourcemanager);
 	}
 	
-	/**
-	 * @return boolean
-	 */
-	public boolean isQPoolManager() {
-		return isQPoolManager;
+	public boolean isPoolManager() {
+		return hasRole(OrganisationRoles.poolmanager);
 	}
 	
 	public boolean isCurriculumManager() {
-		return isCurriculumManager;
+		return hasRole(OrganisationRoles.curriculummanager);
 	}
 	
-	/**
-	 * @return boolean
-	 */
+	public boolean isLectureManager() {
+		return hasRole(OrganisationRoles.lecturemanager);
+	}
+	
+	public boolean isQualityManager() {
+		return hasRole(OrganisationRoles.qualitymanager);
+	}
+	
+	public boolean isLineManager() {
+		return hasRole(OrganisationRoles.linemanager);
+	}
+
 	public boolean isInvitee() {
 		return isInvitee;
 	}
 
-	@Override
-	public String toString() {
-		return "admin:"+isOLATAdmin+", usermanager:"+isUserManager+", groupmanager:"+isGroupManager+", author:"+isAuthor+", guestonly:"+isGuestOnly+", isInstitutionalResourceManager:"+isLearnResourceManager+", isInvitee:"+isInvitee+", "+super.toString();
+	public boolean isGuestOnly() {
+		return hasRole(OrganisationRoles.guest) || isGuestOnly;
+	}
+	
+	public boolean isManagerOf(OrganisationRoles role, Roles targetRoles) {
+		List<OrganisationRef> targetOrganisations = targetRoles.getOrganisationsWithRole(OrganisationRoles.user);
+		return hasRole(targetOrganisations, role);
 	}
 
 	@Override
 	public int hashCode() {
 		final int prime = 31;
 		int result = 1;
-		result = prime * result + (isAuthor ? 1231 : 1237);
-		result = prime * result + (isGroupManager ? 1231 : 1237);
+		
+		
+		
+		
 		result = prime * result + (isGuestOnly ? 1231 : 1237);
-		result = prime * result + (isLearnResourceManager ? 1231 : 1237);
 		result = prime * result + (isInvitee ? 1231 : 1237);
-		result = prime * result + (isOLATAdmin ? 1231 : 1237);
-		result = prime * result + (isUserManager ? 1231 : 1237);
-		result = prime * result + (isQPoolManager ? 1231 : 1237);
-		result = prime * result + (isCurriculumManager ? 1231 : 1237);
 		return result;
 	}
 
@@ -331,22 +301,20 @@ public class Roles implements Serializable {
 		if (this == obj) {
 			return true;
 		}
-		if (obj == null) {
-			return false;
-		}
-		if (getClass() != obj.getClass()) {
-			return false;
+		if (obj instanceof Roles) {
+			Roles roles = (Roles) obj;
+			if(roles.isGuestOnly != isGuestOnly || roles.isInvitee != isInvitee) {
+				return false;
+			}
+			if((roles.rolesByOrganisations == null || roles.rolesByOrganisations.isEmpty())
+					&& (rolesByOrganisations == null || rolesByOrganisations.isEmpty())) {
+				return true;
+			}
+			return roles.rolesByOrganisations != null && rolesByOrganisations != null
+					&& roles.rolesByOrganisations.size() == rolesByOrganisations.size()
+					&& roles.rolesByOrganisations.containsAll(rolesByOrganisations)
+					&& rolesByOrganisations.containsAll(roles.rolesByOrganisations);
 		}
-		
-		Roles other = (Roles) obj;
-		return isOLATAdmin == other.isOLATAdmin
-				&& isUserManager == other.isUserManager
-				&& isGroupManager == other.isGroupManager
-				&& isAuthor == other.isAuthor
-				&& isGuestOnly == other.isGuestOnly
-				&& isLearnResourceManager == other.isLearnResourceManager
-				&& isQPoolManager == other.isQPoolManager
-				&& isCurriculumManager == other.isCurriculumManager
-				&& isInvitee == other.isInvitee;
+		return false;
 	}
 }
diff --git a/src/main/java/org/olat/core/id/RolesByOrganisation.java b/src/main/java/org/olat/core/id/RolesByOrganisation.java
index 5650f69cf51..04c3515242f 100644
--- a/src/main/java/org/olat/core/id/RolesByOrganisation.java
+++ b/src/main/java/org/olat/core/id/RolesByOrganisation.java
@@ -21,6 +21,7 @@ package org.olat.core.id;
 
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 import org.olat.basesecurity.OrganisationRoles;
@@ -40,16 +41,38 @@ public class RolesByOrganisation implements Serializable {
 	
 	public RolesByOrganisation(OrganisationRef organisation, OrganisationRoles[] roles) {
 		this.organisation = organisation;
-		this.roles = roles;
+		if(roles != null && roles.length > 1) {
+			Arrays.sort(roles);
+		}
+		this.roles = roles == null ? OrganisationRoles.EMPTY_ROLES : roles;
 	}
 	
 	public RolesByOrganisation(OrganisationRef organisation, List<OrganisationRoles> roles) {
-		this.organisation = organisation;
-		this.roles = roles == null ? new OrganisationRoles[0] : roles.toArray(new OrganisationRoles[roles.size()]);
+		this(organisation, roles == null ? new OrganisationRoles[0] : roles.toArray(new OrganisationRoles[roles.size()]));
+	}
+	
+	public static RolesByOrganisation enhance(RolesByOrganisation original, List<OrganisationRoles> rolesToAdd, List<OrganisationRoles> rolesToRemove) {
+		List<OrganisationRoles> roles = new ArrayList<>();
+		for(OrganisationRoles role:original.roles) {
+			roles.add(role);
+		}
+		if(rolesToAdd != null) {
+			for(OrganisationRoles roleToAdd:rolesToAdd) {
+				if(!roles.contains(roleToAdd)) {
+					roles.add(roleToAdd);
+				}
+			}
+		}
+		if(rolesToRemove != null) {
+			for(OrganisationRoles roleToRemove:rolesToRemove) {
+				roles.remove(roleToRemove);
+			}
+		}
+		return new RolesByOrganisation(original.getOrganisation(), roles);
 	}
 	
-	public static RolesByOrganisation roles(OrganisationRef org, boolean guest, boolean invitee,
-			boolean user, boolean coach, boolean author,
+	public static RolesByOrganisation roles(OrganisationRef org,
+			boolean guest, boolean invitee, boolean user, boolean author,
 			boolean groupManager, boolean poolManager, boolean curriculummanager,
 			boolean usermanager, boolean learnresourcemanager, boolean admin) {
 		
@@ -63,9 +86,6 @@ public class RolesByOrganisation implements Serializable {
 			if(invitee) {
 				roleList.add(OrganisationRoles.invitee);
 			}
-			if(coach) {
-				roleList.add(OrganisationRoles.coach);
-			}
 			if(groupManager) {
 				roleList.add(OrganisationRoles.groupmanager);
 			}
@@ -96,10 +116,13 @@ public class RolesByOrganisation implements Serializable {
 	}
 	
 	public boolean matchOrganisation(OrganisationRef org) {
+		if(organisation == null) return true;
 		return organisation.getKey().equals(org.getKey());
 	}
 	
 	public boolean matchOrganisationOrItsParents(Organisation org) {
+		if(organisation == null) return true;
+		
 		if(organisation.getKey().equals(org.getKey())) {
 			return true;
 		}
@@ -124,10 +147,6 @@ public class RolesByOrganisation implements Serializable {
 		return hasRole(OrganisationRoles.user);
 	}
 	
-	public boolean isCoach() {
-		return hasRole(OrganisationRoles.coach);
-	}
-	
 	public boolean isAuthor() {
 		return hasRole(OrganisationRoles.author);
 	}
@@ -140,6 +159,10 @@ public class RolesByOrganisation implements Serializable {
 		return hasRole(OrganisationRoles.usermanager);
 	}
 	
+	public boolean isRolesManager() {
+		return hasRole(OrganisationRoles.usermanager);
+	}
+	
 	public boolean isPoolManager() {
 		return hasRole(OrganisationRoles.poolmanager);
 	}
@@ -187,5 +210,33 @@ public class RolesByOrganisation implements Serializable {
 		}
 		return false;
 	}
+	
+	@Override
+	public int hashCode() {
+		int hashCode = 31;
+		if(roles != null) {
+			for(OrganisationRoles role:roles) {
+				hashCode += role.hashCode();
+			}
+		}
+		if(organisation != null && organisation.getKey() != null) {
+			hashCode += organisation.hashCode();
+		}
+		return hashCode;
+	}
 
+	@Override
+	public boolean equals(Object obj) {
+		if(this == obj) {
+			return true;
+		}
+		if(obj instanceof RolesByOrganisation) {
+			RolesByOrganisation r = (RolesByOrganisation)obj;
+			if((r.organisation == null && organisation == null)
+					|| (r.organisation != null && organisation != null && r.organisation.getKey().equals(organisation.getKey()))) {
+				return Arrays.equals(r.roles, roles);
+			}
+		}
+		return false;
+	}
 }
diff --git a/src/main/java/org/olat/core/util/mail/ui/MailListController.java b/src/main/java/org/olat/core/util/mail/ui/MailListController.java
index 0cc95811eef..1f5fb076cd7 100644
--- a/src/main/java/org/olat/core/util/mail/ui/MailListController.java
+++ b/src/main/java/org/olat/core/util/mail/ui/MailListController.java
@@ -55,6 +55,7 @@ import org.olat.core.gui.control.generic.dtabs.Activateable2;
 import org.olat.core.gui.control.generic.modal.DialogBoxController;
 import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
 import org.olat.core.id.OLATResourceable;
+import org.olat.core.id.Roles;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.StateEntry;
 import org.olat.core.util.Formatter;
@@ -356,7 +357,9 @@ public class MailListController extends BasicController implements Activateable2
 						DBMailLight mail = (DBMailLight) tableCtr.getTableDataModel().getObject(i);						
 						MailerResult result = forwardToMyRealMail(mail);
 						if(result.getReturnCode() != MailerResult.OK) {
-							MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getUserSession().getRoles().isOLATAdmin(), getLocale());
+							Roles roles = ureq.getUserSession().getRoles();
+							boolean detailedErrorOutput = roles.isAdministrator() || roles.isSystemAdmin();
+							MailHelper.printErrorsAndWarnings(result, getWindowControl(), detailedErrorOutput, getLocale());
 						} else {
 							showInfo("mail.action.send.real.success", mail.getSubject());
 						}
diff --git a/src/main/java/org/olat/core/util/mail/ui/SendDocumentsByEMailController.java b/src/main/java/org/olat/core/util/mail/ui/SendDocumentsByEMailController.java
index 9a744cf2ade..74406a3dd23 100644
--- a/src/main/java/org/olat/core/util/mail/ui/SendDocumentsByEMailController.java
+++ b/src/main/java/org/olat/core/util/mail/ui/SendDocumentsByEMailController.java
@@ -55,6 +55,7 @@ import org.olat.core.gui.control.generic.folder.FolderHelper;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.gui.util.CSSHelper;
 import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.core.id.UserConstants;
 import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.id.context.ContextEntry;
@@ -229,7 +230,7 @@ public class SendDocumentsByEMailController extends FormBasicController implemen
 			bodySb.append(bodyElement.getValue()).append('\n').append('\n');
 		}
 
-		attachments = new ArrayList<File>();
+		attachments = new ArrayList<>();
 		long fileSize = 0l;
 		for (VFSLeaf file : files) {
 			MetaInfo infos = null;
@@ -550,8 +551,10 @@ public class SendDocumentsByEMailController extends FormBasicController implemen
 			bundle.setContent(subject, body, attachmentArray);
 			result.append(mailManager.sendMessage(bundle));
 		}
-
-		MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getUserSession().getRoles().isOLATAdmin(), ureq.getLocale());
+		
+		Roles roles = ureq.getUserSession().getRoles();
+		boolean detailedErrorOutput = roles.isAdministrator() || roles.isSystemAdmin();
+		MailHelper.printErrorsAndWarnings(result, getWindowControl(), detailedErrorOutput, ureq.getLocale());
 	}
 
 	public class FileInfo {
diff --git a/src/main/java/org/olat/core/util/session/UserSessionManager.java b/src/main/java/org/olat/core/util/session/UserSessionManager.java
index 0bd6fb07c66..3bf71b3a7b3 100644
--- a/src/main/java/org/olat/core/util/session/UserSessionManager.java
+++ b/src/main/java/org/olat/core/util/session/UserSessionManager.java
@@ -133,8 +133,7 @@ public class UserSessionManager implements GenericEventListener {
 	public UserSession getUserSession(HttpServletRequest hreq) {
 		// get existing or create new session
 		HttpSession httpSession = hreq.getSession(true);
-		UserSession usess = getUserSession(httpSession);
-		return usess;
+		return getUserSession(httpSession);
 	}
 	
 	/**
@@ -184,7 +183,7 @@ public class UserSessionManager implements GenericEventListener {
 	 * @return set of authenticated active user sessions
 	 */
 	public Set<UserSession> getAuthenticatedUserSessions() {
-		return new HashSet<UserSession>(authUserSessions);
+		return new HashSet<>(authUserSessions);
 	}
 	
 	public int getNumberOfAuthenticatedUserSessions() {
@@ -442,7 +441,7 @@ public class UserSessionManager implements GenericEventListener {
 
 					String objtostr = "n/a";
 					try {
-						objtostr = obj.toString();
+						objtostr = (obj == null ? "NULL" : obj.toString());
 					} catch (Exception ee) {
 						// ignore
 					}
@@ -542,7 +541,7 @@ public class UserSessionManager implements GenericEventListener {
 		Set<UserSession> userSessions = getAuthenticatedUserSessions();
 		for (UserSession userSession : userSessions) {
 			Roles userRoles = userSession != null ? userSession.getRoles() : null; 
-			if (userRoles != null && !userRoles.isOLATAdmin()) {
+			if (userRoles != null && !userRoles.isAdministrator() && !userRoles.isSystemAdmin()) {
 				//do not logout administrators
 				try {
 					internSignOffAndClear(userSession);
@@ -571,19 +570,20 @@ public class UserSessionManager implements GenericEventListener {
 		Comparator<UserSession> sessionComparator = new Comparator<UserSession>() {
 			@Override
 			public int compare(UserSession o1, UserSession o2) {
-				Long long1 = new Long((o1).getSessionInfo().getLastClickTime());
-				Long long2 = new Long((o2).getSessionInfo().getLastClickTime());
+				Long long1 = Long.valueOf((o1).getSessionInfo().getLastClickTime());
+				Long long2 = Long.valueOf((o2).getSessionInfo().getLastClickTime());
 				return long1.compareTo(long2);
 			}
 		};
 		// clusterNOK ?? invalidate only locale sessions ?
-		TreeSet<UserSession> sortedSet = new TreeSet<UserSession>(sessionComparator);
+		TreeSet<UserSession> sortedSet = new TreeSet<>(sessionComparator);
 		sortedSet.addAll(authUserSessions);
 		int i = 0;	
 		for (Iterator<UserSession> iterator = sortedSet.iterator(); iterator.hasNext() && i++<nbrSessions;) {
 			try {
 				UserSession userSession = iterator.next();
-				if (!userSession.getRoles().isOLATAdmin() && !userSession.getSessionInfo().isWebDAV()) {
+				if (!userSession.getRoles().isAdministrator() && !userSession.getRoles().isSystemAdmin()
+						&& !userSession.getSessionInfo().isWebDAV()) {
 					internSignOffAndClear(userSession);
 					invalidateCounter++;
 				}
diff --git a/src/main/java/org/olat/course/CourseFactory.java b/src/main/java/org/olat/course/CourseFactory.java
index 085618d41a9..a134c20d5e9 100644
--- a/src/main/java/org/olat/course/CourseFactory.java
+++ b/src/main/java/org/olat/course/CourseFactory.java
@@ -42,6 +42,8 @@ import java.util.concurrent.ConcurrentMap;
 import java.util.zip.ZipOutputStream;
 
 import org.olat.admin.quota.QuotaConstants;
+import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.commons.calendar.CalendarManager;
 import org.olat.commons.calendar.CalendarNotificationManager;
 import org.olat.commons.calendar.manager.ImportToCalendarManager;
@@ -513,7 +515,7 @@ public class CourseFactory {
 		synchronized (sourceCourse) { //o_clusterNOK - cannot be solved with doInSync since could take too long (leads to error: "Lock wait timeout exceeded")
 			OLATResource courseResource = sourceCourse.getCourseEnvironment().getCourseGroupManager().getCourseResource();
 			sourceCourse.exportToFilesystem(courseResource, fExportDir, runtimeDatas, backwardsCompatible);
-			Set<String> fileSet = new HashSet<String>();
+			Set<String> fileSet = new HashSet<>();
 			String[] files = fExportDir.list();
 			for (int i = 0; i < files.length; i++) {
 				fileSet.add(files[i]);
@@ -580,7 +582,7 @@ public class CourseFactory {
 		 publishProcess.changeGeneralAccess(identity, newAccess, membersOnly);
 
 		 if (publishTreeModel.hasPublishableChanges()) {
-			 List<String>nodeToPublish = new ArrayList<String>();
+			 List<String>nodeToPublish = new ArrayList<>();
 			 visitPublishModel(publishTreeModel.getRootNode(), publishTreeModel, nodeToPublish);
 
 			 publishProcess.createPublishSetFor(nodeToPublish);
@@ -625,8 +627,7 @@ public class CourseFactory {
 			Translator translator = Util.createPackageTranslator(CourseFactory.class, ureq.getLocale());
 			wControl.setError(translator.translate("error.helpcourse.not.configured"));
 			// create empty main controller
-			LayoutMain3ColsController emptyCtr = new LayoutMain3ColsController(ureq, wControl, null, null, null);
-			return emptyCtr;
+			return new LayoutMain3ColsController(ureq, wControl, null, null, null);
 		} else {
 			// Increment launch counter
 			rs.incrementLaunchCounter(entry);
@@ -634,7 +635,7 @@ public class CourseFactory {
 
 			ContextEntry ce = BusinessControlFactory.getInstance().createContextEntry(entry);
 			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ce, wControl);
-			RepositoryEntrySecurity reSecurity = new RepositoryEntrySecurity(false, false, false, false, false, false, false, true, false);
+			RepositoryEntrySecurity reSecurity = new RepositoryEntrySecurity(false, false, false, false, false, false, false, false, true, false);
 			return new RunMainController(ureq, bwControl, null, course, entry, reSecurity, null);
 		}
 	}
@@ -652,9 +653,13 @@ public class CourseFactory {
 		RepositoryEntry courseRe = RepositoryManager.getInstance().lookupRepositoryEntry(res, false);
 		PersistingCourseImpl course = (PersistingCourseImpl) loadCourse(res);
 		File exportDirectory = CourseFactory.getOrCreateDataExportDirectory(identity, course.getCourseTitle());
-		boolean isOLATAdmin = roles.isOLATAdmin();
-		boolean isOresOwner = RepositoryManager.getInstance().isOwnerOfRepositoryEntry(identity, courseRe);
-		boolean isOresInstitutionalManager = RepositoryManager.getInstance().isLearnResourceManagerFor(roles, courseRe);
+		
+		RepositoryService repositoryService = CoreSpringFactory.getImpl(RepositoryService.class);
+		boolean isOLATAdmin = roles.isAdministrator()
+				&& repositoryService.hasRoleExpanded(identity, courseRe, OrganisationRoles.administrator.name());
+		boolean isOresOwner = repositoryService.hasRole(identity, courseRe, GroupRoles.owner.name());
+		boolean isOresInstitutionalManager = roles.isLearnResourceManager()
+				&& repositoryService.hasRoleExpanded(identity, courseRe, OrganisationRoles.learnresourcemanager.name());
 		archiveCourse(identity, course, charset, locale, exportDirectory, isOLATAdmin, isOresOwner, isOresInstitutionalManager);
 	}
 
diff --git a/src/main/java/org/olat/course/MergedCourseContainer.java b/src/main/java/org/olat/course/MergedCourseContainer.java
index f7675f732eb..80a561a1422 100644
--- a/src/main/java/org/olat/course/MergedCourseContainer.java
+++ b/src/main/java/org/olat/course/MergedCourseContainer.java
@@ -19,6 +19,8 @@
  */
 package org.olat.course;
 
+import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
 import org.olat.core.id.IdentityEnvironment;
@@ -123,8 +125,12 @@ public class MergedCourseContainer extends MergeSource {
 		String sfSoftkey = courseConfig.getSharedFolderSoftkey();
 		if (StringHelper.containsNonWhitespace(sfSoftkey) && !CourseConfig.VALUE_EMPTY_SHAREDFOLDER_SOFTKEY.equals(sfSoftkey)) {
 			RepositoryEntry re = persistingCourse.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
-			if(identityEnv == null || identityEnv.getRoles().isOLATAdmin() || RepositoryManager.getInstance().isOwnerOfRepositoryEntry(identityEnv.getIdentity(), re)) {
-				OLATResource sharedResource = CoreSpringFactory.getImpl(RepositoryService.class).loadRepositoryEntryResourceBySoftKey(sfSoftkey);
+			RepositoryService repositoryService = CoreSpringFactory.getImpl(RepositoryService.class);
+			
+			if(identityEnv == null || repositoryService.hasRoleExpanded(identityEnv.getIdentity(), re,
+					OrganisationRoles.administrator.name(), OrganisationRoles.learnresourcemanager.name(),
+					GroupRoles.owner.name())) {
+				OLATResource sharedResource = repositoryService.loadRepositoryEntryResourceBySoftKey(sfSoftkey);
 				if (sharedResource != null) {
 					OlatRootFolderImpl sharedFolder = SharedFolderManager.getInstance().getSharedFolder(sharedResource);
 					if (sharedFolder != null) {
diff --git a/src/main/java/org/olat/course/archiver/CourseLogsArchiveController.java b/src/main/java/org/olat/course/archiver/CourseLogsArchiveController.java
index 0f5fd5a5867..5e022505eab 100644
--- a/src/main/java/org/olat/course/archiver/CourseLogsArchiveController.java
+++ b/src/main/java/org/olat/course/archiver/CourseLogsArchiveController.java
@@ -29,6 +29,8 @@ import java.io.File;
 import java.util.Date;
 import java.util.Locale;
 
+import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.core.commons.modules.bc.FolderRunController;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
@@ -41,7 +43,6 @@ import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
-import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Roles;
 import org.olat.core.id.UserConstants;
@@ -54,6 +55,7 @@ import org.olat.course.statistic.AsyncExportManager;
 import org.olat.home.HomeMainController;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
+import org.olat.repository.RepositoryService;
 import org.springframework.beans.factory.annotation.Autowired;
 
 /**
@@ -77,6 +79,8 @@ public class CourseLogsArchiveController extends BasicController {
 	private RepositoryManager repositoryManager;
 	@Autowired
 	private AsyncExportManager asyncExportManager;
+	@Autowired
+	private RepositoryService repositoryService;
 	
 	/**
 	 * Constructor for the course logs archive controller
@@ -87,18 +91,19 @@ public class CourseLogsArchiveController extends BasicController {
 	public CourseLogsArchiveController(UserRequest ureq, WindowControl wControl, OLATResourceable ores) {
 		super(ureq, wControl);
 		this.ores = ores;
-		this.myPanel = new Panel("myPanel");
+		myPanel = new Panel("myPanel");
 		myPanel.addListener(this);
 
 		myContent = createVelocityContainer("start_courselogs");
 		
-		Identity identity = ureq.getIdentity();
 		Roles roles = ureq.getUserSession().getRoles();
 		
 		RepositoryEntry re = repositoryManager.lookupRepositoryEntry(ores, false);
-		boolean isOLATAdmin = roles.isOLATAdmin();
-		boolean isOresOwner = repositoryManager.isOwnerOfRepositoryEntry(identity, re);
-		boolean isOresInstitutionalManager = repositoryManager.isLearnResourceManagerFor(roles, re);
+		boolean isOLATAdmin = roles.isAdministrator()
+				&& repositoryService.hasRoleExpanded(getIdentity(), re, OrganisationRoles.administrator.name());
+		boolean isOresOwner = repositoryService.hasRole(getIdentity(), re, GroupRoles.owner.name());
+		boolean isOresInstitutionalManager = roles.isLearnResourceManager()
+				&& repositoryService.hasRoleExpanded(getIdentity(), re, OrganisationRoles.learnresourcemanager.name());
 		boolean aLogV = isOresOwner || isOresInstitutionalManager;
 		boolean uLogV = isOLATAdmin;
 		boolean sLogV = isOresOwner || isOresInstitutionalManager;
diff --git a/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementController.java b/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementController.java
index 0ae3fb00fe3..4c37dd8a7c0 100644
--- a/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementController.java
+++ b/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementController.java
@@ -31,6 +31,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.olat.NewControllerFactory;
+import org.olat.basesecurity.BaseSecurityModule;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
@@ -116,6 +117,8 @@ public class CertificateAndEfficiencyStatementController extends BasicController
 	@Autowired
 	private UserManager userManager;
 	@Autowired
+	private BaseSecurityModule securityModule;
+	@Autowired
 	private EfficiencyStatementMediaHandler mediaHandler;
 	@Autowired
 	private PortfolioV2Module portfolioV2Module;
@@ -251,7 +254,7 @@ public class CertificateAndEfficiencyStatementController extends BasicController
 		mainVC.contextPut("username", statementOwner.getName());
 		
 		Roles roles = ureq.getUserSession().getRoles();
-		boolean isAdministrativeUser = (roles.isAuthor() || roles.isGroupManager() || roles.isUserManager() || roles.isOLATAdmin());
+		boolean isAdministrativeUser = securityModule.isUserAllowedAdminProps(roles);
 		List<UserPropertyHandler> userPropertyHandlers = userManager.getUserPropertyHandlersFor(usageIdentifyer, isAdministrativeUser);
 		mainVC.contextPut("userPropertyHandlers", userPropertyHandlers);
 
diff --git a/src/main/java/org/olat/course/config/CourseConfig.java b/src/main/java/org/olat/course/config/CourseConfig.java
index d274cdeeda8..ab48724328b 100644
--- a/src/main/java/org/olat/course/config/CourseConfig.java
+++ b/src/main/java/org/olat/course/config/CourseConfig.java
@@ -415,14 +415,14 @@ public class CourseConfig implements Serializable, Cloneable {
 	}
 	
 	public void setSharedFolderReadOnlyMount(boolean mount) {
-		configuration.put(KEY_SHAREDFOLDER_READONLY, new Boolean(mount));
+		configuration.put(KEY_SHAREDFOLDER_READONLY, Boolean.valueOf(mount));
 	}
 
 	/**
 	 * @param b
 	 */
 	public void setEfficencyStatementIsEnabled(boolean b) {
-		configuration.put(KEY_EFFICENCY_ENABLED, new Boolean(b));
+		configuration.put(KEY_EFFICENCY_ENABLED, Boolean.valueOf(b));
 	}
 
 	/**
diff --git a/src/main/java/org/olat/course/groupsandrights/CourseGroupManager.java b/src/main/java/org/olat/course/groupsandrights/CourseGroupManager.java
index e2920308fba..f81753b780d 100644
--- a/src/main/java/org/olat/course/groupsandrights/CourseGroupManager.java
+++ b/src/main/java/org/olat/course/groupsandrights/CourseGroupManager.java
@@ -31,7 +31,6 @@ import java.util.List;
 import org.olat.basesecurity.IdentityRef;
 import org.olat.basesecurity.OrganisationRoles;
 import org.olat.core.id.Identity;
-import org.olat.core.id.Roles;
 import org.olat.course.export.CourseEnvironmentMapper;
 import org.olat.group.BusinessGroup;
 import org.olat.group.area.BGArea;
@@ -117,20 +116,15 @@ public interface CourseGroupManager {
 	public boolean isIdentityCourseCoach(Identity identity);
 
 	/**
-	 * Checks if user is course administrator (is owner of repository entry)
+	 * Checks if user is course administrator (is owner, learning resource
+	 * manager or administrator of repository entry)
 	 * 
-	 * @param identity
-	 * @return boolean
+	 * @param identity The identity to check
+	 * @return boolean true if the specified is administrator, learn resource manager or owner
+	 * 			of the course.
 	 */
 	public boolean isIdentityCourseAdministrator(Identity identity);
 	
-	/**
-	 * 
-	 * @param identity
-	 * @return
-	 */
-	public boolean isIdentityCourseLearnResourceManager(Identity identity, Roles roles);
-	
 	/**
 	 * Checks if user is course participant
 	 * 
diff --git a/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java b/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java
index 4c29546294b..6981a1bee69 100644
--- a/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java
+++ b/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java
@@ -37,7 +37,6 @@ import org.olat.basesecurity.OrganisationService;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
-import org.olat.core.id.Roles;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.StringHelper;
@@ -115,7 +114,7 @@ public class PersistingCourseGroupManager implements CourseGroupManager {
 	@Override
 	public RepositoryEntry getCourseEntry() {
 		if(courseRepoEntry == null) {
-			courseRepoEntry = RepositoryManager.getInstance().lookupRepositoryEntry(courseResource, false);
+			courseRepoEntry = repositoryManager.lookupRepositoryEntry(courseResource, false);
 		}
 		return courseRepoEntry;
 	}
@@ -202,7 +201,7 @@ public class PersistingCourseGroupManager implements CourseGroupManager {
 		SearchBusinessGroupParams params = new SearchBusinessGroupParams();
 		if(StringHelper.isLong(nameOrKey)) {
 			try {
-				params.setGroupKeys(Collections.singletonList(new Long(nameOrKey)));
+				params.setGroupKeys(Collections.singletonList(Long.valueOf(nameOrKey)));
 			} catch (NumberFormatException e) {
 				params.setExactName(nameOrKey);
 			}
@@ -248,33 +247,20 @@ public class PersistingCourseGroupManager implements CourseGroupManager {
 
 	@Override
 	public boolean isIdentityCourseCoach(Identity identity) {
-		boolean isCoach = repositoryService.hasRole(identity, getCourseEntry(), GroupRoles.coach.name());
-		if (isCoach) { // don't check any further
-			return true;
-		}
-
-		return businessGroupService.isIdentityInBusinessGroup(identity, null, true, false, getCourseEntry());
+		return repositoryService.hasRoleExpanded(identity, getCourseEntry(), GroupRoles.coach.name());
 	}
 	
 	@Override
 	public boolean isIdentityCourseParticipant(Identity identity) {
-		boolean participant = repositoryService.hasRole(identity, getCourseEntry(), GroupRoles.participant.name());
-		if (participant) {// don't check any further
-			return true;
-		}
-		return businessGroupService.isIdentityInBusinessGroup(identity, null, false, true, getCourseEntry());
+		return repositoryService.hasRoleExpanded(identity, getCourseEntry(), GroupRoles.participant.name());
 	}
 
 	@Override
 	public boolean isIdentityCourseAdministrator(Identity identity) {
 		// not really a group management method, for your convenience we have a
 		// shortcut here...
-		return repositoryService.hasRole(identity, getCourseEntry(), GroupRoles.owner.name());
-	}
-	
-	@Override
-	public boolean isIdentityCourseLearnResourceManager(Identity identity, Roles roles) {
-		return repositoryManager.isLearnResourceManagerFor(roles, courseRepoEntry);
+		return repositoryService.hasRoleExpanded(identity, getCourseEntry(), OrganisationRoles.administrator.name(),
+				OrganisationRoles.learnresourcemanager.name(), GroupRoles.owner.name());
 	}
 
 	@Override
@@ -284,23 +270,23 @@ public class PersistingCourseGroupManager implements CourseGroupManager {
 
 	@Override
 	public boolean isIdentityAnyCourseAdministrator(Identity identity) {
-		return repositoryService.hasRole(identity, false, GroupRoles.owner.name());
+		return repositoryService.hasRoleExpanded(identity, GroupRoles.owner.name());
 	}
 
 	@Override
 	public boolean isIdentityAnyCourseCoach(Identity identity) {
-		return repositoryService.hasRole(identity, true, GroupRoles.coach.name());
+		return repositoryService.hasRoleExpanded(identity, GroupRoles.coach.name());
 	}
 
 	@Override
 	public boolean isIdentityAnyCourseParticipant(Identity identity) {
-		return repositoryService.hasRole(identity, true, GroupRoles.participant.name());
+		return repositoryService.hasRoleExpanded(identity, GroupRoles.participant.name());
 	}
 
 	@Override
 	public void deleteCourseGroupmanagement() {
 		//delete permission group to course
-		RepositoryEntry re = RepositoryManager.getInstance().lookupRepositoryEntry(getCourseResource(), false);
+		RepositoryEntry re = repositoryManager.lookupRepositoryEntry(getCourseResource(), false);
 		if(re != null) {
 			businessGroupService.removeResource(re);
 			//delete areas
@@ -393,7 +379,7 @@ public class PersistingCourseGroupManager implements CourseGroupManager {
 	public CourseEnvironmentMapper importCourseBusinessGroups(File fImportDirectory) {
 		CourseEnvironmentMapper envMapper = new CourseEnvironmentMapper();
 		OLATResource resource = getCourseResource();
-		RepositoryEntry courseRe = RepositoryManager.getInstance().lookupRepositoryEntry(resource, true);
+		RepositoryEntry courseRe = repositoryManager.lookupRepositoryEntry(resource, true);
 		File fGroupXML1 = new File(fImportDirectory, LEARNINGGROUPEXPORT_XML);
 		if(fGroupXML1.exists()) {
 			BusinessGroupEnvironment env = businessGroupService.importGroups(courseRe, fGroupXML1);
diff --git a/src/main/java/org/olat/course/member/CourseBusinessGroupListController.java b/src/main/java/org/olat/course/member/CourseBusinessGroupListController.java
index af1db4ab069..4cba858a250 100644
--- a/src/main/java/org/olat/course/member/CourseBusinessGroupListController.java
+++ b/src/main/java/org/olat/course/member/CourseBusinessGroupListController.java
@@ -73,8 +73,8 @@ import org.olat.repository.RepositoryEntryRef;
  */
 public class CourseBusinessGroupListController extends AbstractBusinessGroupListController {
 	
-	public static String TABLE_ACTION_UNLINK = "tblUnlink";
-	public static String TABLE_ACTION_MULTI_UNLINK = "tblMultiUnlink";
+	public static final String TABLE_ACTION_UNLINK = "tblUnlink";
+	public static final String TABLE_ACTION_MULTI_UNLINK = "tblMultiUnlink";
 	
 	private final RepositoryEntry re;
 	private final boolean groupManagementRight;
@@ -173,7 +173,7 @@ public class CourseBusinessGroupListController extends AbstractBusinessGroupList
 		for(StatisticsBusinessGroupRow row:rows) {
 			BusinessGroupMembership membership = row.getMember();
 			Boolean allowLeave =  membership != null;
-			Boolean allowDelete = isAdmin() ? Boolean.TRUE : (membership == null ? null : new Boolean(membership.isOwner()));
+			Boolean allowDelete = isAdmin() ? Boolean.TRUE : (membership == null ? null : Boolean.valueOf(membership.isOwner()));
 			
 			FormLink markLink = uifactory.addFormLink("mark_" + row.getKey(), "mark", "", null, null, Link.NONTRANSLATED);
 			markLink.setIconLeftCSS(row.isMarked() ? Mark.MARK_CSS_LARGE : Mark.MARK_ADD_CSS_LARGE);
diff --git a/src/main/java/org/olat/course/member/MembersOverviewController.java b/src/main/java/org/olat/course/member/MembersOverviewController.java
index dd1bc1c9817..639f7feacac 100644
--- a/src/main/java/org/olat/course/member/MembersOverviewController.java
+++ b/src/main/java/org/olat/course/member/MembersOverviewController.java
@@ -394,7 +394,9 @@ public class MembersOverviewController extends BasicController implements Activa
 		
 		MailPackage mailing = new MailPackage(template, result, getWindowControl().getBusinessControl().getAsString(), template != null);
 		businessGroupService.updateMemberships(getIdentity(), allModifications, mailing);
-		MailHelper.printErrorsAndWarnings(result, getWindowControl(), roles.isOLATAdmin(), getLocale());
+		
+		boolean detailedErrorOutput = roles.isAdministrator() || roles.isSystemAdmin();
+		MailHelper.printErrorsAndWarnings(result, getWindowControl(), detailedErrorOutput, getLocale());
 		
 		//commit all changes to the curriculum memberships
 		List<CurriculumElementMembershipChange> curriculumChanges = changes.generateCurriculumElementMembershipChange(members);
diff --git a/src/main/java/org/olat/course/nodes/BlogCourseNode.java b/src/main/java/org/olat/course/nodes/BlogCourseNode.java
index 20dd644676c..453d06628a1 100644
--- a/src/main/java/org/olat/course/nodes/BlogCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/BlogCourseNode.java
@@ -23,6 +23,9 @@ import java.io.File;
 import java.util.List;
 import java.util.Locale;
 
+import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.OrganisationRoles;
+import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.services.notifications.SubscriptionContext;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.stack.BreadcrumbPanel;
@@ -31,6 +34,7 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.tabbable.TabbableController;
 import org.olat.core.id.Identity;
 import org.olat.core.id.Organisation;
+import org.olat.core.id.Roles;
 import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
@@ -56,7 +60,7 @@ import org.olat.modules.webFeed.ui.FeedMainController;
 import org.olat.modules.webFeed.ui.FeedUIFactory;
 import org.olat.modules.webFeed.ui.blog.BlogUIFactory;
 import org.olat.repository.RepositoryEntry;
-import org.olat.repository.RepositoryManager;
+import org.olat.repository.RepositoryService;
 import org.olat.repository.handlers.RepositoryHandler;
 import org.olat.repository.handlers.RepositoryHandlerFactory;
 import org.olat.util.logging.activity.LoggingResourceable;
@@ -91,23 +95,14 @@ public class BlogCourseNode extends AbstractFeedCourseNode {
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, NodeEvaluation ne, String nodecmd) {
 		RepositoryEntry entry = getReferencedRepositoryEntry();
-
-		Long courseId = userCourseEnv.getCourseEnvironment().getCourseResourceableId();
-		String nodeId = this.getIdent();
-		boolean isAdmin = ureq.getUserSession().getRoles().isOLATAdmin();
-		boolean isGuest = ureq.getUserSession().getRoles().isGuestOnly();
-		boolean isOwner = RepositoryManager.getInstance().isOwnerOfRepositoryEntry(ureq.getIdentity(), entry);
-		FeedSecurityCallback callback;
-		if(userCourseEnv.isCourseReadOnly()) {
-			callback = new FeedReadOnlySecurityCallback();
-		} else {
-			callback = new FeedNodeSecurityCallback(ne, isAdmin, isOwner, isGuest);
-		}
+		FeedSecurityCallback callback = getFeedSecurityCallback(ureq, entry, userCourseEnv, ne);
+		
 		SubscriptionContext subsContext = CourseModule.createSubscriptionContext(userCourseEnv.getCourseEnvironment(), this); 
 		callback.setSubscriptionContext(subsContext);
 		ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrap(this));
-		FeedMainController blogCtr = BlogUIFactory.getInstance(ureq.getLocale()).createMainController(entry.getOlatResource(), ureq, wControl, callback,
-				courseId, nodeId);
+		Long courseId = userCourseEnv.getCourseEnvironment().getCourseResourceableId();
+		FeedMainController blogCtr = BlogUIFactory.getInstance(ureq.getLocale())
+				.createMainController(entry.getOlatResource(), ureq, wControl, callback, courseId, getIdent());
 		List<ContextEntry> entries = BusinessControlFactory.getInstance().createCEListFromResourceType(nodecmd);
 		blogCtr.activate(ureq, entries, null);
 		Controller wrapperCtrl = TitledWrapperHelper.getWrapper(ureq, wControl, blogCtr, this, "o_blog_icon");
@@ -120,20 +115,34 @@ public class BlogCourseNode extends AbstractFeedCourseNode {
 		if (ne.isAtLeastOneAccessible()) {
 			// Create a feed peekview controller that shows the latest two entries
 			RepositoryEntry entry = getReferencedRepositoryEntry();
-			Long courseId = userCourseEnv.getCourseEnvironment().getCourseResourceableId();
-			String nodeId = this.getIdent();
-			boolean isAdmin = ureq.getUserSession().getRoles().isOLATAdmin();
-			boolean isGuest = ureq.getUserSession().getRoles().isGuestOnly();
-			//fxdiff BAKS-18
-			boolean isOwner = RepositoryManager.getInstance().isOwnerOfRepositoryEntry(ureq.getIdentity(), entry);
-			FeedSecurityCallback callback = new FeedNodeSecurityCallback(ne, isAdmin, isOwner, isGuest);
+			FeedSecurityCallback callback = getFeedSecurityCallback(ureq, entry, userCourseEnv, ne);
 			FeedUIFactory uiFactory = BlogUIFactory.getInstance(ureq.getLocale());
-			return new FeedPeekviewController(entry.getOlatResource(), ureq, wControl, callback, courseId, nodeId, uiFactory, 2, "o_blog_peekview");
+			Long courseId = userCourseEnv.getCourseEnvironment().getCourseResourceableId();
+			return new FeedPeekviewController(entry.getOlatResource(), ureq, wControl, callback, courseId, getIdent(), uiFactory, 2, "o_blog_peekview");
 		} else {
 			// use standard peekview
 			return super.createPeekViewRunController(ureq, wControl, userCourseEnv, ne);
 		}
 	}
+	
+	private FeedSecurityCallback getFeedSecurityCallback(UserRequest ureq, RepositoryEntry entry,
+			UserCourseEnvironment userCourseEnv, NodeEvaluation ne) {
+		FeedSecurityCallback callback;
+		if(userCourseEnv.isCourseReadOnly()) {
+			callback = new FeedReadOnlySecurityCallback();
+		} else {
+			Roles roles = ureq.getUserSession().getRoles();
+			RepositoryService repositoryService = CoreSpringFactory.getImpl(RepositoryService.class);
+
+			boolean isGuest = roles.isGuestOnly();
+			boolean isAdmin = (roles.isAdministrator() || roles.isLearnResourceManager())
+					&& repositoryService.hasRoleExpanded(ureq.getIdentity(), entry,
+							OrganisationRoles.administrator.name(), OrganisationRoles.learnresourcemanager.name());
+			boolean isOwner = !isGuest && repositoryService.hasRole(ureq.getIdentity(), entry, GroupRoles.owner.name());
+			callback = new FeedNodeSecurityCallback(ne, isAdmin, isOwner, isGuest);
+		}
+		return callback;
+	}
 
 	@Override
 	protected String getDefaultTitleOption() {
diff --git a/src/main/java/org/olat/course/nodes/FOCourseNode.java b/src/main/java/org/olat/course/nodes/FOCourseNode.java
index 61ddb57d90f..ebfd89b5d12 100644
--- a/src/main/java/org/olat/course/nodes/FOCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/FOCourseNode.java
@@ -201,7 +201,7 @@ public class FOCourseNode extends AbstractAccessableCourseNode {
 	
 	private Forum saveMultiForums(final CourseEnvironment courseEnv) {
 		final ForumManager fom = CoreSpringFactory.getImpl(ForumManager.class);
-		final OLATResourceable courseNodeResourceable = OresHelper.createOLATResourceableInstance(FOCourseNode.class, new Long(getIdent()));
+		final OLATResourceable courseNodeResourceable = OresHelper.createOLATResourceableInstance(FOCourseNode.class, Long.valueOf(getIdent()));
 		return CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(courseNodeResourceable, new SyncerCallback<Forum>(){
 			@Override
 			public Forum execute() {
diff --git a/src/main/java/org/olat/course/nodes/GoToMeetingCourseNode.java b/src/main/java/org/olat/course/nodes/GoToMeetingCourseNode.java
index 58dec61f2d1..14c5d113eed 100644
--- a/src/main/java/org/olat/course/nodes/GoToMeetingCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/GoToMeetingCourseNode.java
@@ -29,7 +29,6 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.messages.MessageUIFactory;
 import org.olat.core.gui.control.generic.tabbable.TabbableController;
 import org.olat.core.gui.translator.Translator;
-import org.olat.core.id.Identity;
 import org.olat.core.id.Roles;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
@@ -45,12 +44,9 @@ import org.olat.course.nodes.gotomeeting.GoToMeetingPeekViewController;
 import org.olat.course.run.navigation.NodeRunConstructionResult;
 import org.olat.course.run.userview.NodeEvaluation;
 import org.olat.course.run.userview.UserCourseEnvironment;
-import org.olat.group.BusinessGroupService;
-import org.olat.group.model.SearchBusinessGroupParams;
 import org.olat.modules.gotomeeting.GoToMeetingManager;
 import org.olat.modules.gotomeeting.ui.GoToMeetingRunController;
 import org.olat.repository.RepositoryEntry;
-import org.olat.repository.RepositoryManager;
 
 /**
  * 
@@ -113,21 +109,10 @@ public class GoToMeetingCourseNode extends AbstractAccessableCourseNode {
 			controller = MessageUIFactory.createInfoMessage(ureq, wControl, title, message);
 		} else {
 			// check if user is moderator of the virtual classroom
-			boolean admin = roles.isOLATAdmin();
-			boolean moderator = admin;
-			RepositoryEntry re = userCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
-	
-			if (!admin) {
-				RepositoryManager rm = RepositoryManager.getInstance();
-				if (re != null) {
-					admin = rm.isOwnerOfRepositoryEntry(ureq.getIdentity(), re)
-							|| rm.isLearnResourceManagerFor(roles, re);
-					moderator = admin 
-							|| rm.isIdentityInTutorSecurityGroup(ureq.getIdentity(), re)
-							|| isCoach(re, ureq.getIdentity());
-				}
-			}
-	
+			CourseGroupManager cgm = userCourseEnv.getCourseEnvironment().getCourseGroupManager();
+			boolean admin = cgm.isIdentityCourseAdministrator(ureq.getIdentity());
+			boolean moderator = admin || cgm.isIdentityCourseCoach(ureq.getIdentity());
+
 			// create run controller
 			RepositoryEntry courseEntry = userCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
 			controller = new GoToMeetingRunController(ureq, wControl, courseEntry, getIdent(), null,
@@ -136,13 +121,6 @@ public class GoToMeetingCourseNode extends AbstractAccessableCourseNode {
 		Controller ctrl = TitledWrapperHelper.getWrapper(ureq, wControl, controller, this, "o_gotomeeting_icon");
 		return new NodeRunConstructionResult(ctrl);
 	}
-	
-	private final boolean isCoach(RepositoryEntry re, Identity identity) {
-		BusinessGroupService bgs = CoreSpringFactory.getImpl(BusinessGroupService.class);
-		SearchBusinessGroupParams params = new SearchBusinessGroupParams(identity, true, false);
-		int count = bgs.countBusinessGroups(params, re);
-		return count > 0;
-	}
 
 	@Override
 	public Controller createPeekViewRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, NodeEvaluation ne) {
@@ -167,10 +145,7 @@ public class GoToMeetingCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public StatusDescription isConfigValid() {
 		if (oneClickStatusCache != null) { return oneClickStatusCache[0]; }
-		
-		StatusDescription sd = StatusDescription.NOERROR;
-		
-		return sd;
+		return StatusDescription.NOERROR;
 	}
 	
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/OpenMeetingsCourseNode.java b/src/main/java/org/olat/course/nodes/OpenMeetingsCourseNode.java
index 8a88d36066e..95dd323a9f7 100644
--- a/src/main/java/org/olat/course/nodes/OpenMeetingsCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/OpenMeetingsCourseNode.java
@@ -27,9 +27,7 @@ import org.olat.core.gui.components.stack.BreadcrumbPanel;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.tabbable.TabbableController;
-import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
-import org.olat.core.id.Roles;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.Util;
@@ -46,14 +44,11 @@ import org.olat.course.nodes.openmeetings.OpenMeetingsPeekViewController;
 import org.olat.course.run.navigation.NodeRunConstructionResult;
 import org.olat.course.run.userview.NodeEvaluation;
 import org.olat.course.run.userview.UserCourseEnvironment;
-import org.olat.group.BusinessGroupService;
-import org.olat.group.model.SearchBusinessGroupParams;
 import org.olat.modules.openmeetings.manager.OpenMeetingsException;
 import org.olat.modules.openmeetings.manager.OpenMeetingsManager;
 import org.olat.modules.openmeetings.ui.OpenMeetingsRoomEditController;
 import org.olat.modules.openmeetings.ui.OpenMeetingsRunController;
 import org.olat.repository.RepositoryEntry;
-import org.olat.repository.RepositoryManager;
 
 /**
  * 
@@ -106,38 +101,17 @@ public class OpenMeetingsCourseNode extends AbstractAccessableCourseNode {
 			UserCourseEnvironment userCourseEnv, NodeEvaluation ne, String nodecmd) {
 		updateModuleConfigDefaults(false);
 
-		Roles roles = ureq.getUserSession().getRoles();
-
 		// check if user is moderator of the virtual classroom
-		boolean admin = roles.isOLATAdmin();
-		boolean moderator = admin;
-		RepositoryEntry re = userCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
-
-		if (!admin) {
-			RepositoryManager rm = RepositoryManager.getInstance();
-			if (re != null) {
-				admin = rm.isOwnerOfRepositoryEntry(ureq.getIdentity(), re)
-						|| rm.isLearnResourceManagerFor(roles, re);
-				moderator = admin 
-						|| rm.isIdentityInTutorSecurityGroup(ureq.getIdentity(), re)
-						|| isCoach(re, ureq.getIdentity());
-			}
-		}
+		CourseGroupManager cgm = userCourseEnv.getCourseEnvironment().getCourseGroupManager();
+		boolean admin = cgm.isIdentityCourseAdministrator(ureq.getIdentity());
+		boolean moderator = admin || cgm.isIdentityAnyCourseCoach(ureq.getIdentity());
 
 		// create run controller
-		OLATResourceable ores = OresHelper.clone(
-				userCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseResource());
+		OLATResourceable ores = OresHelper.clone(userCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseResource());
 		Controller runCtr = new OpenMeetingsRunController(ureq, wControl, null, ores, getIdent(), admin, moderator, userCourseEnv.isCourseReadOnly());
 		Controller controller = TitledWrapperHelper.getWrapper(ureq, wControl, runCtr, this, "o_openmeetings_icon");
 		return new NodeRunConstructionResult(controller);
 	}
-	
-	private final boolean isCoach(RepositoryEntry re, Identity identity) {
-		BusinessGroupService bgs = CoreSpringFactory.getImpl(BusinessGroupService.class);
-		SearchBusinessGroupParams params = new SearchBusinessGroupParams(identity, true, false);
-		int count = bgs.countBusinessGroups(params, re);
-		return count > 0;
-	}
 
 	@Override
 	public Controller createPeekViewRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, NodeEvaluation ne) {
diff --git a/src/main/java/org/olat/course/nodes/PodcastCourseNode.java b/src/main/java/org/olat/course/nodes/PodcastCourseNode.java
index 88237f18e7d..d829bf3bfdb 100644
--- a/src/main/java/org/olat/course/nodes/PodcastCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/PodcastCourseNode.java
@@ -23,6 +23,9 @@ import java.io.File;
 import java.util.List;
 import java.util.Locale;
 
+import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.OrganisationRoles;
+import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.services.notifications.SubscriptionContext;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.stack.BreadcrumbPanel;
@@ -31,6 +34,7 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.tabbable.TabbableController;
 import org.olat.core.id.Identity;
 import org.olat.core.id.Organisation;
+import org.olat.core.id.Roles;
 import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
@@ -56,7 +60,7 @@ import org.olat.modules.webFeed.ui.FeedMainController;
 import org.olat.modules.webFeed.ui.FeedUIFactory;
 import org.olat.modules.webFeed.ui.podcast.PodcastUIFactory;
 import org.olat.repository.RepositoryEntry;
-import org.olat.repository.RepositoryManager;
+import org.olat.repository.RepositoryService;
 import org.olat.repository.handlers.RepositoryHandler;
 import org.olat.repository.handlers.RepositoryHandlerFactory;
 import org.olat.util.logging.activity.LoggingResourceable;
@@ -92,21 +96,12 @@ public class PodcastCourseNode extends AbstractFeedCourseNode {
 			UserCourseEnvironment userCourseEnv, NodeEvaluation ne, String nodecmd) {
 		RepositoryEntry entry = getReferencedRepositoryEntry();
 		Long courseId = userCourseEnv.getCourseEnvironment().getCourseResourceableId();
-		String nodeId = this.getIdent();
-		boolean isAdmin = ureq.getUserSession().getRoles().isOLATAdmin();
-		boolean isGuest = ureq.getUserSession().getRoles().isGuestOnly();
-		boolean isOwner = RepositoryManager.getInstance().isOwnerOfRepositoryEntry(ureq.getIdentity(), entry);
-		FeedSecurityCallback callback;
-		if(userCourseEnv.isCourseReadOnly()) {
-			callback = new FeedReadOnlySecurityCallback();
-		} else {
-			callback = new FeedNodeSecurityCallback(ne, isAdmin, isOwner, isGuest);
-		}
+		FeedSecurityCallback callback = getFeedSecurityCallback(ureq, entry, userCourseEnv, ne);
 		SubscriptionContext subsContext = CourseModule.createSubscriptionContext(userCourseEnv.getCourseEnvironment(), this); 
 		callback.setSubscriptionContext(subsContext);
 		ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrap(this));
 		FeedMainController podcastCtr = PodcastUIFactory.getInstance(ureq.getLocale()).createMainController(entry.getOlatResource(), ureq, control,
-				callback, courseId, nodeId);
+				callback, courseId, getIdent());
 		List<ContextEntry> entries = BusinessControlFactory.getInstance().createCEListFromResourceType(nodecmd);
 		podcastCtr.activate(ureq, entries, null);
 		Controller wrapperCtrl = TitledWrapperHelper.getWrapper(ureq, control, podcastCtr, this, "o_podcast_icon");
@@ -120,18 +115,33 @@ public class PodcastCourseNode extends AbstractFeedCourseNode {
 			// Create a feed peekview controller that shows the latest two entries
 			RepositoryEntry entry = getReferencedRepositoryEntry();
 			Long courseId = userCourseEnv.getCourseEnvironment().getCourseResourceableId();
-			String nodeId = this.getIdent();
-			boolean isAdmin = ureq.getUserSession().getRoles().isOLATAdmin();
-			boolean isGuest = ureq.getUserSession().getRoles().isGuestOnly();
-			boolean isOwner = RepositoryManager.getInstance().isOwnerOfRepositoryEntry(ureq.getIdentity(), entry);
-			FeedSecurityCallback callback = new FeedNodeSecurityCallback(ne, isAdmin, isOwner, isGuest);
+			FeedSecurityCallback callback = getFeedSecurityCallback(ureq, entry, userCourseEnv, ne);
 			FeedUIFactory uiFactory = PodcastUIFactory.getInstance(ureq.getLocale());
-			return new FeedPeekviewController(entry.getOlatResource(), ureq, wControl, callback, courseId, nodeId, uiFactory, 2, "o_podcast_peekview");
+			return new FeedPeekviewController(entry.getOlatResource(), ureq, wControl, callback, courseId, getIdent(), uiFactory, 2, "o_podcast_peekview");
 		} else {
 			// use standard peekview
 			return super.createPeekViewRunController(ureq, wControl, userCourseEnv, ne);
 		}
 	}
+	
+	private FeedSecurityCallback getFeedSecurityCallback(UserRequest ureq, RepositoryEntry entry,
+			UserCourseEnvironment userCourseEnv, NodeEvaluation ne) {
+		RepositoryService repositoryService = CoreSpringFactory.getImpl(RepositoryService.class);
+		Roles roles = ureq.getUserSession().getRoles();
+		boolean isGuest = roles.isGuestOnly();
+		
+		boolean isAdmin = (roles.isAdministrator() || roles.isLearnResourceManager())
+				&& repositoryService.hasRoleExpanded(ureq.getIdentity(), entry,
+						OrganisationRoles.administrator.name(), OrganisationRoles.learnresourcemanager.name());
+		boolean isOwner = !isGuest && repositoryService.hasRole(ureq.getIdentity(), entry, GroupRoles.owner.name());
+		FeedSecurityCallback callback;
+		if(userCourseEnv.isCourseReadOnly()) {
+			callback = new FeedReadOnlySecurityCallback();
+		} else {
+			callback = new FeedNodeSecurityCallback(ne, isAdmin, isOwner, isGuest);
+		}
+		return callback;
+	}
 
 	@Override
 	protected String getDefaultTitleOption() {
diff --git a/src/main/java/org/olat/course/nodes/ViteroCourseNode.java b/src/main/java/org/olat/course/nodes/ViteroCourseNode.java
index 8ee6c9da077..66da0fad109 100644
--- a/src/main/java/org/olat/course/nodes/ViteroCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/ViteroCourseNode.java
@@ -33,13 +33,13 @@ import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Roles;
 import org.olat.core.util.Util;
 import org.olat.core.util.resource.OresHelper;
-import org.olat.course.CourseFactory;
 import org.olat.course.CourseModule;
 import org.olat.course.ICourse;
 import org.olat.course.condition.ConditionEditController;
 import org.olat.course.editor.CourseEditorEnv;
 import org.olat.course.editor.NodeEditController;
 import org.olat.course.editor.StatusDescription;
+import org.olat.course.groupsandrights.CourseGroupManager;
 import org.olat.course.nodes.vitero.ViteroEditController;
 import org.olat.course.nodes.vitero.ViteroPeekViewController;
 import org.olat.course.run.navigation.NodeRunConstructionResult;
@@ -48,7 +48,6 @@ import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.modules.vitero.manager.ViteroManager;
 import org.olat.modules.vitero.ui.ViteroBookingsRunController;
 import org.olat.repository.RepositoryEntry;
-import org.olat.repository.RepositoryManager;
 
 /**
  * 
@@ -104,21 +103,8 @@ public class ViteroCourseNode extends AbstractAccessableCourseNode {
 			runCtr = MessageUIFactory.createInfoMessage(ureq, wControl, title, message);
 		} else {
 			// check if user is moderator of the virtual classroom
-			boolean moderator = roles.isOLATAdmin();
-			Long key = userCourseEnv.getCourseEnvironment().getCourseResourceableId();
-			if (!moderator) {
-				if(roles.isLearnResourceManager() || roles.isAuthor() || roles.isOLATAdmin()) {
-					RepositoryManager rm = RepositoryManager.getInstance();
-					ICourse course = CourseFactory.loadCourse(key);
-					RepositoryEntry re = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
-					if (re != null) {
-						moderator = rm.isOwnerOfRepositoryEntry(ureq.getIdentity(), re);
-						if(!moderator) {
-							moderator = rm.isLearnResourceManagerFor(roles, re);
-						}
-					}
-				}
-			}
+			CourseGroupManager cgm = userCourseEnv.getCourseEnvironment().getCourseGroupManager();
+			boolean moderator = cgm.isIdentityCourseAdministrator(ureq.getIdentity());
 			// create run controller
 			Long resourceId = userCourseEnv.getCourseEnvironment().getCourseResourceableId();
 			OLATResourceable ores = OresHelper.createOLATResourceableInstance(CourseModule.class, resourceId);
@@ -149,8 +135,7 @@ public class ViteroCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public StatusDescription isConfigValid() {
 		if (oneClickStatusCache != null) { return oneClickStatusCache[0]; }
-		StatusDescription status = StatusDescription.NOERROR;
-		return status;
+		return StatusDescription.NOERROR;
 	}
 	
 	@Override
@@ -162,7 +147,7 @@ public class ViteroCourseNode extends AbstractAccessableCourseNode {
 	public void cleanupOnDelete(ICourse course) {
 		super.cleanupOnDelete(course);
 		// load configuration
-		ViteroManager provider = (ViteroManager)CoreSpringFactory.getBean("viteroManager");
+		ViteroManager provider = CoreSpringFactory.getImpl(ViteroManager.class);
 		// remove meeting
 		OLATResourceable ores = OresHelper.createOLATResourceableInstance(course.getResourceableTypeName(), course.getResourceableId());
 		provider.deleteAll(null, ores, getIdent());
diff --git a/src/main/java/org/olat/course/nodes/basiclti/LTIRunController.java b/src/main/java/org/olat/course/nodes/basiclti/LTIRunController.java
index 2a1142543d6..d32bcbf7c39 100644
--- a/src/main/java/org/olat/course/nodes/basiclti/LTIRunController.java
+++ b/src/main/java/org/olat/course/nodes/basiclti/LTIRunController.java
@@ -479,7 +479,7 @@ public class LTIRunController extends BasicController {
 		}
 		CourseGroupManager groupManager = courseEnv.getCourseGroupManager();
 		boolean admin = groupManager.isIdentityCourseAdministrator(getIdentity());
-		if(admin || roles.isOLATAdmin()) {
+		if(admin) {
 			String authorRole = config.getStringValue(BasicLTICourseNode.CONFIG_KEY_AUTHORROLE);
 			if(StringHelper.containsNonWhitespace(authorRole)) {
 				return authorRole;
diff --git a/src/main/java/org/olat/course/nodes/bc/BCCourseNodeRunController.java b/src/main/java/org/olat/course/nodes/bc/BCCourseNodeRunController.java
index 461c45dbab4..ef7729a5694 100644
--- a/src/main/java/org/olat/course/nodes/bc/BCCourseNodeRunController.java
+++ b/src/main/java/org/olat/course/nodes/bc/BCCourseNodeRunController.java
@@ -28,6 +28,8 @@ package org.olat.course.nodes.bc;
 import java.util.List;
 
 import org.apache.commons.lang.StringUtils;
+import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.core.commons.modules.bc.FolderConfig;
 import org.olat.core.commons.modules.bc.FolderRunController;
 import org.olat.core.commons.modules.bc.vfs.OlatNamedContainerImpl;
@@ -35,11 +37,11 @@ import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
 import org.olat.core.commons.services.notifications.SubscriptionContext;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
-import org.olat.core.gui.control.DefaultController;
+import org.olat.core.gui.components.panel.Panel;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
+import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.gui.control.generic.dtabs.Activateable2;
-import org.olat.core.id.Identity;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.StateEntry;
 import org.olat.core.util.UserSession;
@@ -49,9 +51,8 @@ import org.olat.core.util.vfs.VFSItem;
 import org.olat.core.util.vfs.VFSManager;
 import org.olat.core.util.vfs.callbacks.ReadOnlyCallback;
 import org.olat.core.util.vfs.callbacks.VFSSecurityCallback;
-import org.olat.course.CourseFactory;
 import org.olat.course.CourseModule;
-import org.olat.course.ICourse;
+import org.olat.course.groupsandrights.CourseGroupManager;
 import org.olat.course.groupsandrights.CourseRights;
 import org.olat.course.nodes.BCCourseNode;
 import org.olat.course.run.environment.CourseEnvironment;
@@ -59,7 +60,9 @@ import org.olat.course.run.userview.NodeEvaluation;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
+import org.olat.repository.RepositoryService;
 import org.olat.util.logging.activity.LoggingResourceable;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * Initial Date: Apr 22, 2004
@@ -68,9 +71,14 @@ import org.olat.util.logging.activity.LoggingResourceable;
  * @author gnaegi
  * @author dfurrer, dirk.furrer@frentix.com, http://www.frentix.com
  */
-public class BCCourseNodeRunController extends DefaultController implements Activateable2 {
+public class BCCourseNodeRunController extends BasicController implements Activateable2 {
 
 	private FolderRunController frc;
+	
+	@Autowired
+	private RepositoryManager repositoryManager;
+	@Autowired
+	private RepositoryService repositoryService;
 
 	/**
 	 * Constructor for a briefcase course building block runtime controller
@@ -82,11 +90,11 @@ public class BCCourseNodeRunController extends DefaultController implements Acti
 	 * @param scallback
 	 */
 	public BCCourseNodeRunController(UserRequest ureq, WindowControl wContr, UserCourseEnvironment userCourseEnv, BCCourseNode courseNode, NodeEvaluation ne) {
-		super(wContr);
+		super(ureq, wContr);
 		
 		CourseEnvironment courseEnv = userCourseEnv.getCourseEnvironment();
+		CourseGroupManager cgm = courseEnv.getCourseGroupManager();
 		UserSession usess = ureq.getUserSession();
-		boolean isOlatAdmin = usess.getRoles().isOLATAdmin();
 		boolean isGuestOnly = usess.getRoles().isGuestOnly();
 		// set logger on this run controller
 		addLoggingResourceable(LoggingResourceable.wrap(courseNode));
@@ -98,7 +106,8 @@ public class BCCourseNodeRunController extends DefaultController implements Acti
 		VFSSecurityCallback scallback;
 		if(courseNode.getModuleConfiguration().getBooleanSafe(BCCourseNodeEditController.CONFIG_AUTO_FOLDER)) {
 			OlatNamedContainerImpl directory = BCCourseNode.getNodeFolderContainer(courseNode, courseEnv);
-			scallback = new FolderNodeCallback(directory.getRelPath(), ne, isOlatAdmin, isGuestOnly, nodefolderSubContext);
+			boolean isAdministrator = cgm.isIdentityCourseAdministrator(getIdentity());
+			scallback = new FolderNodeCallback(directory.getRelPath(), ne, isAdministrator, isGuestOnly, nodefolderSubContext);
 			target = directory;
 		} else if(courseNode.isSharedFolder()) {
 			String subpath = courseNode.getModuleConfiguration().getStringValue(BCCourseNodeEditController.CONFIG_SUBPATH, "");
@@ -114,7 +123,12 @@ public class BCCourseNodeRunController extends DefaultController implements Acti
 				scallback = new FolderNodeReadOnlyCallback(nodefolderSubContext);
 			} else {
 				String relPath = BCCourseNode.getNodeFolderContainer(courseNode, courseEnv).getRelPath();
-				scallback = new FolderNodeCallback(relPath, ne, isOlatAdmin, isGuestOnly, nodefolderSubContext);
+				
+				String sfSoftkey = courseEnv.getCourseConfig().getSharedFolderSoftkey();
+				RepositoryEntry sharedResource = repositoryManager.lookupRepositoryEntryBySoftkey(sfSoftkey, false);
+				boolean isAdministrator = repositoryService.hasRoleExpanded(getIdentity(), sharedResource,
+						OrganisationRoles.administrator.name(), OrganisationRoles.learnresourcemanager.name(), GroupRoles.owner.name());
+				scallback = new FolderNodeCallback(relPath, ne, isAdministrator, isGuestOnly, nodefolderSubContext);
 			}
 		} else{
 			//create folder automatically if not found
@@ -138,7 +152,8 @@ public class BCCourseNodeRunController extends DefaultController implements Acti
 				} else {
 					relPath = VFSManager.getRelativeItemPath(target, courseContainer, null);
 				}
-				scallback = new FolderNodeCallback(relPath, ne, isOlatAdmin, isGuestOnly, nodefolderSubContext);
+				boolean isAdministrator = cgm.isIdentityCourseAdministrator(getIdentity());
+				scallback = new FolderNodeCallback(relPath, ne, isAdministrator, isGuestOnly, nodefolderSubContext);
 			}
 		}
 		
@@ -147,17 +162,12 @@ public class BCCourseNodeRunController extends DefaultController implements Acti
 			scallback = new FolderNodeReadOnlyCallback(nodefolderSubContext);
 		}
 		
-		if(!noFolder) {
+		if(!noFolder && target != null) {
 			target.setLocalSecurityCallback(scallback);
 
 			VFSContainer courseContainer = null;
 			if(scallback.canWrite() && scallback.canCopy()) {
-				Identity identity = ureq.getIdentity();
-				ICourse course = CourseFactory.loadCourse(courseEnv.getCourseResourceableId());
-				RepositoryManager rm = RepositoryManager.getInstance();
-				RepositoryEntry entry = rm.lookupRepositoryEntry(course, true);
-				if (isOlatAdmin || rm.isOwnerOfRepositoryEntry(identity, entry)
-						|| courseEnv.getCourseGroupManager().hasRight(identity, CourseRights.RIGHT_COURSEEDITOR)) {
+				if (cgm.isIdentityCourseAdministrator(getIdentity()) || cgm.hasRight(getIdentity(), CourseRights.RIGHT_COURSEEDITOR)) {
 					// use course folder as copy source
 					courseContainer = courseEnv.getCourseFolderContainer();
 				}
@@ -182,7 +192,9 @@ public class BCCourseNodeRunController extends DefaultController implements Acti
 	
 			boolean canMail = !userCourseEnv.isCourseReadOnly();
 			frc = new FolderRunController(olatNamed, true, true, canMail, ureq, getWindowControl(), null, null, courseContainer);
-			setInitialComponent(frc.getInitialComponent());
+			putInitialPanel(frc.getInitialComponent());
+		} else {
+			putInitialPanel(new Panel("error"));
 		}
 	}
 
diff --git a/src/main/java/org/olat/course/nodes/bc/FolderNodeCallback.java b/src/main/java/org/olat/course/nodes/bc/FolderNodeCallback.java
index 248b0ac51ce..25289c8fe7e 100644
--- a/src/main/java/org/olat/course/nodes/bc/FolderNodeCallback.java
+++ b/src/main/java/org/olat/course/nodes/bc/FolderNodeCallback.java
@@ -43,7 +43,7 @@ public class FolderNodeCallback implements VFSSecurityCallback {
 	private final String relPath;
 	private Quota nodeFolderQuota;
 	private final NodeEvaluation ne;
-	private final boolean isOlatAdmin;
+	private final boolean isAdministrator;
 	private final boolean isGuestOnly;
 	private final SubscriptionContext nodefolderSubContext;
 
@@ -55,28 +55,28 @@ public class FolderNodeCallback implements VFSSecurityCallback {
 	 * admins will have full access, regardless of their node evaluation
 	 * @param nodefolderSubContext
 	 */
-	public FolderNodeCallback(String relPath, NodeEvaluation ne, boolean isOlatAdmin, boolean isGuestOnly, SubscriptionContext nodefolderSubContext) {
+	public FolderNodeCallback(String relPath, NodeEvaluation ne, boolean isAdministrator, boolean isGuestOnly, SubscriptionContext nodefolderSubContext) {
 		this.ne = ne;
 		this.relPath = relPath;
-		this.isOlatAdmin = isOlatAdmin;
+		this.isAdministrator = isAdministrator;
 		this.isGuestOnly = isGuestOnly;
 		this.nodefolderSubContext = nodefolderSubContext;
 	}
 
 	@Override
 	public boolean canList() {
-		return isOlatAdmin || ne.isCapabilityAccessible("download") || ne.isCapabilityAccessible("upload");
+		return isAdministrator || ne.isCapabilityAccessible("download") || ne.isCapabilityAccessible("upload");
 	}
 
 	@Override
 	public boolean canRead() {
-		return isOlatAdmin || ne.isCapabilityAccessible("download") || ne.isCapabilityAccessible("upload");
+		return isAdministrator || ne.isCapabilityAccessible("download") || ne.isCapabilityAccessible("upload");
 	}
 
 	@Override
 	public boolean canWrite() {
 	    if (isGuestOnly) return false;
-		return isOlatAdmin || ne.isCapabilityAccessible("upload");
+		return isAdministrator || ne.isCapabilityAccessible("upload");
 	}
 
 	@Override
@@ -87,7 +87,7 @@ public class FolderNodeCallback implements VFSSecurityCallback {
 	@Override
 	public boolean canDelete() {
 	    if (isGuestOnly) return false;
-		return isOlatAdmin || ne.isCapabilityAccessible("upload");
+		return isAdministrator || ne.isCapabilityAccessible("upload");
 	}
 
 	@Override
@@ -97,7 +97,7 @@ public class FolderNodeCallback implements VFSSecurityCallback {
 
 	@Override
 	public boolean canDeleteRevisionsPermanently() {
-		return isOlatAdmin;
+		return isAdministrator;
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/cal/CourseCalendars.java b/src/main/java/org/olat/course/nodes/cal/CourseCalendars.java
index 6a5097eb95e..0023181d3c3 100644
--- a/src/main/java/org/olat/course/nodes/cal/CourseCalendars.java
+++ b/src/main/java/org/olat/course/nodes/cal/CourseCalendars.java
@@ -47,7 +47,6 @@ import org.olat.course.run.calendar.CourseLinkProviderController;
 import org.olat.course.run.userview.NodeEvaluation;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.group.BusinessGroup;
-import org.olat.repository.RepositoryManager;
 
 public class CourseCalendars {
 
@@ -97,11 +96,10 @@ public class CourseCalendars {
 		ICourse course = CourseFactory.loadCourse(courseEnv.getCourseEnvironment().getCourseResourceableId());
 		KalendarRenderWrapper courseKalendarWrapper = calendarManager.getCourseCalendar(course);
 		CourseGroupManager cgm = course.getCourseEnvironment().getCourseGroupManager();
-		Roles roles = ureq.getUserSession().getRoles();
-		boolean isPrivileged = ! courseEnv.isCourseReadOnly() &&
-				(roles.isOLATAdmin() || courseEnv.isAdmin()
+		boolean isPrivileged = !courseEnv.isCourseReadOnly() &&
+				(courseEnv.isAdmin()
 				  || (ne != null && ne.isCapabilityAccessible(CalCourseNode.EDIT_CONDITION_ID))
-				  || RepositoryManager.getInstance().isLearnResourceManagerFor(roles, cgm.getCourseEntry()));
+				  || cgm.isIdentityCourseAdministrator(ureq.getIdentity()));
 		
 		if (isPrivileged) {
 			courseKalendarWrapper.setAccess(KalendarRenderWrapper.ACCESS_READ_WRITE);
diff --git a/src/main/java/org/olat/course/nodes/cp/CPEditController.java b/src/main/java/org/olat/course/nodes/cp/CPEditController.java
index abd188605cb..7a23e8a7dad 100644
--- a/src/main/java/org/olat/course/nodes/cp/CPEditController.java
+++ b/src/main/java/org/olat/course/nodes/cp/CPEditController.java
@@ -27,6 +27,8 @@ package org.olat.course.nodes.cp;
 
 import java.io.File;
 
+import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
@@ -46,8 +48,6 @@ import org.olat.core.gui.control.generic.closablewrapper.CloseableModalControlle
 import org.olat.core.gui.control.generic.iframe.DeliveryOptions;
 import org.olat.core.gui.control.generic.iframe.DeliveryOptionsConfigurationController;
 import org.olat.core.gui.control.generic.tabbable.ActivateableTabbableDefaultController;
-import org.olat.core.id.Identity;
-import org.olat.core.id.Roles;
 import org.olat.core.logging.AssertException;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.vfs.LocalFolderImpl;
@@ -67,6 +67,7 @@ import org.olat.modules.ModuleConfiguration;
 import org.olat.modules.cp.CPUIFactory;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
+import org.olat.repository.RepositoryService;
 import org.olat.repository.controllers.ReferencableEntriesSearchController;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -119,7 +120,7 @@ public class CPEditController extends ActivateableTabbableDefaultController impl
 	private final BreadcrumbPanel stackPanel;
 	
 	@Autowired
-	private RepositoryManager repositoryManager;
+	private RepositoryService repositoryService;
 
 	/**
 	 * @param cpNode
@@ -151,7 +152,7 @@ public class CPEditController extends ActivateableTabbableDefaultController impl
 				cpConfigurationVc.contextPut("showPreviewButton", Boolean.FALSE);
 				cpConfigurationVc.contextPut(VC_CHOSENCP, translate("no.cp.chosen"));
 			} else {
-				if (isEditable(ureq.getIdentity(), ureq.getUserSession().getRoles(), re)) {
+				if (canManage(re)) {
 					editLink = LinkFactory.createButtonSmall("edit", cpConfigurationVc, this);
 				}
 				cpConfigurationVc.contextPut("showPreviewButton", Boolean.TRUE);
@@ -228,10 +229,7 @@ public class CPEditController extends ActivateableTabbableDefaultController impl
 		}
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event)
-	 */
+	@Override
 	public void event(UserRequest urequest, Controller source, Event event) {
 		if (source == searchController) {
 			if (event == ReferencableEntriesSearchController.EVENT_REPOSITORY_ENTRY_SELECTED) { 
@@ -251,7 +249,7 @@ public class CPEditController extends ActivateableTabbableDefaultController impl
 						cpConfigurationVc.remove(editLink);
 						editLink = null;
 					}
-					if (isEditable(urequest.getIdentity(), urequest.getUserSession().getRoles(), re)) {
+					if (canManage(re)) {
 						editLink = LinkFactory.createButtonSmall("edit", cpConfigurationVc, this);
 					}
 					// fire event so the updated config is saved by the editormaincontroller
@@ -288,15 +286,13 @@ public class CPEditController extends ActivateableTabbableDefaultController impl
 	 * @param repository entry
 	 * @return
 	 */
-	private boolean isEditable(Identity identity, Roles roles, RepositoryEntry re) {
-		return roles.isOLATAdmin()
-				|| repositoryManager.isOwnerOfRepositoryEntry(identity, re) 
-				|| repositoryManager.isLearnResourceManagerFor(roles, re);
+	private boolean canManage(RepositoryEntry re) {
+		return repositoryService.hasRoleExpanded(getIdentity(), re,
+				OrganisationRoles.administrator.name(), OrganisationRoles.learnresourcemanager.name(),
+				GroupRoles.owner.name());
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.generic.tabbable.TabbableDefaultController#addTabs(org.olat.core.gui.components.TabbedPane)
-	 */
+	@Override
 	public void addTabs(TabbedPane tabbedPane) {
 		myTabbedPane = tabbedPane;
 
@@ -354,9 +350,7 @@ public class CPEditController extends ActivateableTabbableDefaultController impl
 		return (moduleConfiguration.get(CONFIG_KEY_REPOSITORY_SOFTKEY) != null);
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
-	 */
+	@Override
 	protected void doDispose() {
 		//child controllers registered with listenTo() get disposed in BasicController
 		if (previewCtr != null) {
@@ -365,10 +359,12 @@ public class CPEditController extends ActivateableTabbableDefaultController impl
 		}
 	}
 
+	@Override
 	public String[] getPaneKeys() {
 		return paneKeys;
 	}
 
+	@Override
 	public TabbedPane getTabbedPane() {
 		return myTabbedPane;
 	}
diff --git a/src/main/java/org/olat/course/nodes/dialog/DialogNodeForumCallback.java b/src/main/java/org/olat/course/nodes/dialog/DialogNodeForumCallback.java
index dce7c364851..c4895dbf178 100644
--- a/src/main/java/org/olat/course/nodes/dialog/DialogNodeForumCallback.java
+++ b/src/main/java/org/olat/course/nodes/dialog/DialogNodeForumCallback.java
@@ -30,9 +30,6 @@ import org.olat.course.run.userview.NodeEvaluation;
 import org.olat.modules.fo.ForumCallback;
 
 /**
- * Description:<br>
- * TODO: guido Class Description for DialogNodeForumCallback
- * <P>
  * Initial Date: 21.11.2005 <br>
  * 
  * @author guido
@@ -62,18 +59,12 @@ public class DialogNodeForumCallback implements ForumCallback {
 		return false;
 	}
 
-	/**
-	 * @see org.olat.modules.fo.ForumCallback#mayOpenNewThread()
-	 */
 	@Override
 	public boolean mayOpenNewThread() {
 		if (isGuestOnly) return false;
 		return ne.isCapabilityAccessible("poster") || ne.isCapabilityAccessible("moderator") || isOlatAdmin;
 	}
 
-	/**
-	 * @see org.olat.modules.fo.ForumCallback#mayReplyMessage()
-	 */
 	@Override
 	public boolean mayReplyMessage() {
 		if (isGuestOnly) return false;
@@ -90,46 +81,30 @@ public class DialogNodeForumCallback implements ForumCallback {
 		return true;
 	}
 
-	/**
-	 * @see org.olat.modules.fo.ForumCallback#mayEditMessageAsModerator()
-	 */
 	@Override
 	public boolean mayEditMessageAsModerator() {
 		if (isGuestOnly) return false;
 		return ne.isCapabilityAccessible("moderator") || isOlatAdmin;
 	}
 
-	/**
-	 * @see org.olat.modules.fo.ForumCallback#mayDeleteMessageAsModerator()
-	 */
 	@Override
 	public boolean mayDeleteMessageAsModerator() {
 		if (isGuestOnly) return false;
 		return ne.isCapabilityAccessible("moderator") || isOlatAdmin;
 	}
 
-	/**
-	 * 
-	 * @see org.olat.modules.fo.ForumCallback#mayArchiveForum()
-	 */
 	@Override
 	public boolean mayArchiveForum() {
 		if (isGuestOnly) return false;
 		else return true;
 	}
-	
-	/**
-	 * @see org.olat.modules.fo.ForumCallback#mayFilterForUser()
-	 */
+
 	@Override
 	public boolean mayFilterForUser() {
 		if (isGuestOnly) return false;
 		return ne.isCapabilityAccessible("moderator") || isOlatAdmin;
 	}
 
-	/**
-	 * @see org.olat.modules.fo.ForumCallback#getSubscriptionContext()
-	 */
 	@Override
 	public SubscriptionContext getSubscriptionContext() {
 		return (isGuestOnly ? null : subscriptionContext);
diff --git a/src/main/java/org/olat/course/nodes/dialog/ui/DialogCourseNodeRunController.java b/src/main/java/org/olat/course/nodes/dialog/ui/DialogCourseNodeRunController.java
index 56abc8dbfe8..661183928f7 100644
--- a/src/main/java/org/olat/course/nodes/dialog/ui/DialogCourseNodeRunController.java
+++ b/src/main/java/org/olat/course/nodes/dialog/ui/DialogCourseNodeRunController.java
@@ -29,6 +29,7 @@ import java.io.File;
 import java.util.List;
 import java.util.UUID;
 
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.core.commons.controllers.linkchooser.LinkChooserController;
 import org.olat.core.commons.controllers.linkchooser.URLChoosenEvent;
 import org.olat.core.commons.modules.bc.FileUploadController;
@@ -49,6 +50,7 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
 import org.olat.core.gui.control.generic.dtabs.Activateable2;
+import org.olat.core.id.Roles;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.StateEntry;
 import org.olat.core.util.UserSession;
@@ -61,6 +63,7 @@ import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.core.util.vfs.VFSManager;
 import org.olat.course.CourseModule;
+import org.olat.course.groupsandrights.CourseGroupManager;
 import org.olat.course.groupsandrights.CourseRights;
 import org.olat.course.nodes.DialogCourseNode;
 import org.olat.course.nodes.dialog.DialogElement;
@@ -73,7 +76,7 @@ import org.olat.modules.fo.ForumCallback;
 import org.olat.modules.fo.Message;
 import org.olat.modules.fo.manager.ForumManager;
 import org.olat.repository.RepositoryEntry;
-import org.olat.repository.RepositoryManager;
+import org.olat.repository.RepositoryService;
 import org.olat.util.logging.activity.LoggingResourceable;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -89,8 +92,7 @@ public class DialogCourseNodeRunController extends BasicController implements Ac
 	private Link uploadButton;
 	private final VelocityContainer mainVC;
 
-	private boolean isOlatAdmin;
-	private boolean isGuestOnly;
+	private final boolean isGuestOnly;
 	private DialogCourseNode courseNode;
 	private final RepositoryEntry entry;
 	private ForumCallback forumCallback;
@@ -108,7 +110,7 @@ public class DialogCourseNodeRunController extends BasicController implements Ac
 	@Autowired
 	private ForumManager forumManager;
 	@Autowired
-	private RepositoryManager repositoryManager;
+	private RepositoryService repositoryService;
 	@Autowired
 	private DialogElementsManager dialogElmsMgr;
 	@Autowired
@@ -120,19 +122,24 @@ public class DialogCourseNodeRunController extends BasicController implements Ac
 		this.nodeEvaluation = nodeEvaluation;
 		this.userCourseEnv = userCourseEnv;
 		this.courseNode = courseNode;
-		entry = userCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
+		
+		CourseGroupManager cgm = userCourseEnv.getCourseEnvironment().getCourseGroupManager();
+		entry = cgm.getCourseEntry();
 
 		addLoggingResourceable(LoggingResourceable.wrap(courseNode));
 
 		mainVC = createVelocityContainer("dialog");		
 
 		UserSession usess = ureq.getUserSession();
-		isOlatAdmin = usess.getRoles().isOLATAdmin();
-		isGuestOnly = usess.getRoles().isGuestOnly();
+		Roles roles = usess.getRoles();
+		isGuestOnly = roles.isGuestOnly();
+
+		boolean isAdministrator = (roles.isAdministrator() || roles.isLearnResourceManager()) && repositoryService.hasRoleExpanded(getIdentity(), entry,
+						OrganisationRoles.administrator.name(), OrganisationRoles.learnresourcemanager.name());
 		subsContext = isGuestOnly ? null : CourseModule.createSubscriptionContext(userCourseEnv.getCourseEnvironment(), courseNode);
 		forumCallback = userCourseEnv.isCourseReadOnly() ?
-				new ReadOnlyDialogNodeForumCallback(nodeEvaluation, isOlatAdmin, isGuestOnly, subsContext) :
-				new DialogNodeForumCallback(nodeEvaluation, isOlatAdmin, isGuestOnly, subsContext);
+				new ReadOnlyDialogNodeForumCallback(nodeEvaluation, isAdministrator, isGuestOnly, subsContext) :
+				new DialogNodeForumCallback(nodeEvaluation, isAdministrator, isGuestOnly, subsContext);
 		
 		if (subsContext != null) {
 			String businessPath = "[RepositoryEntry:" +entry.getKey() + "][CourseNode:" + courseNode.getIdent() + "]";
@@ -144,10 +151,9 @@ public class DialogCourseNodeRunController extends BasicController implements Ac
 		
 		backButton = LinkFactory.createLinkBack(mainVC, this);
 		
-		if (!userCourseEnv.isCourseReadOnly()
-			&& (isOlatAdmin
-					|| repositoryManager.isOwnerOfRepositoryEntry(getIdentity(), entry)
-					|| userCourseEnv.getCourseEnvironment().getCourseGroupManager().hasRight(getIdentity(), CourseRights.RIGHT_COURSEEDITOR))) {
+		if (!userCourseEnv.isCourseReadOnly() && (isAdministrator
+					|| cgm.isIdentityCourseAdministrator(getIdentity())
+					|| cgm.hasRight(getIdentity(), CourseRights.RIGHT_COURSEEDITOR))) {
 			copyButton = LinkFactory.createButton("dialog.copy.file", mainVC, this);
 		}
 		
diff --git a/src/main/java/org/olat/course/nodes/feed/FeedNodeSecurityCallback.java b/src/main/java/org/olat/course/nodes/feed/FeedNodeSecurityCallback.java
index 018e9896159..71c31582fd7 100644
--- a/src/main/java/org/olat/course/nodes/feed/FeedNodeSecurityCallback.java
+++ b/src/main/java/org/olat/course/nodes/feed/FeedNodeSecurityCallback.java
@@ -35,57 +35,45 @@ import org.olat.modules.webFeed.FeedSecurityCallback;
 public class FeedNodeSecurityCallback implements FeedSecurityCallback {
 
 	private NodeEvaluation ne;
-	private boolean isOlatAdmin;
+	private boolean isAdministrator;
 	private boolean isGuestOnly;
 	private boolean isOwner;
 	private SubscriptionContext subsContext;
 
-	public FeedNodeSecurityCallback(NodeEvaluation ne, boolean isOlatAdmin, boolean isOwner, boolean isGuestOnly) {
+	public FeedNodeSecurityCallback(NodeEvaluation ne, boolean isAdministrator, boolean isOwner, boolean isGuestOnly) {
 		this.ne = ne;
-		this.isOlatAdmin = isOlatAdmin;
+		this.isAdministrator = isAdministrator;
 		this.isGuestOnly = isGuestOnly;
 		this.isOwner = isOwner;
 	}
-
-	/**
-	 * @see org.olat.modules.webFeed.FeedSecurityCallback#mayEditMetadata()
-	 */
+	
 	@Override
 	public boolean mayEditMetadata() {
 		if (isGuestOnly) return false;
-		return ne.isCapabilityAccessible("moderator") || isOlatAdmin;
+		return ne.isCapabilityAccessible("moderator") || isAdministrator;
 	}
 
-	/**
-	 * @see org.olat.modules.webFeed.FeedSecurityCallback#mayCreateItems()
-	 */
 	@Override
 	public boolean mayCreateItems() {
 		if (isGuestOnly) return false;
-		return ne.isCapabilityAccessible("poster") || ne.isCapabilityAccessible("moderator") || isOlatAdmin;
+		return ne.isCapabilityAccessible("poster") || ne.isCapabilityAccessible("moderator") || isAdministrator;
 	}
 
-	/**
-	 * @see org.olat.modules.webFeed.FeedSecurityCallback#mayDeleteItems()
-	 */
 	@Override
 	public boolean mayDeleteItems() {
 		if (isGuestOnly) return false;
-		return ne.isCapabilityAccessible("moderator") || isOlatAdmin;
+		return ne.isCapabilityAccessible("moderator") || isAdministrator;
 	}
 
 	@Override
 	public boolean mayDeleteOwnItems() {
 		return true;
 	}
-	
-	/**
-	 * @see org.olat.modules.webFeed.FeedSecurityCallback#mayEditItems()
-	 */
+
 	@Override
 	public boolean mayEditItems() {
 		if (isGuestOnly) return false;
-		return ne.isCapabilityAccessible("moderator") || isOlatAdmin;
+		return ne.isCapabilityAccessible("moderator") || isAdministrator;
 	}
 
 	@Override
@@ -93,12 +81,9 @@ public class FeedNodeSecurityCallback implements FeedSecurityCallback {
 		return true;
 	}
 
-	/**
-	 * @see org.olat.modules.webFeed.FeedSecurityCallback#mayViewAllDrafts()
-	 */
 	@Override
 	public boolean mayViewAllDrafts() {
-		return isOwner || isOlatAdmin;
+		return isOwner || isAdministrator;
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/feed/FeedPeekviewController.java b/src/main/java/org/olat/course/nodes/feed/FeedPeekviewController.java
index c843eaaa077..c72a15c316e 100644
--- a/src/main/java/org/olat/course/nodes/feed/FeedPeekviewController.java
+++ b/src/main/java/org/olat/course/nodes/feed/FeedPeekviewController.java
@@ -42,8 +42,6 @@ import org.olat.modules.webFeed.Item;
 import org.olat.modules.webFeed.manager.FeedManager;
 import org.olat.modules.webFeed.ui.FeedUIFactory;
 import org.olat.resource.OLATResource;
-import org.olat.user.UserManager;
-import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * <h3>Description:</h3> The feed peekview controller displays the configurable
@@ -61,9 +59,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 public class FeedPeekviewController extends BasicController implements Controller {
 	// the current course node id
 	private final String nodeId;
-	
-	@Autowired
-	private UserManager userManager;
 
 	/**
 	 * Constructor for the feed peekview controller
@@ -92,7 +87,6 @@ public class FeedPeekviewController extends BasicController implements Controlle
 		} else {
 			peekviewVC.contextPut("wrapperCssClass", wrapperCssClass != null ? wrapperCssClass : "");
 			// add gui helper
-			String authorFullname = userManager.getUserDisplayName(feed.getAuthor());
 			FeedViewHelper helper = new FeedViewHelper(feed, getIdentity(), getTranslator(), courseId, nodeId);
 			peekviewVC.contextPut("helper", helper);
 			// add items, only as many as configured
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTAAssessmentDetailsController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTAAssessmentDetailsController.java
index 4951be9f10a..298f3752ce9 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTAAssessmentDetailsController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTAAssessmentDetailsController.java
@@ -33,8 +33,8 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.gui.control.generic.messages.MessageUIFactory;
 import org.olat.core.id.Identity;
-import org.olat.core.id.Roles;
 import org.olat.course.assessment.ui.tool.AssessmentFormCallback;
+import org.olat.course.groupsandrights.CourseGroupManager;
 import org.olat.course.nodes.GTACourseNode;
 import org.olat.course.nodes.gta.GTAManager;
 import org.olat.course.nodes.gta.GTAType;
@@ -44,7 +44,6 @@ import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.group.BusinessGroup;
 import org.olat.modules.ModuleConfiguration;
 import org.olat.repository.RepositoryEntry;
-import org.olat.repository.RepositoryManager;
 import org.olat.repository.RepositoryService;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -71,8 +70,6 @@ public class GTAAssessmentDetailsController extends BasicController implements A
 	private GTAManager gtaManager;
 	@Autowired
 	private RepositoryService repositoryService;
-	@Autowired
-	private RepositoryManager repositoryManager;
 	
 	public GTAAssessmentDetailsController(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment coachCourseEnv, UserCourseEnvironment assessedUserCourseEnv, GTACourseNode gtaNode) {
@@ -89,18 +86,18 @@ public class GTAAssessmentDetailsController extends BasicController implements A
 		ModuleConfiguration config = gtaNode.getModuleConfiguration();
 		if(GTAType.group.name().equals(config.getStringValue(GTACourseNode.GTASK_TYPE))) {
 			List<BusinessGroup> participatingGroups = gtaManager.getParticipatingBusinessGroups(assessedIdentity, gtaNode);
-			//filters by coaching habilities
+			//filters by coaching abilities
 			if(participatingGroups.size() > 1) {
 				String msg = translate("error.duplicate.coaching");
 				mainVC.contextPut("multipleGroupsWarning", msg);
 			}
 			
-			Roles roles = ureq.getUserSession().getRoles();
-			RepositoryEntry courseRe = courseEnv.getCourseGroupManager().getCourseEntry();
-			if(!roles.isOLATAdmin() && !repositoryManager.isLearnResourceManagerFor(roles, courseRe)) {
+			CourseGroupManager cgm = courseEnv.getCourseGroupManager();
+			if(!cgm.isIdentityCourseAdministrator(getIdentity())) {
+				RepositoryEntry courseRe = cgm.getCourseEntry();
 				List<String> reRoles = repositoryService.getRoles(getIdentity(), courseRe);
 				if(reRoles.contains(GroupRoles.owner.name())) {
-					//view all groups;
+					//view all groups
 				} else if(reRoles.contains(GroupRoles.coach.name())) {
 					List<BusinessGroup> coachedGroups = gtaManager.getCoachedBusinessGroups(getIdentity(), gtaNode);
 					participatingGroups.retainAll(coachedGroups);
diff --git a/src/main/java/org/olat/course/nodes/info/InfoRunController.java b/src/main/java/org/olat/course/nodes/info/InfoRunController.java
index 2d6a585ef09..a13c5ed76f3 100644
--- a/src/main/java/org/olat/course/nodes/info/InfoRunController.java
+++ b/src/main/java/org/olat/course/nodes/info/InfoRunController.java
@@ -45,7 +45,6 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
-import org.olat.core.id.Roles;
 import org.olat.core.util.UserSession;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.course.CourseFactory;
@@ -56,7 +55,6 @@ import org.olat.course.nodes.InfoCourseNode;
 import org.olat.course.run.userview.NodeEvaluation;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.modules.ModuleConfiguration;
-import org.olat.repository.RepositoryManager;
 import org.springframework.beans.factory.annotation.Autowired;
 
 /**
@@ -76,8 +74,6 @@ public class InfoRunController extends BasicController {
 	
 	private final String businessPath;
 	
-	@Autowired
-	private RepositoryManager repositoryManager;
 	@Autowired
 	private InfoSubscriptionManager subscriptionManager;
 
@@ -108,18 +104,14 @@ public class InfoRunController extends BasicController {
 			subscriptionController = new ContextualSubscriptionController(ureq, getWindowControl(), subContext, pdata);
 			listenTo(subscriptionController);
 		}
-		boolean canAdd, canAdmin;
+		boolean canAdd;
+		boolean canAdmin;
 		if(userCourseEnv.isCourseReadOnly()) {
 			canAdd = false;
 			canAdmin = false;
 		} else {
 			Identity identity = getIdentity();
-			Roles roles = usess.getRoles();
-		
-			boolean isAdmin = roles.isOLATAdmin()
-					|| cgm.isIdentityCourseAdministrator(identity)
-					|| repositoryManager.isLearnResourceManagerFor(roles, cgm.getCourseEntry());
-			
+			boolean isAdmin = cgm.isIdentityCourseAdministrator(identity);
 			canAdd = isAdmin || ne.isCapabilityAccessible(InfoCourseNode.EDIT_CONDITION_ID);
 			canAdmin = isAdmin || ne.isCapabilityAccessible(InfoCourseNode.ADMIN_CONDITION_ID);
 		}
@@ -155,7 +147,7 @@ public class InfoRunController extends BasicController {
 		if (url.startsWith("ROOT")) {
 			url = url.substring(4, url.length());
 		}
-		List<String> tokens = new ArrayList<String>();
+		List<String> tokens = new ArrayList<>();
 		for(StringTokenizer tokenizer = new StringTokenizer(url, "[]"); tokenizer.hasMoreTokens(); ) {
 			String token = tokenizer.nextToken();
 			if(token.startsWith("Identity")) {
diff --git a/src/main/java/org/olat/course/nodes/iq/IQConfigurationController.java b/src/main/java/org/olat/course/nodes/iq/IQConfigurationController.java
index 53f994f1558..40215684edd 100644
--- a/src/main/java/org/olat/course/nodes/iq/IQConfigurationController.java
+++ b/src/main/java/org/olat/course/nodes/iq/IQConfigurationController.java
@@ -25,6 +25,8 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
+import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.fullWebApp.LayoutMain3ColsController;
 import org.olat.core.gui.UserRequest;
@@ -40,7 +42,6 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
 import org.olat.core.id.Identity;
-import org.olat.core.id.Roles;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.coordinate.LockResult;
@@ -74,6 +75,7 @@ import org.olat.modules.iq.IQManager;
 import org.olat.modules.iq.IQPreviewSecurityCallback;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
+import org.olat.repository.RepositoryService;
 import org.olat.repository.controllers.ReferencableEntriesSearchController;
 import org.olat.user.UserManager;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -120,6 +122,8 @@ public class IQConfigurationController extends BasicController {
 	private QTI21Service qti21service;
 	@Autowired
 	private RepositoryManager repositoryManager;
+	@Autowired
+	private RepositoryService repositoryService;
 
 	/**
 	 * 
@@ -157,14 +161,9 @@ public class IQConfigurationController extends BasicController {
 			myContent.contextPut(VC_CHOSENTEST, displayName);
 			myContent.contextPut("dontRenderRepositoryButton", new Boolean(true));
 			// Put values to velocity container
-
-			boolean isOnyx = OnyxModule.isOnyxTest(re.getOlatResource());
-			if(isOnyx) {
-				//
-			} else if (isEditable(ureq.getIdentity(), ureq.getUserSession().getRoles(), re)) {
+			if (isEditable(re)) {
 				editTestButton = LinkFactory.createButtonSmall("command.editRepFile", myContent, this);
 			}
-
 			previewLink = LinkFactory.createCustomLink("command.preview.link", "command.preview", displayName, Link.NONTRANSLATED, myContent, this);
 			previewLink.setIconLeftCSS("o_icon o_icon-fw o_icon_preview");
 			previewLink.setCustomEnabledLinkCSS("o_preview");
@@ -249,15 +248,14 @@ public class IQConfigurationController extends BasicController {
 	 * @param repository entry
 	 * @return
 	 */
-	private boolean isEditable(Identity identity, Roles roles, RepositoryEntry re) {
+	private boolean isEditable(RepositoryEntry re) {
 		boolean isOnyx = OnyxModule.isOnyxTest(re.getOlatResource());
 		if (isOnyx) {
 			return false;
 		}
-
-		return roles.isOLATAdmin()
-				|| repositoryManager.isOwnerOfRepositoryEntry(identity, re)
-				|| repositoryManager.isLearnResourceManagerFor(roles, re);
+		return repositoryService.hasRoleExpanded(getIdentity(), re,
+				OrganisationRoles.administrator.name(), OrganisationRoles.learnresourcemanager.name(),
+				GroupRoles.owner.name());
 	}
 
 	@Override
@@ -621,12 +619,12 @@ public class IQConfigurationController extends BasicController {
 					moduleConfiguration.set(IQEditController.CONFIG_KEY_TYPE_QTI, IQEditController.CONFIG_VALUE_QTI2);
 				} else if(ImsQTI21Resource.TYPE_NAME.equals(re.getOlatResource().getResourceableTypeName())) {
 					moduleConfiguration.set(IQEditController.CONFIG_KEY_TYPE_QTI, IQEditController.CONFIG_VALUE_QTI21);
-					if (isEditable(urequest.getIdentity(), urequest.getUserSession().getRoles(), re)) {
+					if (isEditable(re)) {
 						editTestButton = LinkFactory.createButtonSmall("command.editRepFile", myContent, this);
 					}
 				} else {
 					moduleConfiguration.set(IQEditController.CONFIG_KEY_TYPE_QTI, IQEditController.CONFIG_VALUE_QTI1);
-					if (isEditable(urequest.getIdentity(), urequest.getUserSession().getRoles(), re)) {
+					if (isEditable(re)) {
 						editTestButton = LinkFactory.createButtonSmall("command.editRepFile", myContent, this);
 					}
 				}
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/GroupController.java b/src/main/java/org/olat/course/nodes/projectbroker/GroupController.java
index 09cf42af97f..cd608dd1bfb 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/GroupController.java
+++ b/src/main/java/org/olat/course/nodes/projectbroker/GroupController.java
@@ -367,7 +367,7 @@ public class GroupController extends BasicController {
 						showError("msg.selectionempty");
 						return;
 					}
-					toAdd = new ArrayList<Identity>();
+					toAdd = new ArrayList<>();
 					toAdd.add(choosenIdentity);
 				} else if (event instanceof MultiIdentityChosenEvent) {
 					MultiIdentityChosenEvent multiEvent = (MultiIdentityChosenEvent) event;
@@ -389,7 +389,7 @@ public class GroupController extends BasicController {
 					}
 				} else if (toAdd.size() > 1) {
 					//check if already in group
-					List<Identity> alreadyInGroup = new ArrayList<Identity>();
+					List<Identity> alreadyInGroup = new ArrayList<>();
 					for (int i = 0; i < toAdd.size(); i++) {
 						if (groupDao.hasRole(group, toAdd.get(i), role)) {
 							tableCtr.setMultiSelectSelectedAt(i, false);
@@ -551,7 +551,9 @@ public class GroupController extends BasicController {
 				MailBundle ccBundle = mailManager.makeMailBundle(context, ureq.getIdentity(), mailTemplate, sender, metaId, result);
 				result.append(mailManager.sendMessage(ccBundle));
 			}
-			MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getUserSession().getRoles().isOLATAdmin(), ureq.getLocale());
+			Roles roles = ureq.getUserSession().getRoles();
+			boolean detailedErrorOutput = roles.isAdministrator() || roles.isSystemAdmin();
+			MailHelper.printErrorsAndWarnings(result, getWindowControl(), detailedErrorOutput, ureq.getLocale());
 		}
 	}
 
@@ -598,13 +600,16 @@ public class GroupController extends BasicController {
 				MailBundle ccBundle = mailManager.makeMailBundle(context, ureq.getIdentity(), mailTemplate, sender, metaId, result);
 				result.append(mailManager.sendMessage(ccBundle));
 			}
-			MailHelper.appendErrorsAndWarnings(result, errorMessage, infoMessage, ureq.getUserSession().getRoles().isOLATAdmin(), ureq.getLocale());
+			Roles roles = ureq.getUserSession().getRoles();
+			boolean detailedErrorOutput = roles.isAdministrator() || roles.isSystemAdmin();
+			MailHelper.appendErrorsAndWarnings(result, errorMessage, infoMessage, detailedErrorOutput, ureq.getLocale());
 		}
 		// report any errors on screen
 		if (infoMessage.length() > 0) getWindowControl().setWarning(infoMessage.toString());
 		if (errorMessage.length() > 0) getWindowControl().setError(errorMessage.toString());
 	}
 
+	@Override
 	protected void doDispose() {
     // DialogBoxController and TableController get disposed by BasicController
 		// usc, userToGroupWizardCtr, addUserMailCtr, and removeUserMailCtr are registerd with listenTo and get disposed in BasicController
@@ -665,10 +670,10 @@ public class GroupController extends BasicController {
 	public void reloadData() {
 		// refresh view		
 		List<GroupMembership> combo = groupDao.getMemberships(group, role);
-		List<GroupMemberView> views = new ArrayList<GroupMemberView>(combo.size());
-		Map<Long,GroupMemberView> idToViews = new HashMap<Long,GroupMemberView>();
+		List<GroupMemberView> views = new ArrayList<>(combo.size());
+		Map<Long,GroupMemberView> idToViews = new HashMap<>();
 
-		Set<Long> loadStatus = new HashSet<Long>();
+		Set<Long> loadStatus = new HashSet<>();
 		for(GroupMembership co:combo) {
 			Identity identity = co.getIdentity();
 			Date addedAt = co.getCreationDate();
@@ -688,7 +693,7 @@ public class GroupController extends BasicController {
 		}
 		
 		if(loadStatus.size() > 0) {
-			List<Long> statusToLoadList = new ArrayList<Long>(loadStatus);
+			List<Long> statusToLoadList = new ArrayList<>(loadStatus);
 			Map<Long,String> statusMap = imService.getBuddyStatus(statusToLoadList);
 			for(Long toLoad:statusToLoadList) {
 				String status = statusMap.get(toLoad);
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/ProjectGroupController.java b/src/main/java/org/olat/course/nodes/projectbroker/ProjectGroupController.java
index 67606cd21cd..40b6d689fa5 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/ProjectGroupController.java
+++ b/src/main/java/org/olat/course/nodes/projectbroker/ProjectGroupController.java
@@ -42,6 +42,7 @@ import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.core.logging.activity.ActionType;
 import org.olat.core.util.mail.MailBundle;
 import org.olat.core.util.mail.MailContext;
@@ -189,7 +190,10 @@ public class ProjectGroupController extends BasicController {
 					MailBundle ccBundle = mailManager.makeMailBundle(context, urequest.getIdentity(), mailTemplate, null, metaId, result);
 					result.append(mailManager.sendMessage(ccBundle));
 				}
-				MailHelper.printErrorsAndWarnings(result, getWindowControl(), urequest.getUserSession().getRoles().isOLATAdmin(), urequest.getLocale());
+				
+				Roles roles = urequest.getUserSession().getRoles();
+				boolean detailedErrorOutput = roles.isAdministrator() || roles.isSystemAdmin();
+				MailHelper.printErrorsAndWarnings(result, getWindowControl(), detailedErrorOutput, urequest.getLocale());
 			}
 			fireEvent(urequest, Event.CHANGED_EVENT );		
 			// Participant and waiting-list were changed => reload both
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/ProjectListController.java b/src/main/java/org/olat/course/nodes/projectbroker/ProjectListController.java
index 73f25bfe725..c781f68db7d 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/ProjectListController.java
+++ b/src/main/java/org/olat/course/nodes/projectbroker/ProjectListController.java
@@ -154,9 +154,8 @@ public class ProjectListController extends BasicController implements GenericEve
 		contentVC.contextPut("infoProjectBrokerRunMode", infoProjectBrokerRunMode);
 		mainPanel = new SimpleStackedPanel("projectlist_panel");
 		CoursePropertyManager cpm = userCourseEnv.getCourseEnvironment().getCoursePropertyManager();
-		if (  (projectGroupManager.isAccountManager(ureq.getIdentity(), cpm, courseNode ) && !previewMode)
-				|| userCourseEnv.getCourseEnvironment().getCourseGroupManager().isIdentityCourseAdministrator(ureq.getIdentity())
-				|| ureq.getUserSession().getRoles().isOLATAdmin()) {
+		if ((projectGroupManager.isAccountManager(ureq.getIdentity(), cpm, courseNode ) && !previewMode)
+				|| userCourseEnv.getCourseEnvironment().getCourseGroupManager().isIdentityCourseAdministrator(ureq.getIdentity())) {
 			contentVC.contextPut("isAccountManager", true);
 			createNewProjectButton = LinkFactory.createButtonSmall("create.new.project.button", contentVC, this);
 			createNewProjectButton.setIconLeftCSS("o_icon o_icon_add");
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectGroupManagerImpl.java b/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectGroupManagerImpl.java
index cb1bf835320..c0d38ac0237 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectGroupManagerImpl.java
+++ b/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectGroupManagerImpl.java
@@ -345,8 +345,7 @@ public class ProjectGroupManagerImpl implements ProjectGroupManager {
 
 	@Override
 	public boolean isProjectManagerOrAdministrator(UserRequest ureq, CourseEnvironment courseEnv, Project project) {	
-		return ureq.getUserSession().getRoles().isOLATAdmin()
-				|| isProjectManager(ureq.getIdentity(), project)
+		return isProjectManager(ureq.getIdentity(), project)
 				|| courseEnv.getCourseGroupManager().isIdentityCourseAdministrator(ureq.getIdentity());
 	}
 
diff --git a/src/main/java/org/olat/course/nodes/sp/SPRunController.java b/src/main/java/org/olat/course/nodes/sp/SPRunController.java
index e4628356985..9d02ff49d38 100644
--- a/src/main/java/org/olat/course/nodes/sp/SPRunController.java
+++ b/src/main/java/org/olat/course/nodes/sp/SPRunController.java
@@ -47,7 +47,6 @@ import org.olat.core.gui.control.generic.clone.CloneableController;
 import org.olat.core.gui.control.generic.dtabs.Activateable2;
 import org.olat.core.gui.control.generic.iframe.DeliveryOptions;
 import org.olat.core.id.OLATResourceable;
-import org.olat.core.id.Roles;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.StateEntry;
 import org.olat.core.logging.AssertException;
@@ -62,9 +61,7 @@ import org.olat.course.nodes.TitledWrapperHelper;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.course.tree.CourseInternalLinkTreeModel;
 import org.olat.modules.ModuleConfiguration;
-import org.olat.repository.RepositoryManager;
 import org.olat.util.logging.activity.LoggingResourceable;
-import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * Description:<br>
@@ -94,9 +91,6 @@ public class SPRunController extends BasicController implements Activateable2 {
 	private final UserCourseEnvironment userCourseEnv;
 	
 	private static final String[] EDITABLE_TYPES = new String[] { "html", "htm", "xml", "xhtml" };
-
-	@Autowired
-	private RepositoryManager repositoryManager;
 	
 	/**
 	 * Constructor for single page run controller 
@@ -142,22 +136,11 @@ public class SPRunController extends BasicController implements Activateable2 {
 		}
 		
 		if(isFileTypeEditable(fileName)) {
-			Roles roles = ureq.getUserSession().getRoles();
-			if(roles.isOLATAdmin()) {
-				return true;
-			}
-
 			CourseGroupManager cgm = userCourseEnv.getCourseEnvironment().getCourseGroupManager();
-			if(roles.isLearnResourceManager() &&
-				repositoryManager.isLearnResourceManagerFor(roles, cgm.getCourseEntry())) {
-				return true;
-			}
-			if(config.getBooleanSafe(SPEditController.CONFIG_KEY_ALLOW_COACH_EDIT, false)
-					&& cgm.isIdentityCourseCoach(ureq.getIdentity())) {
-				return true;
-			}
-			return cgm.isIdentityCourseAdministrator(getIdentity())
+			return config.getBooleanSafe(SPEditController.CONFIG_KEY_ALLOW_COACH_EDIT, false) && cgm.isIdentityCourseCoach(ureq.getIdentity())
+					|| cgm.isIdentityCourseAdministrator(getIdentity())
 					|| cgm.hasRight(getIdentity(), CourseRights.RIGHT_COURSEEDITOR);
+
 		}
 		return false;
 	}
diff --git a/src/main/java/org/olat/course/nodes/ta/TACourseNodeEditController.java b/src/main/java/org/olat/course/nodes/ta/TACourseNodeEditController.java
index ca479809cbc..a498e6a49d2 100644
--- a/src/main/java/org/olat/course/nodes/ta/TACourseNodeEditController.java
+++ b/src/main/java/org/olat/course/nodes/ta/TACourseNodeEditController.java
@@ -55,6 +55,7 @@ import org.olat.core.gui.render.velocity.VelocityHelper;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.helpers.Settings;
 import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.core.id.UserConstants;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
@@ -542,7 +543,10 @@ public class TACourseNodeEditController extends ActivateableTabbableDefaultContr
 				MailBundle ccBundle = mailManager.makeMailBundle(context, sender, mailTemplate, sender, metaId, result);
 				result.append(mailManager.sendMessage(ccBundle));
 			}
-			MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getUserSession().getRoles().isOLATAdmin(), ureq.getLocale());
+			
+			Roles roles = ureq.getUserSession().getRoles();
+			boolean detailedErrorOutput = roles.isAdministrator() || roles.isSystemAdmin();
+			MailHelper.printErrorsAndWarnings(result, getWindowControl(), detailedErrorOutput, ureq.getLocale());
 		}
 	}
 	
diff --git a/src/main/java/org/olat/course/nodes/wiki/WikiEditController.java b/src/main/java/org/olat/course/nodes/wiki/WikiEditController.java
index f655533f187..3f2ac3d52a4 100644
--- a/src/main/java/org/olat/course/nodes/wiki/WikiEditController.java
+++ b/src/main/java/org/olat/course/nodes/wiki/WikiEditController.java
@@ -26,6 +26,8 @@
 package org.olat.course.nodes.wiki;
 
 import org.olat.NewControllerFactory;
+import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.core.commons.services.notifications.SubscriptionContext;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
@@ -40,7 +42,7 @@ import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
 import org.olat.core.gui.control.generic.tabbable.ActivateableTabbableDefaultController;
-import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.core.logging.AssertException;
 import org.olat.core.util.StringHelper;
 import org.olat.course.ICourse;
@@ -60,7 +62,9 @@ import org.olat.modules.wiki.WikiSecurityCallback;
 import org.olat.modules.wiki.WikiSecurityCallbackImpl;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
+import org.olat.repository.RepositoryService;
 import org.olat.repository.controllers.ReferencableEntriesSearchController;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * Description: <BR/>Edit controller for single page course nodes <P/> Initial
@@ -95,6 +99,9 @@ public class WikiEditController extends ActivateableTabbableDefaultController im
 	private VelocityContainer editAccessVc;
 	private ConditionEditController editCondContr;
 	private ICourse course;
+	
+	@Autowired
+	private RepositoryService repositoryService;
 
 	/**
 	 * Constructor for wiki page editor controller
@@ -166,37 +173,13 @@ public class WikiEditController extends ActivateableTabbableDefaultController im
 		main.setContent(content);
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.components.Component,
-	 *      org.olat.core.gui.control.Event)
-	 */
+	@Override
 	public void event(UserRequest ureq, Component source, Event event) {
-			if (source == previewLink) {				
-			// Preview as modal dialogue only if the config is valid		
-				RepositoryEntry re = getWikiRepoReference(moduleConfiguration, false);
-			if (re == null) { // we cannot preview it, because the repository entry
-				// had been deleted between the time when it was
-				// chosen here, and now				
-				this.showError("error.repoentrymissing");
-			} else {
-				// File cpRoot =
-				// FileResourceManager.getInstance().unzipFileResource(re.getOlatResource());
-				Identity ident = ureq.getIdentity();
-				boolean isOlatAdmin = ureq.getUserSession().getRoles().isOLATAdmin();
-				boolean isResourceOwner = RepositoryManager.getInstance().isOwnerOfRepositoryEntry(ident, re);
-				CourseEnvironment cenv = course.getCourseEnvironment();
-				SubscriptionContext subsContext = WikiManager.createTechnicalSubscriptionContextForCourse(cenv, wikiCourseNode);
-				WikiSecurityCallback callback = new WikiSecurityCallbackImpl(null, isOlatAdmin, false, false, isResourceOwner,subsContext);
-				wikiCtr = WikiManager.getInstance().createWikiMainController(ureq, getWindowControl(), re.getOlatResource(), callback, null);
-				cmcWikiCtr = new CloseableModalController(getWindowControl(), translate("command.close"), wikiCtr.getInitialComponent());				
-				this.listenTo(cmcWikiCtr);
-				cmcWikiCtr.activate();
-			}
+		if (source == previewLink) {				
+			doPreview(ureq);
 		} else if (source == chooseButton || source == changeButton) {
-			searchController = new ReferencableEntriesSearchController(getWindowControl(), ureq,
-					WikiResource.TYPE_NAME, translate("command.choose"));			
-			this.listenTo(searchController);
+			searchController = new ReferencableEntriesSearchController(getWindowControl(), ureq, WikiResource.TYPE_NAME, translate("command.choose"));			
+			listenTo(searchController);
 			cmcSearchController = new CloseableModalController(getWindowControl(), translate("close"), searchController.getInitialComponent(), true, translate("command.create"));
 			cmcSearchController.activate();			
 		}  else if (source == editLink) {
@@ -210,10 +193,7 @@ public class WikiEditController extends ActivateableTabbableDefaultController im
 		}
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event)
-	 */
+	@Override
 	public void event(UserRequest urequest, Controller source, Event event) {
 		if (source == searchController) {
 			cmcSearchController.deactivate();
@@ -254,19 +234,39 @@ public class WikiEditController extends ActivateableTabbableDefaultController im
 			}
 		} 
 	}
+	
+	private void doPreview(UserRequest ureq) {
+		// Preview as modal dialogue only if the config is valid		
+		RepositoryEntry re = getWikiRepoReference(moduleConfiguration, false);
+		if (re == null) { // we cannot preview it, because the repository entry
+			// had been deleted between the time when it was
+			// chosen here, and now				
+			showError("error.repoentrymissing");
+		} else {
+			Roles roles = ureq.getUserSession().getRoles();
+			boolean isAdministrator = (roles.isAdministrator() || roles.isLearnResourceManager())
+					&& repositoryService.hasRoleExpanded(getIdentity(), re,
+							OrganisationRoles.administrator.name(), OrganisationRoles.learnresourcemanager.name());
+			boolean isResourceOwner = repositoryService.hasRole(getIdentity(), re, GroupRoles.owner.name());
+			
+			CourseEnvironment cenv = course.getCourseEnvironment();
+			SubscriptionContext subsContext = WikiManager.createTechnicalSubscriptionContextForCourse(cenv, wikiCourseNode);
+			WikiSecurityCallback callback = new WikiSecurityCallbackImpl(null, isAdministrator, false, false, isResourceOwner, subsContext);
+			wikiCtr = WikiManager.getInstance().createWikiMainController(ureq, getWindowControl(), re.getOlatResource(), callback, null);
+			cmcWikiCtr = new CloseableModalController(getWindowControl(), translate("command.close"), wikiCtr.getInitialComponent());				
+			listenTo(cmcWikiCtr);
+			cmcWikiCtr.activate();
+		}
+	}
 
-	/**
-	 * @see org.olat.core.gui.control.generic.tabbable.TabbableController#addTabs(org.olat.core.gui.components.TabbedPane)
-	 */
+	@Override
 	public void addTabs(TabbedPane tabbedPane) {
 		tabs = tabbedPane;
 		tabbedPane.addTab(translate(PANE_TAB_ACCESSIBILITY), editAccessVc);
 		tabbedPane.addTab(translate(PANE_TAB_WIKICONFIG), main);
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
-	 */
+	@Override
 	protected void doDispose() {
     //child controllers registered with listenTo() get disposed in BasicController
 		if (wikiCtr != null) {
@@ -275,16 +275,12 @@ public class WikiEditController extends ActivateableTabbableDefaultController im
 		}		
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.generic.tabbable.ActivateableTabbableDefaultController#getPaneKeys()
-	 */
+	@Override
 	public String[] getPaneKeys() {
 		return paneKeys;
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.generic.tabbable.ActivateableTabbableDefaultController#getTabbedPane()
-	 */
+	@Override
 	public TabbedPane getTabbedPane() {
 		return tabs;
 	}
@@ -302,9 +298,7 @@ public class WikiEditController extends ActivateableTabbableDefaultController im
 		String repoSoftkey = (String) config.get(WikiEditController.CONFIG_KEY_REPOSITORY_SOFTKEY);
 		if (repoSoftkey == null) throw new AssertException("invalid config when being asked for references");
 		RepositoryManager rm = RepositoryManager.getInstance();
-		RepositoryEntry entry = rm.lookupRepositoryEntryBySoftkey(repoSoftkey, strict);
-		// entry can be null only if !strict
-		return entry;
+		return rm.lookupRepositoryEntryBySoftkey(repoSoftkey, strict);
 	}
 
 	/**
@@ -344,9 +338,7 @@ public class WikiEditController extends ActivateableTabbableDefaultController im
 			else return null;
 		}
 		RepositoryManager rm = RepositoryManager.getInstance();
-		RepositoryEntry entry = rm.lookupRepositoryEntryBySoftkey(repoSoftkey, strict);
-		// entry can be null only if !strict
-		return entry;
+		return rm.lookupRepositoryEntryBySoftkey(repoSoftkey, strict);
 	}
 
 	/**
diff --git a/src/main/java/org/olat/course/nodes/wiki/WikiRunController.java b/src/main/java/org/olat/course/nodes/wiki/WikiRunController.java
index 081b0ef643f..fc3ec7dd1d6 100644
--- a/src/main/java/org/olat/course/nodes/wiki/WikiRunController.java
+++ b/src/main/java/org/olat/course/nodes/wiki/WikiRunController.java
@@ -27,6 +27,8 @@ package org.olat.course.nodes.wiki;
 
 import java.util.List;
 
+import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.core.commons.fullWebApp.LayoutMain3ColsController;
 import org.olat.core.commons.fullWebApp.popup.BaseFullWebappPopupLayoutFactory;
 import org.olat.core.commons.services.notifications.SubscriptionContext;
@@ -38,12 +40,12 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
-import org.olat.core.gui.control.creator.ControllerCreator;
 import org.olat.core.gui.control.generic.clone.CloneController;
 import org.olat.core.gui.control.generic.clone.CloneLayoutControllerCreatorCallback;
 import org.olat.core.gui.control.generic.clone.CloneableController;
 import org.olat.core.gui.control.generic.dtabs.Activateable2;
 import org.olat.core.id.OLATResourceable;
+import org.olat.core.id.Roles;
 import org.olat.core.id.context.BusinessControl;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.StateEntry;
@@ -63,8 +65,9 @@ import org.olat.modules.wiki.WikiReadOnlySecurityCallback;
 import org.olat.modules.wiki.WikiSecurityCallback;
 import org.olat.modules.wiki.WikiSecurityCallbackImpl;
 import org.olat.repository.RepositoryEntry;
-import org.olat.repository.RepositoryManager;
+import org.olat.repository.RepositoryService;
 import org.olat.util.logging.activity.LoggingResourceable;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * Description: 
@@ -79,6 +82,8 @@ public class WikiRunController extends BasicController implements Activateable2
 	private ModuleConfiguration config;
 	private CloneController cloneCtr;
 	
+	@Autowired
+	private RepositoryService repositoryService;
 
 	public WikiRunController(WindowControl wControl, UserRequest ureq, WikiCourseNode wikiCourseNode,
 			UserCourseEnvironment userCourseEnv, NodeEvaluation ne) {
@@ -92,14 +97,13 @@ public class WikiRunController extends BasicController implements Activateable2
 		
 		//check role
 		UserSession usess = ureq.getUserSession();
-		boolean isOlatAdmin = usess.getRoles().isOLATAdmin();
+		Roles roles = usess.getRoles();
+		boolean isAdmininstrator = (roles.isAdministrator() || roles.isLearnResourceManager())
+				&& repositoryService.hasRoleExpanded(getIdentity(), re,
+						OrganisationRoles.administrator.name(), OrganisationRoles.learnresourcemanager.name());
 		boolean isGuestOnly = usess.getRoles().isGuestOnly();
-		boolean isResourceOwner = false;
-		if (isOlatAdmin) isResourceOwner = true;
-		else {
-			isResourceOwner = RepositoryManager.getInstance().isOwnerOfRepositoryEntry(ureq.getIdentity(), re);
-		}
-		
+		boolean isResourceOwner = isAdmininstrator || repositoryService.hasRole(getIdentity(), re, GroupRoles.owner.name());
+
 		// Check for jumping to certain wiki page
 		BusinessControl bc = wControl.getBusinessControl();
 		ContextEntry ce = bc.popLauncherContextEntry();
@@ -107,9 +111,9 @@ public class WikiRunController extends BasicController implements Activateable2
 		SubscriptionContext subsContext = WikiManager.createTechnicalSubscriptionContextForCourse(courseEnv, wikiCourseNode);
 		WikiSecurityCallback callback;
 		if(userCourseEnv.isCourseReadOnly()) {
-			callback = new WikiReadOnlySecurityCallback(isGuestOnly, (isOlatAdmin || isResourceOwner));
+			callback = new WikiReadOnlySecurityCallback(isGuestOnly, (isAdmininstrator || isResourceOwner));
 		} else {
-			callback = new WikiSecurityCallbackImpl(ne, isOlatAdmin, isGuestOnly, false, isResourceOwner, subsContext);
+			callback = new WikiSecurityCallbackImpl(ne, isAdmininstrator, isGuestOnly, false, isResourceOwner, subsContext);
 		}
 		
 		if ( ce != null ) { //jump to a certain context
@@ -127,20 +131,15 @@ public class WikiRunController extends BasicController implements Activateable2
 
 		Controller wrappedCtr = TitledWrapperHelper.getWrapper(ureq, wControl, wikiCtr, wikiCourseNode, Wiki.CSS_CLASS_WIKI_ICON);
 		
-		CloneLayoutControllerCreatorCallback clccc = new CloneLayoutControllerCreatorCallback() {
-			public ControllerCreator createLayoutControllerCreator(UserRequest uureq, final ControllerCreator contentControllerCreator) {
-				return BaseFullWebappPopupLayoutFactory.createAuthMinimalPopupLayout(uureq, new ControllerCreator() {
-					@SuppressWarnings("synthetic-access")
-					public Controller createController(UserRequest lureq, WindowControl lwControl) {
-						// wrapp in column layout, popup window needs a layout controller
-						Controller ctr = contentControllerCreator.createController(lureq, lwControl);
-						LayoutMain3ColsController layoutCtr = new LayoutMain3ColsController(lureq, lwControl, ctr);
-						layoutCtr.setCustomCSS(CourseFactory.getCustomCourseCss(lureq.getUserSession(), courseEnv));
-						layoutCtr.addDisposableChildController(ctr);
-						return layoutCtr;
-					}
+		CloneLayoutControllerCreatorCallback clccc = (uureq, contentControllerCreator) -> {
+			return BaseFullWebappPopupLayoutFactory.createAuthMinimalPopupLayout(uureq, (lureq, lwControl)  -> {
+					// wrapp in column layout, popup window needs a layout controller
+					Controller ctr = contentControllerCreator.createController(lureq, lwControl);
+					LayoutMain3ColsController layoutCtr = new LayoutMain3ColsController(lureq, lwControl, ctr);
+					layoutCtr.setCustomCSS(CourseFactory.getCustomCourseCss(lureq.getUserSession(), courseEnv));
+					layoutCtr.addDisposableChildController(ctr);
+					return layoutCtr;
 				});
-			}
 		};
 		
 		if (wrappedCtr instanceof CloneableController) {
@@ -158,24 +157,17 @@ public class WikiRunController extends BasicController implements Activateable2
 		wikiCtr.activate(ureq, entries, state);
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.components.Component, org.olat.core.gui.control.Event)
-	 */
+	@Override
 	public void event(UserRequest ureq, Component source, Event event) {
 		//no events yet
 	}
-	/**
-	 * 
-	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event)
-	 */
+
+	@Override
 	public void event(UserRequest ureq, Controller source, Event event) {
 		//
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
-	 */
+	@Override
 	protected void doDispose() {
 		//
 	}
diff --git a/src/main/java/org/olat/course/run/calendar/CourseCalendarController.java b/src/main/java/org/olat/course/run/calendar/CourseCalendarController.java
index 4c8f6bdcb07..8318e999ffd 100644
--- a/src/main/java/org/olat/course/run/calendar/CourseCalendarController.java
+++ b/src/main/java/org/olat/course/run/calendar/CourseCalendarController.java
@@ -46,13 +46,11 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
-import org.olat.core.id.Roles;
 import org.olat.course.CourseFactory;
 import org.olat.course.ICourse;
 import org.olat.course.groupsandrights.CourseGroupManager;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.group.BusinessGroup;
-import org.olat.repository.RepositoryManager;
 import org.springframework.beans.factory.annotation.Autowired;
 
 public class CourseCalendarController extends BasicController {
@@ -60,12 +58,9 @@ public class CourseCalendarController extends BasicController {
 	private CalendarController calendarController;
 	
 	private final UserCourseEnvironment userCourseEnv;
-	private KalendarRenderWrapper courseKalendarWrapper;
 
 	@Autowired
 	private CalendarManager calendarManager;
-	@Autowired
-	private  RepositoryManager repositoryManager;
 	
 	public CourseCalendarController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv) {
 		super(ureq, wControl);
@@ -91,12 +86,9 @@ public class CourseCalendarController extends BasicController {
 		List<KalendarRenderWrapper> calendars = new ArrayList<>();
 		// add course calendar
 		ICourse course = CourseFactory.loadCourse(userCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseEntry());
-		courseKalendarWrapper = calendarManager.getCourseCalendar(course);
+		KalendarRenderWrapper courseKalendarWrapper = calendarManager.getCourseCalendar(course);
 		CourseGroupManager cgm = course.getCourseEnvironment().getCourseGroupManager();
-		
-		Roles roles = ureq.getUserSession().getRoles();
-		boolean isPrivileged = !userCourseEnv.isCourseReadOnly() && (roles.isOLATAdmin() || userCourseEnv.isAdmin()
-				|| repositoryManager.isLearnResourceManagerFor(roles, cgm.getCourseEntry()));
+		boolean isPrivileged = isPrivileged(cgm);
 		if (isPrivileged) {
 			courseKalendarWrapper.setAccess(KalendarRenderWrapper.ACCESS_READ_WRITE);
 			courseKalendarWrapper.setPrivateEventsVisible(true);
@@ -129,6 +121,11 @@ public class CourseCalendarController extends BasicController {
 		return calendars;
 	}
 	
+	private boolean isPrivileged(CourseGroupManager cgm) {
+		return !userCourseEnv.isCourseReadOnly()
+				&& (userCourseEnv.isAdmin() || cgm.isIdentityCourseAdministrator(getIdentity()));
+	}
+	
 	private void addCalendars(List<BusinessGroup> groups, boolean isOwner, LinkProvider linkProvider,
 			List<KalendarRenderWrapper> calendars) {
 		CollaborationToolsFactory collabFactory = CollaborationToolsFactory.getInstance();
diff --git a/src/main/java/org/olat/course/run/preview/PreviewConfigController.java b/src/main/java/org/olat/course/run/preview/PreviewConfigController.java
index bac9a3bdc7b..db03de299ba 100644
--- a/src/main/java/org/olat/course/run/preview/PreviewConfigController.java
+++ b/src/main/java/org/olat/course/run/preview/PreviewConfigController.java
@@ -73,13 +73,6 @@ public class PreviewConfigController extends MainLayoutBasicController {
 
 	private IdentityEnvironment simIdentEnv;
 	private CourseEnvironment simCourseEnv;
-	/*
-	 * default role is student
-	 */
-	private boolean isGlobalAuthor = false;
-	private boolean isGuestOnly = false;
-	private boolean isCoach = false;
-	private boolean isCourseAdmin = false;
 	private String role = PreviewSettingsForm.ROLE_STUDENT;
 	private LayoutMain3ColsController previewLayoutCtr;
 	private final OLATResourceable ores;
@@ -113,21 +106,14 @@ public class PreviewConfigController extends MainLayoutBasicController {
 		listenTo(previewLayoutCtr); // for later auto disposal
 		StackedPanel initialPanel = putInitialPanel(new SimpleStackedPanel("coursePreviewPanel", "o_edit_mode"));
 		initialPanel.setContent(previewLayoutCtr.getInitialComponent());
-
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.components.Component, org.olat.core.gui.control.Event)
-	 */
+	@Override
 	public void event(UserRequest ureq, Component source, Event event) {
 		//
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event)
-	 */
+	@Override
 	public void event(UserRequest ureq, Controller source, Event event) {
 		if (source == prc && event.getCommand().equals("command.config")) {
 			// use config form in preview controller
@@ -153,33 +139,30 @@ public class PreviewConfigController extends MainLayoutBasicController {
 		List<BGArea> tmpAreas = areaManager.loadAreas(psf.getAreaKeys());
 		List<BusinessGroup> groups = businessGroupService.loadBusinessGroups(psf.getGroupKeys());
 		// get learning areas for groups
-		Set<BGArea> areas = new HashSet<BGArea>();
+		Set<BGArea> areas = new HashSet<>();
 		areas.addAll(tmpAreas);
 		List<BGArea> areaByGroups = areaManager.findBGAreasOfBusinessGroups(groups);
 		areas.addAll(areaByGroups);
 		
 		role = psf.getRole();
 		ICourse course = CourseFactory.loadCourse(ores);
+		
 		// default is student
-		isGlobalAuthor = false;
-		isGuestOnly = false;
-		isCoach = false;
-		isCourseAdmin = false;
-		/*
-		 * if (role.equals(PreviewSettingsForm.ROLE_STUDENT)) { } else
-		 */
+		boolean isCoach = false;
+		boolean isCourseAdmin = false;
+		Roles previewRoles = Roles.userRoles();
 		if (role.equals(PreviewSettingsForm.ROLE_GUEST)) {
-			isGuestOnly = true;
+			previewRoles = Roles.guestRoles();
 		} else if (role.equals(PreviewSettingsForm.ROLE_COURSECOACH)) {
 			isCoach = true;
 		} else if (role.equals(PreviewSettingsForm.ROLE_COURSEADMIN)) {
 			isCourseAdmin = true;
 		} else if (role.equals(PreviewSettingsForm.ROLE_GLOBALAUTHOR)) {
-			isGlobalAuthor = true;
+			previewRoles = Roles.authorRoles();
 		}
 		
 		final RepositoryEntry courseResource = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
-		final CourseGroupManager cgm = new PreviewCourseGroupManager(courseResource, new ArrayList<BusinessGroup>(groups), new ArrayList<BGArea>(areas), isCoach, isCourseAdmin);
+		final CourseGroupManager cgm = new PreviewCourseGroupManager(courseResource, new ArrayList<BusinessGroup>(groups), new ArrayList<>(areas), isCoach, isCourseAdmin);
 		final UserNodeAuditManager auditman = new PreviewAuditManager();
 		final AssessmentManager am = new PreviewAssessmentManager();
 		final CoursePropertyManager cpm = new PreviewCoursePropertyManager();
@@ -190,16 +173,16 @@ public class PreviewConfigController extends MainLayoutBasicController {
 		simCourseEnv = new PreviewCourseEnvironment(title, runStructure, psf.getDate(), course.getCourseFolderContainer(), course
 				.getCourseBaseContainer(),course.getResourceableId(), cpm, cgm, auditman, am, courseConfig);
 		simIdentEnv = new IdentityEnvironment();
-		simIdentEnv.setRoles(new Roles(false, false, false, isGlobalAuthor, isGuestOnly, false, false));
+		
+		
+		simIdentEnv.setRoles(previewRoles);
 		final Identity ident = new PreviewIdentity();
 		simIdentEnv.setIdentity(ident);
 		//identity must be set before attributes OLAT-4811
 		simIdentEnv.setAttributes(psf.getAttributesMap());
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
-	 */
+	@Override
 	protected void doDispose() {
 		//
 	}
diff --git a/src/main/java/org/olat/course/run/preview/PreviewCourseGroupManager.java b/src/main/java/org/olat/course/run/preview/PreviewCourseGroupManager.java
index ef13fa6ab7f..31560dfa94b 100644
--- a/src/main/java/org/olat/course/run/preview/PreviewCourseGroupManager.java
+++ b/src/main/java/org/olat/course/run/preview/PreviewCourseGroupManager.java
@@ -35,7 +35,6 @@ import org.olat.basesecurity.IdentityRef;
 import org.olat.basesecurity.OrganisationRoles;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.id.Identity;
-import org.olat.core.id.Roles;
 import org.olat.core.logging.AssertException;
 import org.olat.core.manager.BasicManager;
 import org.olat.course.export.CourseEnvironmentMapper;
@@ -179,11 +178,6 @@ final class PreviewCourseGroupManager extends BasicManager implements CourseGrou
 	public boolean isIdentityAnyCourseAdministrator(Identity identity) {
 		return isCourseAdmin;
 	}
-	
-	@Override
-	public boolean isIdentityCourseLearnResourceManager(Identity identity, Roles roles) {
-		return false;
-	}
 
 	@Override
 	public boolean isIdentityAnyCourseParticipant(Identity identity) {
diff --git a/src/main/java/org/olat/course/run/userview/UserCourseEnvironmentImpl.java b/src/main/java/org/olat/course/run/userview/UserCourseEnvironmentImpl.java
index 34dad58ad8f..6cfceadf6f2 100644
--- a/src/main/java/org/olat/course/run/userview/UserCourseEnvironmentImpl.java
+++ b/src/main/java/org/olat/course/run/userview/UserCourseEnvironmentImpl.java
@@ -189,9 +189,8 @@ public class UserCourseEnvironmentImpl implements UserCourseEnvironment {
 		}
 
 		CourseGroupManager cgm = courseEnvironment.getCourseGroupManager();
-		boolean adminLazy = identityEnvironment.getRoles().isOLATAdmin()
-				|| (identityEnvironment.getRoles().isLearnResourceManager()
-						&& cgm.isIdentityCourseLearnResourceManager(identityEnvironment.getIdentity(), identityEnvironment.getRoles()))
+		boolean adminLazy = identityEnvironment.getRoles().isAdministrator()
+				|| identityEnvironment.getRoles().isLearnResourceManager()
 				|| cgm.isIdentityAnyCourseAdministrator(identityEnvironment.getIdentity());
 		adminAnyCourse = Boolean.valueOf(adminLazy);
 		return adminLazy;
@@ -266,7 +265,7 @@ public class UserCourseEnvironmentImpl implements UserCourseEnvironment {
 	
 	@Override
 	public boolean isCourseReadOnly() {
-		return courseReadOnly == null ? false : courseReadOnly.booleanValue();
+		return courseReadOnly != null && courseReadOnly.booleanValue();
 	}
 	
 	public void setCourseReadOnly(Boolean courseReadOnly) {
diff --git a/src/main/java/org/olat/group/BusinessGroupContextEntryControllerCreator.java b/src/main/java/org/olat/group/BusinessGroupContextEntryControllerCreator.java
index d51d5cdf181..fb1ecbedd40 100644
--- a/src/main/java/org/olat/group/BusinessGroupContextEntryControllerCreator.java
+++ b/src/main/java/org/olat/group/BusinessGroupContextEntryControllerCreator.java
@@ -70,9 +70,6 @@ public class BusinessGroupContextEntryControllerCreator extends DefaultContextEn
 		return ctrl;
 	}
 
-	/**
-	 * @see org.olat.core.id.context.ContextEntryControllerCreator#getTabName(org.olat.core.id.context.ContextEntry)
-	 */
 	@Override
 	public String getTabName(ContextEntry ce, UserRequest ureq) {
 		BusinessGroup bgroup = getBusinessGroup(ce);
@@ -101,7 +98,7 @@ public class BusinessGroupContextEntryControllerCreator extends DefaultContextEn
 			UserSession usess = ureq.getUserSession();
 			Object wildcard = usess.getEntry("wild_card_" + bgroup.getKey());
 			authorized = (wildcard != null && Boolean.TRUE.equals(wildcard))
-				|| usess.getRoles().isOLATAdmin()
+				|| usess.getRoles().isAdministrator()
 				|| usess.getRoles().isGroupManager() 
 				|| CoreSpringFactory.getImpl(BusinessGroupService.class).isIdentityInBusinessGroup(ureq.getIdentity(), bgroup)  
 				|| isAccessControlled(bgroup);
diff --git a/src/main/java/org/olat/group/BusinessGroupModule.java b/src/main/java/org/olat/group/BusinessGroupModule.java
index 95d27f3c852..03755306ad9 100644
--- a/src/main/java/org/olat/group/BusinessGroupModule.java
+++ b/src/main/java/org/olat/group/BusinessGroupModule.java
@@ -20,6 +20,8 @@
 package org.olat.group;
 
 import org.olat.NewControllerFactory;
+import org.olat.basesecurity.BaseSecurityModule;
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.core.configuration.AbstractSpringModule;
 import org.olat.core.id.Roles;
 import org.olat.core.id.context.SiteContextEntryControllerCreator;
@@ -43,7 +45,7 @@ import org.springframework.stereotype.Service;
 @Service("businessGroupModule")
 public class BusinessGroupModule extends AbstractSpringModule {
 
-	public static String ORES_TYPE_GROUP = OresHelper.calculateTypeName(BusinessGroup.class);
+	public static final String ORES_TYPE_GROUP = OresHelper.calculateTypeName(BusinessGroup.class);
 	
 	private static final String USER_ALLOW_CREATE_BG = "user.allowed.create";
 	private static final String AUTHOR_ALLOW_CREATE_BG = "author.allowed.create";
@@ -57,14 +59,32 @@ public class BusinessGroupModule extends AbstractSpringModule {
 	private static final String MANDATORY_ENROLMENT_EMAIL_USERS = "mandatoryEnrolmentEmailForUsers";
 	private static final String MANDATORY_ENROLMENT_EMAIL_AUTHORS = "mandatoryEnrolmentEmailForAuthors";
 	private static final String MANDATORY_ENROLMENT_EMAIL_USERMANAGERS = "mandatoryEnrolmentEmailForUsermanagers";
+	private static final String MANDATORY_ENROLMENT_EMAIL_ROLESMANAGERS = "mandatoryEnrolmentEmailForRolesmanagers";
 	private static final String MANDATORY_ENROLMENT_EMAIL_GROUPMANAGERS = "mandatoryEnrolmentEmailForGroupmanagers";
+	private static final String MANDATORY_ENROLMENT_EMAIL_LEARNRESOURCEMANAGERS = "mandatoryEnrolmentEmailForLearnresourcemanagers";
+	private static final String MANDATORY_ENROLMENT_EMAIL_POOLMANAGERS = "mandatoryEnrolmentEmailForPoolmanagers";
+	private static final String MANDATORY_ENROLMENT_EMAIL_CURRICULUMMANAGERS = "mandatoryEnrolmentEmailForCurriculummanagers";
+	private static final String MANDATORY_ENROLMENT_EMAIL_LECTUREMANAGERS = "mandatoryEnrolmentEmailForLecturemanagers";
+	private static final String MANDATORY_ENROLMENT_EMAIL_QUALITYMANAGERS = "mandatoryEnrolmentEmailForQualitymanagers";
+	private static final String MANDATORY_ENROLMENT_EMAIL_LINEMANAGERS = "mandatoryEnrolmentEmailForLinemanagers";
+	private static final String MANDATORY_ENROLMENT_EMAIL_PRINCIPALS = "mandatoryEnrolmentEmailForPrincipals";
 	private static final String MANDATORY_ENROLMENT_EMAIL_ADMINISTRATORS = "mandatoryEnrolmentEmailForAdministrators";
+	private static final String MANDATORY_ENROLMENT_EMAIL_SYSTEMADMINS = "mandatoryEnrolmentEmailForSystemAdmins";
 
 	private static final String ACCEPT_MEMBERSHIP_USERS = "acceptMembershipForUsers";
 	private static final String ACCEPT_MEMBERSHIP_AUTHORS = "acceptMembershipForAuthors";
 	private static final String ACCEPT_MEMBERSHIP_USERMANAGERS = "acceptMembershipForUsermanagers";
+	private static final String ACCEPT_MEMBERSHIP_ROLESMANAGERS = "acceptMembershipForRolesmanagers";
 	private static final String ACCEPT_MEMBERSHIP_GROUPMANAGERS = "acceptMembershipForGroupmanagers";
+	private static final String ACCEPT_MEMBERSHIP_LEARNRESOURCEMANAGERS = "acceptMembershipForLearnresourcemanagers";
+	private static final String ACCEPT_MEMBERSHIP_POOLMANAGERS = "acceptMembershipForPoolmanagers";
+	private static final String ACCEPT_MEMBERSHIP_CURRICULUMMANAGERS = "acceptMembershipForCurriculummanagers";
+	private static final String ACCEPT_MEMBERSHIP_LECTUREMANAGERS = "acceptMembershipForLecturemanagers";
+	private static final String ACCEPT_MEMBERSHIP_QUALITYMANAGERS = "acceptMembershipForQualitymanagers";
+	private static final String ACCEPT_MEMBERSHIP_LINEMANAGERS = "acceptMembershipForLinemanagers";
+	private static final String ACCEPT_MEMBERSHIP_PRINCIPALS = "acceptMembershipForPrincipals";
 	private static final String ACCEPT_MEMBERSHIP_ADMINISTRATORS = "acceptMembershipForAdministrators";
+	private static final String ACCEPT_MEMBERSHIP_SYSTEMADMINS = "acceptMembershipForSystemAdmins";
 	
 	private static final String ALLOW_LEAVING_GROUP_BY_LEARNERS = "allowLeavingGroupCreatedByLearners";
 	private static final String ALLOW_LEAVING_GROUP_BY_AUTHORS = "allowLeavingGroupCreatedByAuthors";
@@ -90,21 +110,57 @@ public class BusinessGroupModule extends AbstractSpringModule {
 	private String mandatoryEnrolmentEmailForAuthors;
 	@Value("${group.mandatory.enrolment.email.usermanagers}")
 	private String mandatoryEnrolmentEmailForUsermanagers;
+	@Value("${group.mandatory.enrolment.email.rolesmanagers}")
+	private String mandatoryEnrolmentEmailForRolesmanagers;
 	@Value("${group.mandatory.enrolment.email.groupmanagers}")
 	private String mandatoryEnrolmentEmailForGroupmanagers;
+	@Value("${group.mandatory.enrolment.email.learnresourcemanagers}")
+	private String mandatoryEnrolmentEmailForLearnresourcemanagers;
+	@Value("${group.mandatory.enrolment.email.poolmanagers}")
+	private String mandatoryEnrolmentEmailForPoolmanagers;
+	@Value("${group.mandatory.enrolment.email.curriculummanagers}")
+	private String mandatoryEnrolmentEmailForCurriculummanagers;
+	@Value("${group.mandatory.enrolment.email.lecturemanagers}")
+	private String mandatoryEnrolmentEmailForLecturemanagers;
+	@Value("${group.mandatory.enrolment.email.qualitymanagers}")
+	private String mandatoryEnrolmentEmailForQualitymanagers;
+	@Value("${group.mandatory.enrolment.email.linemanagers}")
+	private String mandatoryEnrolmentEmailForLinemanagers;
+	@Value("${group.mandatory.enrolment.email.principals}")
+	private String mandatoryEnrolmentEmailForPrincipals;
 	@Value("${group.mandatory.enrolment.email.administrators}")
 	private String mandatoryEnrolmentEmailForAdministrators;
-
+	@Value("${group.mandatory.enrolment.email.systemadmins}")
+	private String mandatoryEnrolmentEmailForSystemAdmins;
+	
 	@Value("${group.accept.membership.users}")
 	private String acceptMembershipForUsers;
 	@Value("${group.accept.membership.authors}")
 	private String acceptMembershipForAuthors;
 	@Value("${group.accept.membership.usermanagers}")
 	private String acceptMembershipForUsermanagers;
+	@Value("${group.accept.membership.rolesmanagers}")
+	private String acceptMembershipForRolesmanagers;
 	@Value("${group.accept.membership.groupmanagers}")
 	private String acceptMembershipForGroupmanagers;
+	@Value("${group.accept.membership.learnresourcemanagers}")
+	private String acceptMembershipForLearnresourcemanagers;
+	@Value("${group.accept.membership.poolmanagers}")
+	private String acceptMembershipForPoolmanagers;
+	@Value("${group.accept.membership.curriculummanagers}")
+	private String acceptMembershipForCurriculummanagers;
+	@Value("${group.accept.membership.lecturemanagers}")
+	private String acceptMembershipForLecturemanagers;
+	@Value("${group.accept.membership.qualitymanagers}")
+	private String acceptMembershipForQualitymanagers;
+	@Value("${group.accept.membership.linemanagers}")
+	private String acceptMembershipForLinemanagers;
+	@Value("${group.accept.membership.principals}")
+	private String acceptMembershipForPrincipals;
 	@Value("${group.accept.membership.administrators}")
 	private String acceptMembershipForAdministrators;
+	@Value("${group.accept.membership.systemadmins}")
+	private String acceptMembershipForSystemAdmins;
 	
 	@Value("${group.leaving.group.created.by.learners:true}")
 	private boolean allowLeavingGroupCreatedByLearners;
@@ -165,47 +221,35 @@ public class BusinessGroupModule extends AbstractSpringModule {
 			userListDownloadDefaultAllowed = "true".equals(downloadAllowed);
 		}
 
-		String enabled = getStringPropertyValue(MANDATORY_ENROLMENT_EMAIL_USERS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			mandatoryEnrolmentEmailForUsers = enabled;
-		}
-		enabled = getStringPropertyValue(MANDATORY_ENROLMENT_EMAIL_AUTHORS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			mandatoryEnrolmentEmailForAuthors = enabled;
-		}
-		enabled = getStringPropertyValue(MANDATORY_ENROLMENT_EMAIL_USERMANAGERS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			mandatoryEnrolmentEmailForUsermanagers = enabled;
-		}
-		enabled = getStringPropertyValue(MANDATORY_ENROLMENT_EMAIL_GROUPMANAGERS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			mandatoryEnrolmentEmailForGroupmanagers = enabled;
-		}
-		enabled = getStringPropertyValue(MANDATORY_ENROLMENT_EMAIL_ADMINISTRATORS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			mandatoryEnrolmentEmailForAdministrators = enabled;
-		}
-
-		enabled = getStringPropertyValue(ACCEPT_MEMBERSHIP_USERS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			acceptMembershipForUsers = enabled;
-		}
-		enabled = getStringPropertyValue(ACCEPT_MEMBERSHIP_AUTHORS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			acceptMembershipForAuthors = enabled;
-		}
-		enabled = getStringPropertyValue(ACCEPT_MEMBERSHIP_USERMANAGERS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			acceptMembershipForUsermanagers = enabled;
-		}
-		enabled = getStringPropertyValue(ACCEPT_MEMBERSHIP_GROUPMANAGERS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			acceptMembershipForGroupmanagers = enabled;
-		}
-		enabled = getStringPropertyValue(ACCEPT_MEMBERSHIP_ADMINISTRATORS, true);
-		if(StringHelper.containsNonWhitespace(enabled)) {
-			acceptMembershipForAdministrators = enabled;
-		}
+		mandatoryEnrolmentEmailForUsers = getStringPropertyValue(MANDATORY_ENROLMENT_EMAIL_USERS, mandatoryEnrolmentEmailForUsers);
+		mandatoryEnrolmentEmailForAuthors = getStringPropertyValue(MANDATORY_ENROLMENT_EMAIL_AUTHORS, mandatoryEnrolmentEmailForAuthors);
+		mandatoryEnrolmentEmailForUsermanagers = getStringPropertyValue(MANDATORY_ENROLMENT_EMAIL_USERMANAGERS, mandatoryEnrolmentEmailForUsermanagers);
+		mandatoryEnrolmentEmailForRolesmanagers = getStringPropertyValue(MANDATORY_ENROLMENT_EMAIL_ROLESMANAGERS, mandatoryEnrolmentEmailForRolesmanagers);
+		mandatoryEnrolmentEmailForGroupmanagers = getStringPropertyValue(MANDATORY_ENROLMENT_EMAIL_GROUPMANAGERS, mandatoryEnrolmentEmailForGroupmanagers);
+		mandatoryEnrolmentEmailForLearnresourcemanagers = getStringPropertyValue(MANDATORY_ENROLMENT_EMAIL_LEARNRESOURCEMANAGERS, mandatoryEnrolmentEmailForLearnresourcemanagers);
+		mandatoryEnrolmentEmailForPoolmanagers = getStringPropertyValue(MANDATORY_ENROLMENT_EMAIL_POOLMANAGERS, mandatoryEnrolmentEmailForPoolmanagers);
+		mandatoryEnrolmentEmailForCurriculummanagers = getStringPropertyValue(MANDATORY_ENROLMENT_EMAIL_CURRICULUMMANAGERS, mandatoryEnrolmentEmailForCurriculummanagers);
+		mandatoryEnrolmentEmailForLecturemanagers = getStringPropertyValue(MANDATORY_ENROLMENT_EMAIL_LECTUREMANAGERS, mandatoryEnrolmentEmailForLecturemanagers);
+		mandatoryEnrolmentEmailForQualitymanagers = getStringPropertyValue(MANDATORY_ENROLMENT_EMAIL_QUALITYMANAGERS, mandatoryEnrolmentEmailForQualitymanagers);
+		mandatoryEnrolmentEmailForLinemanagers = getStringPropertyValue(MANDATORY_ENROLMENT_EMAIL_LINEMANAGERS, mandatoryEnrolmentEmailForLinemanagers);
+		mandatoryEnrolmentEmailForPrincipals = getStringPropertyValue(MANDATORY_ENROLMENT_EMAIL_PRINCIPALS, mandatoryEnrolmentEmailForPrincipals);
+		mandatoryEnrolmentEmailForAdministrators = getStringPropertyValue(MANDATORY_ENROLMENT_EMAIL_ADMINISTRATORS, mandatoryEnrolmentEmailForAdministrators);
+		mandatoryEnrolmentEmailForSystemAdmins = getStringPropertyValue(MANDATORY_ENROLMENT_EMAIL_SYSTEMADMINS, mandatoryEnrolmentEmailForSystemAdmins);
+
+		acceptMembershipForUsers = getStringPropertyValue(ACCEPT_MEMBERSHIP_USERS, acceptMembershipForUsers);
+		acceptMembershipForAuthors = getStringPropertyValue(ACCEPT_MEMBERSHIP_AUTHORS, acceptMembershipForAuthors);
+		acceptMembershipForUsermanagers = getStringPropertyValue(ACCEPT_MEMBERSHIP_USERMANAGERS, acceptMembershipForUsermanagers);
+		acceptMembershipForRolesmanagers = getStringPropertyValue(ACCEPT_MEMBERSHIP_ROLESMANAGERS, acceptMembershipForRolesmanagers);
+		acceptMembershipForGroupmanagers = getStringPropertyValue(ACCEPT_MEMBERSHIP_GROUPMANAGERS, acceptMembershipForGroupmanagers);
+		acceptMembershipForLearnresourcemanagers = getStringPropertyValue(ACCEPT_MEMBERSHIP_LEARNRESOURCEMANAGERS, acceptMembershipForLearnresourcemanagers);
+		acceptMembershipForPoolmanagers = getStringPropertyValue(ACCEPT_MEMBERSHIP_POOLMANAGERS, acceptMembershipForPoolmanagers);
+		acceptMembershipForCurriculummanagers = getStringPropertyValue(ACCEPT_MEMBERSHIP_CURRICULUMMANAGERS, acceptMembershipForCurriculummanagers);
+		acceptMembershipForLecturemanagers = getStringPropertyValue(ACCEPT_MEMBERSHIP_LECTUREMANAGERS, acceptMembershipForLecturemanagers);
+		acceptMembershipForQualitymanagers = getStringPropertyValue(ACCEPT_MEMBERSHIP_QUALITYMANAGERS, acceptMembershipForQualitymanagers);
+		acceptMembershipForLinemanagers = getStringPropertyValue(ACCEPT_MEMBERSHIP_LINEMANAGERS, acceptMembershipForLinemanagers);
+		acceptMembershipForPrincipals = getStringPropertyValue(ACCEPT_MEMBERSHIP_PRINCIPALS, acceptMembershipForPrincipals);
+		acceptMembershipForAdministrators = getStringPropertyValue(ACCEPT_MEMBERSHIP_ADMINISTRATORS, acceptMembershipForAdministrators);
+		acceptMembershipForSystemAdmins = getStringPropertyValue(ACCEPT_MEMBERSHIP_SYSTEMADMINS, acceptMembershipForSystemAdmins);
 		
 		String linkCourseAllowed = getStringPropertyValue(GROUP_MGR_LINK_COURSE_ALLOWED, true);
 		if(StringHelper.containsNonWhitespace(linkCourseAllowed)) {
@@ -275,127 +319,169 @@ public class BusinessGroupModule extends AbstractSpringModule {
 	public void setUserListDownloadDefaultAllowed(boolean userListDownload) {
 		setStringProperty(USER_LIST_DOWNLOAD, Boolean.toString(userListDownload), true);
 	}
-	
+
 	public boolean isMandatoryEnrolmentEmail(Roles roles) {
-		if(roles == null) return true;
-		if(roles.isOLATAdmin()) {
-			return "true".equals(getMandatoryEnrolmentEmailForAdministrators());
-		}
-		if(roles.isGroupManager()) {
-			return "true".equals(getMandatoryEnrolmentEmailForGroupmanagers());
-		}
-		if(roles.isUserManager()) {
-			return "true".equals(getMandatoryEnrolmentEmailForUsermanagers());
-		}
-		if(roles.isAuthor()) {
-			return "true".equals(getMandatoryEnrolmentEmailForAuthors());
-		}
-		if(roles.isInvitee()) {
-			return true;
+		if(roles == null || roles.isGuestOnly() || roles.isInvitee()) return false;
+		
+		boolean allowed = false;
+		for(OrganisationRoles role:BaseSecurityModule.getUserAllowedRoles()) {
+			if(roles.hasRole(role) && Boolean.parseBoolean(getMandatoryEnrolmentEmailFor(role))) {
+				allowed = true;
+				break;
+			}
 		}
-		return "true".equals(getMandatoryEnrolmentEmailForUsers());
-	}
-
-	public String getMandatoryEnrolmentEmailForUsers() {
-		return mandatoryEnrolmentEmailForUsers;
-	}
-
-	public void setMandatoryEnrolmentEmailForUsers(String mandatory) {
-		setStringProperty(MANDATORY_ENROLMENT_EMAIL_USERS, mandatory, true);
-	}
-
-	public String getMandatoryEnrolmentEmailForAuthors() {
-		return mandatoryEnrolmentEmailForAuthors;
+		return allowed;
 	}
-
-	public void setMandatoryEnrolmentEmailForAuthors(String mandatory) {
-		setStringProperty(MANDATORY_ENROLMENT_EMAIL_AUTHORS, mandatory, true);
-	}
-
-	public String getMandatoryEnrolmentEmailForUsermanagers() {
-		return mandatoryEnrolmentEmailForUsermanagers;
-	}
-
-	public void setMandatoryEnrolmentEmailForUsermanagers(String mandatory) {
-		setStringProperty(MANDATORY_ENROLMENT_EMAIL_USERMANAGERS, mandatory, true);
-	}
-
-	public String getMandatoryEnrolmentEmailForGroupmanagers() {
-		return mandatoryEnrolmentEmailForGroupmanagers;
-	}
-
-	public void setMandatoryEnrolmentEmailForGroupmanagers(String mandatory) {
-		setStringProperty(MANDATORY_ENROLMENT_EMAIL_GROUPMANAGERS, mandatory, true);
-	}
-
-	public String getMandatoryEnrolmentEmailForAdministrators() {
-		return mandatoryEnrolmentEmailForAdministrators;
+	
+	public String getMandatoryEnrolmentEmailFor(OrganisationRoles role) {
+		switch(role) {
+			case user: return mandatoryEnrolmentEmailForUsers;
+			case author: return mandatoryEnrolmentEmailForAuthors;
+			case usermanager: return mandatoryEnrolmentEmailForUsermanagers;
+			case rolesmanager: return mandatoryEnrolmentEmailForRolesmanagers;
+			case groupmanager: return mandatoryEnrolmentEmailForGroupmanagers;
+			case learnresourcemanager: return mandatoryEnrolmentEmailForLearnresourcemanagers;
+			case poolmanager: return mandatoryEnrolmentEmailForPoolmanagers;
+			case curriculummanager: return mandatoryEnrolmentEmailForCurriculummanagers;
+			case lecturemanager: return mandatoryEnrolmentEmailForLecturemanagers;
+			case qualitymanager: return mandatoryEnrolmentEmailForQualitymanagers;
+			case linemanager: return mandatoryEnrolmentEmailForLinemanagers;
+			case principal: return mandatoryEnrolmentEmailForPrincipals;
+			case administrator: return mandatoryEnrolmentEmailForAdministrators;
+			case sysadmin: return mandatoryEnrolmentEmailForSystemAdmins;
+			default: return "disabled";
+		}
 	}
-
-	public void setMandatoryEnrolmentEmailForAdministrators(String mandatory) {
-		setStringProperty(MANDATORY_ENROLMENT_EMAIL_ADMINISTRATORS, mandatory, true);
+	
+	public void setMandatoryEnrolmentEmailFor(OrganisationRoles role, String enable) {
+		switch(role) {
+			case user:
+				mandatoryEnrolmentEmailForUsers = setStringProperty(MANDATORY_ENROLMENT_EMAIL_USERS, enable, true);
+				break;
+			case author:
+				mandatoryEnrolmentEmailForAuthors = setStringProperty(MANDATORY_ENROLMENT_EMAIL_AUTHORS, enable, true);
+				break;
+			case usermanager:
+				mandatoryEnrolmentEmailForUsermanagers = setStringProperty(MANDATORY_ENROLMENT_EMAIL_USERMANAGERS, enable, true);
+				break;
+			case rolesmanager:
+				mandatoryEnrolmentEmailForRolesmanagers = setStringProperty(MANDATORY_ENROLMENT_EMAIL_ROLESMANAGERS, enable, true);
+				break;
+			case groupmanager:
+				mandatoryEnrolmentEmailForGroupmanagers = setStringProperty(MANDATORY_ENROLMENT_EMAIL_GROUPMANAGERS, enable, true);
+				break;
+			case learnresourcemanager:
+				mandatoryEnrolmentEmailForLearnresourcemanagers = setStringProperty(MANDATORY_ENROLMENT_EMAIL_LEARNRESOURCEMANAGERS, enable, true);
+				break;
+			case poolmanager:
+				mandatoryEnrolmentEmailForPoolmanagers = setStringProperty(MANDATORY_ENROLMENT_EMAIL_POOLMANAGERS, enable, true);
+				break;
+			case curriculummanager:
+				mandatoryEnrolmentEmailForCurriculummanagers = setStringProperty(MANDATORY_ENROLMENT_EMAIL_CURRICULUMMANAGERS, enable, true);
+				break;
+			case lecturemanager:
+				mandatoryEnrolmentEmailForLecturemanagers = setStringProperty(MANDATORY_ENROLMENT_EMAIL_LECTUREMANAGERS, enable, true);
+				break;
+			case qualitymanager:
+				mandatoryEnrolmentEmailForQualitymanagers = setStringProperty(MANDATORY_ENROLMENT_EMAIL_QUALITYMANAGERS, enable, true);
+				break;
+			case linemanager:
+				mandatoryEnrolmentEmailForLinemanagers = setStringProperty(MANDATORY_ENROLMENT_EMAIL_LINEMANAGERS, enable, true);
+				break;
+			case principal:
+				mandatoryEnrolmentEmailForPrincipals = setStringProperty(MANDATORY_ENROLMENT_EMAIL_PRINCIPALS, enable, true);
+				break;
+			case administrator:
+				mandatoryEnrolmentEmailForAdministrators = setStringProperty(MANDATORY_ENROLMENT_EMAIL_ADMINISTRATORS, enable, true);
+				break;
+			case sysadmin:
+				mandatoryEnrolmentEmailForSystemAdmins = setStringProperty(MANDATORY_ENROLMENT_EMAIL_SYSTEMADMINS, enable, true);
+				break;
+			default: /* Ignore the other roles */
+		}
 	}
 	
 	public boolean isAcceptMembership(Roles roles) {
-		if(roles == null) return true;
-		if(roles.isOLATAdmin()) {
-			return "true".equals(getAcceptMembershipForAdministrators());
-		}
-		if(roles.isGroupManager()) {
-			return "true".equals(getAcceptMembershipForGroupmanagers());
-		}
-		if(roles.isUserManager()) {
-			return "true".equals(getAcceptMembershipForUsermanagers());
-		}
-		if(roles.isAuthor()) {
-			return "true".equals(getAcceptMembershipForAuthors());
-		}
-		if(roles.isInvitee()) {
-			return true;
+		if(roles == null || roles.isGuestOnly() || roles.isInvitee()) return false;
+		
+		boolean allowed = false;
+		for(OrganisationRoles role:BaseSecurityModule.getUserAllowedRoles()) {
+			if(roles.hasRole(role) && Boolean.parseBoolean(getAcceptMembershipFor(role))) {
+				allowed = true;
+				break;
+			}
 		}
-		return "true".equals(getAcceptMembershipForUsers());
+		return allowed;
 	}
-
-	public String getAcceptMembershipForUsers() {
-		return acceptMembershipForUsers;
-	}
-
-	public void setAcceptMembershipForUsers(String mandatory) {
-		setStringProperty(ACCEPT_MEMBERSHIP_USERS, mandatory, true);
-	}
-
-	public String getAcceptMembershipForAuthors() {
-		return acceptMembershipForAuthors;
-	}
-
-	public void setAcceptMembershipForAuthors(String mandatory) {
-		setStringProperty(ACCEPT_MEMBERSHIP_AUTHORS, mandatory, true);
-	}
-
-	public String getAcceptMembershipForUsermanagers() {
-		return acceptMembershipForUsermanagers;
-	}
-
-	public void setAcceptMembershipForUsermanagers(String mandatory) {
-		setStringProperty(ACCEPT_MEMBERSHIP_USERMANAGERS, mandatory, true);
-	}
-
-	public String getAcceptMembershipForGroupmanagers() {
-		return acceptMembershipForGroupmanagers;
-	}
-
-	public void setAcceptMembershipForGroupmanagers(String mandatory) {
-		setStringProperty(ACCEPT_MEMBERSHIP_GROUPMANAGERS, mandatory, true);
-	}
-
-	public String getAcceptMembershipForAdministrators() {
-		return acceptMembershipForAdministrators;
+	
+	public String getAcceptMembershipFor(OrganisationRoles role) {
+		switch(role) {
+			case user: return acceptMembershipForUsers;
+			case author: return acceptMembershipForAuthors;
+			case usermanager: return acceptMembershipForUsermanagers;
+			case rolesmanager: return acceptMembershipForRolesmanagers;
+			case groupmanager: return acceptMembershipForGroupmanagers;
+			case learnresourcemanager: return acceptMembershipForLearnresourcemanagers;
+			case poolmanager: return acceptMembershipForPoolmanagers;
+			case curriculummanager: return acceptMembershipForCurriculummanagers;
+			case lecturemanager: return acceptMembershipForLecturemanagers;
+			case qualitymanager: return acceptMembershipForQualitymanagers;
+			case linemanager: return acceptMembershipForLinemanagers;
+			case principal: return acceptMembershipForPrincipals;
+			case administrator: return acceptMembershipForAdministrators;
+			case sysadmin: return acceptMembershipForSystemAdmins;
+			default: return "disabled";
+		}
 	}
 
-	public void setAcceptMembershipForAdministrators(String mandatory) {
-		setStringProperty(ACCEPT_MEMBERSHIP_ADMINISTRATORS, mandatory, true);
+	public void setAcceptMembershipFor(OrganisationRoles role, String enable) {
+		switch(role) {
+			case user:
+				acceptMembershipForUsers = setStringProperty(ACCEPT_MEMBERSHIP_USERS, enable, true);
+				break;
+			case author:
+				acceptMembershipForAuthors = setStringProperty(ACCEPT_MEMBERSHIP_AUTHORS, enable, true);
+				break;
+			case usermanager:
+				acceptMembershipForUsermanagers = setStringProperty(ACCEPT_MEMBERSHIP_USERMANAGERS, enable, true);
+				break;
+			case rolesmanager:
+				acceptMembershipForRolesmanagers = setStringProperty(ACCEPT_MEMBERSHIP_ROLESMANAGERS, enable, true);
+				break;
+			case groupmanager:
+				acceptMembershipForGroupmanagers = setStringProperty(ACCEPT_MEMBERSHIP_GROUPMANAGERS, enable, true);
+				break;
+			case learnresourcemanager:
+				acceptMembershipForLearnresourcemanagers = setStringProperty(ACCEPT_MEMBERSHIP_LEARNRESOURCEMANAGERS, enable, true);
+				break;
+			case poolmanager:
+				acceptMembershipForPoolmanagers = setStringProperty(ACCEPT_MEMBERSHIP_POOLMANAGERS, enable, true);
+				break;
+			case curriculummanager:
+				acceptMembershipForCurriculummanagers = setStringProperty(ACCEPT_MEMBERSHIP_CURRICULUMMANAGERS, enable, true);
+				break;
+			case lecturemanager:
+				acceptMembershipForLecturemanagers = setStringProperty(ACCEPT_MEMBERSHIP_LECTUREMANAGERS, enable, true);
+				break;
+			case qualitymanager:
+				acceptMembershipForQualitymanagers = setStringProperty(ACCEPT_MEMBERSHIP_QUALITYMANAGERS, enable, true);
+				break;
+			case linemanager:
+				acceptMembershipForLinemanagers = setStringProperty(ACCEPT_MEMBERSHIP_LINEMANAGERS, enable, true);
+				break;
+			case principal:
+				acceptMembershipForPrincipals = setStringProperty(ACCEPT_MEMBERSHIP_PRINCIPALS, enable, true);
+				break;
+			case administrator:
+				acceptMembershipForAdministrators = setStringProperty(ACCEPT_MEMBERSHIP_ADMINISTRATORS, enable, true);
+				break;
+			case sysadmin:
+				acceptMembershipForSystemAdmins = setStringProperty(ACCEPT_MEMBERSHIP_SYSTEMADMINS, enable, true);
+				break;
+			default: /* Ignore the other roles */
+		}
 	}
-
+	
 	public boolean isGroupManagersAllowedToLinkCourses() {
 		return groupManagersAllowedToLinkCourses;
 	}
diff --git a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
index 968de2acac4..267ce815550 100644
--- a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
+++ b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
@@ -1542,7 +1542,7 @@ public class BusinessGroupServiceImpl implements BusinessGroupService {
 	@Override
 	public void dedupMembers(Identity ureqIdentity, boolean coaches, boolean participants, ProgressDelegate delegate) {
 		SearchRepositoryEntryParameters params = new SearchRepositoryEntryParameters();
-		params.setRoles(new Roles(true, false, false, false, false, false, false));
+		params.setRoles(Roles.administratorRoles());
 		params.setResourceTypes(Collections.singletonList("CourseModule"));
 		
 		float ratio = -1.0f;
diff --git a/src/main/java/org/olat/group/manager/MemberViewQueries.java b/src/main/java/org/olat/group/manager/MemberViewQueries.java
index 0b24bcc9d7e..018bc218255 100644
--- a/src/main/java/org/olat/group/manager/MemberViewQueries.java
+++ b/src/main/java/org/olat/group/manager/MemberViewQueries.java
@@ -28,9 +28,12 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import javax.persistence.TypedQuery;
 
+import org.olat.basesecurity.Group;
+import org.olat.basesecurity.GroupMembership;
 import org.olat.basesecurity.GroupRoles;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.commons.persistence.PersistenceHelper;
@@ -38,8 +41,11 @@ import org.olat.core.id.Identity;
 import org.olat.core.util.StringHelper;
 import org.olat.group.BusinessGroup;
 import org.olat.group.model.MemberView;
+import org.olat.group.model.SearchBusinessGroupParams;
 import org.olat.group.ui.main.SearchMembersParams;
 import org.olat.group.ui.main.SearchMembersParams.Origin;
+import org.olat.modules.curriculum.CurriculumElement;
+import org.olat.modules.curriculum.manager.CurriculumElementDAO;
 import org.olat.repository.RepositoryEntry;
 import org.olat.user.propertyhandlers.UserPropertyHandler;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -56,6 +62,10 @@ public class MemberViewQueries {
 	
 	@Autowired
 	private DB dbInstance;
+	@Autowired
+	private BusinessGroupDAO businessGroupDao;
+	@Autowired
+	private CurriculumElementDAO curriculumElementDao;
 	
 	public List<MemberView> getBusinessGroupMembers(BusinessGroup businessGroup, SearchMembersParams params,
 			List<UserPropertyHandler> userPropertyHandlers, Locale locale) {
@@ -114,18 +124,17 @@ public class MemberViewQueries {
 	private Map<Identity,MemberView> getMembersView(RepositoryEntry entry, SearchMembersParams params,
 			List<UserPropertyHandler> userPropertyHandlers, Locale locale) {
 		StringBuilder sb = new StringBuilder();
-		sb.append("select membership.key, membership.role, membership.creationDate, membership.lastModified, ident, relGroup.defaultGroup,")
-		  .append("  grp.key, grp.name, grp.managedFlagsString,")
-		  .append("  curriculumEl.key, curriculumEl.displayName, curriculumEl.managedFlagsString")
+		sb.append("select membership, relGroup.defaultGroup")
 		  .append(" from repositoryentry as v ")
 		  .append(" inner join v.groups as relGroup")
 		  .append(" inner join relGroup.group as baseGroup")
 		  .append(" inner join baseGroup.members as membership")
-		  .append(" inner join membership.identity as ident")
+		  .append(" inner join fetch membership.identity as ident")
 		  .append(" inner join fetch ident.user as identUser")
-		  .append(" left join businessgroup as grp on (grp.baseGroup.key=baseGroup.key)")
-		  .append(" left join curriculumelement as curriculumEl on (curriculumEl.group.key=baseGroup.key)")
-		  .append(" where v.key=:repoEntryKey");
+		  .append(" inner join fetch membership.group as mGroup")
+		  .append(" where v.key=:repoEntryKey and membership.role in ('")
+		  	.append(GroupRoles.participant).append("','").append(GroupRoles.coach).append("','")
+		  	.append(GroupRoles.owner).append("','").append(GroupRoles.waiting).append("')");
 		searchByIdentity(sb, params);
 		
 		TypedQuery<Object[]> query = dbInstance.getCurrentEntityManager()
@@ -133,41 +142,62 @@ public class MemberViewQueries {
 			.setParameter("repoEntryKey", entry.getKey());
 		searchByIdentity(query, params);
 		
+		// lazy load them
+		Map<Group,CurriculumElement> groupToCurriculumElement = null;
+		Map<Group,BusinessGroup> groupToBusinessGroup = null;
+		
 		List<Object[]> rawObjects = query.getResultList();
 		Map<Identity,MemberView> views = new HashMap<>();
-		for(Object[] objects:rawObjects) {
-			int pos = 1;// 0 is the membershipKey
-			String role = (String)objects[pos++];
-			Date creationDate = (Date)objects[pos++];
-			Date lastModified = (Date)objects[pos++];
-			Identity member = (Identity)objects[pos++];
-			MemberView view = views.computeIfAbsent(member, id -> new MemberView(id, userPropertyHandlers, locale, creationDate, lastModified));
-
-			Boolean defaultGroup = (Boolean)objects[pos++];
-
-			Long groupKey = (Long)objects[pos++];
-			String groupName = (String)objects[pos++];
-			String groupManagedflags = (String)objects[pos++];
-
-			Long curriculumElementKey = (Long)objects[pos++];
-			String curriculumElementName = (String)objects[pos++];
-			String curriculumElementManagedFlags = (String)objects[pos++];
-
+		for(Object[] rawObject:rawObjects) {
+			GroupMembership membership = (GroupMembership)rawObject[0];
+			Boolean defaultGroup = (Boolean)rawObject[1];
+			Identity member = membership.getIdentity();
+			
+			MemberView view = views.computeIfAbsent(member, id
+					-> new MemberView(id, userPropertyHandlers, locale, membership.getCreationDate(), membership.getLastModified()));
+			
 			if(defaultGroup != null && defaultGroup.booleanValue()) {
 				view.setRepositoryEntryDisplayName(entry.getDisplayname());
 				view.setManagedFlags(entry.getManagedFlags());
-				view.getMemberShip().setRepositoryEntryRole(role);
-			} else if(groupKey != null) {
-				view.addGroup(new MemberView.BusinessGroupShortImpl(groupKey, groupName, groupManagedflags));
-				view.getMemberShip().setBusinessGroupRole(role);
-			} else if(curriculumElementKey != null) {
-				view.addCurriculumElement(new MemberView.CurriculumElementShortImpl(curriculumElementKey, curriculumElementName, curriculumElementManagedFlags));
-				view.getMemberShip().setCurriculumElementRole(role);
+				view.getMemberShip().setRepositoryEntryRole(membership.getRole());
+			} else {
+				Group group = membership.getGroup();
+				if(groupToBusinessGroup == null) {
+					groupToBusinessGroup = getBusinessGroups(entry);
+				}
+
+				BusinessGroup businessGroup = groupToBusinessGroup.get(group);
+				if(businessGroup != null) {
+					view.addGroup(new MemberView
+							.BusinessGroupShortImpl(businessGroup.getKey(), businessGroup.getName(), businessGroup.getManagedFlagsString()));
+					view.getMemberShip().setBusinessGroupRole(membership.getRole());
+				} else {
+					if(groupToCurriculumElement == null) {
+						groupToCurriculumElement = getCurriculumElements(entry);
+					}
+					CurriculumElement element = groupToCurriculumElement.get(group);
+					if(element != null) {
+						view.addCurriculumElement(new MemberView
+								.CurriculumElementShortImpl(element.getKey(), element.getDisplayName(), element.getManagedFlags()));
+						view.getMemberShip().setCurriculumElementRole(membership.getRole());
+					}
+				}
 			}
 		}
 		return views;
 	}
 	
+	private Map<Group,BusinessGroup> getBusinessGroups(RepositoryEntry entry) {
+		SearchBusinessGroupParams params = new SearchBusinessGroupParams();
+		List<BusinessGroup> groups = businessGroupDao.findBusinessGroups(params, entry, 0, -1);
+		return groups.stream().collect(Collectors.toMap(BusinessGroup::getBaseGroup, grp -> grp));
+	}
+	
+	private Map<Group,CurriculumElement> getCurriculumElements(RepositoryEntry entry) {
+		List<CurriculumElement> elements = curriculumElementDao.loadElements(entry);
+		return elements.stream().collect(Collectors.toMap(CurriculumElement::getGroup, el -> el));
+	}
+	
 	private void getPending(Map<Identity,MemberView> views, RepositoryEntry entry, SearchMembersParams params,
 			List<UserPropertyHandler> userPropertyHandlers, Locale locale) {
 		StringBuilder sb = new StringBuilder();
diff --git a/src/main/java/org/olat/group/model/MemberView.java b/src/main/java/org/olat/group/model/MemberView.java
index 12fd89c36f4..dc46d069dba 100644
--- a/src/main/java/org/olat/group/model/MemberView.java
+++ b/src/main/java/org/olat/group/model/MemberView.java
@@ -196,6 +196,12 @@ public class MemberView extends UserPropertiesRow {
 			this.displayName = displayName;
 			this.managedFlags = CurriculumElementManagedFlag.toEnum(managedFlags);
 		}
+		
+		public CurriculumElementShortImpl(Long key, String displayName, CurriculumElementManagedFlag[] managedFlags) {
+			this.key = key;
+			this.displayName = displayName;
+			this.managedFlags = managedFlags;
+		}
 
 		@Override
 		public Long getKey() {
diff --git a/src/main/java/org/olat/group/ui/BusinessGroupModuleAdminController.java b/src/main/java/org/olat/group/ui/BusinessGroupModuleAdminController.java
index 236f78c94d8..a5537a90cd4 100644
--- a/src/main/java/org/olat/group/ui/BusinessGroupModuleAdminController.java
+++ b/src/main/java/org/olat/group/ui/BusinessGroupModuleAdminController.java
@@ -21,6 +21,8 @@ package org.olat.group.ui;
 
 import java.util.Collection;
 
+import org.olat.basesecurity.BaseSecurityModule;
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.services.taskexecutor.TaskExecutorManager;
 import org.olat.core.gui.UserRequest;
@@ -65,9 +67,6 @@ public class BusinessGroupModuleAdminController extends FormBasicController impl
 	private final BusinessGroupModule module;
 	private final BusinessGroupService businessGroupService;
 	private String[] onKeys = new String[]{"user","author"};
-	private String[] enrollmentKeys = new String[]{
-			"users","authors", "usermanagers", "groupmanagers", "administrators"
-	};
 	private String[] assignKeys = new String[]{"granted"};
 	private String[] allowLeavingKeys = new String[]{
 			"groupMadeByLearners", "groupMadeByAuthors", "groupOverride"
@@ -115,35 +114,33 @@ public class BusinessGroupModuleAdminController extends FormBasicController impl
 		privacyOptionsContainer.setFormTitle(translate("module.privacy.title"));
 		privacyOptionsContainer.setFormDescription(translate("module.privacy.desc"));
 		formLayout.add(privacyOptionsContainer);
-		String[] enrollmentValues = new String[]{
-				translate("enrolment.email.users"),
-				translate("enrolment.email.authors"),
-				translate("enrolment.email.usermanagers"),
-				translate("enrolment.email.groupmanagers"),
-				translate("enrolment.email.administrators")
-		};
+
+		OrganisationRoles[] roles = BaseSecurityModule.getUserAllowedRoles();
+		String[] enrollmentKeys = new String[roles.length];
+		String[] enrollmentValues = new String[roles.length];
+		for(int i=roles.length; i-->0; ) {
+			enrollmentKeys[i] = roles[i].name();
+			enrollmentValues[i] = translate("enrolment.email." + roles[i].name() + "s");
+		}
 		enrolmentEl = uifactory.addCheckboxesVertical("mandatory.enrolment", privacyOptionsContainer, enrollmentKeys, enrollmentValues, 1);
-		enrolmentEl.select("users", "true".equals(module.getMandatoryEnrolmentEmailForUsers()));
-		enrolmentEl.select("authors", "true".equals(module.getMandatoryEnrolmentEmailForAuthors()));
-		enrolmentEl.select("usermanagers", "true".equals(module.getMandatoryEnrolmentEmailForUsermanagers()));
-		enrolmentEl.select("groupmanagers", "true".equals(module.getMandatoryEnrolmentEmailForGroupmanagers()));
-		enrolmentEl.select("administrators", "true".equals(module.getMandatoryEnrolmentEmailForAdministrators()));
+		for(OrganisationRoles adminProp:roles) {
+			if(Boolean.parseBoolean(module.getMandatoryEnrolmentEmailFor(adminProp))) {
+				enrolmentEl.select(adminProp.name(), true);
+			}
+		}
 		enrolmentEl.addActionListener(FormEvent.ONCHANGE);
 		
-		String[] membershipValues = new String[]{
-				translate("enrolment.email.users"),
-				translate("enrolment.email.authors"),
-				translate("enrolment.email.usermanagers"),
-				translate("enrolment.email.groupmanagers"),
-				translate("enrolment.email.administrators")
-		};
+		String[] membershipValues = new String[enrollmentKeys.length];
+		for(int i=roles.length; i-->0; ) {
+			membershipValues[i] = translate("membership." + roles[i].name() + "s");
+		}
 		membershipEl = uifactory.addCheckboxesVertical("mandatory.membership", privacyOptionsContainer, enrollmentKeys, membershipValues, 1);
 		membershipEl.setElementCssClass("o_select_membership_confirmation");
-		membershipEl.select("users", "true".equals(module.getAcceptMembershipForUsers()));
-		membershipEl.select("authors", "true".equals(module.getAcceptMembershipForAuthors()));
-		membershipEl.select("usermanagers", "true".equals(module.getAcceptMembershipForUsermanagers()));
-		membershipEl.select("groupmanagers", "true".equals(module.getAcceptMembershipForGroupmanagers()));
-		membershipEl.select("administrators", "true".equals(module.getAcceptMembershipForAdministrators()));
+		for(OrganisationRoles adminProp:roles) {
+			if(Boolean.parseBoolean(module.getAcceptMembershipFor(adminProp))) {
+				membershipEl.select(adminProp.name(), true);
+			}
+		}
 		membershipEl.addActionListener(FormEvent.ONCHANGE);
 		
 		String[] allowLeavingValues = new String[]{
@@ -230,19 +227,17 @@ public class BusinessGroupModuleAdminController extends FormBasicController impl
 			module.setUserAllowedCreate(allowEl.isSelected(0));
 			module.setAuthorAllowedCreate(allowEl.isSelected(1));
 		} else if(source == membershipEl) {
-			Collection<String> membershipSelectedKeys = membershipEl.getSelectedKeys();
-			module.setAcceptMembershipForUsers(membershipSelectedKeys.contains("users") ? "true" : "false");
-			module.setAcceptMembershipForAuthors(membershipSelectedKeys.contains("authors") ? "true" : "false");
-			module.setAcceptMembershipForUsermanagers(membershipSelectedKeys.contains("usermanagers") ? "true" : "false");
-			module.setAcceptMembershipForGroupmanagers(membershipSelectedKeys.contains("groupmanagers") ? "true" : "false");
-			module.setAcceptMembershipForAdministrators(membershipSelectedKeys.contains("administrators") ? "true" : "false");
+			Collection<String> selectedKeys = membershipEl.getSelectedKeys();
+			OrganisationRoles[] roleArray = BaseSecurityModule.getUserAllowedRoles();
+			for(OrganisationRoles role:roleArray) {
+				module.setAcceptMembershipFor(role, Boolean.toString(selectedKeys.contains(role.name())));
+			}
 		} else if(source == enrolmentEl) {
-			Collection<String> enrolmentSelectedKeys = enrolmentEl.getSelectedKeys();
-			module.setMandatoryEnrolmentEmailForUsers(enrolmentSelectedKeys.contains("users") ? "true" : "false");
-			module.setMandatoryEnrolmentEmailForAuthors(enrolmentSelectedKeys.contains("authors") ? "true" : "false");
-			module.setMandatoryEnrolmentEmailForUsermanagers(enrolmentSelectedKeys.contains("usermanagers") ? "true" : "false");
-			module.setMandatoryEnrolmentEmailForGroupmanagers(enrolmentSelectedKeys.contains("groupmanagers") ? "true" : "false");
-			module.setMandatoryEnrolmentEmailForAdministrators(enrolmentSelectedKeys.contains("administrators") ? "true" : "false");
+			Collection<String> selectedKeys = enrolmentEl.getSelectedKeys();
+			OrganisationRoles[] roleArray = BaseSecurityModule.getUserAllowedRoles();
+			for(OrganisationRoles role:roleArray) {
+				module.setMandatoryEnrolmentEmailFor(role, Boolean.toString(selectedKeys.contains(role.name())));
+			}
 		} else if(source == allowLeavingGroupsEl) {
 			Collection<String> leavingSelectedKeys = allowLeavingGroupsEl.getSelectedKeys();
 			module.setAllowLeavingGroupCreatedByLearners(leavingSelectedKeys.contains("groupMadeByLearners"));
diff --git a/src/main/java/org/olat/group/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/group/ui/_i18n/LocalStrings_de.properties
index b01ee8cf883..9c5bbdd512c 100644
--- a/src/main/java/org/olat/group/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/group/ui/_i18n/LocalStrings_de.properties
@@ -50,9 +50,18 @@ dedup.members=Kursmitglieder bereinigen
 dedup.members.desc=W\u00E4hlen Sie die Schaltfl\u00E4che "$\:dedup.members" um in allen Kursen des Systems die Liste der Kursmitglieder zu bereinigen. Dies ist eine Wartungsfunktion um Duplikate der Kursmitglieder und Gruppenmitglieder des Kurses zu entfernen. 
 dedup.running=Bereinigung l\u00E4uft
 default.context=Automatisch erstellt in Kurs 
-enrolment.email.administrators=Systemadministratoren
+enrolment.email.administrators=Administratoren
 enrolment.email.authors=Kursautoren
+enrolment.email.curriculummanagers=Curriculumverwalter
 enrolment.email.groupmanagers=Gruppenverwalter
+enrolment.email.learnresourcemanagers=Lernressourcenverwalter
+enrolment.email.lecturemanagers=Lektionenblockverwalter
+enrolment.email.linemanagers=Linemanagers
+enrolment.email.qualitymanagers=Quality managers
+enrolment.email.poolmanagers=Poolverwalter
+enrolment.email.principals=Principals
+enrolment.email.rolesmanagers=Rollenverwalter
+enrolment.email.sysadmins=Systemadministratoren
 enrolment.email.usermanagers=Benutzerverwalter
 enrolment.email.users=Lernende
 error.group.name.exists=Dieser Gruppenname wird in diesem Kontext bereits verwendet, w\u00E4hlen Sie einen anderen Namen.
@@ -78,8 +87,17 @@ mandatory.enrolment=E-Mail Benachrichtigung erzwungen bei Einladung durch
 mandatory.membership=Best\u00E4tigung Mitgliedschaft erforderlich bei Einladung durch
 membership.administrators=$\:enrolment.email.administrators
 membership.authors=$\:enrolment.email.authors
+membership.curriculummanagers=$\:enrolment.email.curriculummanagers
 membership.groupmanagers=$\:enrolment.email.groupmanagers
 membership.usermanagers=$\:enrolment.email.usermanagers
+membership.learnresourcemanagers=$\:enrolment.email.learnresourcemanagers
+membership.lecturemanagers=$\:enrolment.email.lecturemanagers
+membership.linemanagers=$\:enrolment.email.linemanagers
+membership.qualitymanagers=$\:enrolment.email.qualitymanagers
+membership.poolmanagers=$\:enrolment.email.poolmanagers
+membership.principals=$\:enrolment.email.principals
+membership.rolesmanagers=$\:enrolment.email.rolesmanagers
+membership.sysadmins=$\:enrolment.email.sysadmins
 membership.users=$\:enrolment.email.users
 menu.allgroups=Alle Gruppen
 menu.allgroups.alt=Alle Gruppen auflisten
diff --git a/src/main/java/org/olat/group/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/group/ui/_i18n/LocalStrings_en.properties
index 7d73544f931..9e8bb3ac8d7 100644
--- a/src/main/java/org/olat/group/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/group/ui/_i18n/LocalStrings_en.properties
@@ -50,10 +50,19 @@ dedup.members=Purge course members
 dedup.members.desc=Select the button "$\:dedup.members" to purge the list of course members in all courses of this system. This is a maintenance function to cleanup duplicate course and group memberships within courses.
 dedup.running=Purging process is running
 default.context=Created automatically in course 
-enrolment.email.administrators=System administrators
+enrolment.email.administrators=Administrators
 enrolment.email.authors=Course authors
+enrolment.email.curriculummanagers=Curriculum managers
 enrolment.email.groupmanagers=Group administrators
 enrolment.email.usermanagers=User managers
+enrolment.email.learnresourcemanagers=Learn ressource manager
+enrolment.email.lecturemanagers=Lectures managers
+enrolment.email.linemanagers=Line managers
+enrolment.email.qualitymanagers=Quality managers
+enrolment.email.poolmanagers=Pool managers
+enrolment.email.principals=Principals
+enrolment.email.rolesmanagers=Roles managers
+enrolment.email.sysadmins=System administrators
 enrolment.email.users=Learner
 error.group.name.exists=This group name is already being used in this context, please select another one.
 fieldset.legend.groupowners=Coaches
@@ -70,7 +79,6 @@ groupsPortlet.no_member=You have been removed from this group as member or your
 groupsPortlet.nogroups=You are not a member of this group
 groupsPortlet.showAll=Show all
 groupsPortlet.title=My groups
-
 leaving.group=Members can leave group
 leaving.group.authors=Allow group exit by members of groups created by authors
 leaving.group.learners=Allow group exit by members of groups created by learners
@@ -79,8 +87,17 @@ mandatory.enrolment=Enforce e-mail notification when invited by
 mandatory.membership=Require accepting of membership when invited by
 membership.administrators=$\:enrolment.email.administrators
 membership.authors=$\:enrolment.email.authors
+membership.curriculummanagers=$\:enrolment.email.curriculummanagers
 membership.groupmanagers=$\:enrolment.email.groupmanagers
 membership.usermanagers=$\:enrolment.email.usermanagers
+membership.learnresourcemanagers=$\:enrolment.email.learnresourcemanagers
+membership.lecturemanagers=$\:enrolment.email.lecturemanagers
+membership.linemanagers=$\:enrolment.email.linemanagers
+membership.qualitymanagers=$\:enrolment.email.qualitymanagers
+membership.poolmanagers=$\:enrolment.email.poolmanagers
+membership.principals=$\:enrolment.email.principals
+membership.rolesmanagers=$\:enrolment.email.rolesmanagers
+membership.sysadmins=$\:enrolment.email.sysadmins
 membership.users=$\:enrolment.email.users
 menu.allgroups=All groups
 menu.allgroups.alt=List all groups
diff --git a/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java b/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java
index 385461a4588..a5a5a6522fb 100644
--- a/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java
+++ b/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java
@@ -186,7 +186,7 @@ public abstract class AbstractBusinessGroupListController extends FormBasicContr
 		setTranslator(Util.createPackageTranslator(AbstractBusinessGroupListController.class, ureq.getLocale(), getTranslator()));
 
 		Roles roles = ureq.getUserSession().getRoles();
-		admin = roles.isOLATAdmin() || roles.isGroupManager();
+		admin = roles.isAdministrator() || roles.isGroupManager();
 		this.readOnly = readOnly;
 		this.showAdminTools = showAdminTools && admin;
 		this.userObject = userObject;
@@ -275,7 +275,7 @@ public abstract class AbstractBusinessGroupListController extends FormBasicContr
 	
 	protected boolean canCreateBusinessGroup(UserRequest ureq) {
 		Roles roles = ureq.getUserSession().getRoles();
-		if(roles.isOLATAdmin() || roles.isGroupManager()
+		if(roles.isAdministrator() || roles.isGroupManager()
 				|| (roles.isAuthor() && groupModule.isAuthorAllowedCreate())
 				|| (!roles.isGuestOnly() && !roles.isInvitee() && groupModule.isUserAllowedCreate())) {
 			return true;
@@ -405,7 +405,6 @@ public abstract class AbstractBusinessGroupListController extends FormBasicContr
 	 */
 	private boolean toogleMark(BusinessGroupRow item) {
 		OLATResourceable bgResource = OresHelper.createOLATResourceableInstance("BusinessGroup", item.getKey());
-		//		item.getBusinessGroup().getResource();
 		if(markManager.isMarked(bgResource, getIdentity(), null)) {
 			markManager.removeMark(bgResource, getIdentity(), null);
 			item.setMarked(false);
@@ -758,7 +757,7 @@ public abstract class AbstractBusinessGroupListController extends FormBasicContr
 		} 
 		
 		Roles roles = ureq.getUserSession().getRoles();
-		boolean isAuthor = roles.isOLATAdmin() || roles.isAuthor() || roles.isLearnResourceManager();
+		boolean isAuthor = roles.isAdministrator() || roles.isAuthor() || roles.isLearnResourceManager();
 
 		Step start = new BGConfigToolsStep(ureq, isAuthor);
 		StepRunnerCallback finish = new StepRunnerCallback() {
@@ -1067,7 +1066,7 @@ public abstract class AbstractBusinessGroupListController extends FormBasicContr
 	
 	protected boolean filterEditableGroupKeys(UserRequest ureq, List<Long> groupKeys) {
 		Roles roles = ureq.getUserSession().getRoles();
-		if(roles.isOLATAdmin() || roles.isGroupManager()) {
+		if(roles.isAdministrator() || roles.isGroupManager()) {
 			return false;
 		}
 		
@@ -1097,7 +1096,7 @@ public abstract class AbstractBusinessGroupListController extends FormBasicContr
 		Roles roles = ureq.getUserSession().getRoles();
 		for(BusinessGroup group:groups) {
 			//check security
-			boolean ow = roles.isOLATAdmin() || roles.isGroupManager()
+			boolean ow = roles.isAdministrator() || roles.isGroupManager()
 					|| businessGroupService.hasRoles(getIdentity(), group, GroupRoles.coach.name());
 
 			if (ow) {
diff --git a/src/main/java/org/olat/group/ui/main/SelectBusinessGroupController.java b/src/main/java/org/olat/group/ui/main/SelectBusinessGroupController.java
index ace53fdf759..fd4dc158df2 100644
--- a/src/main/java/org/olat/group/ui/main/SelectBusinessGroupController.java
+++ b/src/main/java/org/olat/group/ui/main/SelectBusinessGroupController.java
@@ -106,7 +106,7 @@ public class SelectBusinessGroupController extends BasicController {
 	
 	private boolean isAdminSearchAllowed(UserRequest ureq) {
 		Roles roles = ureq.getUserSession().getRoles();
-		return roles.isOLATAdmin() 
+		return roles.isAdministrator() 
 				|| roles.isGroupManager() 
 				|| (roles.isLearnResourceManager() && businessGroupModule.isResourceManagersAllowedToLinkGroups());
 	}
diff --git a/src/main/java/org/olat/ims/qti21/resultexport/QTI21ResultsExportMediaResource.java b/src/main/java/org/olat/ims/qti21/resultexport/QTI21ResultsExportMediaResource.java
index 09a58c0ac3a..f09cc96ae9a 100644
--- a/src/main/java/org/olat/ims/qti21/resultexport/QTI21ResultsExportMediaResource.java
+++ b/src/main/java/org/olat/ims/qti21/resultexport/QTI21ResultsExportMediaResource.java
@@ -120,8 +120,7 @@ public class QTI21ResultsExportMediaResource implements MediaResource {
 		this.courseEnv = courseEnv;
 		
 		ureq = new SyntheticUserRequest(new TransientIdentity(), locale, new UserSession());
-		Roles roles = new Roles(false, false, false, false, false, false, false);
-		ureq.getUserSession().setRoles(roles);
+		ureq.getUserSession().setRoles(Roles.userRoles());
 
 		velocityHelper = VelocityHelper.getInstance();
 		qtiService = CoreSpringFactory.getImpl(QTI21Service.class);
diff --git a/src/main/java/org/olat/ldap/manager/LDAPLoginManagerImpl.java b/src/main/java/org/olat/ldap/manager/LDAPLoginManagerImpl.java
index 7b7b16b376b..ca3f8f768f6 100644
--- a/src/main/java/org/olat/ldap/manager/LDAPLoginManagerImpl.java
+++ b/src/main/java/org/olat/ldap/manager/LDAPLoginManagerImpl.java
@@ -1072,52 +1072,45 @@ public class LDAPLoginManagerImpl implements LDAPLoginManager, GenericEventListe
 			Identity identity = securityManager.loadIdentityByKey(identityRef.getKey());
 			Roles roles = securityManager.getRoles(identity);
 			switch(role) {
-				case coach: {
-					RolesByOrganisation modifiedRoles = RolesByOrganisation.roles(organisation, false, false, true,
-							true, roles.isAuthor(), roles.isGroupManager(), roles.isQPoolManager(), roles.isCurriculumManager(),
-							roles.isUserManager(), roles.isLearnResourceManager(), roles.isOLATAdmin());
-					securityManager.updateRoles(null, identity, modifiedRoles);
-					break;
-				}
 				case author: {
 					RolesByOrganisation modifiedRoles = RolesByOrganisation.roles(organisation, false, false, true,
-							roles.isCoach(), true, roles.isGroupManager(), roles.isQPoolManager(), roles.isCurriculumManager(),
-							roles.isUserManager(), roles.isLearnResourceManager(), roles.isOLATAdmin());
+							true, roles.isGroupManager(), roles.isPoolManager(), roles.isCurriculumManager(),
+							roles.isUserManager(), roles.isLearnResourceManager(), roles.isAdministrator());
 					securityManager.updateRoles(null, identity, modifiedRoles);
 					break;
 				}
 				case usermanager: {
 					RolesByOrganisation modifiedRoles = RolesByOrganisation.roles(organisation, false, false, true,
-							roles.isCoach(), roles.isAuthor(), roles.isGroupManager(), roles.isQPoolManager(), roles.isCurriculumManager(),
-							true, roles.isLearnResourceManager(), roles.isOLATAdmin());
+							roles.isAuthor(), roles.isGroupManager(), roles.isPoolManager(), roles.isCurriculumManager(),
+							true, roles.isLearnResourceManager(), roles.isAdministrator());
 					securityManager.updateRoles(null, identity, modifiedRoles);
 					break;
 				}
 				case groupmanager: {
 					RolesByOrganisation modifiedRoles = RolesByOrganisation.roles(organisation, false, false, true,
-							roles.isCoach(), roles.isAuthor(), true, roles.isQPoolManager(), roles.isCurriculumManager(),
-							roles.isUserManager(), roles.isLearnResourceManager(), roles.isOLATAdmin());
+							roles.isAuthor(), true, roles.isPoolManager(), roles.isCurriculumManager(),
+							roles.isUserManager(), roles.isLearnResourceManager(), roles.isAdministrator());
 					securityManager.updateRoles(null, identity, modifiedRoles);
 					break;
 				}
 				case poolmanager: {
 					RolesByOrganisation modifiedRoles = RolesByOrganisation.roles(organisation, false, false, true,
-							roles.isCoach(), roles.isAuthor(), roles.isGroupManager(), true, roles.isCurriculumManager(),
-							roles.isUserManager(), roles.isLearnResourceManager(), roles.isOLATAdmin());
+							roles.isAuthor(), roles.isGroupManager(), true, roles.isCurriculumManager(),
+							roles.isUserManager(), roles.isLearnResourceManager(), roles.isAdministrator());
 					securityManager.updateRoles(null, identity, modifiedRoles);
 					break;
 				}
 				case curriculummanager: {
 					RolesByOrganisation modifiedRoles = RolesByOrganisation.roles(organisation, false, false, true,
-							roles.isCoach(), roles.isAuthor(), roles.isGroupManager(), roles.isQPoolManager(), true,
-							roles.isUserManager(), roles.isLearnResourceManager(), roles.isOLATAdmin());
+							roles.isAuthor(), roles.isGroupManager(), roles.isPoolManager(), true,
+							roles.isUserManager(), roles.isLearnResourceManager(), roles.isAdministrator());
 					securityManager.updateRoles(null, identity, modifiedRoles);
 					break;
 				}
 				case learnresourcemanager: {
 					RolesByOrganisation modifiedRoles = RolesByOrganisation.roles(organisation, false, false, true,
-							roles.isCoach(), roles.isAuthor(), roles.isGroupManager(), roles.isQPoolManager(), roles.isCurriculumManager(),
-							roles.isUserManager(), true, roles.isOLATAdmin());
+							roles.isAuthor(), roles.isGroupManager(), roles.isPoolManager(), roles.isCurriculumManager(),
+							roles.isUserManager(), true, roles.isAdministrator());
 					securityManager.updateRoles(null, identity, modifiedRoles);
 					break;
 				}
diff --git a/src/main/java/org/olat/login/LoginModule.java b/src/main/java/org/olat/login/LoginModule.java
index 3c3ed041d99..4d9503755e2 100644
--- a/src/main/java/org/olat/login/LoginModule.java
+++ b/src/main/java/org/olat/login/LoginModule.java
@@ -448,7 +448,7 @@ public class LoginModule extends AbstractSpringModule {
 		if(roles.isLearnResourceManager()) {
 			age = getMaxAgeOrDefault(age, passwordMaxAgeLearnResourceManager);
 		}
-		if(roles.isQPoolManager()) {
+		if(roles.isPoolManager()) {
 			age = getMaxAgeOrDefault(age, passwordMaxAgePoolManager);
 		}
 		if(roles.isGroupManager()) {
diff --git a/src/main/java/org/olat/modules/co/ContactFormController.java b/src/main/java/org/olat/modules/co/ContactFormController.java
index 66aab3162bd..cbe70016f90 100644
--- a/src/main/java/org/olat/modules/co/ContactFormController.java
+++ b/src/main/java/org/olat/modules/co/ContactFormController.java
@@ -39,6 +39,7 @@ import org.olat.core.gui.control.generic.messages.MessageUIFactory;
 import org.olat.core.gui.control.generic.modal.DialogBoxController;
 import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
 import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
 import org.olat.core.util.mail.ContactList;
 import org.olat.core.util.mail.ContactMessage;
@@ -283,7 +284,9 @@ public class ContactFormController extends BasicController {
 	private void showError(UserRequest ureq, MailerResult result) {
 		StringBuilder errors = new StringBuilder(1024);
 		StringBuilder warnings = new StringBuilder(1024);
-		MailHelper.appendErrorsAndWarnings(result, errors, warnings, ureq.getUserSession().getRoles().isOLATAdmin(), getLocale());
+		Roles roles = ureq.getUserSession().getRoles();
+		boolean detailedErrorOutput = roles.isAdministrator() || roles.isSystemAdmin();
+		MailHelper.appendErrorsAndWarnings(result, errors, warnings, detailedErrorOutput, getLocale());
 
 		StringBuilder error = new StringBuilder(1024);
 		error.append(translate("error.msg.send.nok"));
diff --git a/src/main/java/org/olat/modules/coach/site/CoachSiteDef.java b/src/main/java/org/olat/modules/coach/site/CoachSiteDef.java
index 54ab5e8aedf..eaa9c4401ab 100644
--- a/src/main/java/org/olat/modules/coach/site/CoachSiteDef.java
+++ b/src/main/java/org/olat/modules/coach/site/CoachSiteDef.java
@@ -47,10 +47,9 @@ public class CoachSiteDef extends AbstractSiteDefinition implements SiteDefiniti
 		UserSession usess = ureq.getUserSession();
 		if(StringHelper.containsNonWhitespace(config.getSecurityCallbackBeanId())
 				|| (!usess.getRoles().isGuestOnly() && !usess.getRoles().isInvitee())) {
-			CoachingService coachingService = CoreSpringFactory.getImpl(CoachingService.class);
-			if(usess.getRoles().isOLATAdmin() 
-					|| usess.getRoles().isUserManager()
-					|| coachingService.isCoach(ureq.getIdentity())) {
+			if(usess.getRoles().isAdministrator() 
+					|| usess.getRoles().isUserManager() || usess.getRoles().isRolesManager()
+					|| CoreSpringFactory.getImpl(CoachingService.class).isCoach(ureq.getIdentity())) {
 				return new CoachSite(this, ureq.getLocale());
 			}
 		}
diff --git a/src/main/java/org/olat/modules/coach/ui/CoachMainController.java b/src/main/java/org/olat/modules/coach/ui/CoachMainController.java
index 902628b94cf..8d80f0dd938 100644
--- a/src/main/java/org/olat/modules/coach/ui/CoachMainController.java
+++ b/src/main/java/org/olat/modules/coach/ui/CoachMainController.java
@@ -216,7 +216,7 @@ public class CoachMainController extends MainLayoutBasicController implements Ac
 		}
 		
 		Roles roles = ureq.getUserSession().getRoles();
-		if(roles.isUserManager() || roles.isOLATAdmin()) {
+		if(roles.isUserManager() || roles.isRolesManager() || roles.isAdministrator()) {
 			GenericTreeNode search = new GenericTreeNode();
 			search.setUserObject("Search");
 			search.setTitle(translate("search.menu.title"));
diff --git a/src/main/java/org/olat/modules/curriculum/CurriculumSecurityCallbackFactory.java b/src/main/java/org/olat/modules/curriculum/CurriculumSecurityCallbackFactory.java
index d6fb2bf6f24..ae586b35130 100644
--- a/src/main/java/org/olat/modules/curriculum/CurriculumSecurityCallbackFactory.java
+++ b/src/main/java/org/olat/modules/curriculum/CurriculumSecurityCallbackFactory.java
@@ -34,7 +34,7 @@ public class CurriculumSecurityCallbackFactory {
 	}
 	
 	public static final CurriculumSecurityCallback createCallback(Roles roles) {
-		boolean admin = roles.isCurriculumManager() || roles.isOLATAdmin();
+		boolean admin = roles.isCurriculumManager() || roles.isAdministrator();
 		return new DefaultCurriculumSecurityCallback(admin);
 	}
 	
diff --git a/src/main/java/org/olat/modules/curriculum/model/CurriculumElementInfos.java b/src/main/java/org/olat/modules/curriculum/model/CurriculumElementInfos.java
index 6e6d4c5e22c..7107954e7e8 100644
--- a/src/main/java/org/olat/modules/curriculum/model/CurriculumElementInfos.java
+++ b/src/main/java/org/olat/modules/curriculum/model/CurriculumElementInfos.java
@@ -1,3 +1,22 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
 package org.olat.modules.curriculum.model;
 
 import org.olat.modules.curriculum.CurriculumElement;
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 e64d3a63cad..805b3388c09 100644
--- a/src/main/java/org/olat/modules/curriculum/site/CurriculumManagerSecurityCallback.java
+++ b/src/main/java/org/olat/modules/curriculum/site/CurriculumManagerSecurityCallback.java
@@ -48,6 +48,6 @@ public class CurriculumManagerSecurityCallback implements SiteSecurityCallback {
 		if (usess.getRoles() == null || roles.isInvitee() || roles.isGuestOnly()) {
 			return false;
 		}
-		return roles.isOLATAdmin() || roles.isCurriculumManager();
+		return roles.isAdministrator() || roles.isCurriculumManager();
 	}
 }
diff --git a/src/main/java/org/olat/modules/lecture/ui/coach/LecturesSearchController.java b/src/main/java/org/olat/modules/lecture/ui/coach/LecturesSearchController.java
index 7249ccc9477..392a6f45edf 100644
--- a/src/main/java/org/olat/modules/lecture/ui/coach/LecturesSearchController.java
+++ b/src/main/java/org/olat/modules/lecture/ui/coach/LecturesSearchController.java
@@ -65,7 +65,8 @@ public class LecturesSearchController extends BasicController implements Activat
 		super(ureq, wControl, Util.createPackageTranslator(LectureRepositoryAdminController.class, ureq.getLocale()));
 		this.stackPanel = stackPanel;
 		Roles roles = ureq.getUserSession().getRoles();
-		admin = (roles.isUserManager() || roles.isOLATAdmin());//TODO roles
+		admin = roles.isUserManager() || roles.isRolesManager()
+				|| roles.isAdministrator() || roles.isLectureManager();//TODO roles
 		
 		searchForm = new LecturesSearchFormController(ureq, getWindowControl(), admin);
 		listenTo(searchForm);
diff --git a/src/main/java/org/olat/modules/qpool/security/QPoolSecurityCallbackFactory.java b/src/main/java/org/olat/modules/qpool/security/QPoolSecurityCallbackFactory.java
index 029527b29f7..f393f6d8401 100644
--- a/src/main/java/org/olat/modules/qpool/security/QPoolSecurityCallbackFactory.java
+++ b/src/main/java/org/olat/modules/qpool/security/QPoolSecurityCallbackFactory.java
@@ -52,8 +52,8 @@ public class QPoolSecurityCallbackFactory {
 		}
 		securityCallback.setQuestionItemView(itemView);
 		securityCallback.setQuestionItemSource(questionItemSource);
-		securityCallback.setAdmin(roles.isOLATAdmin());
-		securityCallback.setPoolAdmin(roles.isQPoolManager());
+		securityCallback.setAdmin(roles.isAdministrator());
+		securityCallback.setPoolAdmin(roles.isPoolManager());
 		return securityCallback;
 	}
 
diff --git a/src/main/java/org/olat/modules/qpool/security/QPoolSecurityCallbackImpl.java b/src/main/java/org/olat/modules/qpool/security/QPoolSecurityCallbackImpl.java
index 2fda40399a3..2f8f37babee 100644
--- a/src/main/java/org/olat/modules/qpool/security/QPoolSecurityCallbackImpl.java
+++ b/src/main/java/org/olat/modules/qpool/security/QPoolSecurityCallbackImpl.java
@@ -45,8 +45,8 @@ public class QPoolSecurityCallbackImpl implements QPoolSecurityCallback {
 
 	@Override
 	public void setRoles(Roles roles) {
-		admin = roles.isOLATAdmin();
-		poolAdmin = roles.isQPoolManager();
+		admin = roles.isAdministrator();
+		poolAdmin = roles.isPoolManager();
 		olatAuthor = roles.isAuthor();
 	}
 
diff --git a/src/main/java/org/olat/modules/qpool/site/AuthorAndPoolPrivateMembersSecurityCallback.java b/src/main/java/org/olat/modules/qpool/site/AuthorAndPoolPrivateMembersSecurityCallback.java
index b39fc747304..2aacf121968 100644
--- a/src/main/java/org/olat/modules/qpool/site/AuthorAndPoolPrivateMembersSecurityCallback.java
+++ b/src/main/java/org/olat/modules/qpool/site/AuthorAndPoolPrivateMembersSecurityCallback.java
@@ -43,9 +43,6 @@ public class AuthorAndPoolPrivateMembersSecurityCallback implements SiteSecurity
 	@Autowired
 	private QuestionPoolModule questionPoolModule;
 
-	/**
-	 * @see com.frentix.olat.coursesite.SiteSecurityCallback#isAllowedToLaunchSite(org.olat.core.gui.UserRequest)
-	 */
 	@Override
 	public boolean isAllowedToLaunchSite(UserRequest ureq) {
 		if (!questionPoolModule.isEnabled() || ureq == null || ureq.getIdentity() == null) {
@@ -59,9 +56,7 @@ public class AuthorAndPoolPrivateMembersSecurityCallback implements SiteSecurity
 		if (roles == null || roles.isInvitee() || roles.isGuestOnly()) {
 			return false;
 		}
-		if (roles.isOLATAdmin() || roles.isQPoolManager() || roles.isAuthor()) {
-			return true;
-		}
-		return qPoolService.isMemberOfPrivatePools(ureq.getIdentity());
+		return roles.isAdministrator() || roles.isPoolManager() || roles.isAuthor()
+				|| qPoolService.isMemberOfPrivatePools(ureq.getIdentity());
 	}
 }
diff --git a/src/main/java/org/olat/modules/qpool/site/PoolPrivateMembersSecurityCallback.java b/src/main/java/org/olat/modules/qpool/site/PoolPrivateMembersSecurityCallback.java
index 79f9deeeff4..b858672e6ce 100644
--- a/src/main/java/org/olat/modules/qpool/site/PoolPrivateMembersSecurityCallback.java
+++ b/src/main/java/org/olat/modules/qpool/site/PoolPrivateMembersSecurityCallback.java
@@ -43,9 +43,6 @@ public class PoolPrivateMembersSecurityCallback implements SiteSecurityCallback
 	@Autowired
 	private QuestionPoolModule questionPoolModule;
 
-	/**
-	 * @see com.frentix.olat.coursesite.SiteSecurityCallback#isAllowedToLaunchSite(org.olat.core.gui.UserRequest)
-	 */
 	@Override
 	public boolean isAllowedToLaunchSite(UserRequest ureq) {
 		if (!questionPoolModule.isEnabled() || ureq == null || ureq.getIdentity() == null) {
@@ -60,9 +57,8 @@ public class PoolPrivateMembersSecurityCallback implements SiteSecurityCallback
 		if(roles == null || roles.isInvitee() || roles.isGuestOnly()) {
 			return false;
 		}
-		if (roles.isOLATAdmin() || roles.isQPoolManager()) {
-			return true;
-		}
-		return qPoolService.isMemberOfPrivatePools(ureq.getIdentity());
+		return roles.isAdministrator()
+				|| roles.isPoolManager()
+				|| qPoolService.isMemberOfPrivatePools(ureq.getIdentity());
 	}
 }
diff --git a/src/main/java/org/olat/modules/qpool/site/PoolTaxonomySecurityCallback.java b/src/main/java/org/olat/modules/qpool/site/PoolTaxonomySecurityCallback.java
index f082915a33d..9eb543de0c2 100644
--- a/src/main/java/org/olat/modules/qpool/site/PoolTaxonomySecurityCallback.java
+++ b/src/main/java/org/olat/modules/qpool/site/PoolTaxonomySecurityCallback.java
@@ -68,7 +68,7 @@ public class PoolTaxonomySecurityCallback implements SiteSecurityCallback {
 		if (roles == null || roles.isInvitee() || roles.isGuestOnly()) {
 			return false;
 		}
-		if (roles.isOLATAdmin() || roles.isQPoolManager()) {
+		if (roles.isAdministrator() || roles.isPoolManager()) {
 			return true;
 		}
 		
diff --git a/src/main/java/org/olat/modules/qpool/site/QuestionPoolSiteDef.java b/src/main/java/org/olat/modules/qpool/site/QuestionPoolSiteDef.java
index 207a004469a..8ed1773ad38 100644
--- a/src/main/java/org/olat/modules/qpool/site/QuestionPoolSiteDef.java
+++ b/src/main/java/org/olat/modules/qpool/site/QuestionPoolSiteDef.java
@@ -49,7 +49,7 @@ public class QuestionPoolSiteDef extends AbstractSiteDefinition implements SiteD
 			return null;
 		}
 		Roles roles = usess.getRoles();
-		if(roles.isOLATAdmin() || roles.isAuthor() || roles.isQPoolManager()) {
+		if(roles.isOLATAdmin() || roles.isAuthor() || roles.isPoolManager()) {
 			return new QuestionPoolSite(this, ureq.getLocale());
 		}
 		return null;
diff --git a/src/main/java/org/olat/modules/qpool/ui/datasource/SharedItemsSource.java b/src/main/java/org/olat/modules/qpool/ui/datasource/SharedItemsSource.java
index 38cda4a62ac..26e87ee6a5b 100644
--- a/src/main/java/org/olat/modules/qpool/ui/datasource/SharedItemsSource.java
+++ b/src/main/java/org/olat/modules/qpool/ui/datasource/SharedItemsSource.java
@@ -101,7 +101,7 @@ public class SharedItemsSource implements QuestionItemsSource {
 
 	@Override
 	public boolean isRemoveEnabled() {
-		return roles.isOLATAdmin() || roles.isQPoolManager() || admin;
+		return roles.isOLATAdmin() || roles.isPoolManager() || admin;
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/modules/vitero/restapi/ViteroBookingWebService.java b/src/main/java/org/olat/modules/vitero/restapi/ViteroBookingWebService.java
index 5fff7c2126b..730b3703144 100644
--- a/src/main/java/org/olat/modules/vitero/restapi/ViteroBookingWebService.java
+++ b/src/main/java/org/olat/modules/vitero/restapi/ViteroBookingWebService.java
@@ -37,6 +37,7 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
 import org.olat.basesecurity.BaseSecurity;
+import org.olat.basesecurity.IdentityPowerSearchQueries;
 import org.olat.basesecurity.SearchIdentityParams;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
@@ -74,6 +75,8 @@ public class ViteroBookingWebService {
 	private ViteroManager viteroManager;
 	@Autowired
 	private BaseSecurity securityManager;
+	@Autowired
+	private IdentityPowerSearchQueries identitySearchQueries;
 	
 	public ViteroBookingWebService(OLATResourceable ores, String subIdentifier) {
 		this.ores = ores;
@@ -228,7 +231,7 @@ public class ViteroBookingWebService {
 			for(String email:currentEmails) {
 				SearchIdentityParams params = new SearchIdentityParams();
 				params.setUserProperties(Collections.singletonMap(UserConstants.EMAIL, email));
-				List<Identity> identities = securityManager.getIdentitiesByPowerSearch(params, 0, 1);
+				List<Identity> identities = identitySearchQueries.getIdentitiesByPowerSearch(params, 0, 1);
 				for(Identity identity:identities) {
 					GroupRole role = roles.getEmailsToRole().get(email);
 					memberList.add(new ViteroGroupMemberVO(identity.getKey(), role.name()));
@@ -297,7 +300,7 @@ public class ViteroBookingWebService {
 			for(String email:currentEmails) {
 				SearchIdentityParams params = new SearchIdentityParams();
 				params.setUserProperties(Collections.singletonMap(UserConstants.EMAIL, email));
-				List<Identity> identities = securityManager.getIdentitiesByPowerSearch(params, 0, 1);
+				List<Identity> identities = identitySearchQueries.getIdentitiesByPowerSearch(params, 0, 1);
 				for(Identity identity:identities) {
 					ViteroStatus status = viteroManager.removeFromRoom(booking, identity);
 					if(!status.isOk()) {
diff --git a/src/main/java/org/olat/modules/webFeed/FeedResourceSecurityCallback.java b/src/main/java/org/olat/modules/webFeed/FeedResourceSecurityCallback.java
index dce9cc28441..21ecd73a44e 100644
--- a/src/main/java/org/olat/modules/webFeed/FeedResourceSecurityCallback.java
+++ b/src/main/java/org/olat/modules/webFeed/FeedResourceSecurityCallback.java
@@ -31,27 +31,22 @@ import org.olat.core.commons.services.notifications.SubscriptionContext;
  */
 public class FeedResourceSecurityCallback implements FeedSecurityCallback {
 
-	private boolean isAdmin, isOwner;
+	private boolean isAdministrator;
 	
 	private SubscriptionContext subsContext;
 
-	public FeedResourceSecurityCallback(boolean isAdmin, boolean isOwner) {
-		this.isAdmin = isAdmin;
-		this.isOwner = isOwner;
+	public FeedResourceSecurityCallback(boolean isAdministrator) {
+		this.isAdministrator = isAdministrator;
 	}
 
-	/**
-	 * @see org.olat.modules.webFeed.FeedSecurityCallback#mayCreateItems()
-	 */
+	@Override
 	public boolean mayCreateItems() {
-		return isAdmin || isOwner;
+		return isAdministrator;
 	}
 
-	/**
-	 * @see org.olat.modules.webFeed.FeedSecurityCallback#mayDeleteItems()
-	 */
+	@Override
 	public boolean mayDeleteItems() {
-		return isAdmin || isOwner;
+		return isAdministrator;
 	}
 	
 	@Override
@@ -59,11 +54,9 @@ public class FeedResourceSecurityCallback implements FeedSecurityCallback {
 		return true;
 	}
 
-	/**
-	 * @see org.olat.modules.webFeed.FeedSecurityCallback#mayEditItems()
-	 */
+	@Override
 	public boolean mayEditItems() {
-		return isAdmin || isOwner;
+		return isAdministrator;
 	}
 
 	@Override
@@ -71,19 +64,14 @@ public class FeedResourceSecurityCallback implements FeedSecurityCallback {
 		return true;
 	}
 
-	/**
-	 * @see org.olat.modules.webFeed.FeedSecurityCallback#mayEditMetadata()
-	 */
+	@Override
 	public boolean mayEditMetadata() {
-		return isAdmin || isOwner;
+		return isAdministrator;
 	}
 
-	/**
-	 * @see org.olat.modules.webFeed.FeedSecurityCallback#mayViewAllDrafts()
-	 */
 	@Override
 	public boolean mayViewAllDrafts() {
-		return isAdmin || isOwner;
+		return isAdministrator;
 	}
 	
 	@Override
diff --git a/src/main/java/org/olat/modules/webFeed/portfolio/LiveBlogArtefactHandler.java b/src/main/java/org/olat/modules/webFeed/portfolio/LiveBlogArtefactHandler.java
index 961c1269f1c..356d501083d 100644
--- a/src/main/java/org/olat/modules/webFeed/portfolio/LiveBlogArtefactHandler.java
+++ b/src/main/java/org/olat/modules/webFeed/portfolio/LiveBlogArtefactHandler.java
@@ -22,6 +22,9 @@ package org.olat.modules.webFeed.portfolio;
 
 import java.util.List;
 
+import org.olat.basesecurity.BaseSecurity;
+import org.olat.basesecurity.OrganisationRoles;
+import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
@@ -37,7 +40,6 @@ import org.olat.modules.webFeed.Item;
 import org.olat.modules.webFeed.manager.FeedManager;
 import org.olat.modules.webFeed.search.document.FeedItemDocument;
 import org.olat.modules.webFeed.ui.FeedItemDisplayConfig;
-import org.olat.modules.webFeed.ui.FeedMainController;
 import org.olat.modules.webFeed.ui.blog.BlogUIFactory;
 import org.olat.portfolio.EPAbstractHandler;
 import org.olat.portfolio.manager.EPFrontendManager;
@@ -76,37 +78,28 @@ public class LiveBlogArtefactHandler extends EPAbstractHandler<LiveBlogArtefact>
 		return artefact;
 	}
 
-	@Override
-	public void prefillArtefactAccordingToSource(AbstractArtefact artefact, Object source) {
-		super.prefillArtefactAccordingToSource(artefact, source);
-	}
-
 	@Override
 	public Controller createDetailsController(UserRequest ureq, WindowControl wControl, AbstractArtefact artefact, boolean readOnlyMode) {
-		FeedSecurityCallback callback = new FeedResourceSecurityCallback(false, false);
+		FeedSecurityCallback callback = new FeedResourceSecurityCallback(false);
 		String businessPath = artefact.getBusinessPath();
 		Long resid = Long.parseLong(businessPath.substring(10, businessPath.length() - 1));
 		OLATResource ores = OLATResourceManager.getInstance().findResourceable(resid, BlogFileResource.TYPE_NAME);
 		FeedItemDisplayConfig displayConfig = new FeedItemDisplayConfig(false, false, readOnlyMode);
-		FeedMainController detailsController = BlogUIFactory.getInstance(ureq.getLocale()).createMainController(ores, ureq, wControl, callback, displayConfig);
-		return detailsController;
+		return BlogUIFactory.getInstance(ureq.getLocale()).createMainController(ores, ureq, wControl, callback, displayConfig);
 	}
 
-	/**
-	 * @see org.olat.portfolio.EPAbstractHandler#isProvidingSpecialMapViewController()
-	 */
 	@Override
 	public boolean isProvidingSpecialMapViewController() {
 		return true;
 	}
 
-	/**
-	 * @see org.olat.portfolio.EPAbstractHandler#getSpecialMapViewController(org.olat.core.gui.UserRequest, org.olat.core.gui.control.WindowControl)
-	 */
 	@Override
 	public Controller getSpecialMapViewController(UserRequest ureq, WindowControl wControl, AbstractArtefact artefact) {
-		boolean isOwner = ureq.getIdentity().equalsByPersistableKey(artefact.getAuthor());
-		FeedSecurityCallback callback = new FeedResourceSecurityCallback(ureq.getUserSession().getRoles().isOLATAdmin(), isOwner);
+		BaseSecurity securityManager = CoreSpringFactory.getImpl(BaseSecurity.class);
+		boolean isAdministrator = ureq.getIdentity().equalsByPersistableKey(artefact.getAuthor())
+				|| ureq.getUserSession().getRoles().isManagerOf(OrganisationRoles.administrator, securityManager.getRoles(artefact.getAuthor()));
+
+		FeedSecurityCallback callback = new FeedResourceSecurityCallback(isAdministrator);
 		String businessPath = artefact.getBusinessPath();
 		Long resid = Long.parseLong(businessPath.substring(10, businessPath.length() - 1));
 		OLATResource ores = OLATResourceManager.getInstance().findResourceable(resid, BlogFileResource.TYPE_NAME);
diff --git a/src/main/java/org/olat/modules/webFeed/portfolio/LiveBlogContextEntryControllerCreator.java b/src/main/java/org/olat/modules/webFeed/portfolio/LiveBlogContextEntryControllerCreator.java
index 481bba4748f..c7ba3747816 100644
--- a/src/main/java/org/olat/modules/webFeed/portfolio/LiveBlogContextEntryControllerCreator.java
+++ b/src/main/java/org/olat/modules/webFeed/portfolio/LiveBlogContextEntryControllerCreator.java
@@ -79,7 +79,7 @@ public class LiveBlogContextEntryControllerCreator  {
 			ores = OLATResourceManager.getInstance().findResourceable(ores.getResourceableId(), BlogFileResource.TYPE_NAME);
 			Feed feed = feedManager.loadFeed(ores);
 			boolean isOwner = feed.getAuthor() != null && ureq.getIdentity() != null && feed.getAuthor().equals(ureq.getIdentity().getName());
-			FeedSecurityCallback secCallback = new FeedResourceSecurityCallback(isOwner, isOwner);
+			FeedSecurityCallback secCallback = new FeedResourceSecurityCallback(isOwner);
 			FeedMainController controller = new FeedMainController(ores, ureq, wControl, BlogUIFactory.getInstance(ureq.getLocale()), secCallback);
 			return new LayoutMain3ColsController(ureq, wControl, controller);
 		}
diff --git a/src/main/java/org/olat/modules/wiki/WikiSecurityCallbackImpl.java b/src/main/java/org/olat/modules/wiki/WikiSecurityCallbackImpl.java
index b445f6c46ac..0b9205ff4f6 100644
--- a/src/main/java/org/olat/modules/wiki/WikiSecurityCallbackImpl.java
+++ b/src/main/java/org/olat/modules/wiki/WikiSecurityCallbackImpl.java
@@ -35,7 +35,7 @@ import org.olat.modules.fo.ForumCallback;
 public class WikiSecurityCallbackImpl implements WikiSecurityCallback {
 	
 	private NodeEvaluation ne;
-	private boolean isOlatAdmin;
+	private boolean isAdministator;
 	private boolean isGuestOnly;
 	private boolean isGroupWiki;
 	private boolean isResourceOwner;
@@ -48,11 +48,11 @@ public class WikiSecurityCallbackImpl implements WikiSecurityCallback {
 	 * @param isGuestOnly
 	 * @param isGroupWiki
 	 */
-	public WikiSecurityCallbackImpl(NodeEvaluation ne, boolean isOlatAdmin, 
+	public WikiSecurityCallbackImpl(NodeEvaluation ne, boolean isAdministator, 
 			boolean isGuestOnly, boolean isGroupWiki, 
 			boolean isResourceOwner, SubscriptionContext subscriptionContext){
 		this.ne = ne;
-		this.isOlatAdmin = isOlatAdmin;
+		this.isAdministator = isAdministator;
 		this.isGuestOnly = isGuestOnly;
 		this.isGroupWiki  = isGroupWiki;
 		this.isResourceOwner = isResourceOwner;
@@ -61,20 +61,19 @@ public class WikiSecurityCallbackImpl implements WikiSecurityCallback {
 	
 	/**
 	 * 
-	 * @return true if admin or allowed by preconditions
+	 * @return true if administrator or allowed by preconditions
 	 */
 	@Override
-	public boolean mayEditAndCreateArticle(){
-		if(isGroupWiki) return true;
+	public boolean mayEditAndCreateArticle() {
 		if(isGuestOnly) return false;
-		if(isOlatAdmin) return true;
-		//if(isResourceOwner) return true; //should not shortcut the nodeEvauation values			
-		if(ne != null && ne.isCapabilityAccessible("access")
-				&& ne.isCapabilityAccessible("editarticle")) {
+		if(isGroupWiki || isAdministator) {
 			return true;
 		}
-		if(ne == null) return true; //wiki is started from repo, and it's visible to this user, so creating pages is allowed
-		return false;
+		if(ne != null && ne.isCapabilityAccessible("access") && ne.isCapabilityAccessible("editarticle")) {
+			return true;
+		}
+		//wiki is started from repo, and it's visible to this user, so creating pages is allowed
+		return ne == null; 
 	}
 	
 	/**
@@ -83,28 +82,21 @@ public class WikiSecurityCallbackImpl implements WikiSecurityCallback {
 	 */
 	@Override
 	public boolean mayEditWikiMenu(){
-		if(isGroupWiki) return true;
 		if(isGuestOnly) return false;
-		if(isOlatAdmin) return true;
-		if(isResourceOwner) return true;
-		return false;
+		return isGroupWiki || isAdministator || isResourceOwner;
 	}
 	
 	/**
 	 * @return the subscriptionContext. if null, then no subscription must be offered
 	 */
 	@Override
-	public SubscriptionContext getSubscriptionContext()
-	{
+	public SubscriptionContext getSubscriptionContext() {
 		return (isGuestOnly ? null : subscriptionContext);
 	}
 
 	@Override
 	public boolean mayModerateForum()	{
-		if(!isGuestOnly && (isOlatAdmin || isResourceOwner)) {
-			return true;		
-		}		
-		return false;
+		return !isGuestOnly && (isAdministator || isResourceOwner);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/modules/wiki/restapi/WikiWebService.java b/src/main/java/org/olat/modules/wiki/restapi/WikiWebService.java
index 6ad8e534844..bc87bbbf105 100644
--- a/src/main/java/org/olat/modules/wiki/restapi/WikiWebService.java
+++ b/src/main/java/org/olat/modules/wiki/restapi/WikiWebService.java
@@ -19,6 +19,9 @@
  */
 package org.olat.modules.wiki.restapi;
 
+import static org.olat.restapi.security.RestSecurityHelper.isAdmin;
+import static org.olat.restapi.security.RestSecurityHelper.isAuthor;
+
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.ws.rs.GET;
@@ -29,7 +32,7 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
-import org.olat.core.CoreSpringFactory;
+import org.olat.basesecurity.GroupRoles;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.fileresource.types.WikiResource;
@@ -38,6 +41,7 @@ import org.olat.repository.RepositoryManager;
 import org.olat.repository.RepositoryService;
 import org.olat.resource.OLATResourceManager;
 import org.olat.restapi.security.RestSecurityHelper;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * 
@@ -48,6 +52,13 @@ import org.olat.restapi.security.RestSecurityHelper;
  * 
  */
 public class WikiWebService {
+	
+	@Autowired
+	private RepositoryManager repositoryManager;
+	@Autowired
+	private RepositoryService repositoryService;
+	@Autowired
+	private OLATResourceManager resourceManager;
 
 	/**
 	 * will export the specified wiki (which must be a repo-entry-wiki) to a CP
@@ -63,33 +74,15 @@ public class WikiWebService {
 	@GET
 	@Produces({"application/zip", MediaType.APPLICATION_OCTET_STREAM })
 	public Response exportWiki(@PathParam("wikiKey") String wikiKey, @Context HttpServletRequest request, @Context HttpServletResponse response) {
-		if (wikiKey == null)
-			return Response.serverError().status(Status.BAD_REQUEST).build();
-
-		try {
-			return getWikiEntryAndServe(wikiKey,request,response);
-		} catch (Exception e) {
+		RepositoryEntry wikiEntry = getExportableWikiRepoEntryByAnyKey(wikiKey);
+		if(wikiEntry == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
-
-	}
-
-	/**
-	 * 
-	 * @param wikiKey
-	 * @param request
-	 * @param response
-	 * @return
-	 * @throws Exception
-	 */
-	private Response getWikiEntryAndServe(String wikiKey, HttpServletRequest request, HttpServletResponse response) throws Exception {
-		RepositoryEntry wikiEntry = getExportableWikiRepoEntryByAnyKey(wikiKey);
-		if (isRESTUserAllowedToExportWiki(wikiEntry, request)) {
-			CoreSpringFactory.getImpl(RepositoryService.class).incrementDownloadCounter(wikiEntry);
+		if (isAllowedToExportWiki(wikiEntry, request)) {
+			repositoryService.incrementDownloadCounter(wikiEntry);
 			return WikiWebServiceHelper.serve(wikiEntry.getOlatResource(), request, response);
-		} else {
-			return Response.serverError().status(Status.FORBIDDEN).build();
 		}
+		return Response.serverError().status(Status.FORBIDDEN).build();
 	}
 
 	/**
@@ -105,11 +98,9 @@ public class WikiWebService {
 	 *            the resourceable id, softkey or repository-id
 	 * @return the exportable wiki
 	 */
-	private static RepositoryEntry getExportableWikiRepoEntryByAnyKey(String wikiKey) throws Exception {
-		RepositoryEntry re = null;
-
+	private RepositoryEntry getExportableWikiRepoEntryByAnyKey(String wikiKey) {
 		// first try softkey
-		re = RepositoryManager.getInstance().lookupRepositoryEntryBySoftkey(wikiKey, false);
+		RepositoryEntry re = repositoryManager.lookupRepositoryEntryBySoftkey(wikiKey, false);
 		if (re != null && re.getCanDownload()) {
 			return re;
 		}
@@ -117,24 +108,23 @@ public class WikiWebService {
 		try {
 			Long key = Long.parseLong(wikiKey);
 			// try repo key
-			re = RepositoryManager.getInstance().lookupRepositoryEntry(key);
+			re = repositoryManager.lookupRepositoryEntry(key);
 			if (re != null && re.getCanDownload()) {
 				return re;
 			}
 
 			// null,try resourceable key
-			OLATResourceable ores = OLATResourceManager.getInstance().findResourceable(key, WikiResource.TYPE_NAME);
+			OLATResourceable ores = resourceManager.findResourceable(key, WikiResource.TYPE_NAME);
 			if (ores != null) {
-				re = RepositoryManager.getInstance().lookupRepositoryEntry(ores, false);
-				if (re != null && re.getCanDownload())
+				re = repositoryManager.lookupRepositoryEntry(ores, false);
+				if (re != null && re.getCanDownload()) {
 					return re;
+				}
 			}
-
 		} catch (NumberFormatException nfe) {
 			// wikiKey was not a Long number, ignore
 		}
-
-		throw new Exception("No RepositoryEntry found for key " + wikiKey);
+		return null;
 	}
 
 	/**
@@ -145,11 +135,14 @@ public class WikiWebService {
 	 * @param request
 	 * @return
 	 */
-	private boolean isRESTUserAllowedToExportWiki(RepositoryEntry wikiEntry, HttpServletRequest request) {
-		Identity ident = RestSecurityHelper.getIdentity(request);
-		boolean isAuthor = RestSecurityHelper.isAuthor(request);
-		boolean isOwner = RepositoryManager.getInstance().isOwnerOfRepositoryEntry(ident, wikiEntry);
-		return isAuthor || isOwner;
+	private boolean isAllowedToExportWiki(RepositoryEntry re, HttpServletRequest request) {
+		Identity identity = RestSecurityHelper.getIdentity(request);
+		boolean canDownload = re.getCanDownload() ;
+		if (isAdmin(request) || repositoryService.hasRole(identity, re, GroupRoles.owner.name())) {
+			canDownload = true;
+		} else if(!isAuthor(request)) {
+			return false;
+		}
+		return canDownload;
 	}
-
 }
diff --git a/src/main/java/org/olat/modules/wiki/restapi/WikisWebService.java b/src/main/java/org/olat/modules/wiki/restapi/WikisWebService.java
index 2e572ed3775..c953b4645d9 100644
--- a/src/main/java/org/olat/modules/wiki/restapi/WikisWebService.java
+++ b/src/main/java/org/olat/modules/wiki/restapi/WikisWebService.java
@@ -28,11 +28,11 @@ import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
-import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
+import org.olat.core.CoreSpringFactory;
 import org.olat.core.id.Identity;
 import org.olat.core.id.Roles;
 import org.olat.fileresource.types.WikiResource;
@@ -41,6 +41,7 @@ import org.olat.modules.wiki.restapi.vo.WikiVOes;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
 import org.olat.repository.model.SearchRepositoryEntryParameters;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 /**
@@ -54,6 +55,9 @@ import org.springframework.stereotype.Component;
 @Path("repo/wikis")
 @Component
 public class WikisWebService {
+	
+	@Autowired
+	private RepositoryManager repositoryManager;
 
 	/**
 	 * export a specific wiki
@@ -63,7 +67,9 @@ public class WikisWebService {
 	 */
 	@Path("{wikiKey}")
 	public WikiWebService getWiki() {
-		return new WikiWebService();
+		WikiWebService wikiWebservice = new WikiWebService();
+		CoreSpringFactory.autowireObject(wikiWebservice);
+		return wikiWebservice;
 	}
 
 	/**
@@ -77,17 +83,11 @@ public class WikisWebService {
 	@GET
 	@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
 	public Response getWikis(@Context HttpServletRequest httpRequest) {
-
-		try {
-			List<RepositoryEntry> res = getAccessibleWikiRepositoryEntries(httpRequest);
-			WikiVO[] wks_repo = toArrayOfVOes_repoentry(res);
-			WikiVOes voes = new WikiVOes();
-			voes.setWikis( wks_repo);
-			return Response.ok(voes).build();
-		} catch (Exception e) {
-			throw new WebApplicationException(e);
-		}
-
+		List<RepositoryEntry> res = getAccessibleWikiRepositoryEntries(httpRequest);
+		WikiVO[] wikiVoArr = toWikiVOArray(res);
+		WikiVOes voes = new WikiVOes();
+		voes.setWikis(wikiVoArr);
+		return Response.ok(voes).build();
 	}
 	
 	/**
@@ -96,16 +96,14 @@ public class WikisWebService {
 	 * @param httpRequest
 	 * @return
 	 */
-	private static List<RepositoryEntry> getAccessibleWikiRepositoryEntries(HttpServletRequest httpRequest){
+	private List<RepositoryEntry> getAccessibleWikiRepositoryEntries(HttpServletRequest httpRequest){
 		Roles roles = getRoles(httpRequest);
 		Identity identity = getIdentity(httpRequest);
-		RepositoryManager rm = RepositoryManager.getInstance();
-		SearchRepositoryEntryParameters params = new SearchRepositoryEntryParameters(identity, roles, new String[] { WikiResource.TYPE_NAME });
-		List<RepositoryEntry> res = rm.genericANDQueryWithRolesRestriction(params, 0, -1, true);
-		return res;
+		SearchRepositoryEntryParameters params = new SearchRepositoryEntryParameters(identity, roles, WikiResource.TYPE_NAME);
+		return repositoryManager.genericANDQueryWithRolesRestriction(params, 0, -1, true);
 	}
 
-	private static WikiVO[] toArrayOfVOes_repoentry(List<RepositoryEntry> entries) {
+	private WikiVO[] toWikiVOArray(List<RepositoryEntry> entries) {
 		int i = 0;
 		WikiVO[] wikiVOs = new WikiVO[entries.size()];
 		for (RepositoryEntry entry : entries) {
@@ -114,7 +112,7 @@ public class WikisWebService {
 		return wikiVOs;
 	}
 
-	private static WikiVO wikivoFromRepoEntry(RepositoryEntry entry) {
+	private WikiVO wikivoFromRepoEntry(RepositoryEntry entry) {
 		WikiVO wiki = new WikiVO();
 		wiki.setTitle(entry.getDisplayname());
 		wiki.setKey(entry.getResourceableId());
diff --git a/src/main/java/org/olat/portfolio/EPSecurityCallbackFactory.java b/src/main/java/org/olat/portfolio/EPSecurityCallbackFactory.java
index bf3c8a317c9..73f40a4b7b9 100644
--- a/src/main/java/org/olat/portfolio/EPSecurityCallbackFactory.java
+++ b/src/main/java/org/olat/portfolio/EPSecurityCallbackFactory.java
@@ -20,6 +20,9 @@
 
 package org.olat.portfolio;
 
+import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.OrganisationRoles;
+import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.id.OLATResourceable;
 import org.olat.portfolio.manager.EPFrontendManager;
@@ -30,6 +33,7 @@ import org.olat.portfolio.model.structel.PortfolioStructureMap;
 import org.olat.portfolio.model.structel.StructureStatusEnum;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
+import org.olat.repository.RepositoryService;
 
 
 /**
@@ -146,24 +150,30 @@ public class EPSecurityCallbackFactory {
 	 * @return
 	 */
 	protected static EPSecurityCallback getSecurityCallbackTemplate(UserRequest ureq, PortfolioStructureMap map, EPFrontendManager ePFMgr) {
+		RepositoryService repositoryService = CoreSpringFactory.getImpl(RepositoryService.class);
+		RepositoryManager repositoryManager = CoreSpringFactory.getImpl(RepositoryManager.class);
+		
 		OLATResourceable mres = map.getOlatResource();
-		RepositoryEntry repoEntry = RepositoryManager.getInstance().lookupRepositoryEntry(mres, false);
-		boolean isAdmin = ureq.getUserSession().getRoles().isOLATAdmin();
-		//owner of repository entry or owner of map is the same
-		boolean isOwner = RepositoryManager.getInstance().isOwnerOfRepositoryEntry(ureq.getIdentity(), repoEntry);	
-		boolean canLaunch = RepositoryManager.getInstance().isAllowedToLaunch(ureq.getIdentity(), ureq.getUserSession().getRoles(), repoEntry);
+		RepositoryEntry repoEntry = repositoryManager.lookupRepositoryEntry(mres, false);
 		
-		isOwner |= ePFMgr.isMapOwner(ureq.getIdentity(), map.getOlatResource());
+		boolean isAdministrator = repositoryService.hasRoleExpanded(ureq.getIdentity(), repoEntry,
+				OrganisationRoles.administrator.name(), OrganisationRoles.learnresourcemanager.name());
+
+		//owner of repository entry or owner of map is the same
+		boolean isOwner = repositoryService.hasRole(ureq.getIdentity(), repoEntry, GroupRoles.owner.name())
+				|| ePFMgr.isMapOwner(ureq.getIdentity(), map.getOlatResource());
+		boolean canLaunch = isAdministrator || isOwner ||
+				repositoryManager.isAllowedToLaunch(ureq.getIdentity(), ureq.getUserSession().getRoles(), repoEntry);
 		boolean open = !StructureStatusEnum.CLOSED.equals(map.getStatus());
 		
-		boolean canEditStructure = (isOwner || isAdmin) && open;
+		boolean canEditStructure = (isOwner || isAdministrator) && open;
 		boolean canEditReflexion = isOwner && open;
 		boolean canEditTags = isOwner && open;
 		boolean canShare = false;
-		boolean canAddArtefact = false; // (isOwner || isAdmin) && open;
-		boolean canRemoveArtefactFromStruct = (isOwner || isAdmin) && open;
-		boolean canAddStructure = (isOwner || isAdmin) && open;
-		boolean canAddPage = (isOwner || isAdmin) && open;
+		boolean canAddArtefact = false;
+		boolean canRemoveArtefactFromStruct = (isOwner || isAdministrator) && open;
+		boolean canAddStructure = (isOwner || isAdministrator) && open;
+		boolean canAddPage = (isOwner || isAdministrator) && open;
 		boolean canView = canLaunch;
 		boolean canCommentAndRate = false;
 		boolean canSubmitAssess = false;
diff --git a/src/main/java/org/olat/repository/RepositoryManager.java b/src/main/java/org/olat/repository/RepositoryManager.java
index 41a26aa00f9..4aa209f88ac 100644
--- a/src/main/java/org/olat/repository/RepositoryManager.java
+++ b/src/main/java/org/olat/repository/RepositoryManager.java
@@ -57,7 +57,6 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Organisation;
-import org.olat.core.id.OrganisationRef;
 import org.olat.core.id.Roles;
 import org.olat.core.logging.AssertException;
 import org.olat.core.logging.OLog;
@@ -269,7 +268,6 @@ public class RepositoryManager {
 		List<RepositoryEntry> entries = dbInstance.getCurrentEntityManager()
 				.createNamedQuery("loadRepositoryEntryByKey", RepositoryEntry.class)
 				.setParameter("repoKey", key)
-				//.setHint("org.hibernate.cacheable", Boolean.TRUE)
 				.getResultList();
 		if(entries.isEmpty()) {
 			return null;
@@ -544,20 +542,17 @@ public class RepositoryManager {
 	 */
 	public boolean isAllowedToLaunch(Identity identity, Roles roles, RepositoryEntry re) {
 		// allow if identity is owner
-		if (repositoryEntryRelationDao.hasRole(identity, re, GroupRoles.owner.name())) {
+		// allow for administrators, institutional resource manager and principals
+		if (repositoryEntryRelationDao.hasRole(identity, re, true, OrganisationRoles.administrator.name(),
+				OrganisationRoles.learnresourcemanager.name(), OrganisationRoles.principal.name(),
+				GroupRoles.owner.name())) {
 			return true;
 		}
-		// allow if access limit matches identity's role
-		// allow for olat administrators
-		if (roles.isOLATAdmin()) return true;
-		// allow for institutional resource manager
-		if (isLearnResourceManagerFor(roles, re)) return true;
 		// allow for authors if access granted at least for authors
 		if (roles.isAuthor() && re.getAccess() >= RepositoryEntry.ACC_OWNERS_AUTHORS) return true;
 		// allow for guests if access granted for guests
 		if (roles.isGuestOnly()) {
-			if (re.getAccess() >= RepositoryEntry.ACC_USERS_GUESTS) return true;
-			else return false;
+			return (re.getAccess() >= RepositoryEntry.ACC_USERS_GUESTS);
 		}
 		// else allow if access granted for users
 		if(re.getAccess() >= RepositoryEntry.ACC_USERS) {
@@ -577,8 +572,11 @@ public class RepositoryManager {
 		boolean isGroupParticipant = false;
 		boolean isGroupWaiting = false;
 
+		boolean isAuthor = false;
 		boolean isEntryAdmin = false;
+		boolean isAdministrator = false;
 		boolean isLearnRessourceManager = false;
+		
 		boolean canLaunch = false;
 
 		if (roles.isGuestOnly()) {
@@ -600,7 +598,7 @@ public class RepositoryManager {
 							break;
 						}
 						case coach: {
-							boolean d = (def == null ? false : def.booleanValue());
+							boolean d = def != null && def.booleanValue();
 							if(d) {
 								isCourseCoach = true;
 							} else {
@@ -609,7 +607,7 @@ public class RepositoryManager {
 							break;
 						}
 						case participant: {
-							boolean d = (def == null ? false : def.booleanValue());
+							boolean d = def != null &&def.booleanValue();
 							if(d) {
 								isCourseParticipant = true;
 							} else {
@@ -624,37 +622,29 @@ public class RepositoryManager {
 						default: break;
 					}
 				} else if(OrganisationRoles.isValue(role)) {
-					
 					switch(OrganisationRoles.valueOf(role)) {
-						case learnresourcemanager: {
-							isLearnRessourceManager = true;
+						case administrator:
+							isAdministrator = true;
 							break;
-						}
-						case coach: {
-							isCourseCoach = true;
+						case author:
+							isAuthor = true;
+							break;
+						case learnresourcemanager:
+							isLearnRessourceManager = true;
 							break;
-						}
 						default: break;
 					}
 				}
 			}
 
-			if(isOwner) {
-				canLaunch = true;
-				isEntryAdmin = true;
-			}
 			// allow if access limit matches identity's role
 			// allow for olat administrators
-			else if (roles.isOLATAdmin()) {
-				canLaunch = true;
-				isEntryAdmin = true;
-			}
 			// allow for institutional resource manager
-			else if (isLearnRessourceManager) {
+			if(isOwner || isAdministrator || isLearnRessourceManager) {
 				canLaunch = true;
 				isEntryAdmin = true;
 			}
-			if (roles.isAuthor() && re.getAccess() >= RepositoryEntry.ACC_OWNERS_AUTHORS) {
+			if (isAuthor && re.getAccess() >= RepositoryEntry.ACC_OWNERS_AUTHORS) {
 				// allow for authors if access granted at least for authors
 				canLaunch = true;
 			} else if(re.getAccess() >= RepositoryEntry.ACC_USERS) {
@@ -673,7 +663,7 @@ public class RepositoryManager {
 		return new RepositoryEntrySecurity(isEntryAdmin, isOwner,
 				isCourseParticipant, isCourseCoach,
 				isGroupParticipant, isGroupCoach,
-				isGroupWaiting, canLaunch, readOnly);
+				isGroupWaiting, isAuthor, canLaunch, readOnly);
 	}
 
 	public RepositoryEntry setAccess(final RepositoryEntry re, int access, boolean membersOnly) {
@@ -1058,7 +1048,7 @@ public class RepositoryManager {
 		if(!checkCanReference && !checkCanCopy) {
 			return Collections.emptyList();
 		}
-		if(!roles.isAuthor() && !roles.isLearnResourceManager() && !roles.isOLATAdmin()) {
+		if(!roles.isAuthor() && !roles.isLearnResourceManager() && !roles.isAdministrator()) {
 			return Collections.emptyList();
 		}
 
@@ -1185,17 +1175,6 @@ public class RepositoryManager {
 				.setParameter("identityKey", identity.getKey())
 				.getResultList();
 	}
-
-	/**
-	 * check ownership of identity for a resource
-	 * @return true if the identity is member of the security group of the repository entry
-	 */
-	public boolean isOwnerOfRepositoryEntry(IdentityRef identity, RepositoryEntryRef entry) {
-		if(entry == null || identity == null) {
-			return false;
-		}
-		return repositoryEntryRelationDao.hasRole(identity, entry, GroupRoles.owner.name());
-	}
 	
 	public int countGenericANDQueryWithRolesRestriction(SearchRepositoryEntryParameters params) {
 		return repositoryEntryQueries.countEntries(params);
@@ -1576,33 +1555,6 @@ public class RepositoryManager {
 		return allOk;
 	}
 
-	/**
-	 * 
-	 * @param RepositoryEntry repositoryEntry
-	 * @param Identity identity
-	 */
-	public boolean isLearnResourceManagerFor(Roles roles, RepositoryEntryRef repositoryEntry) {
-		if(repositoryEntry == null) {
-			return false;
-		}
-
-		if(!roles.isLearnResourceManager()) {
-			return false;
-		}
-		
-		//TODO roles (add administration)
-		List<OrganisationRef> learnResourceManagerOrganisations = roles.getOrganisationsWithRole(OrganisationRoles.learnresourcemanager);
-		List<OrganisationRef> repositoryOrganisations = repositoryEntryToOrganisationDao.getOrganisationReferences(repositoryEntry);
-		for(OrganisationRef learnResourceManagerOrganisation:learnResourceManagerOrganisations) {
-			for(OrganisationRef repositoryOrganisation:repositoryOrganisations) {
-				if(learnResourceManagerOrganisation.getKey().equals(repositoryOrganisation.getKey())) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
 	public int countLearningResourcesAsStudent(IdentityRef identity) {
 		StringBuilder sb = new StringBuilder(1200);
 		sb.append("select count(v) from ").append(RepositoryEntry.class.getName()).append(" as v ")
@@ -2040,8 +1992,4 @@ public class RepositoryManager {
 			sb.append(var).append(".key asc");
 		}
 	}
-
-	public boolean isIdentityInTutorSecurityGroup(Identity identity, RepositoryEntryRef resource) {
-		return repositoryEntryRelationDao.hasRole(identity, resource, GroupRoles.coach.name());
-	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/repository/RepositoryService.java b/src/main/java/org/olat/repository/RepositoryService.java
index 2a17c0bf9ae..80e8b91912c 100644
--- a/src/main/java/org/olat/repository/RepositoryService.java
+++ b/src/main/java/org/olat/repository/RepositoryService.java
@@ -267,13 +267,21 @@ public interface RepositoryService {
 	 * @return True if the specified role(s) was found.
 	 */
 	public boolean hasRole(Identity identity, RepositoryEntryRef re, String... roles);
+	
+	/**
+	 * Has specific role in the specified resource (via the resource itself or a
+	 * business group, organization or a curriculum element).
+	 *
+	 * @return True if the specified role(s) was found.
+	 */
+	public boolean hasRoleExpanded(Identity identity, RepositoryEntryRef re, String... roles);
 
 	/**
-	 * Has specific role in any resource (follow or not the business groups).
+	 * Has specific role in any resource (follow or not the business groups, organizations an).
 	 *
 	 * @return True if the specified role(s) was found.
 	 */
-	public boolean hasRole(Identity identity, boolean followBusinessGroups, String... roles);
+	public boolean hasRoleExpanded(Identity identity, String... roles);
 
 
 	public void addRole(Identity identity, RepositoryEntry re, String role);
diff --git a/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java b/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java
index 7e9ce32d455..b2d43874e59 100644
--- a/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java
+++ b/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java
@@ -221,7 +221,7 @@ public class ReferencableEntriesSearchController extends BasicController {
 	private boolean isAdminSearchVisible(String[] limitingTypes, UserRequest ureq) {
 		Roles roles = ureq.getUserSession().getRoles();
 		return limitingTypes != null && limitingTypes.length == 1 && "CourseModule".equals(limitingTypes[0])
-				&& (roles.isOLATAdmin() ||
+				&& (roles.isAdministrator() ||
 						(roles.isLearnResourceManager() && roles.isGroupManager()) ||
 						(roles.isGroupManager() && businessGroupModule.isGroupManagersAllowedToLinkCourses()));
 	}
diff --git a/src/main/java/org/olat/repository/handlers/BlogHandler.java b/src/main/java/org/olat/repository/handlers/BlogHandler.java
index 9c7e4ce100b..1cc5ac27045 100644
--- a/src/main/java/org/olat/repository/handlers/BlogHandler.java
+++ b/src/main/java/org/olat/repository/handlers/BlogHandler.java
@@ -43,7 +43,6 @@ import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.coordinate.LockResult;
 import org.olat.core.util.resource.OLATResourceableJustBeforeDeletedEvent;
 import org.olat.core.util.vfs.VFSContainer;
-import org.olat.course.assessment.AssessmentMode;
 import org.olat.course.assessment.manager.UserCourseInformationsManager;
 import org.olat.fileresource.FileResourceManager;
 import org.olat.fileresource.types.BlogFileResource;
@@ -62,7 +61,6 @@ import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
 import org.olat.repository.RepositoryService;
 import org.olat.repository.model.RepositoryEntrySecurity;
-import org.olat.repository.ui.RepositoryEntryRuntimeController.RuntimeControllerCreator;
 import org.olat.resource.OLATResource;
 import org.olat.resource.OLATResourceManager;
 import org.olat.resource.references.ReferenceManager;
@@ -139,9 +137,6 @@ public class BlogHandler implements RepositoryHandler {
 	@Override
 	public boolean cleanupOnDelete(RepositoryEntry entry, OLATResourceable res) {
 		CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(new OLATResourceableJustBeforeDeletedEvent(res), res);
-		// For now, notifications are not implemented since a blog feed is meant
-		// to be subscriped to anyway.
-		// NotificationsManager.getInstance().deletePublishersOf(res);
 		FeedManager.getInstance().deleteFeed(res);
 		return true;
 	}
@@ -163,29 +158,19 @@ public class BlogHandler implements RepositoryHandler {
 		return null;
 	}
 
-	/**
-	 * @see org.olat.repository.handlers.RepositoryHandler#getLaunchController(org.olat.core.id.OLATResourceable,
-	 *      java.lang.String, org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.control.WindowControl)
-	 */
 	@Override
 	public MainLayoutController createLaunchController(final RepositoryEntry re, RepositoryEntrySecurity reSecurity,
 			UserRequest ureq, WindowControl wControl) {
-		boolean isAdmin = ureq.getUserSession().getRoles().isOLATAdmin();
-		boolean isOwner = RepositoryManager.getInstance().isOwnerOfRepositoryEntry(ureq.getIdentity(), re);	
-		final FeedSecurityCallback callback = new FeedResourceSecurityCallback(isAdmin, isOwner);
+		
+		boolean isAdministrator = reSecurity.isEntryAdmin();
+		final FeedSecurityCallback callback = new FeedResourceSecurityCallback(isAdministrator);
 		SubscriptionContext subsContext = new SubscriptionContext(re.getOlatResource(), re.getSoftkey());
 		callback.setSubscriptionContext(subsContext);
-		return new FeedRuntimeController(ureq, wControl, re, reSecurity,
-				new RuntimeControllerCreator() {
-					@Override
-					public Controller create(UserRequest uureq, WindowControl wwControl, TooledStackedPanel toolbarPanel,
-							RepositoryEntry entry, RepositoryEntrySecurity security, AssessmentMode assessmentMode) {
-						CoreSpringFactory.getImpl(UserCourseInformationsManager.class)
-							.updateUserCourseInformations(entry.getOlatResource(), uureq.getIdentity());
-						return new FeedMainController(entry.getOlatResource(), uureq, wwControl, null, null,
-							BlogUIFactory.getInstance(uureq.getLocale()), callback, null);
-					}
+		return new FeedRuntimeController(ureq, wControl, re, reSecurity, (uureq, wwControl, toolbarPanel, entry,  security,  assessmentMode) -> {
+				CoreSpringFactory.getImpl(UserCourseInformationsManager.class)
+					.updateUserCourseInformations(entry.getOlatResource(), uureq.getIdentity());
+				return new FeedMainController(entry.getOlatResource(), uureq, wwControl, null, null,
+					BlogUIFactory.getInstance(uureq.getLocale()), callback, null);
 			});
 	}
 
diff --git a/src/main/java/org/olat/repository/handlers/CourseHandler.java b/src/main/java/org/olat/repository/handlers/CourseHandler.java
index bad61cfc835..bbb6ca97044 100644
--- a/src/main/java/org/olat/repository/handlers/CourseHandler.java
+++ b/src/main/java/org/olat/repository/handlers/CourseHandler.java
@@ -579,7 +579,9 @@ public class CourseHandler implements RepositoryHandler {
 				control.setInfo(CourseCreationMailHelper.getSuccessMessageString(uureq));
 				// send notification mail
 				final MailerResult mr = CourseCreationMailHelper.sentNotificationMail(uureq, ccHelper.getConfiguration());
-				MailHelper.printErrorsAndWarnings(mr, control, uureq.getUserSession().getRoles().isOLATAdmin(), uureq.getLocale());
+				Roles roles = uureq.getUserSession().getRoles();
+				boolean detailedErrorOuput = roles.isAdministrator() || roles.isSystemAdmin();
+				MailHelper.printErrorsAndWarnings(mr, control, detailedErrorOuput, uureq.getLocale());
 				return StepsMainRunController.DONE_MODIFIED;
 			};
 
diff --git a/src/main/java/org/olat/repository/handlers/PodcastHandler.java b/src/main/java/org/olat/repository/handlers/PodcastHandler.java
index 406acecf580..70f7b2e6038 100644
--- a/src/main/java/org/olat/repository/handlers/PodcastHandler.java
+++ b/src/main/java/org/olat/repository/handlers/PodcastHandler.java
@@ -160,9 +160,8 @@ public class PodcastHandler implements RepositoryHandler {
 
 	@Override
 	public MainLayoutController createLaunchController(RepositoryEntry re, RepositoryEntrySecurity reSecurity, UserRequest ureq, WindowControl wControl) {
-		boolean isAdmin = ureq.getUserSession().getRoles().isOLATAdmin();
-		boolean isOwner = reSecurity.isOwner();	
-		final FeedSecurityCallback callback = new FeedResourceSecurityCallback(isAdmin, isOwner);
+		boolean isAdministrator = reSecurity.isEntryAdmin();	
+		final FeedSecurityCallback callback = new FeedResourceSecurityCallback(isAdministrator);
 		SubscriptionContext subsContext = new SubscriptionContext(re.getOlatResource(), re.getSoftkey());
 		callback.setSubscriptionContext(subsContext);
 		return new FeedRuntimeController(ureq, wControl, re, reSecurity,
diff --git a/src/main/java/org/olat/repository/handlers/WikiHandler.java b/src/main/java/org/olat/repository/handlers/WikiHandler.java
index 102320aba6d..05118d8561e 100644
--- a/src/main/java/org/olat/repository/handlers/WikiHandler.java
+++ b/src/main/java/org/olat/repository/handlers/WikiHandler.java
@@ -185,7 +185,7 @@ public class WikiHandler implements RepositoryHandler {
 		}
 
 		//check role
-		boolean isOLatAdmin = ureq.getUserSession().getRoles().isOLATAdmin();
+		boolean isOLatAdmin = reSecurity.isEntryAdmin();
 		boolean isGuestOnly = ureq.getUserSession().getRoles().isGuestOnly();
 		boolean isResourceOwner = false;
 		if (isOLatAdmin) {
diff --git a/src/main/java/org/olat/repository/manager/RepositoryEntryQueries.java b/src/main/java/org/olat/repository/manager/RepositoryEntryQueries.java
index bfb30b33e61..2603f5ba3d4 100644
--- a/src/main/java/org/olat/repository/manager/RepositoryEntryQueries.java
+++ b/src/main/java/org/olat/repository/manager/RepositoryEntryQueries.java
@@ -122,7 +122,7 @@ public class RepositoryEntryQueries {
 			PersistenceHelper.appendFuzzyLike(query, "v.description", "desc", dbInstance.getDbVendor());
 		}
 
-		if (resourceTypes != null && resourceTypes.size() > 0) {
+		if (resourceTypes != null && !resourceTypes.isEmpty()) {
 			query.append(" and res.resName in (:resourcetypes)");
 		}
 
diff --git a/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java b/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java
index e2de12b33a9..0611bb1ffb9 100644
--- a/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java
+++ b/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java
@@ -102,22 +102,40 @@ public class RepositoryEntryRelationDAO {
 				.setParameter("repoKey", re.getKey())
 				.getResultList();
 	}
-
+	
 	/**
-	 * Has role in the repository entry only (without business groups)
-	 * @param identity
-	 * @param re
-	 * @param roles
-	 * @return
+	 * Has role in the repository entry only without following relations
+	 * to business groups and other entities.
+	 * 
+	 * @param identity The identity
+	 * @param re The repository entry
+	 * @param roles The roles to search for
+	 * @return true if a role is found
 	 */
 	public boolean hasRole(IdentityRef identity, RepositoryEntryRef re, String... roles) {
+		return hasRole(identity, re, false, roles);
+	}
+
+	/**
+	 * Has role in the repository entry.
+	 * 
+	 * @param identity The identity
+	 * @param re The repository entry
+	 * @param follow follow or not follow the relation to business groups, organizations and curriculum elements
+	 * @param roles The roles to search for
+	 * @return true if a role is found
+	 */
+	public boolean hasRole(IdentityRef identity, RepositoryEntryRef re, boolean follow, String... roles) {
 		if(identity == null || re == null || re.getKey() == null) return false;
 		List<String> roleList = GroupRoles.toList(roles);
 		
 		StringBuilder sb = new StringBuilder();
 		sb.append("select count(membership) from ").append(RepositoryEntry.class.getName()).append(" as v")
-		  .append(" inner join v.groups as relGroup on relGroup.defaultGroup=true")
-		  .append(" inner join relGroup.group as baseGroup")
+		  .append(" inner join v.groups as relGroup");
+		if(!follow) {
+			sb.append(" on relGroup.defaultGroup=true");
+		}
+		sb.append(" inner join relGroup.group as baseGroup")
 		  .append(" inner join baseGroup.members as membership")
 		  .append(" where v.key=:repoKey and membership.identity.key=:identityKey");
 		if(!roleList.isEmpty()) {
@@ -133,7 +151,7 @@ public class RepositoryEntryRelationDAO {
 		}
 		
 		Number count = query.getSingleResult();
-		return count == null ? false : count.intValue() > 0;
+		return count != null && count.intValue() > 0;
 	}
 	
 	/**
@@ -144,17 +162,14 @@ public class RepositoryEntryRelationDAO {
 	 * @param roles The roles to query
 	 * @return
 	 */
-	public boolean hasRole(IdentityRef identity, boolean followBusinessGroups, String... roles) {
+	public boolean hasRoleExpanded(IdentityRef identity, String... roles) {
 		if(identity == null) return false;
 		List<String> roleList = GroupRoles.toList(roles);
 
 		StringBuilder sb = new StringBuilder();
 		sb.append("select membership.key from ").append(RepositoryEntry.class.getName()).append(" as v")
-		  .append(" inner join v.groups as relGroup ");
-		if(!followBusinessGroups) {
-			sb.append(" on relGroup.defaultGroup=true");
-		}
-		sb.append(" inner join relGroup.group as baseGroup")
+		  .append(" inner join v.groups as relGroup ")
+		  .append(" inner join relGroup.group as baseGroup")
 		  .append(" inner join baseGroup.members as membership")
 		  .append(" where membership.identity.key=:identityKey");
 		if(!roleList.isEmpty()) {
diff --git a/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java b/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
index 49534947063..ccc6a98a52e 100644
--- a/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
+++ b/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
@@ -568,12 +568,19 @@ public class RepositoryServiceImpl implements RepositoryService {
 
 	@Override
 	public boolean hasRole(Identity identity, RepositoryEntryRef re, String... roles) {
-		return reToGroupDao.hasRole(identity, re, roles);
+		if(re == null || identity == null) return false;
+		return reToGroupDao.hasRole(identity, re, false, roles);
 	}
 
 	@Override
-	public boolean hasRole(Identity identity, boolean followBusinessGroups, String... roles) {
-		return reToGroupDao.hasRole(identity, followBusinessGroups, roles);
+	public boolean hasRoleExpanded(Identity identity, RepositoryEntryRef re, String... roles) {
+		if(re == null || identity == null) return false;
+		return reToGroupDao.hasRole(identity, re, true, roles);
+	}
+
+	@Override
+	public boolean hasRoleExpanded(Identity identity, String... roles) {
+		return reToGroupDao.hasRoleExpanded(identity, roles);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/repository/model/RepositoryEntrySecurity.java b/src/main/java/org/olat/repository/model/RepositoryEntrySecurity.java
index b14648b46fb..7509a2f6e54 100644
--- a/src/main/java/org/olat/repository/model/RepositoryEntrySecurity.java
+++ b/src/main/java/org/olat/repository/model/RepositoryEntrySecurity.java
@@ -31,6 +31,7 @@ public class RepositoryEntrySecurity {
 	private final boolean canLaunch;
 	private final boolean entryAdmin;
 	private final boolean readOnly;
+	private final boolean author;
 	
 	private final boolean courseParticipant;
 	private final boolean courseCoach;
@@ -41,10 +42,12 @@ public class RepositoryEntrySecurity {
 	public RepositoryEntrySecurity(boolean entryAdmin, boolean owner,
 			boolean courseParticipant, boolean courseCoach,
 			boolean groupParticipant, boolean groupCoach,
-			boolean groupWaiting, boolean canLaunch, boolean readOnly) {
+			boolean groupWaiting, boolean author,
+			boolean canLaunch, boolean readOnly) {
 		this.owner = owner;
 		this.canLaunch = canLaunch;
 		this.entryAdmin = entryAdmin;
+		this.author = author;
 		
 		this.courseParticipant = courseParticipant;
 		this.courseCoach = courseCoach;
@@ -89,8 +92,12 @@ public class RepositoryEntrySecurity {
 	public boolean isGroupWaiting() {
 		return groupWaiting;
 	}
-	
+
 	public boolean isMember() {
 		return owner || courseParticipant || courseCoach || groupParticipant || groupCoach;
 	}
+	
+	public boolean isAuthor() {
+		return author;
+	}
 }
diff --git a/src/main/java/org/olat/repository/site/CatalogManagerSecurityCallback.java b/src/main/java/org/olat/repository/site/CatalogManagerSecurityCallback.java
index f4fe6788ce3..ee85ef9038f 100644
--- a/src/main/java/org/olat/repository/site/CatalogManagerSecurityCallback.java
+++ b/src/main/java/org/olat/repository/site/CatalogManagerSecurityCallback.java
@@ -56,9 +56,8 @@ public class CatalogManagerSecurityCallback implements SiteSecurityCallback {
 				|| usess.getRoles().isInvitee() || usess.getRoles().isGuestOnly()) {
 			return false;
 		}
-		if (usess.getRoles().isOLATAdmin() || usess.getRoles().isLearnResourceManager()) {
-			return true;
-		}
-		return catalogManager.isOwner(ureq.getIdentity());
+		return usess.getRoles().isAdministrator()
+				|| usess.getRoles().isLearnResourceManager()
+				||  catalogManager.isOwner(ureq.getIdentity());
 	}
 }
diff --git a/src/main/java/org/olat/repository/site/RepositorySiteDef.java b/src/main/java/org/olat/repository/site/RepositorySiteDef.java
index dc2c81ca9a2..b451a248d3e 100644
--- a/src/main/java/org/olat/repository/site/RepositorySiteDef.java
+++ b/src/main/java/org/olat/repository/site/RepositorySiteDef.java
@@ -61,7 +61,7 @@ public class RepositorySiteDef extends AbstractSiteDefinition implements SiteDef
 		}
 		
 		Roles roles = usess.getRoles();
-		if(roles.isOLATAdmin() || roles.isAuthor() || roles.isLearnResourceManager()) {
+		if(roles.isAdministrator() || roles.isAuthor() || roles.isLearnResourceManager()) {
 			// only for authors and institutional resource managers
 			return new RepositorySite(this, ureq.getLocale());
 		}
diff --git a/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java
index ab4c5eb3a3b..752a5328a70 100644
--- a/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java
+++ b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java
@@ -130,7 +130,6 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 				 detailsLink, bookmarkLink,
 				 copyLink, downloadLink, deleteLink;
 	
-	protected final boolean isOlatAdmin;
 	protected final boolean isGuestOnly;
 	protected final boolean isAuthor;
 	
@@ -224,9 +223,8 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 		handler = handlerFactory.getRepositoryHandler(re);
 
 		roles = session.getRoles();
-		isOlatAdmin = roles.isOLATAdmin();
 		isGuestOnly = roles.isGuestOnly();
-		isAuthor = roles.isAuthor();
+		isAuthor = reSecurity.isAuthor();
 		this.reSecurity = reSecurity;
 
 		// set up the components
@@ -254,7 +252,7 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 	private final boolean isAssessmentLock(UserRequest ureq, RepositoryEntry entry, RepositoryEntrySecurity reSec) {
 		OLATResource resource = entry.getOlatResource();
 		OLATResourceable lock = ureq.getUserSession().getLockResource();
-		return lock != null && !reSec.isOwner() && !ureq.getUserSession().getRoles().isOLATAdmin()
+		return lock != null && !reSec.isOwner() && !reSec.isEntryAdmin()
 				&& lock.getResourceableId().equals(resource.getResourceableId())
 				&& lock.getResourceableTypeName().equals(resource.getResourceableTypeName());
 	}
@@ -792,7 +790,7 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 	}
 	
 	private void doRun(UserRequest ureq, RepositoryEntrySecurity security) {
-		if(ureq.getUserSession().getRoles().isOLATAdmin()) {
+		if(security.isEntryAdmin()) {
 			launchContent(ureq, security);
 		} else {
 			// guest are allowed to see resource with BARG 
diff --git a/src/main/java/org/olat/repository/ui/author/AuthorDeletedListController.java b/src/main/java/org/olat/repository/ui/author/AuthorDeletedListController.java
index cb1c8c37151..ed55c58e5ac 100644
--- a/src/main/java/org/olat/repository/ui/author/AuthorDeletedListController.java
+++ b/src/main/java/org/olat/repository/ui/author/AuthorDeletedListController.java
@@ -24,6 +24,7 @@ import java.util.Collections;
 import java.util.List;
 
 import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.form.flexible.FormItem;
@@ -43,8 +44,6 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableCalloutWindowController;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
-import org.olat.core.id.Identity;
-import org.olat.core.id.Roles;
 import org.olat.course.CourseModule;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryManagedFlag;
@@ -100,7 +99,7 @@ public class AuthorDeletedListController extends AuthorListController {
 	@Override
 	protected void initBatchButtons(FormItemContainer formLayout) {
 		restoreButton = uifactory.addFormLink("tools.restore", formLayout, Link.BUTTON);
-		if(isOlatAdmin) {
+		if(hasAdministratorRight) {
 			deletePermanentlyButton = uifactory.addFormLink("tools.delete.permanently", formLayout, Link.BUTTON);
 		}
 	}
@@ -192,14 +191,10 @@ public class AuthorDeletedListController extends AuthorListController {
 	}
 
 	private void doRestore(UserRequest ureq, List<AuthoringEntryRow> rows) {
-		Roles roles = ureq.getUserSession().getRoles();
 		List<Long> deleteableRowKeys = new ArrayList<>(rows.size());
 		for(AuthoringEntryRow row:rows) {
 			boolean managed = RepositoryEntryManagedFlag.isManaged(row.getManagedFlags(), RepositoryEntryManagedFlag.delete);
-			boolean canDelete = roles.isOLATAdmin()
-					|| repositoryService.hasRole(getIdentity(), row, GroupRoles.owner.name())
-					|| repositoryManager.isLearnResourceManagerFor(roles, row);
-			if(canDelete && !managed) {
+			if(!managed && canManage(row)) {
 				deleteableRowKeys.add(row.getKey());
 			}
 		}
@@ -222,12 +217,11 @@ public class AuthorDeletedListController extends AuthorListController {
 	}
 	
 	private void doDeletePermanently(UserRequest ureq, List<AuthoringEntryRow> rows) {
-		Roles roles = ureq.getUserSession().getRoles();
 		List<Long> deleteableRowKeys = new ArrayList<>(rows.size());
 		for(AuthoringEntryRow row:rows) {
 			boolean managed = RepositoryEntryManagedFlag.isManaged(row.getManagedFlags(), RepositoryEntryManagedFlag.delete);
-			boolean canDelete = roles.isOLATAdmin() || repositoryManager.isLearnResourceManagerFor(roles, row);
-			if(canDelete && !managed) {
+			if(!managed && repositoryService.hasRoleExpanded(getIdentity(), row, OrganisationRoles.learnresourcemanager.name(),
+				OrganisationRoles.administrator.name())) {
 				deleteableRowKeys.add(row.getKey());
 			}
 		}
@@ -248,37 +242,30 @@ public class AuthorDeletedListController extends AuthorListController {
 			cmc.activate();
 		}
 	}
-	
-	
 
 	private class DToolsController extends BasicController {
-		
-		private final AuthoringEntryRow row;
 
 		private final VelocityContainer mainVC;
 		
-		private boolean isOwner;
-		private boolean isAuthor;
+		private final boolean isOwner;
+		private final boolean isAuthor;
+		private final AuthoringEntryRow row;
 		
 		public DToolsController(UserRequest ureq, WindowControl wControl, AuthoringEntryRow row, RepositoryEntry entry) {
 			super(ureq, wControl);
 			setTranslator(AuthorDeletedListController.this.getTranslator());
 			this.row = row;
 			
-			Identity identity = getIdentity();
-			Roles roles = ureq.getUserSession().getRoles();
-			boolean isInstitutionalResourceManager = !roles.isGuestOnly()
-						&& repositoryManager.isLearnResourceManagerFor(roles, entry);
-			isOwner = isOlatAdmin || repositoryService.hasRole(identity, entry, GroupRoles.owner.name())
-						|| isInstitutionalResourceManager;
-			isAuthor = isOlatAdmin || roles.isAuthor() || isInstitutionalResourceManager;
-			
+			boolean isManager = repositoryService.hasRoleExpanded(getIdentity(), entry,
+					OrganisationRoles.administrator.name(), OrganisationRoles.learnresourcemanager.name());
+			isOwner = isManager || repositoryService.hasRole(getIdentity(), entry, GroupRoles.owner.name());
+			isAuthor = isManager || repositoryService.hasRoleExpanded(getIdentity(), entry, OrganisationRoles.author.name());
+
 			RepositoryHandler handler = repositoryHandlerFactory.getRepositoryHandler(entry);
 
 			mainVC = createVelocityContainer("tools");
 			List<String> links = new ArrayList<>();
 
-			
 			boolean copyManaged = RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.copy);
 			boolean canCopy = (isAuthor || isOwner) && (entry.getCanCopy() || isOwner) && !copyManaged;
 			
@@ -305,7 +292,7 @@ public class AuthorDeletedListController extends AuthorListController {
 				addLink("tools.restore", "restore", "o_icon o_icon-fw o_icon_restore", links);
 			}
 			
-			if(isOlatAdmin && !RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.delete)) {
+			if(isManager && !RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.delete)) {
 				addLink("details.delete", "delete", "o_icon o_icon-fw o_icon_delete_item", links);
 			}
 
diff --git a/src/main/java/org/olat/repository/ui/author/AuthorListController.java b/src/main/java/org/olat/repository/ui/author/AuthorListController.java
index c9a364f4dbe..de9879d4ded 100644
--- a/src/main/java/org/olat/repository/ui/author/AuthorListController.java
+++ b/src/main/java/org/olat/repository/ui/author/AuthorListController.java
@@ -28,6 +28,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 import org.olat.NewControllerFactory;
 import org.olat.admin.user.UserSearchController;
 import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.basesecurity.events.MultiIdentityChosenEvent;
 import org.olat.basesecurity.events.SingleIdentityChosenEvent;
 import org.olat.core.commons.persistence.DB;
@@ -150,8 +151,8 @@ public class AuthorListController extends FormBasicController implements Activat
 	private CreateEntryController createCtrl;
 	protected CloseableCalloutWindowController toolsCalloutCtrl;
 	
-	protected boolean isOlatAdmin;
 	protected boolean hasAuthorRight;
+	protected boolean hasAdministratorRight;
 	
 	private Link importLink;
 	private Dropdown createDropdown;
@@ -195,9 +196,8 @@ public class AuthorListController extends FormBasicController implements Activat
 		ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
 		
 		Roles roles = ureq.getUserSession().getRoles();
-		boolean learnResourceManager = roles.isLearnResourceManager();
-		isOlatAdmin = roles.isOLATAdmin() || learnResourceManager;
-		hasAuthorRight = roles.isAuthor() || learnResourceManager || roles.isOLATAdmin();
+		hasAdministratorRight = roles.isAdministrator() || roles.isLearnResourceManager();
+		hasAuthorRight =  hasAdministratorRight || roles.isAuthor();
 
 		dataSource = new AuthoringEntryDataSource(searchParams, this, !withSearch);
 		initForm(ureq);
@@ -847,13 +847,10 @@ public class AuthorListController extends FormBasicController implements Activat
 	private void doAddOwners(UserRequest ureq, List<AuthoringEntryRow> rows) {
 		if(userSearchCtr != null) return;
 		
-		Roles roles = ureq.getUserSession().getRoles();
 		List<AuthoringEntryRow> manageableRows = new ArrayList<>(rows.size());
 		for(AuthoringEntryRow row:rows) {
 			boolean managed = RepositoryEntryManagedFlag.isManaged(row.getManagedFlags(), RepositoryEntryManagedFlag.membersmanagement);
-			boolean canAddOwner = roles.isOLATAdmin() || repositoryService.hasRole(ureq.getIdentity(), row, GroupRoles.owner.name())
-					|| repositoryManager.isLearnResourceManagerFor(roles, row);
-			if(canAddOwner && !managed) {
+			if(!managed && canManage(row)) {
 				manageableRows.add(row);
 			}
 		}
@@ -885,19 +882,17 @@ public class AuthorListController extends FormBasicController implements Activat
 	
 	private void doConfirmCopy(UserRequest ureq, List<AuthoringEntryRow> rows) {
 		boolean deleted = false;
-		Roles roles = ureq.getUserSession().getRoles();
+
 		List<AuthoringEntryRow> copyableRows = new ArrayList<>(rows.size());
 		for(AuthoringEntryRow row:rows) {
 			RepositoryEntry entry = repositoryService.loadByKey(row.getKey());
 			if(entry == null) {
 				deleted = true;
 			} else {
-				boolean isInstitutionalResourceManager = repositoryManager.isLearnResourceManagerFor(roles, row);
-				boolean isOwner = roles.isOLATAdmin()
-						|| repositoryService.hasRole(ureq.getIdentity(), row, GroupRoles.owner.name())
-						|| isInstitutionalResourceManager;
-	
-				boolean isAuthor = roles.isOLATAdmin() || roles.isAuthor() || isInstitutionalResourceManager;
+				boolean isManager = repositoryService.hasRoleExpanded(getIdentity(), row,
+						OrganisationRoles.administrator.name(), OrganisationRoles.learnresourcemanager.name());
+				boolean isOwner = isManager || repositoryService.hasRole(ureq.getIdentity(), row, GroupRoles.owner.name());
+				boolean isAuthor = isManager || repositoryService.hasRoleExpanded(getIdentity(), row, OrganisationRoles.author.name());
 				
 				boolean copyManaged = RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.copy);
 				boolean canCopy = (isAuthor || isOwner) && (entry.getCanCopy() || isOwner) && !copyManaged;
@@ -985,13 +980,10 @@ public class AuthorListController extends FormBasicController implements Activat
 	}
 	
 	private void doDelete(UserRequest ureq, List<AuthoringEntryRow> rows) {
-		Roles roles = ureq.getUserSession().getRoles();
 		List<Long> deleteableRowKeys = new ArrayList<>(rows.size());
 		for(AuthoringEntryRow row:rows) {
 			boolean managed = RepositoryEntryManagedFlag.isManaged(row.getManagedFlags(), RepositoryEntryManagedFlag.delete);
-			boolean canDelete = roles.isOLATAdmin() || repositoryService.hasRole(ureq.getIdentity(), row, GroupRoles.owner.name())
-					|| repositoryManager.isLearnResourceManagerFor(roles, row);
-			if(canDelete && !managed) {
+			if(!managed && canManage(row)) {
 				deleteableRowKeys.add(row.getKey());
 			}
 		}
@@ -1155,6 +1147,19 @@ public class AuthorListController extends FormBasicController implements Activat
 		}
 	}
 	
+	/**
+	 * Check if the user can manage the specified row. He needs
+	 * to be learn resource manager, administrator or owner of the
+	 * resource.
+	 * 
+	 * @param row
+	 * @return true if the user can edit the resource
+	 */
+	protected boolean canManage(AuthoringEntryRow row) {
+		return repositoryService.hasRoleExpanded(getIdentity(), row, OrganisationRoles.learnresourcemanager.name(),
+				OrganisationRoles.administrator.name(), GroupRoles.owner.name());
+	}
+	
 	private class ReferencesController extends BasicController {
 
 		@Autowired
@@ -1200,25 +1205,22 @@ public class AuthorListController extends FormBasicController implements Activat
 	}
 	
 	private class ToolsController extends BasicController {
-		
-		private final AuthoringEntryRow row;
 
 		private final VelocityContainer mainVC;
 		
-		private boolean isOwner;
-		private boolean isAuthor;
+		private final boolean isOwner;
+		private final boolean isAuthor;
+		private final AuthoringEntryRow row;
 		
 		public ToolsController(UserRequest ureq, WindowControl wControl, AuthoringEntryRow row, RepositoryEntry entry) {
 			super(ureq, wControl);
 			setTranslator(AuthorListController.this.getTranslator());
 			this.row = row;
 			
-			Roles roles = ureq.getUserSession().getRoles();
-			boolean isInstitutionalResourceManager = !roles.isGuestOnly()
-						&& repositoryManager.isLearnResourceManagerFor(roles, entry);
-			isOwner = isOlatAdmin || repositoryService.hasRole(ureq.getIdentity(), entry, GroupRoles.owner.name())
-						|| isInstitutionalResourceManager;
-			isAuthor = isOlatAdmin || roles.isAuthor() || isInstitutionalResourceManager;
+			boolean isManager = repositoryService.hasRoleExpanded(getIdentity(), entry,
+					OrganisationRoles.administrator.name(), OrganisationRoles.learnresourcemanager.name());
+			isOwner = isManager || repositoryService.hasRole(getIdentity(), entry, GroupRoles.owner.name());
+			isAuthor = isManager || repositoryService.hasRoleExpanded(getIdentity(), entry, OrganisationRoles.author.name());
 			
 			RepositoryHandler handler = repositoryHandlerFactory.getRepositoryHandler(entry);
 
diff --git a/src/main/java/org/olat/repository/ui/author/ConfirmDeletePermanentlyController.java b/src/main/java/org/olat/repository/ui/author/ConfirmDeletePermanentlyController.java
index 6190dccee4d..be6ff8ca048 100644
--- a/src/main/java/org/olat/repository/ui/author/ConfirmDeletePermanentlyController.java
+++ b/src/main/java/org/olat/repository/ui/author/ConfirmDeletePermanentlyController.java
@@ -76,8 +76,6 @@ public class ConfirmDeletePermanentlyController extends FormBasicController {
 	
 	private static final String[] yesNo = new String[] { "yes", "no" };
 	
-	private String[] referenceKeys;
-	
 	@Autowired
 	private ReferenceManager referenceManager;
 	@Autowired
@@ -90,7 +88,7 @@ public class ConfirmDeletePermanentlyController extends FormBasicController {
 		this.rows = rows;
 		this.notAllDeleteable = notAllDeleteable;
 		numOfMembers = repositoryService.countMembers(rows, getIdentity());
-		references = referenceManager.getReferencesInfos(rows, getIdentity(), ureq.getUserSession().getRoles());
+		references = referenceManager.getReferencesInfos(rows, getIdentity());
 		if(references.size() > 1) {
 			Collections.sort(references, new ReferenceInfosComparator(Collator.getInstance(getLocale())));
 		}
@@ -121,7 +119,7 @@ public class ConfirmDeletePermanentlyController extends FormBasicController {
 			
 			int pos = 0;
 			boolean hasOrphans = false;
-			referenceKeys = new String[references.size()];
+			String[] referenceKeys = new String[references.size()];
 			String[] referenceValues = new String[references.size()];
 			for(ReferenceInfos reference:references) {
 				hasOrphans |= reference.isOrphan() && reference.isOwner() && !reference.isManaged();
diff --git a/src/main/java/org/olat/repository/ui/author/ConfirmDeleteSoftlyController.java b/src/main/java/org/olat/repository/ui/author/ConfirmDeleteSoftlyController.java
index 5a521134753..c4f873800a0 100644
--- a/src/main/java/org/olat/repository/ui/author/ConfirmDeleteSoftlyController.java
+++ b/src/main/java/org/olat/repository/ui/author/ConfirmDeleteSoftlyController.java
@@ -78,7 +78,7 @@ public class ConfirmDeleteSoftlyController extends FormBasicController {
 		this.rows = rows;
 		this.notAllDeleteable = notAllDeleteable;
 		numOfMembers = repositoryService.countMembers(rows, getIdentity());
-		references = referenceManager.getReferencesInfos(rows, getIdentity(), ureq.getUserSession().getRoles());
+		references = referenceManager.getReferencesInfos(rows, getIdentity());
 		if(references.size() > 1) {
 			Collections.sort(references, new ReferenceInfosComparator(Collator.getInstance(getLocale())));
 		}
diff --git a/src/main/java/org/olat/repository/ui/author/RepositoryMembersController.java b/src/main/java/org/olat/repository/ui/author/RepositoryMembersController.java
index 8a399c6a9b3..7da44088c15 100644
--- a/src/main/java/org/olat/repository/ui/author/RepositoryMembersController.java
+++ b/src/main/java/org/olat/repository/ui/author/RepositoryMembersController.java
@@ -195,7 +195,8 @@ public class RepositoryMembersController extends AbstractMemberListController {
 		List<BusinessGroupMembershipChange> allModifications = changes.generateBusinessGroupMembershipChange(members);
 		MailPackage bgMailing = new MailPackage(template, result, getWindowControl().getBusinessControl().getAsString(), template != null);
 		businessGroupService.updateMemberships(getIdentity(), allModifications, bgMailing);
-		MailHelper.printErrorsAndWarnings(result, getWindowControl(), roles.isOLATAdmin(), getLocale());
+		boolean detailedErrorOutput = roles.isAdministrator() || roles.isSystemAdmin();
+		MailHelper.printErrorsAndWarnings(result, getWindowControl(), detailedErrorOutput, getLocale());
 		
 		//commit all changes to the curriculum memberships
 		List<CurriculumElementMembershipChange> curriculumChanges = changes.generateCurriculumElementMembershipChange(members);
diff --git a/src/main/java/org/olat/repository/ui/author/wizard/UnpublishResourceCallback.java b/src/main/java/org/olat/repository/ui/author/wizard/UnpublishResourceCallback.java
index 09b580a1524..af7d04f45fb 100644
--- a/src/main/java/org/olat/repository/ui/author/wizard/UnpublishResourceCallback.java
+++ b/src/main/java/org/olat/repository/ui/author/wizard/UnpublishResourceCallback.java
@@ -34,6 +34,7 @@ import org.olat.core.gui.control.generic.wizard.StepRunnerCallback;
 import org.olat.core.gui.control.generic.wizard.StepsMainRunController;
 import org.olat.core.gui.control.generic.wizard.StepsRunContext;
 import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.core.logging.activity.CourseLoggingAction;
@@ -83,7 +84,7 @@ public class UnpublishResourceCallback implements StepRunnerCallback {
 		MailTemplate mailTemplate = (MailTemplate)runContext.get("mailTemplate");
 		
 		if (mailTemplate != null) {
-			List<Identity> ownerList = new ArrayList<Identity>();
+			List<Identity> ownerList = new ArrayList<>();
 			// owners
 			if (repositoryService.hasRole(ureq.getIdentity(), repositoryEntry, GroupRoles.owner.name())) {
 				ownerList = repositoryService.getMembers(repositoryEntry, GroupRoles.owner.name());
@@ -100,9 +101,11 @@ public class UnpublishResourceCallback implements StepRunnerCallback {
 				result.append(mailManager.sendMessage(ccBundle));
 			}
 			
-			StringBuilder errorMessage = new StringBuilder();
-			StringBuilder warningMessage = new StringBuilder();
-			MailHelper.appendErrorsAndWarnings(result, errorMessage, warningMessage, ureq.getUserSession().getRoles().isOLATAdmin(), ureq.getLocale());
+			StringBuilder errorMessage = new StringBuilder(1024);
+			StringBuilder warningMessage = new StringBuilder(1024);
+			Roles roles = ureq.getUserSession().getRoles();
+			boolean detailedErrorOutput = roles.isAdministrator() || roles.isSystemAdmin();
+			MailHelper.appendErrorsAndWarnings(result, errorMessage, warningMessage, detailedErrorOutput, ureq.getLocale());
 			if (warningMessage.length() > 0) {
 				wControl.setWarning(warningMessage.toString());
 			}
diff --git a/src/main/java/org/olat/repository/ui/catalog/CatalogEntryMoveController.java b/src/main/java/org/olat/repository/ui/catalog/CatalogEntryMoveController.java
index bf94c1b4b01..aba2452a28b 100644
--- a/src/main/java/org/olat/repository/ui/catalog/CatalogEntryMoveController.java
+++ b/src/main/java/org/olat/repository/ui/catalog/CatalogEntryMoveController.java
@@ -144,7 +144,7 @@ public class CatalogEntryMoveController extends BasicController {
 	 * @return List of repo entries
 	 */
 	private List<CatalogEntry> getOwnedEntries(UserRequest ureq) {
-		if (ureq.getUserSession().getRoles().isOLATAdmin()) {
+		if (ureq.getUserSession().getRoles().isAdministrator()) {
 			return catalogManager.getRootCatalogEntries();
 		} else {
 			return catalogManager.getCatalogEntriesOwnedBy(getIdentity());
diff --git a/src/main/java/org/olat/resource/accesscontrol/model/AuthorACSecurityCallback.java b/src/main/java/org/olat/resource/accesscontrol/model/AuthorACSecurityCallback.java
index 91defe1a60f..62fb518a585 100644
--- a/src/main/java/org/olat/resource/accesscontrol/model/AuthorACSecurityCallback.java
+++ b/src/main/java/org/olat/resource/accesscontrol/model/AuthorACSecurityCallback.java
@@ -40,7 +40,7 @@ public class AuthorACSecurityCallback implements AccessMethodSecurityCallback {
 
 	@Override
 	public boolean canUse() {
-		return roles.isAuthor() || roles.isLearnResourceManager() || roles.isOLATAdmin();
+		return roles.isAuthor() || roles.isLearnResourceManager() || roles.isAdministrator();
 	}
 
 }
diff --git a/src/main/java/org/olat/resource/references/ReferenceManager.java b/src/main/java/org/olat/resource/references/ReferenceManager.java
index 989de674754..827086e1155 100644
--- a/src/main/java/org/olat/resource/references/ReferenceManager.java
+++ b/src/main/java/org/olat/resource/references/ReferenceManager.java
@@ -35,11 +35,11 @@ import java.util.Locale;
 import java.util.Set;
 
 import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
-import org.olat.core.id.Roles;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.StringHelper;
@@ -49,7 +49,6 @@ import org.olat.course.CourseModule;
 import org.olat.course.ICourse;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryManagedFlag;
-import org.olat.repository.RepositoryManager;
 import org.olat.repository.manager.RepositoryEntryDAO;
 import org.olat.repository.manager.RepositoryEntryRelationDAO;
 import org.olat.resource.OLATResource;
@@ -75,8 +74,6 @@ public class ReferenceManager {
 	@Autowired
 	private DB dbInstance;
 	@Autowired
-	private RepositoryManager repositoryManager;
-	@Autowired
 	private RepositoryEntryDAO repositoryEntryDAO;
 	@Autowired
 	private OLATResourceManager olatResourceManager;
@@ -148,7 +145,7 @@ public class ReferenceManager {
 				.getResultList();
 	}
 	
-	public List<ReferenceInfos> getReferencesInfos(List<RepositoryEntry> res, Identity identity, Roles roles) {
+	public List<ReferenceInfos> getReferencesInfos(List<RepositoryEntry> res, Identity identity) {
 		if(res == null || res.isEmpty()) return Collections.emptyList();
 		
 		List<Long> sourceKeys = new ArrayList<>();
@@ -175,24 +172,17 @@ public class ReferenceManager {
 				notOrphansResourceKeys.add(target.getKey());
 			}
 		}
-		
-		boolean isOlatAdmin = roles.isOLATAdmin();
-		
+
 		List<RepositoryEntry> entries = repositoryEntryDAO.loadByResourceKeys(targetResourceKeys);
 		List<ReferenceInfos> infos = new ArrayList<>(entries.size());
 		for(RepositoryEntry entry:entries) {
 			Long resourceKey = entry.getOlatResource().getKey();
 			boolean notOrphan = notOrphansResourceKeys.contains(resourceKey);
-			
 			boolean deleteManaged = RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.delete);
-
-			boolean isInstitutionalResourceManager = !roles.isGuestOnly()
-						&& repositoryManager.isLearnResourceManagerFor(roles, entry);
-			boolean isOwner = isOlatAdmin || reToGroupDao.hasRole(identity, entry, GroupRoles.owner.name())
-						|| isInstitutionalResourceManager;
-
-			ReferenceInfos refInfos = new ReferenceInfos(entry, !notOrphan, isOwner, deleteManaged);
-			infos.add(refInfos);
+			boolean isOwner = reToGroupDao.hasRole(identity, entry, true,
+					OrganisationRoles.administrator.name(), OrganisationRoles.learnresourcemanager.name(),
+					GroupRoles.owner.name());
+			infos.add(new ReferenceInfos(entry, !notOrphan, isOwner, deleteManaged));
 		}
 		return infos;
 	}
diff --git a/src/main/java/org/olat/restapi/repository/RepositoryEntryLifecycleWebService.java b/src/main/java/org/olat/restapi/repository/RepositoryEntryLifecycleWebService.java
index 264f915fbb6..7e50edeed4b 100644
--- a/src/main/java/org/olat/restapi/repository/RepositoryEntryLifecycleWebService.java
+++ b/src/main/java/org/olat/restapi/repository/RepositoryEntryLifecycleWebService.java
@@ -67,7 +67,7 @@ public class RepositoryEntryLifecycleWebService {
 	@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
 	public Response getPublicLifeCycles(@Context HttpServletRequest httpRequest) {
 		Roles roles = getRoles(httpRequest);
-		if(!roles.isLearnResourceManager() && !roles.isOLATAdmin()) {
+		if(!roles.isLearnResourceManager() && !roles.isAdministrator()) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 		
diff --git a/src/main/java/org/olat/restapi/repository/RepositoryEntryWebService.java b/src/main/java/org/olat/restapi/repository/RepositoryEntryWebService.java
index 0c56dc06add..1cb14e5916c 100644
--- a/src/main/java/org/olat/restapi/repository/RepositoryEntryWebService.java
+++ b/src/main/java/org/olat/restapi/repository/RepositoryEntryWebService.java
@@ -26,7 +26,6 @@ package org.olat.restapi.repository;
 
 import static org.olat.restapi.security.RestSecurityHelper.getIdentity;
 import static org.olat.restapi.security.RestSecurityHelper.getUserRequest;
-import static org.olat.restapi.security.RestSecurityHelper.isAdmin;
 import static org.olat.restapi.security.RestSecurityHelper.isAuthor;
 import static org.olat.restapi.security.RestSecurityHelper.isAuthorEditor;
 
@@ -60,6 +59,7 @@ import javax.ws.rs.core.Response.Status;
 import org.olat.admin.securitygroup.gui.IdentitiesAddEvent;
 import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.modules.bc.FolderConfig;
 import org.olat.core.gui.UserRequest;
@@ -126,12 +126,16 @@ public class RepositoryEntryWebService {
 	@Autowired
 	private TaxonomyService taxonomyService;
 	@Autowired
+	private OLATResourceManager resourceManager;
+	@Autowired
 	private RepositoryManager repositoryManager;
 	@Autowired
 	private RepositoryService repositoryService;
 	@Autowired
 	private RepositoryEntryLifecycleDAO lifecycleDao;
 	@Autowired
+	private RepositoryHandlerFactory repositoryHandlerFactory;
+	@Autowired
 	private RepositoryEntryToTaxonomyLevelDAO repositoryEntryToTaxonomyLevelDao;
 	
 	public RepositoryEntryWebService(RepositoryEntry entry) {
@@ -492,19 +496,20 @@ public class RepositoryEntryWebService {
 	@Path("file")
 	@Produces({ "application/zip", MediaType.APPLICATION_OCTET_STREAM })
 	public Response getRepoFileById(@Context HttpServletRequest request, @Context HttpServletResponse response) {
-		RepositoryHandler typeToDownload = RepositoryHandlerFactory.getInstance().getRepositoryHandler(entry);
+		RepositoryHandler typeToDownload = repositoryHandlerFactory.getRepositoryHandler(entry);
 		if (typeToDownload == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
 
-		OLATResource ores = OLATResourceManager.getInstance().findResourceable(entry.getOlatResource());
+		OLATResource ores = resourceManager.findResourceable(entry.getOlatResource());
 		if (ores == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
 
 		Identity identity = getIdentity(request);
 		boolean canDownload = entry.getCanDownload() && typeToDownload.supportsDownload();
-		if (isAdmin(request) || RepositoryManager.getInstance().isOwnerOfRepositoryEntry(identity, entry)) {
+		if (repositoryService.hasRoleExpanded(identity, entry, OrganisationRoles.administrator.name(),
+				OrganisationRoles.learnresourcemanager.name(), GroupRoles.owner.name())) {
 			canDownload = true;
 		} else if(!isAuthor(request)) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
diff --git a/src/main/java/org/olat/restapi/repository/course/CourseWebService.java b/src/main/java/org/olat/restapi/repository/course/CourseWebService.java
index 33236ad7010..868c6e6df55 100644
--- a/src/main/java/org/olat/restapi/repository/course/CourseWebService.java
+++ b/src/main/java/org/olat/restapi/repository/course/CourseWebService.java
@@ -52,7 +52,6 @@ import javax.ws.rs.core.Response.Status;
 
 import org.olat.admin.securitygroup.gui.IdentitiesAddEvent;
 import org.olat.basesecurity.BaseSecurity;
-import org.olat.basesecurity.BaseSecurityManager;
 import org.olat.basesecurity.GroupRoles;
 import org.olat.basesecurity.OrganisationRoles;
 import org.olat.basesecurity.OrganisationService;
@@ -100,6 +99,7 @@ import org.olat.restapi.support.vo.OlatResourceVO;
 import org.olat.user.restapi.UserVO;
 import org.olat.user.restapi.UserVOFactory;
 import org.olat.util.logging.activity.LoggingResourceable;
+import org.springframework.beans.factory.annotation.Autowired;
 
 import com.thoughtworks.xstream.XStream;
 
@@ -118,11 +118,27 @@ public class CourseWebService {
 	private static final XStream myXStream = XStreamHelper.createXStreamInstance();
 
 	
-	public static CacheControl cc = new CacheControl();
+	public static final CacheControl cc = new CacheControl();
 	static {
 		cc.setMaxAge(-1);
 	}
 	
+	@Autowired
+	private BaseSecurity securityManager;
+	@Autowired
+	private CalendarModule calendarModule;
+	@Autowired
+	private RepositoryService repositoryService;
+	@Autowired
+	private RepositoryManager repositoryManager;
+	@Autowired
+	private OLATResourceManager resourceManager;
+	@Autowired
+	private OrganisationService organisationService;
+	@Autowired
+	private RepositoryHandlerFactory repositoryHandlerFactory;
+
+	
 	private final ICourse course;
 	private final OLATResource courseOres;
 	
@@ -133,13 +149,12 @@ public class CourseWebService {
 	
 	@Path("groups")
 	public CourseGroupWebService getCourseGroupWebService() {
-		RepositoryEntry re = RepositoryManager.getInstance().lookupRepositoryEntry(courseOres, false);
+		RepositoryEntry re = repositoryManager.lookupRepositoryEntry(courseOres, false);
 		return new CourseGroupWebService(re, courseOres);
 	}
 	
 	@Path("calendar")
 	public CalWebService getCourseCalendarWebService(@Context HttpServletRequest request) {
-		CalendarModule calendarModule = CoreSpringFactory.getImpl(CalendarModule.class);
 		if(calendarModule.isEnabled()
 				&& (calendarModule.isEnableCourseToolCalendar() || calendarModule.isEnableCourseElementCalendar())
 				&& course.getCourseConfig().isCalendarEnabled()) {
@@ -211,7 +226,7 @@ public class CourseWebService {
 		}
 		
 		int newAccess = access == null ? RepositoryEntry.ACC_USERS : access.intValue();
-		boolean members = membersOnly == null ? false : membersOnly.booleanValue();
+		boolean members = membersOnly != null && membersOnly.booleanValue();
 		CourseFactory.publishCourse(course, newAccess, members, ureq.getIdentity(), locale);
 		CourseVO vo = ObjectFactory.get(course);
 		return Response.ok(vo).build();
@@ -259,20 +274,19 @@ public class CourseWebService {
 	@Path("file")
 	@Produces({ "application/zip", MediaType.APPLICATION_OCTET_STREAM })
 	public Response getRepoFileById(@Context HttpServletRequest request) {
-		RepositoryService rs = CoreSpringFactory.getImpl(RepositoryService.class);
 		RepositoryEntry re = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
 		if (re == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
 		
-		RepositoryHandler typeToDownload = RepositoryHandlerFactory.getInstance().getRepositoryHandler(re);
+		RepositoryHandler typeToDownload = repositoryHandlerFactory.getRepositoryHandler(re);
 		if (typeToDownload == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
 		
 		Identity identity = getIdentity(request);
 		boolean canDownload = re.getCanDownload() && typeToDownload.supportsDownload();
-		if (isAdmin(request) || RepositoryManager.getInstance().isOwnerOfRepositoryEntry(identity, re)) {
+		if (isAdmin(request) || repositoryService.hasRole(identity, re, GroupRoles.owner.name())) {
 			canDownload = true;
 		} else if(!isAuthor(request)) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
@@ -281,7 +295,7 @@ public class CourseWebService {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 
-		OLATResource ores = OLATResourceManager.getInstance().findResourceable(re.getOlatResource());
+		OLATResource ores = resourceManager.findResourceable(re.getOlatResource());
 		if (ores == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
@@ -293,7 +307,7 @@ public class CourseWebService {
 			if (lockResult == null || (lockResult.isSuccess() && !isAlreadyLocked)) {
 				MediaResource mr = typeToDownload.getAsMediaResource(ores, false);
 				if (mr != null) {
-					rs.incrementDownloadCounter(re);
+					repositoryService.incrementDownloadCounter(re);
 					return Response.ok(mr.getInputStream()).cacheControl(cc).build(); // success
 				} else {
 					return Response.serverError().status(Status.NO_CONTENT).build();
@@ -321,17 +335,13 @@ public class CourseWebService {
 	@DELETE
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	public Response deleteCourse(@Context HttpServletRequest request) {
-		if(!isAuthor(request)) {
-			return Response.serverError().status(Status.UNAUTHORIZED).build();
-		} else if (!isAuthorEditor(course, request) && !isInstitutionalResourceManager(request)) {
+		if(!isAuthor(request) && !isAuthorEditor(course, request) && !isInstitutionalResourceManager(request)) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 		
 		UserRequest ureq = getUserRequest(request);
-		RepositoryService rs = CoreSpringFactory.getImpl(RepositoryService.class);
 		RepositoryEntry re = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
-		
-		ErrorList errors = rs.deletePermanently(re, ureq.getIdentity(), ureq.getUserSession().getRoles(), ureq.getLocale());
+		ErrorList errors = repositoryService.deletePermanently(re, ureq.getIdentity(), ureq.getUserSession().getRoles(), ureq.getLocale());
 		if(errors.hasErrors()) {
 			return Response.serverError().status(500).build();
 		}
@@ -361,37 +371,34 @@ public class CourseWebService {
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	@Path("status")
 	public Response deleteCoursePermanently(@FormParam("newStatus") String newStatus, @Context HttpServletRequest request) {
-		if(!isAuthor(request)) {
-			return Response.serverError().status(Status.UNAUTHORIZED).build();
-		} else if (!isAuthorEditor(course, request) && !isInstitutionalResourceManager(request)) {
+		if(!isAuthor(request) && !isAuthorEditor(course, request) && !isInstitutionalResourceManager(request)) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 		
-		RepositoryService rs = CoreSpringFactory.getImpl(RepositoryService.class);
 		RepositoryEntry re = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
 		if("closed".equals(newStatus)) {
-			rs.closeRepositoryEntry(re);
+			repositoryService.closeRepositoryEntry(re);
 			log.audit("REST closing course: " + re.getDisplayname() + " [" + re.getKey() + "]");
 			ThreadLocalUserActivityLogger.log(LearningResourceLoggingAction.LEARNING_RESOURCE_CLOSE, getClass(),
 					LoggingResourceable.wrap(re, OlatResourceableType.genRepoEntry));
 		} else if("unclosed".equals(newStatus)) {
-			rs.uncloseRepositoryEntry(re);
+			repositoryService.uncloseRepositoryEntry(re);
 			log.audit("REST unclosing course: " + re.getDisplayname() + " [" + re.getKey() + "]");
 			ThreadLocalUserActivityLogger.log(LearningResourceLoggingAction.LEARNING_RESOURCE_UPDATE, getClass(),
 					LoggingResourceable.wrap(re, OlatResourceableType.genRepoEntry));
 		} else if("unpublished".equals(newStatus)) {
-			rs.unpublishRepositoryEntry(re);
+			repositoryService.unpublishRepositoryEntry(re);
 			log.audit("REST unpublishing course: " + re.getDisplayname() + " [" + re.getKey() + "]");
 			ThreadLocalUserActivityLogger.log(LearningResourceLoggingAction.LEARNING_RESOURCE_DEACTIVATE, getClass(),
 					LoggingResourceable.wrap(re, OlatResourceableType.genRepoEntry));
 		} else if("deleted".equals(newStatus)) {
 			Identity identity = getIdentity(request);
-			rs.deleteSoftly(re, identity, true);
+			repositoryService.deleteSoftly(re, identity, true);
 			log.audit("REST deleting (soft) course: " + re.getDisplayname() + " [" + re.getKey() + "]");
 			ThreadLocalUserActivityLogger.log(LearningResourceLoggingAction.LEARNING_RESOURCE_TRASH, getClass(),
 					LoggingResourceable.wrap(re, OlatResourceableType.genRepoEntry));
 		} else if("restored".equals(newStatus)) {
-			rs.restoreRepositoryEntry(re);
+			repositoryService.restoreRepositoryEntry(re);
 			log.audit("REST restoring course: " + re.getDisplayname() + " [" + re.getKey() + "]");
 			ThreadLocalUserActivityLogger.log(LearningResourceLoggingAction.LEARNING_RESOURCE_RESTORE, getClass(),
 					LoggingResourceable.wrap(re, OlatResourceableType.genRepoEntry));
@@ -415,9 +422,7 @@ public class CourseWebService {
 	@Path("configuration")
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	public Response getConfiguration(@Context HttpServletRequest request) {
-		if(!isAuthor(request)) {
-			return Response.serverError().status(Status.UNAUTHORIZED).build();
-		} else if (!isAuthorEditor(course, request) && !isInstitutionalResourceManager(request)) {
+		if(!isAuthor(request) && !isAuthorEditor(course, request) && !isInstitutionalResourceManager(request)) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 		CourseConfigVO vo = ObjectFactory.getConfig(course);
@@ -560,7 +565,6 @@ public class CourseWebService {
 		}
 		
 		RepositoryEntry repositoryEntry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
-		RepositoryService repositoryService = CoreSpringFactory.getImpl(RepositoryService.class);
 		List<Identity> owners = repositoryService.getMembers(repositoryEntry, GroupRoles.owner.name());
 		
 		int count = 0;
@@ -590,7 +594,6 @@ public class CourseWebService {
 		}
 		
 		RepositoryEntry repositoryEntry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
-		RepositoryService repositoryService = CoreSpringFactory.getImpl(RepositoryService.class);
 		List<Identity> coachList = repositoryService.getMembers(repositoryEntry, GroupRoles.coach.name());
 		
 		int count = 0;
@@ -620,7 +623,6 @@ public class CourseWebService {
 		}
 		
 		RepositoryEntry repositoryEntry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
-		RepositoryService repositoryService = CoreSpringFactory.getImpl(RepositoryService.class);
 		List<Identity> participantList = repositoryService.getMembers(repositoryEntry, GroupRoles.participant.name());
 		
 		int count = 0;
@@ -651,12 +653,7 @@ public class CourseWebService {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 		
-		RepositoryService repositoryService = CoreSpringFactory.getImpl(RepositoryService.class);
 		RepositoryEntry repositoryEntry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
-		
-		BaseSecurity securityManager = CoreSpringFactory.getImpl(BaseSecurity.class);
-		OrganisationService organisationService = CoreSpringFactory.getImpl(OrganisationService.class);
-
 		Identity author = securityManager.loadIdentityByKey(identityKey, false);
 		if(repositoryService.hasRole(author, repositoryEntry, GroupRoles.owner.name()) &&
 				organisationService.hasRole(author, OrganisationRoles.author)) {
@@ -683,14 +680,12 @@ public class CourseWebService {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 
-		BaseSecurity securityManager = CoreSpringFactory.getImpl(BaseSecurity.class);
 		Identity author = securityManager.loadIdentityByKey(identityKey, false);
 		if(author == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
 		
 		Identity identity = getIdentity(httpRequest);
-		OrganisationService organisationService = CoreSpringFactory.getImpl(OrganisationService.class);
 		boolean hasBeenAuthor = organisationService.hasRole(author, OrganisationRoles.author);
 		if(!hasBeenAuthor) {
 			//not an author already, add this identity to the security group "authors"
@@ -699,11 +694,10 @@ public class CourseWebService {
 		}
 		
 		//add the author as owner of the course
-		RepositoryManager rm = RepositoryManager.getInstance();
 		RepositoryEntry repositoryEntry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
 		List<Identity> authors = Collections.singletonList(author);
 		IdentitiesAddEvent identitiesAddedEvent = new IdentitiesAddEvent(authors);
-		rm.addOwners(identity, identitiesAddedEvent, repositoryEntry, new MailPackage(false));
+		repositoryManager.addOwners(identity, identitiesAddedEvent, repositoryEntry, new MailPackage(false));
 		
 		return Response.ok().build();
 	}
@@ -716,8 +710,6 @@ public class CourseWebService {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 
-		OrganisationService organisationService = CoreSpringFactory.getImpl(OrganisationService.class);
-		
 		List<Identity> authorList = loadIdentities(authors);
 		Identity identity = getIdentity(httpRequest);
 
@@ -733,7 +725,7 @@ public class CourseWebService {
 		//add the author as owner of the course
 		RepositoryEntry repositoryEntry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
 		IdentitiesAddEvent identitiesAddedEvent = new IdentitiesAddEvent(authorList);
-		RepositoryManager.getInstance().addOwners(identity, identitiesAddedEvent, repositoryEntry, new MailPackage(false));
+		repositoryManager.addOwners(identity, identitiesAddedEvent, repositoryEntry, new MailPackage(false));
 		return Response.ok().build();
 	}
 	
@@ -754,7 +746,6 @@ public class CourseWebService {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 		
-		BaseSecurity securityManager = BaseSecurityManager.getInstance();
 		Identity author = securityManager.loadIdentityByKey(identityKey, false);
 		if(author == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
@@ -763,10 +754,9 @@ public class CourseWebService {
 		Identity identity = getIdentity(httpRequest);
 		
 		//remove the author as owner of the course
-		RepositoryManager rm = RepositoryManager.getInstance();
 		RepositoryEntry repositoryEntry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
 		List<Identity> authors = Collections.singletonList(author);
-		rm.removeOwners(identity, authors, repositoryEntry, new MailPackage(false));
+		repositoryManager.removeOwners(identity, authors, repositoryEntry, new MailPackage(false));
 		return Response.ok().build();
 	}
 	
@@ -787,7 +777,6 @@ public class CourseWebService {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 
-		BaseSecurity securityManager = BaseSecurityManager.getInstance();
 		Identity tutor = securityManager.loadIdentityByKey(identityKey, false);
 		if(tutor == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
@@ -797,12 +786,10 @@ public class CourseWebService {
 		UserRequest ureq = getUserRequest(httpRequest);
 		
 		//add the author as owner of the course
-		RepositoryManager rm = RepositoryManager.getInstance();
 		RepositoryEntry repositoryEntry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
 		List<Identity> tutors = Collections.singletonList(tutor);
 		IdentitiesAddEvent iae = new IdentitiesAddEvent(tutors);
-		rm.addTutors(identity, ureq.getUserSession().getRoles(), iae, repositoryEntry, new MailPackage(false));
-		
+		repositoryManager.addTutors(identity, ureq.getUserSession().getRoles(), iae, repositoryEntry, new MailPackage(false));
 		return Response.ok().build();
 	}
 	
@@ -819,10 +806,9 @@ public class CourseWebService {
 		UserRequest ureq = getUserRequest(httpRequest);
 		
 		//add the author as owner of the course
-		RepositoryManager rm = RepositoryManager.getInstance();
 		RepositoryEntry repositoryEntry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
 		IdentitiesAddEvent iae = new IdentitiesAddEvent(coachList);
-		rm.addTutors(identity, ureq.getUserSession().getRoles(), iae, repositoryEntry, new MailPackage(false));
+		repositoryManager.addTutors(identity, ureq.getUserSession().getRoles(), iae, repositoryEntry, new MailPackage(false));
 		return Response.ok().build();
 	}
 	
@@ -843,7 +829,6 @@ public class CourseWebService {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 		
-		BaseSecurity securityManager = BaseSecurityManager.getInstance();
 		Identity coach = securityManager.loadIdentityByKey(identityKey, false);
 		if(coach == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
@@ -852,10 +837,9 @@ public class CourseWebService {
 		Identity identity = getIdentity(httpRequest);
 		
 		//remove the user as coach of the course
-		RepositoryManager rm = RepositoryManager.getInstance();
 		RepositoryEntry repositoryEntry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
 		List<Identity> coaches = Collections.singletonList(coach);
-		rm.removeTutors(identity, coaches, repositoryEntry, new MailPackage(false));
+		repositoryManager.removeTutors(identity, coaches, repositoryEntry, new MailPackage(false));
 		return Response.ok().build();
 	}
 	
@@ -876,7 +860,6 @@ public class CourseWebService {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 
-		BaseSecurity securityManager = BaseSecurityManager.getInstance();
 		Identity participant = securityManager.loadIdentityByKey(identityKey, false);
 		if(participant == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
@@ -886,12 +869,10 @@ public class CourseWebService {
 		UserRequest ureq = getUserRequest(httpRequest);
 		
 		//add the author as owner of the course
-		RepositoryManager rm = RepositoryManager.getInstance();
 		RepositoryEntry repositoryEntry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
 		List<Identity> participants = Collections.singletonList(participant);
 		IdentitiesAddEvent iae = new IdentitiesAddEvent(participants);
-		rm.addParticipants(identity, ureq.getUserSession().getRoles(), iae, repositoryEntry, new MailPackage(false));
-		
+		repositoryManager.addParticipants(identity, ureq.getUserSession().getRoles(), iae, repositoryEntry, new MailPackage(false));
 		return Response.ok().build();
 	}
 	
@@ -918,10 +899,9 @@ public class CourseWebService {
 		UserRequest ureq = getUserRequest(httpRequest);
 		
 		//add the participants to the course
-		RepositoryManager rm = RepositoryManager.getInstance();
 		RepositoryEntry repositoryEntry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
 		IdentitiesAddEvent iae = new IdentitiesAddEvent(participantList);
-		rm.addParticipants(identity, ureq.getUserSession().getRoles(), iae, repositoryEntry, new MailPackage(false));
+		repositoryManager.addParticipants(identity, ureq.getUserSession().getRoles(), iae, repositoryEntry, new MailPackage(false));
 		return Response.ok().build();
 	}
 	
@@ -942,7 +922,6 @@ public class CourseWebService {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 		
-		BaseSecurity securityManager = BaseSecurityManager.getInstance();
 		Identity participant = securityManager.loadIdentityByKey(identityKey, false);
 		if(participant == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
@@ -951,10 +930,9 @@ public class CourseWebService {
 		Identity identity = getIdentity(httpRequest);
 		
 		//remove the user as participant of the course
-		RepositoryManager rm = RepositoryManager.getInstance();
 		RepositoryEntry repositoryEntry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
 		List<Identity> participants = Collections.singletonList(participant);
-		rm.removeParticipants(identity, participants, repositoryEntry, new MailPackage(false), false);
+		repositoryManager.removeParticipants(identity, participants, repositoryEntry, new MailPackage(false), false);
 		return Response.ok().build();
 	}
 	
@@ -963,7 +941,7 @@ public class CourseWebService {
 		for(UserVO user:users) {
 			identityKeys.add(user.getKey());
 		}
-		return BaseSecurityManager.getInstance().loadIdentityByKeys(identityKeys);
+		return securityManager.loadIdentityByKeys(identityKeys);
 	}
 	
 	public static boolean isCourseAccessible(ICourse course, boolean authorRightsMandatory, HttpServletRequest request) {
@@ -978,9 +956,6 @@ public class CourseWebService {
 		RepositoryEntry entry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
 		ACService acManager = CoreSpringFactory.getImpl(ACService.class);
 		AccessResult result = acManager.isAccessible(entry, identity, false);
-		if(result.isAccessible()) {
-			return true;
-		}
-		return false;
+		return result.isAccessible();
 	}
 }
diff --git a/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java b/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java
index 343d682eb24..22ccbc01986 100644
--- a/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java
+++ b/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java
@@ -202,7 +202,7 @@ public class CoursesWebService {
 			try {
 				ICourse course = loadCourse(repoEntry.getOlatResource().getResourceableId());
 				voList.add(ObjectFactory.get(repoEntry, course));
-				if(count % 33 == 0) {
+				if(count++ % 33 == 0) {
 					dbInstance.commitAndCloseSession();
 				}
 			} catch (Exception e) {
@@ -263,7 +263,7 @@ public class CoursesWebService {
 		configVO.setSharedFolderSoftKey(sharedFolderSoftKey);
 
 		int accessInt = (access == null ? RepositoryEntry.ACC_OWNERS : access.intValue());
-		boolean membersOnlyBool = (membersOnly == null ? false : membersOnly.booleanValue());
+		boolean membersOnlyBool = membersOnly != null && membersOnly.booleanValue();
 		if(!StringHelper.containsNonWhitespace(displayName)) {
 			displayName = shortTitle;
 		}
@@ -527,10 +527,6 @@ public class CoursesWebService {
 
 			// copy image if available
 			repositoryManager.copyImage(src, preparedEntry);
-			
-			
-			
-
 			ICourse course = prepareCourse(preparedEntry,shortTitle, longTitle, courseConfigVO);
 			handlerFactory.getRepositoryHandler(src).releaseLock(lockResult);
 			return course;
diff --git a/src/main/java/org/olat/restapi/security/RestApiLoginFilter.java b/src/main/java/org/olat/restapi/security/RestApiLoginFilter.java
index 93020fffb64..fd48fcfc2c3 100644
--- a/src/main/java/org/olat/restapi/security/RestApiLoginFilter.java
+++ b/src/main/java/org/olat/restapi/security/RestApiLoginFilter.java
@@ -94,8 +94,6 @@ public class RestApiLoginFilter implements Filter {
 		//
 	}
 
-
-
 	@Override
 	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
 	throws ServletException {
@@ -313,17 +311,17 @@ public class RestApiLoginFilter implements Filter {
 	}
 
 	private void upgradeIpAuthentication(HttpServletRequest request, HttpServletResponse response)
-	throws IOException, ServletException {
+	throws IOException {
 		UserSessionManager sessionManager = CoreSpringFactory.getImpl(UserSessionManager.class);
 		UserSession usess = sessionManager.getUserSessionIfAlreadySet(request);
 		if(usess == null) {
 			usess = sessionManager.getUserSession(request.getSession(true));
 		}
 		if(usess.getIdentity() == null) {
-			usess.setRoles(new Roles(false, false, false, false, false, false, false));
+			usess.setRoles(Roles.userRoles());
 
 			String remoteAddr = request.getRemoteAddr();
-			SessionInfo sinfo = new SessionInfo(new Long(-1), "REST", request.getSession());
+			SessionInfo sinfo = new SessionInfo(Long.valueOf(-1), "REST", request.getSession());
 			sinfo.setFirstname("REST");
 			sinfo.setLastname(remoteAddr);
 			sinfo.setFromIP(remoteAddr);
@@ -406,7 +404,7 @@ public class RestApiLoginFilter implements Filter {
 				try {
 					chain.doFilter(request, response);
 				} catch (Exception e) {
-					e.printStackTrace();
+					log.error("", e);
 				}
 			}
 		} else {
@@ -463,7 +461,7 @@ public class RestApiLoginFilter implements Filter {
 	private List<String> getIPProtectedURIs() {
 		if(ipProtectedUrls == null && isWebappHelperInitiated()) {
 			String context = (Settings.isJUnitTest() ? "/olat" : WebappHelper.getServletContextPath() + RestSecurityHelper.SUB_CONTEXT);
-			List<String > urls  = new ArrayList<String>();
+			List<String > urls  = new ArrayList<>();
 			urls.add(context + "/system");
 			ipProtectedUrls = urls;
 		}
diff --git a/src/main/java/org/olat/restapi/security/RestSecurityHelper.java b/src/main/java/org/olat/restapi/security/RestSecurityHelper.java
index 71e87409b08..1358fc9ef14 100644
--- a/src/main/java/org/olat/restapi/security/RestSecurityHelper.java
+++ b/src/main/java/org/olat/restapi/security/RestSecurityHelper.java
@@ -30,6 +30,8 @@ import java.util.UUID;
 import javax.servlet.http.HttpServletRequest;
 
 import org.olat.basesecurity.BaseSecurityManager;
+import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.id.Identity;
@@ -41,7 +43,7 @@ import org.olat.course.groupsandrights.CourseGroupManager;
 import org.olat.course.groupsandrights.CourseRights;
 import org.olat.dispatcher.LocaleNegotiator;
 import org.olat.repository.RepositoryEntry;
-import org.olat.repository.RepositoryManager;
+import org.olat.repository.RepositoryService;
 
 /**
  * 
@@ -75,7 +77,7 @@ public class RestSecurityHelper {
 	public static boolean isUserManager(HttpServletRequest request) {
 		try {
 			Roles roles = getRoles(request);
-			return (roles.isUserManager() || roles.isOLATAdmin());
+			return (roles.isUserManager() || roles.isRolesManager() || roles.isAdministrator());
 		} catch (Exception e) {
 			return false;
 		}
@@ -84,7 +86,7 @@ public class RestSecurityHelper {
 	public static boolean isCurriculumManager(HttpServletRequest request) {
 		try {
 			Roles roles = getRoles(request);
-			return (roles.isCurriculumManager() || roles.isOLATAdmin());
+			return (roles.isCurriculumManager() || roles.isAdministrator());
 		} catch (Exception e) {
 			return false;
 		}
@@ -93,7 +95,7 @@ public class RestSecurityHelper {
 	public static boolean isGroupManager(HttpServletRequest request) {
 		try {
 			Roles roles = getRoles(request);
-			return (roles.isGroupManager() || roles.isOLATAdmin());
+			return (roles.isGroupManager() || roles.isAdministrator());
 		} catch (Exception e) {
 			return false;
 		}
@@ -102,7 +104,7 @@ public class RestSecurityHelper {
 	public static boolean isAuthor(HttpServletRequest request) {
 		try {
 			Roles roles = getRoles(request);
-			return (roles.isAuthor() || roles.isOLATAdmin() || roles.isLearnResourceManager());
+			return (roles.isAuthor() || roles.isAdministrator() || roles.isLearnResourceManager());
 		} catch (Exception e) {
 			return false;
 		}
@@ -110,15 +112,9 @@ public class RestSecurityHelper {
 	
 	public static boolean isAuthorEditor(ICourse course, HttpServletRequest request) {
 		try {
-			Roles roles = getRoles(request);
-			if(roles.isOLATAdmin()) return true;
-			if(roles.isAuthor()) {
-				UserRequest ureq = getUserRequest(request);
-				Identity identity = ureq.getIdentity();
-				CourseGroupManager cgm = course.getCourseEnvironment().getCourseGroupManager();
-				return cgm.isIdentityCourseAdministrator(identity) || cgm.hasRight(identity, CourseRights.RIGHT_COURSEEDITOR);
-			}
-			return false;
+			Identity identity = getUserRequest(request).getIdentity();
+			CourseGroupManager cgm = course.getCourseEnvironment().getCourseGroupManager();
+			return isAuthorEditor(cgm.getCourseEntry(), request) || cgm.hasRight(identity, CourseRights.RIGHT_COURSEEDITOR);
 		} catch (Exception e) {
 			return false;
 		}
@@ -126,15 +122,10 @@ public class RestSecurityHelper {
 	
 	public static boolean isAuthorEditor(RepositoryEntry entry, HttpServletRequest request) {
 		try {
-			Roles roles = getRoles(request);
-			if(roles.isOLATAdmin()) return true;
-			if(roles.isAuthor()) {
-				UserRequest ureq = getUserRequest(request);
-				Identity identity = ureq.getIdentity();
-				RepositoryManager rm = CoreSpringFactory.getImpl(RepositoryManager.class);
-				return rm.isOwnerOfRepositoryEntry(identity, entry) || rm.isLearnResourceManagerFor(roles, entry);
-			}
-			return false;
+			Identity identity = getUserRequest(request).getIdentity();
+			RepositoryService rm = CoreSpringFactory.getImpl(RepositoryService.class);
+			return rm.hasRoleExpanded(identity, entry, OrganisationRoles.administrator.name(),
+					OrganisationRoles.learnresourcemanager.name(), GroupRoles.owner.name());
 		} catch (Exception e) {
 			return false;
 		}
@@ -143,7 +134,7 @@ public class RestSecurityHelper {
 	public static boolean isAuthorGrpManager(ICourse course, HttpServletRequest request) {
 		try {
 			Roles roles = getRoles(request);
-			if(roles.isOLATAdmin()) return true;
+			if(roles.isAdministrator()) return true;
 			if(roles.isAuthor()) {
 				UserRequest ureq = getUserRequest(request);
 				Identity identity = ureq.getIdentity();
@@ -159,7 +150,7 @@ public class RestSecurityHelper {
 	public static boolean isInstitutionalResourceManager(HttpServletRequest request) {
 		try {
 			Roles roles = getRoles(request);
-			return (roles.isLearnResourceManager() || roles.isOLATAdmin());
+			return (roles.isLearnResourceManager() || roles.isAdministrator());
 		} catch (Exception e) {
 			return false;
 		}
@@ -168,7 +159,7 @@ public class RestSecurityHelper {
 	public static boolean isQuestionPoolManager(HttpServletRequest request) {
 		try {
 			Roles roles = getRoles(request);
-			return (roles.isQPoolManager() || roles.isOLATAdmin());
+			return (roles.isPoolManager() || roles.isAdministrator());
 		} catch (Exception e) {
 			return false;
 		}
@@ -177,7 +168,7 @@ public class RestSecurityHelper {
 	public static boolean isAdmin(HttpServletRequest request) {
 		try {
 			Roles roles = getRoles(request);
-			return roles.isOLATAdmin();
+			return roles.isAdministrator();
 		} catch (Exception e) {
 			return false;
 		}
@@ -186,7 +177,7 @@ public class RestSecurityHelper {
 	public static boolean isAdminOrSystem(HttpServletRequest request) {
 		try {
 			Roles roles = getRoles(request);
-			if(roles.isOLATAdmin()) {
+			if(roles.isAdministrator()) {
 				return true;
 			}
 			UserRequest ureq = (UserRequest)request.getAttribute(SEC_USER_REQUEST);
@@ -201,7 +192,7 @@ public class RestSecurityHelper {
 		UserRequest ureq= (UserRequest)request.getAttribute(SEC_USER_REQUEST);
 		if(ureq == null || ureq.getUserSession() == null || ureq.getUserSession().getRoles() == null) {
 			//guest roles
-			return new Roles(false, false, false, false, true, false, false);
+			return Roles.guestRoles();
 		}
 		return ureq.getUserSession().getRoles();
 	}
diff --git a/src/main/java/org/olat/search/SearchModule.java b/src/main/java/org/olat/search/SearchModule.java
index 741b43303e4..1ece537d8ec 100644
--- a/src/main/java/org/olat/search/SearchModule.java
+++ b/src/main/java/org/olat/search/SearchModule.java
@@ -56,12 +56,12 @@ public class SearchModule extends AbstractSpringModule {
 	private static final OLog log = Tracing.createLoggerFor(SearchModule.class);
 	
 	// Definitions config parameter names in module-config
-	public final static String CONF_SEARCH_SERVICE = "searchService";
-	public final static String CONF_INDEX_PATH = "indexPath";
-	public final static String CONF_PERMANENT_INDEX_PATH = "permanentIndexPath";
-	public final static String CONF_TEMP_INDEX_PATH = "tempIndexPath";
-	public final static String CONF_TEMP_SPELL_CHECK_PATH = "tempSpellCheckPath";
-	public final static String CONF_GENERATE_AT_STARTUP = "generateIndexAtStartup";
+	public static final String CONF_SEARCH_SERVICE = "searchService";
+	public static final String CONF_INDEX_PATH = "indexPath";
+	public static final String CONF_PERMANENT_INDEX_PATH = "permanentIndexPath";
+	public static final String CONF_TEMP_INDEX_PATH = "tempIndexPath";
+	public static final String CONF_TEMP_SPELL_CHECK_PATH = "tempSpellCheckPath";
+	public static final String CONF_GENERATE_AT_STARTUP = "generateIndexAtStartup";
 	private static final String CONF_PPT_FILE_ENABLED = "pptFileEnabled";
 	private static final String CONF_EXCEL_FILE_ENABLED = "excelFileEnabled";
 	private static final String CONF_PDF_FILE_ENABLED = "pdfFileEnabled";
@@ -173,7 +173,7 @@ public class SearchModule extends AbstractSpringModule {
 		if(StringHelper.containsNonWhitespace(blackList)) {
 			String[] files = blackList.split(",");
 			if(customFileBlackList == null) {
-				customFileBlackList = new ArrayList<String>();
+				customFileBlackList = new ArrayList<>();
 			} else {
 				customFileBlackList.clear();
 			}
@@ -292,7 +292,7 @@ public class SearchModule extends AbstractSpringModule {
 	 * @return Space seperated list of non indexed files.
 	 */
 	public List<String> getFileBlackList() {
-		List<String> list = new ArrayList<String>();
+		List<String> list = new ArrayList<>();
 		if(fileBlackList != null) {
 			list.addAll(fileBlackList);
 		}
diff --git a/src/main/java/org/olat/search/_spring/searchContext.xml b/src/main/java/org/olat/search/_spring/searchContext.xml
index a5a5e32a0c2..c71cbbaaeb1 100644
--- a/src/main/java/org/olat/search/_spring/searchContext.xml
+++ b/src/main/java/org/olat/search/_spring/searchContext.xml
@@ -141,6 +141,7 @@
 	<!-- Repository -->
 	<bean id="repositoryIndexer" class="org.olat.search.service.indexer.repository.RepositoryIndexer">
 		<property name="repositoryManager" ref="repositoryManager" />
+		<property name="repositoryService" ref="repositoryService" />
 		<property name="searchModule" ref="searchModule" />
 		<property name="repositoryEntryDocumentFactory" ref="repositoryEntryDocumentFactory" />
 		<property name="dbInstance" ref="database" />
diff --git a/src/main/java/org/olat/search/service/indexer/identity/UserManagerSecurityCallback.java b/src/main/java/org/olat/search/service/indexer/identity/UserManagerSecurityCallback.java
index 35baf129c29..dfde1951c72 100644
--- a/src/main/java/org/olat/search/service/indexer/identity/UserManagerSecurityCallback.java
+++ b/src/main/java/org/olat/search/service/indexer/identity/UserManagerSecurityCallback.java
@@ -37,6 +37,6 @@ public class UserManagerSecurityCallback implements IndexerAccessSecurityCallbac
 
 	@Override
 	public boolean checkAccess(ContextEntry contextEntry, BusinessControl businessControl, Identity identity, Roles roles) {
-		return roles.isOLATAdmin() || roles.isUserManager();
+		return roles.isAdministrator() || roles.isUserManager() || roles.isRolesManager();
 	}
 }
diff --git a/src/main/java/org/olat/search/service/indexer/repository/RepositoryIndexer.java b/src/main/java/org/olat/search/service/indexer/repository/RepositoryIndexer.java
index 500d74fcd37..ba9a29e90bc 100644
--- a/src/main/java/org/olat/search/service/indexer/repository/RepositoryIndexer.java
+++ b/src/main/java/org/olat/search/service/indexer/repository/RepositoryIndexer.java
@@ -30,6 +30,8 @@ import java.io.IOException;
 import java.util.List;
 
 import org.apache.lucene.document.Document;
+import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.id.Identity;
@@ -41,6 +43,7 @@ import org.olat.core.logging.AssertException;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
+import org.olat.repository.RepositoryService;
 import org.olat.repository.manager.RepositoryEntryDocumentFactory;
 import org.olat.repository.model.SearchRepositoryEntryParameters;
 import org.olat.resource.accesscontrol.ACService;
@@ -64,6 +67,7 @@ public class RepositoryIndexer extends AbstractHierarchicalIndexer {
 	private static final int BATCH_SIZE = 100;
 	
 	private DB dbInstance;
+	private RepositoryService repositoryService;
 	private RepositoryManager repositoryManager;
 	private RepositoryEntryDocumentFactory documentFactory;
 	
@@ -94,6 +98,13 @@ public class RepositoryIndexer extends AbstractHierarchicalIndexer {
 		this.repositoryManager = repositoryManager;
 	}
 	
+	/**
+	 * [used by spring]
+	 */
+	public void setRepositoryService(RepositoryService repositoryService) {
+		this.repositoryService = repositoryService;
+	}
+
 	/**
 	 * [used by spring]
 	 */
@@ -108,7 +119,7 @@ public class RepositoryIndexer extends AbstractHierarchicalIndexer {
     */
 	@Override
 	public void doIndex(SearchResourceContext parentResourceContext, Object businessObj, OlatFullIndexer indexWriter) throws IOException,InterruptedException {
-		final Roles roles = new Roles(true, true, true, true, false, true, false);
+		final Roles roles = Roles.administratorRoles();
 
 		final SearchRepositoryEntryParameters params = new SearchRepositoryEntryParameters();
 		params.setRoles(roles);
@@ -186,34 +197,28 @@ public class RepositoryIndexer extends AbstractHierarchicalIndexer {
 		return repositoryBlackList.contains(key);
 	}
 
-	/**
-	 * 
-	 * @see org.olat.search.service.indexer.Indexer#getSupportedTypeName()
-	 */
+	@Override
 	public String getSupportedTypeName() {
 		return OresHelper.calculateTypeName(RepositoryEntry.class);
 	}
 
-	/**
-	 * 
-	 * @see org.olat.search.service.indexer.Indexer#checkAccess(org.olat.core.id.context.ContextEntry, org.olat.core.id.context.BusinessControl, org.olat.core.id.Identity, org.olat.core.id.Roles)
-	 */
 	@Override
 	public boolean checkAccess(ContextEntry contextEntry, BusinessControl businessControl, Identity identity, Roles roles) {
 		boolean debug = isLogDebugEnabled();
 		if (debug) logDebug("checkAccess for businessControl=" + businessControl + "  identity=" + identity + "  roles=" + roles);
+		
 		Long repositoryKey = contextEntry.getOLATResourceable().getResourceableId();
 		RepositoryEntry repositoryEntry = repositoryManager.lookupRepositoryEntry(repositoryKey);
 		if (repositoryEntry == null) {
 			return false;
 		}
-		if(roles.isGuestOnly()) {
-			if(repositoryEntry.getAccess() != RepositoryEntry.ACC_USERS_GUESTS) {
-				return false;
-			}
+		if(roles.isGuestOnly() && repositoryEntry.getAccess() != RepositoryEntry.ACC_USERS_GUESTS) {
+			return false;
 		}
 			
-		boolean isOwner = repositoryManager.isOwnerOfRepositoryEntry(identity,repositoryEntry);
+		boolean isOwner = repositoryService.hasRoleExpanded(identity, repositoryEntry,
+				OrganisationRoles.administrator.name(), OrganisationRoles.learnresourcemanager.name(),
+				GroupRoles.owner.name());
 		boolean isAllowedToLaunch = false;
 		if (!isOwner) {
 			isAllowedToLaunch = repositoryManager.isAllowedToLaunch(identity, roles, repositoryEntry);
diff --git a/src/main/java/org/olat/search/service/searcher/SearchResultsImpl.java b/src/main/java/org/olat/search/service/searcher/SearchResultsImpl.java
index f2e5c23fa2d..3af1a4b5e08 100644
--- a/src/main/java/org/olat/search/service/searcher/SearchResultsImpl.java
+++ b/src/main/java/org/olat/search/service/searcher/SearchResultsImpl.java
@@ -205,7 +205,7 @@ public class SearchResultsImpl implements SearchResults {
 				res.add(rDoc);
 			}
 			
-			if(!roles.isOLATAdmin() && i % 10 == 0) {
+			if(i % 10 == 0) {
 				// Do commit after certain number of documents because the transaction should not be too big
 				DBFactory.getInstance().commitAndCloseSession();
 			}
diff --git a/src/main/java/org/olat/upgrade/OLATUpgrade_10_3_0.java b/src/main/java/org/olat/upgrade/OLATUpgrade_10_3_0.java
index 73a3a5e4830..d2025779cac 100644
--- a/src/main/java/org/olat/upgrade/OLATUpgrade_10_3_0.java
+++ b/src/main/java/org/olat/upgrade/OLATUpgrade_10_3_0.java
@@ -95,7 +95,7 @@ public class OLATUpgrade_10_3_0 extends OLATUpgrade {
 	private boolean upgradeExportFodler(UpgradeManager upgradeManager, UpgradeHistoryData uhd) {
 		if (!uhd.getBooleanDataValue(TASK_EXPORT_FOLDER)) {
 			int counter = 0;
-			final Roles roles = new Roles(true, true, true, true, false, true, false);
+			final Roles roles = Roles.administratorAndManagersRoles();
 			final SearchRepositoryEntryParameters params = new SearchRepositoryEntryParameters();
 			params.setRoles(roles);
 			params.setResourceTypes(Collections.singletonList("CourseModule"));
diff --git a/src/main/java/org/olat/upgrade/OLATUpgrade_11_0_0.java b/src/main/java/org/olat/upgrade/OLATUpgrade_11_0_0.java
index 6510b8eb6b5..ce58a06fc33 100644
--- a/src/main/java/org/olat/upgrade/OLATUpgrade_11_0_0.java
+++ b/src/main/java/org/olat/upgrade/OLATUpgrade_11_0_0.java
@@ -257,7 +257,7 @@ public class OLATUpgrade_11_0_0 extends OLATUpgrade {
 		boolean allOk = true;
 		if (!uhd.getBooleanDataValue(EFFICIENCY_STATEMENT_DATAS)) {
 			int counter = 0;
-			final Roles roles = new Roles(true, true, true, true, false, true, false);
+			final Roles roles = Roles.administratorAndManagersRoles();
 			final SearchRepositoryEntryParameters params = new SearchRepositoryEntryParameters();
 			params.setRoles(roles);
 			params.setResourceTypes(Collections.singletonList("CourseModule"));
@@ -286,7 +286,7 @@ public class OLATUpgrade_11_0_0 extends OLATUpgrade {
 		boolean allOk = true;
 		if (!uhd.getBooleanDataValue(ASSESSMENT_DATAS)) {
 			int counter = 0;
-			final Roles roles = new Roles(true, true, true, true, false, true, false);
+			final Roles roles = Roles.administratorAndManagersRoles();
 			final SearchRepositoryEntryParameters params = new SearchRepositoryEntryParameters();
 			params.setRoles(roles);
 			params.setResourceTypes(Collections.singletonList("CourseModule"));
diff --git a/src/main/java/org/olat/upgrade/OLATUpgrade_11_2_1.java b/src/main/java/org/olat/upgrade/OLATUpgrade_11_2_1.java
index 2bd1e355a26..ddf7cecc85c 100644
--- a/src/main/java/org/olat/upgrade/OLATUpgrade_11_2_1.java
+++ b/src/main/java/org/olat/upgrade/OLATUpgrade_11_2_1.java
@@ -109,7 +109,7 @@ public class OLATUpgrade_11_2_1 extends OLATUpgrade {
 		boolean allOk = true;
 		if (!uhd.getBooleanDataValue(STATUS_OLD_TASK_ELEMENT)) {
 			int counter = 0;
-			final Roles roles = new Roles(true, false, false, false, false, false, false);
+			final Roles roles = Roles.administratorRoles();
 			final SearchRepositoryEntryParameters params = new SearchRepositoryEntryParameters();
 			params.setRoles(roles);
 			params.setResourceTypes(Collections.singletonList("CourseModule"));
diff --git a/src/main/java/org/olat/upgrade/OLATUpgrade_12_0_0.java b/src/main/java/org/olat/upgrade/OLATUpgrade_12_0_0.java
index b21949a6c31..50c8a27b8f0 100644
--- a/src/main/java/org/olat/upgrade/OLATUpgrade_12_0_0.java
+++ b/src/main/java/org/olat/upgrade/OLATUpgrade_12_0_0.java
@@ -229,7 +229,7 @@ public class OLATUpgrade_12_0_0 extends OLATUpgrade {
 		if (!uhd.getBooleanDataValue(LAST_USER_MODIFICATION)) {
 			
 			int counter = 0;
-			final Roles roles = new Roles(true, true, true, true, false, true, false);
+			final Roles roles = Roles.administratorAndManagersRoles();
 			final SearchRepositoryEntryParameters params = new SearchRepositoryEntryParameters();
 			params.setRoles(roles);
 			params.setResourceTypes(Collections.singletonList("CourseModule"));
diff --git a/src/main/java/org/olat/user/ProfileFormController.java b/src/main/java/org/olat/user/ProfileFormController.java
index 6f7fdd2404a..450007b48ef 100644
--- a/src/main/java/org/olat/user/ProfileFormController.java
+++ b/src/main/java/org/olat/user/ProfileFormController.java
@@ -31,9 +31,7 @@ import java.util.Map;
 import java.util.Set;
 
 import org.olat.basesecurity.BaseSecurity;
-import org.olat.basesecurity.BaseSecurityModule;
 import org.olat.basesecurity.OrganisationRoles;
-import org.olat.basesecurity.OrganisationService;
 import org.olat.core.commons.persistence.DBFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItem;
@@ -54,10 +52,9 @@ import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
 import org.olat.core.helpers.Settings;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
-import org.olat.core.id.Organisation;
+import org.olat.core.id.Roles;
 import org.olat.core.id.User;
 import org.olat.core.util.StringHelper;
-import org.olat.core.util.UserSession;
 import org.olat.core.util.WebappHelper;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.coordinate.SyncerExecutor;
@@ -93,7 +90,6 @@ public class ProfileFormController extends FormBasicController {
 	private RichTextElement textAboutMe;
 
 	private Identity identityToModify;
-	private List<Organisation> identityOrganisations;
 	private DialogBoxController dialogCtr;
 
 	private FileElement logoUpload;
@@ -123,8 +119,6 @@ public class ProfileFormController extends FormBasicController {
 	private HomePageConfigManager hpcm;
 	@Autowired
 	private DisplayPortraitManager dps;
-	@Autowired
-	private OrganisationService organisationService;
 	
 	/**
 	 * Create this controller with the request's identity as none administrative
@@ -156,7 +150,6 @@ public class ProfileFormController extends FormBasicController {
 		
 		this.identityToModify = identityToModify;
 		logoEnabled = userModule.isLogoByProfileEnabled();
-		identityOrganisations = organisationService.getOrganisations(identityToModify, OrganisationRoles.values());
 		
 		this.isAdministrativeUser = isAdministrativeUser;
 		userPropertyHandlers = userManager.getUserPropertyHandlersFor(usageIdentifier, isAdministrativeUser);
@@ -614,16 +607,11 @@ public class ProfileFormController extends FormBasicController {
 		mainForm.setDirtyMarking(isDirtyMarking);
 	}
 
-	private boolean isAllowedToChangeEmailWithoutVerification(final UserRequest ureq) {
-		UserSession usess = ureq.getUserSession();
-		boolean isOLATAdmin = usess .getRoles().isOLATAdmin();
-		boolean isUserManagerAndBypassVerification = false;
-		if(!isOLATAdmin && usess.getRoles().isUserManager() && BaseSecurityModule.USERMANAGER_CAN_BYPASS_EMAILVERIFICATION.booleanValue()) {
-			//check if the user manager is allowed to manage this user
-			List<Organisation> organisations = organisationService.getOrganisations(getIdentity(), usess.getRoles(), OrganisationRoles.usermanager);
-			organisations.retainAll(identityOrganisations);
-			isUserManagerAndBypassVerification = !organisations.isEmpty();
-		}
-		return isOLATAdmin || isUserManagerAndBypassVerification;
+	private boolean isAllowedToChangeEmailWithoutVerification(UserRequest ureq) {
+		Roles managerRoles = ureq.getUserSession().getRoles();
+		Roles identityToModifyRoles  = securityManager.getRoles(identityToModify);
+		return managerRoles.isManagerOf(OrganisationRoles.administrator, identityToModifyRoles)
+				|| managerRoles.isManagerOf(OrganisationRoles.usermanager, identityToModifyRoles)
+				|| managerRoles.isManagerOf(OrganisationRoles.rolesmanager, identityToModifyRoles);
 	}
 }
diff --git a/src/main/java/org/olat/user/UserInfoMainController.java b/src/main/java/org/olat/user/UserInfoMainController.java
index fb782dc85c1..4a0aad0ee34 100644
--- a/src/main/java/org/olat/user/UserInfoMainController.java
+++ b/src/main/java/org/olat/user/UserInfoMainController.java
@@ -28,20 +28,10 @@
 
 package org.olat.user;
 
-import java.util.ArrayList;
 import java.util.List;
 
-import org.olat.commons.calendar.CalendarManager;
-import org.olat.commons.calendar.CalendarModule;
-import org.olat.commons.calendar.model.CalendarUserConfiguration;
-import org.olat.commons.calendar.ui.WeeklyCalendarController;
-import org.olat.commons.calendar.ui.components.KalendarRenderWrapper;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.fullWebApp.LayoutMain3ColsController;
-import org.olat.core.commons.modules.bc.FolderConfig;
-import org.olat.core.commons.modules.bc.FolderRunController;
-import org.olat.core.commons.modules.bc.vfs.OlatNamedContainerImpl;
-import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.panel.Panel;
@@ -53,7 +43,6 @@ import org.olat.core.gui.components.tree.TreeNode;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
-import org.olat.core.gui.control.controller.MainLayoutBasicController;
 import org.olat.core.gui.control.generic.dtabs.Activateable2;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
@@ -62,18 +51,10 @@ import org.olat.core.id.context.HistoryPoint;
 import org.olat.core.id.context.StateEntry;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.UserSession;
-import org.olat.core.util.mail.ContactList;
-import org.olat.core.util.mail.ContactMessage;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.core.util.tree.TreeHelper;
-import org.olat.core.util.vfs.callbacks.ReadOnlyCallback;
-import org.olat.core.util.vfs.callbacks.VFSSecurityCallback;
-import org.olat.modules.co.ContactFormController;
 import org.olat.portfolio.PortfolioModule;
-import org.olat.portfolio.manager.InvitationDAO;
-import org.olat.portfolio.ui.EPMapRunController;
-import org.olat.portfolio.ui.EPMapRunViewOption;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.olat.user.ui.identity.AbstractUserInfoMainController;
 
 /**
  * Initial Date: July 26, 2005
@@ -87,42 +68,14 @@ import org.springframework.beans.factory.annotation.Autowired;
  *         form.
  * 
  */
-public class UserInfoMainController extends MainLayoutBasicController implements Activateable2 {
+public class UserInfoMainController extends AbstractUserInfoMainController implements Activateable2 {
 
-	private static final String CMD_HOMEPAGE = "homepage";
-	private static final String CMD_CALENDAR = "calendar";
-	private static final String CMD_FOLDER = "userfolder";
-	private static final String CMD_CONTACT = "contact";
-	private static final String CMD_PORTFOLIO = "portfolio";
-
-	private MenuTree menuTree;
 	private Panel main;
+	private MenuTree menuTree;
 	private TooledStackedPanel toolbarPanel;
 	
-	public static final OLATResourceable BUSINESS_CONTROL_TYPE_FOLDER = OresHelper.createOLATResourceableTypeWithoutCheck(FolderRunController.class
-			.getSimpleName());
-
-	private EPMapRunController portfolioController;
-	private FolderRunController folderRunController;
-	private WeeklyCalendarController calendarController;
-	private ContactFormController contactFormController;
-	private HomePageDisplayController homePageDisplayController;
-
-	private final Identity chosenIdentity;
-	private final String firstLastName;
 	private HistoryPoint launchedFromPoint;
 
-	@Autowired
-	private UserManager userManager;
-	@Autowired
-	private InvitationDAO invitationDao;
-	@Autowired
-	private CalendarModule calendarModule;
-	@Autowired
-	private CalendarManager calendarManager;
-	@Autowired
-	private HomePageConfigManager homePageConfigManager;
-
 	/**
 	 * @param ureq
 	 * @param wControl
@@ -130,9 +83,7 @@ public class UserInfoMainController extends MainLayoutBasicController implements
 	 */
 	public UserInfoMainController(UserRequest ureq, WindowControl wControl, Identity chosenIdentity,
 			boolean showRootNode, boolean showToolbar) {
-		super(ureq, wControl);
-				
-		this.chosenIdentity = chosenIdentity;
+		super(ureq, wControl, chosenIdentity);
 		
 		UserSession session = ureq.getUserSession();
 		if(showToolbar && session != null &&  session.getHistoryStack() != null && session.getHistoryStack().size() >= 2) {
@@ -140,7 +91,7 @@ public class UserInfoMainController extends MainLayoutBasicController implements
 			List<HistoryPoint> stack = session.getHistoryStack();
 			for(int i=stack.size() - 2; i-->0; ) {
 				HistoryPoint point = stack.get(stack.size() - 2);
-				if(point.getEntries().size() > 0) {
+				if(!point.getEntries().isEmpty()) {
 					OLATResourceable ores = point.getEntries().get(0).getOLATResourceable();
 					if(!chosenIdentity.getKey().equals(ores.getResourceableId())) {
 						launchedFromPoint = point;
@@ -153,7 +104,7 @@ public class UserInfoMainController extends MainLayoutBasicController implements
 		main = new Panel("userinfomain");
 		Controller homeCtrl = createComponent(ureq, CMD_HOMEPAGE);
 		main.setContent(homeCtrl.getInitialComponent());
-		firstLastName = userManager.getUserDisplayName(chosenIdentity);
+		String firstLastName = userManager.getUserDisplayName(chosenIdentity);
 
 		// Navigation menu
 		if (!chosenIdentity.getStatus().equals(Identity.STATUS_DELETED)) {
@@ -238,16 +189,14 @@ public class UserInfoMainController extends MainLayoutBasicController implements
 	 * @param firstLastName
 	 */
 	private GenericTreeModel buildTreeModel(String name) {
-		GenericTreeNode root, gtn;
-
 		GenericTreeModel gtm = new GenericTreeModel();
-		root = new GenericTreeNode();
+		GenericTreeNode root = new GenericTreeNode();
 		root.setTitle(name);
 		root.setAltText(name);
 		root.setAccessible(false);
 		gtm.setRootNode(root);
 
-		gtn = new GenericTreeNode();
+		GenericTreeNode gtn = new GenericTreeNode();
 		gtn.setTitle(translate("menu.homepage"));
 		gtn.setUserObject(CMD_HOMEPAGE);
 		gtn.setAltText(translate("menu.homepage.alt"));
@@ -256,12 +205,9 @@ public class UserInfoMainController extends MainLayoutBasicController implements
 		// following user info elements are only shown for undeleted and real
 		// users (not invited
 		// eportfolio users)
-		boolean isInvitee = invitationDao.isInvitee(chosenIdentity);
-		boolean isDeleted = chosenIdentity.getStatus().equals(Identity.STATUS_DELETED);
-		
 		
-		
-		if ( !isDeleted && ! isInvitee) {
+
+		if (!isDeleted && !isInvitee) {
 			if(calendarModule.isEnablePersonalCalendar()) {
 				gtn = new GenericTreeNode();
 				gtn.setTitle(translate("menu.calendar"));
@@ -315,89 +261,7 @@ public class UserInfoMainController extends MainLayoutBasicController implements
 		}
 		return controller;
 	}
-	
-	private HomePageDisplayController doOpenHomepage(UserRequest ureq) {
-		removeAsListenerAndDispose(homePageDisplayController);
-		
-		HomePageConfig homePageConfig = homePageConfigManager.loadConfigFor(chosenIdentity.getName());
-		removeAsListenerAndDispose(homePageDisplayController);
-		homePageDisplayController = new HomePageDisplayController(ureq, getWindowControl(), chosenIdentity, homePageConfig);
-		listenTo(homePageDisplayController);
-		return homePageDisplayController;
-	}
-	
-	private WeeklyCalendarController doOpenCalendar(UserRequest ureq) {
-		removeAsListenerAndDispose(calendarController);
-		
-		KalendarRenderWrapper calendarWrapper = calendarManager.getPersonalCalendar(chosenIdentity);
-		CalendarUserConfiguration config = calendarManager.findCalendarConfigForIdentity(calendarWrapper.getKalendar(), getIdentity());
-		if (config != null) {
-			calendarWrapper.setConfiguration(config);
-		}
-		
-		calendarWrapper.setPrivateEventsVisible(chosenIdentity.equals(ureq.getIdentity()));
-		if (chosenIdentity.equals(ureq.getIdentity())) {
-			calendarWrapper.setAccess(KalendarRenderWrapper.ACCESS_READ_WRITE);
-		} else {
-			calendarWrapper.setAccess(KalendarRenderWrapper.ACCESS_READ_ONLY);
-		}
-		List<KalendarRenderWrapper> calendars = new ArrayList<KalendarRenderWrapper>();
-		calendars.add(calendarWrapper);
-		
-		OLATResourceable ores = OresHelper.createOLATResourceableType(CMD_CALENDAR);
-		WindowControl bwControl = addToHistory(ureq, ores, null);
-		OLATResourceable callerOres = OresHelper.createOLATResourceableInstance(chosenIdentity.getName(), chosenIdentity.getKey());
-		calendarController = new WeeklyCalendarController(ureq, bwControl, calendars,
-				WeeklyCalendarController.CALLER_PROFILE, callerOres, false);
-		listenTo(calendarController);
-		return calendarController;
-	}
-	
-	private FolderRunController doOpenFolder(UserRequest ureq) {
-		removeAsListenerAndDispose(folderRunController);
-
-		String chosenUserFolderRelPath = FolderConfig.getUserHome(chosenIdentity.getName()) + "/public";
 
-		OlatRootFolderImpl rootFolder = new OlatRootFolderImpl(chosenUserFolderRelPath, null);
-		OlatNamedContainerImpl namedFolder = new OlatNamedContainerImpl(firstLastName, rootFolder);
-		
-		//decided in plenum to have read only view in the personal visiting card, even for admin
-		VFSSecurityCallback secCallback = new ReadOnlyCallback();
-		namedFolder.setLocalSecurityCallback(secCallback);
-		
-		OLATResourceable ores = OresHelper.createOLATResourceableType("userfolder");
-		WindowControl bwControl = addToHistory(ureq, ores, null);
-		folderRunController = new FolderRunController(namedFolder, false, true, false, ureq, bwControl);
-		folderRunController.setResourceURL("[Identity:" + chosenIdentity.getKey() + "][userfolder:0]");
-		listenTo(folderRunController);
-		return folderRunController;
-	}
-	
-	private ContactFormController doOpenContact(UserRequest ureq) {
-		removeAsListenerAndDispose(contactFormController);
-		
-		ContactMessage cmsg = new ContactMessage(ureq.getIdentity());
-		ContactList emailList = new ContactList(firstLastName);
-		emailList.add(chosenIdentity);
-		cmsg.addEmailTo(emailList);
-		
-		OLATResourceable ores = OresHelper.createOLATResourceableType(CMD_CONTACT);
-		WindowControl bwControl = addToHistory(ureq, ores, null);
-		contactFormController = new ContactFormController(ureq, bwControl, true, false, false, cmsg);
-		listenTo(contactFormController);
-		return contactFormController;
-	}
-	
-	private EPMapRunController doOpenPortfolio(UserRequest ureq) {
-		removeAsListenerAndDispose(portfolioController);
-		
-		OLATResourceable ores = OresHelper.createOLATResourceableType(CMD_PORTFOLIO);
-		WindowControl bwControl = addToHistory(ureq, ores, null);
-		portfolioController = new EPMapRunController(ureq, bwControl, false, EPMapRunViewOption.OTHER_MAPS, chosenIdentity);
-		listenTo(portfolioController);
-		return portfolioController;
-	}
-	
 	protected final void doClose(UserRequest ureq) {
 		OLATResourceable ores = OresHelper.createOLATResourceableInstance("HomeSite", chosenIdentity.getKey());
 		getWindowControl().getWindowBackOffice().getWindow().getDTabs().closeDTab(ureq, ores, launchedFromPoint);
diff --git a/src/main/java/org/olat/user/UserPropertiesController.java b/src/main/java/org/olat/user/UserPropertiesController.java
index 13c2bcfefe6..63ff590418a 100644
--- a/src/main/java/org/olat/user/UserPropertiesController.java
+++ b/src/main/java/org/olat/user/UserPropertiesController.java
@@ -28,7 +28,7 @@ package org.olat.user;
 import java.util.Date;
 import java.util.List;
 
-import org.olat.core.CoreSpringFactory;
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.table.DefaultColumnDescriptor;
@@ -42,11 +42,14 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
+import org.olat.core.gui.control.generic.modal.DialogBoxController;
 import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
 import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.group.BusinessGroup;
 import org.olat.properties.Property;
 import org.olat.properties.PropertyManager;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  *  Initial Date:  Jul 29, 2003
@@ -57,15 +60,20 @@ import org.olat.properties.PropertyManager;
  */
 public class UserPropertiesController extends BasicController {
 
-	private Property foundProp;
 	private PropTableDataModel tdm;
 	private TableController tableCtr;
-
+	private DialogBoxController confirmDeleteCtrl;
 	
+	@Autowired
+	private PropertyManager pm;
+	@Autowired
+	private UserManager userManager;
+
 	/*
 	 * the identity that is displayed (not the user/admin, that views the properties)
 	 */
 	private Identity displayedIdentity;
+	private boolean identityAdministator;
 
 	/**
 	 * Administer properties of a user.
@@ -73,25 +81,25 @@ public class UserPropertiesController extends BasicController {
 	 * @param wControl
 	 * @param identity
 	 */
-	public UserPropertiesController(UserRequest ureq, WindowControl wControl, Identity displayedIdentity) {
+	public UserPropertiesController(UserRequest ureq, WindowControl wControl, Identity displayedIdentity, Roles displayedRoles) {
 		super(ureq, wControl);
-		PropertyManager pm = PropertyManager.getInstance();
 		this.displayedIdentity = displayedIdentity;
+		identityAdministator = ureq.getUserSession().getRoles().isManagerOf(OrganisationRoles.administrator, displayedRoles);
+
 		List<Property> l = pm.listProperties(displayedIdentity, null, null, null, null);
 		TableGuiConfiguration tableConfig = new TableGuiConfiguration();
 		tableConfig.setTableEmptyMessage(getTranslator().translate("error.no.props.found"));
 		tableCtr = new TableController(tableConfig, ureq, getWindowControl(), getTranslator());
 		listenTo(tableCtr);
-		tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.prop.category", 0, null, ureq.getLocale()));
-		tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.prop.grp", 1, null, ureq.getLocale()));
-		tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.prop.resource", 2, null, ureq.getLocale()));
-		tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.prop.name", 3, null, ureq.getLocale()));
-		tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.prop.value", 4, null, ureq.getLocale()));
-		tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.prop.creatdat", 5, null, ureq.getLocale()));
-		tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.prop.moddat", 6, null, ureq.getLocale()));
+		tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.prop.category", 0, null, getLocale()));
+		tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.prop.grp", 1, null, getLocale()));
+		tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.prop.resource", 2, null, getLocale()));
+		tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.prop.name", 3, null, getLocale()));
+		tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.prop.value", 4, null, getLocale()));
+		tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.prop.creatdat", 5, null, getLocale()));
+		tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.prop.moddat", 6, null, getLocale()));
 		// property selection / id only for admins
-		if (ureq.getUserSession().getRoles().isOLATAdmin()) {
-			//fxdiff FXOLAT-149
+		if (identityAdministator) {
 			tableCtr.addColumnDescriptor(new StaticColumnDescriptor("delete", "table.header.action", translate("delete")));
 		}
 		tdm = new PropTableDataModel(l);
@@ -99,59 +107,33 @@ public class UserPropertiesController extends BasicController {
 		putInitialPanel(tableCtr.getInitialComponent());
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, org.olat.core.gui.components.Component, org.olat.core.gui.control.Event)
-	 */
+	@Override
 	public void event(UserRequest ureq, Component source, Event event) {
 		// no events to catch
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event)
-	 */
+	@Override
 	public void event(UserRequest ureq, Controller source, Event event) {
 		if (source == tableCtr) {
 			if (event.getCommand().equals(Table.COMMANDLINK_ROWACTION_CLICKED)) {
 				TableEvent te = (TableEvent) event;
 				String actionid = te.getActionId();
-				if (actionid.equals("choose")) {
-					int rowid = te.getRowId();
-					foundProp = tdm.getObject(rowid);
-					// Tell parentController that a subject has been found
-					fireEvent(ureq, new PropFoundEvent(foundProp));
-				}
-				//fxdiff FXOLAT-149
-				else if (actionid.equals("delete")) {
-					int rowid = te.getRowId();
-					foundProp = tdm.getObject(rowid);
-					String fullName = CoreSpringFactory.getImpl(UserManager.class).getUserDisplayName(displayedIdentity);
-					activateYesNoDialog(ureq, translate("propdelete.yesno.title"),translate("propdelete.yesno.text",new String[]{foundProp.getName(), fullName}), null);
+				if (actionid.equals("delete") && identityAdministator) {
+					Property foundProp = tdm.getObject(te.getRowId());
+					String fullName = userManager.getUserDisplayName(displayedIdentity);
+					confirmDeleteCtrl = activateYesNoDialog(ureq, translate("propdelete.yesno.title"), translate("propdelete.yesno.text", new String[]{foundProp.getName(), fullName}), confirmDeleteCtrl);
+					confirmDeleteCtrl.setUserObject(foundProp);
 				}
 			}
-		}
-		//fxdiff FXOLAT-149
-		else if (DialogBoxUIFactory.isYesEvent(event) && foundProp != null) {
-			PropertyManager.getInstance().deleteProperty(foundProp);
+		} else if (confirmDeleteCtrl == source&& DialogBoxUIFactory.isYesEvent(event)) {
+			Property foundProp = (Property)confirmDeleteCtrl.getUserObject();
+			pm.deleteProperty(foundProp);
 			tdm.getObjects().remove(foundProp);
 			tableCtr.modelChanged();
-			foundProp = null;
 		}
-
 	}
 
-	/**
-	 * Get the property that was found by this workflow
-	 * 
-	 * @return Property The found property
-	 */
-	public Property getFoundProp() {
-		return foundProp;
-	}
-
-	/**
-	 * 
-	 * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
-	 */
+	@Override
 	protected void doDispose() {
 		//
 	}
@@ -161,7 +143,6 @@ public class UserPropertiesController extends BasicController {
  *  The prop table data model. 
  *  
  */
-
 class PropTableDataModel extends DefaultTableDataModel<Property> {
 
 	/**
@@ -172,9 +153,7 @@ class PropTableDataModel extends DefaultTableDataModel<Property> {
 		super(objects);
 	}
 
-	/**
-	 * @see org.olat.core.gui.components.table.TableDataModel#getValueAt(int, int)
-	 */
+	@Override
 	public final Object getValueAt(int row, int col) {
 		Property p = getObject(row);
 		switch (col) {
@@ -217,9 +196,7 @@ class PropTableDataModel extends DefaultTableDataModel<Property> {
 		}
 	}
 
-	/**
-	 * @see org.olat.core.gui.components.table.TableDataModel#getColumnCount()
-	 */
+	@Override
 	public int getColumnCount() {
 		return 7;
 	}
diff --git a/src/main/java/org/olat/user/notification/UsersSubscriptionManagerImpl.java b/src/main/java/org/olat/user/notification/UsersSubscriptionManagerImpl.java
index 858604b639b..65ffcd52582 100644
--- a/src/main/java/org/olat/user/notification/UsersSubscriptionManagerImpl.java
+++ b/src/main/java/org/olat/user/notification/UsersSubscriptionManagerImpl.java
@@ -19,16 +19,14 @@
  */
 package org.olat.user.notification;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 
-import org.olat.basesecurity.BaseSecurity;
+import org.olat.basesecurity.IdentityPowerSearchQueries;
 import org.olat.basesecurity.OrganisationRoles;
 import org.olat.basesecurity.SearchIdentityParams;
 import org.olat.basesecurity.events.NewIdentityCreatedEvent;
-import org.olat.basesecurity.manager.OrganisationDAO;
 import org.olat.core.commons.services.notifications.NotificationsManager;
 import org.olat.core.commons.services.notifications.Publisher;
 import org.olat.core.commons.services.notifications.PublisherData;
@@ -37,7 +35,7 @@ import org.olat.core.commons.services.notifications.SubscriptionContext;
 import org.olat.core.gui.control.Event;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
-import org.olat.core.id.Organisation;
+import org.olat.core.id.OrganisationRef;
 import org.olat.core.id.Roles;
 import org.olat.core.id.User;
 import org.olat.core.id.context.BusinessControlFactory;
@@ -66,12 +64,10 @@ public class UsersSubscriptionManagerImpl implements UsersSubscriptionManager, G
 	public static final String RES_NAME = OresHelper.calculateTypeName(User.class);
 	public static final OLATResourceable IDENTITY_EVENT_CHANNEL = OresHelper.lookupType(Identity.class);
 	
-	@Autowired
-	private BaseSecurity securityManager;
-	@Autowired
-	private OrganisationDAO organisationDao;
 	@Autowired
 	private NotificationsManager notificationsManager;
+	@Autowired
+	private IdentityPowerSearchQueries identitySearchQueries;
 	
 	@Autowired
 	public UsersSubscriptionManagerImpl(CoordinatorManager coordinatorManager) {
@@ -99,7 +95,7 @@ public class UsersSubscriptionManagerImpl implements UsersSubscriptionManager, G
 			@Override
 			public Long getResourceableId() { return 0l; }
 			@Override
-			public String getResourceableTypeName() { return "NewIdentityCreated"; }
+			public String getResourceableTypeName() { return NEW; }
 		});
 		return new PublisherData(RES_NAME, NEW, ce.toString());
 	}
@@ -148,14 +144,11 @@ public class UsersSubscriptionManagerImpl implements UsersSubscriptionManager, G
 	 */
 	@Override
 	public List<Identity> getNewIdentityCreated(Date from, Identity actingIdentity, Roles roles) {
-		if(from == null || (!roles.isUserManager() && !roles.isOLATAdmin())) return Collections.emptyList();
+		if(from == null) return Collections.emptyList();
 
-		List<String> managerRoles = new ArrayList<>();
-		managerRoles.add(OrganisationRoles.administrator.name());
-		managerRoles.add(OrganisationRoles.usermanager.name());
-		
-		List<Organisation> userManagerOrganisations = organisationDao.getOrganisations(actingIdentity, managerRoles);
-		if(userManagerOrganisations.isEmpty()) {
+		List<OrganisationRef> manageableOrganisations = roles
+				.getOrganisationsWithRoles(OrganisationRoles.administrator, OrganisationRoles.usermanager, OrganisationRoles.rolesmanager);
+		if(manageableOrganisations.isEmpty()) {
 			return Collections.emptyList();
 		}
 		
@@ -163,7 +156,7 @@ public class UsersSubscriptionManagerImpl implements UsersSubscriptionManager, G
 		params.setExcludedRoles(new OrganisationRoles[]{ OrganisationRoles.guest });
 		params.setCreatedAfter(from);
 		params.setStatus(Identity.STATUS_VISIBLE_LIMIT);
-		params.setOrganisationParents(userManagerOrganisations);
-		return securityManager.getIdentitiesByPowerSearch(params, 0, -1);
+		params.setOrganisations(manageableOrganisations);
+		return identitySearchQueries.getIdentitiesByPowerSearch(params, 0, -1);
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/user/propertyhandlers/EmailProperty.java b/src/main/java/org/olat/user/propertyhandlers/EmailProperty.java
index 818811749f0..a22b37f4c36 100644
--- a/src/main/java/org/olat/user/propertyhandlers/EmailProperty.java
+++ b/src/main/java/org/olat/user/propertyhandlers/EmailProperty.java
@@ -137,7 +137,7 @@ public class EmailProperty extends Generic127CharTextPropertyHandler {
 			}
 			// email is syntactically correct. 
 		  // Check whether it's available.
-			if (!isAddressAvailable(value, (formContext != null) ? (String)formContext.get("username") : null)) {
+			if (!isAddressAvailable(value, (formContext != null) ? formContext.get("username") : null)) {
 				textElement.setErrorKey(i18nFormElementLabelKey() + ".error.exists", new String[] { value });
 			  return false;
 			}
diff --git a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_ar.properties b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_ar.properties
index 90b1654a4bf..0666362a010 100644
--- a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_ar.properties
+++ b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_ar.properties
@@ -89,7 +89,7 @@ import.example.firstName=\u0645\u062D\u0645\u062F
 import.example.gender=\u0630\u0643\u0631
 import.example.homepage=http\://www.google.com
 import.example.icqname=16827354
-import.example.institutionalEmail=peter.muster@uzh.ch
+import.example.institutionalEmail=peter.muster@openolat.com
 import.example.institutionalName=\u062C\u0627\u0645\u0639\u0629 \u0627\u0644\u0642\u0627\u0647\u0631\u0629
 import.example.institutionalUserIdentifier=08-123-987 begin_of_the_skype_highlighting              08-123-987      end_of_the_skype_highlighting
 import.example.lastName=\u064A\u0648\u0633\u0641
diff --git a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_cs.properties b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_cs.properties
index e394c2d66ca..3109a67dffd 100644
--- a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_cs.properties
+++ b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_cs.properties
@@ -70,7 +70,7 @@ import.example.extendedAddress=10
 import.example.firstName=Peter
 import.example.gender=male
 import.example.homepage=http\://www.openolat.org
-import.example.institutionalEmail=peter.muster@uzh.ch
+import.example.institutionalEmail=peter.muster@openolat.com
 import.example.institutionalName=Universit\u00E4t Z\u00FCrich
 import.example.institutionalUserIdentifier=08-123-987
 import.example.lastName=Muster
diff --git a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_da.properties b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_da.properties
index b2628324048..7d9b1379d1b 100644
--- a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_da.properties
+++ b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_da.properties
@@ -44,7 +44,7 @@ import.example.extendedAddress=10
 import.example.firstName=Peter
 import.example.gender=male
 import.example.homepage=http\://www.openolat.org
-import.example.institutionalEmail=peter.muster@uzh.ch
+import.example.institutionalEmail=peter.muster@openolat.com
 import.example.institutionalName=Universit\u00E4t Z\u00FCrich
 import.example.institutionalUserIdentifier=08-123-987
 import.example.lastName=Muster
diff --git a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_de.properties
index 4a1e40d8b25..789b995fa31 100644
--- a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_de.properties
@@ -371,7 +371,7 @@ import.example.gender=male
 import.example.grade=Grad
 import.example.homepage=http\://www.openolat.org
 import.example.icqname=16827354
-import.example.institutionalEmail=peter.muster@uzh.ch
+import.example.institutionalEmail=peter.muster@openolat.com
 import.example.institutionalName=Universit\u00E4t Z\u00FCrich
 import.example.institutionalUserIdentifier=08-123-987
 import.example.lastName=Muster
diff --git a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_es.properties b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_es.properties
index 6d50292d523..27f4b5d6bee 100644
--- a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_es.properties
+++ b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_es.properties
@@ -76,7 +76,7 @@ import.example.extendedAddress=10
 import.example.firstName=Peter
 import.example.gender=male
 import.example.homepage=http\://www.openolat.org
-import.example.institutionalEmail=peter.muster@uzh.ch
+import.example.institutionalEmail=peter.muster@openolat.com
 import.example.institutionalName=Universit\u00E4t Z\u00FCrich
 import.example.institutionalUserIdentifier=08-123-987
 import.example.lastName=Muster
diff --git a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_fa.properties b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_fa.properties
index 74e7b454448..a39cabba350 100644
--- a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_fa.properties
+++ b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_fa.properties
@@ -44,7 +44,7 @@ import.example.extendedAddress=10
 import.example.firstName=Peter
 import.example.gender=male
 import.example.homepage=http\://www.openolat.org
-import.example.institutionalEmail=peter.muster@uzh.ch
+import.example.institutionalEmail=peter.muster@openolat.com
 import.example.institutionalName=Universit\u00E4t Z\u00FCrich
 import.example.institutionalUserIdentifier=08-123-987
 import.example.lastName=Muster
diff --git a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_fr.properties
index 6ae839cd25a..cad8bd96adb 100644
--- a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_fr.properties
@@ -371,7 +371,7 @@ import.example.gender=male
 import.example.grade=Rang
 import.example.homepage=http\://www.openolat.org
 import.example.icqname=16827354
-import.example.institutionalEmail=peter.muster@uzh.ch
+import.example.institutionalEmail=peter.muster@openolat.com
 import.example.institutionalName=Universit\u00E4t Z\u00FCrich
 import.example.institutionalUserIdentifier=08-123-987
 import.example.lastName=Muster
diff --git a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_hu.properties b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_hu.properties
index 7deac5f38d4..128a9a03ba7 100644
--- a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_hu.properties
+++ b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_hu.properties
@@ -7,7 +7,7 @@ import.example.extendedAddress=10
 import.example.firstName=Peter
 import.example.gender=male
 import.example.homepage=http\://www.openolat.org
-import.example.institutionalEmail=peter.muster@uzh.ch
+import.example.institutionalEmail=peter.muster@openolat.com
 import.example.institutionalName=Universit\u00E4t Z\u00FCrich
 import.example.institutionalUserIdentifier=08-123-987
 import.example.lastName=Muster
diff --git a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_it.properties b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_it.properties
index de1c1a7f6ec..3d269530943 100644
--- a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_it.properties
+++ b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_it.properties
@@ -374,7 +374,7 @@ import.example.gender=male
 import.example.grade=Grado
 import.example.homepage=http\://www.openolat.org
 import.example.icqname=16827354
-import.example.institutionalEmail=peter.muster@uzh.ch
+import.example.institutionalEmail=peter.muster@openolat.com
 import.example.institutionalName=Universit\u00E4t Z\u00FCrich
 import.example.institutionalUserIdentifier=08-123-987
 import.example.lastName=Muster
diff --git a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_lt.properties b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_lt.properties
index 3ba119843ae..15ecfb77eab 100644
--- a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_lt.properties
+++ b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_lt.properties
@@ -44,7 +44,7 @@ import.example.extendedAddress=10
 import.example.firstName=Peter
 import.example.gender=male
 import.example.homepage=http\://www.openolat.org
-import.example.institutionalEmail=peter.muster@uzh.ch
+import.example.institutionalEmail=peter.muster@openolat.com
 import.example.institutionalName=Universit\u00E4t Z\u00FCrich
 import.example.institutionalUserIdentifier=08-123-987
 import.example.lastName=Muster
diff --git a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_pl.properties b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_pl.properties
index dec8db6e521..8500bde60dc 100644
--- a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_pl.properties
+++ b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_pl.properties
@@ -90,7 +90,7 @@ import.example.firstName=Peter
 import.example.gender=male
 import.example.homepage=http\://www.openolat.org
 import.example.icqname=16827354
-import.example.institutionalEmail=peter.muster@uzh.ch
+import.example.institutionalEmail=peter.muster@openolat.com
 import.example.institutionalName=Universit\u00E4t Z\u00FCrich
 import.example.institutionalUserIdentifier=08-123-987
 import.example.lastName=Muster
diff --git a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_pt_BR.properties
index 95c7b303ad6..12d3f49dcef 100644
--- a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_pt_BR.properties
+++ b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_pt_BR.properties
@@ -374,7 +374,7 @@ import.example.gender=male
 import.example.grade=Grau
 import.example.homepage=http\://www.openolat.org
 import.example.icqname=16827354
-import.example.institutionalEmail=peter.muster@uzh.ch
+import.example.institutionalEmail=peter.muster@openolat.com
 import.example.institutionalName=Universit\u00E4t Z\u00FCrich
 import.example.institutionalUserIdentifier=08-123-987
 import.example.lastName=Muster
diff --git a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_pt_PT.properties b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_pt_PT.properties
index aa3b8c0a91c..fa48417a53a 100644
--- a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_pt_PT.properties
+++ b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_pt_PT.properties
@@ -290,7 +290,7 @@ import.example.extendedAddress=10
 import.example.firstName=Peter
 import.example.gender=male
 import.example.homepage=http\://www.openolat.org
-import.example.institutionalEmail=peter.muster@uzh.ch
+import.example.institutionalEmail=peter.muster@openolat.com
 import.example.institutionalName=Universit\u00E4t Z\u00FCrich
 import.example.institutionalUserIdentifier=08-123-987
 import.example.lastName=Muster
diff --git a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_ru.properties b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_ru.properties
index 58b1614d16a..80ac6f7b73c 100644
--- a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_ru.properties
+++ b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_ru.properties
@@ -77,7 +77,7 @@ import.example.extendedAddress=10
 import.example.firstName=\u041F\u0451\u0442\u0440
 import.example.gender=\u043C\u0443\u0436\u0441\u043A\u043E\u0439
 import.example.homepage=http\://www.demo.ru
-import.example.institutionalEmail=pjotr.petrov@uzh.ch
+import.example.institutionalEmail=pjotr.petrov@openolat.com
 import.example.institutionalName=\u0423\u043D\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442 \u0426\u044E\u0440\u0438\u0445
 import.example.institutionalUserIdentifier=08-123-987
 import.example.lastName=\u041F\u0435\u0442\u0440\u043E\u0432
diff --git a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_sq.properties b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_sq.properties
index bc369313dbd..54937b7d63b 100644
--- a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_sq.properties
+++ b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_sq.properties
@@ -44,7 +44,7 @@ import.example.extendedAddress=10
 import.example.firstName=Peter
 import.example.gender=male
 import.example.homepage=http\://www.openolat.org
-import.example.institutionalEmail=peter.muster@uzh.ch
+import.example.institutionalEmail=peter.muster@openolat.com
 import.example.institutionalName=Universit\u00E4t Z\u00FCrich
 import.example.institutionalUserIdentifier=08-123-987
 import.example.lastName=Muster
diff --git a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_zh_CN.properties b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_zh_CN.properties
index c191b85974e..1b0f5ad9b1e 100644
--- a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_zh_CN.properties
+++ b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_zh_CN.properties
@@ -89,7 +89,7 @@ import.example.firstName=Peter
 import.example.gender=male
 import.example.homepage=http\://www.openolat.org
 import.example.icqname=16827354
-import.example.institutionalEmail=peter.muster@uzh.ch
+import.example.institutionalEmail=peter.muster@openolat.com
 import.example.institutionalName=Universit\u00E4t Z\u00FCrich
 import.example.institutionalUserIdentifier=08-123-987
 import.example.lastName=Muster
diff --git a/src/main/java/org/olat/user/restapi/OrganisationsWebService.java b/src/main/java/org/olat/user/restapi/OrganisationsWebService.java
index 9421575aea9..652307616c5 100644
--- a/src/main/java/org/olat/user/restapi/OrganisationsWebService.java
+++ b/src/main/java/org/olat/user/restapi/OrganisationsWebService.java
@@ -464,8 +464,6 @@ public class OrganisationsWebService {
 	private OrganisationRoles getRoles(String role) {
 		if(OrganisationRoles.isValue(role)) {
 			return OrganisationRoles.valueOf(role);
-		} else if("coaches".equals(role)) {
-			return OrganisationRoles.coach;
 		}
 		
 		if(role.endsWith("s")) {
diff --git a/src/main/java/org/olat/user/restapi/RolesVO.java b/src/main/java/org/olat/user/restapi/RolesVO.java
index 95464b2e1b3..9c47d555fcd 100644
--- a/src/main/java/org/olat/user/restapi/RolesVO.java
+++ b/src/main/java/org/olat/user/restapi/RolesVO.java
@@ -52,20 +52,16 @@ public class RolesVO {
 
 	public RolesVO(Roles roles) {
 		systemAdmin = roles.isSystemAdmin();
-		olatAdmin = roles.isOLATAdmin();
+		olatAdmin = roles.isAdministrator();
 		groupManager = roles.isGroupManager();
 		userManager = roles.isUserManager();
 		author = roles.isAuthor();
 		guestOnly = roles.isGuestOnly();
 		institutionalResourceManager = roles.isLearnResourceManager();
-		poolAdmin = roles.isQPoolManager();
+		poolAdmin = roles.isPoolManager();
 		curriculumManager = roles.isCurriculumManager();
 		invitee = roles.isInvitee();
 	}
-	
-	public Roles toRoles() {
-		return new Roles(systemAdmin, olatAdmin, userManager, groupManager, author, guestOnly, institutionalResourceManager, poolAdmin, curriculumManager, false, invitee);
-	}
 
 	public boolean isSystemAdmin() {
 		return systemAdmin;
diff --git a/src/main/java/org/olat/user/restapi/UserWebService.java b/src/main/java/org/olat/user/restapi/UserWebService.java
index cf8e2b51f16..61dae0935ce 100644
--- a/src/main/java/org/olat/user/restapi/UserWebService.java
+++ b/src/main/java/org/olat/user/restapi/UserWebService.java
@@ -65,11 +65,12 @@ import org.olat.admin.user.UserShortDescription;
 import org.olat.admin.user.delete.service.UserDeletionManager;
 import org.olat.basesecurity.Authentication;
 import org.olat.basesecurity.BaseSecurity;
-import org.olat.basesecurity.BaseSecurityManager;
+import org.olat.basesecurity.IdentityPowerSearchQueries;
 import org.olat.basesecurity.IdentityShort;
 import org.olat.basesecurity.OrganisationService;
 import org.olat.basesecurity.SearchIdentityParams;
 import org.olat.core.CoreSpringFactory;
+import org.olat.core.commons.persistence.DB;
 import org.olat.core.gui.components.form.ValidationError;
 import org.olat.core.gui.translator.PackageTranslator;
 import org.olat.core.gui.translator.Translator;
@@ -88,6 +89,7 @@ import org.olat.restapi.support.vo.ErrorVO;
 import org.olat.user.DisplayPortraitManager;
 import org.olat.user.UserManager;
 import org.olat.user.propertyhandlers.UserPropertyHandler;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 /**
@@ -104,11 +106,25 @@ public class UserWebService {
 	public static final String PROPERTY_HANDLER_IDENTIFIER = UserWebService.class.getName();
 	
 	public static final CacheControl cc = new CacheControl();
-	
 	static {
 		cc.setMaxAge(-1);
 	}
 	
+	@Autowired
+	private DB dbInstance;
+	@Autowired
+	private UserManager userManager;
+	@Autowired
+	private BaseSecurity securityManager;
+	@Autowired
+	private DisplayPortraitManager portraitManager;
+	@Autowired
+	private OrganisationService organisationService;
+	@Autowired
+	private UserDeletionManager userDeletionManager;
+	@Autowired
+	private IdentityPowerSearchQueries identitySearchQueries;
+	
 	/**
 	 * The version of the User Web Service
 	 * @response.representation.200.mediaType text/plain
@@ -168,7 +184,7 @@ public class UserWebService {
 		List<Identity> identities;
 		//make only a search by authUsername
 		if(StringHelper.containsNonWhitespace(authProvider) && StringHelper.containsNonWhitespace(authUsername)) {
-			Authentication auth =BaseSecurityManager.getInstance().findAuthenticationByAuthusername(authUsername, authProvider);
+			Authentication auth = securityManager.findAuthenticationByAuthusername(authUsername, authProvider);
 			if(auth == null) {
 				identities = Collections.emptyList();
 			} else {
@@ -183,17 +199,17 @@ public class UserWebService {
 			//retrieve and convert the parameters value
 			Map<String,String> userProps = new HashMap<>();
 			if(!params.isEmpty()) {
-				UserManager um = UserManager.getInstance();
 				Locale locale = getLocale(httpRequest);
-				List<UserPropertyHandler> propertyHandlers = um.getUserPropertyHandlersFor(PROPERTY_HANDLER_IDENTIFIER, isAdministrativeUser);
+				List<UserPropertyHandler> propertyHandlers = userManager
+						.getUserPropertyHandlersFor(PROPERTY_HANDLER_IDENTIFIER, isAdministrativeUser);
 				for(UserPropertyHandler handler:propertyHandlers) {
 					if(!params.containsKey(handler.getName())) continue;
 					
 					List<String> values = params.get(handler.getName());
-					if(values.isEmpty()) continue;
-					
-					String value = formatDbUserProperty(values.get(0), handler, locale);
-					userProps.put(handler.getName(), value);
+					if(!values.isEmpty()) {
+						String value = formatDbUserProperty(values.get(0), handler, locale);
+						userProps.put(handler.getName(), value);
+					}
 				}
 			}
 			
@@ -201,7 +217,7 @@ public class UserWebService {
 			if(isAdministrativeUser && "all".equalsIgnoreCase(statusVisibleLimit)) {
 				status = null;
 			}
-			identities = BaseSecurityManager.getInstance().getIdentitiesByPowerSearch(login, userProps, true, null, authProviders, null, null, null, null, status);
+			identities = securityManager.getIdentitiesByPowerSearch(login, userProps, true, null, authProviders, null, null, null, null, status);
 		}
 		
 		int count = 0;
@@ -223,7 +239,7 @@ public class UserWebService {
 		
 		SearchIdentityParams params = new SearchIdentityParams();
 		params.setManaged(Boolean.TRUE);
-		List<Identity> identities = BaseSecurityManager.getInstance().getIdentitiesByPowerSearch(params, 0, -1);
+		List<Identity> identities = identitySearchQueries.getIdentitiesByPowerSearch(params, 0, -1);
 		int count = 0;
 		ManagedUserVO[] userVOs = new ManagedUserVO[identities.size()];
 		for(Identity identity:identities) {
@@ -258,7 +274,7 @@ public class UserWebService {
 		}
 		
 		// Check if login is still available
-		Identity identity = BaseSecurityManager.getInstance().findIdentityByName(user.getLogin());
+		Identity identity = securityManager.findIdentityByName(user.getLogin());
 		if (identity != null) {
 			Locale locale = getLocale(request);
 			Translator translator = Util.createPackageTranslator(UserShortDescription.class, locale);
@@ -271,11 +287,11 @@ public class UserWebService {
 		
 		List<ErrorVO> errors = validateUser(null, user, request);
 		if(errors.isEmpty()) {
-			User newUser = UserManager.getInstance().createUser(user.getFirstName(), user.getLastName(), user.getEmail());
-			Identity id = BaseSecurityManager.getInstance()
+			User newUser = userManager.createUser(user.getFirstName(), user.getLastName(), user.getEmail());
+			Identity id = securityManager
 					.createAndPersistIdentityAndUserWithDefaultProviderAndUserGroup(user.getLogin(), user.getExternalId(), user.getPassword(), newUser, null);
 			post(newUser, user, getLocale(request));
-			UserManager.getInstance().updateUser(newUser);
+			userManager.updateUser(newUser);
 			return Response.ok(get(id)).build();
 		}
 		
@@ -304,12 +320,12 @@ public class UserWebService {
 		if(!isUserManager) {
 			return Response.serverError().status(Status.FORBIDDEN).build();
 		}
-		Identity identity = BaseSecurityManager.getInstance().loadIdentityByKey(identityKey, false);
+		Identity identity = securityManager.loadIdentityByKey(identityKey, false);
 		if(identity == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
 
-		Roles roles = BaseSecurityManager.getInstance().getRoles(identity);
+		Roles roles = securityManager.getRoles(identity);
 		return Response.ok(new RolesVO(roles)).build();
 	}
 	
@@ -330,9 +346,6 @@ public class UserWebService {
 	@Consumes({MediaType.APPLICATION_XML ,MediaType.APPLICATION_JSON})
 	@Produces({MediaType.APPLICATION_XML ,MediaType.APPLICATION_JSON})
 	public Response updateRoles(@PathParam("identityKey") Long identityKey, RolesVO roles, @Context HttpServletRequest request) {
-		BaseSecurity securityManager = CoreSpringFactory.getImpl(BaseSecurity.class);
-		OrganisationService organisationService = CoreSpringFactory.getImpl(OrganisationService.class);
-		
 		boolean isUserManager = isUserManager(request);
 		if(!isUserManager) {
 			return Response.serverError().status(Status.FORBIDDEN).build();
@@ -345,13 +358,14 @@ public class UserWebService {
 		Identity actingIdentity = getIdentity(request);
 		Organisation defOrganisation = organisationService.getDefaultOrganisation();
 		boolean userRole = !roles.isGuestOnly() && !roles.isInvitee();
-		boolean coachRole = false;
 		RolesByOrganisation modifiedRoles = RolesByOrganisation.roles(defOrganisation,
-				roles.isGuestOnly(), roles.isInvitee(), userRole, coachRole,
-				roles.isAuthor(), roles.isGroupManager(), roles.isPoolAdmin(), roles.isCurriculumManager(),
+				roles.isGuestOnly(), roles.isInvitee(), userRole, roles.isAuthor(),
+				roles.isGroupManager(), roles.isPoolAdmin(), roles.isCurriculumManager(),
 				roles.isUserManager(), roles.isInstitutionalResourceManager(), roles.isOlatAdmin());
 		securityManager.updateRoles(actingIdentity, identity, modifiedRoles);
-		return Response.ok(new RolesVO(roles.toRoles())).build();
+		dbInstance.commit();// make sure all is committed before loading the roles again
+		Roles updatedRoles = securityManager.getRoles(identity);
+		return Response.ok(new RolesVO(updatedRoles)).build();
 	}
 	
 	/**
@@ -359,9 +373,9 @@ public class UserWebService {
 	 * @response.representation.qname {http://www.example.com}statusVO
 	 * @response.representation.200.mediaType application/xml, application/json
 	 * @response.representation.200.doc The user
-   * @response.representation.200.example {@link org.olat.user.restapi.Examples#SAMPLE_STATUSVO}
-   * @response.representation.401.doc The roles of the authenticated user are not sufficient
-   * @response.representation.404.doc The identity not found
+	 * @response.representation.200.example {@link org.olat.user.restapi.Examples#SAMPLE_STATUSVO}
+	 * @response.representation.401.doc The roles of the authenticated user are not sufficient
+	 * @response.representation.404.doc The identity not found
 	 * @param identityKey The user key identifier of the user being searched
 	 * @param httpRequest The HTTP request
 	 * @return an xml or json representation of a the status being search.
@@ -374,7 +388,7 @@ public class UserWebService {
 		if(!isUserManager) {
 			return Response.serverError().status(Status.FORBIDDEN).build();
 		}
-		Identity identity = BaseSecurityManager.getInstance().loadIdentityByKey(identityKey, false);
+		Identity identity = securityManager.loadIdentityByKey(identityKey, false);
 		if(identity == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
@@ -409,25 +423,21 @@ public class UserWebService {
 	@Consumes({MediaType.APPLICATION_XML ,MediaType.APPLICATION_JSON})
 	@Produces({MediaType.APPLICATION_XML ,MediaType.APPLICATION_JSON})
 	public Response updateStatus(@PathParam("identityKey") Long identityKey, StatusVO status, @Context HttpServletRequest request) {
-		try {
-			Identity actingIdentity = getIdentity(request);
-			boolean isUserManager = isUserManager(request);
-			if(actingIdentity == null || !isUserManager) {
-				return Response.serverError().status(Status.FORBIDDEN).build();
-			}
-			Identity identity = BaseSecurityManager.getInstance().loadIdentityByKey(identityKey, false);
-			if(identity == null) {
-				return Response.serverError().status(Status.NOT_FOUND).build();
-			}
-			
-			Integer newStatus = status.getStatus();
-			identity = BaseSecurityManager.getInstance().saveIdentityStatus(identity, newStatus, actingIdentity);
-			StatusVO reloadedStatus = new StatusVO();
-			reloadedStatus.setStatus(identity.getStatus());
-			return Response.ok(reloadedStatus).build();
-		} catch (Throwable e) {
-			throw new WebApplicationException(e);
+		Identity actingIdentity = getIdentity(request);
+		boolean isUserManager = isUserManager(request);
+		if(actingIdentity == null || !isUserManager) {
+			return Response.serverError().status(Status.FORBIDDEN).build();
+		}
+		Identity identity = securityManager.loadIdentityByKey(identityKey, false);
+		if(identity == null) {
+			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
+		
+		Integer newStatus = status.getStatus();
+		identity = securityManager.saveIdentityStatus(identity, newStatus, actingIdentity);
+		StatusVO reloadedStatus = new StatusVO();
+		reloadedStatus.setStatus(identity.getStatus());
+		return Response.ok(reloadedStatus).build();
 	}
 	
 	/**
@@ -450,7 +460,7 @@ public class UserWebService {
 			return Response.serverError().status(Status.FORBIDDEN).build();
 		}
 		
-		Identity identity = BaseSecurityManager.getInstance().loadIdentityByKey(identityKey, false);
+		Identity identity = securityManager.loadIdentityByKey(identityKey, false);
 		if(identity == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
@@ -480,14 +490,14 @@ public class UserWebService {
 		if(!isUserManager) {
 			return Response.serverError().status(Status.FORBIDDEN).build();
 		}
-		Identity identity = BaseSecurityManager.getInstance().loadIdentityByKey(identityKey, false);
+		Identity identity = securityManager.loadIdentityByKey(identityKey, false);
 		if(identity == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
 
 		Preferences prefs = identity.getUser().getPreferences();
 		prefs.setLanguage(preferences.getLanguage());
-		UserManager.getInstance().updateUserFromIdentity(identity);
+		userManager.updateUserFromIdentity(identity);
 		return Response.ok(new PreferencesVO(prefs)).build();
 	}
 	
@@ -511,7 +521,7 @@ public class UserWebService {
 	@Produces({MediaType.APPLICATION_XML ,MediaType.APPLICATION_JSON})
 	public Response findById(@PathParam("identityKey") Long identityKey, @QueryParam("withPortrait") @DefaultValue("false") Boolean withPortrait,
 			@Context HttpServletRequest httpRequest) {
-		Identity identity = BaseSecurityManager.getInstance().loadIdentityByKey(identityKey, false);
+		Identity identity = securityManager.loadIdentityByKey(identityKey, false);
 		if(identity == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
@@ -523,7 +533,7 @@ public class UserWebService {
 	
 	@Path("{identityKey}/folders")
 	public UserFoldersWebService getFoldersWebService(@PathParam("identityKey") Long identityKey) {
-		Identity identity = BaseSecurityManager.getInstance().loadIdentityByKey(identityKey, false);
+		Identity identity = securityManager.loadIdentityByKey(identityKey, false);
 		if(identity == null) {
 			throw new WebApplicationException(Response.serverError().status(Status.NOT_FOUND).build());
 		}
@@ -533,7 +543,7 @@ public class UserWebService {
 	@Path("{identityKey}/courses")
 	public UserCoursesWebService getCoursesWebService(@PathParam("identityKey") Long identityKey,
 			@Context HttpServletRequest httpRequest) {
-		Identity identity = BaseSecurityManager.getInstance().loadIdentityByKey(identityKey, false);
+		Identity identity = securityManager.loadIdentityByKey(identityKey, false);
 		if(identity == null) {
 			throw new WebApplicationException(Response.serverError().status(Status.NOT_FOUND).build());
 		}
@@ -559,12 +569,12 @@ public class UserWebService {
 	@Path("{identityKey}/portrait")
 	@Produces({"image/jpeg","image/jpg",MediaType.APPLICATION_OCTET_STREAM})
 	public Response getPortraitHead(@PathParam("identityKey") Long identityKey) {
-		IdentityShort identity = CoreSpringFactory.getImpl(BaseSecurity.class).loadIdentityShortByKey(identityKey);
+		IdentityShort identity = securityManager.loadIdentityShortByKey(identityKey);
 		if(identity == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
 		
-		File portrait = CoreSpringFactory.getImpl(DisplayPortraitManager.class).getBigPortrait(identity.getName());
+		File portrait = portraitManager.getBigPortrait(identity.getName());
 		if(portrait == null || !portrait.exists()) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
@@ -585,13 +595,11 @@ public class UserWebService {
 	@Path("{identityKey}/portrait/{size}")
 	@Produces({"image/jpeg","image/jpg",MediaType.APPLICATION_OCTET_STREAM})
 	public Response getOriginalPortraitHead(@PathParam("identityKey") Long identityKey, @PathParam("size") String size) {
-		IdentityShort identity = CoreSpringFactory.getImpl(BaseSecurity.class).loadIdentityShortByKey(identityKey);
+		IdentityShort identity = securityManager.loadIdentityShortByKey(identityKey);
 		if(identity == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
-		
-		DisplayPortraitManager portraitManager = CoreSpringFactory.getImpl(DisplayPortraitManager.class);
-		
+
 		File portrait = null;
 		if("master".equals(size)) {
 			portrait = portraitManager.getMasterPortrait(identity.getName());
@@ -621,12 +629,12 @@ public class UserWebService {
 	@Path("{identityKey}/portrait")
 	@Produces({"image/jpeg","image/jpg",MediaType.APPLICATION_OCTET_STREAM})
 	public Response getPortrait(@PathParam("identityKey") Long identityKey, @Context Request request) {
-		IdentityShort identity = CoreSpringFactory.getImpl(BaseSecurity.class).loadIdentityShortByKey(identityKey);
+		IdentityShort identity = securityManager.loadIdentityShortByKey(identityKey);
 		if(identity == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
 		
-		File portrait = CoreSpringFactory.getImpl(DisplayPortraitManager.class).getBigPortrait(identity.getName());
+		File portrait = portraitManager.getBigPortrait(identity.getName());
 		if(portrait == null || !portrait.exists()) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
@@ -656,7 +664,7 @@ public class UserWebService {
 	public Response postPortrait(@PathParam("identityKey") Long identityKey, @Context HttpServletRequest request) {
 		MultipartReader partsReader = null;
 		try {
-			IdentityShort identity = CoreSpringFactory.getImpl(BaseSecurity.class).loadIdentityShortByKey(identityKey);
+			IdentityShort identity = securityManager.loadIdentityShortByKey(identityKey);
 			if(identity == null) {
 				return Response.serverError().status(Status.NOT_FOUND).build();
 			}
@@ -668,7 +676,7 @@ public class UserWebService {
 			partsReader = new MultipartReader(request);
 			File tmpFile = partsReader.getFile();
 			String filename = partsReader.getFilename();
-			CoreSpringFactory.getImpl(DisplayPortraitManager.class).setPortrait(tmpFile, filename, identity.getName());
+			portraitManager.setPortrait(tmpFile, filename, identity.getName());
 			return Response.ok().build();
 		} catch (Exception e) {
 			throw new WebApplicationException(e);
@@ -689,20 +697,20 @@ public class UserWebService {
 	@Path("{identityKey}/portrait")
 	public Response deletePortrait(@PathParam("identityKey") Long identityKey, @Context HttpServletRequest request) {
 		Identity authIdentity = getUserRequest(request).getIdentity();
-		Identity identity = CoreSpringFactory.getImpl(BaseSecurity.class).loadIdentityByKey(identityKey, false);
+		Identity identity = securityManager.loadIdentityByKey(identityKey, false);
 		if(identity == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		} else if(!isUserManager(request) && !identity.equalsByPersistableKey(authIdentity)) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 	
-		CoreSpringFactory.getImpl(DisplayPortraitManager.class).deletePortrait(identity);
+		portraitManager.deletePortrait(identity);
 		return Response.ok().build();
 	}
 
 	@Path("{identityKey}/groups")
 	public MyGroupWebService getUserGroupList(@PathParam("identityKey") Long identityKey) {
-		Identity retrievedUser = BaseSecurityManager.getInstance().loadIdentityByKey(identityKey, false);
+		Identity retrievedUser = securityManager.loadIdentityByKey(identityKey, false);
 		if(retrievedUser == null) {
 			return null;
 		}
@@ -742,8 +750,7 @@ public class UserWebService {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 
-		BaseSecurity baseSecurity = BaseSecurityManager.getInstance();
-		Identity retrievedIdentity = baseSecurity.loadIdentityByKey(identityKey, false);
+		Identity retrievedIdentity = securityManager.loadIdentityByKey(identityKey, false);
 		if(retrievedIdentity == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
@@ -753,13 +760,13 @@ public class UserWebService {
 		if(errors.isEmpty()) {
 			if(StringHelper.containsNonWhitespace(user.getExternalId())
 					&& !user.getExternalId().equals(retrievedIdentity.getExternalId())) {
-				retrievedIdentity = baseSecurity.setExternalId(retrievedIdentity, user.getExternalId());
+				retrievedIdentity = securityManager.setExternalId(retrievedIdentity, user.getExternalId());
 				retrievedUser = retrievedIdentity.getUser();
 			}
 			String oldEmail = retrievedUser.getEmail();
 			post(retrievedUser, user, getLocale(request));
-			UserManager.getInstance().updateUser(retrievedUser);
-			BaseSecurityManager.getInstance().deleteInvalidAuthenticationsByEmail(oldEmail);
+			userManager.updateUser(retrievedUser);
+			securityManager.deleteInvalidAuthenticationsByEmail(oldEmail);
 			return Response.ok(get(retrievedIdentity, true, true)).build();
 		}
 		
@@ -770,19 +777,17 @@ public class UserWebService {
 	}
 
 	private List<ErrorVO> validateUser(User user, UserVO userVo, HttpServletRequest request) {
-		UserManager um = UserManager.getInstance();
-		
 		Locale locale = getLocale(request);
 		List<ErrorVO> errors = new ArrayList<>();
-		List<UserPropertyHandler> propertyHandlers = um.getUserPropertyHandlersFor(PROPERTY_HANDLER_IDENTIFIER, false);
-		validateProperty(user, UserConstants.FIRSTNAME, userVo.getFirstName(), propertyHandlers, errors, um, locale);
-		validateProperty(user, UserConstants.LASTNAME, userVo.getLastName(), propertyHandlers, errors, um, locale);
-		validateProperty(user, UserConstants.EMAIL, userVo.getEmail(), propertyHandlers, errors, um, locale);
+		List<UserPropertyHandler> propertyHandlers = userManager.getUserPropertyHandlersFor(PROPERTY_HANDLER_IDENTIFIER, false);
+		validateProperty(user, UserConstants.FIRSTNAME, userVo.getFirstName(), propertyHandlers, errors, userManager, locale);
+		validateProperty(user, UserConstants.LASTNAME, userVo.getLastName(), propertyHandlers, errors, userManager, locale);
+		validateProperty(user, UserConstants.EMAIL, userVo.getEmail(), propertyHandlers, errors, userManager, locale);
 		for (UserPropertyHandler propertyHandler : propertyHandlers) {
 			if(!UserConstants.FIRSTNAME.equals(propertyHandler.getName())
 					&& !UserConstants.LASTNAME.equals(propertyHandler.getName())
 					&& !UserConstants.EMAIL.equals(propertyHandler.getName())) {
-				validateProperty(user, userVo, propertyHandler, errors, um, locale);
+				validateProperty(user, userVo, propertyHandler, errors, userManager, locale);
 			}
 		}
 		return errors;
@@ -821,7 +826,7 @@ public class UserWebService {
 			return false;
 		} else if((userPropertyHandler.getName().equals(UserConstants.INSTITUTIONALEMAIL) && StringHelper.containsNonWhitespace(value)) 
 				|| userPropertyHandler.getName().equals(UserConstants.EMAIL)) {
-			if (!UserManager.getInstance().isEmailAllowed(value, user)) {
+			if (!userManager.isEmailAllowed(value, user)) {
 				String pack = userPropertyHandler.getClass().getPackage().getName();
 				Translator translator = new PackageTranslator(pack, locale);
 				String translation = translator.translate("form.name." + userPropertyHandler.getName() + ".error.exists", new String[] { value });
@@ -851,11 +856,11 @@ public class UserWebService {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 		
-		Identity identity = BaseSecurityManager.getInstance().loadIdentityByKey(identityKey, false);
+		Identity identity = securityManager.loadIdentityByKey(identityKey, false);
 		if(identity == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
-		boolean success = UserDeletionManager.getInstance().deleteIdentity(identity, actingIdentity);
+		boolean success = userDeletionManager.deleteIdentity(identity, actingIdentity);
 		if (success) {
 			return Response.ok().build();			
 		} else {
diff --git a/src/main/java/org/olat/user/ui/admin/UserAdminMainController.java b/src/main/java/org/olat/user/ui/admin/UserAdminMainController.java
index 8216f5386ba..567bf68eddd 100644
--- a/src/main/java/org/olat/user/ui/admin/UserAdminMainController.java
+++ b/src/main/java/org/olat/user/ui/admin/UserAdminMainController.java
@@ -39,7 +39,6 @@ import org.olat.admin.user.UsermanagerUserSearchController;
 import org.olat.admin.user.delete.DirectDeleteController;
 import org.olat.admin.user.delete.TabbedPaneController;
 import org.olat.admin.user.imp.UserImportController;
-import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.BaseSecurityModule;
 import org.olat.basesecurity.GroupRoles;
 import org.olat.basesecurity.OrganisationRoles;
@@ -55,6 +54,7 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
+import org.olat.core.gui.components.stack.PopEvent;
 import org.olat.core.gui.components.stack.TooledStackedPanel;
 import org.olat.core.gui.components.stack.TooledStackedPanel.Align;
 import org.olat.core.gui.components.tree.GenericTreeModel;
@@ -72,6 +72,7 @@ import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Organisation;
 import org.olat.core.id.OrganisationRef;
+import org.olat.core.id.Roles;
 import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.StateEntry;
@@ -113,15 +114,13 @@ public class UserAdminMainController extends MainLayoutBasicController implement
 	private DirectDeleteController directDeleteCtrl;
 	private LayoutMain3ColsController columnLayoutCtr;
 
-	private final boolean isOlatAdmin;
+	private final Roles identityRoles;
 	private List<Organisation> manageableOrganisations;
 
 	private LockResult lock;
 	@Autowired
 	private UserManager userManager;
 	@Autowired
-	private BaseSecurity securityManager;
-	@Autowired
 	private OrganisationService organisationService;
 
 	/**
@@ -133,10 +132,10 @@ public class UserAdminMainController extends MainLayoutBasicController implement
 		super(ureq, wControl);
 		
 		UserSession usess = ureq.getUserSession();
-		isOlatAdmin = usess.getRoles().isOLATAdmin();
+		identityRoles = usess.getRoles();
 	
 		manageableOrganisations = organisationService.getOrganisations(getIdentity(), usess.getRoles(),
-				OrganisationRoles.administrator, OrganisationRoles.usermanager);
+				OrganisationRoles.administrator, OrganisationRoles.usermanager, OrganisationRoles.rolesmanager);
 
 		menuTree = new MenuTree("olatMenuTree");
 		menuTree.setExpandSelectedNode(false);
@@ -150,7 +149,7 @@ public class UserAdminMainController extends MainLayoutBasicController implement
 		// allow closing of active menu tree element
 		menuTree.setExpandSelectedNode(false);
 		
-		content = new TooledStackedPanel("coaching-stack", getTranslator(), this);
+		content = new TooledStackedPanel("user-admin-stack", getTranslator(), this);
 		content.setInvisibleCrumb(0);
 		content.setNeverDisposeRootController(true);
 
@@ -162,7 +161,7 @@ public class UserAdminMainController extends MainLayoutBasicController implement
 	}
 
 	private void initTools() {
-		if (isOlatAdmin || BaseSecurityModule.USERMANAGER_CAN_CREATE_USER.booleanValue()) {
+		if (identityRoles.isAdministrator() || ((identityRoles.isUserManager() || identityRoles.isRolesManager()) && BaseSecurityModule.USERMANAGER_CAN_CREATE_USER.booleanValue())) {
 			createLink = LinkFactory.createToolLink("ucreate", translate("menu.ucreate"), this, "o_icon_add_member");
 			createLink.setElementCssClass("o_sel_useradmin_create");
 			content.addTool(createLink, Align.right);
@@ -172,7 +171,7 @@ public class UserAdminMainController extends MainLayoutBasicController implement
 			content.addTool(importLink, Align.right);
 		}
 
-		if (isOlatAdmin || BaseSecurityModule.USERMANAGER_CAN_DELETE_USER.booleanValue()) {
+		if (identityRoles.isAdministrator() ||((identityRoles.isUserManager() || identityRoles.isRolesManager()) && BaseSecurityModule.USERMANAGER_CAN_DELETE_USER.booleanValue())) {
 			deleteLink = LinkFactory.createToolLink("userdelete", translate("menu.userdelete"), this, "o_icon_delete");
 			deleteLink.setElementCssClass("o_sel_useradmin_delete");
 			content.addTool(deleteLink, Align.right);
@@ -192,6 +191,13 @@ public class UserAdminMainController extends MainLayoutBasicController implement
 			} else { // the action was not allowed anymore
 				content.popUpToRootController(ureq);
 			}
+		} else if(source == content) {
+			if(event instanceof PopEvent) {
+				PopEvent pe = (PopEvent)event;
+				if(pe.getController() == editCtrl) {
+					
+				}
+			}
 		} else if(createLink == source) {
 			doCreateUser(ureq);
 		} else if(importLink == source) {
@@ -210,21 +216,14 @@ public class UserAdminMainController extends MainLayoutBasicController implement
 				SingleIdentityChosenEvent sice = (SingleIdentityChosenEvent)event;
 				doEditCreatedUser(ureq, sice.getChosenIdentity());
 			}
-			
 		}
 		super.event(ureq, source, event);
 	}
 	
 	private void doCreateUser(UserRequest ureq) {
-		boolean canCreateOLATPassword = false;
-		if (ureq.getUserSession().getRoles().isOLATAdmin()) {
-			// admin will override configuration
-			canCreateOLATPassword = true;
-		} else {
-			Boolean canCreatePwdByConfig = BaseSecurityModule.USERMANAGER_CAN_CREATE_PWD;				
-			canCreateOLATPassword = canCreatePwdByConfig.booleanValue();
-		}
-		
+		Roles roles = ureq.getUserSession().getRoles();
+		boolean canCreateOLATPassword = roles.isAdministrator() || roles.isRolesManager() || roles.isUserManager();
+
 		OLATResourceable ores = OresHelper.createOLATResourceableInstance("Create", 0l);
 		WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
 		addToHistory(ureq, bwControl);
@@ -238,7 +237,7 @@ public class UserAdminMainController extends MainLayoutBasicController implement
 	private void doEditCreatedUser(UserRequest ureq, Identity newIdentity) {
 		OLATResourceable ores = OresHelper.createOLATResourceableInstance("Create", 0l);
 		WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
-		editCtrl = new UserAdminController(ureq, bwControl, newIdentity);
+		editCtrl = new UserAdminController(ureq, bwControl, content, newIdentity);
 		editCtrl.setBackButtonEnabled(false);
 		editCtrl.setShowTitle(false);
 		listenTo(editCtrl);
@@ -247,14 +246,9 @@ public class UserAdminMainController extends MainLayoutBasicController implement
 	}
 	
 	private void doImportUser(UserRequest ureq) {
-		boolean canCreateOLATPassword = false;
-		if (ureq.getUserSession().getRoles().isOLATAdmin()) {
-			// admin will override configuration
-			canCreateOLATPassword = true;
-		} else {
-			Boolean canCreatePwdByConfig = BaseSecurityModule.USERMANAGER_CAN_CREATE_PWD;				
-			canCreateOLATPassword = canCreatePwdByConfig.booleanValue();
-		}
+		Roles roles = ureq.getUserSession().getRoles();
+		boolean canCreateOLATPassword = roles.isAdministrator() || roles.isRolesManager() || roles.isUserManager();
+
 		importCtrl = new UserImportController(ureq, getWindowControl(), canCreateOLATPassword);
 		addToHistory(ureq, importCtrl);
 		listenTo(importCtrl);
@@ -322,14 +316,13 @@ public class UserAdminMainController extends MainLayoutBasicController implement
 			case "noauthentication": return createUserSearchController(ureq, bwControl,
 					SearchIdentityParams.authenticationProviders(new String[]{ null }, Identity.STATUS_VISIBLE_LIMIT));
 			case "userswithoutgroup":
-				List<Identity> usersWithoutGroup = securityManager.findIdentitiesWithoutBusinessGroup(Identity.STATUS_VISIBLE_LIMIT);
-				return new UsermanagerUserSearchController(ureq, bwControl, content, usersWithoutGroup, null, true, true);
+				return createUserSearchController(ureq, bwControl, SearchIdentityParams.withBusinesGroups());
 			case "userswithoutemail":
 				List<Identity> usersWithoutEmail = userManager.findVisibleIdentitiesWithoutEmail();
-				return new UsermanagerUserSearchController(ureq, bwControl, content, usersWithoutEmail, null, true, true);
+				return new UsermanagerUserSearchController(ureq, bwControl, content, usersWithoutEmail, true, true);
 			case "usersemailduplicates":
 				List<Identity> usersEmailDuplicates = userManager.findVisibleIdentitiesWithEmailDuplicates();
-				return new UsermanagerUserSearchController(ureq, bwControl, content, usersEmailDuplicates, null, true, true);
+				return new UsermanagerUserSearchController(ureq, bwControl, content, usersEmailDuplicates, true, true);
 			default: return null;		
 		}
 	}
@@ -366,9 +359,11 @@ public class UserAdminMainController extends MainLayoutBasicController implement
 	}
 	
 	private UsermanagerUserSearchController createUserSearchController(UserRequest ureq, WindowControl bwControl, SearchIdentityParams predefinedQuery) {
-		if(manageableOrganisations != null && predefinedQuery.getOrganisations() != null) {
-			List<OrganisationRef> allowedOrganisations = new ArrayList<>(predefinedQuery.getOrganisations());
-			allowedOrganisations.retainAll(manageableOrganisations);
+		if(manageableOrganisations != null) {
+			List<OrganisationRef> allowedOrganisations = new ArrayList<>(manageableOrganisations);
+			if(predefinedQuery.getOrganisations() != null) {
+				allowedOrganisations.retainAll(predefinedQuery.getOrganisations());
+			}
 			predefinedQuery.setOrganisations(allowedOrganisations);
 		}
 		return new UsermanagerUserSearchController(ureq, bwControl, content, predefinedQuery, true);
@@ -492,9 +487,8 @@ public class UserAdminMainController extends MainLayoutBasicController implement
 		Map<Long, GenericTreeNode> fieldKeyToNode = new HashMap<>();
 		for(Organisation organisation:organisations) {
 			Long key = organisation.getKey();
-			GenericTreeNode node = fieldKeyToNode.computeIfAbsent(key, organisationKey -> {
-				return new GenericTreeNode(organisation.getDisplayName(), organisation);
-			});
+			GenericTreeNode node = fieldKeyToNode.computeIfAbsent(key, organisationKey -> 
+				new GenericTreeNode(organisation.getDisplayName(), organisation));
 
 			Organisation parentOrganisation = organisation.getParent();
 			if(parentOrganisation == null || !keytoOrganisations.containsKey(parentOrganisation.getKey())) {
@@ -514,7 +508,7 @@ public class UserAdminMainController extends MainLayoutBasicController implement
 	private void buildTreeAccessSubMenu(GenericTreeNode accessNode) {
 		appendNode("menu.usergroup", "menu.usergroup.alt", "usergroup", "o_sel_useradmin_usergroup", accessNode);
 		
-		if (isOlatAdmin || BaseSecurityModule.USERMANAGER_CAN_MANAGE_AUTHORS.booleanValue()) {
+		if (identityRoles.isAdministrator() || identityRoles.isPrincipal() || identityRoles.isUserManager() || identityRoles.isRolesManager()) {
 			appendNode("menu.authorgroup", "menu.authorgroup.alt", "authorgroup", "o_sel_useradmin_authorgroup", accessNode);
 			appendNode("menu.coauthors", "menu.coauthors.alt", "coauthors", "o_sel_useradmin_coauthors", accessNode);
 			appendNode("menu.resourceowners", "menu.resourceowners.alt", "resourceowners", "o_sel_useradmin_resourceowners", accessNode);
@@ -523,18 +517,20 @@ public class UserAdminMainController extends MainLayoutBasicController implement
 		appendNode("menu.coursecoach", "menu.coursecoach.alt", "coursecoach", "o_sel_useradmin_coursecoach", accessNode);
 		appendNode("menu.courseparticipants", "menu.courseparticipants.alt", "courseparticipants", "o_sel_useradmin_courseparticipants", accessNode);
 
-		if (isOlatAdmin || BaseSecurityModule.USERMANAGER_CAN_MANAGE_GROUPMANAGERS.booleanValue()) {
+		if (identityRoles.isAdministrator() || identityRoles.isPrincipal()
+				|| ((identityRoles.isUserManager() || identityRoles.isRolesManager()) && BaseSecurityModule.USERMANAGER_CAN_MANAGE_GROUPMANAGERS.booleanValue())) {
 			appendNode("menu.groupmanagergroup", "menu.groupmanagergroup.alt", "groupmanagergroup", "o_sel_useradmin_groupmanagergroup", accessNode);
 			appendNode("menu.groupcoach", "menu.groupcoach.alt", "groupcoach", "o_sel_useradmin_groupcoach", accessNode);
 		}
 		
 		// admin group and user manager group always restricted to admins
-		if (isOlatAdmin) {
+		if (identityRoles.isAdministrator() || identityRoles.isPrincipal()) {
 			appendNode("menu.usermanagergroup", "menu.usermanagergroup.alt", "usermanagergroup", "o_sel_useradmin_usermanagergroup", accessNode);
 			appendNode("menu.admingroup", "menu.admingroup.alt", "admingroup", "o_sel_useradmin_admingroup", accessNode);
 		}
 		
-		if (isOlatAdmin || BaseSecurityModule.USERMANAGER_CAN_MANAGE_GUESTS.booleanValue()) {
+		if (identityRoles.isAdministrator() || identityRoles.isPrincipal()
+				|| ((identityRoles.isUserManager() || identityRoles.isRolesManager()) && BaseSecurityModule.USERMANAGER_CAN_MANAGE_GUESTS.booleanValue())) {
 			appendNode("menu.anonymousgroup", "menu.anonymousgroup.alt", "anonymousgroup", "o_sel_useradmin_anonymousgroup", accessNode);
 		}
 		
@@ -545,7 +541,7 @@ public class UserAdminMainController extends MainLayoutBasicController implement
 
 	private void buildTreeQueriesSubMenu(GenericTreeNode queriesNode) {
 		appendNode("menu.userswithoutgroup", "menu.userswithoutgroup.alt", "userswithoutgroup", "o_sel_useradmin_userswithoutgroup", queriesNode);
-		if(isOlatAdmin) {
+		if(identityRoles.isAdministrator() || identityRoles.isPrincipal()) {
 			appendNode("menu.users.without.email", "menu.users.without.email.alt", "userswithoutemail", "o_sel_useradmin_userswithoutemail", queriesNode);
 			appendNode("menu.users.email.duplicate", "menu.users.email.duplicate.alt", "usersemailduplicates", "o_sel_useradmin_usersemailduplicates", queriesNode);
 		}
@@ -592,13 +588,7 @@ public class UserAdminMainController extends MainLayoutBasicController implement
 	@Override
 	public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
 		GenericTreeModel tm = (GenericTreeModel)menuTree.getTreeModel();
-		if(entries == null || entries.isEmpty()) {
-			TreeNode node = tm.getRootNode();
-			if(node.getChildCount() > 0) {
-				node = (TreeNode)node.getChildAt(0);
-			}
-			contentCtr = selectNode(ureq, node);
-		} else {
+		if(entries != null && !entries.isEmpty()) {
 			ContextEntry entry = entries.get(0);
 			String entryPoint = entry.getOLATResourceable().getResourceableTypeName();
 			if(entryPoint.startsWith("notifications") || entryPoint.startsWith("NewIdentityCreated")) {
@@ -622,6 +612,14 @@ public class UserAdminMainController extends MainLayoutBasicController implement
 				}
 			}
 		}
+		
+		if(contentCtr == null) {
+			TreeNode node = tm.getRootNode();
+			if(node.getChildCount() > 0) {
+				node = (TreeNode)node.getChildAt(0);
+			}
+			contentCtr = selectNode(ureq, node);
+		}
 	}
 	
 	private Controller selectNode(UserRequest ureq, TreeNode node) {
@@ -629,38 +627,6 @@ public class UserAdminMainController extends MainLayoutBasicController implement
 		return pushController(ureq, node);
 	}
 
-	public void activate(UserRequest ureq, String viewIdentifier) {
-		if(viewIdentifier == null) return;
-		
-		if(viewIdentifier.startsWith("notifications") || viewIdentifier.startsWith("NewIdentityCreated")) {
-			GenericTreeModel tm = (GenericTreeModel)menuTree.getTreeModel();
-			TreeNode node = tm.findNodeByUserObject("created.newUsersNotification");
-			contentCtr = selectNode(ureq, node);
-		} else if(viewIdentifier.startsWith("AE")) {
-			String posStr = viewIdentifier.substring(3);
-			try {
-				GenericTreeModel treeModel = (GenericTreeModel)menuTree.getTreeModel();
-				TreeNode node = treeModel.findNodeByUserObject("menuqueries");
-				int pos = Integer.parseInt(posStr);
-				if(pos >= 0 && pos < node.getChildCount()) {
-					TreeNode childNode = (TreeNode)node.getChildAt(pos);
-					contentCtr = selectNode(ureq, childNode);
-				}
-			} catch (Exception e) {
-				logWarn("", e);
-			}	
-		} else {
-			int first = viewIdentifier.indexOf(":");
-			String uobject = viewIdentifier.substring(0, first);
-			GenericTreeModel treeModel = (GenericTreeModel)menuTree.getTreeModel();
-			TreeNode node = treeModel.findNodeByUserObject(uobject);
-			if(node == null) {
-				node = treeModel.getRootNode();
-			}
-			contentCtr = selectNode(ureq, node);
-		}
-	}
-
 	@Override
 	protected void doDispose() {
 		// controllers disposed in BasicController
diff --git a/src/main/java/org/olat/user/ui/admin/UserSearchTableController.java b/src/main/java/org/olat/user/ui/admin/UserSearchTableController.java
index af3a1af2533..ec9b38fa7e2 100644
--- a/src/main/java/org/olat/user/ui/admin/UserSearchTableController.java
+++ b/src/main/java/org/olat/user/ui/admin/UserSearchTableController.java
@@ -19,24 +19,33 @@
  */
 package org.olat.user.ui.admin;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import org.olat.admin.user.ExtendedIdentitiesTableDataModel;
 import org.olat.admin.user.UserAdminController;
 import org.olat.admin.user.UsermanagerUserSearchController;
+import org.olat.admin.user.bulkChange.UserBulkChangeManager;
+import org.olat.admin.user.bulkChange.UserBulkChangeStep00;
+import org.olat.admin.user.bulkChange.UserBulkChanges;
 import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.BaseSecurityModule;
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.basesecurity.SearchIdentityParams;
 import org.olat.basesecurity.model.IdentityPropertiesRow;
 import org.olat.core.commons.persistence.DefaultResultInfos;
 import org.olat.core.commons.persistence.ResultInfos;
 import org.olat.core.commons.persistence.SortKey;
 import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement;
 import org.olat.core.gui.components.form.flexible.elements.FlexiTableFilter;
+import org.olat.core.gui.components.form.flexible.elements.FormLink;
 import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
 import org.olat.core.gui.components.form.flexible.impl.FormEvent;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel;
@@ -45,19 +54,30 @@ import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTable
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataSourceDelegate;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.SelectionEvent;
+import org.olat.core.gui.components.link.Link;
+import org.olat.core.gui.components.link.LinkFactory;
 import org.olat.core.gui.components.stack.TooledStackedPanel;
+import org.olat.core.gui.components.stack.TooledStackedPanel.Align;
 import org.olat.core.gui.control.Controller;
+import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
+import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
+import org.olat.core.gui.control.generic.wizard.Step;
+import org.olat.core.gui.control.generic.wizard.StepRunnerCallback;
+import org.olat.core.gui.control.generic.wizard.StepsMainRunController;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Roles;
 import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
 import org.olat.core.util.Util;
+import org.olat.core.util.mail.ContactList;
+import org.olat.core.util.mail.ContactMessage;
 import org.olat.core.util.resource.OresHelper;
+import org.olat.modules.co.ContactFormController;
 import org.olat.user.UserManager;
-import org.olat.user.UserPropertiesRow;
 import org.olat.user.propertyhandlers.UserPropertyHandler;
 import org.olat.user.ui.admin.UserSearchTableModel.UserCols;
+import org.olat.user.ui.identity.UserInfoSegmentedController;
 import org.olat.util.logging.activity.LoggingResourceable;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -72,16 +92,29 @@ public class UserSearchTableController extends FormBasicController {
 	private static final String USER_PROPS_ID = ExtendedIdentitiesTableDataModel.class.getCanonicalName();
 	public static final int USER_PROPS_OFFSET = 500;
 	
+	private Link nextLink;
+	private Link previousLink;
+	private FormLink mailButton;
+	private FormLink bulkChangesButton;
+	
 	private FlexiTableElement tableEl;
 	private UserSearchTableModel tableModel;
 	private TooledStackedPanel stackPanel;
 	
+	private CloseableModalController cmc;
 	private UserAdminController userAdminCtr;
+	private ContactFormController contactCtr;
+	private UserInfoSegmentedController userInfoCtr;
+	private StepsMainRunController userBulkChangesController; 
 	
+	private final Roles roles;
 	private final boolean vCard;
+	private final boolean bulkMail;
 	private final boolean isAdministrativeUser;
 	private List<UserPropertyHandler> userPropertyHandlers;
-	
+
+	@Autowired
+	private UserBulkChangeManager userBulkChangesManager;
 	@Autowired
 	private UserManager userManager;
 	@Autowired
@@ -89,14 +122,16 @@ public class UserSearchTableController extends FormBasicController {
 	@Autowired
 	private BaseSecurityModule securityModule;
 	
-	public UserSearchTableController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel, boolean vCard) {
+	public UserSearchTableController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel,
+			boolean bulkMail, boolean vCard) {
 		super(ureq, wControl, "search_table");
 		this.vCard = vCard;
+		this.bulkMail = bulkMail;
 		this.stackPanel = stackPanel;
 		setTranslator(Util.createPackageTranslator(UsermanagerUserSearchController.class, getLocale(), getTranslator()));
 		setTranslator(userManager.getPropertyHandlerTranslator(getTranslator()));
 		
-		Roles roles = ureq.getUserSession().getRoles();
+		roles = ureq.getUserSession().getRoles();
 		isAdministrativeUser = securityModule.isUserAllowedAdminProps(roles);
 		userPropertyHandlers = userManager.getUserPropertyHandlersFor(USER_PROPS_ID, isAdministrativeUser);
 		
@@ -105,6 +140,18 @@ public class UserSearchTableController extends FormBasicController {
 
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
+		previousLink = LinkFactory.createToolLink("previouselement","", this, "o_icon_previous_toolbar");
+		previousLink.setTitle(translate("command.previous"));
+		nextLink = LinkFactory.createToolLink("nextelement","", this, "o_icon_next_toolbar");
+		nextLink.setTitle(translate("command.next"));
+		
+		if(bulkMail) {
+			mailButton = uifactory.addFormLink("command.mail", formLayout, Link.BUTTON);
+		}
+		if(roles.isAdministrator() || roles.isUserManager() || roles.isRolesManager()) {
+			bulkChangesButton = uifactory.addFormLink("bulkChange.title", formLayout, Link.BUTTON);
+		}
+		
 		FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
 		if(isAdministrativeUser) {
 			columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(false, UserCols.id));
@@ -133,6 +180,9 @@ public class UserSearchTableController extends FormBasicController {
 		tableEl.setCustomizeColumns(true);
 		tableEl.setEmtpyTableMessageKey("error.no.user.found");
 		tableEl.setExportEnabled(true);
+		tableEl.setMultiSelect(true);
+		tableEl.setSelectAllEnable(true);
+		tableEl.setAndLoadPersistedPreferences(ureq, "user_search_table");
 	}
 	
 	public void loadModel(SearchIdentityParams params) {
@@ -152,11 +202,47 @@ public class UserSearchTableController extends FormBasicController {
 		//
 	}
 
+	@Override
+	protected void event(UserRequest ureq, Controller source, Event event) {
+		if(userBulkChangesController == source) {
+			if(event == Event.CANCELLED_EVENT || event == Event.DONE_EVENT || event == Event.CHANGED_EVENT) {
+				getWindowControl().pop();
+			}
+			if (event == Event.CHANGED_EVENT) {
+				doFinishBulkEdit();
+			} else if (event == Event.DONE_EVENT) {
+				showError("bulkChange.failed");
+			}
+			if(event == Event.CANCELLED_EVENT || event == Event.DONE_EVENT || event == Event.CHANGED_EVENT) {
+				cleanUp();
+			}	
+		} else if(contactCtr == source) {
+			cmc.deactivate();
+			cleanUp();
+		} else if(userInfoCtr == source) {
+			stackPanel.popController(userInfoCtr);
+			cleanUp();
+		} else if(cmc == source) {
+			cleanUp();
+		}
+		super.event(ureq, source, event);
+	}
+	
+	private void cleanUp() {
+		removeAsListenerAndDispose(userBulkChangesController);
+		removeAsListenerAndDispose(userInfoCtr);
+		removeAsListenerAndDispose(contactCtr);
+		removeAsListenerAndDispose(cmc);
+		userBulkChangesController = null;
+		userInfoCtr = null;
+		contactCtr = null;
+		cmc = null;
+	}
+
 	@Override
 	protected void formOK(UserRequest ureq) {
 		//
 	}
-
 	
 	@Override
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
@@ -164,16 +250,56 @@ public class UserSearchTableController extends FormBasicController {
 			if(event instanceof SelectionEvent) {
 				SelectionEvent te = (SelectionEvent) event;
 				String cmd = te.getCommand();
-				UserPropertiesRow userRow = tableModel.getObject(te.getIndex());
+				IdentityPropertiesRow userRow = tableModel.getObject(te.getIndex());
 				if("select".equals(cmd)) {
 					doSelectIdentity(ureq, userRow);
+				} else if("vcard".equals(cmd)) {
+					doSelectVcard(ureq, userRow);
 				}
 			}
+		} else if(mailButton == source) {
+			doMail(ureq);
+		} else if(bulkChangesButton == source) {
+			doBulkEdit(ureq);
 		}
 		super.formInnerEvent(ureq, source, event);
 	}
 	
-	private void doSelectIdentity(UserRequest ureq, UserPropertiesRow userRow) {
+	@Override
+	public void event(UserRequest ureq, Component source, Event event) {
+		if(nextLink == source) {
+			Index index = (Index)nextLink.getUserObject();
+			doNext(ureq, index.getRow(), index.isVcard()); 
+		} else if(previousLink == source) {
+			Index index = (Index)previousLink.getUserObject();
+			doPrevious(ureq, index.getRow(), index.isVcard()); 
+		}
+		super.event(ureq, source, event);
+	}
+	
+	private void doNext(UserRequest ureq, IdentityPropertiesRow current, boolean vcard) {
+		stackPanel.popUpToController(this);
+		
+		IdentityPropertiesRow nextRow = tableModel.getNextObject(current, tableEl);
+		if(vcard) {
+			doSelectVcard(ureq, nextRow);
+		} else {
+			doSelectIdentity(ureq, nextRow);
+		}
+	}
+	
+	private void doPrevious(UserRequest ureq, IdentityPropertiesRow current, boolean vcard) {
+		stackPanel.popUpToController(this);
+		
+		IdentityPropertiesRow previousRow = tableModel.getPreviousObject(current, tableEl);
+		if(vcard) {
+			doSelectVcard(ureq, previousRow);
+		} else {
+			doSelectIdentity(ureq, previousRow);
+		}
+	}
+
+	private void doSelectIdentity(UserRequest ureq, IdentityPropertiesRow userRow) {
 		removeAsListenerAndDispose(userAdminCtr);
 		
 		Identity identity = securityManager.loadIdentityByKey(userRow.getIdentityKey());
@@ -182,12 +308,162 @@ public class UserSearchTableController extends FormBasicController {
 		ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
 		WindowControl bwControl = addToHistory(ureq, ores, null);
 
-		userAdminCtr = new UserAdminController(ureq, bwControl, identity);
+		userAdminCtr = new UserAdminController(ureq, bwControl, stackPanel, identity);
 		userAdminCtr.setBackButtonEnabled(false);
 		listenTo(userAdminCtr);
 
 		String fullName = userManager.getUserDisplayName(identity);
 		stackPanel.pushController(fullName, userAdminCtr);
+		stackPanel.addTool(previousLink, Align.rightEdge, false, "o_tool_previous");
+		stackPanel.addTool(nextLink, Align.rightEdge, false, "o_tool_next");
+		updateNextPrevious(userRow, false);	
+	}
+	
+	private void doSelectVcard(UserRequest ureq, IdentityPropertiesRow userRow) {
+		Identity identity = securityManager.loadIdentityByKey(userRow.getIdentityKey());
+		
+		OLATResourceable ores = OresHelper.createOLATResourceableInstance("VCard", identity.getKey());
+		ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
+		WindowControl bwControl = addToHistory(ureq, ores, null);
+		userInfoCtr = new UserInfoSegmentedController(ureq, bwControl, identity, true, true);
+		listenTo(userInfoCtr);
+		
+		String fullName = userManager.getUserDisplayName(identity);
+		stackPanel.pushController(fullName, userInfoCtr);
+		stackPanel.addTool(previousLink, Align.rightEdge, false, "o_tool_previous");
+		stackPanel.addTool(nextLink, Align.rightEdge, false, "o_tool_next");
+		updateNextPrevious(userRow, true);	
+	}
+	
+	private void updateNextPrevious(IdentityPropertiesRow row, boolean vcard) {
+		int index = tableModel.getIndexOfObject(row);
+		previousLink.setUserObject(new Index(row, vcard));
+		nextLink.setUserObject(new Index(row, vcard));
+		previousLink.setEnabled(index > 0);
+		nextLink.setEnabled(index + 1 < tableModel.getRowCount());
+	}
+	
+	private void doMail(UserRequest ureq) {
+		if(contactCtr != null) return;
+		
+		List<Identity> identities = getSelectedIdentitiesWithWarning();
+		if(identities.isEmpty()) {
+			return;
+		}
+		
+		// create e-mail message
+		ContactMessage cmsg = new ContactMessage(getIdentity());
+		ContactList contacts = new ContactList(translate("mailto.userlist"));
+		contacts.addAllIdentites(identities);
+		cmsg.addEmailTo(contacts);
+
+		// create contact form controller with ContactMessage
+		contactCtr = new ContactFormController(ureq, getWindowControl(), true, false, false, cmsg);
+		listenTo(contactCtr);
+		
+		cmc = new CloseableModalController(getWindowControl(), "close", contactCtr.getInitialComponent(),
+				true, translate("command.mail"), false);
+		listenTo(cmc);
+		cmc.activate(); 
+	}
+
+	private void doBulkEdit(UserRequest ureq) {
+		if(userBulkChangesController != null) return;
+		
+		List<Identity> identities = getSelectedIdentitiesWithWarning();
+		if(identities.isEmpty()) {
+			return;
+		}
+
+		// valid selection: load in wizard
+		final UserBulkChanges userBulkChanges = new UserBulkChanges();
+		Step start = new UserBulkChangeStep00(ureq, identities, userBulkChanges);
+		// callback executed in case wizard is finished.
+		StepRunnerCallback finish = (ureq1, wControl1, runContext) -> {
+			// all information to do now is within the runContext saved
+			boolean hasChanges = false;
+			try {
+				if (userBulkChanges.isValidChange()) {
+					Map<String, String> attributeChangeMap = userBulkChanges.getAttributeChangeMap();
+					Map<OrganisationRoles, String> roleChangeMap = userBulkChanges.getRoleChangeMap();
+					List<Long> ownGroups = userBulkChanges.getOwnerGroups();
+					List<Long> partGroups = userBulkChanges.getParticipantGroups();
+					List<String> notUpdatedIdentities = new ArrayList<>();
+					if (!attributeChangeMap.isEmpty() || !roleChangeMap.isEmpty() || !ownGroups.isEmpty() || !partGroups.isEmpty()){
+						Identity addingIdentity = ureq1.getIdentity();
+						userBulkChangesManager.changeSelectedIdentities(identities, userBulkChanges, notUpdatedIdentities,
+							isAdministrativeUser, getTranslator(), addingIdentity);
+						hasChanges = true;
+					}
+					runContext.put("notUpdatedIdentities", notUpdatedIdentities);
+					runContext.put("selectedIdentities", identities);
+				}
+			} catch (Exception e) {
+				logError("", e);
+			}
+			// signal correct completion and tell if changes were made or not.
+			return hasChanges ? StepsMainRunController.DONE_MODIFIED : StepsMainRunController.DONE_UNCHANGED;
+		};
+
+		userBulkChangesController = new StepsMainRunController(ureq, getWindowControl(), start, finish, null,
+				translate("bulkChange.title"), "o_sel_user_bulk_change_wizard");
+		listenTo(userBulkChangesController);
+		getWindowControl().pushAsModalDialog(userBulkChangesController.getInitialComponent());
+	}
+	
+	private void doFinishBulkEdit() {
+		@SuppressWarnings("unchecked")
+		List<Identity> selectedIdentities = (List<Identity>)userBulkChangesController.getRunContext().get("selectedIdentities");
+		@SuppressWarnings("unchecked")
+		List<String> notUpdatedIdentities = (List<String>)userBulkChangesController.getRunContext().get("notUpdatedIdentities");
+		
+		Integer selIdentCount = selectedIdentities.size();
+		if (!notUpdatedIdentities.isEmpty()) {
+			Integer notUpdatedIdentCount = notUpdatedIdentities.size();
+			Integer sucChanges = selIdentCount - notUpdatedIdentCount;
+			StringBuilder changeErrors = new StringBuilder(1024);
+			for (String err : notUpdatedIdentities) {
+				if(changeErrors.length() > 0) changeErrors.append("<br>");
+				changeErrors.append(err);
+			}
+			getWindowControl().setError(translate("bulkChange.partialsuccess",
+					new String[] { sucChanges.toString(), selIdentCount.toString(), changeErrors.toString() }));
+		} else {
+			showInfo("bulkChange.success");
+		}
+	}
+	
+	private List<Identity> getSelectedIdentitiesWithWarning() {
+		Set<Integer> selections = tableEl.getMultiSelectedIndex();
+		if(selections.isEmpty()) {
+			showWarning("msg.selectionempty");
+			return Collections.emptyList();
+		}
+		
+		List<Long> identityKeys = new ArrayList<>(selections.size());
+		for(Integer selection:selections) {
+			IdentityPropertiesRow row = tableModel.getObject(selection.intValue());
+			identityKeys.add(row.getIdentityKey());
+		}
+		return securityManager.loadIdentityByKeys(identityKeys);
+	} 
+	
+	private final class Index {
+		private final boolean vcard;
+		private final IdentityPropertiesRow row;
+		
+		public Index(IdentityPropertiesRow row, boolean vcard) {
+			this.row = row;
+			this.vcard = vcard;
+		}
+
+		public boolean isVcard() {
+			return vcard;
+		}
+		
+		public IdentityPropertiesRow getRow() {
+			return row;
+		}
 	}
 	
 	private final class EmptyDataSource implements FlexiTableDataSourceDelegate<IdentityPropertiesRow> {
diff --git a/src/main/java/org/olat/user/ui/admin/_content/search_table.html b/src/main/java/org/olat/user/ui/admin/_content/search_table.html
index bade9402acd..262679b11fd 100644
--- a/src/main/java/org/olat/user/ui/admin/_content/search_table.html
+++ b/src/main/java/org/olat/user/ui/admin/_content/search_table.html
@@ -1 +1,9 @@
-$r.render("table")
\ No newline at end of file
+$r.render("table")
+<div class="o_button_group">
+	#if($r.available("command.mail"))
+		$r.render("command.mail")
+	#end
+	#if($r.available("bulkChange.title"))
+		$r.render("bulkChange.title")
+	#end
+</div>
\ No newline at end of file
diff --git a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_de.properties
index 0bd28623eae..08ccf8ad13a 100644
--- a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_de.properties
@@ -1,4 +1,6 @@
 #Fri Mar 23 15:13:55 CET 2018
+command.next=Weiter zur n\u00E4chsten Benutzer
+command.previous=Zur\u00FCck zur letzten Benutzer
 menu.admingroup=Systemadministratoren
 menu.admingroup.alt=Systemadministratoren verwalten
 menu.anonymousgroup=Anonyme Benutzer / G\u00E4ste
diff --git a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_en.properties
index eea5cfc08ec..3ecbb92ec12 100644
--- a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_en.properties
@@ -1,4 +1,6 @@
 #Fri Mar 23 15:13:55 CET 2018
+command.next=Go to next user
+command.previous=Go to previous user
 menu.admingroup=System administrators
 menu.admingroup.alt=Manage system administrator group
 menu.anonymousgroup=Anonymous users/guests
diff --git a/src/main/java/org/olat/user/ui/identity/AbstractUserInfoMainController.java b/src/main/java/org/olat/user/ui/identity/AbstractUserInfoMainController.java
new file mode 100644
index 00000000000..9944cc4a917
--- /dev/null
+++ b/src/main/java/org/olat/user/ui/identity/AbstractUserInfoMainController.java
@@ -0,0 +1,183 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.user.ui.identity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.olat.commons.calendar.CalendarManager;
+import org.olat.commons.calendar.CalendarModule;
+import org.olat.commons.calendar.model.CalendarUserConfiguration;
+import org.olat.commons.calendar.ui.WeeklyCalendarController;
+import org.olat.commons.calendar.ui.components.KalendarRenderWrapper;
+import org.olat.core.commons.modules.bc.FolderConfig;
+import org.olat.core.commons.modules.bc.FolderRunController;
+import org.olat.core.commons.modules.bc.vfs.OlatNamedContainerImpl;
+import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.control.WindowControl;
+import org.olat.core.gui.control.controller.BasicController;
+import org.olat.core.id.Identity;
+import org.olat.core.id.OLATResourceable;
+import org.olat.core.util.mail.ContactList;
+import org.olat.core.util.mail.ContactMessage;
+import org.olat.core.util.resource.OresHelper;
+import org.olat.core.util.vfs.callbacks.ReadOnlyCallback;
+import org.olat.core.util.vfs.callbacks.VFSSecurityCallback;
+import org.olat.modules.co.ContactFormController;
+import org.olat.portfolio.manager.InvitationDAO;
+import org.olat.portfolio.ui.EPMapRunController;
+import org.olat.portfolio.ui.EPMapRunViewOption;
+import org.olat.user.HomePageConfig;
+import org.olat.user.HomePageConfigManager;
+import org.olat.user.HomePageDisplayController;
+import org.olat.user.UserManager;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * 
+ * Initial date: 6 juil. 2018<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public abstract class AbstractUserInfoMainController extends BasicController {
+	
+	protected static final String CMD_HOMEPAGE = "homepage";
+	protected static final String CMD_CALENDAR = "calendar";
+	protected static final String CMD_FOLDER = "userfolder";
+	protected static final String CMD_CONTACT = "contact";
+	protected static final String CMD_PORTFOLIO = "portfolio";
+	
+	protected final Identity chosenIdentity;
+	protected final boolean isInvitee;
+	protected final boolean isDeleted;
+	
+	private EPMapRunController portfolioController;
+	private FolderRunController folderRunController;
+	private WeeklyCalendarController calendarController;
+	private ContactFormController contactFormController;
+	private HomePageDisplayController homePageDisplayController;
+
+	@Autowired
+	protected UserManager userManager;
+	@Autowired
+	private InvitationDAO invitationDao;
+	@Autowired
+	protected CalendarModule calendarModule;
+	@Autowired
+	private CalendarManager calendarManager;
+	@Autowired
+	private HomePageConfigManager homePageConfigManager;
+	
+	public AbstractUserInfoMainController(UserRequest ureq, WindowControl wControl, Identity chosenIdentity) {
+		super(ureq, wControl);
+		this.chosenIdentity = chosenIdentity;
+		
+		isInvitee = invitationDao.isInvitee(chosenIdentity);
+		isDeleted = chosenIdentity.getStatus().equals(Identity.STATUS_DELETED);
+
+	}
+	
+	
+	protected HomePageDisplayController doOpenHomepage(UserRequest ureq) {
+		removeAsListenerAndDispose(homePageDisplayController);
+		
+		HomePageConfig homePageConfig = homePageConfigManager.loadConfigFor(chosenIdentity.getName());
+		removeAsListenerAndDispose(homePageDisplayController);
+		homePageDisplayController = new HomePageDisplayController(ureq, getWindowControl(), chosenIdentity, homePageConfig);
+		listenTo(homePageDisplayController);
+		return homePageDisplayController;
+	}
+	
+	protected WeeklyCalendarController doOpenCalendar(UserRequest ureq) {
+		removeAsListenerAndDispose(calendarController);
+		
+		KalendarRenderWrapper calendarWrapper = calendarManager.getPersonalCalendar(chosenIdentity);
+		CalendarUserConfiguration config = calendarManager.findCalendarConfigForIdentity(calendarWrapper.getKalendar(), getIdentity());
+		if (config != null) {
+			calendarWrapper.setConfiguration(config);
+		}
+		
+		calendarWrapper.setPrivateEventsVisible(chosenIdentity.equals(ureq.getIdentity()));
+		if (chosenIdentity.equals(ureq.getIdentity())) {
+			calendarWrapper.setAccess(KalendarRenderWrapper.ACCESS_READ_WRITE);
+		} else {
+			calendarWrapper.setAccess(KalendarRenderWrapper.ACCESS_READ_ONLY);
+		}
+		List<KalendarRenderWrapper> calendars = new ArrayList<>();
+		calendars.add(calendarWrapper);
+		
+		OLATResourceable ores = OresHelper.createOLATResourceableType(CMD_CALENDAR);
+		WindowControl bwControl = addToHistory(ureq, ores, null);
+		OLATResourceable callerOres = OresHelper.createOLATResourceableInstance(chosenIdentity.getName(), chosenIdentity.getKey());
+		calendarController = new WeeklyCalendarController(ureq, bwControl, calendars,
+				WeeklyCalendarController.CALLER_PROFILE, callerOres, false);
+		listenTo(calendarController);
+		return calendarController;
+	}
+	
+	protected FolderRunController doOpenFolder(UserRequest ureq) {
+		removeAsListenerAndDispose(folderRunController);
+
+		String chosenUserFolderRelPath = FolderConfig.getUserHome(chosenIdentity.getName()) + "/public";
+		
+		String fullName = userManager.getUserDisplayName(chosenIdentity);
+		OlatRootFolderImpl rootFolder = new OlatRootFolderImpl(chosenUserFolderRelPath, null);
+		OlatNamedContainerImpl namedFolder = new OlatNamedContainerImpl(fullName, rootFolder);
+		
+		//decided in plenum to have read only view in the personal visiting card, even for admin
+		VFSSecurityCallback secCallback = new ReadOnlyCallback();
+		namedFolder.setLocalSecurityCallback(secCallback);
+		
+		OLATResourceable ores = OresHelper.createOLATResourceableType("userfolder");
+		WindowControl bwControl = addToHistory(ureq, ores, null);
+		folderRunController = new FolderRunController(namedFolder, false, true, false, ureq, bwControl);
+		folderRunController.setResourceURL("[Identity:" + chosenIdentity.getKey() + "][userfolder:0]");
+		listenTo(folderRunController);
+		return folderRunController;
+	}
+	
+	protected ContactFormController doOpenContact(UserRequest ureq) {
+		removeAsListenerAndDispose(contactFormController);
+		
+		ContactMessage cmsg = new ContactMessage(ureq.getIdentity());
+		String fullName = userManager.getUserDisplayName(chosenIdentity);
+		ContactList emailList = new ContactList(fullName);
+		emailList.add(chosenIdentity);
+		cmsg.addEmailTo(emailList);
+		
+		OLATResourceable ores = OresHelper.createOLATResourceableType(CMD_CONTACT);
+		WindowControl bwControl = addToHistory(ureq, ores, null);
+		contactFormController = new ContactFormController(ureq, bwControl, true, false, false, cmsg);
+		listenTo(contactFormController);
+		return contactFormController;
+	}
+	
+	protected EPMapRunController doOpenPortfolio(UserRequest ureq) {
+		removeAsListenerAndDispose(portfolioController);
+		
+		OLATResourceable ores = OresHelper.createOLATResourceableType(CMD_PORTFOLIO);
+		WindowControl bwControl = addToHistory(ureq, ores, null);
+		portfolioController = new EPMapRunController(ureq, bwControl, false, EPMapRunViewOption.OTHER_MAPS, chosenIdentity);
+		listenTo(portfolioController);
+		return portfolioController;
+	}
+
+}
diff --git a/src/main/java/org/olat/user/ui/identity/UserInfoSegmentedController.java b/src/main/java/org/olat/user/ui/identity/UserInfoSegmentedController.java
new file mode 100644
index 00000000000..e9892cbf010
--- /dev/null
+++ b/src/main/java/org/olat/user/ui/identity/UserInfoSegmentedController.java
@@ -0,0 +1,125 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.user.ui.identity;
+
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.link.Link;
+import org.olat.core.gui.components.link.LinkFactory;
+import org.olat.core.gui.components.segmentedview.SegmentViewComponent;
+import org.olat.core.gui.components.segmentedview.SegmentViewEvent;
+import org.olat.core.gui.components.segmentedview.SegmentViewFactory;
+import org.olat.core.gui.components.velocity.VelocityContainer;
+import org.olat.core.gui.control.Controller;
+import org.olat.core.gui.control.Event;
+import org.olat.core.gui.control.WindowControl;
+import org.olat.core.id.Identity;
+import org.olat.core.util.Util;
+import org.olat.user.UserInfoMainController;
+
+/**
+ * 
+ * Initial date: 6 juil. 2018<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class UserInfoSegmentedController extends AbstractUserInfoMainController {
+
+	private Link backLink;
+	private Link folderLink;
+	private Link contactLink;
+	private Link calendarLink;
+	private final Link homepageLink;
+	private final VelocityContainer mainVC;
+	private final SegmentViewComponent segmentView;
+	
+	public UserInfoSegmentedController(UserRequest ureq, WindowControl wControl,
+			Identity chosenIdentity, boolean withTitle, boolean withBack) {
+		super(ureq, wControl, chosenIdentity);
+		setTranslator(Util.createPackageTranslator(UserInfoMainController.class, getLocale(), getTranslator()));
+		
+		mainVC = createVelocityContainer("infos_segment");
+		mainVC.contextPut("withTitle", Boolean.valueOf(withTitle));
+		mainVC.contextPut("fullName", userManager.getUserDisplayName(chosenIdentity));
+		if(withBack) {
+			backLink = LinkFactory.createLinkBack(mainVC, this);
+		}
+		segmentView = SegmentViewFactory.createSegmentView("segment", mainVC, this);
+		homepageLink = LinkFactory.createLink("menu.homepage", mainVC, this);
+		segmentView.addSegment(homepageLink, true);
+		mainVC.put("segments", segmentView);
+		doSelect(ureq, homepageLink);
+		
+		if (!isDeleted && !isInvitee) {
+			if(calendarModule.isEnablePersonalCalendar()) {
+				calendarLink = LinkFactory.createLink("menu.calendar", mainVC, this);
+				calendarLink.setIconLeftCSS("o_visiting_card_calendar");
+				segmentView.addSegment(calendarLink, false);
+			}
+			folderLink = LinkFactory.createLink("menu.folder", mainVC, this);
+			folderLink.setIconLeftCSS("o_visiting_card_folder");
+			segmentView.addSegment(folderLink, false);
+		}
+		
+		if (!isDeleted) {
+			contactLink = LinkFactory.createLink("menu.contact", mainVC, this);
+			contactLink.setIconLeftCSS("o_visiting_card_contact");
+			segmentView.addSegment(contactLink, false);
+		}
+		
+		putInitialPanel(mainVC);
+	}
+
+	@Override
+	protected void event(UserRequest ureq, Component source, Event event) {
+		if(source == segmentView) {
+			if(event instanceof SegmentViewEvent) {
+				SegmentViewEvent sve = (SegmentViewEvent)event;
+				String segmentCName = sve.getComponentName();
+				Component clickedLink = mainVC.getComponent(segmentCName);
+				doSelect(ureq, clickedLink);
+			}
+		} else if(source == backLink) {
+			fireEvent(ureq, Event.BACK_EVENT);
+		}
+	}
+	
+	private void doSelect(UserRequest ureq, Component clickedLink) {
+		Controller selectedCtrl = null;
+		if (clickedLink == homepageLink) {
+			selectedCtrl = doOpenHomepage(ureq);
+		} else if(clickedLink == calendarLink) {
+			selectedCtrl = doOpenCalendar(ureq);
+		} else if(clickedLink == folderLink) {
+			selectedCtrl = doOpenFolder(ureq);
+		} else if(clickedLink == contactLink) {
+			selectedCtrl = doOpenContact(ureq);
+		}
+		if(selectedCtrl != null) {
+			addToHistory(ureq, selectedCtrl);
+			mainVC.put("segmentCmp", selectedCtrl.getInitialComponent());
+		}
+	}
+
+	@Override
+	protected void doDispose() {
+		//
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/user/ui/identity/_content/infos_segment.html b/src/main/java/org/olat/user/ui/identity/_content/infos_segment.html
new file mode 100644
index 00000000000..61d9e38cb29
--- /dev/null
+++ b/src/main/java/org/olat/user/ui/identity/_content/infos_segment.html
@@ -0,0 +1,10 @@
+
+$r.render("backLink")
+<h4>$r.escapeHtml($fullName)</h4>
+<div class="clearfix">
+	$r.render("segments") <br/>	
+		
+	#if($r.available("segmentCmp"))
+		$r.render("segmentCmp")
+	#end
+</div>
\ No newline at end of file
diff --git a/src/main/resources/serviceconfig/olat.properties b/src/main/resources/serviceconfig/olat.properties
index 62e2daa9920..7b43f4441a9 100644
--- a/src/main/resources/serviceconfig/olat.properties
+++ b/src/main/resources/serviceconfig/olat.properties
@@ -259,8 +259,18 @@ group.userlist.download.default.allowed.values=true,false
 group.mandatory.enrolment.email.users=true
 group.mandatory.enrolment.email.authors=false
 group.mandatory.enrolment.email.usermanagers=false
+group.mandatory.enrolment.email.rolesmanagers=false
 group.mandatory.enrolment.email.groupmanagers=false
+group.mandatory.enrolment.email.learnresourcemanagers=false
+group.mandatory.enrolment.email.poolmanagers=false
+group.mandatory.enrolment.email.curriculummanagers=false
+group.mandatory.enrolment.email.lecturemanagers=false
+group.mandatory.enrolment.email.qualitymanagers=false
+group.mandatory.enrolment.email.linemanagers=false
+group.mandatory.enrolment.email.principals=false
 group.mandatory.enrolment.email.administrators=false
+group.mandatory.enrolment.email.systemadmins=false
+
 # b) Invitation only or direct membership: is the new group membership immediate or is it only an invitation
 #    that must be accepted by the invited user?
 #    Default is invitation-only for normal users and immediate group membership without the need to accept
@@ -268,8 +278,17 @@ group.mandatory.enrolment.email.administrators=false
 group.accept.membership.users=true
 group.accept.membership.authors=false
 group.accept.membership.usermanagers=false
+group.accept.membership.rolesmanagers=false
 group.accept.membership.groupmanagers=false
+group.accept.membership.learnresourcemanagers=false
+group.accept.membership.poolmanagers=false
+group.accept.membership.curriculummanagers=false
+group.accept.membership.lecturemanagers=false
+group.accept.membership.qualitymanagers=false
+group.accept.membership.linemanagers=false
+group.accept.membership.principals=false
 group.accept.membership.administrators=false
+group.accept.membership.systemadmins=false
 
 # Allow leaving groups created by learners
 group.leaving.group.created.by.learners=true
@@ -648,22 +667,50 @@ i18n.application.opt.src.dir = ${i18n.application.src.dir}
 usersearch.adminProps.users=disabled
 usersearch.adminProps.authors=enabled
 usersearch.adminProps.usermanagers=enabled
+usersearch.adminProps.rolesmanagers=enabled
 usersearch.adminProps.groupmanagers=enabled
+usersearch.adminProps.learnresourcemanagers=enabled
+usersearch.adminProps.poolmanagers=enabled
+usersearch.adminProps.curriculummanagers=enabled
+usersearch.adminProps.lecturemanagers=enabled
+usersearch.adminProps.qualitymanagers=enabled
+usersearch.adminProps.linemanagers=enabled
+usersearch.adminProps.principals=enabled
 usersearch.adminProps.administrators=enabled
+usersearch.adminProps.systemadmins=enabled
 
 # which roles are allowed to see the last visited date of group, course and other learning resources
 user.lastlogin.visible.users=disabled
 user.lastlogin.visible.authors=enabled
 user.lastlogin.visible.usermanagers=enabled
+user.lastlogin.visible.rolesmanagers=enabled
 user.lastlogin.visible.groupmanagers=enabled
+user.lastlogin.visible.learnresourcemanagers=enabled
+user.lastlogin.visible.poolmanagers=enabled
+user.lastlogin.visible.curriculummanagers=enabled
+user.lastlogin.visible.lecturemanagers=enabled
+user.lastlogin.visible.qualitymanagers=enabled
+user.lastlogin.visible.linemanagers=enabled
+user.lastlogin.visible.principals=enabled
 user.lastlogin.visible.administrators=enabled
+user.lastlogin.visible.systemadmins=enabled
 
 # which roles see the autocompletion
 usersearch.autocomplete.users=enabled
 usersearch.autocomplete.authors=enabled
 usersearch.autocomplete.usermanagers=enabled
+usersearch.autocomplete.rolesmanagers=enabled
 usersearch.autocomplete.groupmanagers=enabled
+usersearch.autocomplete.learnresourcemanagers=enabled
+usersearch.autocomplete.poolmanagers=enabled
+usersearch.autocomplete.curriculummanagers=enabled
+usersearch.autocomplete.lecturemanagers=enabled
+usersearch.autocomplete.qualitymanagers=enabled
+usersearch.autocomplete.linemanagers=enabled
+usersearch.autocomplete.principals=enabled
 usersearch.autocomplete.administrators=enabled
+usersearch.autocomplete.systemadmins=enabled
+
 # the maximum of identities returned by search (-1 is unlimited)
 usersearch.maxResults=-1
 usersearch.maxResults.values=-1,20,50
diff --git a/src/main/webapp/static/themes/light/theme_ie_completions.css b/src/main/webapp/static/themes/light/theme_ie_completions.css
index b9c88fb7ffe..10f9b47c6b5 100644
--- a/src/main/webapp/static/themes/light/theme_ie_completions.css
+++ b/src/main/webapp/static/themes/light/theme_ie_completions.css
@@ -1 +1 @@
-.o_toolbar .o_tool_dropdown:last-child{margin-right:0}.o_toolbar .o_tool_dropdown a.dropdown-toggle{position:relative}.o_toolbar .o_tool_dropdown a.dropdown-toggle i{font-size:18px}.o_toolbar .o_tool_dropdown a.dropdown-toggle span{display:block;font-size:12px}.o_toolbar .o_tool_dropdown a.dropdown-toggle .o_icon_caret{position:absolute;right:50%;top:4px;margin-right:-20px;font-size:14px}@media (min-width: 767px) and (max-width: 991px){.o_toolbar .o_tool_dropdown a.dropdown-toggle i{font-size:16px}.o_toolbar .o_tool_dropdown a.dropdown-toggle span,.o_toolbar .o_tool_dropdown a.dropdown-toggle .o_icon_caret{font-size:11px}.o_toolbar .o_tool_dropdown a.dropdown-toggle .o_icon_caret{top:4px;margin-right:-18px;font-size:12px}}@media (max-width: 767px){.o_toolbar .o_tool_dropdown a.dropdown-toggle{padding:0 10px 0 5px}.o_toolbar .o_tool_dropdown a.dropdown-toggle i{font-size:20px}.o_toolbar .o_tool_dropdown a.dropdown-toggle span{display:none}}.o_toolbar .o_tool_dropdown .dropdown-menu{text-align:left}.o_toolbar .o_tools_left{float:left}.o_toolbar .o_tools_right{float:right}.o_toolbar .o_tools_right_edge{float:right}.o_toolbar .o_tools_center{float:both;width:50%;margin-left:auto;margin-right:auto}.o_toolbar .o_tools_segments{margin:0 auto -1.1em auto}.o_toolbar .o_tools_segments.o_tools_segments_alone{margin-top:1.5em}@media (max-width: 991px){.o_toolbar .o_tools{margin-top:6px;margin-bottom:4px}.o_toolbar .o_tools.o_tools_segments{margin:0 auto -1.1em auto}.o_toolbar .o_tool span{max-width:10em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_toolbar .o_tools_segments .o_tool span{display:block}.o_toolbar .o_tool,.o_toolbar .o_text,.o_toolbar .o_tool_dropdown{margin:0 5px}}@media (max-width: 767px){.o_toolbar .o_tools{margin-top:6px;margin-bottom:4px}.o_toolbar .o_tools .o_chelp{top:0;vertical-align:top}.o_toolbar .o_tools.o_tools_segments{margin:0 auto -1.1em auto;text-align:center}.o_toolbar .o_tools_center{float:left}.o_toolbar .o_tool,.o_toolbar .o_text,.o_toolbar .o_tool_dropdown{margin:0 0;position:static}.o_toolbar .o_tool_dropdown .dropdown-menu{left:0px;right:0px}.o_toolbar .o_tool_dropdown .dropdown-menu a,.o_toolbar .o_tool_dropdown .dropdown-menu i{line-height:30px}.o_toolbar .o_tool_dropdown .dropdown-menu .o_navbar_tab_close{line-height:inherit}}#o_main_container .o_toolbar_message{display:table;margin:0 auto 20px auto}#o_main_container .o_toolbar_message.o_warning{padding-top:5px;padding-bottom:5px;border:1px solid #8a6d3b;border-radius:3px}.o_edit_mode .o_toolbar .o_tools_container{background:repeating-linear-gradient(300deg, #fff0d9, #fff0d9 10px, #fcfcfc 10px, #fcfcfc 20px)}.o_edit_mode .o_toolbar .o_edit_mode .o_tools_container{background:#f8f8f8}body{overflow-x:hidden}.o_container_offcanvas{position:relative;max-width:1324px;-webkit-transition:all .25s ease-in-out;-moz-transition:all .25s ease-in-out;-o-transition:all .25s ease-in-out;-m-transition:all .25s ease-in-out;transition:all .25s ease-in-out}#o_offcanvas_right{position:absolute;top:0;right:-250px;width:250px;padding:15px 15px;background-color:#222;color:#9d9d9d;border:1px solid #090909;-webkit-box-shadow:0px 0px 4px 3px rgba(0,0,0,0.25);box-shadow:0px 0px 4px 3px rgba(0,0,0,0.25);min-height:100%;z-index:10;display:none}#o_offcanvas_right:before,#o_offcanvas_right:after{content:" ";display:table}#o_offcanvas_right:after{clear:both}@media screen and (max-width: 767px){.row-offcanvas{position:relative;-webkit-transition:all .25s ease-out;-moz-transition:all .25s ease-out;transition:all .25s ease-out}.row-offcanvas-right{right:0}.row-offcanvas-right .sidebar-offcanvas{right:-50%}.row-offcanvas-right.active{right:50%}.row-offcanvas-left{left:0}.row-offcanvas-left .sidebar-offcanvas{left:-50%}.row-offcanvas-left.active{left:50%}.sidebar-offcanvas{position:absolute;top:0;width:50%}}.o_info,.b_info,p.b_info,div.b_info,.o_form .o_info,.o_togglebox_wrapper div.o_togglebox_content,div.o_qti_item_itemfeedback,.o_assessmentitem_wrapper .modalFeedback .o_info{margin:20px 0;padding:20px;border-left:3px solid #777;background-color:#eee}.o_info h2,.o_info h3,.o_info h4,.o_info .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_info h2,.o_info h5,.b_info h2,.o_form .o_info h2,.o_togglebox_wrapper div.o_togglebox_content h2,div.o_qti_item_itemfeedback h2,.o_assessmentitem_wrapper .modalFeedback .o_info h2,.b_info h3,.o_form .o_info h3,.o_togglebox_wrapper div.o_togglebox_content h3,div.o_qti_item_itemfeedback h3,.o_assessmentitem_wrapper .modalFeedback .o_info h3,.b_info h4,.o_form .o_info h4,.o_togglebox_wrapper div.o_togglebox_content h4,div.o_qti_item_itemfeedback h4,.o_assessmentitem_wrapper .modalFeedback .o_info h4,.b_info .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_info h2,.o_form .o_info .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_form .o_info h2,.o_togglebox_wrapper div.o_togglebox_content .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_togglebox_wrapper div.o_togglebox_content h2,div.o_qti_item_itemfeedback .o_cal .fc-header-title h2,.o_cal .fc-header-title div.o_qti_item_itemfeedback h2,.o_assessmentitem_wrapper .modalFeedback .o_info .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_assessmentitem_wrapper .modalFeedback .o_info h2,.b_info h5,.o_form .o_info h5,.o_togglebox_wrapper div.o_togglebox_content h5,div.o_qti_item_itemfeedback h5,.o_assessmentitem_wrapper .modalFeedback .o_info h5{color:#777}.o_note,.b_note,p.b_note,div.b_note,.o_form .o_desc,.o_course_run .o_statusinfo,.o_course_stats .o_desc,.o_assessmentitem_wrapper .modalFeedback .o_info.o_empty_modal_feedback,.o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_comment{margin:20px 0;padding:20px;border-left:3px solid #31708f;background-color:#d9edf7}.o_note h2,.o_note h3,.o_note h4,.o_note .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_note h2,.o_note h5,.b_note h2,.o_form .o_desc h2,.o_course_run .o_statusinfo h2,.o_course_stats .o_desc h2,.o_assessmentitem_wrapper .modalFeedback .o_info.o_empty_modal_feedback h2,.o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_comment h2,.b_note h3,.o_form .o_desc h3,.o_course_run .o_statusinfo h3,.o_course_stats .o_desc h3,.o_assessmentitem_wrapper .modalFeedback .o_info.o_empty_modal_feedback h3,.o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_comment h3,.b_note h4,.o_form .o_desc h4,.o_course_run .o_statusinfo h4,.o_course_stats .o_desc h4,.o_assessmentitem_wrapper .modalFeedback .o_info.o_empty_modal_feedback h4,.o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_comment h4,.b_note .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_note h2,.o_form .o_desc .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_form .o_desc h2,.o_course_run .o_statusinfo .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_course_run .o_statusinfo h2,.o_course_stats .o_desc .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_course_stats .o_desc h2,.o_assessmentitem_wrapper .modalFeedback .o_info.o_empty_modal_feedback .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_assessmentitem_wrapper .modalFeedback .o_info.o_empty_modal_feedback h2,.o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_comment .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_comment h2,.b_note h5,.o_form .o_desc h5,.o_course_run .o_statusinfo h5,.o_course_stats .o_desc h5,.o_assessmentitem_wrapper .modalFeedback .o_info.o_empty_modal_feedback h5,.o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_comment h5{color:#31708f}.o_important,.b_important,p.b_important,div.b_important,.o_bc_empty,.o_course_run .o_no_scoreinfo{margin:20px 0;padding:20px;border-left:3px solid #F4D000;background-color:#FFF1A4}.o_important h2,.o_important h3,.o_important h4,.o_important .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_important h2,.o_important h5,.b_important h2,.o_bc_empty h2,.o_course_run .o_no_scoreinfo h2,.b_important h3,.o_bc_empty h3,.o_course_run .o_no_scoreinfo h3,.b_important h4,.o_bc_empty h4,.o_course_run .o_no_scoreinfo h4,.b_important .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_important h2,.o_bc_empty .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_bc_empty h2,.o_course_run .o_no_scoreinfo .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_course_run .o_no_scoreinfo h2,.b_important h5,.o_bc_empty h5,.o_course_run .o_no_scoreinfo h5{color:#F4D000}.o_success,.b_success,p.b_success,div.b_success,.o_assessmentitem_wrapper .modalFeedback .o_info.o_correct_modal_feedback{margin:20px 0;padding:20px;border-left:3px solid #3c763d;background-color:#dff0d8}.o_success h2,.o_success h3,.o_success h4,.o_success .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_success h2,.o_success h5,.b_success h2,.o_assessmentitem_wrapper .modalFeedback .o_info.o_correct_modal_feedback h2,.b_success h3,.o_assessmentitem_wrapper .modalFeedback .o_info.o_correct_modal_feedback h3,.b_success h4,.o_assessmentitem_wrapper .modalFeedback .o_info.o_correct_modal_feedback h4,.b_success .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_success h2,.o_assessmentitem_wrapper .modalFeedback .o_info.o_correct_modal_feedback .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_assessmentitem_wrapper .modalFeedback .o_info.o_correct_modal_feedback h2,.b_success h5,.o_assessmentitem_wrapper .modalFeedback .o_info.o_correct_modal_feedback h5{color:#3c763d}.o_warning,.b_warning,p.b_warning,div.b_warning,.o_instruction,.o_form .o_warning,p.o_gta_reopen_warning{margin:20px 0;padding:20px;border-left:3px solid #8a6d3b;background-color:#fcf8e3}.o_warning h2,.o_warning h3,.o_warning h4,.o_warning .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_warning h2,.o_warning h5,.b_warning h2,.o_instruction h2,.o_form .o_warning h2,p.o_gta_reopen_warning h2,.b_warning h3,.o_instruction h3,.o_form .o_warning h3,p.o_gta_reopen_warning h3,.b_warning h4,.o_instruction h4,.o_form .o_warning h4,p.o_gta_reopen_warning h4,.b_warning .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_warning h2,.o_instruction .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_instruction h2,.o_form .o_warning .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_form .o_warning h2,p.o_gta_reopen_warning .o_cal .fc-header-title h2,.o_cal .fc-header-title p.o_gta_reopen_warning h2,.b_warning h5,.o_instruction h5,.o_form .o_warning h5,p.o_gta_reopen_warning h5{color:#8a6d3b}.o_error,.b_error,p.b_error,div.b_error,.o_assessmentitem_wrapper .modalFeedback .o_info.o_incorrect_modal_feedback{margin:20px 0;padding:20px;border-left:3px solid #a94442;background-color:#f2dede}.o_error h2,.o_error h3,.o_error h4,.o_error .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_error h2,.o_error h5,.b_error h2,.o_assessmentitem_wrapper .modalFeedback .o_info.o_incorrect_modal_feedback h2,.b_error h3,.o_assessmentitem_wrapper .modalFeedback .o_info.o_incorrect_modal_feedback h3,.b_error h4,.o_assessmentitem_wrapper .modalFeedback .o_info.o_incorrect_modal_feedback h4,.b_error .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_error h2,.o_assessmentitem_wrapper .modalFeedback .o_info.o_incorrect_modal_feedback .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_assessmentitem_wrapper .modalFeedback .o_info.o_incorrect_modal_feedback h2,.b_error h5,.o_assessmentitem_wrapper .modalFeedback .o_info.o_incorrect_modal_feedback h5{color:#a94442}.o_instruction{margin-top:0px;border-left:none;padding-top:10px;padding-bottom:10px}.o_instruction>.o_button_group{margin-bottom:0px}div.o_callout_overlay{position:fixed;top:0;left:0;width:100%;height:100%;zoom:1;background:#000;opacity:0;filter:alpha(opacity=0)}.o_alert_info{position:fixed;top:-100%;left:0;display:none;z-index:2000;width:100%;text-align:center}.o_alert_info .alert{position:relative;width:auto;margin:0 auto;text-align:left;-webkit-box-shadow:0px 1px 5px -1px rgba(0,0,0,0.15);box-shadow:0px 1px 5px -1px rgba(0,0,0,0.15)}.o_alert_info .alert .o_alert_close{float:right;color:#777}.o_alert_info .alert .o_alert_close:hover{color:#555}@media (min-width: 768px){.o_alert_info .alert{width:600px}}#o_msg_sticky,#o_msg_sticky_preview{position:relative;color:#a94442;background-color:#f2dede;border:1px solid #ebccd1;padding:10px 16px 10px 60px;min-height:40px;margin:-20px 0 20px 0}#o_msg_sticky .o_icon_info_msg,#o_msg_sticky_preview .o_icon_info_msg{position:absolute;left:10px;top:5px;font-size:40px}#o_msg_sticky.o_msg_sticky_fullscreen,#o_msg_sticky_preview.o_msg_sticky_fullscreen{margin-top:0}@media (min-width: 768px){.modal .o_modal_fullwidth{width:90%}}@media (min-width: 992px){.modal .o_modal_fullwidth{width:80%}}.modal .modal-header h4,.modal .modal-header .o_cal .fc-header-title h2,.o_cal .fc-header-title .modal .modal-header h2{color:#337ab7;font-weight:500;font-family:inherit;line-height:1.1}.o_tree{position:relative;display:block;background-color:none;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;overflow:hidden;font-size:14px}.o_tree a{color:#777;background-color:none}.o_tree a:hover,.o_tree a:focus{color:#333}.o_tree .o_tree_link{background-color:none}.o_tree .o_tree_link:hover,.o_tree .o_tree_link:focus{background-color:#f8f8f8}.o_tree .o_tree_link:first-child{background-color:transparent}.o_tree .o_tree_link:last-child:hover,.o_tree .o_tree_link:last-child:focus{background-color:#f8f8f8}.o_tree .o_insertion_point>a>span{padding:5px;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.o_tree .o_insertion_source>a>span.o_tree_item,.o_tree .o_insertion_source>a>span.o_dnd_item{border-bottom:solid #f90 4px;background-color:#fefbf6}.o_tree ul{margin:0;padding:0;list-style-type:none}.o_tree ul li{margin:0;padding:0;white-space:nowrap}.o_tree ul li div{position:relative;margin-bottom:-1px;border-bottom:1px solid #ddd}.o_tree ul li div.popover{position:absolute;left:auto;right:0}.o_tree ul li div a.o_tree_oc_l0{position:absolute;top:10px;left:-4px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l0,.o_tree ul .o_tree_level_close.b_tree_oc_l0{z-index:10}.o_tree ul li div a.o_tree_oc_l1{position:absolute;top:10px;left:11px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l1,.o_tree ul .o_tree_level_close.b_tree_oc_l1{z-index:10}.o_tree ul li div a.o_tree_oc_l2{position:absolute;top:10px;left:26px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l2,.o_tree ul .o_tree_level_close.b_tree_oc_l2{z-index:10}.o_tree ul li div a.o_tree_oc_l3{position:absolute;top:10px;left:41px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l3,.o_tree ul .o_tree_level_close.b_tree_oc_l3{z-index:10}.o_tree ul li div a.o_tree_oc_l4{position:absolute;top:10px;left:56px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l4,.o_tree ul .o_tree_level_close.b_tree_oc_l4{z-index:10}.o_tree ul li div a.o_tree_oc_l5{position:absolute;top:10px;left:71px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l5,.o_tree ul .o_tree_level_close.b_tree_oc_l5{z-index:10}.o_tree ul li div a.o_tree_oc_l6{position:absolute;top:10px;left:86px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l6,.o_tree ul .o_tree_level_close.b_tree_oc_l6{z-index:10}.o_tree ul li div a.o_tree_oc_l7{position:absolute;top:10px;left:101px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l7,.o_tree ul .o_tree_level_close.b_tree_oc_l7{z-index:10}.o_tree ul li div a.o_tree_oc_l8{position:absolute;top:10px;left:116px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l8,.o_tree ul .o_tree_level_close.b_tree_oc_l8{z-index:10}.o_tree ul li div a.o_tree_oc_l9{position:absolute;top:10px;left:131px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l9,.o_tree ul .o_tree_level_close.b_tree_oc_l9{z-index:10}.o_tree ul li div a.o_tree_oc_l10{position:absolute;top:10px;left:146px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l10,.o_tree ul .o_tree_level_close.b_tree_oc_l10{z-index:10}.o_tree ul li div a.o_tree_oc_l11{position:absolute;top:10px;left:161px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l11,.o_tree ul .o_tree_level_close.b_tree_oc_l11{z-index:10}.o_tree ul li div span.o_tree_l0{display:block;padding:10px 2px 10px 10px;z-index:9}.o_tree ul li div span.o_tree_l1{display:block;padding:10px 2px 10px 25px;z-index:9}.o_tree ul li div span.o_tree_l2{display:block;padding:10px 2px 10px 40px;z-index:9}.o_tree ul li div span.o_tree_l3{display:block;padding:10px 2px 10px 55px;z-index:9}.o_tree ul li div span.o_tree_l4{display:block;padding:10px 2px 10px 70px;z-index:9}.o_tree ul li div span.o_tree_l5{display:block;padding:10px 2px 10px 85px;z-index:9}.o_tree ul li div span.o_tree_l6{display:block;padding:10px 2px 10px 100px;z-index:9}.o_tree ul li div span.o_tree_l7{display:block;padding:10px 2px 10px 115px;z-index:9}.o_tree ul li div span.o_tree_l8{display:block;padding:10px 2px 10px 130px;z-index:9}.o_tree ul li div span.o_tree_l9{display:block;padding:10px 2px 10px 145px;z-index:9}.o_tree ul li div span.o_tree_l10{display:block;padding:10px 2px 10px 160px;z-index:9}.o_tree ul li div span.o_tree_l11{display:block;padding:10px 2px 10px 175px;z-index:9}.o_tree ul span.o_tree_leaf{display:none}.o_tree ul span.o_tree_link>input[type=checkbox]{margin-right:5px}.o_tree ul li .badge{position:absolute;font-size:70%}.o_tree ul li .badge:before{content:none}.o_tree ul li .badge.o_badge_1{top:3px;right:1px}.o_tree ul li .badge.o_badge_2{bottom:3px;right:1px}.o_tree ul li .badge.o_badge_3{top:3px;right:25px}.o_tree ul li .badge.o_badge_4{bottom:3px;right:25px}.o_tree ul li div.o_dnd_sibling{margin:0;padding:0;border-bottom:none}.o_tree ul li .active.o_tree_link{background-color:none;font-weight:bold}.o_tree ul li .active.o_tree_link a{color:#337ab7}.o_tree ul li .active.o_tree_link:hover,.o_tree ul li .active.o_tree_link:focus{background-color:#eee}.o_tree ul li .active.o_tree_link:hover a,.o_tree ul li .active.o_tree_link:focus a{color:#23527c}.o_tree ul li .active_parent.o_tree_link{font-weight:bold}.o_tree ul li .active_parent.o_tree_link a{color:#777}.o_tree ul li .active_parent.o_tree_link a:hover,.o_tree ul li .active_parent.o_tree_link a:focus{color:#333}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l0{left:6px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l1{left:21px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l2{left:36px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l3{left:51px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l4{left:66px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l5{left:81px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l6{left:96px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l7{left:111px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l8{left:126px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l9{left:141px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l10{left:156px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l11{left:171px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l0{padding:10px 2px 10px 20px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l1{padding:10px 2px 10px 35px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l2{padding:10px 2px 10px 50px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l3{padding:10px 2px 10px 65px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l4{padding:10px 2px 10px 80px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l5{padding:10px 2px 10px 95px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l6{padding:10px 2px 10px 110px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l7{padding:10px 2px 10px 125px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l8{padding:10px 2px 10px 140px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l9{padding:10px 2px 10px 155px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l10{padding:10px 2px 10px 170px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l11{padding:10px 2px 10px 185px}.o_tree .o_dnd_item{cursor:move;z-index:100}.o_tree .o_dnd_proxy{opacity:.4;filter:alpha(opacity=40);background-color:#f0ad4e;padding:5px 10px 5px 10px;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.o_tree .o_dnd_item.o_dnd_over{background-color:#ffff60}.o_tree .o_dnd_sibling{height:7px;width:100%}.o_tree .o_dnd_sibling.o_dnd_over{background:transparent url(../light/images/arrow_dd.png) top left no-repeat}.o_tree .o_dnd_l1{margin-left:0 !important}.o_tree .o_dnd_l2{margin-left:1em !important}.o_tree .o_dnd_l3{margin-left:2em !important}.o_tree .o_dnd_l4{margin-left:3em !important}.o_tree .o_dnd_l5{margin-left:4em !important}.o_tree .o_dnd_l6{margin-left:5em !important}.o_tree .o_dnd_l7{margin-left:6em !important}.o_tree .o_dnd_l8{margin-left:7em !important}.o_tree .o_dnd_l9{margin-left:8em !important}.o_tree .o_dnd_l10{margin-left:9em !important}.o_tree .o_dnd_l11{margin-left:10em !important}.o_tree.o_tree_insert_tool span.o_tree_link a{display:block}.o_offcanvas .o_tree{border:0}.o_selection_tree{position:relative;display:block;background-color:none;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;overflow:hidden;font-size:14px}.o_selection_tree ul{margin:0;padding:0;list-style-type:none}.o_selection_tree li{margin:0;padding:0;white-space:nowrap}.o_selection_tree li div{position:relative;margin-bottom:-1px;border-bottom:1px solid #ddd}.o_selection_tree li>div>span.o_tree_l0,.o_selection_tree li>div>div.checkbox.o_tree_l0,.o_selection_tree li>div>div.radio.o_tree_l0{display:block;padding:10px 2px 10px 10px;z-index:9}.o_selection_tree li>div>span.o_tree_l1,.o_selection_tree li>div>div.checkbox.o_tree_l1,.o_selection_tree li>div>div.radio.o_tree_l1{display:block;padding:10px 2px 10px 25px;z-index:9}.o_selection_tree li>div>span.o_tree_l2,.o_selection_tree li>div>div.checkbox.o_tree_l2,.o_selection_tree li>div>div.radio.o_tree_l2{display:block;padding:10px 2px 10px 40px;z-index:9}.o_selection_tree li>div>span.o_tree_l3,.o_selection_tree li>div>div.checkbox.o_tree_l3,.o_selection_tree li>div>div.radio.o_tree_l3{display:block;padding:10px 2px 10px 55px;z-index:9}.o_selection_tree li>div>span.o_tree_l4,.o_selection_tree li>div>div.checkbox.o_tree_l4,.o_selection_tree li>div>div.radio.o_tree_l4{display:block;padding:10px 2px 10px 70px;z-index:9}.o_selection_tree li>div>span.o_tree_l5,.o_selection_tree li>div>div.checkbox.o_tree_l5,.o_selection_tree li>div>div.radio.o_tree_l5{display:block;padding:10px 2px 10px 85px;z-index:9}.o_selection_tree li>div>span.o_tree_l6,.o_selection_tree li>div>div.checkbox.o_tree_l6,.o_selection_tree li>div>div.radio.o_tree_l6{display:block;padding:10px 2px 10px 100px;z-index:9}.o_selection_tree li>div>span.o_tree_l7,.o_selection_tree li>div>div.checkbox.o_tree_l7,.o_selection_tree li>div>div.radio.o_tree_l7{display:block;padding:10px 2px 10px 115px;z-index:9}.o_selection_tree li>div>span.o_tree_l8,.o_selection_tree li>div>div.checkbox.o_tree_l8,.o_selection_tree li>div>div.radio.o_tree_l8{display:block;padding:10px 2px 10px 130px;z-index:9}.o_selection_tree li>div>span.o_tree_l9,.o_selection_tree li>div>div.checkbox.o_tree_l9,.o_selection_tree li>div>div.radio.o_tree_l9{display:block;padding:10px 2px 10px 145px;z-index:9}.o_selection_tree li>div>span.o_tree_l10,.o_selection_tree li>div>div.checkbox.o_tree_l10,.o_selection_tree li>div>div.radio.o_tree_l10{display:block;padding:10px 2px 10px 160px;z-index:9}.o_selection_tree li>div>span.o_tree_l11,.o_selection_tree li>div>div.checkbox.o_tree_l11,.o_selection_tree li>div>div.radio.o_tree_l11{display:block;padding:10px 2px 10px 175px;z-index:9}.o_breadcrumb{position:relative}.o_breadcrumb .o_breadcrumb_close{float:right;position:relative;margin:0 0 0 15px;vertical-align:middle}.o_breadcrumb .o_breadcrumb_close a{line-height:15px;color:#d9534f}.o_breadcrumb .o_breadcrumb_close a:hover{color:#b52b27}.o_breadcrumb .o_breadcrumb_close a i{font-size:16px}.o_breadcrumb .o_breadcrumb_close a span{display:none}.o_breadcrumb .o_breadcrumb_close:before{content:none}.o_form .o_icon_mandatory{margin-right:0.25em}.o_form .o_form_chelp{padding-left:0.25em;margin-right:-1.25em}.o_form .o_form_example{font-size:90%}.o_form .o_error{margin-top:1px;margin-bottom:0;padding:10px}.o_form hr.o_spacer_noline{border-top:1px solid transparent}.o_form hr.o_spacer.form,.o_form hr.o_spacer_noline.form{margin-top:0px;margin-bottom:0px}.o_form .form-group.o_omit_margin{margin-bottom:0}.o_form .o_date{position:relative;padding-right:34px}.o_form .o_date.form-inline .form-group,.o_form .o_date.o_navbar-form .form-group{margin-left:0}.o_form input.o_date_ms{width:3em}.o_form .o_date.form-inline .o_date_ms.form-group,.o_form .o_date.o_navbar-form .o_date_ms.form-group{margin-left:25px}.o_form .has-feedback .o_date.form-inline .form-control.o_date_ms,.o_form .has-feedback .o_date.o_navbar-form .form-control.o_date_ms{padding-right:0}.o_form .o_form_element.form-inline .o_form_element.form-group,.o_form .o_form_element.o_navbar-form .o_form_element.form-group{margin-left:25px}.o_form .input-group.o_date_picker{width:12em}.o_form .o_filepreview{margin-bottom:10px}.o_form .o_fileinput{cursor:pointer;position:relative}.o_form .o_fileinput .o_fakechooser{position:relative;z-index:1}.o_form .o_fileinput .o_realchooser{position:absolute;top:0;right:0;z-index:2;opacity:0;filter:alpha(opacity=0)}.o_form .o_fileinput .o_realchooser.o_chooser_with_delete{right:38px}.o_form .o_fileElement.has-error .o_icon_error.form-control-feedback{display:none}.o_form .form-control.textarea.o_fixed_font_with{resize:vertical !important;font-family:Menlo,Monaco,Consolas,"Courier New",monospace}.o_form .form-control.textarea_disabled.o_fixed_font_with{white-space:pre-wrap;height:auto;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;color:#555 !important;background:#fafafa}.o_form .form-control.textarea_disabled{resize:both;overflow:auto;white-space:pre-wrap;background:#fafafa}.o_centered_form{text-align:center}.o_centered_form fieldset.o_form{display:inline-block;text-align:left}.o_choice_checkrow,.o_choice_textrow{vertical-align:text-top;padding-bottom:2px}.o_choice_textrow{padding-left:1em}.o_togglecheck a{white-space:nowrap}.o_catalog .o_catalog_delete_img{position:relative;top:-0.5em}.o_button_dirty{color:#fff;background-color:#f0ad4e;border-color:#eea236}.o_button_dirty:hover,.o_button_dirty:focus,.o_button_dirty.focus,.o_button_dirty:active,.o_button_dirty.active,.open>.o_button_dirty.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.o_button_dirty:active,.o_button_dirty.active,.open>.o_button_dirty.dropdown-toggle{background-image:none}.o_button_dirty.disabled,.o_button_dirty.disabled:hover,.o_button_dirty.disabled:focus,.o_button_dirty.disabled.focus,.o_button_dirty.disabled:active,.o_button_dirty.disabled.active,.o_button_dirty[disabled],.o_button_dirty[disabled]:hover,.o_button_dirty[disabled]:focus,.o_button_dirty[disabled].focus,.o_button_dirty[disabled]:active,.o_button_dirty[disabled].active,fieldset[disabled] .o_button_dirty,fieldset[disabled] .o_button_dirty:hover,fieldset[disabled] .o_button_dirty:focus,fieldset[disabled] .o_button_dirty.focus,fieldset[disabled] .o_button_dirty:active,fieldset[disabled] .o_button_dirty.active{background-color:#f0ad4e;border-color:#eea236}.o_button_dirty .badge{color:#f0ad4e;background-color:#fff}.o_button_toggle{border:1px solid #777;border-top-right-radius:9px;border-top-left-radius:9px;border-bottom-right-radius:9px;border-bottom-left-radius:9px;background:#eee;display:inline-block;height:18px;line-height:16px;font-size:16px;text-align:left;padding:0 0.5em 0 1px;margin:0}.o_button_toggle i{color:#777;text-shadow:1px 0 2px rgba(0,0,0,0.25)}.o_button_toggle span{line-height:16px;vertical-align:top;font-size:60%;color:#777;text-transform:uppercase}.o_button_toggle.o_on{text-align:right;padding:0 1px 0 0.5em}.o_button_toggle.o_on i{color:#337ab7;text-shadow:-1px 0 2px rgba(0,0,0,0.25)}.o_table_wrapper{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.o_table_wrapper.o_table_flexi .o_table_body{margin-top:20px}.o_table_wrapper.o_table_flexi .table{margin-top:20px}.o_table_wrapper.o_table_flexi .table td ul{margin:0}.o_table_wrapper.o_table_flexi.o_table_no_margin .table{margin:0}.o_table_wrapper.o_table_flexi tfoot{border-top:solid #ddd 2px}.o_table_wrapper.o_table_edit table tbody{border-top:solid #f90 4px;background-color:#fefbf6}.o_table_wrapper .o_table_search{max-width:50em}.o_table_wrapper .o_table_footer .o_table_pagination{text-align:center}.o_table_wrapper .o_table_rows_infos{float:left;padding-left:0;padding-right:20px;margin:20px 0}.o_table_wrapper .o_row_selected td{background-color:#dff0d8 !important}.o_table_wrapper .o_table{margin-bottom:0}.o_table_wrapper .o_marked{font-weight:bold}.o_table_wrapper .table{margin-bottom:0}.o_table_wrapper th a,.o_table_wrapper th a:hover{color:#333;text-decoration:none}.o_table_search a.btn.o_reset_quick_search{width:38px;margin-left:-38px;z-index:5;color:grey}.o_breadcrumb.o_table_flexi_breadcrumb ol.breadcrumb{margin:5px 0 0 0}div.o_table_flexi div.o_table_flexi_leaf{margin-left:1.55em}div.o_table_flexi div.o_table_flexi_l0{padding-left:0px}div.o_table_flexi div.o_table_flexi_l1{padding-left:15px}div.o_table_flexi div.o_table_flexi_l2{padding-left:30px}div.o_table_flexi div.o_table_flexi_l3{padding-left:45px}div.o_table_flexi div.o_table_flexi_l4{padding-left:60px}div.o_table_flexi div.o_table_flexi_l5{padding-left:75px}div.o_table_flexi div.o_table_flexi_l6{padding-left:90px}div.o_table_flexi div.o_table_flexi_l7{padding-left:105px}div.o_table_flexi div.o_table_flexi_l8{padding-left:120px}div.o_table_flexi div.o_table_flexi_l9{padding-left:135px}div.o_table_flexi div.o_table_flexi_l10{padding-left:150px}div.o_table_flexi div.o_table_flexi_l11{padding-left:165px}@media (max-width: 767px){.o_table_wrapper .o_table_rows_infos{clear:both}}a.o_orderby,a.o_orderby:hover{color:#333;text-decoration:none}a.o_orderby.o_orderby_asc,a.o_orderby.o_orderby_desc,a.o_orderby:hover.o_orderby_asc,a.o_orderby:hover.o_orderby_desc{border-bottom:1px solid #ddd}.o_table_row_count{padding-top:6px;padding-bottom:6px;vertical-align:middle}.o_table_row_details td{background-color:white !important}.o_table_config{font-size:12px}.o_table_buttons{text-align:center}.o_table_buttons input{margin-right:1em}.o_table_buttons input:last-child{margin-right:0}.o_table_tools{margin-left:6px}.o_table_tools_indications{margin-left:10px;padding-top:3px;font-size:80%}.o_table_tools_indications a{color:#d9534f}.o_table_toolbar_left .o_table_tools_indications{text-align:right}.o_table_count{max-width:20em;float:left;padding:0 15px}.o_info .table-bordered td,o_note .table-bordered td,o_important .table-bordered td,o_warning .table-bordered td,o_error .table-bordered td{border-color:#333}.panel .o_table_layout{border-top:1px solid #ddd;padding-top:6px}.panel .o_table_count{padding:0 15px}#o_navbar_imclient .o_im_messages{float:left}#o_navbar_imclient #o_im_message,#o_navbar_imclient #o_im_status,#o_navbar_imclient #o_im_summary{float:left;position:relative;padding:15px 3px}#o_navbar_imclient #o_im_status,#o_navbar_imclient #o_im_message{padding-left:15px}#o_navbar_imclient #o_im_summary .badge{color:#fff;background-color:#777}#o_navbar_imclient #o_im_status li>a>span{display:inline}#o_navbar_imclient #o_im_status div.o_chelp_wrapper{right:0.5em}#o_navbar_imclient #o_im_message a:hover,#o_navbar_imclient #o_im_message a:focus{text-decoration:none}#o_navbar_imclient #o_im_message .o_icon_message{color:#d9534f}#o_navbar_imclient #o_im_message .o_icon_message:hover{color:#f4c37d}.o_im_load_history{margin-bottom:6px}.o_im_load_history .o_label{font-size:12px;padding-right:0.5em;line-height:1.5em;color:#777}.o_im_chat_history{height:170px;font-size:90%;border:1px solid #eee;margin:0 0 1em 0;overflow:scroll;overflow-x:auto}.o_im_message_group{padding:3px 3px 3px 40px;min-height:40px;position:relative;border-top:1px solid #eee;background:#fff}.o_im_message_group.o_odd{background:#F4F4F4}.o_im_message_group .o_portrait{position:absolute;top:3px;left:3px}.o_im_message_group .o_im_from{color:#777;font-size:12px;font-weight:bold}.o_im_message_group .o_im_from:hover{color:#5e5e5e}.o_im_message_group div.o_im_body{padding:3px 0 3px 0;font-size:12px}.o_im_message_group div.o_im_body .o_date{float:right;color:#777;font-size:9px}.o_groupchat_roster{font-size:12px}.o_groupchat_roster li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333}.o_groupchat_roster li.o_vip{color:#3c763d}.o_groupchat_roster li.o_anonymous{color:#31708f}.o_im_buddieslist .o_im_buddieslist_toggler .btn{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_im_buddieslist ul{font-size:12px}.o_im_buddieslist ul ul{padding-left:1em}.o_im_buddieslist ul a{color:#337ab7}.o_im_buddieslist ul a:hover{color:#23527c}.o_flag{position:relative;top:1px;display:inline-block;line-height:1;width:16px;height:16px;background-repeat:no-repeat;background-position:0 100%}option.o_with_flag{padding-left:23px;min-height:16px;background-repeat:no-repeat;background-position:2px 50%}.o_flag_en{background-image:url("../light/images/flags/gb.png")}.o_flag_de{background-image:url("../light/images/flags/de.png")}.o_flag_fr{background-image:url("../light/images/flags/fr.png")}.o_flag_it{background-image:url("../light/images/flags/it.png")}.o_flag_es{background-image:url("../light/images/flags/es.png")}.o_flag_da{background-image:url("../light/images/flags/dk.png")}.o_flag_cs{background-image:url("../light/images/flags/cz.png")}.o_flag_el{background-image:url("../light/images/flags/gr.png")}.o_flag_ee{background-image:url("../light/images/flags/ee.png")}.o_flag_ru{background-image:url("../light/images/flags/ru.png")}.o_flag_pl{background-image:url("../light/images/flags/pl.png")}.o_flag_zh_CN{background-image:url("../light/images/flags/cn.png")}.o_flag_zh_TW{background-image:url("../light/images/flags/tw.png")}.o_flag_lt{background-image:url("../light/images/flags/lt.png")}.o_flag_fa{background-image:url("../light/images/flags/ir.png")}.o_flag_pt_PT{background-image:url("../light/images/flags/pt.png")}.o_flag_pt_BR{background-image:url("../light/images/flags/br.png")}.o_flag_tr{background-image:url("../light/images/flags/tr.png")}.o_flag_hu{background-image:url("../light/images/flags/hu.png")}.o_flag_sq{background-image:url("../light/images/flags/al.png")}.o_flag_in{background-image:url("../light/images/flags/id.png")}.o_flag_ar{background-image:url("../light/images/flags/eg.png")}.o_flag_rm{background-image:url("../light/images/flags/rm.png")}.o_flag_af{background-image:url("../light/images/flags/za.png")}.o_flag_vi{background-image:url("../light/images/flags/vn.png")}.o_flag_mn{background-image:url("../light/images/flags/mn.png")}.o_flag_iw{background-image:url("../light/images/flags/il.png")}.o_flag_ko{background-image:url("../light/images/flags/kr.png")}.o_flag_nl_NL{background-image:url("../light/images/flags/nl.png")}.o_flag_jp{background-image:url("../light/images/flags/jp.png")}.o_flag_nb_NO{background-image:url("../light/images/flags/no.png")}.o_flag_et_EE{background-image:url("../light/images/flags/ee.png")}.o_flag_bg{background-image:url("../light/images/flags/bg.png")}.o_flag_hi_IN_ASIA{background-image:url("../light/images/flags/in.png")}.o_flag_ar_LB{background-image:url("../light/images/flags/lb.png")}.o_flag_gl_ES{background-image:url("../light/images/flags/galicia.png")}.o_flag_sk{background-image:url("../light/images/flags/sk.png")}.o_rating .o_rating_title{font-size:12px}.o_rating .o_rating_items{white-space:nowrap}.o_rating .o_rating_items .o_icon{color:#f0ad4e}.o_rating .o_rating_items .o_legend{margin-left:1em;font-size:12px;line-height:normal}.o_rating.o_rating_personal .o_rating_items .o_icon{color:#337ab7}.o_rating .o_rating_explanation{font-size:12px;color:#777}@media (max-width: 991px){.o_rating .o_rating_title,.o_rating .o_rating_explanation{display:none}}.o_comments .o_comment_wrapper .o_avatar{float:left;margin:0 1em 0 0}.o_comments .o_comment_wrapper .o_reply,.o_comments .o_comment_wrapper .o_delete{float:right}.o_comments .o_comment_wrapper .o_comment_wrapper{margin-left:16px}.o_ratings_and_comments .o_rating_wrapper{vertical-align:middle;display:inline-block}.o_ratings_and_comments a.o_comments{margin-left:10px;position:relative;top:0.1em}.d3chart .bar{shape-rendering:crispEdges}.d3chart .bar_default_light{fill:#64a0d3}.d3chart .bar_default,.d3chart .bubble_default{fill:#337ab7}.d3chart .bar_default_dark{fill:#23527c}.d3chart .axis{font:12px sans-serif}.d3chart .axis path,.d3chart .axis line{fill:none;stroke:#000;shape-rendering:crispEdges}.o_forum_peekview .o_quote_wrapper,.o_forum_peekview .b_quote_wrapper{display:none}.o_forum_thread_sticky{font-weight:bold}.o_forum_switch{font-size:12px}.o_forum_toolbar{margin-bottom:6px;float:left}.o_forum_fulltextsearch{float:right}@media (max-width: 767px){.o_forum_fulltextsearch{float:left}.o_forum_toolbar .o_forum_tool span{display:none}}.o_forum{padding-bottom:50px}.o_forum .o_mark,.o_forum .o_ep_collect{float:right;position:relative;width:2em;margin-left:12px}.o_forum .o_portrait{float:left;margin-right:16px}.o_forum .o_portrait_avatar{width:70px;height:70px}.o_forum .o_newindicator{font-size:10px;color:#5cb85c;text-transform:uppercase;padding-left:1em;vertical-align:text-top;white-space:nowrap}.o_forum .o_author,.o_forum .o_date{display:inline-block;color:#777}.o_forum .o_date{font-size:12px}.o_forum .o_modified{color:#8a6d3b;font-size:12px;font-style:italic}.o_forum .o_forum_message{margin-bottom:20px;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1)}.o_forum .o_forum_message_new{-webkit-box-shadow:0 1px 10px rgba(92,184,92,0.3);box-shadow:0 1px 10px rgba(92,184,92,0.3)}.o_forum .o_forum_message_highlight{-webkit-box-shadow:0 1px 10px rgba(240,173,78,0.5);box-shadow:0 1px 10px rgba(240,173,78,0.5)}.o_forum .o_forum_message_header{padding:10px 15px;border-bottom:1px solid #ddd;background-color:#f5f5f5;border-top-right-radius:3px;border-top-left-radius:3px}.o_forum .o_forum_message_title{margin-top:0}.o_forum .o_forum_message_body{padding:10px 15px}.o_forum .o_forum_message_attachments{border-top:1px solid #ddd;padding:10px 15px;font-size:12px;background-color:#f7f7f9}.o_forum .o_attachment{position:relative;max-width:250px;vertical-align:top;margin:6px 12px 10px 0}.o_forum .o_attachment img{margin-top:6px}.o_forum .o_filename{max-width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_forum .o_icon_enlarge{position:absolute;left:1em;bottom:1em;text-shadow:1px 1px 2px #fff, -1px 1px 2px #fff, 1px -1px 2px #fff, -1px -1px 2px #fff}@media (min-width: 768px) and (max-width: 991px){.o_forum .o_attachments{font-size:10px}.o_forum .o_attachment{max-width:200px}.o_forum .o_attachment img{max-width:150px}.o_forum .o_filename{max-width:200px}}@media (max-width: 767px){.o_forum .o_attachments{font-size:9px}.o_forum .o_attachment{max-width:150px}.o_forum .o_attachment img{max-width:100px}.o_forum .o_filename{max-width:150px}}.o_quote_wrapper,.b_quote_wrapper{position:relative;margin:10px 0}.o_quote_author,.b_quote_author{color:#777;font-size:12px}.o_quote_author:before,.b_quote_author:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";font-size:21px;padding-right:0.5em}blockquote.o_quote,blockquote.b_quote{color:#555;font-size:12px;margin-top:6px;padding:0 12px}a.o_chelp{display:inline-block;padding:1px 3px;text-align:center;vertical-align:middle;white-space:nowrap;font-size:10px;font-weight:normal;line-height:15px;color:#fff;background-color:#337ab7;border:1px solid #2e6da4;border-radius:2px;cursor:help;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}a.o_chelp:active,a.o_chelp:hover,a.o_chelp:focus{text-decoration:none;color:#fff;background-color:#2a6598;border-color:#204d74}a.o_chelp i{font-size:10px !important}.o_chelp_wrapper{position:relative;float:right;display:inline-block;line-height:normal;margin-bottom:10px;margin-left:10px}.o_form_chelp,.o_chelp_tooltip{color:#737373}.o_draw_circle{border:4px solid #337ab7;border-radius:50%;position:absolute !important}.o_draw_rectangle{border:4px solid #337ab7;position:absolute !important}.o_iframedisplay iframe{width:100%}.o_singlepage .o_edit{position:absolute;top:10px;right:37px}.o_content_popup{position:absolute;top:10px;right:12px}.o_module_cp_wrapper .o_tools{position:absolute;top:10px;right:12px;text-align:right;vertical-align:middle}.o_module_cp_wrapper .o_tools .o_search_wrapper{display:inline-block;position:relative;top:-2px}ul.o_dropdown{margin:-5px -14px}ul.o_dropdown .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}ul.o_dropdown>li>a{display:block;padding:5px 14px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;background:#fff;white-space:nowrap}ul.o_dropdown>li>a:hover,ul.o_dropdown>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.badge.o_scorm_completed{background-color:#3c763d}.badge.o_scorm_failed{background-color:#a94442}.badge.o_scorm_incomplete{background-color:#8a6d3b}.badge.o_scorm_not_attempted{background:none}.o_bc_meta h5,.o_bc_meta .o_author,.o_bc_meta .o_comment,.tooltip h5,.tooltip .o_author,.tooltip .o_comment{color:#fff;margin:5px 0}.o_bc_meta .o_thumbnail,.tooltip .o_thumbnail{width:200px;height:200px;display:inline-block;background-color:#fff;margin:0 -5px}.o_htmleditor .o_metadata{border:1px solid #999;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom:0;background:#eee;position:relative;top:1px;padding:5px}.o_htmleditor .o_metadata #o_filename{float:left}.o_htmleditor .o_metadata .o_lastmodified{float:right;color:#777;line-height:1.428571429}.o_htmleditor #o_save{margin-top:10px;text-align:center}.o_htmleditor #o_save input{margin-right:1em}.o_htmleditor #o_save input:last-child{margin-right:0}.o_notifications_news_wrapper .o_notifications_news_subscription{margin:10px 0}.o_notifications_news_wrapper .o_notifications_news_subscription h4 i,.o_notifications_news_wrapper .o_notifications_news_subscription .o_cal .fc-header-title h2 i,.o_cal .fc-header-title .o_notifications_news_wrapper .o_notifications_news_subscription h2 i{display:none}.o_notifications_news_wrapper .o_notifications_news_subscription .o_notifications_news_context{color:#777}.o_notifications_news_wrapper .o_notifications_news_subscription .o_notifications_news_content{margin-left:1.5em;position:relative}.o_notifications_news_wrapper .o_notifications_news_subscription .o_notifications_news_content .o_icon{position:absolute;left:-1.5em;line-height:1.5em;top:0}.o_notifications_news_wrapper .o_notifications_news_subscription .o_notifications_news_content .o_date{color:#777}.o_notifications_news_wrapper .o_notifications_news_subscription .o_notifications_news_url{margin-left:1.5em}.o_noti{margin:6px 0 6px 12px;float:right;color:#777}.o_noti .o_label{color:#777;cursor:help}@media (max-width: 767px){.o_noti .o_label span{display:none}}.panel-body .o_noti{margin:0}.o_portrait{display:inline-block}.o_portrait img{border-radius:50%;border:none;background-color:#eee;background-position:50% 50%;background-repeat:no-repeat;background-size:cover}.o_portrait_name{margin-top:6px}.o_block_inline .o_portait,.o_block_inline .o_portrait_name,.o_block_inline .o_portrait_image,.o_block_inline_right .o_portait,.o_block_inline_right .o_portrait_name,.o_block_inline_right .o_portrait_image,.o_block_inline_left .o_portait,.o_block_inline_left .o_portrait_name,.o_block_inline_left .o_portrait_image,.o_block_inline_both .o_portait,.o_block_inline_both .o_portrait_name,.o_block_inline_both .o_portrait_image{display:inline-block}.o_portrait_avatar,.o_portrait_dummy,.o_portrait_dummy_female_big,.o_portrait_dummy_male_big,.o_portrait_anonymous{width:100px;height:100px}.o_portrait_dummy{background-image:url("../light/images/portrait/dummy.png")}.o_portrait_dummy_female_big{background-image:url("../light/images/portrait/dummy_female_big.png")}.o_portrait_dummy_male_big{background-image:url("../light/images/portrait/dummy_male_big.png")}.o_portrait_anonymous{background-image:url("../light/images/portrait/anonymous.png")}.o_portrait_avatar_small,.o_portrait_dummy_small,.o_portrait_dummy_female_small,.o_portrait_dummy_male_small,.o_portrait_anonymous_small{width:30px;height:30px}.o_portrait_dummy_small{background-image:url("../light/images/portrait/dummy_small.png")}.o_portrait_dummy_female_small{background-image:url("../light/images/portrait/dummy_female_small.png")}.o_portrait_dummy_male_small{background-image:url("../light/images/portrait/dummy_male_small.png")}.o_portrait_anonymous_small{background-image:url("../light/images/portrait/anonymous_small.png")}.o_datecomp{position:relative;width:40px;height:52px;border:1px solid #555;margin-right:12px;text-align:center;vertical-align:middle}.o_datecomp div.o_year{position:absolute;left:0;width:100%;top:-20px;height:20px;line-height:20px;font-size:10px}.o_datecomp div.o_month{height:20px;line-height:20px;font-size:12px;background-color:#337ab7;color:#fff}.o_datecomp div.o_day{height:30px;line-height:30px;font-size:18px;border-top:1px solid #555;background-color:#fff;color:#333}.o_block_with_datecomp .o_head{position:relative;padding-left:52px}.o_block_with_datecomp .o_datecomp{position:absolute;top:0.2em;left:0}.o_block_with_datecomp .o_title{margin-top:0}.o_block_with_datecomp .o_meta{color:#777}.o_block_with_datecomp .o_content{border-left:5px solid #eee;padding:0 20px}.o_block_with_datecomp .o_block_footer{padding-left:25px}ul.o_certificates li{padding:5px 0}ul.o_certificates li a.o_sel_certificate_delete{padding-left:2em}.o_cal_toptoolbar{margin-bottom:6px}.o_cal_toptoolbar .o_cal_toptoolbar_help{float:left;margin-right:12px}.o_cal_toptoolbar .o_noti{margin-top:0}.o_feed .o_date,.o_feed .o_author{color:#777}.o_feed .o_subscription a{margin-right:1.5em}.o_feed .o_subscription .form-group{margin-bottom:5px}.o_feed .o_subscription .form-control{border:0;background:none;padding:0;height:auto;-webkit-box-shadow:none;box-shadow:none}.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper{float:left}.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_rating_title,.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_rating_explanation,.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_legend{display:none}.o_feed .o_blog_posts .o_ratings_and_comments a.o_comments span{display:none}.o_feed .o_content:before,.o_feed .o_content:after{content:" ";display:table}.o_feed .o_content:after{clear:both}.o_feed .o_enclosure{clear:both}.o_glossary .o_register{text-align:center}.o_glossary .o_meta{font-size:90%;color:#777;font-style:italic}.o_glossary dl dt:first-letter{font-size:21px}.o_glossary dl dt small{color:#777}.o_tm_glossary{border-bottom:1px dotted #666699 !important}.o_tm_yellow{background-color:#FFFF66}.o_tm_blue{background-color:#33FFFF}.o_tm_red{background-color:#FF3333}.o_tm_green{background-color:#99FF00}.o_coaching div#o_main_toolbar.o_toolbar{margin-top:0px}.o_eff_statement_details .o_user_infos{margin-top:20px}div.o_assessment_user_type_filter{display:inline-block;padding:0.5em;border:1px solid #eee;border-radius:4px}div.o_assessment_user_type_filter div.form-inline,div.o_assessment_user_type_filter div.o_navbar-form{margin-left:5px;display:inline-block}.vitero_iframe{width:100%;height:100%;border:none;min-height:60em}.o_reminder_rule{padding:5px 0}.o_segments.btn-group a span{overflow:hidden;display:block;text-overflow:ellipsis}.o_segments_content{margin-top:20px}.o_tabbed_pane .o_tabbed_pane_content{padding:20px 0 6px 0}.o_togglebox_wrapper .o_opener{position:relative;left:-0.5em}.o_togglebox_wrapper div.o_togglebox_content{position:relative;margin:0}.o_togglebox_wrapper div.o_togglebox_content .o_hide{position:absolute;bottom:0.5em;right:1em}.o_toolboxes ul{margin:0 0 1.5em 0;padding:0 0 0 1.5em}.o_qrcode{width:256px;height:256px}#o_ajax_busy{position:absolute;left:50%;top:20em;margin-left:-2.5em;height:5em;width:5em;color:#fff;z-index:1201;display:none}#o_body.o_ajax_busy{cursor:busy}.o_exception .o_visual{position:relative;background-image:url("../light/images/lion-500x333.jpg");filter:grayscale(50%);-webkit-filter:grayscale(50%);-moz-filter:grayscale(50%);-ms-filter:grayscale(50%);-o-filter:grayscale(50%);width:500px;height:333px;background-repeat:no-repeat;background-position:50% 50%;background-size:contain;margin:0 0 10px 16px}@media (min-width: 768px) and (max-width: 991px){.o_exception .o_visual{width:375px;height:249px}}@media (min-width: 500px) and (max-width: 767px){.o_exception .o_visual{width:250px;height:166px}}@media (max-width: 500px){.o_exception .o_visual{background-size:cover}}.o_exception .jumbotron h1,.o_exception .o_repo_details .o_lead h1,.o_repo_details .o_exception .o_lead h1{color:#d9534f}ul.o_assessment_docs{margin-bottom:0}ul.o_assessment_docs>li{margin-bottom:0.33em}ul.o_assessment_docs>li:last-child{margin-bottom:0em}.o_mail_message .o_mail_meta{background:#fafafa;border:1px solid #eee;padding:5px 10px}.o_mail_message .o_mail_meta h3{margin-top:0}.o_mail_message .o_mail_date,.o_mail_message .o_mail_from,.o_mail_message .o_mail_recipients{color:#777;font-size:90%}.o_mail_message .o_mail_date .o_label,.o_mail_message .o_mail_from .o_label,.o_mail_message .o_mail_recipients .o_label{font-weight:bold;margin-right:1em}.o_mail_message .o_mail_date .o_group span,.o_mail_message .o_mail_from .o_group span,.o_mail_message .o_mail_recipients .o_group span{font-weight:bold}.o_mail_message .o_mail_date .o_group span:after,.o_mail_message .o_mail_from .o_group span:after,.o_mail_message .o_mail_recipients .o_group span:after{content:':';margin-right:0.5em}.o_mail_message .o_mail_date i,.o_mail_message .o_mail_from i,.o_mail_message .o_mail_recipients i{margin-left:1em}.o_mail_message .o_mail_date ul.list-inline,.o_mail_message .o_mail_from ul.list-inline,.o_mail_message .o_mail_recipients ul.list-inline{display:inline}.o_mail_message .o_mail_date ul.list-inline li,.o_mail_message .o_mail_from ul.list-inline li,.o_mail_message .o_mail_recipients ul.list-inline li{padding-right:0;padding-left:0}.o_mail_message .o_more{margin-left:1em}.o_mail_message .o_showAllLink{float:right;font-size:80%}.progress .o_progress_marker{position:absolute;height:100%;top:0;width:3px;background:red}.progress .progress-bar{text-shadow:1px 1px 2px #000000}.o_progress_label_right{float:left;margin-right:10px}.o_web_content{padding-bottom:15px}.o_labeled_light,a.o_qpool_tools_status,.dropdown-toggle.o_qpool_tools_status,.o_labeled{text-transform:uppercase;text-align:center;text-decoration:none;vertical-align:text-bottom;font-size:75% !important;font-weight:bold !important;line-height:1;white-space:nowrap;border:1px solid;border-radius:3px;padding:2px 5px;background-color:#777;color:#fff}.o_labeled_light{background-color:#f8f8f8}.dropdown-menu.o_labeled{background-color:inherit}.o_ms_button{max-width:100%;width:100%;display:flex}.o_ms_button span:not(.o_ms_carret){text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.o_ms_button .o_ms_carret{margin:auto 0 auto auto}.o_ms_list{width:100%;height:auto;max-height:300px;overflow-x:hidden}.o_disclaimer .o_disclaimer_content{max-height:50vh;overflow:auto;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;background:#fbfbfb;padding:10px;border:1px solid #c2c2c2}.tt-input{width:400px}.tt-menu{width:400px;margin-top:6px;padding:0 0 0;color:#555;background-color:#fff;border:1px solid #66afe9;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;-webkit-box-shadow:0 0 8px rgba(102,175,233,0.6);box-shadow:0 0 8px rgba(102,175,233,0.6)}.tt-suggestion{padding:6px 12px;font-size:14px;line-height:1.428571429}.tt-suggestion.tt-cursor,.tt-suggestion:hover{color:#fff;background-color:#337ab7}.tt-suggestion p{margin:0}.tt-menu div.o_icon_error:before{content:''}.o_search_link_extended,.o_search_link_simple{margin-top:12px;display:inline-block}.o_search_results_stats{color:#777;padding-left:1.5em}.o_search_highlight{margin-left:12px;font-size:12px}.o_search_result_title h4,.o_search_result_title .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_search_result_title h2{display:inline-block;margin-right:12px;margin-bottom:6px}.o_search_result_title h4 .o_icon-fw,.o_search_result_title .o_cal .fc-header-title h2 .o_icon-fw,.o_cal .fc-header-title .o_search_result_title h2 .o_icon-fw{text-align:left}.o_search_result_highlight{font-weight:bold;background-color:transparent}.o_search_result_context{display:inline-block;color:#3c763d;margin-right:1em}.o_search_result_license{display:inline-block;color:#777}.o_search_result_excerpt{color:#555}.o_search_result .o_opener{font-size:12px}.o_search_result .o_opener i{width:1em}.o_search_result_details .o_togglebox_wrapper.o_block{margin-top:0;margin-bottom:0}.o_search_result_details .o_togglebox_wrapper .o_togglebox_content{color:#777;font-size:12px;background:#fff;padding:6px 12px}.o_search_result_details .o_togglebox_wrapper .o_search_result_license i{font-size:20px}@media (max-width: 767px){.o_search_result_details{display:none}}.wizard{border:1px solid #d4d4d4;border-radius:2px;background-color:#f9f9f9;position:relative;overflow:hidden;margin-bottom:15px}.wizard ul{list-style:none outside none;padding:0;margin:0;width:4000px}.wizard ul li{float:left;margin:0;padding:0 20px 0 30px;height:46px;line-height:46px;position:relative;background:#ededed;color:#333;font-size:16px;cursor:default}.wizard ul li .chevron{border:24px solid transparent;border-left:14px solid #d4d4d4;border-right:0;display:block;position:absolute;right:-14px;top:0;z-index:1}.wizard ul li .chevron:before{border:24px solid transparent;border-left:14px solid #ededed;border-right:0;content:"";display:block;position:absolute;right:1px;top:-24px}.wizard ul li.active{background:#f1f6fc;color:#333}.wizard ul li.active .chevron:before{border-left:14px solid #f1f6fc}.wizard ul li .badge{margin-right:8px}.wizard ul li:first-child{border-radius:4px 0 0 4px;padding-left:20px}.o_process{position:relative;padding-left:25px}.o_process .o_step{position:relative;height:auto;padding-top:10px;padding-left:30px;padding-bottom:10px}.o_process .o_bar{position:absolute;top:10px;left:8px;height:100%;border-left:4px solid #777}.o_process .o_bar:after{position:absolute;top:0;left:-10px;height:16px;width:16px;border:4px solid #777;border-radius:16px;background:#fff;content:" "}.o_process .o_title{margin-top:-1px;color:#777 !important}.o_process .o_title:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:absolute;left:-24px}.o_process .o_title a:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";width:1em}.o_process .o_title a.collapsed:before{content:""}.o_process .o_step.o_active .o_bar,.o_process .o_step.o_active .o_bar:after{border-color:#337ab7}.o_process .o_step.o_active .o_title{color:#337ab7 !important}.o_process .o_step.o_active .o_title:before{content:"";color:#337ab7}.o_process .o_step.o_done .o_bar,.o_process .o_step.o_done .o_bar:after{border-color:#5094ce}.o_process .o_step.o_done .o_title{color:#5094ce !important}.o_process .o_step.o_done .o_title:before{content:"";color:#5cb85c}.o_process .o_meta{color:#777;font-size:12px;margin-top:-0.5em}.o_cal_orange{background:#ffc266;border-color:#ff9900;color:#5D5D5D}.o_cal_orange .o_cal_wv_event_header{background:#ff9900}.o_cal_orange a{color:#5D5D5D !important}.o_cal_class.o_cal_orange{border-left:20px solid #ffc266}.o_cal_green{background:#66c266;border-color:#009900;color:#FFF}.o_cal_green .o_cal_wv_event_header{background:#009900}.o_cal_green a{color:#FFF !important}.o_cal_class.o_cal_green{border-left:20px solid #66c266}.o_cal_blue{background:#4d6e9f;border-color:#2e5894;color:#FFF}.o_cal_blue .o_cal_wv_event_header{background:#2e5894}.o_cal_blue a{color:#FFF !important}.o_cal_class.o_cal_blue{border-left:20px solid #4d6e9f}.o_cal_yellow{background:#ffe066;border-color:#ffcc00;color:#5D5D5D}.o_cal_yellow .o_cal_wv_event_header{background:#ffcc00}.o_cal_yellow a{color:#5D5D5D !important}.o_cal_class.o_cal_yellow{border-left:20px solid #ffe066}.o_cal_red{background:#c26666;border-color:#990000;color:#FFF}.o_cal_red .o_cal_wv_event_header{background:#990000}.o_cal_red a{color:#FFF !important}.o_cal_class.o_cal_red{border-left:20px solid #c26666}.o_cal_rebeccapurple{background:#663399;border-color:#663399;color:#FFF}.o_cal_rebeccapurple .o_cal_wv_event_header{background:#663399}.o_cal_rebeccapurple a{color:#FFF !important}.o_cal_class.o_cal_rebeccapurple{border-left:20px solid #639}.o_cal_fuchsia{background:#FF00FF;border-color:#dd00dd;color:#FFF}.o_cal_fuchsia .o_cal_wv_event_header{background:#FF00FF}.o_cal_fuchsia a{color:#FFF !important}.o_cal_class.o_cal_fuchsia{border-left:20px solid #f0f}.o_cal_olive{background:#808000;border-color:#636300;color:#FFF}.o_cal_olive .o_cal_wv_event_header{background:#808000}.o_cal_olive a{color:#FFF !important}.o_cal_class.o_cal_olive{border-left:20px solid olive}.o_cal_navy{background:#000080;border-color:#000057;color:#FFF}.o_cal_navy .o_cal_wv_event_header{background:#000080}.o_cal_navy a{color:#FFF !important}.o_cal_class.o_cal_navy{border-left:20px solid navy}.o_cal_maroon{background:#800000;border-color:#740000;color:#FFF}.o_cal_maroon .o_cal_wv_event_header{background:#800000}.o_cal_maroon a{color:#FFF !important}.o_cal_class.o_cal_maroon{border-left:20px solid maroon}.o_cal_lime{background:#00FF00;border-color:#00e200;color:#004d00}.o_cal_lime .o_cal_wv_event_header{background:#00FF00}.o_cal_lime a{color:#004d00 !important}.o_cal_class.o_cal_lime{border-left:20px solid lime}.o_cal_grey{background:#DDDAAA;border-color:#5D5D5D;color:#FFF}.o_cal_grey .o_cal_wv_event_header{background:#5D5D5D}.o_cal_grey a{color:#FFF !important}.o_cal_class.o_cal_grey{border-left:20px solid #DDDAAA}.o_sel_calendar_print_chooser{padding-right:4em}.o_cal_config_enabled,.o_cal_config_disabled{position:relative;float:left;display:inline}.o_cal_config_calendar{margin:0 5px;padding:1px 6px 1px 4px;position:relative;width:200px;overflow:hidden;float:left;display:inline}.o_cal_config_color{display:block;width:16px;height:16px;border-radius:8px}.o_cal_colorchooser_selected:before{content:""}#o_cal_colorchooser div{border:1px solid #337ab7;margin:5px;display:inline-block}#o_cal_colorchooser div:hover{border:1px solid #333}#o_cal_colorchooser a{width:20px;height:20px;display:inline-block}.o_cal_embedded_course_container .o_content_popup{top:0}.o_cal_wv_event_tooltip_content .o_cal_description{background-color:#f8f8f8;padding:10px 7px;margin:10px -7px}.o_cal_wv_event_tooltip_content .o_cal_tooltip_buttons{text-align:center;margin-top:20px}.o_cal_event_managed .fc-event-inner:after{margin-right:2px;float:right;font-family:FontAwesome;font-style:normal;font-weight:normal;font-size:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:""}.o_cal_event_not_managed .fc-event-inner:after{margin-right:2px;float:right;font-family:FontAwesome;font-style:normal;font-weight:normal;font-size:100%;webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:""}.fc-button{color:#333;background-color:#fff;border-color:#ccc}.fc-button:hover,.fc-button:focus,.fc-button.focus,.fc-button:active,.fc-button.active,.open>.fc-button.dropdown-toggle{color:#333;background-color:#e6e6e6;border-color:#adadad}.fc-button:active,.fc-button.active,.open>.fc-button.dropdown-toggle{background-image:none}.fc-button.disabled,.fc-button.disabled:hover,.fc-button.disabled:focus,.fc-button.disabled.focus,.fc-button.disabled:active,.fc-button.disabled.active,.fc-button[disabled],.fc-button[disabled]:hover,.fc-button[disabled]:focus,.fc-button[disabled].focus,.fc-button[disabled]:active,.fc-button[disabled].active,fieldset[disabled] .fc-button,fieldset[disabled] .fc-button:hover,fieldset[disabled] .fc-button:focus,fieldset[disabled] .fc-button.focus,fieldset[disabled] .fc-button:active,fieldset[disabled] .fc-button.active{background-color:#fff;border-color:#ccc}.fc-button .badge{color:#fff;background-color:#333}.fc-button.fc-state-default{text-shadow:none}.fc-button.fc-state-active{color:#fff;background-color:#337ab7;border-color:#2e6da4}.fc-button.fc-state-active:hover,.fc-button.fc-state-active:focus,.fc-button.fc-state-active.focus,.fc-button.fc-state-active:active,.fc-button.fc-state-active.active,.open>.fc-button.fc-state-active.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.fc-button.fc-state-active:active,.fc-button.fc-state-active.active,.open>.fc-button.fc-state-active.dropdown-toggle{background-image:none}.fc-button.fc-state-active.disabled,.fc-button.fc-state-active.disabled:hover,.fc-button.fc-state-active.disabled:focus,.fc-button.fc-state-active.disabled.focus,.fc-button.fc-state-active.disabled:active,.fc-button.fc-state-active.disabled.active,.fc-button.fc-state-active[disabled],.fc-button.fc-state-active[disabled]:hover,.fc-button.fc-state-active[disabled]:focus,.fc-button.fc-state-active[disabled].focus,.fc-button.fc-state-active[disabled]:active,.fc-button.fc-state-active[disabled].active,fieldset[disabled] .fc-button.fc-state-active,fieldset[disabled] .fc-button.fc-state-active:hover,fieldset[disabled] .fc-button.fc-state-active:focus,fieldset[disabled] .fc-button.fc-state-active.focus,fieldset[disabled] .fc-button.fc-state-active:active,fieldset[disabled] .fc-button.fc-state-active.active{background-color:#337ab7;border-color:#2e6da4}.fc-button.fc-state-active .badge{color:#337ab7;background-color:#fff}body.o_cal_print fieldset{border:none;margin-bottom:2em}body.o_cal_print legend{font-size:2em;font-weight:bold}body.o_cal_print legend span{display:block;font-size:14px;font-weight:normal}body.o_cal_print ul.o_cal_wv_list{list-style-type:none;padding:0}body.o_cal_print ul.o_cal_wv_list>li{page-break-inside:avoid;margin-bottom:2em}body.o_cal_print ul.o_cal_wv_list .o_cal_date{font-size:1.25em;font-weight:bold;padding:0.5em 0 0.5em 0}body.o_cal_print ul.o_cal_wv_list ul.o_cal_events{list-style-type:none;padding:0.5em 0 0 0}body.o_cal_print ul.o_cal_wv_list ul.o_cal_events li.o_cal_event{position:relative;left:30px;page-break-inside:avoid;clear:both;margin-bottom:1.5em;padding-right:30px}body.o_cal_print ul.o_cal_wv_list ul.o_cal_events li.o_cal_event .o_cal_time{float:left;font-weight:bold;margin-right:1em}body.o_cal_print ul.o_cal_wv_list ul.o_cal_events li.o_cal_event .o_cal_subject{font-weight:bold}body.o_cal_print ul.o_cal_wv_list ul.o_cal_events li.o_cal_event .o_cal_subject p{margin:0}body.o_cal_print ul.o_cal_wv_list ul.o_cal_events li.o_cal_event .o_cal_location,body.o_cal_print ul.o_cal_wv_list ul.o_cal_events li.o_cal_event .o_cal_description,body.o_cal_print ul.o_cal_wv_list ul.o_cal_events li.o_cal_event .o_cal_freebusy{clear:both}body.o_cal_print ul.o_cal_wv_list ul.o_cal_events li.o_cal_event .o_cal_freebusy{font-style:italic}body.o_cal_print .o_cal_class{position:absolute;left:-30px;width:20px}body.o_cal_print #o_cal_config legend{font-size:1.25em}body.o_cal_print #o_cal_config .o_cal_config_calendar{margin:0;padding:0}body.o_cal_print #o_cal_config .o_cal_config_calendar{position:relative;left:30px;float:none;padding-right:30px}.o_visual{position:absolute;top:0;left:0;overflow:hidden;height:120px;width:180px;vertical-align:middle}@media (min-width: 768px) and (max-width: 991px){.o_visual{height:80px;width:120px}}@media (max-width: 767px){.o_visual{height:50px;width:75px}}.o_visual img{width:100%;height:auto}.o_visual .o_visual_not_available{width:100%;height:100%;background-image:url("../light/images/no_preview.png");background-repeat:no-repeat;background-position:50% 50%;background-size:contain}.o_coursetable.o_rendertype_custom .o_table_row{position:relative;border:1px solid #337ab7;margin-bottom:10px}.o_coursetable.o_rendertype_custom .o_table_row .o_visual{box-sizing:content-box;border-right:1px solid #337ab7}.o_coursetable.o_rendertype_custom .o_table_row .o_access{position:absolute;top:0;right:0;height:120px;width:180px;overflow:hidden;border-left:1px solid #337ab7;padding-top:0.25em}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_state,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score{padding:0 1em;height:20px;line-height:20px;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score{position:relative;left:2px}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score .o_label{color:#777}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social{position:absolute;width:100%;bottom:32px;height:20px;padding-left:1em}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating .o_rating_title,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating o_rating_legend,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating .o_rating_explanation{display:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings{padding:0 0 0 1em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings .o_label{margin-bottom:1em;color:#777}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings .o_methods{color:#5bc0de}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{position:absolute;display:block;bottom:0;width:90px;height:30px;line-height:30px;text-align:center}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book{right:0}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start{color:#fff;background-color:#337ab7;border-color:#2e6da4}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.dropdown-toggle{background-image:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled.active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled],.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled].focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled].active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:hover,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.active{background-color:#337ab7;border-color:#2e6da4}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start .badge{color:#337ab7;background-color:#fff}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book{color:#fff;background-color:#f0ad4e;border-color:#eea236}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.dropdown-toggle{background-image:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled.active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled],.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled].focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled].active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:hover,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.active{background-color:#f0ad4e;border-color:#eea236}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book .badge{color:#f0ad4e;background-color:#fff}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{right:90px;color:#fff;background-color:#5cb85c;border-color:#4cae4c}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.dropdown-toggle{background-image:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled.active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled],.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled].focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled].active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:hover,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.active{background-color:#5cb85c;border-color:#4cae4c}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details .badge{color:#5cb85c;background-color:#fff}@media (min-width: 768px) and (max-width: 991px){.o_coursetable.o_rendertype_custom .o_table_row .o_access{height:80px;width:120px}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_comments,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_label{display:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{width:60px}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{right:60px}}@media (max-width: 767px){.o_coursetable.o_rendertype_custom .o_table_row .o_access{display:none}}.o_coursetable.o_rendertype_custom .o_table_row .o_meta{height:120px;margin:0 180px 0 180px;position:relative;padding:1em 0.5em 0.25em 1em;overflow:hidden}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title{margin:0;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a{display:block;color:#337ab7}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a:hover{color:#286090}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_author{margin-top:0.5em;line-height:normal;font-size:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#3c763d}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle{position:absolute;top:5px;right:40px;z-index:2px;background:white;padding:0 3px 3px 3px;border-radius:0px 0px 3px 3px;font-size:90%;line-height:normal;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#777}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle.o_active{color:#3c763d}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle.o_active:hover{color:#2b542c}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_desc{margin-top:0.5em}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_bookmark{position:absolute;top:-1px;right:15px}@media (min-width: 768px) and (max-width: 991px){.o_coursetable.o_rendertype_custom .o_table_row .o_meta{height:80px;margin:0 120px}}@media (max-width: 767px){.o_coursetable.o_rendertype_custom .o_table_row .o_meta{height:50px;margin:0 0 0 75px;padding:0 0 0 1em}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title{line-height:50px}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a{border-right:37px solid transparent;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_author,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_bookmark,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_desc{display:none}}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_go_xs{position:absolute;top:0;right:0;padding:0 1em;height:50px;width:37px;line-height:50px;color:#fff;background-color:#337ab7}.o_coursetable.o_rendertype_classic .o_rating_explanation{display:none}.o_coursetable.o_rendertype_classic .o_start,.o_coursetable.o_rendertype_classic .o_book{white-space:nowrap}.o_coursetable.o_rendertype_classic .o_repoentry_type{color:#555}.o_coursetable.o_rendertype_classic .o_repoentry_ac{color:#555}.o_catalog .o_level{position:relative;margin-bottom:10px;padding:0;border-top:1px solid #337ab7;border-bottom:1px solid #337ab7}.o_catalog .o_level .o_visual{height:180px}.o_catalog .o_level .o_meta{position:relative;min-height:180px;height:180px;overflow:hidden;margin:0 0 0 180px;padding:1em 0.5em 0.5em 2em}.o_catalog .o_level .o_meta .o_title{margin:0}.o_catalog .o_level .o_meta .o_title a{display:block;color:#337ab7}.o_catalog .o_level .o_meta .o_title a:hover{color:#286090}.o_catalog .o_level .o_meta .o_desc{padding:1em 0 0.5em 0}@media (min-width: 768px) and (max-width: 991px){.o_catalog .o_level .o_visual{height:120px}.o_catalog .o_level .o_meta{min-height:120px;height:120px;margin:0 0 0 120px}}@media (max-width: 767px){.o_catalog .o_level .o_visual{height:75px}.o_catalog .o_level .o_meta{min-height:75px;height:75px;margin:0 0 0 75px;padding:0 0 0 1em}.o_catalog .o_level .o_meta .o_title{line-height:75px}.o_catalog .o_level .o_meta .o_desc{display:none}}.o_catalog .o_sublevels_list .o_sublevel{position:relative;border:1px solid #337ab7;margin-bottom:10px}.o_catalog .o_sublevels_list .o_sublevel .o_visual{height:75px;width:75px}.o_catalog .o_sublevels_list .o_sublevel .o_visual span.o_visual_not_available{width:100%;height:100%;display:block}.o_catalog .o_sublevels_list .o_sublevel .o_title{margin:0}.o_catalog .o_sublevels_list .o_sublevel .o_meta{border-left:1px solid #337ab7;min-height:75px;height:75px;margin:0 0 0 75px;padding:0 0 0 1em;overflow:hidden}.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_title{line-height:75px}.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_desc{display:none}.o_catalog .o_sublevels_list .o_sublevel .o_meta h4.o_title>a,.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_cal .fc-header-title h2.o_title>a,.o_cal .fc-header-title .o_catalog .o_sublevels_list .o_sublevel .o_meta h2.o_title>a{font-family:inherit;font-weight:inherit}.o_catalog .o_sublevels_list .o_sublevel .o_meta h4.o_title>a>i,.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_cal .fc-header-title h2.o_title>a>i,.o_cal .fc-header-title .o_catalog .o_sublevels_list .o_sublevel .o_meta h2.o_title>a>i{display:none}.o_catalog .o_sublevels_list .o_sublevel.o_fill_sublevels{border:1px solid transparent}.o_catalog .o_sublevels_list .o_sublevel.o_fill_sublevels .o_meta{border-left:1px solid transparent}.o_catalog .o_sublevels{position:relative;margin-bottom:20px}.o_catalog .o_sublevels:before,.o_catalog .o_sublevels:after{content:" ";display:table}.o_catalog .o_sublevels:after{clear:both}.o_catalog .o_sublevels .o_sublevel{position:relative;float:left;margin:0 20px 20px 0;width:180px}.o_catalog .o_sublevels .o_sublevel:last-child{margin-right:0}.o_catalog .o_sublevels .o_sublevel .o_visual{border:1px solid #337ab7;position:relative;height:180px}.o_catalog .o_sublevels .o_sublevel .o_visual span.o_visual_not_available{width:100%;height:100%;display:block}.o_catalog .o_sublevels .o_sublevel .o_meta{position:absolute;left:0;bottom:0;width:100%;border:1px solid #337ab7;border-top:0;background-color:rgba(255,255,255,0.8)}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title{margin:0;text-align:center;line-height:2em;height:2em;width:100%;overflow:hidden}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a{display:block;color:#337ab7;font-family:inherit;font-weight:inherit}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a:hover{color:#286090}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a>i{display:none}@media (min-width: 768px) and (max-width: 991px){.o_catalog .o_sublevels .o_sublevel{width:120px;margin:0 10px 10px 0}.o_catalog .o_sublevels .o_sublevel .o_visual{height:120px}.o_catalog .o_sublevels .o_sublevel .o_title{font-size:90%}}@media (max-width: 767px){.o_catalog .o_sublevels .o_sublevel{width:120px;margin:0 1px 1px 0}.o_catalog .o_sublevels .o_sublevel .o_visual{height:120px;width:120px}.o_catalog .o_sublevels .o_sublevel .o_title{font-size:90%}}@media (min-width: 768px){.o_catalog .o_sublevels_list,.o_catalog .o_sublevels_compact{-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2;columns:2}}.o_repo_details{position:relative}.o_repo_details .o_lead{margin-bottom:10px}.o_repo_details .o_lead .o_author{margin-top:0.5em;margin-bottom:1em;font-size:120%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#3c763d}.o_repo_details .o_lead .o_media{float:right;margin-left:2em;margin-bottom:2em}.o_repo_details .o_lead .o_media.o_desc_empty{float:none;margin-left:0;margin-bottom:0}.o_repo_details .o_lead h1{font-size:37px}.o_repo_details .o_lead h1 i{display:none}.o_repo_details .o_overview i{margin-right:0.5em}.o_repo_details .o_overview div{margin-bottom:0.25em}.o_repo_details .o_start_wrapper{clear:both;margin:2em 0 -10px 0;text-align:right}.o_repo_details .o_start_wrapper .o_start_inner{display:inline-block}.o_repo_details .o_start,.o_repo_details .o_book{max-width:400px;display:inline-block}.o_repo_details .o_social:before,.o_repo_details .o_social:after{content:" ";display:table}.o_repo_details .o_social:after{clear:both}.o_repo_details .o_social .o_rating_wrapper{float:left}.o_repo_details .o_social .o_comments{margin-left:1em}@media (max-width: 767px){.o_repo_details .o_lead p{font-size:16px}.o_repo_details .o_lead .o_media{margin-left:0;float:none;text-align:center}.o_repo_details .o_start_wrapper{text-align:center}.o_repo_details .o_start_wrapper .o_start_inner{display:block}.o_repo_details .o_start,.o_repo_details .o_book{max-width:100%;display:block}}@media (max-width: 613px){.o_repo_details .o_subcolumn{width:100%}}.o_meta .o_closed{padding:2px 5px;margin:5px 0}.o_overview .o_closed{padding:12px 15px;margin:15px 0}.o_ac_configuration span.o_ac_infos{font-weight:normal;color:grey}tr.o_entry_closed,tr.o_entry_closed td,tr.o_entry_closed td span,tr.o_entry_unpublished,tr.o_entry_unpublished td,tr.o_entry_unpublished td span{text-decoration:line-through}.o_repo_status_filter>div{display:inline-block}.o_repo_status_filter>div label{font-weight:normal}.badge.o_midpub{background-color:#3c763d}.badge.o_midwarn{background-color:#8a6d3b}.badge.o_midlock{background-color:#31708f}.badge.o_miderr{background-color:#a94442}.badge.o_middel{background-color:#777}.o_course_editor_legend .badge{font-size:80%}.o_course_editor_legend .badge:before{content:none}.o_passed{color:#3c763d;font-weight:bold}.o_passed a:hover{color:#2b542c}.o_passed th{color:#333}.o_failed{color:#a94442;font-weight:bold}.o_failed a:hover{color:#66512c}.o_failed th{color:#333}.o_unknown{color:#8a6d3b;font-weight:bold}.o_unknown a:hover{color:#66512c}.o_unknown th{color:#333}.o_noinfo{color:#777}.o_course_run .o_toc .o_entry .o_shorttitle{border-bottom:1px solid #777}.o_course_run .o_toc .o_entry .o_displaytitle{margin-top:5px;color:#777}.o_course_run .o_toc .o_entry .o_objectives{margin-top:10px;font-style:italic}.o_course_run .o_in_review{font-style:italic;position:relative}.o_course_run.o_titled_wrapper>h2 i{display:none}.o_course_run .o_cal_toptoolbar{margin-right:26px}.o_course_run .o_titled_wrapper .o_cal_toptoolbar{margin-right:0px}.o_tree.o_course_menu div.o_tree_l0>a:first-child{background-color:none}.o_st_peekview ul li{margin-bottom:0.5em}.o_cl_line{margin-bottom:10px;padding-bottom:5px}.o_cl_line.o_even{background-color:#f9f9f9}.o_ll_container h5{margin-bottom:5px}.o_ll_container h5 a.o_desc{color:#337ab7}.o_ll_container h5 a.o_desc small{display:none}.o_ll_container h5 a.o_desc:hover{color:#286090;text-decoration:none}.o_ll_container h5 a.o_desc:hover small{color:#5e5e5e;display:inline}.o_ll_container div.o_comment{color:#777}.o_cmembers .o_cmember{margin:12px 0;display:table}.o_cmembers .o_cmember .o_portrait{padding-right:10px;display:table-cell;vertical-align:top}.o_cmembers .o_cmember .o_portrait img{width:50px;height:50px}.o_cmembers .o_cmember .o_cmember_info_wrapper{display:table-cell;vertical-align:middle;color:#777}.o_cmembers .o_cmember .o_cmember_info_wrapper .o_mail{margin-left:6px}.o_cmembers .o_cmember a.o_mail{display:none}.o_cmembers .o_cmember:hover a.o_mail{display:inline}.o_cmembers_print{color:#000}.o_cmembers_print #o_print_brand{position:absolute;top:1cm;right:1cm;width:5cm;height:4cm}.o_cmembers_print #o_print_brand img{width:100%}.o_cmembers_print .o_portrait{width:100px;height:100px;position:relative}.o_cmembers_print .o_portrait img{border-radius:0px;max-width:100%;max-height:100%;width:auto;height:auto;position:absolute;top:0;bottom:0;left:0;right:0;margin:auto}.o_cmembers_print .o_cmember{padding-left:0px;padding-right:15px;margin-bottom:20px}.o_cmembers_print .o_cmember .o_cmember_info_wrapper{word-wrap:break-word}.o_cmembers_print .o_cmember .o_prop.o_zipCode{float:left;padding-right:0.5em}.o_cmembers_print h1{font-size:18pt;color:#000}.o_cmembers_print h3{font-size:14pt;margin-top:5px;font-weight:normal;color:#000}.o_cmembers_print h4,.o_cmembers_print .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_cmembers_print h2{font-size:11pt;font-weight:strong;color:#000;padding-bottom:10px;border-bottom:1px solid #eee}.o_cmembers_print .o_cmember_info_wrapper{font-size:7pt;color:#000}.o_cmembers_print .o_cmember_info_wrapper strong{font-size:8pt}.tag.label.label-info{margin-right:3px}.input-group.o_tag_inputgroup .form-control{height:auto}div.o_correction_navigation .o_correction_navigation_back{float:left;line-height:32px}div.o_correction_navigation .o_correction_navigation_previous{position:absolute;right:50%;margin-right:102px}div.o_correction_navigation #o_cocurrent_item_SELBOX{width:200px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;position:absolute;left:50%;margin-left:-100px}div.o_correction_navigation .o_correction_navigation_next{position:absolute;left:50%;margin-left:102px}@media (max-width: 767px){div.o_correction_navigation .o_correction_navigation_previous span,div.o_correction_navigation .o_correction_navigation_next span{display:none}}tr.o_curriculum_element_l0 td{padding:0px}div.o_curriculum_element_l0{margin-left:0px}tr.o_curriculum_element_l1 td{padding:15px}div.o_curriculum_element_l1{margin-left:15px}tr.o_curriculum_element_l2 td{padding:30px}div.o_curriculum_element_l2{margin-left:30px}tr.o_curriculum_element_l3 td{padding:45px}div.o_curriculum_element_l3{margin-left:45px}tr.o_curriculum_element_l4 td{padding:60px}div.o_curriculum_element_l4{margin-left:60px}tr.o_curriculum_element_l5 td{padding:75px}div.o_curriculum_element_l5{margin-left:75px}tr.o_curriculum_element_l6 td{padding:90px}div.o_curriculum_element_l6{margin-left:90px}tr.o_curriculum_element_l7 td{padding:105px}div.o_curriculum_element_l7{margin-left:105px}tr.o_curriculum_element_l8 td{padding:120px}div.o_curriculum_element_l8{margin-left:120px}tr.o_curriculum_element_l9 td{padding:135px}div.o_curriculum_element_l9{margin-left:135px}tr.o_curriculum_element_l10 td{padding:150px}div.o_curriculum_element_l10{margin-left:150px}tr.o_curriculum_element_l11 td{padding:165px}div.o_curriculum_element_l11{margin-left:165px}.o_curriculumtable.o_rendertype_custom .o_table_row.o_curriculum_element{border-color:#999}.o_curriculumtable.o_rendertype_custom .o_table_row.o_curriculum_element .o_meta{height:40px;margin:0 180px 0 0}.o_curriculumtable.o_rendertype_custom .o_table_row{position:relative;border:1px solid #337ab7;margin-bottom:10px}.o_curriculumtable.o_rendertype_custom .o_table_row .o_visual{box-sizing:content-box;border-right:1px solid #337ab7}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access{position:absolute;top:0;right:0;height:120px;width:180px;overflow:hidden;border-left:1px solid #337ab7;padding-top:0.25em}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_state,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_score{padding:0 1em;height:20px;line-height:20px;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_score{position:relative;left:2px}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_score .o_label{color:#777}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_social{position:absolute;width:100%;bottom:32px;height:20px;padding-left:1em}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating .o_rating_title,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating o_rating_legend,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating .o_rating_explanation{display:none}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_bookings{padding:0 0 0 1em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_bookings .o_label{margin-bottom:1em;color:#777}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_bookings .o_methods{color:#5bc0de}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details{position:absolute;display:block;bottom:0;width:90px;height:30px;line-height:30px;text-align:center}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book{right:0}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start{color:#fff;background-color:#337ab7;border-color:#2e6da4}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start:hover,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start:focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.active,.open>.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.active,.open>.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.dropdown-toggle{background-image:none}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.disabled,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:hover,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.disabled.focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.disabled.active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start[disabled],.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:hover,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start[disabled].focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start[disabled].active,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start:hover,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start:focus,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.focus,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start:active,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.active{background-color:#337ab7;border-color:#2e6da4}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start .badge{color:#337ab7;background-color:#fff}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book{color:#fff;background-color:#f0ad4e;border-color:#eea236}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book:hover,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book:focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.active,.open>.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.active,.open>.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.dropdown-toggle{background-image:none}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.disabled,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:hover,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.disabled.focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.disabled.active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book[disabled],.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:hover,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book[disabled].focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book[disabled].active,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book:hover,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book:focus,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.focus,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book:active,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.active{background-color:#f0ad4e;border-color:#eea236}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book .badge{color:#f0ad4e;background-color:#fff}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details{right:90px;color:#fff;background-color:#5cb85c;border-color:#4cae4c}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details:hover,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details:focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.active,.open>.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.active,.open>.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.dropdown-toggle{background-image:none}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.disabled,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:hover,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.disabled.focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.disabled.active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details[disabled],.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:hover,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details[disabled].focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details[disabled].active,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details:hover,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details:focus,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.focus,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details:active,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.active{background-color:#5cb85c;border-color:#4cae4c}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details .badge{color:#5cb85c;background-color:#fff}@media (min-width: 768px) and (max-width: 991px){.o_curriculumtable.o_rendertype_custom .o_table_row .o_access{height:80px;width:120px}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_score,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_comments,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_label{display:none}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details{width:60px}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details{right:60px}}@media (max-width: 767px){.o_curriculumtable.o_rendertype_custom .o_table_row .o_access{display:none}}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta{height:120px;margin:0 180px 0 180px;position:relative;padding:1em 0.5em 0.25em 1em;overflow:hidden}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_title{margin:0;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_title a{display:block;color:#337ab7}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_title a:hover{color:#286090}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta h5.o_title{margin-bottom:0.2em}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_author{margin-top:0.5em;line-height:normal;font-size:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#3c763d}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle{position:absolute;top:5px;right:40px;z-index:2px;background:white;padding:0 3px 3px 3px;border-radius:0px 0px 3px 3px;font-size:90%;line-height:normal;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#777}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle.o_active{color:#3c763d}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle.o_active:hover{color:#2b542c}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_desc{margin-top:0.5em}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_bookmark{position:absolute;top:-1px;right:15px}@media (min-width: 768px) and (max-width: 991px){.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta{height:80px;margin:0 120px}}@media (max-width: 767px){.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta{height:50px;margin:0 0 0 75px;padding:0 0 0 1em}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_title{line-height:50px}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_title a{border-right:37px solid transparent;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_author,.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_bookmark,.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle,.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_desc{display:none}}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_go_xs{position:absolute;top:0;right:0;padding:0 1em;height:50px;width:37px;line-height:50px;color:#fff;background-color:#337ab7}table.table.o_qti_item_kprim>thead>tr>th,table.table.o_qti_item_kprim>tbody>tr>td{border:none}td.o_qti_item_kprim_input,th.o_qti_item_kprim_input{text-align:center}td.o_qti_item_kprim_input .radio,th.o_qti_item_kprim_input .radio{display:inline}td.o_qti_item_kprim_text{width:80%}div.o_qti_menu_section,div.o_qti_menu_section_clickable,div.o_qti_menu_section_active{margin-top:10px}div.o_qti_menu_item a,div.o_qti_menu_section a{text-decoration:none}div.o_qti_menu_item{padding:.1em}div.o_qti_menu_item_active{padding:.1em;font-weight:bold}div.o_qti_item_itemfeedback{background-color:#ffffff;border-color:#000000}div.o_qti_item_choice_option_flow{display:inline-block;padding:.5em;border:1px solid transparent}.d3chart .bar_green{fill:#5cb85c}.d3chart .bar_red{fill:#d9534f}.d3chart .bar_grey{fill:lightgrey}.d3chart circle.bubble_green{fill:#5cb85c}div.o_qti_statistics ul{list-style-type:none;padding:0;margin:0;font-size:90%}div.o_qti_statistics ul strong{font-weight:normal}div.o_qti_statistics ul li{padding-left:48px;margin-left:0;margin-bottom:10px}div.o_qti_statistics ul li.o_qti_statistics-ncorrect:before{font-size:125%;content:'\2A2F\00A0\00A0'}div.o_qti_statistics ul li.o_qti_statistics-correct:before{font-size:125%;content:'\2713\00A0\00A0'}div.o_qti_statistics ul li.o_qti_statistics-kplus:before{font-size:125%;content:'\2713\00A0\2A2F\00A0\00A0'}div.o_qti_statistics ul li.o_qti_statistics-kminus:before{font-size:125%;content:'\2A2F\00A0\2713\00A0\00A0'}div.o_qti_statistics ul li img{vertical-align:top}div.o_qti_statistics table.o_qti_statistics_figures tr{float:left}div.o_qti_statistics table.o_qti_statistics_figures tr:nth-child(2n+1){clear:left;padding-right:20px}div.o_qti_statistics table.o_qti_statistics_figures td{width:200px;padding-left:0;vertical-align:bottom}div.o_qti_statistics table.o_qti_statistics_figures td+td{width:100px}div.o_qti_statistics .o_qti_statistics_answer{background:#F5F5F5;padding:1px 2px;width:90%}div.o_qti_statistics div.o_qti_statistics_legend{padding-top:10px;width:470px;border:1px solid #ddd;border-radius:4px}div.o_qti_statistics div.o_qti_statistics_legend ul li .bar_green{background-color:#9dd53a}div.o_qti_statistics div.o_qti_statistics_legend ul li .bar_red{background-color:#f85032}div.o_qti_statistics div.o_qti_statistics_legend ul li .bar_grey{background-color:lightgrey}div.o_qti_metadatas .panel-body{border-top:none}.o_qti_menu_item_attempts:after,.o_qti_menu_item_attempts_marked:after{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.o_qti_menu_item_attempts:after{content:""}.o_qti_menu_item_attempts_marked:after{content:"";color:#337ab7}.o_qti_print div.o_qti_statistics{width:680px}@media print{div.o_qti_statistics{width:680px}}ul.sessionControl{list-style:none;margin:1em;text-align:center}ul.sessionControl li{display:inline;padding:0.2em}.association{margin:20px 20px 20px 40px;background:transparent url("../light/images/association_bg.png") repeat-x center center}.o_associate_item{padding:5px;margin:0 15px 10px 0;border:2px solid #999}.o_associate_item.oo-selected{border:2px solid #337ab7}.o_associate_item.oo-choosed{border:none !important}.o_associate_item.oo-drag{border:2px solid #337ab7 !important}.association_box{border:3px dotted #999}.association_box.oo-filled{border:3px solid #999}.association_box{background-color:white}.prompt{font-weight:bold}.sketch{position:relative;user-drag:none;user-select:none;-moz-user-select:none;-webkit-user-drag:none;-webkit-user-select:none;-ms-user-select:none}#tmp_canvas{position:absolute;left:0px;right:0;bottom:0;top:0;cursor:crosshair;user-drag:none;user-select:none;-moz-user-select:none;-webkit-user-drag:none;-webkit-user-select:none;-ms-user-select:none}#colors .black .o_icon:before{color:#000000}#colors .blue .o_icon:before{color:#0000FF}#colors .green .o_icon:before{color:#008000}#colors .yellow .o_icon:before{color:#FFFF00}#colors .red .o_icon:before{color:#FF0000}#colors .purple .o_icon:before{color:#800080}.o_gap_item{padding:5px;margin:5px;background-repeat:no-repeat;background-position:center center}.o_gap_item.oo-choosed{position:relative;left:auto;top:auto;padding:3px;margin:0}.o_gap_item.oo-selected{border:3px solid #337ab7}.o_item_container_help,.o_items_container_help{font-size:90%;font-style:italic;color:#777;padding:5px}.items_container{padding:15px}.items_container .o_item{float:left}#o_qti_hotspots_edit{min-height:100px;min-width:400px;background-repeat:no-repeat}#o_qti_hotspots_edit.o_qti_hotspot-standard .o_draw_circle,#o_qti_hotspots_edit.o_qti_hotspot-standard .o_draw_rectangle{background-color:rgba(255,255,255,0.5);border-color:#6E6E6E}#o_qti_hotspots_edit.o_qti_hotspot-standard .o_qti_hotspot_correct.o_draw_circle,#o_qti_hotspots_edit.o_qti_hotspot-standard .o_qti_hotspot_correct.o_draw_rectangle{background-color:rgba(45,0,255,0.5);border-color:#0000ff}#o_qti_hotspots_edit.o_qti_hotspot-light .o_draw_circle,#o_qti_hotspots_edit.o_qti_hotspot-light .o_draw_rectangle{background-color:rgba(221,221,221,0);border-color:#7E7E7E}#o_qti_hotspots_edit.o_qti_hotspot-light .o_qti_hotspot_correct.o_draw_circle,#o_qti_hotspots_edit.o_qti_hotspot-light .o_qti_hotspot_correct.o_draw_rectangle{background-color:rgba(51,122,183,0.05);border-color:#337ab7}#o_qti_hotspots_edit.o_qti_hotspot-inverted .o_draw_circle,#o_qti_hotspots_edit.o_qti_hotspot-inverted .o_draw_rectangle{background-color:rgba(110,110,110,0.5);border-color:#3E3E3E}#o_qti_hotspots_edit.o_qti_hotspot-inverted .o_qti_hotspot_correct.o_draw_circle,#o_qti_hotspots_edit.o_qti_hotspot-inverted .o_qti_hotspot_correct.o_draw_rectangle{background-color:rgba(222,222,222,0.2);border-color:#CECECE}#o_qti_hotspots_edit.o_qti_hotspot-green .o_draw_circle,#o_qti_hotspots_edit.o_qti_hotspot-green .o_draw_rectangle{background-color:rgba(142,142,142,0.25);border-color:#CECECE}#o_qti_hotspots_edit.o_qti_hotspot-green .o_qti_hotspot_correct.o_draw_circle,#o_qti_hotspots_edit.o_qti_hotspot-green .o_qti_hotspot_correct.o_draw_rectangle{background-color:rgba(134,195,81,0.5);border-color:#518b33}#o_qti_hotspots_edit.o_qti_hotspot-purple .o_draw_circle,#o_qti_hotspots_edit.o_qti_hotspot-purple .o_draw_rectangle{background-color:rgba(142,142,142,0.33);border-color:#CECECE}#o_qti_hotspots_edit.o_qti_hotspot-purple .o_qti_hotspot_correct.o_draw_circle,#o_qti_hotspots_edit.o_qti_hotspot-purple .o_qti_hotspot_correct.o_draw_rectangle{background-color:rgba(234,168,255,0.5);border-color:#ab47cb}div.hotspotInteraction{overflow-x:auto}img.o_hotspot_responsive[usemap]{max-width:100%;width:auto;height:auto}.form-inline.o_qti_gaptext_add_first_alternative,.o_qti_gaptext_add_first_alternative.o_navbar-form{padding:9px 0 3px 0}.form-inline.o_qti_gaptext_add_alternative,.o_qti_gaptext_add_alternative.o_navbar-form{margin-bottom:3px}.o_qti_item_body .extendedTextInteraction{margin:15px 0}.o_qti_item_body .extendedTextInteraction textarea{resize:vertical !important;font-family:Menlo,Monaco,Consolas,"Courier New",monospace}.o_qti_item_body .extendedTextInteraction pre{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}.o_qti_item_body .extendedTextInteraction .o_qti_essay_last_save{padding:2px 2px;font-style:italic;font-size:90%;text-align:right}.extendedTextInteraction div.form-control.textarea_disabled{white-space:pre-wrap;height:auto;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;color:#555 !important}#o_qti_run_title{margin:0 15px 0.5em 15px}#o_qti_run_title h3{margin:15px 0 0 0}#o_qti_run_infos{border:1px solid #e7e7e7;border-radius:4px;background:#f8f8f8;padding:10px 0;margin:0 15px 1em 15px}#o_qti_run_infos .progress{background-color:#eee}#o_qti_run_infos #o_qti_scoreinfo .progress-bar{background-color:#337ab7}.progress-striped #o_qti_run_infos #o_qti_scoreinfo .progress-bar{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}#o_qti_run_infos #o_qti_questioninfo .progress-bar{background-color:#337ab7}.progress-striped #o_qti_run_infos #o_qti_questioninfo .progress-bar{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}#o_qti_run_infos #o_qti_run_scoreinfo,#o_qti_run_infos #o_qti_run_scoreprogress{white-space:nowrap}#o_qti_results_infos{border:1px solid #e7e7e7;border-radius:4px;background:#f8f8f8;padding:10px 0;margin:0 0 1em 0}#o_qti_results_infos .progress{background-color:#eee}#o_qti_results_infos #o_qti_run_scoreinfo,#o_qti_results_infos #o_qti_run_scoreprogress{white-space:nowrap}#o_qti_assessment_test_timer{border:1px solid #e7e7e7;border-radius:4px;padding:10px;margin:0 15px 1em 15px}#o_qti_assessment_test_timer.o_10_minutes{background-color:#fcf8e3}#o_qti_assessment_test_timer.o_5_minutes{background-color:#f2dede}#o_qti_assessment_test_timer.o_panic{background-color:#ce8383}#o_qti_assessment_test_timer .o_qti_times_up{padding-left:2em;font-weight:bold}#o_qti_assessment_test_timer .o_qti_times_message{padding-left:2em;font-weight:bold}.o_draw_circle.o_qti_hotspot_correct,.o_draw_rectangle.o_qti_hotspot_correct{background-color:rgba(229,255,204,0.6)}#width_range_ui,#opacity_range_ui{width:120px}.o_slider_width_range,.o_slider_opacity_range{margin:3px 10px 0 0}.o_qti_hotspot_label{padding-left:48%}.o_info.o_assessmentsection_rubrics{margin:0 0 0.5em 0;position:relative}.o_info.o_assessmentsection_rubrics.o_hide{display:none}.o_info.o_assessmentsection_rubrics.o_show{display:block}.o_info.o_assessmentsection_rubrics a.o_hide{position:absolute;bottom:0.5em;right:1em}.o_assessmentitem h1{margin-bottom:0}.o_assessmentitem div.badResponse,.o_assessmentitem span.badResponse{color:#d9534f;font-weight:bold}.o_assessmentitem input.badResponse{border:1px solid #d9534f}.o_assessmentitem .infoControl input{margin-right:0.5em}.o_assessmentitem .infoControl .infoControlContent{display:none}.o_assessmentitem .sliderInteraction{margin:1em}.o_assessmentitem .sliderInteraction .sliderVertical .sliderValue{margin:1em 0}.o_assessmentitem .sliderInteraction .sliderVertical .sliderWidget{height:200px}.o_assessmentitem .sliderInteraction .sliderHorizontal .sliderValue{text-align:center}.o_assessmentitem div.orderInteraction div.highlight{border:1px solid #d9534f}.o_assessmentitem div.orderInteraction div.box.vertical{width:50%;float:left;position:relative;padding:0;margin-top:5px}.o_assessmentitem div.orderInteraction div.box.vertical ul{min-height:200px}.o_assessmentitem div.orderInteraction div.box.horizontal ul{min-height:50px;width:100%}.o_assessmentitem div.orderInteraction div.box.source{padding:5px 10px;border:1px solid #e7e7e7;border-radius:4px;background:#f8f8f8}.o_assessmentitem div.orderInteraction div.box.source.horizontal{padding:5px 10px 15px 10px}.o_assessmentitem div.orderInteraction div.box.target ul{border:2px solid #5bc0de;border-radius:4px;background:#d9edf7}.o_assessmentitem div.orderInteraction div.box.target ul.oo-accepted{border-color:#1f7e9a}.o_assessmentitem div.orderInteraction div.box.target.vertical{padding:6px 0 0 10px}.o_assessmentitem div.orderInteraction div.box.target.vertical ul{padding:10px}.o_assessmentitem div.orderInteraction div.box.target.horizontal{padding-top:10px}.o_assessmentitem div.orderInteraction div.box.target.horizontal ul{padding:10px 10px 0 10px}.o_assessmentitem div.orderInteraction div.box.horizontal ul li{float:left;width:auto;margin-right:10px;min-width:50px}.o_assessmentitem div.orderInteraction div.box span.info{color:#666;font-style:italic;font-size:smaller}.o_assessmentitem div.orderInteraction ul{list-style-type:none;margin:0;padding:0}.o_assessmentitem .hottext{position:relative;margin:-2px 0.15em -2px 0.15em;white-space:nowrap}.o_assessmentitem .hottext input{margin:0 3px 0 2px;position:absolute;top:0.1em;left:0.05em}.o_assessmentitem .hottext input+label{display:inline;padding:0 0.1em 0 1.2em;background:#f8f8f8;border:1px solid #e7e7e7;border-radius:2px;color:#333;font-weight:normal;white-space:normal}.o_assessmentitem .hottext input:checked+label{color:#333;background:#d9edf7;border:1px solid #bce8f1}.o_assessmentitem .gap{font-weight:bold;border:1px dashed #000}.o_assessmentitem .textEntryInteraction input{margin:-1px 2px;line-height:90%;vertical-align:middle;font-size:13.72px;line-height:1.5;border:1px solid #999;background:#fff;padding:1px 1px;color:#333;max-width:100%}.o_assessmentitem .textEntryInteraction input:valid,.o_assessmentitem .textEntryInteraction input:disabled{color:#333;-webkit-text-fill-color:#333;background:#d9edf7;border:1px solid #bce8f1}li.o_assessmentitem_order_item{padding:10px;margin-bottom:10px;border:2px dashed #999;border-radius:4px;background-color:#ffffff;background:#fcf8e3;list-style-type:none}li.o_assessmentitem_order_item:before,li.o_assessmentitem_order_item:after{content:" ";display:table}li.o_assessmentitem_order_item:after{clear:both}body>li.o_assessmentitem_order_item{display:block}.o_assessmentitem_wrapper .itemTitle{background:#f8f8f8;border:1px solid #e7e7e7;border-radius:4px 4px 0 0;margin-top:0;margin-bottom:0;padding:5px 10px;line-height:1.5em;position:relative}.o_assessmentitem_wrapper .itemTitle .o_qti_item_max_score{position:absolute;left:49%}.o_assessmentitem_wrapper .o_qti_item_body{min-height:200px;margin:0;padding:5px 10px;border-left:1px solid #e7e7e7;border-right:1px solid #e7e7e7;font-size:14px;line-height:1.8}.o_assessmentitem_wrapper .o_assessment_item_not_final.o_warning{margin:0}.o_assessmentitem_wrapper .modalFeedback h4:first-of-type,.o_assessmentitem_wrapper .modalFeedback .o_cal .fc-header-title h2:first-of-type,.o_cal .fc-header-title .o_assessmentitem_wrapper .modalFeedback h2:first-of-type{padding-left:10px;margin-top:0}.o_assessmentitem_wrapper .modalFeedback .o_info{margin-bottom:0;margin-top:0}.o_assessmentitem_wrapper .modalFeedback .o_info.o_correct_modal_feedback{margin-bottom:0;margin-top:0}.o_assessmentitem_wrapper .modalFeedback .o_info.o_incorrect_modal_feedback{margin-bottom:0;margin-top:0}.o_assessmentitem_wrapper .modalFeedback .o_info.o_empty_modal_feedback{margin-bottom:0;margin-top:0}.o_assessmentitem_wrapper .modalFeedback .o_togglebox_wrapper{margin-bottom:0;margin-top:0}.o_assessmentitem_wrapper .modalFeedback .o_togglebox_wrapper h4,.o_assessmentitem_wrapper .modalFeedback .o_togglebox_wrapper .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_assessmentitem_wrapper .modalFeedback .o_togglebox_wrapper h2{border-left:1px solid #e7e7e7;border-right:1px solid #e7e7e7;padding-bottom:5px;margin-bottom:0}.o_assessmentitem_wrapper ul.o_testpartnavigation,.o_qti_menu_buttonstyle ul.o_testpartnavigation{list-style:none;padding:0;margin:0}.o_assessmentitem_wrapper li.o_assessmentitem,.o_qti_menu_buttonstyle li.o_assessmentitem{margin-bottom:2px}.o_assessmentitem_wrapper .o_assessmentitem_status,.o_qti_menu_buttonstyle .o_assessmentitem_status{float:right;display:block;padding:0.3em;margin-left:1em;border-radius:0.3em;border-width:1px;font-size:0.8em;line-height:1.2em;color:#fff}.o_assessmentitem_wrapper .o_assessmentitem_status.ended,.o_qti_menu_buttonstyle .o_assessmentitem_status.ended{background-color:#5bc0de}.o_assessmentitem_wrapper .o_assessmentitem_status.invalid,.o_qti_menu_buttonstyle .o_assessmentitem_status.invalid{background-color:#d9534f}.o_assessmentitem_wrapper .o_assessmentitem_status.answered,.o_qti_menu_buttonstyle .o_assessmentitem_status.answered{background-color:#5cb85c}.o_assessmentitem_wrapper .o_assessmentitem_status.notAnswered,.o_qti_menu_buttonstyle .o_assessmentitem_status.notAnswered{background-color:#f0ad4e}.o_assessmentitem_wrapper .o_assessmentitem_status.notPresented,.o_qti_menu_buttonstyle .o_assessmentitem_status.notPresented{background-color:#ddd}.o_assessmentitem_wrapper .o_assessmentitem_status.review,.o_qti_menu_buttonstyle .o_assessmentitem_status.review{background-color:#5bc0de}.o_assessmentitem_wrapper .o_assessmentitem_status.reviewNotAllowed,.o_assessmentitem_wrapper .o_assessmentitem_status.reviewInvalid,.o_assessmentitem_wrapper .o_assessmentitem_status.reviewNotAnswered,.o_assessmentitem_wrapper .o_assessmentitem_status.reviewNotSeen,.o_qti_menu_buttonstyle .o_assessmentitem_status.reviewNotAllowed,.o_qti_menu_buttonstyle .o_assessmentitem_status.reviewInvalid,.o_qti_menu_buttonstyle .o_assessmentitem_status.reviewNotAnswered,.o_qti_menu_buttonstyle .o_assessmentitem_status.reviewNotSeen{background-color:#5bc0de;opacity:0.7}.o_assessmentitem_wrapper .o_assessmentitem_status i:before,.o_qti_menu_buttonstyle .o_assessmentitem_status i:before{color:#fff}.o_assessmentitem_controls{background:#f8f8f8;border:1px solid #e7e7e7;border-radius:0 0 4px 4px;margin-top:0;margin-bottom:16px;padding:5px 10px}.o_assessmentitem_controls button{margin-bottom:0}.o_assessmentitem_controls .o_sel_assessment_item_submit span:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";padding-right:0.5em}.o_assessmentitem_controls .o_sel_next_question span:after{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";padding-left:0.5em}.o_assessmentitem_controls .o_sel_question_menu span:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";padding-right:0.5em}.o_assessmentitem_controls .o_sel_end_testpart span:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";padding-right:0.5em}.o_assessmentitem_controls .o_sel_back_test_feedback span:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";padding-right:0.5em}.o_assessmentitem_controls .o_sel_show_solution span:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";padding-right:0.5em}.o_assessmentitem_controls .o_sel_solution_hide span:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";padding-right:0.5em}.o_assessmentitem_control_view_solution{background:#f8f8f8;border:1px solid #e7e7e7;margin:0;padding:5px 10px}.o_assessmentitem_scoring{background:#f8f8f8;border:1px solid #e7e7e7;border-bottom:0;border-radius:4px 4px 0 0;margin-top:0;margin-bottom:0;padding:5px 10px}.o_assessmentitem_scoring_buttons{background:#f8f8f8;border:1px solid #e7e7e7;border-top:0;border-radius:0 0 4px 4px;margin-top:0;margin-bottom:16px;padding:5px 10px}.o_assessmentitem_scoring_override_window{width:300px}.itemPrompt{margin:1.5em 0;font-style:italic;color:#666666}.o_qti_item_body{margin:1em 0}.o_sel_assessment_item_hint{margin-top:1em}.o_assessment_test_results .o_sel_assessment_item_hint{display:none}tr.choiceinteraction td.control{padding:0.5em}tr.choiceinteraction td.choiceInteraction{padding:0.5em}.choiceInteraction label{font-weight:normal}.choiceInteraction div.o_qti_item_choice_option_flow{display:inline-block;padding:.5em;border:1px solid transparent}.choiceInteraction div.o_qti_item_choice_option_flow label span{font-weight:normal}.choiceInteraction div.o_qti_item_choice_option_flow label span>p{display:inline-block}.choiceInteraction.choiceright table tr td.choiceInteraction{background-color:#e7e7e7;border-bottom:3px solid white}.matchInteraction.choiceright table tr td.o_qti_item_kprim_text{background-color:#e7e7e7;border-bottom:3px solid white}table.o_qti_item_kprim td.o_qti_item_kprim_input_correct{background-color:#eaf6ea}table.o_qti_item_kprim td.o_qti_item_kprim_input_wrong{background-color:#fdf7f7}.matchInteraction input[type='text']{display:inline;width:auto}.matchInteraction div.bar_green{background-color:#5cb85c}.matchInteraction div.bar_red{background-color:#d9534f}.source-left,.target-left,.source-right,.target-right{width:50%;float:left;position:relative;padding:0;margin-top:5px}.o_match_dnd_sources{padding:10px 10px 0 10px;min-height:60px;border:1px solid #e7e7e7;border-radius:4px;background:#f8f8f8}.o_match_dnd_sources.oo-accepted{border-color:#1f7e9a}.o_match_dnd_source{padding:10px;margin-bottom:10px;border:2px dashed #999;border-radius:4px;background-color:#ffffff;background:#fcf8e3;cursor:move;cursor:grab;cursor:-moz-grab;cursor:-webkit-grab}.o_match_dnd_source:before,.o_match_dnd_source:after{content:" ";display:table}.o_match_dnd_source:after{clear:both}.o_match_dnd_source.oo-selected{border:2px dashed #f0ad4e;background:#fae3c4}.o_match_dnd_source.oo-drag{border:2px dashed #f0ad4e !important}.source-bottom .o_match_dnd_source,.source-top .o_match_dnd_source{margin:0 0 10px 0}.o_match_dnd_targets .oo-accepted{border:2px solid #1f7e9a;border-radius:4px}.o_match_dnd_target{padding:10px 10px 0 10px;margin:0 0 10px 10px;border:2px solid #5bc0de;border-radius:4px;background:#d9edf7}.o_match_dnd_target:before,.o_match_dnd_target:after{content:" ";display:table}.o_match_dnd_target:after{clear:both}.o_match_dnd_target .o_match_dnd_target_drop_zone{margin:0;padding:5px 0 0 15px;min-height:30px}.o_match_dnd_target .o_match_dnd_target_drop_zone .o_match_dnd_source{border:2px dashed #777}.target-bottom .o_match_dnd_target,.target-top .o_match_dnd_target{margin:0 0 10px 0}.target-bottom .o_match_dnd_target .o_match_dnd_target_drop_zone,.target-top .o_match_dnd_target .o_match_dnd_target_drop_zone{padding-left:0px}.target-bottom .o_match_dnd_target .o_match_dnd_target_drop_zone .o_match_dnd_source,.target-top .o_match_dnd_target .o_match_dnd_target_drop_zone .o_match_dnd_source{padding-left:15px}.table.o_match_true_false_edit th.o_sel_match_target_0,.table.o_match_true_false_edit th.o_sel_match_target_1,.table.o_match_true_false_edit th.o_sel_match_target_2{width:12%}.match_true_false input[type="checkbox"]{-webkit-appearance:radio;-moz-appearance:radio;-ms-appearance:radio;appearance:radio}.match_true_false .table>tbody>tr>td.o_match_true_false_unanswered,.match_true_false .table>tbody>tr>td.o_match_true_false_right,.match_true_false .table>tbody>tr>td.o_match_true_false_wrong{vertical-align:middle;width:11%}.match_true_false th.o_match_true_false_unanswered,.match_true_false th.o_match_true_false_right,.match_true_false th.o_match_true_false_wrong{width:11%}.match_true_false td.o_match_true_false_answer,.match_true_false th.o_match_true_false_answer{width:67%}.match_true_false td.o_match_true_false_unanswered{background-color:#fbfbfb}.match_true_false td.o_match_true_false_right{background-color:#eaf6ea}.match_true_false td.o_match_true_false_wrong{background-color:#fdf7f7}.o_assessmentitem .mathEntryInteraction{border:1px solid #ddedfc;background-color:#edf1f6;background:linear-gradient(to top, #edf1f6 0%, #f6f9fb 100%);border-radius:0.4em;padding:1em;margin:0.5em 0}.o_assessmentitem .mathEntryInteraction .inputPanel{line-height:1em;text-align:left}.o_assessmentitem .mathEntryInteraction .inputPanel input{margin:0;padding:0}.o_assessmentitem .mathEntryInteraction .previewPanel{text-align:center}.o_assessmentitem .mathEntryInteraction.horizontal{min-height:5em;width:40em}.o_assessmentitem .mathEntryInteraction.horizontal .inputPanel{width:45%;float:left;margin:2em 0}.o_assessmentitem .mathEntryInteraction.horizontal .previewPanel{width:50%;margin-left:40%}.o_assessmentitem .mathEntryInteraction.vertical{min-height:6em}.o_assessmentitem .mathEntryInteraction.vertical .inputPanel{padding:0 5em}.o_assessmentitem .mathEntryInteraction.vertical .inputPanel:before{content:'Input Maths: '}.o_assessmentitem .mathEntryInteraction.vertical .previewPanel{margin-top:2em;min-height:4em}.o_assessmentitem div.upConversionAjaxControlMessage{width:auto;text-align:center;display:inline;padding:0.5em 0 0.5em 20px}.o_assessmentitem div.success{background:#5cb85c}.o_assessmentitem div.failure{background-color:#f0ad4e}.o_assessmentitem div.error{background-color:#d9534f}.o_assessmentitem div.upConversionAjaxControlPreview{margin:0.5em 0;font-size:110%}.o_assessmentitem table.inputHelp{border-collapse:collapse;width:100%;font-size:90%}.o_assessmentitem table.inputHelp th{border:1px solid #999999;padding:0.2em 0.5em;background-color:#cad8e5}.o_assessmentitem table.inputHelp td{color:#999999;border:1px solid #999999;padding:0.2em 0.5em}.o_assessmentitem table.inputHelp kbd{color:black;font-size:100%;line-height:100%}.o_assessmentitem table.inputHelp .longComma{margin-right:0.5em}.o_togglebox_wrapper #modal-correct-solution div.o_togglebox_content{background-color:#fcf8e3;border-color:#8a6d3b}.o_candidatecomment{padding:0;margin:2em 0 1em 0;border:none}.o_candidatecomment legend{font-size:110%;font-weight:bold;color:#777;margin-bottom:0;border-bottom:0}.o_candidatecomment div.o_item_container_help{margin:0;padding:0}.o_candidatecomment textarea{display:block;color:#777}.o_qti_menu_menustyle ul.o_testpartnavigation{list-style:none;padding:0;margin:0}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentsection{border:1px solid #e7e7e7;border-radius:4px;background:#f8f8f8;padding:0 1em 0.5em 1em;margin:0 0 0.5em 0}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentsection header{margin:0 0 1em 0}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentsection header div.rubric{font-style:italic}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentsection ul.o_testpartnavigation_inner{list-style:none;padding:0;margin:0}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem{padding:0.1em 0}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem a{color:#777}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem a:hover,.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem a:focus{color:#333}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem.active a{color:#337ab7;font-weight:bold}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem.active a:hover,.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem.active a:focus{color:#23527c;background-color:#eee}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem span{vertical-align:middle}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem .o_assessmentitem_status{display:inline;position:relative;left:-0.3em;background:transparent;border:0}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem .o_assessmentitem_status span{display:none}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem .o_assessmentitem_attempts{float:right;display:block;padding:0.3em;border-radius:2px;background-color:#fafafa;color:#777;font-size:0.7em}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem .o_assessmentitem_attempts.o_assessmentitem_attempts_limited{color:#f0ad4e}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem .o_assessmentitem_attempts.o_assessmentitem_attempts_nomore{color:#5bc0de}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem .o_assessmentitem_marks{float:right;display:inline-block;font-size:0.8em;position:relative;top:0.3em;right:-0.5em}.o_qti_menu_menustyle ul.o_testpartnavigation .o_assessmentitem .questionTitle{margin-right:1em}.testFeedback h1:first-of-type{margin-top:0}ul.testPartDrilldown{list-style:none;padding:0;margin:0}ul.testPartDrilldown li.o_assessmentsection{border:1px solid #e7e7e7;border-radius:4px;background:#f8f8f8;padding:0 1em 0.5em 1em}ul.testPartDrilldown li.o_assessmentsection header{margin:0 0 1em 0}ul.testPartDrilldown li.o_assessmentsection header div.rubric{font-style:italic}ul.testPartDrilldown li.o_assessmentsection ul.testPartDrilldownInner{list-style:none;padding:0;margin:0}ul.testPartDrilldown li.currentItem{border:1px solid #e7e7e7;border-radius:0.5em;padding:0 1em;margin-top:1em}.testItemControl{margin-top:0.5em}.o_qti_statistics_answer{background:#F5F5F5;padding:1px 2px;width:90%}.o_qti_statistics_answer p{display:inline-block}.o_assessment_test_results .o_qti_assessment_title{border-bottom:1px solid #ddd}.o_assessment_test_results table th{width:40%}.o_assessment_test_results .o_qti_sectionsummary .o_qti_section{text-align:center}.o_assessment_test_results .o_qti_sectionsummary .o_qti_section .o_qti_section_sublisting{padding:0 10%;min-height:3em}.o_assessment_test_results .o_qti_sections .o_qti_section{margin-top:40px}.o_assessment_test_results .o_qti_sections .o_qti_section h3{margin-bottom:20px}.o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_id{display:none}.o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_comment{margin:0;padding:5px 10px 10px 5px;border-top:1px solid #ddd;broder-bottom:1px solid #ddd}.o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_comment h4,.o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_comment .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_comment h2{font-size:100%;font-weight:bold;color:inherit}.o_assessment_test_results .o_qti_to_overview{text-align:right}.o_sel_assessment_item_feedbacks{min-height:250px}.o_alternative_question_types h4 select,.o_alternative_question_types .o_cal .fc-header-title h2 select,.o_cal .fc-header-title .o_alternative_question_types h2 select{display:inline-block;width:auto}#o_dev_tool #o_dev_tool_mode{width:1em;height:1em;float:left;border:1px solid #000;margin-right:5px}a.o_dev{position:absolute;left:0;top:0;z-index:4000;background:#f0ad4e;border:1px solid #d59645;border-top:none;border-left:none;border-radius:0 0 4px 0;color:#fff}a.o_dev:hover{color:#d9534f}.o_dev_w{margin:1px}.o_dev_w .o_dev_h{color:#000;font-size:8px;line-height:10px;margin:0}.o_dev_w .o_dev_h span{background:#f4c37d;border:1px solid #f0ad4e;border-bottom:0}.o_dev_w .o_dev_c{position:relative;border:1px dotted #eee}.o_dev_w .o_dev_c .o_dev_i{position:absolute;top:0px;left:24px;height:auto;width:auto;padding:5px;border:1px solid black;display:none;margin:0px;z-index:999;font-size:11px;background-color:#BBF}.o_dev_w.o_dev_m>.o_dev_c{border:1px solid #f0ad4e;margin:0px;background-color:#f8e9d4}.o_wikimod_nav .o_noti{margin:0}.o_wikimod_editform_wrapper{margin-top:30px}.o_wiki-file-deleted{text-decoration:line-through}div.o_wiki_wrapper a.wikiimg{text-decoration:none;color:inherit;font-weight:inherit}div.o_wiki_wrapper div.imgcaption{padding:0.3em 0em 0.2em 0.3em}div.o_wiki_wrapper div.imgleft{clear:left;float:left;margin:0.3em 0.3em 0.3em 0em}div.o_wiki_wrapper div.imgright{clear:right;float:right;margin:0.3em 0em 0.3em 0.3em}div.o_wiki_wrapper div.imgcenter{clear:both;overflow:hidden;text-align:center;margin:0.3em 0em 0.3em 0em}div.o_wiki_wrapper div.imgthumb{border:1px solid #bbbbbb;padding:0.3em}div.o_wiki_wrapper table.gallery{border:1px solid #ccc;margin:2px;padding:2px;background-color:white}div.o_wiki_wrapper table.gallery tr{vertical-align:middle}div.o_wiki_wrapper table.gallery td{background-color:#f9f9f9;border:solid 2px white;text-align:center;vertical-align:middle;width:150px}div.o_wiki_wrapper img.gallery{border:1px solid #bbbbbb;padding:0.3em}div.o_wiki_wrapper a.edit{font-style:italic;color:red}div.o_wiki_wrapper a.externallink:before{padding-right:2px}div.o_wiki_wrapper a.externallink:before:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;padding-right:0.5em;content:""}.o_ep_icon_map:before{content:""}.o_ep_icon_collection:before{content:""}.o_ep_icon_page:before{content:""}.o_ep_icon_struct:before{content:""}.o_ep_icon_liveblog:before{content:""}.o_artefact_closed:before{content:""}.o_portfolio_toc .o_ep_link{float:right;margin-right:0px}.o_portfolio_toc .o_ep_commentlink{float:right;margin-right:10%}.o_portfolio_toc li.level1{font-size:1.2em;margin:1.2em 0 0.2em 0;border-bottom:1px solid #ddd}.o_portfolio_toc li.level2{padding-left:20px;font-size:1.1em;border-bottom:1px dotted #ddd}.o_portfolio_toc li.level3{padding-left:40px}.o_eportfolio_page .o_eportfolio_structure>h5{border-bottom:1px solid #ddd;margin-top:1.2em}.o_eportfolio_maps .panel{font-family:'Century Gothic', 'Apple Gothic', sans-serif;box-shadow:3px 3px 4px rgba(20,20,20,0.4)}.o_eportfolio_maps .panel-heading{padding:5px 10px}.o_eportfolio_maps h4,.o_eportfolio_maps .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps h2{padding:11px 15px;background:rgba(255,255,230,0.7) none;border-radius:6px}.o_eportfolio_maps .table>tbody>tr>td{border-top:none}.o_eportfolio_maps .panel-body{border-top:none}.o_eportfolio_maps .panel>.panel-body+.table{border-top:none}.panel-footer .o_ep_options{display:inline-block}.o_eportfolio_map{padding:0 20px 2px 3px;border-radius:6px 10px 6px 0;font-family:'Century Gothic', 'Apple Gothic', sans-serif}.o_map_header{padding-left:5px}.o_eportfolio_map ul.nav-tabs li:not(.active) a{background-color:rgba(240,240,240,0.7);border-radius:4px 4px 0 0}.o_eportfolio_edit{border-radius:4px 4px 0 0}.o_ep_actualpage,.o_eportfolio_edit{padding:15px;background-color:#fff}.o_ep_content{margin-top:15px}.o_ep_filter .o_date.form-inline .form-group,.o_ep_filter .o_date.o_navbar-form .form-group{margin-left:8px}.o_eportfolio_share_policy_wrapper{border:1px solid #ddd;border-radius:4px}.o_eportfolio_share_header{padding:10px 15px;border-bottom:1px solid #ddd;background-color:#f5f5f5}.o_eportfolio_share_policy{padding:10px 15px}.o_map-default{background:#fafafa;background:#fafafa -webkit-gradient(linear, 37% 20%, 53% 100%, from(#fafafa), to(#efefef));background:#fafafa -moz-linear-gradient(43% 71% 101deg, #efefef, #fafafa);background:#fafafa -o-linear-gradient(#fafafa, #efefef);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#fafafa', EndColorStr='#efefef');border:1px solid #efefef;border-left:3px solid rgba(188,188,188,0.8)}.o_eportfolio_maps .o_map-default h4,.o_eportfolio_maps .o_map-default .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-default h2{color:#444;background:none}.o_eportfolio_maps .o_map-default .panel-body,.o_eportfolio_maps .o_map-default td,.o_eportfolio_maps .o_map-default a{color:#000}.o_map-comic{background:#a2c3e8 none;font-family:'Comic Sans MS', 'Comic Sans', fantasy;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_map-leather{background-color:#957352;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(248,248,248,0.7)), color-stop(100%, rgba(193,193,193,0.5))),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-webkit-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-moz-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-ms-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-o-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");font-family:Palatino, Georgia, serif;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-leather h4,.o_eportfolio_maps .o_map-leather .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-leather h2{background:rgba(243,230,225,0.3) none}.o_eportfolio_maps .o_map-leather .panel-body,.o_eportfolio_maps .o_map-leather td{color:#333}.o_eportfolio_maps .o_map-leather a{color:#fad9a4}.o_eportfolio_map.o_map-leather .o_map_header h4,.o_eportfolio_map.o_map-leather .o_map_header .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_map.o_map-leather .o_map_header h2,.o_eportfolio_map.o_map-leather .o_map_header p,.o_eportfolio_map.o_map-leather .o_map_header a,.o_eportfolio_map.o_map-leather .o_map_header span,.o_eportfolio_map.o_map-leather .o_map_header label{color:#333}.o_map-epmst-green{background-color:#ECF69A;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-green h4,.o_eportfolio_maps .o_map-epmst-green .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green h2{color:#444}.o_eportfolio_maps .o_map-epmst-green .panel-body,.o_eportfolio_maps .o_map-epmst-green td,.o_eportfolio_maps .o_map-epmst-green a{color:#000}.o_map-epmst-green2{background:#99E44D;background:#99E44D -webkit-gradient(linear, 37% 20%, 53% 100%, from(#99E44D), to(#CBF1A5));background:#99E44D -moz-linear-gradient(43% 71% 101deg, #CBF1A5, #99E44D);background:#99E44D -o-linear-gradient(#99E44D, #CBF1A5);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#99E44D', EndColorStr='#CBF1A5');border:1px solid #bbb;border-left:3px solid rgba(136,136,136,0.8)}.o_eportfolio_maps .o_map-epmst-green2 h4,.o_eportfolio_maps .o_map-epmst-green2 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green2 h2{color:#555}.o_eportfolio_maps .o_map-epmst-green2 .panel-body,.o_eportfolio_maps .o_map-epmst-green2 td,.o_eportfolio_maps .o_map-epmst-green2 a{color:#000}.o_map-epmst-green3{background:#DFF0C1;background:#DFF0C1 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#DFF0C1), to(#A0D346));background:#DFF0C1 -moz-linear-gradient(43% 71% 101deg, #A0D346, #DFF0C1);background:#DFF0C1 -o-linear-gradient(#DFF0C1, #A0D346);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#DFF0C1', EndColorStr='#A0D346');border:1px solid #bbb;border-left:3px solid rgba(136,136,136,0.8)}.o_eportfolio_maps .o_map-epmst-green3 h4,.o_eportfolio_maps .o_map-epmst-green3 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green3 h2{color:#555}.o_eportfolio_maps .o_map-epmst-green3 .panel-body,.o_eportfolio_maps .o_map-epmst-green3 td,.o_eportfolio_maps .o_map-epmst-green3 a{color:#000}.o_map-epmst-green4{background-color:#D7DBB5;border:1px solid #bbb;border-left:3px solid rgba(136,136,136,0.8)}.o_eportfolio_maps .o_map-epmst-green4 h4,.o_eportfolio_maps .o_map-epmst-green4 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green4 h2{color:#555}.o_eportfolio_maps .o_map-epmst-green4 .panel-body,.o_eportfolio_maps .o_map-epmst-green4 td,.o_eportfolio_maps .o_map-epmst-green4 a{color:#000}.o_map-epmst-red{background:#FFBA71;background:#FFBA71 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#FFBA71), to(#FFBA99));background:#FFBA71 -moz-linear-gradient(43% 71% 101deg, #FFBA99, #FFBA71);background:#FFBA71 -o-linear-gradient(#FFBA71, #FFBA99);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#FFBA71', EndColorStr='#FFBA99');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red h4,.o_eportfolio_maps .o_map-epmst-red .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red h2{color:#444}.o_eportfolio_maps .o_map-epmst-red .panel-body,.o_eportfolio_maps .o_map-epmst-red td,.o_eportfolio_maps .o_map-epmst-red a{color:#000}.o_map-epmst-red2{background:#FF9772;background:#FF9772 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#FF9772), to(#FF9780));background:#FF9772 -moz-linear-gradient(43% 71% 101deg, #FF9780, #FF9772);background:#FF9772 -o-linear-gradient(#FF9772, #FF9780);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#FF9772', EndColorStr='#FF9780');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red2 h4,.o_eportfolio_maps .o_map-epmst-red2 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red2 h2{color:#444}.o_eportfolio_maps .o_map-epmst-red2 .panel-body,.o_eportfolio_maps .o_map-epmst-red2 td,.o_eportfolio_maps .o_map-epmst-red2 a{color:#000}.o_map-epmst-red3{background:#E8AFBB;background:#E8AFBB -webkit-gradient(linear, 37% 20%, 53% 100%, from(#E8AFBB), to(#E8AFA0));background:#E8AFBB -moz-linear-gradient(43% 71% 101deg, #E8AFA0, #E8AFBB);background:#E8AFBB -o-linear-gradient(#E8AFBB, #E8AFA0);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#E8AFBB', EndColorStr='#E8AFA0');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red3 h4,.o_eportfolio_maps .o_map-epmst-red3 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red3 h2{color:#444}.o_eportfolio_maps .o_map-epmst-red3 .panel-body,.o_eportfolio_maps .o_map-epmst-red3 td,.o_eportfolio_maps .o_map-epmst-red3 a{color:#000}.o_map-epmst-red4{background:#FFA800;background:#FFA800 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#FFA800), to(#FFAF00));background:#FFA800 -moz-linear-gradient(43% 71% 101deg, #FFAF00, #FFA800);background:#FFA800 -o-linear-gradient(#FFA800, #FFAF00);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#FFA800', EndColorStr='#FFAF00');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red4 h4,.o_eportfolio_maps .o_map-epmst-red4 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red4 h2{color:#444}.o_eportfolio_maps .o_map-epmst-red4 .panel-body,.o_eportfolio_maps .o_map-epmst-red4 td,.o_eportfolio_maps .o_map-epmst-red4 a{color:#000}.o_map-epmst-blue{background:#00D2F8;background:#00D2F8 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#00D2F8), to(#4A9EAD));background:#00D2F8 -moz-linear-gradient(43% 71% 101deg, #4A9EAD, #00D2F8);background:#00D2F8 -o-linear-gradient(#00D2F8, #4A9EAD);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#00D2F8', EndColorStr='#4A9EAD');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue h4,.o_eportfolio_maps .o_map-epmst-blue .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue .panel-body,.o_eportfolio_maps .o_map-epmst-blue td,.o_eportfolio_maps .o_map-epmst-blue a{color:#000}.o_map-epmst-blue2{background-color:#C4F6FF;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue2 h4,.o_eportfolio_maps .o_map-epmst-blue2 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue2 h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue2 .panel-body,.o_eportfolio_maps .o_map-epmst-blue2 td,.o_eportfolio_maps .o_map-epmst-blue2 a{color:#000}.o_map-epmst-blue3{background-color:#B3E2F7;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue3{box-shadow:3px 3px 4px rgba(20,20,20,0.4)}.o_eportfolio_maps .o_map-epmst-blue3 h4,.o_eportfolio_maps .o_map-epmst-blue3 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue3 h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue3 .panel-body,.o_eportfolio_maps .o_map-epmst-blue3 td,.o_eportfolio_maps .o_map-epmst-blue3 a{color:#000}.o_map-epmst-blue4{background:#DEE7F7;background:#DEE7F7 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#DEE7F7), to(#C1E9FD));background:#DEE7F7 -moz-linear-gradient(43% 71% 101deg, #C1E9FD, #DEE7F7);background:#DEE7F7 -o-linear-gradient(#DEE7F7, #C1E9FD);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#DEE7F7', EndColorStr='#C1E9FD');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue4 h4,.o_eportfolio_maps .o_map-epmst-blue4 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue4 h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue4 .panel-body,.o_eportfolio_maps .o_map-epmst-blue4 td,.o_eportfolio_maps .o_map-epmst-blue4 a{color:#000}.o_portfolio div#o_main_toolbar.o_toolbar{margin-top:0px}.o_section_lead,.o_page_lead,.o_assignment_lead{padding:10px 10px;margin-bottom:10px;background-color:#f2f2f2;border-radius:3px;border:1px #d9d9d9 solid}.o_section_ended .o_section_lead{border-color:#eba5a3;background-color:#f4cecd}.o_media.o_media_right,.o_media.o_media_right_large{float:right;margin-left:2em;margin-bottom:2em}.o_media.o_media_left,.o_media.o_media_left_large{float:left;margin-right:2em;margin-bottom:2em}.o_media.o_media_left,.o_media.o_media_right{max-height:200px;max-width:50%}.o_media.o_media_left img,.o_media.o_media_right img{max-height:200px}.o_media.o_media_right_large,.o_media.o_media_left_large{max-height:300px;max-width:75%}.o_media.o_media_right_large img,.o_media.o_media_left_large img{max-height:300px}.o_media img{border-radius:3px;border:1px #d9d9d9 solid;background:#fff;height:auto;width:auto}@media (max-width: 767px){.o_page_lead .o_media.o_media_right,.o_page_lead .o_media.o_media_right_large{margin-left:1em;margin-bottom:1em}.o_page_lead .o_media.o_media_left,.o_page_lead .o_media.o_media_left_large{margin-right:1em;margin-bottom:1em}.o_page_lead .o_media.o_media_left,.o_page_lead .o_media.o_media_right{max-height:120px;max-width:30%}.o_page_lead .o_media.o_media_left img,.o_page_lead .o_media.o_media_right img{max-height:120px}.o_page_lead .o_media.o_media_right_large,.o_page_lead .o_media.o_media_left_large{max-height:180px;max-width:50%}.o_page_lead .o_media.o_media_right_large img,.o_page_lead .o_media.o_media_left_large img{max-height:180px}}.o_portfolio_page .o_block_imagebg{border:1px #d9d9d9 solid}.o_page_lead{padding:20px}.o_page_lead h2{margin-bottom:5px}.o_page_lead .o_portfolio_page_meta{margin-bottom:5px}.o_page_lead .o_page_summary{font-size:18px}.o_page_lead .o_media.o_desc_empty{max-height:300px;text-align:center}.o_page_lead .o_media.o_desc_empty img{max-height:300px}.o_page_lead .o_portfolio_status_block{border-top:1px solid #d9d9d9;padding-top:1em;margin-bottom:-1em}.o_page_lead .o_portfolio_status{display:inline-block;padding-right:2em}.o_page_lead.o_block_imagebg .o_portfolio_status{padding:2px;background-color:rgba(255,255,255,0.8)}.o_portfolio_status_block p.o_section_ended{font-size:120%}.o_page_assignment{font-size:12px}.o_page_assignment.o_togglebox_wrapper div.o_togglebox_content{margin:10px 0 20px 0;padding:20px;border-left:3px solid #d9534f;background-color:#f2dede}.o_page_assignment .o_page_assignement_info{position:relative;left:-1em}.o_page_export .o_page_assignment .o_opener,.o_binder_export .o_page_assignment .o_opener{visibility:hidden}.o_page_export .o_page_assignment .o_closer,.o_binder_export .o_page_assignment .o_closer{display:none}.o_portfolio_listing.o_rendertype_custom .o_table_body.container-fluid{padding-right:0px;padding-left:0px}.o_portfolio_listing.o_rendertype_custom .o_portfolio_entry{position:relative;display:inline-block;height:230px;width:400px;vertical-align:top;margin-right:10px}.o_portfolio_listing.o_rendertype_custom .o_portfolio_entry ul{padding-left:2em}.o_portfolio_listing.o_rendertype_custom .panel-imagebg .panel-body ul{margin:0;padding:0;list-style-type:none}.o_portfolio_listing.o_rendertype_custom .panel-imagebg .panel-body ul li{padding:2px}.o_binder.o_portfolio_assignments .panel-heading,.o_binder.o_portfolio_assignments .panel-body{border-left:3px solid #d9534f}.panel-default.o_portfolio_assignments .panel-heading,.panel-default.o_portfolio_assignments .panel-body{border-left:3px solid #d9534f}.o_portfolio_page .o_portfolio_assignments .o_portfolio_page_body{border-left:3px solid #d9534f}.o_portfolio_page .o_portfolio_assignments .o_portfolio_page_body .o_portfolio_page_meta_wrapper,.o_portfolio_page .o_portfolio_assignments .o_portfolio_page_body .o_portfolio_page_summary{padding-left:10px}.o_portfolio_page_summary .o_media.o_media_right,.o_portfolio_page_summary .o_media.o_media_right_large{margin-left:1em;margin-bottom:1em}.o_portfolio_page_summary .o_media.o_media_left,.o_portfolio_page_summary .o_media.o_media_left_large{margin-right:1em;margin-bottom:1em}.o_portfolio_page_summary .o_media.o_media_left,.o_portfolio_page_summary .o_media.o_media_right{max-height:150px}.o_portfolio_page_summary .o_media.o_media_left img,.o_portfolio_page_summary .o_media.o_media_right img{max-height:150px}.o_portfolio_page_summary .o_media.o_media_right_large,.o_portfolio_page_summary .o_media.o_media_left_large{max-height:230px}.o_portfolio_page_summary .o_media.o_media_right_large img,.o_portfolio_page_summary .o_media.o_media_left_large img{max-height:230px}.o_portfolio_categories .tag{font-size:80%;font-weight:normal}.o_portfolio_categories div,.o_portfolio_categories form{display:inline-block}.o_portfolio_categories_edit .bootstrap-tagsinput{margin-bottom:0;padding:0px 4px}.o_portfolio_last_modified+.o_portfolio_categories,.o_portfolio_page_meta+.o_portfolio_categories{margin-left:1em}.o_rendertype_classic .o_pf_page,.o_rendertype_classic .o_pf_assignment{padding-left:1em}.o_portfolio_timeline .o_timeline_up{text-align:center}.o_portfolio_timeline .o_timeline_down{text-align:center}.o_portfolio_timeline .axis path,.o_portfolio_timeline .axis line{fill:none;stroke:#000;shape-rendering:crispEdges}.o_portfolio_timeline .x.axis line,.o_portfolio_timeline .x.axis path{display:none}.o_portfolio_timeline path.o_timeline_curve{fill:none;stroke:#ccc;shape-rendering:crispEdges}.o_portfolio_timeline .y.axis .tick line,.o_portfolio_timeline .y.axis path.domain{stroke:#ddd}.o_portfolio_timeline text{fill:#888;stroke:none;font-size:10px}.o_portfolio_timeline .dot.o_pf_status_draft{fill:#f0ad4e}.o_portfolio_timeline .dot.o_pf_status_published{fill:#337ab7}.o_portfolio_timeline .dot.o_pf_status_inrevision{fill:#d9534f}.o_portfolio_timeline .dot.o_pf_status_closed{fill:#5cb85c}.o_portfolio_timeline .dot.o_pf_status_deleted{fill:#000}.o_pf_comments{margin-top:3em}.o_pf_content .o_cit,.o_pf_content .o_text,.o_pf_content .o_file{background-color:#f8f8f8;padding:10px;border-radius:10px}.o_pf_content .o_forum{border:1px #f8f8f8 solid;padding:10px;border-radius:10px}.o_pf_content .o_image,.o_pf_content .o_video{padding:10px;width:100%}.o_pf_content .o_image img,.o_pf_content .o_video img{border:1px #f8f8f8 solid;border-radius:10px}.o_pf_content .o_image .o_artefact_metadata,.o_pf_content .o_video .o_artefact_metadata{text-align:left}.o_pf_content .o_efficiencystatement,.o_pf_content .o_feed,.o_pf_content .o_forum,.o_pf_content .o_wiki{background-color:#f8f8f8;padding:10px;border-radius:10px}.o_pf_content .o_efficiencystatement h3,.o_pf_content .o_efficiencystatement .h3,.o_pf_content .o_feed h3,.o_pf_content .o_feed .h3,.o_pf_content .o_forum h3,.o_pf_content .o_forum .h3,.o_pf_content .o_wiki h3,.o_pf_content .o_wiki .h3{font-size:14px}.o_pf_content .o_efficiencystatement .row,.o_pf_content .o_feed .row,.o_pf_content .o_forum .row,.o_pf_content .o_wiki .row{margin:0}.o_pf_content .o_efficiencystatement .o_block_with_datecomp,.o_pf_content .o_feed .o_block_with_datecomp,.o_pf_content .o_forum .o_block_with_datecomp,.o_pf_content .o_wiki .o_block_with_datecomp{margin-top:0.5em;margin-bottom:0}.o_pf_video_placeholder{background-color:#f8f8f8;border:1px solid #f8f8f8;border-radius:10px;display:table;min-width:400px;text-align:center;padding:40px 10px}.o_pf_video_placeholder i{display:table-cell;vertical-align:middle}.o_pf_content_editor .o_toolbar{border:none}.o_pf_content_editor .o_page_part{border:2px solid transparent}.o_pf_content_editor .o_page_part:hover{border:2px dotted #78acd9}.o_pf_content_editor .o_page_fragment_edit{position:relative}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_above{height:25px;width:100%;background:#78acd9;position:absolute;z-index:3;left:0;top:-25px;box-shadow:3px -8px 10px 0px rgba(0,0,0,0.2)}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_above .o_page_add_above{position:absolute;left:0;top:-25px;height:25px;border-left:2px dashed #78acd9;border-top:2px dashed #78acd9;border-right:2px dashed #78acd9;border-radius:10px 10px 0 0;box-shadow:0 -5px 10px 0px rgba(0,0,0,0.2);background:#fff}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_above .o_sel_add_element_above{display:inline-block;padding:5px 5px 0 5px}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_above .o_page_others_above{padding-right:25px;line-height:25px;vertical-align:middle}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_above .o_page_others_above .o_page_type{display:none}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_above .o_page_others_above a{float:right;color:#fff;padding-right:1em}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_above .o_page_others_above a:hover{color:#e6e6e6}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_dd{position:absolute;z-index:4;top:0;right:0;width:25px;height:100%;background:#78acd9}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_dd a{position:absolute;display:inline-block;width:25px;height:25px;line-height:25px;text-align:center;vertical-align:middle;color:#fff}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_dd a:hover{color:#e6e6e6}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_dd a.o_disabled{color:rgba(255,255,255,0.5) !important}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_dd a.o_disabled:hover{color:rgba(255,255,255,0.5) !important}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_dd a.o_sel_move_up_element{z-index:4;top:-25px}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_dd a.o_sel_move_down_element{bottom:0}.o_pf_content_editor .o_page_fragment_edit .o_page_part.o_page_edit{padding-right:25px;border:2px solid #78acd9;box-shadow:5px 5px 10px 0px rgba(0,0,0,0.2)}.o_pf_content_editor .o_page_fragment_edit .o_page_part.o_page_edit:hover{border:2px solid #78acd9}.o_pf_content_editor .o_page_fragment_edit .o_page_part.o_page_edit .o_page_edit_toolbar{position:absolute;z-index:5;left:5px;top:-25px;display:inline-block;height:25px;line-height:25px;vertical-align:middle}.o_pf_content_editor .o_page_fragment_edit .o_page_part.o_page_edit .o_page_edit_toolbar a{color:#fff}.o_pf_content_editor .o_page_fragment_edit .o_page_part.o_page_edit .o_page_edit_toolbar a:hover{color:#e6e6e6}.o_pf_content_editor .o_page_fragment_edit .o_page_part.o_page_edit .o_page_edit_toolbar a.o_disabled{color:rgba(255,255,255,0.5) !important}.o_pf_content_editor .o_page_fragment_edit .o_page_part.o_page_edit .o_page_edit_toolbar a.o_disabled:hover{color:rgba(255,255,255,0.5) !important}.o_pf_content_editor .o_page_fragment_edit .o_page_part.o_page_edit .o_page_edit_title .o_page_edit_toolbar li{font-weight:bold}.o_pf_content_editor .o_page_fragment_edit .o_page_part.o_page_edit .o_richtext_mce textarea{border:0}.o_pf_content_editor .o_page_fragment_edit .o_page_add_below{position:absolute;z-index:3;left:0;bottom:-25px;height:25px;border-left:2px dashed #78acd9;border-bottom:2px dashed #78acd9;border-right:2px dashed #78acd9;border-radius:0 0 10px 10px;box-shadow:3px 8px 10px 0px rgba(0,0,0,0.2);background:#fff}.o_pf_content_editor .o_page_fragment_edit .o_page_add_below .o_sel_add_element_below{display:inline-block;padding:0 5px 5px 5px}.o_pf_content_editor .o_pf_add_contents{margin-top:30px}.o_portfolio_add_callout a span{display:none}.o_portfolio_add_callout ul.list-inline{margin-bottom:0}.o_portfolio_image_options{clear:both;width:300px;padding:5px}.o_binder_page_listing .o_portfolio_page_links{background-color:#f8f8f8;border-radius:4px}.o_binder_page_listing .o_portfolio_page_links .o_portfolio_comment{float:right}.o_portfolio_toc{padding-bottom:6em}.o_portfolio_toc .o_portfolio_section_meta{font-size:80%;color:#777;position:relative;top:-15px}.o_portfolio_toc .o_section{position:relative}.o_portfolio_toc .o_section .o_header_with_buttons h4,.o_portfolio_toc .o_section .o_header_with_buttons .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_portfolio_toc .o_section .o_header_with_buttons h2{padding-right:0.5em}.o_portfolio_toc .o_section_actions{position:absolute;top:0;right:0}.o_portfolio_toc .o_section_actions .o_section_move_up_and_down{display:inline-block}.o_portfolio_toc .o_section_actions .o_section_dropdown{display:inline-block;position:relative;top:-0.5em;padding-left:0.5em}.o_portfolio_toc ul>li>ul{padding-left:1.5em}.o_portfolio div span.badge{padding:3px 7px}.o_portfolio div .o_portfolio_entry_draft{background-color:#f0ad4e}.o_portfolio div .o_portfolio_published{background-color:#337ab7}.o_portfolio div .o_portfolio_entry_revision{background-color:#d9534f}.o_portfolio div .o_portfolio_entry_closed{background-color:#5cb85c}.o_portfolio div .o_portfolio_entry_deleted{background-color:#000}.o_portfolio div .o_portfolio_entry_incoming{background-color:#5cb85c}.o_portfolio div .o_portfolio_entry_inprocess{background-color:#c8c8c8}.o_portfolio div .o_portfolio_entry_done{background-color:#5cb85c}.o_portfolio_content .o_portfolio_toc.o_portfolio_toc_withtimeline{width:70%;float:left}.o_portfolio_content .o_portfolio_timeline{width:29%;float:right}.o_portfolio_content .o_portfolio_toc.o_portfolio_withtimeline,.o_portfolio_content .o_portfolio_entries.o_portfolio_withtimeline{width:70%;float:left}.o_portfolio_content .o_portfolio_timeline{width:29%;float:right}.o_portfolio_page_meta_wrapper{background-position:left top;background-repeat:no-repeat}.o_portfolio_rights table .o_portfolio_section td:first-child{padding-left:1.5em}.o_portfolio_rights table .o_portfolio_page td:first-child{padding-left:2.5em}.o_portfolio_publication table{padding-bottom:10px}.o_portfolio_publication table td{padding:5px 5px 5px 0}.o_portfolio_publication .o_portfolio_ac{font-size:90%}.o_portfolio_publication .o_portfolio_ac table td:nth-of-type(2){width:200px;white-space:nowrap}.o_portfolio_publication .o_portfolio_ac table td:nth-of-type(3){width:40px;white-space:nowrap}.o_portfolio_publication ul ul{margin-left:2em;margin-bottom:5px}.o_portfolio_publication ul li{background:#fbfbfb;padding:3px;margin-bottom:2px}.o_portfolio_publication ul li li{background:#f2f2f2}.o_portfolio_publication ul li li li{background:#eee}.o_portfolio_publication ul li li .table{margin-bottom:0px}@media (max-width: 767px){.o_portfolio_content .o_portfolio_toc.o_portfolio_withtimeline,.o_portfolio_content .o_portfolio_entries.o_portfolio_withtimeline{width:100%;float:none}.o_portfolio_content .o_sel_timeline_off,.o_portfolio_content .o_sel_timeline_on,.o_portfolio_content .o_portfolio_timeline{display:none}.o_portfolio_content .o_portfolio_content .o_portfolio_toc.o_portfolio_withtimeline{width:100%;float:none}}.o_portfolio_media_browser .o_portfolio_medias{position:relative;margin-bottom:20px;margin-top:20px}.o_portfolio_media_browser .o_portfolio_medias:before,.o_portfolio_media_browser .o_portfolio_medias:after{content:" ";display:table}.o_portfolio_media_browser .o_portfolio_medias:after{clear:both}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media{position:relative;float:left;margin:0 20px 20px 0;width:180px}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media:last-child{margin-right:0}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_visual{border:1px solid #337ab7;position:relative;height:180px;width:180px}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_visual span.o_visual_not_available{width:100%;height:100%;display:block}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_visual.o_icon span.o_visual_not_available{background-image:none}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_visual.o_icon{font-size:6em;text-align:center;color:#eee;line-height:140px}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_meta{position:absolute;left:0;bottom:0;width:100%;border:1px solid #337ab7;border-top:0;background-color:rgba(255,255,255,0.8)}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_meta .o_title{margin:0;text-align:center;line-height:2em;height:2em;width:100%;overflow:hidden}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_meta .o_title a{display:block;color:#337ab7;font-family:inherit;font-weight:inherit}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_meta .o_title a:hover{color:#286090}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_meta .o_title a>i{display:none}@media (min-width: 768px) and (max-width: 991px){.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media{width:80px;margin:0 10px 10px 0}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_visual{height:80px;width:80px}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_visual.o_icon{font-size:2.5em;line-height:55px}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_title{font-size:90%}}@media (max-width: 767px){.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media{width:80px;margin:0 1px 1px 0}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_visual{height:80px;width:80px}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_visual.o_icon{font-size:2.5em;line-height:55px}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_title{font-size:90%}}.o_ed_htitle h1,.o_ed_htitle .h1{font-size:30px}.o_ed_htitle h2,.o_ed_htitle .h2{font-size:24px}.o_ed_htitle h3,.o_ed_htitle .h3{font-size:18px}.o_ed_htitle h4,.o_ed_htitle .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_ed_htitle h2,.o_ed_htitle .h4{font-size:14px}.o_ed_htitle h5,.o_ed_htitle .h5{font-size:12px}.o_ed_htitle h6,.o_ed_htitle .h6{font-size:12px}@media print{.o_binder h1{font-size:43.2px;margin-top:10cm}.o_portfolio_section{margin-bottom:1cm}.o_portfolio_section h3:first-of-type{font-size:36px}.o_page_lead{border:0;border-bottom:1px solid #d9d9d9;border-radius:0;background-color:none;padding:0;margin-bottom:10px}.o_page_lead .o_portfolio_status_block{border-top:0;margin-bottom:0}.o_page_lead .o_media img{border:0}.o_page_lead .o_portfolio_categories{display:block;margin-left:0}.o_page_lead .o_portfolio_status_block{padding-top:0}.o_page_lead .o_page_summary{margin-top:1em;font-style:italic}.o_pf_content .o_cit,.o_pf_content .o_text,.o_pf_content .o_file,.o_pf_content .o_forum,.o_pf_content .o_image,.o_pf_content .o_video,.o_pf_content .o_efficiencystatement,.o_pf_content .o_feed,.o_pf_content .o_forum,.o_pf_content .o_wiki{padding:0;border-radius:0;border:0}.o_pf_content .o_cit .o_desc p,.o_pf_content .o_text .o_desc p,.o_pf_content .o_file .o_desc p,.o_pf_content .o_forum .o_desc p,.o_pf_content .o_image .o_desc p,.o_pf_content .o_video .o_desc p,.o_pf_content .o_efficiencystatement .o_desc p,.o_pf_content .o_feed .o_desc p,.o_pf_content .o_forum .o_desc p,.o_pf_content .o_wiki .o_desc p{margin:0}.o_efficiencystatement table{font-size:90%}.o_artefact_metadata{page-break-inside:avoid;border:0;border-left:5px solid #eee;padding-left:10px;font-size:80%}.o_artefact_metadata table td,.o_artefact_metadata table th{border:0 !important;padding:2px !important}.o_artefact_metadata table th:first-of-type{width:20%}.o_pf_video_placeholder{background-color:#f8f8f8 !important;-webkit-print-color-adjust:exact;color-adjust:exact}.o_pf_video_placeholder.visible-print-block{display:table !important}}.o_rubric_insufficient{background-color:#fee08b}.o_rubric_neutral{background-color:#ffffbf}.o_rubric_sufficient{background-color:#d9ef8b}.o_evaluation_form .o_evaluation_block{margin-top:2em;margin-bottom:2em}.o_evaluation_form .o_evaluation_step_labels{margin-bottom:1em;font-weight:bold}.o_evaluation_form .o_evaluation_step_labels div,.o_evaluation_form .o_evaluation_step_labels span{display:inline-block;text-align:center;align-self:flex-end}.o_evaluation_form .o_slider{margin-bottom:1em}.o_evaluation_form .o_slider label{padding:0}.o_evaluation_form .o_slider input{padding:0;margin:0;position:relative}.o_evaluation_form .o_slider .o_evaluation_no_response label{margin-top:-3px}.o_evaluation_form .o_slider.hover{background-color:#f5f5f5}.o_evaluation_form .o_evaluation_discrete_radio .o_slider .o_evaluation_steps{display:flex;justify-content:space-between}.o_evaluation_form .o_evaluation_discrete_radio .o_slider .o_evaluation_steps label{padding:0;margin:0;text-align:center}.o_evaluation_form .o_evaluation_discrete_radio .o_slider .o_evaluation_steps .radio{background-color:#f9f9f9;padding:0px;margin-top:0px;text-align:center}.o_evaluation_form .o_evaluation_discrete_radio .o_slider .o_evaluation_steps .radio:hover{background-color:#f5f5f5}.o_evaluation_form .o_evaluation_discrete_radio .o_slider .o_evaluation_no_response div.checkbox{margin-top:0px}.o_evaluation_form .o_evaluation_discrete_radio .o_evaluation_step_labels{display:flex;justify-content:space-between}.o_evaluation_form .o_slider .ui-slider.ui-slider-horizontal.ui-widget-content{margin-top:0.3em}.o_evaluation_form .o_evaluation_left_label{text-align:right;font-weight:normal}.o_evaluation_form .o_evaluation_left_label.o_evaluation_left_label_la{text-align:left;padding-left:0px;font-weight:normal}.o_evaluation_form .o_evaluation_right_label{text-align:left;font-weight:normal}.o_evaluation_form .o_evaluation_legend{padding-left:0.5em;margin-bottom:0.5em}.o_evaluation_form .o_evaluation_mc_other{margin-top:-20px;margin-left:20px}.o_evaluation_form .o_evaluation_rubric_diagrams .o_slider{margin-left:15px;margin-right:15px}.o_evaluation_form .o_evaluation_rubric_diagrams .o_end_label{text-align:right;padding-right:20px}.o_evaluation_form .o_evaluation_rubric_diagrams .o_continous .x .tick{visibility:hidden}.o_evaluation_form .o_ed_rubrictablehandler .table{margin-top:5px}.o_evaluation_form .svg-container{display:inline-block;position:relative;width:100%;padding-bottom:50%;vertical-align:top;overflow:hidden}.o_evaluation_form .svg-content-responsive{display:inline-block;position:absolute;top:10px;left:0}.d3chart .o_eva_bar{fill:#337ab7}.o_evaluation_discrete_slider .o_evaluation_step_labels{position:relative}.o_evaluation_discrete_slider .o_evaluation_step_labels div:first-child{position:absolute;left:0px;text-align:left}.o_evaluation_discrete_slider .o_evaluation_step_labels div{display:inline-block;text-align:center}.o_evaluation_discrete_slider .o_evaluation_step_labels div:last-child{position:absolute;right:0px;text-align:right}.o_slider_overview{width:100%;height:20px;position:relative}.o_slider_overview .o_slider_overview_line{top:5px;left:0px;position:absolute;width:100%;height:11px;border:1px solid #999;border-radius:4px}.o_slider_overview .o_slider_overview_point{position:absolute;width:10px;height:10px;background-color:#337ab7}.o_evaluation_editor_form{margin:10px 10px 0 10px}.o_evaluation_editor_form .o_slider_editor{margin-top:10px;position:relative}.o_evaluation_editor_form .o_evaluation_step_labels{display:inline-block}.o_evaluation_editor_form .o_evaluation_step_labels input{width:100%}.o_evaluation_editor_form .o_slider_descrete_radio{display:flex;justify-content:space-between}.o_evaluation_editor_form .o_slider_descrete_radio .radio{background-color:#f9f9f9;padding:0px;margin-top:0px;text-align:center}.o_evaluation_editor_form .o_slider_descrete_radio .radio:hover{background-color:#f5f5f5}.o_evaluation_editor_form .o_slider_continous{padding-top:10px;padding-bottom:-10px}.o_evaluation_editor_form .o_slider_descrete{padding-top:5px;padding-bottom:-5px}.o_evaluation_editor_form .o_evaluation_example{font-size:90%}.o_evaluation_editor_form .o_slider_editor_delete{padding-right:48px}.o_evaluation_editor_form .o_slider_editor_delete .o_slider_editor_delete_button{position:absolute;right:15px}@media (max-width: 768px){.o_evaluation_form .o_evaluation_left_label{text-align:left;margin-bottom:0.5em}.o_evaluation_form .o_evaluation_right_label{text-align:right}.o_evaluation_form .o_evaluation_no_response{text-align:left}.o_evaluation_form .o_evaluation_no_response .o_evaluation_no_resp_value{font-weight:bold}.o_evaluation_form .o_evaluation_slider .o_evaluation_no_response{margin-top:0.7em}.o_evaluation_form .o_slider{margin-bottom:2em}.o_evaluation_form .o_slider div{padding-left:0}}@media (min-width: 768px){.o_evaluation_form .o_evaluation_no_resp_value{display:none}}@media print{.o_evaluation_block{page-break-inside:avoid}.o_evaluation_discrete_radio .o_slider .o_evaluation_steps div.radio{-webkit-print-color-adjust:exact;color-adjust:exact;background-color:#f9f9f9 !important}}.o_surv_run.withCmds .o_eva_report{margin-top:-44px}.o_eva_report .o_eva_overview .o_eva_rubric .table{margin-top:5px}.o_eva_report .o_ed_rubrictablehandler .o_table_footer{font-weight:bold}.o_eva_report .o_rubric_avg{font-weight:bold}.o_cit{position:relative;margin:10px 0}.o_cit blockquote.o_quote{color:#555;font-size:18px;margin-top:6px;margin-bottom:0;padding:0 12px;font-style:italic;padding:5px 5px 0;border:0}.o_cit blockquote.o_quote p:last-child:after{content:'1)';top:-0.5em;font-size:75%;line-height:0;position:relative;vertical-align:baseline}.o_cit .o_cit_bibinfo{font-size:90%;margin-left:1em;position:relative}.o_cit .o_cit_bibinfo>div:first-child:before{content:'1)';position:absolute;top:0.5em;left:-1em;font-size:75%;line-height:0;vertical-align:baseline}.o_cit .title,.o_cit .url,.o_cit .authors,.o_cit .pages,.o_cit .date,.o_cit .dateAdded,.o_cit .place,.o_cit .institution,.o_cit .issue,.o_cit .publisher,.o_cit .publicationTitle,.o_cit .edition,.o_cit .series,.o_cit .volume{margin-right:0.5em}.o_cit .title{font-style:italic}.o_cit .publicationTitle{color:black}.o_cit .links{padding-left:2em}.o_cit .notes{padding-left:2em;color:grey}.o_cit .note{font-style:italic}.o_cit .note p:first-child{margin-top:0}.o_cit .note p:first-child{margin-bottom:0}.o_cit .listing.web .item{padding-left:0;text-indent:0}.o_cit .listing.web .title{display:block;font-weight:bold;font-style:normal}.o_cit .listing.web .publicationTitle{display:block;font-style:italic}.o_cit .listing.web .url{display:block}.o_cit .listing.web .links{padding-left:0}.o_cit .listing.web .notes{padding-left:0}.o_cit .general-info{border-top:1px solid #eee;padding-top:30px;margin-top:30px}.o_cit .copyright{display:none}@media print{.o_cit blockquote.o_quote{page-break-inside:avoid}}.o_video_poster{position:relative;display:inline-block;width:400px;max-width:100%;height:225px;background-size:cover;background-repeat:no-repeat;border:1px solid #eee}.o_video_poster_select{text-align:center}.o_video_poster_select .o_video_poster{margin:5px}.o_video_poster_select .o_video_poster a{position:absolute;left:0;top:0;width:100%;height:100%}.o_video_poster_select .o_video_poster a span{position:absolute;bottom:0;width:100%;display:block;line-height:3em;background:#f8f8f8;opacity:0.8}.o_video_poster_select .o_video_poster a:hover{border:1px solid #bbb}.o_video_poster_select .o_video_poster a:hover span{opacity:0.9}.o_video_peekview{text-align:center}.o_video_listing .o_table_body.container-fluid{padding-right:0px;padding-left:0px}.o_video_listing .o_video_entry{position:relative;display:inline-block;height:230px;width:250px;vertical-align:top;margin-right:10px}.o_video_listing .o_video_poster{width:250px;max-width:100%;height:140px;border:1px solid #eee}.o_video_listing .o_timecode{position:absolute;bottom:2px;right:3px;padding:3px 4px;background:#333;color:#fff;font-size:12px;line-height:12px}.o_video_listing .o_meta{padding:2px;font-size:11px}.o_video_listing .o_meta h5{font-size:14px;margin-top:0;margin-bottom:5px;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.o_video_listing .o_date{margin-left:10px;display:inline-block}.o_video_listing .o_date:before{content:'\002022';margin-right:10px;display:inline-block}.o_video_run h1{font-size:1.8rem;font-weight:normal}.o_video_run .o_author{margin-top:0.5em;margin-bottom:1em;line-height:normal;font-size:90%;color:#3c763d}.o_video_run .o_ratings_and_comments{margin-top:2em;border-top:1px solid #eee;padding-top:1em}.o_video_chapter_editor .o_table_wrapper.o_table_flexi .table{margin-top:0}.mejs__controls .mejs__sourcechooser-button>button{background:transparent;display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}.mejs__controls .mejs__sourcechooser-button>button:before{content:"";color:white;font-size:18px}.mejs__controls .mejs__sourcechooser-button .mejs__sourcechooser-selector{visibility:visible !important;width:170px;padding-left:10px}.mejs__controls .mejs__sourcechooser-button .mejs__sourcechooser-selector ul li label{font-weight:normal;font-size:10px;width:140px}.mejs__controls .mejs__sourcechooser-button .mejs__sourcechooser-selector ul li label:hover{color:#eee}.mejs__controls .mejs__sourcechooser-button .mejs__sourcechooser-selector ul li label .type{display:none}.mejs__controls .mejs__sourcechooser-button .mejs__sourcechooser-selector ul li input{visibility:hidden;margin:0;width:0}.mejs__controls .mejs__sourcechooser-button .mejs__sourcechooser-selector ul li input:checked+label{color:#d9534f}.mejs__controls .mejs__captions-button .mejs__captions-selector{right:-26px}.mejs__controls .mejs__captions-button .mejs__captions-selector ul li label{font-weight:normal;font-size:10px}.mejs__controls .mejs__captions-button .mejs__captions-selector ul li label:hover{color:#eee}.mejs__controls .mejs__captions-button .mejs__captions-selector ul li label .type{display:none}.mejs__controls .mejs__captions-button .mejs__captions-selector ul li input{visibility:hidden;margin:0;width:0}.mejs__controls .mejs__captions-button .mejs__captions-selector ul li input:checked+label{color:#d9534f}.mejs__button.mejs__speed-button{width:36px}.mejs__controls .mejs__speed-button>button{background:transparent;width:36px;margin:11px 0 0 0;font-size:11px;line-height:normal;color:#ffffff}.mejs__controls .mejs__speed-button .mejs__speed-selector{height:150px;top:auto;bottom:40px}.mejs__controls .mejs__speed-button .mejs__speed-selector ul li label{font-weight:normal;font-size:10px}.mejs__chapters .mejs__chapter .mejs__chapter-block .ch-title,.mejs__chapters .mejs__chapter .mejs__chapter-block .ch-time{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}.o_userbulk_changedcell{font-style:italic;font-weight:bold}.o_qpool_source_status{text-align:center}.o_qitem_author{white-space:nowrap}.dropdown-toggle.o_qpool_tools_status>i{margin:0 0 3px 0}.dropdown-menu.o_qpool_tools_status{cursor:pointer}a.o_qpool_status{margin:0 2px 2px 2px;text-align:left}a.o_qpool_status_draft,.dropdown-toggle.o_qpool_status_draft{background-color:#4a6785 !important;border-color:#4a6785;color:#fff !important}a.o_qpool_status_review,.dropdown-toggle.o_qpool_status_review{background-color:#ffd351 !important;border-color:#ffd351;color:#fff !important}a.o_qpool_status_revised,.dropdown-toggle.o_qpool_status_revised{background-color:#933 !important;border-color:#933;color:#fff !important}a.o_qpool_status_finalVersion,.dropdown-toggle.o_qpool_status_finalVersion{background-color:#14892c !important;border-color:#14892c;color:#fff !important}a.o_qpool_status_endOfLife,.dropdown-toggle.o_qpool_status_endOfLife{background-color:#aaa !important;border-color:#aaa;color:#fff !important}.o_qpool_status_draft_light{border-color:#4a6785;color:#4a6785}.o_qpool_status_review_light{border-color:#ffd351;color:#333}.o_qpool_status_revised_light{border-color:#933;color:#933}.o_qpool_status_finalVersion_light{border-color:#14892c;color:#14892c}.o_qpool_status_endOfLife_light{border-color:#aaa;color:#aaa}.btn-arrow-right.o_qpool_qitem_draft{background:#f8f8f8;border-bottom-color:#4a6785;border-bottom-width:3px}.btn-arrow-right.o_qpool_qitem_review{background:#f8f8f8;border-bottom-color:#ffd351;border-bottom-width:3px}.btn-arrow-right.o_qpool_qitem_revised{background:#f8f8f8;border-bottom-color:#933;border-bottom-width:3px}.btn-arrow-right.o_qpool_qitem_final{background:#f8f8f8;border-bottom-color:#14892c;border-bottom-width:3px}.btn-arrow-right.o_qpool_qitem_end_of_life{background:#f8f8f8;border-bottom-color:#aaa;border-bottom-width:3px}.btn-arrow-right.o_qpool_status_slected{background-color:#e7e7e7;color:#555}.btn-arrow-right,.btn-arrow-left{position:relative;padding-left:18px;padding-right:18px;margin-bottom:5px}.btn-arrow-right{padding-left:36px}.btn-arrow-left{padding-right:36px}.btn-arrow-right:before,.btn-arrow-right:after,.btn-arrow-left:before,.btn-arrow-left:after{content:"";position:absolute;top:5px;width:22.627417px;height:22.627417px;background:inherit;border:inherit;border-left-color:transparent;border-bottom-color:transparent;border-radius:0px 4px 0px 0px;-webkit-border-radius:0px 4px 0px 0px;-moz-border-radius:0px 4px 0px 0px}.btn-arrow-right:before,.btn-arrow-right:after{transform:rotate(45deg);-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-o-transform:rotate(45deg);-ms-transform:rotate(45deg)}.btn-arrow-left:before,.btn-arrow-left:after{transform:rotate(225deg);-webkit-transform:rotate(225deg);-moz-transform:rotate(225deg);-o-transform:rotate(225deg);-ms-transform:rotate(225deg)}.btn-arrow-right:before,.btn-arrow-left:before{left:-11px}.btn-arrow-right:after,.btn-arrow-left:after{right:-11px}.btn-arrow-right:after,.btn-arrow-left:before{z-index:1}.btn-arrow-right:before,.btn-arrow-left:after{background-color:white}body.o_dmz{background:transparent}body.o_dmz #o_bg{position:absolute;top:0;left:0;width:100%;height:100%;border-top:50px solid transparent;border-bottom:70px solid transparent;background:url("../light/images/learn-bg.jpg");background-size:cover;background-position:center center;background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#00ffffff', endColorstr='#ffffff',GradientType=1 )}body.o_dmz #o_bg:after{content:" ";position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(to right, rgba(255,255,255,0.1) 0.2%, rgba(255,255,255,0.6) 60%, rgba(255,255,255,0.8) 100%);background-size:cover;background-position:center center;background-repeat:no-repeat}body.o_dmz #o_toplink{display:none}body.o_dmz #o_main_wrapper,body.o_dmz #o_main_wrapper #o_main_container{background:transparent}.o_login{padding-bottom:20px;padding-left:10%;padding-right:10%;text-align:right}.o_login .o_login_intro{padding-left:10%}.o_login .o_login_intro h1{margin-bottom:40px;color:#337ab7}.o_login .o_login_intro .lead{color:#333}.o_login .o_login_intro .lead h1,.o_login .o_login_intro .lead h2,.o_login .o_login_intro .lead h3,.o_login .o_login_intro .lead h4,.o_login .o_login_intro .lead .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_login .o_login_intro .lead h2,.o_login .o_login_intro .lead h5{margin-bottom:20px;color:#337ab7}.o_login .o_login_messages,.o_login .o_login_box{display:inline-block;width:400px;text-align:left}.o_login .o_login_messages .o_infomessage_wrapper{background:rgba(255,255,255,0.5);border:1px solid transparent;border-radius:4px;padding:6px 12px}.o_login .o_login_messages .o_infomessage_wrapper .o_info,.o_login .o_login_messages .o_infomessage_wrapper .o_warning,.o_login .o_login_messages .o_infomessage_wrapper .o_note{margin:0}.o_login .o_login_box{padding-top:10px}.o_login .o_login_providers{margin-bottom:6px;border-radius:4px;-webkit-box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3);box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3)}.o_login .o_login_providers a span{display:block;font-size:9px;padding-top:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_login .o_login_providers .o_icon_provider_olat{font-size:1em}.o_login .o_login_provider{background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3);box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3)}.o_login .o_login_form{position:relative;padding:10px 12px}.o_login .o_login_form .o_login_pwd{position:absolute;bottom:2em;right:12px}.o_login .o_login_form .o_form .o_desc{margin:0 0 30px 0;padding:0;border-left:0;background-color:transparent}.o_login .o_login_register{display:block;line-height:2em;font-size:18px;text-align:center;color:#fff;background-color:#5bc0de;border-color:#46b8da;border-radius:4px;margin-top:16px;padding:10px 12px}.o_login .o_login_register:hover,.o_login .o_login_register:focus,.o_login .o_login_register.focus,.o_login .o_login_register:active,.o_login .o_login_register.active,.open>.o_login .o_login_register.dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#269abc}.o_login .o_login_register:active,.o_login .o_login_register.active,.open>.o_login .o_login_register.dropdown-toggle{background-image:none}.o_login .o_login_register.disabled,.o_login .o_login_register.disabled:hover,.o_login .o_login_register.disabled:focus,.o_login .o_login_register.disabled.focus,.o_login .o_login_register.disabled:active,.o_login .o_login_register.disabled.active,.o_login .o_login_register[disabled],.o_login .o_login_register[disabled]:hover,.o_login .o_login_register[disabled]:focus,.o_login .o_login_register[disabled].focus,.o_login .o_login_register[disabled]:active,.o_login .o_login_register[disabled].active,fieldset[disabled] .o_login .o_login_register,fieldset[disabled] .o_login .o_login_register:hover,fieldset[disabled] .o_login .o_login_register:focus,fieldset[disabled] .o_login .o_login_register.focus,fieldset[disabled] .o_login .o_login_register:active,fieldset[disabled] .o_login .o_login_register.active{background-color:#5bc0de;border-color:#46b8da}.o_login .o_login_register .badge{color:#5bc0de;background-color:#fff}.o_login .o_login_register small{font-size:14px}.o_login .o_login_social{position:relative;padding:10px 12px}.o_login .o_login_social li{padding:10px 12px}.o_login .o_login_social li>a{display:block;line-height:2em;text-align:center;font-size:18px;border-radius:4px;padding:10px 12px}.o_login .o_login_social .btn-default.o_sel_auth_facebook{color:#fff;background-color:#4568b2;border-color:#3e5da0}.o_login .o_login_social .btn-default.o_sel_auth_facebook:hover,.o_login .o_login_social .btn-default.o_sel_auth_facebook:focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook.focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_facebook.dropdown-toggle{color:#fff;background-color:#37538d;border-color:#2d4374}.o_login .o_login_social .btn-default.o_sel_auth_facebook:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_facebook.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled],.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook.active{background-color:#4568b2;border-color:#3e5da0}.o_login .o_login_social .btn-default.o_sel_auth_facebook .badge{color:#4568b2;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_twitter{color:#fff;background-color:#2cc5ff;border-color:#13beff}.o_login .o_login_social .btn-default.o_sel_auth_twitter:hover,.o_login .o_login_social .btn-default.o_sel_auth_twitter:focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter.focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_twitter.dropdown-toggle{color:#fff;background-color:#00b4f8;border-color:#009ad4}.o_login .o_login_social .btn-default.o_sel_auth_twitter:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_twitter.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled],.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter.active{background-color:#2cc5ff;border-color:#13beff}.o_login .o_login_social .btn-default.o_sel_auth_twitter .badge{color:#2cc5ff;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_google{color:#fff;background-color:#e15f4f;border-color:#dd4b39}.o_login .o_login_social .btn-default.o_sel_auth_google:hover,.o_login .o_login_social .btn-default.o_sel_auth_google:focus,.o_login .o_login_social .btn-default.o_sel_auth_google.focus,.o_login .o_login_social .btn-default.o_sel_auth_google:active,.o_login .o_login_social .btn-default.o_sel_auth_google.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_google.dropdown-toggle{color:#fff;background-color:#d83825;border-color:#ba3120}.o_login .o_login_social .btn-default.o_sel_auth_google:active,.o_login .o_login_social .btn-default.o_sel_auth_google.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_google.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_google.disabled,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled],.o_login .o_login_social .btn-default.o_sel_auth_google[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google.active{background-color:#e15f4f;border-color:#dd4b39}.o_login .o_login_social .btn-default.o_sel_auth_google .badge{color:#e15f4f;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_linkedin{color:#fff;background-color:#0181bd;border-color:#0170a4}.o_login .o_login_social .btn-default.o_sel_auth_linkedin:hover,.o_login .o_login_social .btn-default.o_sel_auth_linkedin:focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_linkedin.dropdown-toggle{color:#fff;background-color:#015e8a;border-color:#014667}.o_login .o_login_social .btn-default.o_sel_auth_linkedin:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_linkedin.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled],.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin.active{background-color:#0181bd;border-color:#0170a4}.o_login .o_login_social .btn-default.o_sel_auth_linkedin .badge{color:#0181bd;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_adfs{color:#fff;background-color:#337ab7;border-color:#2e6da4}.o_login .o_login_social .btn-default.o_sel_auth_adfs:hover,.o_login .o_login_social .btn-default.o_sel_auth_adfs:focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs.focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_adfs.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.o_login .o_login_social .btn-default.o_sel_auth_adfs:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_adfs.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled],.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs.active{background-color:#337ab7;border-color:#2e6da4}.o_login .o_login_social .btn-default.o_sel_auth_adfs .badge{color:#337ab7;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect{color:#fff;background-color:#337ab7;border-color:#2e6da4}.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect:hover,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect:focus,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.focus,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect:active,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect:active,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.disabled,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect[disabled],.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.active{background-color:#337ab7;border-color:#2e6da4}.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect .badge{color:#337ab7;background-color:#fff}.o_old_browser{display:none}.o_browser_ie7 .o_old_browser,.o_browser_ie8 .o_old_browser,.o_browser_ie9 .o_old_browser,.o_browser_ie10 .o_old_browser{display:block}@media (max-width: 767px){body.o_dmz #o_bg{background:none;display:none}.o_login{padding:0}.o_login .o_login_intro{padding:0;text-align:left}.o_login .o_login_box_wrapper{text-align:center;padding:0}.o_login .o_login_box{padding-left:0;padding-right:0}.o_login .o_login_box .o_login_providers,.o_login .o_login_box .o_login_provider{-webkit-box-shadow:none;box-shadow:none}.o_login .o_login_messages,.o_login .o_login_box{width:100%;display:block}}.o_home_main h1{text-align:center}.o_home_main .o_icon_rss{line-height:20px;vertical-align:middle}.o_showall{font-size:12px;text-align:right;margin-bottom:5px;margin-top:10px}.o_portlet{position:relative;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1)}.o_portlet .o_header{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:6px 12px;border-bottom:1px solid #ddd;background-color:#f5f5f5;border-top-right-radius:4px;border-top-left-radius:4px}.o_portlet .o_content{padding:6px 12px}.o_portlet .o_portlet_table{margin:-12px;margin-bottom:-6px;margin-top:0}.o_portlet .o_table_empty.o_info{padding:6px}.o_portlet .o_toolbox{position:absolute;top:-1px;right:-1px;z-index:2;background-color:#fff;border:1px solid #faebcc;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;padding:6px 12px}.o_portlet .o_toolbox div{display:inline}.o_portlet .o_edit_shim{position:absolute;height:100%;width:100%;z-index:1;background:#fcf8e3;opacity:0.8}.o_inactive .o_header a{float:right;margin-left:12px;margin-top:10px}.o_portlet_dyk_q{margin-top:5px;font-style:italic}.o_portlet_dyk_a{margin:5px 0}.o_portlet_dyk_next{margin:5px 0;text-align:right}.o_library_icon:before{content:""}.o_library ul{list-style:none;margin:0 0 15px 0;padding:0}.o_library ul ul{margin:0}.o_library_overview .o_library_newest_files ul li{float:left;margin-right:15px}.o_library_item{margin-bottom:10px;position:relative}.o_library_item .o_library_visual,.o_library_item .o_library_extra,.o_library_item .o_library_meta{margin-top:15px}.o_library_item .o_library_visual{float:left;background-color:#fff;border-radius:4px;border:1px solid #ddd}.o_library_item .o_library_visual .o_thumbnail_available,.o_library_item .o_library_visual .o_thumbnail_unavailable{background-size:146px auto;width:150px !important;height:150px !important;background-repeat:no-repeat;background-position:50% 50%}.o_library_item .o_library_visual .o_thumbnail_available:before,.o_library_item .o_library_visual .o_thumbnail_unavailable:before{content:none}.o_library_item .o_library_visual .o_thumbnail_available{background-size:146px auto}.o_library_item .o_library_visual .o_thumbnail_unavailable{display:none}.o_library_item .o_library_extra{float:right;width:200px}.o_library_item .o_library_meta{clear:both}.o_library_item .o_library_meta .o_library_desc{padding-bottom:10px}.o_library_item .o_library_meta small{display:block;word-wrap:break-word}.o_library_item h4,.o_library_item .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_library_item h2{margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:normal}.o_library_item .btn{display:block;margin-bottom:0.5em}.o_library_item .o_comments{display:inline-block}.o_library_item .table{table-layout:fixed;word-wrap:break-word;margin-bottom:0}.o_library_item p.o_library_show_more{text-align:right;margin:0;padding-top:20px}.o_library_item .o_library_more{padding-top:20px;display:none}.o_library_folder{margin-top:-20px}.o_library .o_ratings_and_comments .o_rating_title,.o_library .o_ratings_and_comments .o_rating_explanation{display:none}@media (min-width: 768px){.o_library_item .o_library_meta{clear:none;margin-left:150px;margin-right:200px;padding:0 10px}.o_library_item .o_library_more{display:none}.o_library_item .o_library_more table tbody{vertical-align:top}.o_library_item .o_library_more table tr,.o_library_item .o_library_more table th,.o_library_item .o_library_more table td{display:inline-block}.o_library_item .o_library_more table tr{width:49%}.o_library_item .o_library_more table th{width:30%}.o_library_item .o_library_more table td{width:70%}}.o_library_item_compact .o_library_extra{width:auto}.o_library_item_compact .o_library_meta{padding:0 10px 0 0;margin:0;overflow:hidden}.o_library_item_compact .btn{display:inline-block}.o_library_item_compact h4,.o_library_item_compact .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_library_item_compact h2{overflow:hidden;margin-right:70px}.o_library_item_compact h4 a,.o_library_item_compact .o_cal .fc-header-title h2 a,.o_cal .fc-header-title .o_library_item_compact h2 a{text-overflow:ellipsis;white-space:nowrap}.o_library_item_compact p.o_library_show_more{padding:20px;position:absolute;top:0;right:0}span.o_translation_i18nitem{position:relative !important}span.o_translation_i18nitem a.o_translation_i18nitem_launcher{position:absolute !important;z-index:100 !important;width:18px !important;height:20px !important;top:0 !important;left:5px !important;background:#fff;border:1px solid #337ab7 !important;border-radius:3px;text-align:center;padding:0 !important}.o_user_infos{position:relative}.o_user_infos .o_user_portrait{position:absolute;top:0;left:15px;width:100px;height:100px}.o_user_infos .o_user_infos_inner{margin:0 30px 0 100px}.o_user_infos .o_user_infos_inner table{margin:0 30px 15px 30px}.o_useradmin .o_user_infos .o_user_infos_inner{margin-right:45px}div.o_skype_button{display:inline-block}div.o_skype_button p{margin:0 0 0 0}div.o_skype_button p a img{margin:0 !important;vertical-align:middle !important}.o_useradmin div#o_main_toolbar.o_toolbar{margin-top:0px}.o_members_pagination{text-align:center}.o_bcard_logo{margin-left:10px;height:66px}.o_bcard_title_with_logo{clear:both;padding:20px 0 0 0}.o_visitingcard_image,.o_visitingcard_logo{height:66px}.o_visitingcard .o_icon_visitingcard{display:none}.o_visitingcard .o_portrait_avatar,.o_visitingcard .o_portrait_dummy,.o_visitingcard .o_portrait_dummy_female_big,.o_visitingcard .o_portrait_dummy_male_big,.o_visitingcard .o_portrait_anonymous{width:66px;height:66px;margin-right:10px}@media (max-width: 767px){.o_visitingcard .o_portrait_avatar,.o_visitingcard .o_portrait_dummy,.o_visitingcard .o_portrait_dummy_female_big,.o_visitingcard .o_portrait_dummy_male_big,.o_visitingcard .o_portrait_anonymous{width:50px;height:50px;margin:5px 5px 0 0}.o_visitingcard_image,.o_visitingcard_logo{height:50px}.o_visitingcard_logo,.o_bcard_logo{height:50px;margin:5px 0 0 5px}.o_visitingcard_logo img,.o_bcard_logo img{position:relative;transform:scale(.7575757576);top:-8px}}@media (max-width: 414px){.o_visitingcard_logo img{max-width:260px}}@media (max-width: 375px){.o_visitingcard_logo img{max-width:220px}}@media (max-width: 320px){.o_visitingcard_logo img{max-width:180px}.o_bcard_logo img{max-width:150px}}.o_gta_coach_selection .o_noti{display:inline-block;float:none;margin:0}.o_gta_coach_selection .o_gta_coach_selection_bar{position:relative}.o_gta_coach_selection .o_gta_coach_selection_bar .o_noti{position:absolute;top:3px;right:0}p.o_gta_reopen_warning{margin-top:-20px}.o_lecture_authorized_absence div.form-inline,.o_lecture_authorized_absence div.o_navbar-form{display:inline}.o_lectures_teacher_overview .o_table_wrapper.o_table_flexi .table{margin-top:0}.o_lectures_teacher_overview .o_table_wrapper.o_table_flexi .table thead th.o_col_date,.o_lectures_teacher_overview .o_table_wrapper.o_table_flexi .table thead th.o_col_startTime,.o_lectures_teacher_overview .o_table_wrapper.o_table_flexi .table thead th.o_col_endTime,.o_lectures_teacher_overview .o_table_wrapper.o_table_flexi .table thead th.o_col_details,.o_lectures_teacher_overview .o_table_wrapper.o_table_flexi .table thead th.o_col_tools{width:1%}.o_lectures_teacher_overview .o_lectures_current_wrapper{border:1px solid transparent;background:#f8f8f8;border-radius:4px;margin:10px -10px 20px -10px;padding:10px}.o_lectures_teacher_overview .o_lectures_current_wrapper .o_button_group{margin-bottom:0}.o_lectures_teacher_overview .o_lectures_teacher_search .o_form .o_date{padding-right:10px;position:relative}.o_lectures_teacher_overview .o_lectures_teacher_search span.o_chelp_wrapper{position:absolute;top:0;right:0}.o_lectures_rollcall legend{margin-bottom:10px}.o_lectures_rollcall .o_desc,.o_lectures_rollcall .o_preparation{margin:0}.o_rollcall_next_previous_group{text-align:center}.o_rollcall_next_previous_group a.o_sel_close{float:left}.o_rollcall_next_previous_group a.o_sel_close span{display:none}.o_rollcall_next_previous_group .form-control{display:inline;width:auto}@media (max-width: 767px){.o_rollcall_next_previous_group a span{display:none}}.o_lecture_free{color:#777}.o_rollcall_portrait>div{margin:0 auto 10px auto;width:100px}.o_edubase_pv{overflow:hidden;padding-top:10px}.o_edubase_pv_fig{display:inline-block;vertical-align:top;width:110px;margin-right:3%}.o_edubase_run_enabled .o_edubase_page{font-size:12px;color:#777}.o_edubase_run_disabled .o_edubase_booksection{margin-right:3%;margin-bottom:3%;width:177px;display:inline-table}.o_edubase_run_disabled .o_edubase_page{font-size:12px;color:#777}.o_edubase_bs_buttons{padding-top:10px}.o_edubase_bs_book_id{margin-top:-2px}.o_edubase_bs_details{margin-left:-20px}.o_edubase_bs_details_label{visibility:hidden}.o_edubase_bs_cover object{margin-left:10px;margin-top:10px;height:120px}.o_edubase_bs_cover img{margin-left:10px;margin-top:10px;height:120px}.o_edubase_edit_books .o_icon_error{visibility:hidden}.o_edubase_edit_books .o_icon_help{margin-bottom:0px}.o_edubase_edit_books .row{margin-bottom:5px}.o_taxonomy div#o_main_toolbar.o_toolbar{margin-top:0px}.o_taxonomy_listing.o_rendertype_custom .o_table_body.container-fluid{padding-right:0px;padding-left:0px}.o_taxonomy_listing.o_rendertype_custom .o_taxonomy_row{position:relative;display:inline-block;height:200px;width:450px;vertical-align:top;margin-right:10px}.o_taxonomy_listing.o_rendertype_custom .o_taxonomy_row ul{padding-left:2em}.ui-widget{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:100%}.ui-widget-header{border-top:none;border-left:none;border-right:none;border-bottom:1px solid #eee;background:#fff;font-weight:bold}.ui-icon,.ui-widget-content .ui-icon,.ui-widget-header .ui-icon,.ui-state-default .ui-icon,.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-state-active .ui-icon,.ui-state-highlight .ui-icon,.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background:none;background-image:none}.ui-dialog{-webkit-box-shadow:0px 1px 8px -1px rgba(0,0,0,0.35);box-shadow:0px 1px 8px -1px rgba(0,0,0,0.35);background-color:#fefefe}.ui-dialog .ui-widget-header .ui-dialog-title{color:#337ab7;font-weight:500;font-family:inherit;line-height:1.1}.ui-dialog .ui-widget-header .ui-dialog-titlebar-close:before{content:"" !important}.ui-dialog .ui-widget-header .ui-dialog-titlebar-close{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;font-size:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ui-dialog .ui-widget-header .ui-dialog-titlebar-close span{display:none}.ui-dialog .ui-widget-header .ui-button.ui-corner-all{border:none !important;background:#fff !important;float:right}.ui-dialog .ui-widget-content{border-color:#fff;padding:5px;overflow:auto;background:white !important}.ui-dialog .ui-dialog-titlebar{padding:4px 7px 4px 7px;background-color:#eee !important}.ui-dialog.ui-corner-all{border-radius:4px}.ui-dialog.ui-widget-content{border:1px solid transparent}.ui-dialog.o_modal-ui{max-width:100vw;max-height:100vh}.ui-dialog.o_modal-ui div.ui-dialog-buttonpane{display:none}@media (max-width: 767px){.ui-dialog.o_modal-ui{height:100vh !important;width:100vw !important}.ui-dialog.o_modal-ui div.ui-dialog-content{height:90vh !important}}.ui-slider.ui-slider-horizontal.ui-widget-content{border-color:#aaa;background:#f9f9f9}.ui-slider.ui-slider-horizontal.ui-widget-content.ui-state-disabled{opacity:0.65}.o_has_value.ui-slider.ui-slider-horizontal.ui-widget-content .ui-slider-handle{border:1px solid #337ab7;background-image:none;background-color:#337ab7}.o_no_value.ui-slider.ui-slider-horizontal.ui-widget-content .ui-slider-handle{border:3px solid #337ab7;background-image:none}.ui-datepicker{z-index:2000 !important;-webkit-box-shadow:0px 1px 5px -1px rgba(0,0,0,0.15);box-shadow:0px 1px 5px -1px rgba(0,0,0,0.15)}.ui-datepicker .ui-widget-header .ui-corner-all,.ui-datepicker .ui-widget-header .ui-datepicker-next.ui-corner-all{border:none !important;background:#fff !important}.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-e:before{content:"";font-weight:normal;color:black}.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-w:before{content:"";font-weight:normal;color:black}.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-e,.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-w{font-family:'FontAwesome';display:inline-block;background-image:none;background-position:0 0;font-weight:normal;text-indent:0;color:white}.ui-datepicker .ui-widget-header .ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-widget-header .ui-datepicker .ui-datepicker-next-hover{top:2px}.ui-datepicker .ui-state-default{background:#eee}.ui-datepicker .ui-state-highlight,.ui-datepicker .ui-widget-content .ui-state-highlight{border:1px solid #2e6da4;background:#337ab7;color:#fff}.ui-datepicker.ui-corner-all{border-radius:4px}.ui-datepicker.ui-widget-content{border:1px solid transparent}label.mce-label{display:inline;max-width:150px;margin-bottom:0;font-weight:normal}.o_richtext_mce_without_path .mce-statusbar{border:none}.o_richtext_mce_without_path .mce-path{display:none !important}.o_richtext_mce_without_path .mce-menubtn.mce-fixed-width span{width:auto}.o_richtext_mce>.o_richtext_mce_modes{text-align:right;padding-right:4px}.o_richtext_mce>.o_richtext_mce_modes a{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}i.mce-ico.mce-i-media,i.mce-ico.mce-i-movie,i.mce-ico.mce-i-help,i.mce-ico.mce-i-gaptext,i.mce-ico.mce-i-gapnumerical,i.mce-ico.mce-i-hottext,i.mce-ico.mce-i-edit{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}i.mce-ico.mce-i-media:before{content:""}i.mce-ico.mce-i-movie:before{content:""}i.mce-ico.mce-i-gaptext:before{content:""}i.mce-ico.mce-i-gapnumerical:before{content:""}i.mce-ico.mce-i-hottext:before{content:""}i.mce-ico.mce-i-math:before{content:'\03A3'}i.mce-ico.mce-i-edit:before{content:""}i.mce-ico.mce-i-help{width:9px;height:9px;padding-top:1px}i.mce-ico.mce-i-help:before{content:"";color:white}.mce-tabs span.o_chelp_wrapper{float:right;margin:5px}.mce-wordcount:after{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:""}.mce-danger .mce-wordcount:after{color:#d9534f;content:""}.mce-statusbar.mce-danger{background-color:#f2dede}.mce-textbox.mce-danger{border-color:#ce8383;background-color:#f2dede}div.o_table_search span.twitter-typeahead{display:table-cell;padding-top:3px}.tag.label.label-info{margin-right:3px}@media print{a[href]:after{content:""}#o_header_wrapper,#o_offcanvas_right,#o_navbar_wrapper,#o_footer_wrapper,#o_toplink,#o_main_left,#o_main_right,#o_main_toolbar,#jsMath_PrintWarning,.o_segments,.o_noti,.o_opener,.o_hide,.o_noprint{display:none !important}.o_print_break_avoid{page-break-inside:avoid}.o_print_break_before{page-break-before:always}.o_print_break_after{clear:both;page-break-after:always}.btn{display:none}.o_form textarea,.o_form .form-control.textarea_disabled{-webkit-print-color-adjust:exact;color-adjust:exact;background:#fff !important;height:auto !important;color:#000 !important;resize:none}#o_comment_form_link,.o_comments form{display:none !important}.o_avatar{display:none}body.o_dmz{background:white !important;-webkit-print-color-adjust:exact;color-adjust:exact}.modal-content{border:0}.modal-header{display:none}.modal-body{padding:0}.modal-dialog{margin:0 !important;width:100% !important;height:100% !important;background:#fff !important;-webkit-print-color-adjust:exact;color-adjust:exact}.progress{page-break-inside:avoid;-webkit-print-color-adjust:exact;color-adjust:exact;background-color:rgba(0,0,0,0.1) !important;border:1px solid rgba(0,0,0,0.5)}.progress-bar{-webkit-print-color-adjust:exact;background-color:#000 !important;border:10px solid #000}.ui-slider.ui-slider-horizontal.ui-widget-content{-webkit-print-color-adjust:exact;color-adjust:exact;background:#f9f9f9 !important}.ui-slider.ui-slider-horizontal.ui-widget-content .ui-slider-handle{-webkit-print-color-adjust:exact;color-adjust:exact}.o_has_value.ui-slider.ui-slider-horizontal.ui-widget-content .ui-slider-handle{background-color:#337ab7 !important}.o_no_value.ui-slider.ui-slider-horizontal.ui-widget-content .ui-slider-handle{border:none !important}.radial-progress{page-break-inside:avoid;-webkit-print-color-adjust:exact;color-adjust:exact;background-color:#eee !important}.radial-progress .circle .mask .fill{-webkit-print-color-adjust:exact;color-adjust:exact;background-color:#000 !important}.radial-progress .inset{-webkit-print-color-adjust:exact;color-adjust:exact;background-color:#fff !important}body{margin:0}table,figure,figure{page-break-inside:avoid}h1,h2,h3,h4,.o_cal .fc-header-title h2,h5,h6{page-break-after:avoid}.o_disclaimer .o_disclaimer_content{max-height:none}}.o_highscore .o_position{text-align:center;font-size:1.2em;font-weight:bold}.o_highscore .o_position h2{font-size:3em;font-weight:700;line-height:1.2em}@media screen and (-webkit-min-device-pixel-ratio: 0){.o_highscore .o_position h2{background:linear-gradient(330deg, #e05252 0%, #99e052 25%, #52e0e0 50%, #9952e0 75%, #e05252 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;display:inline}.o_highscore .o_position h2:after{content:"\A";white-space:pre}}.o_highscore .o_position_relative{font-size:1em;font-weight:normal}.o_highscore .o_podium{position:relative;vertical-align:bottom;height:300px;margin-bottom:50px}.o_highscore .o_rank{width:30%;position:absolute;bottom:0;text-shadow:rgba(102,102,102,0.5) 0 -1px 0,rgba(255,255,255,0.6) 0 2px 1px}.o_highscore .o_rank:before{position:absolute;bottom:0;left:0;width:100%;text-align:center}.o_highscore .o_rank .o_name{position:absolute;top:100%;width:100%;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-top:1em;text-shadow:none}.o_highscore .o_rank .o_score{color:#777;font-size:90%;width:100%;text-align:center;position:absolute;top:-20px;text-shadow:none}.o_highscore .o_rank .o_singleportrait{position:absolute;width:100%;text-align:center;top:-125px}.o_highscore .o_rank .o_rank_portraits{position:relative;left:0;top:-210px;height:180px;width:200px;text-align:center;vertical-align:bottom;display:table-cell}.o_highscore .o_rank .o_rank_portraits ul{display:inline-block}.o_highscore .o_rank .o_rank_portraits .o_portrait{margin:5px}.o_highscore .o_first{height:150px;left:30%;border:1px solid #d9d9d9;border-top-left-radius:4px;border-top-right-radius:4px;background:gold;background:-moz-linear-gradient(top, #fff7cc 0%, #ffdf33 50%, gold 51%, #ffe766 100%);background:-webkit-linear-gradient(top, #fff7cc 0%, #ffdf33 50%, gold 51%, #ffe766 100%);background:linear-gradient(top, #fff7cc 0%, #ffdf33 50%, gold 51%, #ffe766 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='$basecolor', endColorstr='lighten($basecolor,20%)',GradientType=0 )}.o_highscore .o_first:before{content:"1";font-size:700%;line-height:150px;color:#666}.o_highscore .o_second{height:100px;left:0;background:silver;background:-moz-linear-gradient(top, #fff 0%, #dadada 50%, silver 51%, #f3f3f3 100%);background:-webkit-linear-gradient(top, #fff 0%, #dadada 50%, silver 51%, #f3f3f3 100%);background:linear-gradient(top, #fff 0%, #dadada 50%, silver 51%, #f3f3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='$basecolor', endColorstr='lighten($basecolor,20%)',GradientType=0 );border-left:1px solid #d9d9d9;border-top:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;border-top-left-radius:4px}.o_highscore .o_second:before{content:"2";font-size:500%;line-height:100px;color:#666}.o_highscore .o_third{height:80px;left:60%;background:#cd7f32;background:-moz-linear-gradient(top, #f5e5d6 0%, #d7995b 50%, #cd7f32 51%, #e1b284 100%);background:-webkit-linear-gradient(top, #f5e5d6 0%, #d7995b 50%, #cd7f32 51%, #e1b284 100%);background:linear-gradient(top, #f5e5d6 0%, #d7995b 50%, #cd7f32 51%, #e1b284 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='$basecolor', endColorstr='lighten($basecolor,20%)',GradientType=0 );border-right:1px solid #d9d9d9;border-top:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;border-top-right-radius:4px}.o_highscore .o_third:before{content:"3";font-size:300%;line-height:80px;color:#666}.o_highscore .o_histogram{position:relative;bottom:-40px;margin-bottom:40px}.o_highscore .o_histogram .d3chart{width:100%;padding-top:50px;height:300px}.o_highscore .o_histogram .d3chart text{fill:#888}.o_highscore .o_histogram .d3chart .axis path,.o_highscore .o_histogram .d3chart .axis line{stroke:#888}.o_highscore .o_histogram .d3chart .o_myself{fill:#337ab7}.o_highscore .o_histogram .d3chart .o_myself:hover{fill:#5094ce}.o_highscore .o_histogram .d3chart .o_other{fill:#777}.o_highscore .o_histogram .d3chart .o_other:hover{fill:#919191}.o_highscore .o_histogram .d3chart .o_empty{fill:#000}.o_listing .o_table_wrapper.o_table_flexi .table{margin-top:0}.o_listing table th:nth-of-type(1),.o_listing table th :nth-of-type(2){width:5em}body.o_browser_ie7 #o_offcanvas_right,body.o_browser_ie8 #o_offcanvas_right{right:0px}
\ No newline at end of file
+@media (max-width: 767px){.o_toolbar .o_tool_next,.o_toolbar .o_tool_previous{margin-top:0}.o_toolbar .o_tool_next i,.o_toolbar .o_tool_previous i{font-size:20px}}.o_toolbar .o_tool_previous{margin-left:10px;border-bottom-left-radius:4px;border-top-left-radius:4px;border-right:0}.o_toolbar .o_tool_next{border-bottom-right-radius:4px;border-top-right-radius:4px}.o_toolbar .o_tool_dropdown{margin:0 10px}.o_toolbar .o_tool_dropdown:first-child{margin-left:0}.o_toolbar .o_tool_dropdown:last-child{margin-right:0}.o_toolbar .o_tool_dropdown a.dropdown-toggle{position:relative}.o_toolbar .o_tool_dropdown a.dropdown-toggle i{font-size:18px}.o_toolbar .o_tool_dropdown a.dropdown-toggle span{display:block;font-size:12px}.o_toolbar .o_tool_dropdown a.dropdown-toggle .o_icon_caret{position:absolute;right:50%;top:4px;margin-right:-20px;font-size:14px}@media (min-width: 767px) and (max-width: 991px){.o_toolbar .o_tool_dropdown a.dropdown-toggle i{font-size:16px}.o_toolbar .o_tool_dropdown a.dropdown-toggle span,.o_toolbar .o_tool_dropdown a.dropdown-toggle .o_icon_caret{font-size:11px}.o_toolbar .o_tool_dropdown a.dropdown-toggle .o_icon_caret{top:4px;margin-right:-18px;font-size:12px}}@media (max-width: 767px){.o_toolbar .o_tool_dropdown a.dropdown-toggle{padding:0 10px 0 5px}.o_toolbar .o_tool_dropdown a.dropdown-toggle i{font-size:20px}.o_toolbar .o_tool_dropdown a.dropdown-toggle span{display:none}}.o_toolbar .o_tool_dropdown .dropdown-menu{text-align:left}.o_toolbar .o_tools_left{float:left}.o_toolbar .o_tools_right{float:right}.o_toolbar .o_tools_right_edge{float:right}.o_toolbar .o_tools_center{float:both;width:50%;margin-left:auto;margin-right:auto}.o_toolbar .o_tools_segments{margin:0 auto -1.1em auto}.o_toolbar .o_tools_segments.o_tools_segments_alone{margin-top:1.5em}@media (max-width: 991px){.o_toolbar .o_tools{margin-top:6px;margin-bottom:4px}.o_toolbar .o_tools.o_tools_segments{margin:0 auto -1.1em auto}.o_toolbar .o_tool span{max-width:10em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_toolbar .o_tools_segments .o_tool span{display:block}.o_toolbar .o_tool,.o_toolbar .o_text,.o_toolbar .o_tool_dropdown{margin:0 5px}}@media (max-width: 767px){.o_toolbar .o_tools{margin-top:6px;margin-bottom:4px}.o_toolbar .o_tools .o_chelp{top:0;vertical-align:top}.o_toolbar .o_tools.o_tools_segments{margin:0 auto -1.1em auto;text-align:center}.o_toolbar .o_tools_center{float:left}.o_toolbar .o_tool,.o_toolbar .o_text,.o_toolbar .o_tool_dropdown{margin:0 0;position:static}.o_toolbar .o_tool_dropdown .dropdown-menu{left:0px;right:0px}.o_toolbar .o_tool_dropdown .dropdown-menu a,.o_toolbar .o_tool_dropdown .dropdown-menu i{line-height:30px}.o_toolbar .o_tool_dropdown .dropdown-menu .o_navbar_tab_close{line-height:inherit}}#o_main_container .o_toolbar_message{display:table;margin:0 auto 20px auto}#o_main_container .o_toolbar_message.o_warning{padding-top:5px;padding-bottom:5px;border:1px solid #8a6d3b;border-radius:3px}.o_edit_mode .o_toolbar .o_tools_container{background:repeating-linear-gradient(300deg, #fff0d9, #fff0d9 10px, #fcfcfc 10px, #fcfcfc 20px)}.o_edit_mode .o_toolbar .o_edit_mode .o_tools_container{background:#f8f8f8}body{overflow-x:hidden}.o_container_offcanvas{position:relative;max-width:1324px;-webkit-transition:all .25s ease-in-out;-moz-transition:all .25s ease-in-out;-o-transition:all .25s ease-in-out;-m-transition:all .25s ease-in-out;transition:all .25s ease-in-out}#o_offcanvas_right{position:absolute;top:0;right:-250px;width:250px;padding:15px 15px;background-color:#222;color:#9d9d9d;border:1px solid #090909;-webkit-box-shadow:0px 0px 4px 3px rgba(0,0,0,0.25);box-shadow:0px 0px 4px 3px rgba(0,0,0,0.25);min-height:100%;z-index:10;display:none}#o_offcanvas_right:before,#o_offcanvas_right:after{content:" ";display:table}#o_offcanvas_right:after{clear:both}@media screen and (max-width: 767px){.row-offcanvas{position:relative;-webkit-transition:all .25s ease-out;-moz-transition:all .25s ease-out;transition:all .25s ease-out}.row-offcanvas-right{right:0}.row-offcanvas-right .sidebar-offcanvas{right:-50%}.row-offcanvas-right.active{right:50%}.row-offcanvas-left{left:0}.row-offcanvas-left .sidebar-offcanvas{left:-50%}.row-offcanvas-left.active{left:50%}.sidebar-offcanvas{position:absolute;top:0;width:50%}}.o_info,.b_info,p.b_info,div.b_info,.o_form .o_info,.o_togglebox_wrapper div.o_togglebox_content,div.o_qti_item_itemfeedback,.o_assessmentitem_wrapper .modalFeedback .o_info{margin:20px 0;padding:20px;border-left:3px solid #777;background-color:#eee}.o_info h2,.o_info h3,.o_info h4,.o_info .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_info h2,.o_info h5,.b_info h2,.o_form .o_info h2,.o_togglebox_wrapper div.o_togglebox_content h2,div.o_qti_item_itemfeedback h2,.o_assessmentitem_wrapper .modalFeedback .o_info h2,.b_info h3,.o_form .o_info h3,.o_togglebox_wrapper div.o_togglebox_content h3,div.o_qti_item_itemfeedback h3,.o_assessmentitem_wrapper .modalFeedback .o_info h3,.b_info h4,.o_form .o_info h4,.o_togglebox_wrapper div.o_togglebox_content h4,div.o_qti_item_itemfeedback h4,.o_assessmentitem_wrapper .modalFeedback .o_info h4,.b_info .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_info h2,.o_form .o_info .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_form .o_info h2,.o_togglebox_wrapper div.o_togglebox_content .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_togglebox_wrapper div.o_togglebox_content h2,div.o_qti_item_itemfeedback .o_cal .fc-header-title h2,.o_cal .fc-header-title div.o_qti_item_itemfeedback h2,.o_assessmentitem_wrapper .modalFeedback .o_info .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_assessmentitem_wrapper .modalFeedback .o_info h2,.b_info h5,.o_form .o_info h5,.o_togglebox_wrapper div.o_togglebox_content h5,div.o_qti_item_itemfeedback h5,.o_assessmentitem_wrapper .modalFeedback .o_info h5{color:#777}.o_note,.b_note,p.b_note,div.b_note,.o_form .o_desc,.o_course_run .o_statusinfo,.o_course_stats .o_desc,.o_assessmentitem_wrapper .modalFeedback .o_info.o_empty_modal_feedback,.o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_comment{margin:20px 0;padding:20px;border-left:3px solid #31708f;background-color:#d9edf7}.o_note h2,.o_note h3,.o_note h4,.o_note .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_note h2,.o_note h5,.b_note h2,.o_form .o_desc h2,.o_course_run .o_statusinfo h2,.o_course_stats .o_desc h2,.o_assessmentitem_wrapper .modalFeedback .o_info.o_empty_modal_feedback h2,.o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_comment h2,.b_note h3,.o_form .o_desc h3,.o_course_run .o_statusinfo h3,.o_course_stats .o_desc h3,.o_assessmentitem_wrapper .modalFeedback .o_info.o_empty_modal_feedback h3,.o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_comment h3,.b_note h4,.o_form .o_desc h4,.o_course_run .o_statusinfo h4,.o_course_stats .o_desc h4,.o_assessmentitem_wrapper .modalFeedback .o_info.o_empty_modal_feedback h4,.o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_comment h4,.b_note .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_note h2,.o_form .o_desc .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_form .o_desc h2,.o_course_run .o_statusinfo .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_course_run .o_statusinfo h2,.o_course_stats .o_desc .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_course_stats .o_desc h2,.o_assessmentitem_wrapper .modalFeedback .o_info.o_empty_modal_feedback .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_assessmentitem_wrapper .modalFeedback .o_info.o_empty_modal_feedback h2,.o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_comment .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_comment h2,.b_note h5,.o_form .o_desc h5,.o_course_run .o_statusinfo h5,.o_course_stats .o_desc h5,.o_assessmentitem_wrapper .modalFeedback .o_info.o_empty_modal_feedback h5,.o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_comment h5{color:#31708f}.o_important,.b_important,p.b_important,div.b_important,.o_bc_empty,.o_course_run .o_no_scoreinfo{margin:20px 0;padding:20px;border-left:3px solid #F4D000;background-color:#FFF1A4}.o_important h2,.o_important h3,.o_important h4,.o_important .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_important h2,.o_important h5,.b_important h2,.o_bc_empty h2,.o_course_run .o_no_scoreinfo h2,.b_important h3,.o_bc_empty h3,.o_course_run .o_no_scoreinfo h3,.b_important h4,.o_bc_empty h4,.o_course_run .o_no_scoreinfo h4,.b_important .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_important h2,.o_bc_empty .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_bc_empty h2,.o_course_run .o_no_scoreinfo .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_course_run .o_no_scoreinfo h2,.b_important h5,.o_bc_empty h5,.o_course_run .o_no_scoreinfo h5{color:#F4D000}.o_success,.b_success,p.b_success,div.b_success,.o_assessmentitem_wrapper .modalFeedback .o_info.o_correct_modal_feedback{margin:20px 0;padding:20px;border-left:3px solid #3c763d;background-color:#dff0d8}.o_success h2,.o_success h3,.o_success h4,.o_success .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_success h2,.o_success h5,.b_success h2,.o_assessmentitem_wrapper .modalFeedback .o_info.o_correct_modal_feedback h2,.b_success h3,.o_assessmentitem_wrapper .modalFeedback .o_info.o_correct_modal_feedback h3,.b_success h4,.o_assessmentitem_wrapper .modalFeedback .o_info.o_correct_modal_feedback h4,.b_success .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_success h2,.o_assessmentitem_wrapper .modalFeedback .o_info.o_correct_modal_feedback .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_assessmentitem_wrapper .modalFeedback .o_info.o_correct_modal_feedback h2,.b_success h5,.o_assessmentitem_wrapper .modalFeedback .o_info.o_correct_modal_feedback h5{color:#3c763d}.o_warning,.b_warning,p.b_warning,div.b_warning,.o_instruction,.o_form .o_warning,p.o_gta_reopen_warning{margin:20px 0;padding:20px;border-left:3px solid #8a6d3b;background-color:#fcf8e3}.o_warning h2,.o_warning h3,.o_warning h4,.o_warning .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_warning h2,.o_warning h5,.b_warning h2,.o_instruction h2,.o_form .o_warning h2,p.o_gta_reopen_warning h2,.b_warning h3,.o_instruction h3,.o_form .o_warning h3,p.o_gta_reopen_warning h3,.b_warning h4,.o_instruction h4,.o_form .o_warning h4,p.o_gta_reopen_warning h4,.b_warning .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_warning h2,.o_instruction .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_instruction h2,.o_form .o_warning .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_form .o_warning h2,p.o_gta_reopen_warning .o_cal .fc-header-title h2,.o_cal .fc-header-title p.o_gta_reopen_warning h2,.b_warning h5,.o_instruction h5,.o_form .o_warning h5,p.o_gta_reopen_warning h5{color:#8a6d3b}.o_error,.b_error,p.b_error,div.b_error,.o_assessmentitem_wrapper .modalFeedback .o_info.o_incorrect_modal_feedback{margin:20px 0;padding:20px;border-left:3px solid #a94442;background-color:#f2dede}.o_error h2,.o_error h3,.o_error h4,.o_error .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_error h2,.o_error h5,.b_error h2,.o_assessmentitem_wrapper .modalFeedback .o_info.o_incorrect_modal_feedback h2,.b_error h3,.o_assessmentitem_wrapper .modalFeedback .o_info.o_incorrect_modal_feedback h3,.b_error h4,.o_assessmentitem_wrapper .modalFeedback .o_info.o_incorrect_modal_feedback h4,.b_error .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_error h2,.o_assessmentitem_wrapper .modalFeedback .o_info.o_incorrect_modal_feedback .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_assessmentitem_wrapper .modalFeedback .o_info.o_incorrect_modal_feedback h2,.b_error h5,.o_assessmentitem_wrapper .modalFeedback .o_info.o_incorrect_modal_feedback h5{color:#a94442}.o_instruction{margin-top:0px;border-left:none;padding-top:10px;padding-bottom:10px}.o_instruction>.o_button_group{margin-bottom:0px}div.o_callout_overlay{position:fixed;top:0;left:0;width:100%;height:100%;zoom:1;background:#000;opacity:0;filter:alpha(opacity=0)}.o_alert_info{position:fixed;top:-100%;left:0;display:none;z-index:2000;width:100%;text-align:center}.o_alert_info .alert{position:relative;width:auto;margin:0 auto;text-align:left;-webkit-box-shadow:0px 1px 5px -1px rgba(0,0,0,0.15);box-shadow:0px 1px 5px -1px rgba(0,0,0,0.15)}.o_alert_info .alert .o_alert_close{float:right;color:#777}.o_alert_info .alert .o_alert_close:hover{color:#555}@media (min-width: 768px){.o_alert_info .alert{width:600px}}#o_msg_sticky,#o_msg_sticky_preview{position:relative;color:#a94442;background-color:#f2dede;border:1px solid #ebccd1;padding:10px 16px 10px 60px;min-height:40px;margin:-20px 0 20px 0}#o_msg_sticky .o_icon_info_msg,#o_msg_sticky_preview .o_icon_info_msg{position:absolute;left:10px;top:5px;font-size:40px}#o_msg_sticky.o_msg_sticky_fullscreen,#o_msg_sticky_preview.o_msg_sticky_fullscreen{margin-top:0}@media (min-width: 768px){.modal .o_modal_fullwidth{width:90%}}@media (min-width: 992px){.modal .o_modal_fullwidth{width:80%}}.modal .modal-header h4,.modal .modal-header .o_cal .fc-header-title h2,.o_cal .fc-header-title .modal .modal-header h2{color:#337ab7;font-weight:500;font-family:inherit;line-height:1.1}.o_tree{position:relative;display:block;background-color:none;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;overflow:hidden;font-size:14px}.o_tree a{color:#777;background-color:none}.o_tree a:hover,.o_tree a:focus{color:#333}.o_tree .o_tree_link{background-color:none}.o_tree .o_tree_link:hover,.o_tree .o_tree_link:focus{background-color:#f8f8f8}.o_tree .o_tree_link:first-child{background-color:transparent}.o_tree .o_tree_link:last-child:hover,.o_tree .o_tree_link:last-child:focus{background-color:#f8f8f8}.o_tree .o_insertion_point>a>span{padding:5px;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.o_tree .o_insertion_source>a>span.o_tree_item,.o_tree .o_insertion_source>a>span.o_dnd_item{border-bottom:solid #f90 4px;background-color:#fefbf6}.o_tree ul{margin:0;padding:0;list-style-type:none}.o_tree ul li{margin:0;padding:0;white-space:nowrap}.o_tree ul li div{position:relative;margin-bottom:-1px;border-bottom:1px solid #ddd}.o_tree ul li div.popover{position:absolute;left:auto;right:0}.o_tree ul li div a.o_tree_oc_l0{position:absolute;top:10px;left:-4px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l0,.o_tree ul .o_tree_level_close.b_tree_oc_l0{z-index:10}.o_tree ul li div a.o_tree_oc_l1{position:absolute;top:10px;left:11px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l1,.o_tree ul .o_tree_level_close.b_tree_oc_l1{z-index:10}.o_tree ul li div a.o_tree_oc_l2{position:absolute;top:10px;left:26px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l2,.o_tree ul .o_tree_level_close.b_tree_oc_l2{z-index:10}.o_tree ul li div a.o_tree_oc_l3{position:absolute;top:10px;left:41px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l3,.o_tree ul .o_tree_level_close.b_tree_oc_l3{z-index:10}.o_tree ul li div a.o_tree_oc_l4{position:absolute;top:10px;left:56px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l4,.o_tree ul .o_tree_level_close.b_tree_oc_l4{z-index:10}.o_tree ul li div a.o_tree_oc_l5{position:absolute;top:10px;left:71px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l5,.o_tree ul .o_tree_level_close.b_tree_oc_l5{z-index:10}.o_tree ul li div a.o_tree_oc_l6{position:absolute;top:10px;left:86px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l6,.o_tree ul .o_tree_level_close.b_tree_oc_l6{z-index:10}.o_tree ul li div a.o_tree_oc_l7{position:absolute;top:10px;left:101px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l7,.o_tree ul .o_tree_level_close.b_tree_oc_l7{z-index:10}.o_tree ul li div a.o_tree_oc_l8{position:absolute;top:10px;left:116px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l8,.o_tree ul .o_tree_level_close.b_tree_oc_l8{z-index:10}.o_tree ul li div a.o_tree_oc_l9{position:absolute;top:10px;left:131px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l9,.o_tree ul .o_tree_level_close.b_tree_oc_l9{z-index:10}.o_tree ul li div a.o_tree_oc_l10{position:absolute;top:10px;left:146px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l10,.o_tree ul .o_tree_level_close.b_tree_oc_l10{z-index:10}.o_tree ul li div a.o_tree_oc_l11{position:absolute;top:10px;left:161px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l11,.o_tree ul .o_tree_level_close.b_tree_oc_l11{z-index:10}.o_tree ul li div span.o_tree_l0{display:block;padding:10px 2px 10px 10px;z-index:9}.o_tree ul li div span.o_tree_l1{display:block;padding:10px 2px 10px 25px;z-index:9}.o_tree ul li div span.o_tree_l2{display:block;padding:10px 2px 10px 40px;z-index:9}.o_tree ul li div span.o_tree_l3{display:block;padding:10px 2px 10px 55px;z-index:9}.o_tree ul li div span.o_tree_l4{display:block;padding:10px 2px 10px 70px;z-index:9}.o_tree ul li div span.o_tree_l5{display:block;padding:10px 2px 10px 85px;z-index:9}.o_tree ul li div span.o_tree_l6{display:block;padding:10px 2px 10px 100px;z-index:9}.o_tree ul li div span.o_tree_l7{display:block;padding:10px 2px 10px 115px;z-index:9}.o_tree ul li div span.o_tree_l8{display:block;padding:10px 2px 10px 130px;z-index:9}.o_tree ul li div span.o_tree_l9{display:block;padding:10px 2px 10px 145px;z-index:9}.o_tree ul li div span.o_tree_l10{display:block;padding:10px 2px 10px 160px;z-index:9}.o_tree ul li div span.o_tree_l11{display:block;padding:10px 2px 10px 175px;z-index:9}.o_tree ul span.o_tree_leaf{display:none}.o_tree ul span.o_tree_link>input[type=checkbox]{margin-right:5px}.o_tree ul li .badge{position:absolute;font-size:70%}.o_tree ul li .badge:before{content:none}.o_tree ul li .badge.o_badge_1{top:3px;right:1px}.o_tree ul li .badge.o_badge_2{bottom:3px;right:1px}.o_tree ul li .badge.o_badge_3{top:3px;right:25px}.o_tree ul li .badge.o_badge_4{bottom:3px;right:25px}.o_tree ul li div.o_dnd_sibling{margin:0;padding:0;border-bottom:none}.o_tree ul li .active.o_tree_link{background-color:none;font-weight:bold}.o_tree ul li .active.o_tree_link a{color:#337ab7}.o_tree ul li .active.o_tree_link:hover,.o_tree ul li .active.o_tree_link:focus{background-color:#eee}.o_tree ul li .active.o_tree_link:hover a,.o_tree ul li .active.o_tree_link:focus a{color:#23527c}.o_tree ul li .active_parent.o_tree_link{font-weight:bold}.o_tree ul li .active_parent.o_tree_link a{color:#777}.o_tree ul li .active_parent.o_tree_link a:hover,.o_tree ul li .active_parent.o_tree_link a:focus{color:#333}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l0{left:6px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l1{left:21px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l2{left:36px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l3{left:51px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l4{left:66px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l5{left:81px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l6{left:96px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l7{left:111px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l8{left:126px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l9{left:141px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l10{left:156px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l11{left:171px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l0{padding:10px 2px 10px 20px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l1{padding:10px 2px 10px 35px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l2{padding:10px 2px 10px 50px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l3{padding:10px 2px 10px 65px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l4{padding:10px 2px 10px 80px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l5{padding:10px 2px 10px 95px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l6{padding:10px 2px 10px 110px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l7{padding:10px 2px 10px 125px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l8{padding:10px 2px 10px 140px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l9{padding:10px 2px 10px 155px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l10{padding:10px 2px 10px 170px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l11{padding:10px 2px 10px 185px}.o_tree .o_dnd_item{cursor:move;z-index:100}.o_tree .o_dnd_proxy{opacity:.4;filter:alpha(opacity=40);background-color:#f0ad4e;padding:5px 10px 5px 10px;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.o_tree .o_dnd_item.o_dnd_over{background-color:#ffff60}.o_tree .o_dnd_sibling{height:7px;width:100%}.o_tree .o_dnd_sibling.o_dnd_over{background:transparent url(../light/images/arrow_dd.png) top left no-repeat}.o_tree .o_dnd_l1{margin-left:0 !important}.o_tree .o_dnd_l2{margin-left:1em !important}.o_tree .o_dnd_l3{margin-left:2em !important}.o_tree .o_dnd_l4{margin-left:3em !important}.o_tree .o_dnd_l5{margin-left:4em !important}.o_tree .o_dnd_l6{margin-left:5em !important}.o_tree .o_dnd_l7{margin-left:6em !important}.o_tree .o_dnd_l8{margin-left:7em !important}.o_tree .o_dnd_l9{margin-left:8em !important}.o_tree .o_dnd_l10{margin-left:9em !important}.o_tree .o_dnd_l11{margin-left:10em !important}.o_tree.o_tree_insert_tool span.o_tree_link a{display:block}.o_offcanvas .o_tree{border:0}.o_selection_tree{position:relative;display:block;background-color:none;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;overflow:hidden;font-size:14px}.o_selection_tree ul{margin:0;padding:0;list-style-type:none}.o_selection_tree li{margin:0;padding:0;white-space:nowrap}.o_selection_tree li div{position:relative;margin-bottom:-1px;border-bottom:1px solid #ddd}.o_selection_tree li>div>span.o_tree_l0,.o_selection_tree li>div>div.checkbox.o_tree_l0,.o_selection_tree li>div>div.radio.o_tree_l0{display:block;padding:10px 2px 10px 10px;z-index:9}.o_selection_tree li>div>span.o_tree_l1,.o_selection_tree li>div>div.checkbox.o_tree_l1,.o_selection_tree li>div>div.radio.o_tree_l1{display:block;padding:10px 2px 10px 25px;z-index:9}.o_selection_tree li>div>span.o_tree_l2,.o_selection_tree li>div>div.checkbox.o_tree_l2,.o_selection_tree li>div>div.radio.o_tree_l2{display:block;padding:10px 2px 10px 40px;z-index:9}.o_selection_tree li>div>span.o_tree_l3,.o_selection_tree li>div>div.checkbox.o_tree_l3,.o_selection_tree li>div>div.radio.o_tree_l3{display:block;padding:10px 2px 10px 55px;z-index:9}.o_selection_tree li>div>span.o_tree_l4,.o_selection_tree li>div>div.checkbox.o_tree_l4,.o_selection_tree li>div>div.radio.o_tree_l4{display:block;padding:10px 2px 10px 70px;z-index:9}.o_selection_tree li>div>span.o_tree_l5,.o_selection_tree li>div>div.checkbox.o_tree_l5,.o_selection_tree li>div>div.radio.o_tree_l5{display:block;padding:10px 2px 10px 85px;z-index:9}.o_selection_tree li>div>span.o_tree_l6,.o_selection_tree li>div>div.checkbox.o_tree_l6,.o_selection_tree li>div>div.radio.o_tree_l6{display:block;padding:10px 2px 10px 100px;z-index:9}.o_selection_tree li>div>span.o_tree_l7,.o_selection_tree li>div>div.checkbox.o_tree_l7,.o_selection_tree li>div>div.radio.o_tree_l7{display:block;padding:10px 2px 10px 115px;z-index:9}.o_selection_tree li>div>span.o_tree_l8,.o_selection_tree li>div>div.checkbox.o_tree_l8,.o_selection_tree li>div>div.radio.o_tree_l8{display:block;padding:10px 2px 10px 130px;z-index:9}.o_selection_tree li>div>span.o_tree_l9,.o_selection_tree li>div>div.checkbox.o_tree_l9,.o_selection_tree li>div>div.radio.o_tree_l9{display:block;padding:10px 2px 10px 145px;z-index:9}.o_selection_tree li>div>span.o_tree_l10,.o_selection_tree li>div>div.checkbox.o_tree_l10,.o_selection_tree li>div>div.radio.o_tree_l10{display:block;padding:10px 2px 10px 160px;z-index:9}.o_selection_tree li>div>span.o_tree_l11,.o_selection_tree li>div>div.checkbox.o_tree_l11,.o_selection_tree li>div>div.radio.o_tree_l11{display:block;padding:10px 2px 10px 175px;z-index:9}.o_breadcrumb{position:relative}.o_breadcrumb .o_breadcrumb_close{float:right;position:relative;margin:0 0 0 15px;vertical-align:middle}.o_breadcrumb .o_breadcrumb_close a{line-height:15px;color:#d9534f}.o_breadcrumb .o_breadcrumb_close a:hover{color:#b52b27}.o_breadcrumb .o_breadcrumb_close a i{font-size:16px}.o_breadcrumb .o_breadcrumb_close a span{display:none}.o_breadcrumb .o_breadcrumb_close:before{content:none}.o_form .o_icon_mandatory{margin-right:0.25em}.o_form .o_form_chelp{padding-left:0.25em;margin-right:-1.25em}.o_form .o_form_example{font-size:90%}.o_form .o_error{margin-top:1px;margin-bottom:0;padding:10px}.o_form hr.o_spacer_noline{border-top:1px solid transparent}.o_form hr.o_spacer.form,.o_form hr.o_spacer_noline.form{margin-top:0px;margin-bottom:0px}.o_form .form-group.o_omit_margin{margin-bottom:0}.o_form .o_date{position:relative;padding-right:34px}.o_form .o_date.form-inline .form-group,.o_form .o_date.o_navbar-form .form-group{margin-left:0}.o_form input.o_date_ms{width:3em}.o_form .o_date.form-inline .o_date_ms.form-group,.o_form .o_date.o_navbar-form .o_date_ms.form-group{margin-left:25px}.o_form .has-feedback .o_date.form-inline .form-control.o_date_ms,.o_form .has-feedback .o_date.o_navbar-form .form-control.o_date_ms{padding-right:0}.o_form .o_form_element.form-inline .o_form_element.form-group,.o_form .o_form_element.o_navbar-form .o_form_element.form-group{margin-left:25px}.o_form .input-group.o_date_picker{width:12em}.o_form .o_filepreview{margin-bottom:10px}.o_form .o_fileinput{cursor:pointer;position:relative}.o_form .o_fileinput .o_fakechooser{position:relative;z-index:1}.o_form .o_fileinput .o_realchooser{position:absolute;top:0;right:0;z-index:2;opacity:0;filter:alpha(opacity=0)}.o_form .o_fileinput .o_realchooser.o_chooser_with_delete{right:38px}.o_form .o_fileElement.has-error .o_icon_error.form-control-feedback{display:none}.o_form .form-control.textarea.o_fixed_font_with{resize:vertical !important;font-family:Menlo,Monaco,Consolas,"Courier New",monospace}.o_form .form-control.textarea_disabled.o_fixed_font_with{white-space:pre-wrap;height:auto;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;color:#555 !important;background:#fafafa}.o_form .form-control.textarea_disabled{resize:both;overflow:auto;white-space:pre-wrap;background:#fafafa}.o_centered_form{text-align:center}.o_centered_form fieldset.o_form{display:inline-block;text-align:left}.o_choice_checkrow,.o_choice_textrow{vertical-align:text-top;padding-bottom:2px}.o_choice_textrow{padding-left:1em}.o_togglecheck a{white-space:nowrap}.o_catalog .o_catalog_delete_img{position:relative;top:-0.5em}.o_button_dirty{color:#fff;background-color:#f0ad4e;border-color:#eea236}.o_button_dirty:hover,.o_button_dirty:focus,.o_button_dirty.focus,.o_button_dirty:active,.o_button_dirty.active,.open>.o_button_dirty.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.o_button_dirty:active,.o_button_dirty.active,.open>.o_button_dirty.dropdown-toggle{background-image:none}.o_button_dirty.disabled,.o_button_dirty.disabled:hover,.o_button_dirty.disabled:focus,.o_button_dirty.disabled.focus,.o_button_dirty.disabled:active,.o_button_dirty.disabled.active,.o_button_dirty[disabled],.o_button_dirty[disabled]:hover,.o_button_dirty[disabled]:focus,.o_button_dirty[disabled].focus,.o_button_dirty[disabled]:active,.o_button_dirty[disabled].active,fieldset[disabled] .o_button_dirty,fieldset[disabled] .o_button_dirty:hover,fieldset[disabled] .o_button_dirty:focus,fieldset[disabled] .o_button_dirty.focus,fieldset[disabled] .o_button_dirty:active,fieldset[disabled] .o_button_dirty.active{background-color:#f0ad4e;border-color:#eea236}.o_button_dirty .badge{color:#f0ad4e;background-color:#fff}.o_button_toggle{border:1px solid #777;border-top-right-radius:9px;border-top-left-radius:9px;border-bottom-right-radius:9px;border-bottom-left-radius:9px;background:#eee;display:inline-block;height:18px;line-height:16px;font-size:16px;text-align:left;padding:0 0.5em 0 1px;margin:0}.o_button_toggle i{color:#777;text-shadow:1px 0 2px rgba(0,0,0,0.25)}.o_button_toggle span{line-height:16px;vertical-align:top;font-size:60%;color:#777;text-transform:uppercase}.o_button_toggle.o_on{text-align:right;padding:0 1px 0 0.5em}.o_button_toggle.o_on i{color:#337ab7;text-shadow:-1px 0 2px rgba(0,0,0,0.25)}.o_table_wrapper{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.o_table_wrapper.o_table_flexi .o_table_body{margin-top:20px}.o_table_wrapper.o_table_flexi .table{margin-top:20px}.o_table_wrapper.o_table_flexi .table td ul{margin:0}.o_table_wrapper.o_table_flexi.o_table_no_margin .table{margin:0}.o_table_wrapper.o_table_flexi tfoot{border-top:solid #ddd 2px}.o_table_wrapper.o_table_edit table tbody{border-top:solid #f90 4px;background-color:#fefbf6}.o_table_wrapper .o_table_search{max-width:50em}.o_table_wrapper .o_table_footer .o_table_pagination{text-align:center}.o_table_wrapper .o_table_rows_infos{float:left;padding-left:0;padding-right:20px;margin:20px 0}.o_table_wrapper .o_row_selected td{background-color:#dff0d8 !important}.o_table_wrapper .o_table{margin-bottom:0}.o_table_wrapper .o_marked{font-weight:bold}.o_table_wrapper .table{margin-bottom:0}.o_table_wrapper th a,.o_table_wrapper th a:hover{color:#333;text-decoration:none}.o_table_search a.btn.o_reset_quick_search{width:38px;margin-left:-38px;z-index:5;color:grey}.o_breadcrumb.o_table_flexi_breadcrumb ol.breadcrumb{margin:5px 0 0 0}div.o_table_flexi div.o_table_flexi_leaf{margin-left:1.55em}div.o_table_flexi div.o_table_flexi_l0{padding-left:0px}div.o_table_flexi div.o_table_flexi_l1{padding-left:15px}div.o_table_flexi div.o_table_flexi_l2{padding-left:30px}div.o_table_flexi div.o_table_flexi_l3{padding-left:45px}div.o_table_flexi div.o_table_flexi_l4{padding-left:60px}div.o_table_flexi div.o_table_flexi_l5{padding-left:75px}div.o_table_flexi div.o_table_flexi_l6{padding-left:90px}div.o_table_flexi div.o_table_flexi_l7{padding-left:105px}div.o_table_flexi div.o_table_flexi_l8{padding-left:120px}div.o_table_flexi div.o_table_flexi_l9{padding-left:135px}div.o_table_flexi div.o_table_flexi_l10{padding-left:150px}div.o_table_flexi div.o_table_flexi_l11{padding-left:165px}@media (max-width: 767px){.o_table_wrapper .o_table_rows_infos{clear:both}}a.o_orderby,a.o_orderby:hover{color:#333;text-decoration:none}a.o_orderby.o_orderby_asc,a.o_orderby.o_orderby_desc,a.o_orderby:hover.o_orderby_asc,a.o_orderby:hover.o_orderby_desc{border-bottom:1px solid #ddd}.o_table_row_count{padding-top:6px;padding-bottom:6px;vertical-align:middle}.o_table_row_details td{background-color:white !important}.o_table_config{font-size:12px}.o_table_buttons{text-align:center}.o_table_buttons input{margin-right:1em}.o_table_buttons input:last-child{margin-right:0}.o_table_tools{margin-left:6px}.o_table_tools_indications{margin-left:10px;padding-top:3px;font-size:80%}.o_table_tools_indications a{color:#d9534f}.o_table_toolbar_left .o_table_tools_indications{text-align:right}.o_table_count{max-width:20em;float:left;padding:0 15px}.o_info .table-bordered td,o_note .table-bordered td,o_important .table-bordered td,o_warning .table-bordered td,o_error .table-bordered td{border-color:#333}.panel .o_table_layout{border-top:1px solid #ddd;padding-top:6px}.panel .o_table_count{padding:0 15px}#o_navbar_imclient .o_im_messages{float:left}#o_navbar_imclient #o_im_message,#o_navbar_imclient #o_im_status,#o_navbar_imclient #o_im_summary{float:left;position:relative;padding:15px 3px}#o_navbar_imclient #o_im_status,#o_navbar_imclient #o_im_message{padding-left:15px}#o_navbar_imclient #o_im_summary .badge{color:#fff;background-color:#777}#o_navbar_imclient #o_im_status li>a>span{display:inline}#o_navbar_imclient #o_im_status div.o_chelp_wrapper{right:0.5em}#o_navbar_imclient #o_im_message a:hover,#o_navbar_imclient #o_im_message a:focus{text-decoration:none}#o_navbar_imclient #o_im_message .o_icon_message{color:#d9534f}#o_navbar_imclient #o_im_message .o_icon_message:hover{color:#f4c37d}.o_im_load_history{margin-bottom:6px}.o_im_load_history .o_label{font-size:12px;padding-right:0.5em;line-height:1.5em;color:#777}.o_im_chat_history{height:170px;font-size:90%;border:1px solid #eee;margin:0 0 1em 0;overflow:scroll;overflow-x:auto}.o_im_message_group{padding:3px 3px 3px 40px;min-height:40px;position:relative;border-top:1px solid #eee;background:#fff}.o_im_message_group.o_odd{background:#F4F4F4}.o_im_message_group .o_portrait{position:absolute;top:3px;left:3px}.o_im_message_group .o_im_from{color:#777;font-size:12px;font-weight:bold}.o_im_message_group .o_im_from:hover{color:#5e5e5e}.o_im_message_group div.o_im_body{padding:3px 0 3px 0;font-size:12px}.o_im_message_group div.o_im_body .o_date{float:right;color:#777;font-size:9px}.o_groupchat_roster{font-size:12px}.o_groupchat_roster li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333}.o_groupchat_roster li.o_vip{color:#3c763d}.o_groupchat_roster li.o_anonymous{color:#31708f}.o_im_buddieslist .o_im_buddieslist_toggler .btn{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_im_buddieslist ul{font-size:12px}.o_im_buddieslist ul ul{padding-left:1em}.o_im_buddieslist ul a{color:#337ab7}.o_im_buddieslist ul a:hover{color:#23527c}.o_flag{position:relative;top:1px;display:inline-block;line-height:1;width:16px;height:16px;background-repeat:no-repeat;background-position:0 100%}option.o_with_flag{padding-left:23px;min-height:16px;background-repeat:no-repeat;background-position:2px 50%}.o_flag_en{background-image:url("../light/images/flags/gb.png")}.o_flag_de{background-image:url("../light/images/flags/de.png")}.o_flag_fr{background-image:url("../light/images/flags/fr.png")}.o_flag_it{background-image:url("../light/images/flags/it.png")}.o_flag_es{background-image:url("../light/images/flags/es.png")}.o_flag_da{background-image:url("../light/images/flags/dk.png")}.o_flag_cs{background-image:url("../light/images/flags/cz.png")}.o_flag_el{background-image:url("../light/images/flags/gr.png")}.o_flag_ee{background-image:url("../light/images/flags/ee.png")}.o_flag_ru{background-image:url("../light/images/flags/ru.png")}.o_flag_pl{background-image:url("../light/images/flags/pl.png")}.o_flag_zh_CN{background-image:url("../light/images/flags/cn.png")}.o_flag_zh_TW{background-image:url("../light/images/flags/tw.png")}.o_flag_lt{background-image:url("../light/images/flags/lt.png")}.o_flag_fa{background-image:url("../light/images/flags/ir.png")}.o_flag_pt_PT{background-image:url("../light/images/flags/pt.png")}.o_flag_pt_BR{background-image:url("../light/images/flags/br.png")}.o_flag_tr{background-image:url("../light/images/flags/tr.png")}.o_flag_hu{background-image:url("../light/images/flags/hu.png")}.o_flag_sq{background-image:url("../light/images/flags/al.png")}.o_flag_in{background-image:url("../light/images/flags/id.png")}.o_flag_ar{background-image:url("../light/images/flags/eg.png")}.o_flag_rm{background-image:url("../light/images/flags/rm.png")}.o_flag_af{background-image:url("../light/images/flags/za.png")}.o_flag_vi{background-image:url("../light/images/flags/vn.png")}.o_flag_mn{background-image:url("../light/images/flags/mn.png")}.o_flag_iw{background-image:url("../light/images/flags/il.png")}.o_flag_ko{background-image:url("../light/images/flags/kr.png")}.o_flag_nl_NL{background-image:url("../light/images/flags/nl.png")}.o_flag_jp{background-image:url("../light/images/flags/jp.png")}.o_flag_nb_NO{background-image:url("../light/images/flags/no.png")}.o_flag_et_EE{background-image:url("../light/images/flags/ee.png")}.o_flag_bg{background-image:url("../light/images/flags/bg.png")}.o_flag_hi_IN_ASIA{background-image:url("../light/images/flags/in.png")}.o_flag_ar_LB{background-image:url("../light/images/flags/lb.png")}.o_flag_gl_ES{background-image:url("../light/images/flags/galicia.png")}.o_flag_sk{background-image:url("../light/images/flags/sk.png")}.o_rating .o_rating_title{font-size:12px}.o_rating .o_rating_items{white-space:nowrap}.o_rating .o_rating_items .o_icon{color:#f0ad4e}.o_rating .o_rating_items .o_legend{margin-left:1em;font-size:12px;line-height:normal}.o_rating.o_rating_personal .o_rating_items .o_icon{color:#337ab7}.o_rating .o_rating_explanation{font-size:12px;color:#777}@media (max-width: 991px){.o_rating .o_rating_title,.o_rating .o_rating_explanation{display:none}}.o_comments .o_comment_wrapper .o_avatar{float:left;margin:0 1em 0 0}.o_comments .o_comment_wrapper .o_reply,.o_comments .o_comment_wrapper .o_delete{float:right}.o_comments .o_comment_wrapper .o_comment_wrapper{margin-left:16px}.o_ratings_and_comments .o_rating_wrapper{vertical-align:middle;display:inline-block}.o_ratings_and_comments a.o_comments{margin-left:10px;position:relative;top:0.1em}.d3chart .bar{shape-rendering:crispEdges}.d3chart .bar_default_light{fill:#64a0d3}.d3chart .bar_default,.d3chart .bubble_default{fill:#337ab7}.d3chart .bar_default_dark{fill:#23527c}.d3chart .axis{font:12px sans-serif}.d3chart .axis path,.d3chart .axis line{fill:none;stroke:#000;shape-rendering:crispEdges}.o_forum_peekview .o_quote_wrapper,.o_forum_peekview .b_quote_wrapper{display:none}.o_forum_thread_sticky{font-weight:bold}.o_forum_switch{font-size:12px}.o_forum_toolbar{margin-bottom:6px;float:left}.o_forum_fulltextsearch{float:right}@media (max-width: 767px){.o_forum_fulltextsearch{float:left}.o_forum_toolbar .o_forum_tool span{display:none}}.o_forum{padding-bottom:50px}.o_forum .o_mark,.o_forum .o_ep_collect{float:right;position:relative;width:2em;margin-left:12px}.o_forum .o_portrait{float:left;margin-right:16px}.o_forum .o_portrait_avatar{width:70px;height:70px}.o_forum .o_newindicator{font-size:10px;color:#5cb85c;text-transform:uppercase;padding-left:1em;vertical-align:text-top;white-space:nowrap}.o_forum .o_author,.o_forum .o_date{display:inline-block;color:#777}.o_forum .o_date{font-size:12px}.o_forum .o_modified{color:#8a6d3b;font-size:12px;font-style:italic}.o_forum .o_forum_message{margin-bottom:20px;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1)}.o_forum .o_forum_message_new{-webkit-box-shadow:0 1px 10px rgba(92,184,92,0.3);box-shadow:0 1px 10px rgba(92,184,92,0.3)}.o_forum .o_forum_message_highlight{-webkit-box-shadow:0 1px 10px rgba(240,173,78,0.5);box-shadow:0 1px 10px rgba(240,173,78,0.5)}.o_forum .o_forum_message_header{padding:10px 15px;border-bottom:1px solid #ddd;background-color:#f5f5f5;border-top-right-radius:3px;border-top-left-radius:3px}.o_forum .o_forum_message_title{margin-top:0}.o_forum .o_forum_message_body{padding:10px 15px}.o_forum .o_forum_message_attachments{border-top:1px solid #ddd;padding:10px 15px;font-size:12px;background-color:#f7f7f9}.o_forum .o_attachment{position:relative;max-width:250px;vertical-align:top;margin:6px 12px 10px 0}.o_forum .o_attachment img{margin-top:6px}.o_forum .o_filename{max-width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_forum .o_icon_enlarge{position:absolute;left:1em;bottom:1em;text-shadow:1px 1px 2px #fff, -1px 1px 2px #fff, 1px -1px 2px #fff, -1px -1px 2px #fff}@media (min-width: 768px) and (max-width: 991px){.o_forum .o_attachments{font-size:10px}.o_forum .o_attachment{max-width:200px}.o_forum .o_attachment img{max-width:150px}.o_forum .o_filename{max-width:200px}}@media (max-width: 767px){.o_forum .o_attachments{font-size:9px}.o_forum .o_attachment{max-width:150px}.o_forum .o_attachment img{max-width:100px}.o_forum .o_filename{max-width:150px}}.o_quote_wrapper,.b_quote_wrapper{position:relative;margin:10px 0}.o_quote_author,.b_quote_author{color:#777;font-size:12px}.o_quote_author:before,.b_quote_author:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";font-size:21px;padding-right:0.5em}blockquote.o_quote,blockquote.b_quote{color:#555;font-size:12px;margin-top:6px;padding:0 12px}a.o_chelp{display:inline-block;padding:1px 3px;text-align:center;vertical-align:middle;white-space:nowrap;font-size:10px;font-weight:normal;line-height:15px;color:#fff;background-color:#337ab7;border:1px solid #2e6da4;border-radius:2px;cursor:help;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}a.o_chelp:active,a.o_chelp:hover,a.o_chelp:focus{text-decoration:none;color:#fff;background-color:#2a6598;border-color:#204d74}a.o_chelp i{font-size:10px !important}.o_chelp_wrapper{position:relative;float:right;display:inline-block;line-height:normal;margin-bottom:10px;margin-left:10px}.o_form_chelp,.o_chelp_tooltip{color:#737373}.o_draw_circle{border:4px solid #337ab7;border-radius:50%;position:absolute !important}.o_draw_rectangle{border:4px solid #337ab7;position:absolute !important}.o_iframedisplay iframe{width:100%}.o_singlepage .o_edit{position:absolute;top:10px;right:37px}.o_content_popup{position:absolute;top:10px;right:12px}.o_module_cp_wrapper .o_tools{position:absolute;top:10px;right:12px;text-align:right;vertical-align:middle}.o_module_cp_wrapper .o_tools .o_search_wrapper{display:inline-block;position:relative;top:-2px}ul.o_dropdown{margin:-5px -14px}ul.o_dropdown .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}ul.o_dropdown>li>a{display:block;padding:5px 14px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;background:#fff;white-space:nowrap}ul.o_dropdown>li>a:hover,ul.o_dropdown>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.badge.o_scorm_completed{background-color:#3c763d}.badge.o_scorm_failed{background-color:#a94442}.badge.o_scorm_incomplete{background-color:#8a6d3b}.badge.o_scorm_not_attempted{background:none}.o_bc_meta h5,.o_bc_meta .o_author,.o_bc_meta .o_comment,.tooltip h5,.tooltip .o_author,.tooltip .o_comment{color:#fff;margin:5px 0}.o_bc_meta .o_thumbnail,.tooltip .o_thumbnail{width:200px;height:200px;display:inline-block;background-color:#fff;margin:0 -5px}.o_htmleditor .o_metadata{border:1px solid #999;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom:0;background:#eee;position:relative;top:1px;padding:5px}.o_htmleditor .o_metadata #o_filename{float:left}.o_htmleditor .o_metadata .o_lastmodified{float:right;color:#777;line-height:1.428571429}.o_htmleditor #o_save{margin-top:10px;text-align:center}.o_htmleditor #o_save input{margin-right:1em}.o_htmleditor #o_save input:last-child{margin-right:0}.o_notifications_news_wrapper .o_notifications_news_subscription{margin:10px 0}.o_notifications_news_wrapper .o_notifications_news_subscription h4 i,.o_notifications_news_wrapper .o_notifications_news_subscription .o_cal .fc-header-title h2 i,.o_cal .fc-header-title .o_notifications_news_wrapper .o_notifications_news_subscription h2 i{display:none}.o_notifications_news_wrapper .o_notifications_news_subscription .o_notifications_news_context{color:#777}.o_notifications_news_wrapper .o_notifications_news_subscription .o_notifications_news_content{margin-left:1.5em;position:relative}.o_notifications_news_wrapper .o_notifications_news_subscription .o_notifications_news_content .o_icon{position:absolute;left:-1.5em;line-height:1.5em;top:0}.o_notifications_news_wrapper .o_notifications_news_subscription .o_notifications_news_content .o_date{color:#777}.o_notifications_news_wrapper .o_notifications_news_subscription .o_notifications_news_url{margin-left:1.5em}.o_noti{margin:6px 0 6px 12px;float:right;color:#777}.o_noti .o_label{color:#777;cursor:help}@media (max-width: 767px){.o_noti .o_label span{display:none}}.panel-body .o_noti{margin:0}.o_portrait{display:inline-block}.o_portrait img{border-radius:50%;border:none;background-color:#eee;background-position:50% 50%;background-repeat:no-repeat;background-size:cover}.o_portrait_name{margin-top:6px}.o_block_inline .o_portait,.o_block_inline .o_portrait_name,.o_block_inline .o_portrait_image,.o_block_inline_right .o_portait,.o_block_inline_right .o_portrait_name,.o_block_inline_right .o_portrait_image,.o_block_inline_left .o_portait,.o_block_inline_left .o_portrait_name,.o_block_inline_left .o_portrait_image,.o_block_inline_both .o_portait,.o_block_inline_both .o_portrait_name,.o_block_inline_both .o_portrait_image{display:inline-block}.o_portrait_avatar,.o_portrait_dummy,.o_portrait_dummy_female_big,.o_portrait_dummy_male_big,.o_portrait_anonymous{width:100px;height:100px}.o_portrait_dummy{background-image:url("../light/images/portrait/dummy.png")}.o_portrait_dummy_female_big{background-image:url("../light/images/portrait/dummy_female_big.png")}.o_portrait_dummy_male_big{background-image:url("../light/images/portrait/dummy_male_big.png")}.o_portrait_anonymous{background-image:url("../light/images/portrait/anonymous.png")}.o_portrait_avatar_small,.o_portrait_dummy_small,.o_portrait_dummy_female_small,.o_portrait_dummy_male_small,.o_portrait_anonymous_small{width:30px;height:30px}.o_portrait_dummy_small{background-image:url("../light/images/portrait/dummy_small.png")}.o_portrait_dummy_female_small{background-image:url("../light/images/portrait/dummy_female_small.png")}.o_portrait_dummy_male_small{background-image:url("../light/images/portrait/dummy_male_small.png")}.o_portrait_anonymous_small{background-image:url("../light/images/portrait/anonymous_small.png")}.o_datecomp{position:relative;width:40px;height:52px;border:1px solid #555;margin-right:12px;text-align:center;vertical-align:middle}.o_datecomp div.o_year{position:absolute;left:0;width:100%;top:-20px;height:20px;line-height:20px;font-size:10px}.o_datecomp div.o_month{height:20px;line-height:20px;font-size:12px;background-color:#337ab7;color:#fff}.o_datecomp div.o_day{height:30px;line-height:30px;font-size:18px;border-top:1px solid #555;background-color:#fff;color:#333}.o_block_with_datecomp .o_head{position:relative;padding-left:52px}.o_block_with_datecomp .o_datecomp{position:absolute;top:0.2em;left:0}.o_block_with_datecomp .o_title{margin-top:0}.o_block_with_datecomp .o_meta{color:#777}.o_block_with_datecomp .o_content{border-left:5px solid #eee;padding:0 20px}.o_block_with_datecomp .o_block_footer{padding-left:25px}ul.o_certificates li{padding:5px 0}ul.o_certificates li a.o_sel_certificate_delete{padding-left:2em}.o_cal_toptoolbar{margin-bottom:6px}.o_cal_toptoolbar .o_cal_toptoolbar_help{float:left;margin-right:12px}.o_cal_toptoolbar .o_noti{margin-top:0}.o_feed .o_date,.o_feed .o_author{color:#777}.o_feed .o_subscription a{margin-right:1.5em}.o_feed .o_subscription .form-group{margin-bottom:5px}.o_feed .o_subscription .form-control{border:0;background:none;padding:0;height:auto;-webkit-box-shadow:none;box-shadow:none}.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper{float:left}.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_rating_title,.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_rating_explanation,.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_legend{display:none}.o_feed .o_blog_posts .o_ratings_and_comments a.o_comments span{display:none}.o_feed .o_content:before,.o_feed .o_content:after{content:" ";display:table}.o_feed .o_content:after{clear:both}.o_feed .o_enclosure{clear:both}.o_glossary .o_register{text-align:center}.o_glossary .o_meta{font-size:90%;color:#777;font-style:italic}.o_glossary dl dt:first-letter{font-size:21px}.o_glossary dl dt small{color:#777}.o_tm_glossary{border-bottom:1px dotted #666699 !important}.o_tm_yellow{background-color:#FFFF66}.o_tm_blue{background-color:#33FFFF}.o_tm_red{background-color:#FF3333}.o_tm_green{background-color:#99FF00}.o_coaching div#o_main_toolbar.o_toolbar{margin-top:0px}.o_eff_statement_details .o_user_infos{margin-top:20px}div.o_assessment_user_type_filter{display:inline-block;padding:0.5em;border:1px solid #eee;border-radius:4px}div.o_assessment_user_type_filter div.form-inline,div.o_assessment_user_type_filter div.o_navbar-form{margin-left:5px;display:inline-block}.vitero_iframe{width:100%;height:100%;border:none;min-height:60em}.o_reminder_rule{padding:5px 0}.o_segments.btn-group a span{overflow:hidden;display:block;text-overflow:ellipsis}.o_segments_content{margin-top:20px}.o_tabbed_pane .o_tabbed_pane_content{padding:20px 0 6px 0}.o_togglebox_wrapper .o_opener{position:relative;left:-0.5em}.o_togglebox_wrapper div.o_togglebox_content{position:relative;margin:0}.o_togglebox_wrapper div.o_togglebox_content .o_hide{position:absolute;bottom:0.5em;right:1em}.o_toolboxes ul{margin:0 0 1.5em 0;padding:0 0 0 1.5em}.o_qrcode{width:256px;height:256px}#o_ajax_busy{position:absolute;left:50%;top:20em;margin-left:-2.5em;height:5em;width:5em;color:#fff;z-index:1201;display:none}#o_body.o_ajax_busy{cursor:busy}.o_exception .o_visual{position:relative;background-image:url("../light/images/lion-500x333.jpg");filter:grayscale(50%);-webkit-filter:grayscale(50%);-moz-filter:grayscale(50%);-ms-filter:grayscale(50%);-o-filter:grayscale(50%);width:500px;height:333px;background-repeat:no-repeat;background-position:50% 50%;background-size:contain;margin:0 0 10px 16px}@media (min-width: 768px) and (max-width: 991px){.o_exception .o_visual{width:375px;height:249px}}@media (min-width: 500px) and (max-width: 767px){.o_exception .o_visual{width:250px;height:166px}}@media (max-width: 500px){.o_exception .o_visual{background-size:cover}}.o_exception .jumbotron h1,.o_exception .o_repo_details .o_lead h1,.o_repo_details .o_exception .o_lead h1{color:#d9534f}ul.o_assessment_docs{margin-bottom:0}ul.o_assessment_docs>li{margin-bottom:0.33em}ul.o_assessment_docs>li:last-child{margin-bottom:0em}.o_mail_message .o_mail_meta{background:#fafafa;border:1px solid #eee;padding:5px 10px}.o_mail_message .o_mail_meta h3{margin-top:0}.o_mail_message .o_mail_date,.o_mail_message .o_mail_from,.o_mail_message .o_mail_recipients{color:#777;font-size:90%}.o_mail_message .o_mail_date .o_label,.o_mail_message .o_mail_from .o_label,.o_mail_message .o_mail_recipients .o_label{font-weight:bold;margin-right:1em}.o_mail_message .o_mail_date .o_group span,.o_mail_message .o_mail_from .o_group span,.o_mail_message .o_mail_recipients .o_group span{font-weight:bold}.o_mail_message .o_mail_date .o_group span:after,.o_mail_message .o_mail_from .o_group span:after,.o_mail_message .o_mail_recipients .o_group span:after{content:':';margin-right:0.5em}.o_mail_message .o_mail_date i,.o_mail_message .o_mail_from i,.o_mail_message .o_mail_recipients i{margin-left:1em}.o_mail_message .o_mail_date ul.list-inline,.o_mail_message .o_mail_from ul.list-inline,.o_mail_message .o_mail_recipients ul.list-inline{display:inline}.o_mail_message .o_mail_date ul.list-inline li,.o_mail_message .o_mail_from ul.list-inline li,.o_mail_message .o_mail_recipients ul.list-inline li{padding-right:0;padding-left:0}.o_mail_message .o_more{margin-left:1em}.o_mail_message .o_showAllLink{float:right;font-size:80%}.progress .o_progress_marker{position:absolute;height:100%;top:0;width:3px;background:red}.progress .progress-bar{text-shadow:1px 1px 2px #000000}.o_progress_label_right{float:left;margin-right:10px}.o_web_content{padding-bottom:15px}.o_labeled_light,a.o_qpool_tools_status,.dropdown-toggle.o_qpool_tools_status,.o_labeled{text-transform:uppercase;text-align:center;text-decoration:none;vertical-align:text-bottom;font-size:75% !important;font-weight:bold !important;line-height:1;white-space:nowrap;border:1px solid;border-radius:3px;padding:2px 5px;background-color:#777;color:#fff}.o_labeled_light{background-color:#f8f8f8}.dropdown-menu.o_labeled{background-color:inherit}.o_ms_button{max-width:100%;width:100%;display:flex}.o_ms_button span:not(.o_ms_carret){text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.o_ms_button .o_ms_carret{margin:auto 0 auto auto}.o_ms_list{width:100%;height:auto;max-height:300px;overflow-x:hidden}.o_disclaimer .o_disclaimer_content{max-height:50vh;overflow:auto;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;background:#fbfbfb;padding:10px;border:1px solid #c2c2c2}.tt-input{width:400px}.tt-menu{width:400px;margin-top:6px;padding:0 0 0;color:#555;background-color:#fff;border:1px solid #66afe9;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;-webkit-box-shadow:0 0 8px rgba(102,175,233,0.6);box-shadow:0 0 8px rgba(102,175,233,0.6)}.tt-suggestion{padding:6px 12px;font-size:14px;line-height:1.428571429}.tt-suggestion.tt-cursor,.tt-suggestion:hover{color:#fff;background-color:#337ab7}.tt-suggestion p{margin:0}.tt-menu div.o_icon_error:before{content:''}.o_search_link_extended,.o_search_link_simple{margin-top:12px;display:inline-block}.o_search_results_stats{color:#777;padding-left:1.5em}.o_search_highlight{margin-left:12px;font-size:12px}.o_search_result_title h4,.o_search_result_title .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_search_result_title h2{display:inline-block;margin-right:12px;margin-bottom:6px}.o_search_result_title h4 .o_icon-fw,.o_search_result_title .o_cal .fc-header-title h2 .o_icon-fw,.o_cal .fc-header-title .o_search_result_title h2 .o_icon-fw{text-align:left}.o_search_result_highlight{font-weight:bold;background-color:transparent}.o_search_result_context{display:inline-block;color:#3c763d;margin-right:1em}.o_search_result_license{display:inline-block;color:#777}.o_search_result_excerpt{color:#555}.o_search_result .o_opener{font-size:12px}.o_search_result .o_opener i{width:1em}.o_search_result_details .o_togglebox_wrapper.o_block{margin-top:0;margin-bottom:0}.o_search_result_details .o_togglebox_wrapper .o_togglebox_content{color:#777;font-size:12px;background:#fff;padding:6px 12px}.o_search_result_details .o_togglebox_wrapper .o_search_result_license i{font-size:20px}@media (max-width: 767px){.o_search_result_details{display:none}}.wizard{border:1px solid #d4d4d4;border-radius:2px;background-color:#f9f9f9;position:relative;overflow:hidden;margin-bottom:15px}.wizard ul{list-style:none outside none;padding:0;margin:0;width:4000px}.wizard ul li{float:left;margin:0;padding:0 20px 0 30px;height:46px;line-height:46px;position:relative;background:#ededed;color:#333;font-size:16px;cursor:default}.wizard ul li .chevron{border:24px solid transparent;border-left:14px solid #d4d4d4;border-right:0;display:block;position:absolute;right:-14px;top:0;z-index:1}.wizard ul li .chevron:before{border:24px solid transparent;border-left:14px solid #ededed;border-right:0;content:"";display:block;position:absolute;right:1px;top:-24px}.wizard ul li.active{background:#f1f6fc;color:#333}.wizard ul li.active .chevron:before{border-left:14px solid #f1f6fc}.wizard ul li .badge{margin-right:8px}.wizard ul li:first-child{border-radius:4px 0 0 4px;padding-left:20px}.o_process{position:relative;padding-left:25px}.o_process .o_step{position:relative;height:auto;padding-top:10px;padding-left:30px;padding-bottom:10px}.o_process .o_bar{position:absolute;top:10px;left:8px;height:100%;border-left:4px solid #777}.o_process .o_bar:after{position:absolute;top:0;left:-10px;height:16px;width:16px;border:4px solid #777;border-radius:16px;background:#fff;content:" "}.o_process .o_title{margin-top:-1px;color:#777 !important}.o_process .o_title:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:absolute;left:-24px}.o_process .o_title a:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";width:1em}.o_process .o_title a.collapsed:before{content:""}.o_process .o_step.o_active .o_bar,.o_process .o_step.o_active .o_bar:after{border-color:#337ab7}.o_process .o_step.o_active .o_title{color:#337ab7 !important}.o_process .o_step.o_active .o_title:before{content:"";color:#337ab7}.o_process .o_step.o_done .o_bar,.o_process .o_step.o_done .o_bar:after{border-color:#5094ce}.o_process .o_step.o_done .o_title{color:#5094ce !important}.o_process .o_step.o_done .o_title:before{content:"";color:#5cb85c}.o_process .o_meta{color:#777;font-size:12px;margin-top:-0.5em}.o_cal_orange{background:#ffc266;border-color:#ff9900;color:#5D5D5D}.o_cal_orange .o_cal_wv_event_header{background:#ff9900}.o_cal_orange a{color:#5D5D5D !important}.o_cal_class.o_cal_orange{border-left:20px solid #ffc266}.o_cal_green{background:#66c266;border-color:#009900;color:#FFF}.o_cal_green .o_cal_wv_event_header{background:#009900}.o_cal_green a{color:#FFF !important}.o_cal_class.o_cal_green{border-left:20px solid #66c266}.o_cal_blue{background:#4d6e9f;border-color:#2e5894;color:#FFF}.o_cal_blue .o_cal_wv_event_header{background:#2e5894}.o_cal_blue a{color:#FFF !important}.o_cal_class.o_cal_blue{border-left:20px solid #4d6e9f}.o_cal_yellow{background:#ffe066;border-color:#ffcc00;color:#5D5D5D}.o_cal_yellow .o_cal_wv_event_header{background:#ffcc00}.o_cal_yellow a{color:#5D5D5D !important}.o_cal_class.o_cal_yellow{border-left:20px solid #ffe066}.o_cal_red{background:#c26666;border-color:#990000;color:#FFF}.o_cal_red .o_cal_wv_event_header{background:#990000}.o_cal_red a{color:#FFF !important}.o_cal_class.o_cal_red{border-left:20px solid #c26666}.o_cal_rebeccapurple{background:#663399;border-color:#663399;color:#FFF}.o_cal_rebeccapurple .o_cal_wv_event_header{background:#663399}.o_cal_rebeccapurple a{color:#FFF !important}.o_cal_class.o_cal_rebeccapurple{border-left:20px solid #639}.o_cal_fuchsia{background:#FF00FF;border-color:#dd00dd;color:#FFF}.o_cal_fuchsia .o_cal_wv_event_header{background:#FF00FF}.o_cal_fuchsia a{color:#FFF !important}.o_cal_class.o_cal_fuchsia{border-left:20px solid #f0f}.o_cal_olive{background:#808000;border-color:#636300;color:#FFF}.o_cal_olive .o_cal_wv_event_header{background:#808000}.o_cal_olive a{color:#FFF !important}.o_cal_class.o_cal_olive{border-left:20px solid olive}.o_cal_navy{background:#000080;border-color:#000057;color:#FFF}.o_cal_navy .o_cal_wv_event_header{background:#000080}.o_cal_navy a{color:#FFF !important}.o_cal_class.o_cal_navy{border-left:20px solid navy}.o_cal_maroon{background:#800000;border-color:#740000;color:#FFF}.o_cal_maroon .o_cal_wv_event_header{background:#800000}.o_cal_maroon a{color:#FFF !important}.o_cal_class.o_cal_maroon{border-left:20px solid maroon}.o_cal_lime{background:#00FF00;border-color:#00e200;color:#004d00}.o_cal_lime .o_cal_wv_event_header{background:#00FF00}.o_cal_lime a{color:#004d00 !important}.o_cal_class.o_cal_lime{border-left:20px solid lime}.o_cal_grey{background:#DDDAAA;border-color:#5D5D5D;color:#FFF}.o_cal_grey .o_cal_wv_event_header{background:#5D5D5D}.o_cal_grey a{color:#FFF !important}.o_cal_class.o_cal_grey{border-left:20px solid #DDDAAA}.o_sel_calendar_print_chooser{padding-right:4em}.o_cal_config_enabled,.o_cal_config_disabled{position:relative;float:left;display:inline}.o_cal_config_calendar{margin:0 5px;padding:1px 6px 1px 4px;position:relative;width:200px;overflow:hidden;float:left;display:inline}.o_cal_config_color{display:block;width:16px;height:16px;border-radius:8px}.o_cal_colorchooser_selected:before{content:""}#o_cal_colorchooser div{border:1px solid #337ab7;margin:5px;display:inline-block}#o_cal_colorchooser div:hover{border:1px solid #333}#o_cal_colorchooser a{width:20px;height:20px;display:inline-block}.o_cal_embedded_course_container .o_content_popup{top:0}.o_cal_wv_event_tooltip_content .o_cal_description{background-color:#f8f8f8;padding:10px 7px;margin:10px -7px}.o_cal_wv_event_tooltip_content .o_cal_tooltip_buttons{text-align:center;margin-top:20px}.o_cal_event_managed .fc-event-inner:after{margin-right:2px;float:right;font-family:FontAwesome;font-style:normal;font-weight:normal;font-size:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:""}.o_cal_event_not_managed .fc-event-inner:after{margin-right:2px;float:right;font-family:FontAwesome;font-style:normal;font-weight:normal;font-size:100%;webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:""}.fc-button{color:#333;background-color:#fff;border-color:#ccc}.fc-button:hover,.fc-button:focus,.fc-button.focus,.fc-button:active,.fc-button.active,.open>.fc-button.dropdown-toggle{color:#333;background-color:#e6e6e6;border-color:#adadad}.fc-button:active,.fc-button.active,.open>.fc-button.dropdown-toggle{background-image:none}.fc-button.disabled,.fc-button.disabled:hover,.fc-button.disabled:focus,.fc-button.disabled.focus,.fc-button.disabled:active,.fc-button.disabled.active,.fc-button[disabled],.fc-button[disabled]:hover,.fc-button[disabled]:focus,.fc-button[disabled].focus,.fc-button[disabled]:active,.fc-button[disabled].active,fieldset[disabled] .fc-button,fieldset[disabled] .fc-button:hover,fieldset[disabled] .fc-button:focus,fieldset[disabled] .fc-button.focus,fieldset[disabled] .fc-button:active,fieldset[disabled] .fc-button.active{background-color:#fff;border-color:#ccc}.fc-button .badge{color:#fff;background-color:#333}.fc-button.fc-state-default{text-shadow:none}.fc-button.fc-state-active{color:#fff;background-color:#337ab7;border-color:#2e6da4}.fc-button.fc-state-active:hover,.fc-button.fc-state-active:focus,.fc-button.fc-state-active.focus,.fc-button.fc-state-active:active,.fc-button.fc-state-active.active,.open>.fc-button.fc-state-active.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.fc-button.fc-state-active:active,.fc-button.fc-state-active.active,.open>.fc-button.fc-state-active.dropdown-toggle{background-image:none}.fc-button.fc-state-active.disabled,.fc-button.fc-state-active.disabled:hover,.fc-button.fc-state-active.disabled:focus,.fc-button.fc-state-active.disabled.focus,.fc-button.fc-state-active.disabled:active,.fc-button.fc-state-active.disabled.active,.fc-button.fc-state-active[disabled],.fc-button.fc-state-active[disabled]:hover,.fc-button.fc-state-active[disabled]:focus,.fc-button.fc-state-active[disabled].focus,.fc-button.fc-state-active[disabled]:active,.fc-button.fc-state-active[disabled].active,fieldset[disabled] .fc-button.fc-state-active,fieldset[disabled] .fc-button.fc-state-active:hover,fieldset[disabled] .fc-button.fc-state-active:focus,fieldset[disabled] .fc-button.fc-state-active.focus,fieldset[disabled] .fc-button.fc-state-active:active,fieldset[disabled] .fc-button.fc-state-active.active{background-color:#337ab7;border-color:#2e6da4}.fc-button.fc-state-active .badge{color:#337ab7;background-color:#fff}body.o_cal_print fieldset{border:none;margin-bottom:2em}body.o_cal_print legend{font-size:2em;font-weight:bold}body.o_cal_print legend span{display:block;font-size:14px;font-weight:normal}body.o_cal_print ul.o_cal_wv_list{list-style-type:none;padding:0}body.o_cal_print ul.o_cal_wv_list>li{page-break-inside:avoid;margin-bottom:2em}body.o_cal_print ul.o_cal_wv_list .o_cal_date{font-size:1.25em;font-weight:bold;padding:0.5em 0 0.5em 0}body.o_cal_print ul.o_cal_wv_list ul.o_cal_events{list-style-type:none;padding:0.5em 0 0 0}body.o_cal_print ul.o_cal_wv_list ul.o_cal_events li.o_cal_event{position:relative;left:30px;page-break-inside:avoid;clear:both;margin-bottom:1.5em;padding-right:30px}body.o_cal_print ul.o_cal_wv_list ul.o_cal_events li.o_cal_event .o_cal_time{float:left;font-weight:bold;margin-right:1em}body.o_cal_print ul.o_cal_wv_list ul.o_cal_events li.o_cal_event .o_cal_subject{font-weight:bold}body.o_cal_print ul.o_cal_wv_list ul.o_cal_events li.o_cal_event .o_cal_subject p{margin:0}body.o_cal_print ul.o_cal_wv_list ul.o_cal_events li.o_cal_event .o_cal_location,body.o_cal_print ul.o_cal_wv_list ul.o_cal_events li.o_cal_event .o_cal_description,body.o_cal_print ul.o_cal_wv_list ul.o_cal_events li.o_cal_event .o_cal_freebusy{clear:both}body.o_cal_print ul.o_cal_wv_list ul.o_cal_events li.o_cal_event .o_cal_freebusy{font-style:italic}body.o_cal_print .o_cal_class{position:absolute;left:-30px;width:20px}body.o_cal_print #o_cal_config legend{font-size:1.25em}body.o_cal_print #o_cal_config .o_cal_config_calendar{margin:0;padding:0}body.o_cal_print #o_cal_config .o_cal_config_calendar{position:relative;left:30px;float:none;padding-right:30px}.o_visual{position:absolute;top:0;left:0;overflow:hidden;height:120px;width:180px;vertical-align:middle}@media (min-width: 768px) and (max-width: 991px){.o_visual{height:80px;width:120px}}@media (max-width: 767px){.o_visual{height:50px;width:75px}}.o_visual img{width:100%;height:auto}.o_visual .o_visual_not_available{width:100%;height:100%;background-image:url("../light/images/no_preview.png");background-repeat:no-repeat;background-position:50% 50%;background-size:contain}.o_coursetable.o_rendertype_custom .o_table_row{position:relative;border:1px solid #337ab7;margin-bottom:10px}.o_coursetable.o_rendertype_custom .o_table_row .o_visual{box-sizing:content-box;border-right:1px solid #337ab7}.o_coursetable.o_rendertype_custom .o_table_row .o_access{position:absolute;top:0;right:0;height:120px;width:180px;overflow:hidden;border-left:1px solid #337ab7;padding-top:0.25em}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_state,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score{padding:0 1em;height:20px;line-height:20px;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score{position:relative;left:2px}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score .o_label{color:#777}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social{position:absolute;width:100%;bottom:32px;height:20px;padding-left:1em}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating .o_rating_title,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating o_rating_legend,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating .o_rating_explanation{display:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings{padding:0 0 0 1em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings .o_label{margin-bottom:1em;color:#777}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings .o_methods{color:#5bc0de}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{position:absolute;display:block;bottom:0;width:90px;height:30px;line-height:30px;text-align:center}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book{right:0}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start{color:#fff;background-color:#337ab7;border-color:#2e6da4}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.dropdown-toggle{background-image:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled.active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled],.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled].focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled].active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:hover,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.active{background-color:#337ab7;border-color:#2e6da4}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start .badge{color:#337ab7;background-color:#fff}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book{color:#fff;background-color:#f0ad4e;border-color:#eea236}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.dropdown-toggle{background-image:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled.active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled],.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled].focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled].active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:hover,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.active{background-color:#f0ad4e;border-color:#eea236}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book .badge{color:#f0ad4e;background-color:#fff}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{right:90px;color:#fff;background-color:#5cb85c;border-color:#4cae4c}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.dropdown-toggle{background-image:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled.active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled],.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled].focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled].active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:hover,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.active{background-color:#5cb85c;border-color:#4cae4c}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details .badge{color:#5cb85c;background-color:#fff}@media (min-width: 768px) and (max-width: 991px){.o_coursetable.o_rendertype_custom .o_table_row .o_access{height:80px;width:120px}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_comments,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_label{display:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{width:60px}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{right:60px}}@media (max-width: 767px){.o_coursetable.o_rendertype_custom .o_table_row .o_access{display:none}}.o_coursetable.o_rendertype_custom .o_table_row .o_meta{height:120px;margin:0 180px 0 180px;position:relative;padding:1em 0.5em 0.25em 1em;overflow:hidden}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title{margin:0;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a{display:block;color:#337ab7}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a:hover{color:#286090}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_author{margin-top:0.5em;line-height:normal;font-size:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#3c763d}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle{position:absolute;top:5px;right:40px;z-index:2px;background:white;padding:0 3px 3px 3px;border-radius:0px 0px 3px 3px;font-size:90%;line-height:normal;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#777}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle.o_active{color:#3c763d}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle.o_active:hover{color:#2b542c}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_desc{margin-top:0.5em}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_bookmark{position:absolute;top:-1px;right:15px}@media (min-width: 768px) and (max-width: 991px){.o_coursetable.o_rendertype_custom .o_table_row .o_meta{height:80px;margin:0 120px}}@media (max-width: 767px){.o_coursetable.o_rendertype_custom .o_table_row .o_meta{height:50px;margin:0 0 0 75px;padding:0 0 0 1em}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title{line-height:50px}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a{border-right:37px solid transparent;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_author,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_bookmark,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_desc{display:none}}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_go_xs{position:absolute;top:0;right:0;padding:0 1em;height:50px;width:37px;line-height:50px;color:#fff;background-color:#337ab7}.o_coursetable.o_rendertype_classic .o_rating_explanation{display:none}.o_coursetable.o_rendertype_classic .o_start,.o_coursetable.o_rendertype_classic .o_book{white-space:nowrap}.o_coursetable.o_rendertype_classic .o_repoentry_type{color:#555}.o_coursetable.o_rendertype_classic .o_repoentry_ac{color:#555}.o_catalog .o_level{position:relative;margin-bottom:10px;padding:0;border-top:1px solid #337ab7;border-bottom:1px solid #337ab7}.o_catalog .o_level .o_visual{height:180px}.o_catalog .o_level .o_meta{position:relative;min-height:180px;height:180px;overflow:hidden;margin:0 0 0 180px;padding:1em 0.5em 0.5em 2em}.o_catalog .o_level .o_meta .o_title{margin:0}.o_catalog .o_level .o_meta .o_title a{display:block;color:#337ab7}.o_catalog .o_level .o_meta .o_title a:hover{color:#286090}.o_catalog .o_level .o_meta .o_desc{padding:1em 0 0.5em 0}@media (min-width: 768px) and (max-width: 991px){.o_catalog .o_level .o_visual{height:120px}.o_catalog .o_level .o_meta{min-height:120px;height:120px;margin:0 0 0 120px}}@media (max-width: 767px){.o_catalog .o_level .o_visual{height:75px}.o_catalog .o_level .o_meta{min-height:75px;height:75px;margin:0 0 0 75px;padding:0 0 0 1em}.o_catalog .o_level .o_meta .o_title{line-height:75px}.o_catalog .o_level .o_meta .o_desc{display:none}}.o_catalog .o_sublevels_list .o_sublevel{position:relative;border:1px solid #337ab7;margin-bottom:10px}.o_catalog .o_sublevels_list .o_sublevel .o_visual{height:75px;width:75px}.o_catalog .o_sublevels_list .o_sublevel .o_visual span.o_visual_not_available{width:100%;height:100%;display:block}.o_catalog .o_sublevels_list .o_sublevel .o_title{margin:0}.o_catalog .o_sublevels_list .o_sublevel .o_meta{border-left:1px solid #337ab7;min-height:75px;height:75px;margin:0 0 0 75px;padding:0 0 0 1em;overflow:hidden}.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_title{line-height:75px}.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_desc{display:none}.o_catalog .o_sublevels_list .o_sublevel .o_meta h4.o_title>a,.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_cal .fc-header-title h2.o_title>a,.o_cal .fc-header-title .o_catalog .o_sublevels_list .o_sublevel .o_meta h2.o_title>a{font-family:inherit;font-weight:inherit}.o_catalog .o_sublevels_list .o_sublevel .o_meta h4.o_title>a>i,.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_cal .fc-header-title h2.o_title>a>i,.o_cal .fc-header-title .o_catalog .o_sublevels_list .o_sublevel .o_meta h2.o_title>a>i{display:none}.o_catalog .o_sublevels_list .o_sublevel.o_fill_sublevels{border:1px solid transparent}.o_catalog .o_sublevels_list .o_sublevel.o_fill_sublevels .o_meta{border-left:1px solid transparent}.o_catalog .o_sublevels{position:relative;margin-bottom:20px}.o_catalog .o_sublevels:before,.o_catalog .o_sublevels:after{content:" ";display:table}.o_catalog .o_sublevels:after{clear:both}.o_catalog .o_sublevels .o_sublevel{position:relative;float:left;margin:0 20px 20px 0;width:180px}.o_catalog .o_sublevels .o_sublevel:last-child{margin-right:0}.o_catalog .o_sublevels .o_sublevel .o_visual{border:1px solid #337ab7;position:relative;height:180px}.o_catalog .o_sublevels .o_sublevel .o_visual span.o_visual_not_available{width:100%;height:100%;display:block}.o_catalog .o_sublevels .o_sublevel .o_meta{position:absolute;left:0;bottom:0;width:100%;border:1px solid #337ab7;border-top:0;background-color:rgba(255,255,255,0.8)}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title{margin:0;text-align:center;line-height:2em;height:2em;width:100%;overflow:hidden}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a{display:block;color:#337ab7;font-family:inherit;font-weight:inherit}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a:hover{color:#286090}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a>i{display:none}@media (min-width: 768px) and (max-width: 991px){.o_catalog .o_sublevels .o_sublevel{width:120px;margin:0 10px 10px 0}.o_catalog .o_sublevels .o_sublevel .o_visual{height:120px}.o_catalog .o_sublevels .o_sublevel .o_title{font-size:90%}}@media (max-width: 767px){.o_catalog .o_sublevels .o_sublevel{width:120px;margin:0 1px 1px 0}.o_catalog .o_sublevels .o_sublevel .o_visual{height:120px;width:120px}.o_catalog .o_sublevels .o_sublevel .o_title{font-size:90%}}@media (min-width: 768px){.o_catalog .o_sublevels_list,.o_catalog .o_sublevels_compact{-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2;columns:2}}.o_repo_details{position:relative}.o_repo_details .o_lead{margin-bottom:10px}.o_repo_details .o_lead .o_author{margin-top:0.5em;margin-bottom:1em;font-size:120%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#3c763d}.o_repo_details .o_lead .o_media{float:right;margin-left:2em;margin-bottom:2em}.o_repo_details .o_lead .o_media.o_desc_empty{float:none;margin-left:0;margin-bottom:0}.o_repo_details .o_lead h1{font-size:37px}.o_repo_details .o_lead h1 i{display:none}.o_repo_details .o_overview i{margin-right:0.5em}.o_repo_details .o_overview div{margin-bottom:0.25em}.o_repo_details .o_start_wrapper{clear:both;margin:2em 0 -10px 0;text-align:right}.o_repo_details .o_start_wrapper .o_start_inner{display:inline-block}.o_repo_details .o_start,.o_repo_details .o_book{max-width:400px;display:inline-block}.o_repo_details .o_social:before,.o_repo_details .o_social:after{content:" ";display:table}.o_repo_details .o_social:after{clear:both}.o_repo_details .o_social .o_rating_wrapper{float:left}.o_repo_details .o_social .o_comments{margin-left:1em}@media (max-width: 767px){.o_repo_details .o_lead p{font-size:16px}.o_repo_details .o_lead .o_media{margin-left:0;float:none;text-align:center}.o_repo_details .o_start_wrapper{text-align:center}.o_repo_details .o_start_wrapper .o_start_inner{display:block}.o_repo_details .o_start,.o_repo_details .o_book{max-width:100%;display:block}}@media (max-width: 613px){.o_repo_details .o_subcolumn{width:100%}}.o_meta .o_closed{padding:2px 5px;margin:5px 0}.o_overview .o_closed{padding:12px 15px;margin:15px 0}.o_ac_configuration span.o_ac_infos{font-weight:normal;color:grey}tr.o_entry_closed,tr.o_entry_closed td,tr.o_entry_closed td span,tr.o_entry_unpublished,tr.o_entry_unpublished td,tr.o_entry_unpublished td span{text-decoration:line-through}.o_repo_status_filter>div{display:inline-block}.o_repo_status_filter>div label{font-weight:normal}.badge.o_midpub{background-color:#3c763d}.badge.o_midwarn{background-color:#8a6d3b}.badge.o_midlock{background-color:#31708f}.badge.o_miderr{background-color:#a94442}.badge.o_middel{background-color:#777}.o_course_editor_legend .badge{font-size:80%}.o_course_editor_legend .badge:before{content:none}.o_passed{color:#3c763d;font-weight:bold}.o_passed a:hover{color:#2b542c}.o_passed th{color:#333}.o_failed{color:#a94442;font-weight:bold}.o_failed a:hover{color:#66512c}.o_failed th{color:#333}.o_unknown{color:#8a6d3b;font-weight:bold}.o_unknown a:hover{color:#66512c}.o_unknown th{color:#333}.o_noinfo{color:#777}.o_course_run .o_toc .o_entry .o_shorttitle{border-bottom:1px solid #777}.o_course_run .o_toc .o_entry .o_displaytitle{margin-top:5px;color:#777}.o_course_run .o_toc .o_entry .o_objectives{margin-top:10px;font-style:italic}.o_course_run .o_in_review{font-style:italic;position:relative}.o_course_run.o_titled_wrapper>h2 i{display:none}.o_course_run .o_cal_toptoolbar{margin-right:26px}.o_course_run .o_titled_wrapper .o_cal_toptoolbar{margin-right:0px}.o_tree.o_course_menu div.o_tree_l0>a:first-child{background-color:none}.o_st_peekview ul li{margin-bottom:0.5em}.o_cl_line{margin-bottom:10px;padding-bottom:5px}.o_cl_line.o_even{background-color:#f9f9f9}.o_ll_container h5{margin-bottom:5px}.o_ll_container h5 a.o_desc{color:#337ab7}.o_ll_container h5 a.o_desc small{display:none}.o_ll_container h5 a.o_desc:hover{color:#286090;text-decoration:none}.o_ll_container h5 a.o_desc:hover small{color:#5e5e5e;display:inline}.o_ll_container div.o_comment{color:#777}.o_cmembers .o_cmember{margin:12px 0;display:table}.o_cmembers .o_cmember .o_portrait{padding-right:10px;display:table-cell;vertical-align:top}.o_cmembers .o_cmember .o_portrait img{width:50px;height:50px}.o_cmembers .o_cmember .o_cmember_info_wrapper{display:table-cell;vertical-align:middle;color:#777}.o_cmembers .o_cmember .o_cmember_info_wrapper .o_mail{margin-left:6px}.o_cmembers .o_cmember a.o_mail{display:none}.o_cmembers .o_cmember:hover a.o_mail{display:inline}.o_cmembers_print{color:#000}.o_cmembers_print #o_print_brand{position:absolute;top:1cm;right:1cm;width:5cm;height:4cm}.o_cmembers_print #o_print_brand img{width:100%}.o_cmembers_print .o_portrait{width:100px;height:100px;position:relative}.o_cmembers_print .o_portrait img{border-radius:0px;max-width:100%;max-height:100%;width:auto;height:auto;position:absolute;top:0;bottom:0;left:0;right:0;margin:auto}.o_cmembers_print .o_cmember{padding-left:0px;padding-right:15px;margin-bottom:20px}.o_cmembers_print .o_cmember .o_cmember_info_wrapper{word-wrap:break-word}.o_cmembers_print .o_cmember .o_prop.o_zipCode{float:left;padding-right:0.5em}.o_cmembers_print h1{font-size:18pt;color:#000}.o_cmembers_print h3{font-size:14pt;margin-top:5px;font-weight:normal;color:#000}.o_cmembers_print h4,.o_cmembers_print .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_cmembers_print h2{font-size:11pt;font-weight:strong;color:#000;padding-bottom:10px;border-bottom:1px solid #eee}.o_cmembers_print .o_cmember_info_wrapper{font-size:7pt;color:#000}.o_cmembers_print .o_cmember_info_wrapper strong{font-size:8pt}.tag.label.label-info{margin-right:3px}.input-group.o_tag_inputgroup .form-control{height:auto}div.o_correction_navigation .o_correction_navigation_back{float:left;line-height:32px}div.o_correction_navigation .o_correction_navigation_previous{position:absolute;right:50%;margin-right:102px}div.o_correction_navigation #o_cocurrent_item_SELBOX{width:200px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;position:absolute;left:50%;margin-left:-100px}div.o_correction_navigation .o_correction_navigation_next{position:absolute;left:50%;margin-left:102px}@media (max-width: 767px){div.o_correction_navigation .o_correction_navigation_previous span,div.o_correction_navigation .o_correction_navigation_next span{display:none}}tr.o_curriculum_element_l0 td{padding:0px}div.o_curriculum_element_l0{margin-left:0px}tr.o_curriculum_element_l1 td{padding:15px}div.o_curriculum_element_l1{margin-left:15px}tr.o_curriculum_element_l2 td{padding:30px}div.o_curriculum_element_l2{margin-left:30px}tr.o_curriculum_element_l3 td{padding:45px}div.o_curriculum_element_l3{margin-left:45px}tr.o_curriculum_element_l4 td{padding:60px}div.o_curriculum_element_l4{margin-left:60px}tr.o_curriculum_element_l5 td{padding:75px}div.o_curriculum_element_l5{margin-left:75px}tr.o_curriculum_element_l6 td{padding:90px}div.o_curriculum_element_l6{margin-left:90px}tr.o_curriculum_element_l7 td{padding:105px}div.o_curriculum_element_l7{margin-left:105px}tr.o_curriculum_element_l8 td{padding:120px}div.o_curriculum_element_l8{margin-left:120px}tr.o_curriculum_element_l9 td{padding:135px}div.o_curriculum_element_l9{margin-left:135px}tr.o_curriculum_element_l10 td{padding:150px}div.o_curriculum_element_l10{margin-left:150px}tr.o_curriculum_element_l11 td{padding:165px}div.o_curriculum_element_l11{margin-left:165px}.o_curriculumtable.o_rendertype_custom .o_table_row.o_curriculum_element{border-color:#999}.o_curriculumtable.o_rendertype_custom .o_table_row.o_curriculum_element .o_meta{height:40px;margin:0 180px 0 0}.o_curriculumtable.o_rendertype_custom .o_table_row{position:relative;border:1px solid #337ab7;margin-bottom:10px}.o_curriculumtable.o_rendertype_custom .o_table_row .o_visual{box-sizing:content-box;border-right:1px solid #337ab7}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access{position:absolute;top:0;right:0;height:120px;width:180px;overflow:hidden;border-left:1px solid #337ab7;padding-top:0.25em}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_state,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_score{padding:0 1em;height:20px;line-height:20px;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_score{position:relative;left:2px}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_score .o_label{color:#777}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_social{position:absolute;width:100%;bottom:32px;height:20px;padding-left:1em}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating .o_rating_title,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating o_rating_legend,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating .o_rating_explanation{display:none}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_bookings{padding:0 0 0 1em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_bookings .o_label{margin-bottom:1em;color:#777}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_bookings .o_methods{color:#5bc0de}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details{position:absolute;display:block;bottom:0;width:90px;height:30px;line-height:30px;text-align:center}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book{right:0}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start{color:#fff;background-color:#337ab7;border-color:#2e6da4}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start:hover,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start:focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.active,.open>.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.active,.open>.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.dropdown-toggle{background-image:none}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.disabled,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:hover,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.disabled.focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.disabled.active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start[disabled],.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:hover,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start[disabled].focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start[disabled].active,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start:hover,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start:focus,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.focus,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start:active,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start.active{background-color:#337ab7;border-color:#2e6da4}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start .badge{color:#337ab7;background-color:#fff}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book{color:#fff;background-color:#f0ad4e;border-color:#eea236}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book:hover,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book:focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.active,.open>.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.active,.open>.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.dropdown-toggle{background-image:none}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.disabled,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:hover,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.disabled.focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.disabled.active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book[disabled],.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:hover,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book[disabled].focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book[disabled].active,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book:hover,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book:focus,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.focus,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book:active,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book.active{background-color:#f0ad4e;border-color:#eea236}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book .badge{color:#f0ad4e;background-color:#fff}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details{right:90px;color:#fff;background-color:#5cb85c;border-color:#4cae4c}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details:hover,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details:focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.active,.open>.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.active,.open>.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.dropdown-toggle{background-image:none}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.disabled,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:hover,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.disabled.focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.disabled.active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details[disabled],.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:hover,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details[disabled].focus,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:active,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details[disabled].active,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details:hover,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details:focus,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.focus,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details:active,fieldset[disabled] .o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details.active{background-color:#5cb85c;border-color:#4cae4c}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details .badge{color:#5cb85c;background-color:#fff}@media (min-width: 768px) and (max-width: 991px){.o_curriculumtable.o_rendertype_custom .o_table_row .o_access{height:80px;width:120px}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_score,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_comments,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_label{display:none}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_start,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_book,.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details{width:60px}.o_curriculumtable.o_rendertype_custom .o_table_row .o_access .o_details{right:60px}}@media (max-width: 767px){.o_curriculumtable.o_rendertype_custom .o_table_row .o_access{display:none}}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta{height:120px;margin:0 180px 0 180px;position:relative;padding:1em 0.5em 0.25em 1em;overflow:hidden}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_title{margin:0;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_title a{display:block;color:#337ab7}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_title a:hover{color:#286090}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta h5.o_title{margin-bottom:0.2em}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_author{margin-top:0.5em;line-height:normal;font-size:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#3c763d}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle{position:absolute;top:5px;right:40px;z-index:2px;background:white;padding:0 3px 3px 3px;border-radius:0px 0px 3px 3px;font-size:90%;line-height:normal;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#777}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle.o_active{color:#3c763d}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle.o_active:hover{color:#2b542c}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_desc{margin-top:0.5em}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_bookmark{position:absolute;top:-1px;right:15px}@media (min-width: 768px) and (max-width: 991px){.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta{height:80px;margin:0 120px}}@media (max-width: 767px){.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta{height:50px;margin:0 0 0 75px;padding:0 0 0 1em}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_title{line-height:50px}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_title a{border-right:37px solid transparent;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_author,.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_bookmark,.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle,.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_desc{display:none}}.o_curriculumtable.o_rendertype_custom .o_table_row .o_meta .o_go_xs{position:absolute;top:0;right:0;padding:0 1em;height:50px;width:37px;line-height:50px;color:#fff;background-color:#337ab7}table.table.o_qti_item_kprim>thead>tr>th,table.table.o_qti_item_kprim>tbody>tr>td{border:none}td.o_qti_item_kprim_input,th.o_qti_item_kprim_input{text-align:center}td.o_qti_item_kprim_input .radio,th.o_qti_item_kprim_input .radio{display:inline}td.o_qti_item_kprim_text{width:80%}div.o_qti_menu_section,div.o_qti_menu_section_clickable,div.o_qti_menu_section_active{margin-top:10px}div.o_qti_menu_item a,div.o_qti_menu_section a{text-decoration:none}div.o_qti_menu_item{padding:.1em}div.o_qti_menu_item_active{padding:.1em;font-weight:bold}div.o_qti_item_itemfeedback{background-color:#ffffff;border-color:#000000}div.o_qti_item_choice_option_flow{display:inline-block;padding:.5em;border:1px solid transparent}.d3chart .bar_green{fill:#5cb85c}.d3chart .bar_red{fill:#d9534f}.d3chart .bar_grey{fill:lightgrey}.d3chart circle.bubble_green{fill:#5cb85c}div.o_qti_statistics ul{list-style-type:none;padding:0;margin:0;font-size:90%}div.o_qti_statistics ul strong{font-weight:normal}div.o_qti_statistics ul li{padding-left:48px;margin-left:0;margin-bottom:10px}div.o_qti_statistics ul li.o_qti_statistics-ncorrect:before{font-size:125%;content:'\2A2F\00A0\00A0'}div.o_qti_statistics ul li.o_qti_statistics-correct:before{font-size:125%;content:'\2713\00A0\00A0'}div.o_qti_statistics ul li.o_qti_statistics-kplus:before{font-size:125%;content:'\2713\00A0\2A2F\00A0\00A0'}div.o_qti_statistics ul li.o_qti_statistics-kminus:before{font-size:125%;content:'\2A2F\00A0\2713\00A0\00A0'}div.o_qti_statistics ul li img{vertical-align:top}div.o_qti_statistics table.o_qti_statistics_figures tr{float:left}div.o_qti_statistics table.o_qti_statistics_figures tr:nth-child(2n+1){clear:left;padding-right:20px}div.o_qti_statistics table.o_qti_statistics_figures td{width:200px;padding-left:0;vertical-align:bottom}div.o_qti_statistics table.o_qti_statistics_figures td+td{width:100px}div.o_qti_statistics .o_qti_statistics_answer{background:#F5F5F5;padding:1px 2px;width:90%}div.o_qti_statistics div.o_qti_statistics_legend{padding-top:10px;width:470px;border:1px solid #ddd;border-radius:4px}div.o_qti_statistics div.o_qti_statistics_legend ul li .bar_green{background-color:#9dd53a}div.o_qti_statistics div.o_qti_statistics_legend ul li .bar_red{background-color:#f85032}div.o_qti_statistics div.o_qti_statistics_legend ul li .bar_grey{background-color:lightgrey}div.o_qti_metadatas .panel-body{border-top:none}.o_qti_menu_item_attempts:after,.o_qti_menu_item_attempts_marked:after{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.o_qti_menu_item_attempts:after{content:""}.o_qti_menu_item_attempts_marked:after{content:"";color:#337ab7}.o_qti_print div.o_qti_statistics{width:680px}@media print{div.o_qti_statistics{width:680px}}ul.sessionControl{list-style:none;margin:1em;text-align:center}ul.sessionControl li{display:inline;padding:0.2em}.association{margin:20px 20px 20px 40px;background:transparent url("../light/images/association_bg.png") repeat-x center center}.o_associate_item{padding:5px;margin:0 15px 10px 0;border:2px solid #999}.o_associate_item.oo-selected{border:2px solid #337ab7}.o_associate_item.oo-choosed{border:none !important}.o_associate_item.oo-drag{border:2px solid #337ab7 !important}.association_box{border:3px dotted #999}.association_box.oo-filled{border:3px solid #999}.association_box{background-color:white}.prompt{font-weight:bold}.sketch{position:relative;user-drag:none;user-select:none;-moz-user-select:none;-webkit-user-drag:none;-webkit-user-select:none;-ms-user-select:none}#tmp_canvas{position:absolute;left:0px;right:0;bottom:0;top:0;cursor:crosshair;user-drag:none;user-select:none;-moz-user-select:none;-webkit-user-drag:none;-webkit-user-select:none;-ms-user-select:none}#colors .black .o_icon:before{color:#000000}#colors .blue .o_icon:before{color:#0000FF}#colors .green .o_icon:before{color:#008000}#colors .yellow .o_icon:before{color:#FFFF00}#colors .red .o_icon:before{color:#FF0000}#colors .purple .o_icon:before{color:#800080}.o_gap_item{padding:5px;margin:5px;background-repeat:no-repeat;background-position:center center}.o_gap_item.oo-choosed{position:relative;left:auto;top:auto;padding:3px;margin:0}.o_gap_item.oo-selected{border:3px solid #337ab7}.o_item_container_help,.o_items_container_help{font-size:90%;font-style:italic;color:#777;padding:5px}.items_container{padding:15px}.items_container .o_item{float:left}#o_qti_hotspots_edit{min-height:100px;min-width:400px;background-repeat:no-repeat}#o_qti_hotspots_edit.o_qti_hotspot-standard .o_draw_circle,#o_qti_hotspots_edit.o_qti_hotspot-standard .o_draw_rectangle{background-color:rgba(255,255,255,0.5);border-color:#6E6E6E}#o_qti_hotspots_edit.o_qti_hotspot-standard .o_qti_hotspot_correct.o_draw_circle,#o_qti_hotspots_edit.o_qti_hotspot-standard .o_qti_hotspot_correct.o_draw_rectangle{background-color:rgba(45,0,255,0.5);border-color:#0000ff}#o_qti_hotspots_edit.o_qti_hotspot-light .o_draw_circle,#o_qti_hotspots_edit.o_qti_hotspot-light .o_draw_rectangle{background-color:rgba(221,221,221,0);border-color:#7E7E7E}#o_qti_hotspots_edit.o_qti_hotspot-light .o_qti_hotspot_correct.o_draw_circle,#o_qti_hotspots_edit.o_qti_hotspot-light .o_qti_hotspot_correct.o_draw_rectangle{background-color:rgba(51,122,183,0.05);border-color:#337ab7}#o_qti_hotspots_edit.o_qti_hotspot-inverted .o_draw_circle,#o_qti_hotspots_edit.o_qti_hotspot-inverted .o_draw_rectangle{background-color:rgba(110,110,110,0.5);border-color:#3E3E3E}#o_qti_hotspots_edit.o_qti_hotspot-inverted .o_qti_hotspot_correct.o_draw_circle,#o_qti_hotspots_edit.o_qti_hotspot-inverted .o_qti_hotspot_correct.o_draw_rectangle{background-color:rgba(222,222,222,0.2);border-color:#CECECE}#o_qti_hotspots_edit.o_qti_hotspot-green .o_draw_circle,#o_qti_hotspots_edit.o_qti_hotspot-green .o_draw_rectangle{background-color:rgba(142,142,142,0.25);border-color:#CECECE}#o_qti_hotspots_edit.o_qti_hotspot-green .o_qti_hotspot_correct.o_draw_circle,#o_qti_hotspots_edit.o_qti_hotspot-green .o_qti_hotspot_correct.o_draw_rectangle{background-color:rgba(134,195,81,0.5);border-color:#518b33}#o_qti_hotspots_edit.o_qti_hotspot-purple .o_draw_circle,#o_qti_hotspots_edit.o_qti_hotspot-purple .o_draw_rectangle{background-color:rgba(142,142,142,0.33);border-color:#CECECE}#o_qti_hotspots_edit.o_qti_hotspot-purple .o_qti_hotspot_correct.o_draw_circle,#o_qti_hotspots_edit.o_qti_hotspot-purple .o_qti_hotspot_correct.o_draw_rectangle{background-color:rgba(234,168,255,0.5);border-color:#ab47cb}div.hotspotInteraction{overflow-x:auto}img.o_hotspot_responsive[usemap]{max-width:100%;width:auto;height:auto}.form-inline.o_qti_gaptext_add_first_alternative,.o_qti_gaptext_add_first_alternative.o_navbar-form{padding:9px 0 3px 0}.form-inline.o_qti_gaptext_add_alternative,.o_qti_gaptext_add_alternative.o_navbar-form{margin-bottom:3px}.o_qti_item_body .extendedTextInteraction{margin:15px 0}.o_qti_item_body .extendedTextInteraction textarea{resize:vertical !important;font-family:Menlo,Monaco,Consolas,"Courier New",monospace}.o_qti_item_body .extendedTextInteraction pre{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}.o_qti_item_body .extendedTextInteraction .o_qti_essay_last_save{padding:2px 2px;font-style:italic;font-size:90%;text-align:right}.extendedTextInteraction div.form-control.textarea_disabled{white-space:pre-wrap;height:auto;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;color:#555 !important}#o_qti_run_title{margin:0 15px 0.5em 15px}#o_qti_run_title h3{margin:15px 0 0 0}#o_qti_run_infos{border:1px solid #e7e7e7;border-radius:4px;background:#f8f8f8;padding:10px 0;margin:0 15px 1em 15px}#o_qti_run_infos .progress{background-color:#eee}#o_qti_run_infos #o_qti_scoreinfo .progress-bar{background-color:#337ab7}.progress-striped #o_qti_run_infos #o_qti_scoreinfo .progress-bar{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}#o_qti_run_infos #o_qti_questioninfo .progress-bar{background-color:#337ab7}.progress-striped #o_qti_run_infos #o_qti_questioninfo .progress-bar{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}#o_qti_run_infos #o_qti_run_scoreinfo,#o_qti_run_infos #o_qti_run_scoreprogress{white-space:nowrap}#o_qti_results_infos{border:1px solid #e7e7e7;border-radius:4px;background:#f8f8f8;padding:10px 0;margin:0 0 1em 0}#o_qti_results_infos .progress{background-color:#eee}#o_qti_results_infos #o_qti_run_scoreinfo,#o_qti_results_infos #o_qti_run_scoreprogress{white-space:nowrap}#o_qti_assessment_test_timer{border:1px solid #e7e7e7;border-radius:4px;padding:10px;margin:0 15px 1em 15px}#o_qti_assessment_test_timer.o_10_minutes{background-color:#fcf8e3}#o_qti_assessment_test_timer.o_5_minutes{background-color:#f2dede}#o_qti_assessment_test_timer.o_panic{background-color:#ce8383}#o_qti_assessment_test_timer .o_qti_times_up{padding-left:2em;font-weight:bold}#o_qti_assessment_test_timer .o_qti_times_message{padding-left:2em;font-weight:bold}.o_draw_circle.o_qti_hotspot_correct,.o_draw_rectangle.o_qti_hotspot_correct{background-color:rgba(229,255,204,0.6)}#width_range_ui,#opacity_range_ui{width:120px}.o_slider_width_range,.o_slider_opacity_range{margin:3px 10px 0 0}.o_qti_hotspot_label{padding-left:48%}.o_info.o_assessmentsection_rubrics{margin:0 0 0.5em 0;position:relative}.o_info.o_assessmentsection_rubrics.o_hide{display:none}.o_info.o_assessmentsection_rubrics.o_show{display:block}.o_info.o_assessmentsection_rubrics a.o_hide{position:absolute;bottom:0.5em;right:1em}.o_assessmentitem h1{margin-bottom:0}.o_assessmentitem div.badResponse,.o_assessmentitem span.badResponse{color:#d9534f;font-weight:bold}.o_assessmentitem input.badResponse{border:1px solid #d9534f}.o_assessmentitem .infoControl input{margin-right:0.5em}.o_assessmentitem .infoControl .infoControlContent{display:none}.o_assessmentitem .sliderInteraction{margin:1em}.o_assessmentitem .sliderInteraction .sliderVertical .sliderValue{margin:1em 0}.o_assessmentitem .sliderInteraction .sliderVertical .sliderWidget{height:200px}.o_assessmentitem .sliderInteraction .sliderHorizontal .sliderValue{text-align:center}.o_assessmentitem div.orderInteraction div.highlight{border:1px solid #d9534f}.o_assessmentitem div.orderInteraction div.box.vertical{width:50%;float:left;position:relative;padding:0;margin-top:5px}.o_assessmentitem div.orderInteraction div.box.vertical ul{min-height:200px}.o_assessmentitem div.orderInteraction div.box.horizontal ul{min-height:50px;width:100%}.o_assessmentitem div.orderInteraction div.box.source{padding:5px 10px;border:1px solid #e7e7e7;border-radius:4px;background:#f8f8f8}.o_assessmentitem div.orderInteraction div.box.source.horizontal{padding:5px 10px 15px 10px}.o_assessmentitem div.orderInteraction div.box.target ul{border:2px solid #5bc0de;border-radius:4px;background:#d9edf7}.o_assessmentitem div.orderInteraction div.box.target ul.oo-accepted{border-color:#1f7e9a}.o_assessmentitem div.orderInteraction div.box.target.vertical{padding:6px 0 0 10px}.o_assessmentitem div.orderInteraction div.box.target.vertical ul{padding:10px}.o_assessmentitem div.orderInteraction div.box.target.horizontal{padding-top:10px}.o_assessmentitem div.orderInteraction div.box.target.horizontal ul{padding:10px 10px 0 10px}.o_assessmentitem div.orderInteraction div.box.horizontal ul li{float:left;width:auto;margin-right:10px;min-width:50px}.o_assessmentitem div.orderInteraction div.box span.info{color:#666;font-style:italic;font-size:smaller}.o_assessmentitem div.orderInteraction ul{list-style-type:none;margin:0;padding:0}.o_assessmentitem .hottext{position:relative;margin:-2px 0.15em -2px 0.15em;white-space:nowrap}.o_assessmentitem .hottext input{margin:0 3px 0 2px;position:absolute;top:0.1em;left:0.05em}.o_assessmentitem .hottext input+label{display:inline;padding:0 0.1em 0 1.2em;background:#f8f8f8;border:1px solid #e7e7e7;border-radius:2px;color:#333;font-weight:normal;white-space:normal}.o_assessmentitem .hottext input:checked+label{color:#333;background:#d9edf7;border:1px solid #bce8f1}.o_assessmentitem .gap{font-weight:bold;border:1px dashed #000}.o_assessmentitem .textEntryInteraction input{margin:-1px 2px;line-height:90%;vertical-align:middle;font-size:13.72px;line-height:1.5;border:1px solid #999;background:#fff;padding:1px 1px;color:#333;max-width:100%}.o_assessmentitem .textEntryInteraction input:valid,.o_assessmentitem .textEntryInteraction input:disabled{color:#333;-webkit-text-fill-color:#333;background:#d9edf7;border:1px solid #bce8f1}li.o_assessmentitem_order_item{padding:10px;margin-bottom:10px;border:2px dashed #999;border-radius:4px;background-color:#ffffff;background:#fcf8e3;list-style-type:none}li.o_assessmentitem_order_item:before,li.o_assessmentitem_order_item:after{content:" ";display:table}li.o_assessmentitem_order_item:after{clear:both}body>li.o_assessmentitem_order_item{display:block}.o_assessmentitem_wrapper .itemTitle{background:#f8f8f8;border:1px solid #e7e7e7;border-radius:4px 4px 0 0;margin-top:0;margin-bottom:0;padding:5px 10px;line-height:1.5em;position:relative}.o_assessmentitem_wrapper .itemTitle .o_qti_item_max_score{position:absolute;left:49%}.o_assessmentitem_wrapper .o_qti_item_body{min-height:200px;margin:0;padding:5px 10px;border-left:1px solid #e7e7e7;border-right:1px solid #e7e7e7;font-size:14px;line-height:1.8}.o_assessmentitem_wrapper .o_assessment_item_not_final.o_warning{margin:0}.o_assessmentitem_wrapper .modalFeedback h4:first-of-type,.o_assessmentitem_wrapper .modalFeedback .o_cal .fc-header-title h2:first-of-type,.o_cal .fc-header-title .o_assessmentitem_wrapper .modalFeedback h2:first-of-type{padding-left:10px;margin-top:0}.o_assessmentitem_wrapper .modalFeedback .o_info{margin-bottom:0;margin-top:0}.o_assessmentitem_wrapper .modalFeedback .o_info.o_correct_modal_feedback{margin-bottom:0;margin-top:0}.o_assessmentitem_wrapper .modalFeedback .o_info.o_incorrect_modal_feedback{margin-bottom:0;margin-top:0}.o_assessmentitem_wrapper .modalFeedback .o_info.o_empty_modal_feedback{margin-bottom:0;margin-top:0}.o_assessmentitem_wrapper .modalFeedback .o_togglebox_wrapper{margin-bottom:0;margin-top:0}.o_assessmentitem_wrapper .modalFeedback .o_togglebox_wrapper h4,.o_assessmentitem_wrapper .modalFeedback .o_togglebox_wrapper .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_assessmentitem_wrapper .modalFeedback .o_togglebox_wrapper h2{border-left:1px solid #e7e7e7;border-right:1px solid #e7e7e7;padding-bottom:5px;margin-bottom:0}.o_assessmentitem_wrapper ul.o_testpartnavigation,.o_qti_menu_buttonstyle ul.o_testpartnavigation{list-style:none;padding:0;margin:0}.o_assessmentitem_wrapper li.o_assessmentitem,.o_qti_menu_buttonstyle li.o_assessmentitem{margin-bottom:2px}.o_assessmentitem_wrapper .o_assessmentitem_status,.o_qti_menu_buttonstyle .o_assessmentitem_status{float:right;display:block;padding:0.3em;margin-left:1em;border-radius:0.3em;border-width:1px;font-size:0.8em;line-height:1.2em;color:#fff}.o_assessmentitem_wrapper .o_assessmentitem_status.ended,.o_qti_menu_buttonstyle .o_assessmentitem_status.ended{background-color:#5bc0de}.o_assessmentitem_wrapper .o_assessmentitem_status.invalid,.o_qti_menu_buttonstyle .o_assessmentitem_status.invalid{background-color:#d9534f}.o_assessmentitem_wrapper .o_assessmentitem_status.answered,.o_qti_menu_buttonstyle .o_assessmentitem_status.answered{background-color:#5cb85c}.o_assessmentitem_wrapper .o_assessmentitem_status.notAnswered,.o_qti_menu_buttonstyle .o_assessmentitem_status.notAnswered{background-color:#f0ad4e}.o_assessmentitem_wrapper .o_assessmentitem_status.notPresented,.o_qti_menu_buttonstyle .o_assessmentitem_status.notPresented{background-color:#ddd}.o_assessmentitem_wrapper .o_assessmentitem_status.review,.o_qti_menu_buttonstyle .o_assessmentitem_status.review{background-color:#5bc0de}.o_assessmentitem_wrapper .o_assessmentitem_status.reviewNotAllowed,.o_assessmentitem_wrapper .o_assessmentitem_status.reviewInvalid,.o_assessmentitem_wrapper .o_assessmentitem_status.reviewNotAnswered,.o_assessmentitem_wrapper .o_assessmentitem_status.reviewNotSeen,.o_qti_menu_buttonstyle .o_assessmentitem_status.reviewNotAllowed,.o_qti_menu_buttonstyle .o_assessmentitem_status.reviewInvalid,.o_qti_menu_buttonstyle .o_assessmentitem_status.reviewNotAnswered,.o_qti_menu_buttonstyle .o_assessmentitem_status.reviewNotSeen{background-color:#5bc0de;opacity:0.7}.o_assessmentitem_wrapper .o_assessmentitem_status i:before,.o_qti_menu_buttonstyle .o_assessmentitem_status i:before{color:#fff}.o_assessmentitem_controls{background:#f8f8f8;border:1px solid #e7e7e7;border-radius:0 0 4px 4px;margin-top:0;margin-bottom:16px;padding:5px 10px}.o_assessmentitem_controls button{margin-bottom:0}.o_assessmentitem_controls .o_sel_assessment_item_submit span:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";padding-right:0.5em}.o_assessmentitem_controls .o_sel_next_question span:after{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";padding-left:0.5em}.o_assessmentitem_controls .o_sel_question_menu span:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";padding-right:0.5em}.o_assessmentitem_controls .o_sel_end_testpart span:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";padding-right:0.5em}.o_assessmentitem_controls .o_sel_back_test_feedback span:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";padding-right:0.5em}.o_assessmentitem_controls .o_sel_show_solution span:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";padding-right:0.5em}.o_assessmentitem_controls .o_sel_solution_hide span:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";padding-right:0.5em}.o_assessmentitem_control_view_solution{background:#f8f8f8;border:1px solid #e7e7e7;margin:0;padding:5px 10px}.o_assessmentitem_scoring{background:#f8f8f8;border:1px solid #e7e7e7;border-bottom:0;border-radius:4px 4px 0 0;margin-top:0;margin-bottom:0;padding:5px 10px}.o_assessmentitem_scoring_buttons{background:#f8f8f8;border:1px solid #e7e7e7;border-top:0;border-radius:0 0 4px 4px;margin-top:0;margin-bottom:16px;padding:5px 10px}.o_assessmentitem_scoring_override_window{width:300px}.itemPrompt{margin:1.5em 0;font-style:italic;color:#666666}.o_qti_item_body{margin:1em 0}.o_sel_assessment_item_hint{margin-top:1em}.o_assessment_test_results .o_sel_assessment_item_hint{display:none}tr.choiceinteraction td.control{padding:0.5em}tr.choiceinteraction td.choiceInteraction{padding:0.5em}.choiceInteraction label{font-weight:normal}.choiceInteraction div.o_qti_item_choice_option_flow{display:inline-block;padding:.5em;border:1px solid transparent}.choiceInteraction div.o_qti_item_choice_option_flow label span{font-weight:normal}.choiceInteraction div.o_qti_item_choice_option_flow label span>p{display:inline-block}.choiceInteraction.choiceright table tr td.choiceInteraction{background-color:#e7e7e7;border-bottom:3px solid white}.matchInteraction.choiceright table tr td.o_qti_item_kprim_text{background-color:#e7e7e7;border-bottom:3px solid white}table.o_qti_item_kprim td.o_qti_item_kprim_input_correct{background-color:#eaf6ea}table.o_qti_item_kprim td.o_qti_item_kprim_input_wrong{background-color:#fdf7f7}.matchInteraction input[type='text']{display:inline;width:auto}.matchInteraction div.bar_green{background-color:#5cb85c}.matchInteraction div.bar_red{background-color:#d9534f}.source-left,.target-left,.source-right,.target-right{width:50%;float:left;position:relative;padding:0;margin-top:5px}.o_match_dnd_sources{padding:10px 10px 0 10px;min-height:60px;border:1px solid #e7e7e7;border-radius:4px;background:#f8f8f8}.o_match_dnd_sources.oo-accepted{border-color:#1f7e9a}.o_match_dnd_source{padding:10px;margin-bottom:10px;border:2px dashed #999;border-radius:4px;background-color:#ffffff;background:#fcf8e3;cursor:move;cursor:grab;cursor:-moz-grab;cursor:-webkit-grab}.o_match_dnd_source:before,.o_match_dnd_source:after{content:" ";display:table}.o_match_dnd_source:after{clear:both}.o_match_dnd_source.oo-selected{border:2px dashed #f0ad4e;background:#fae3c4}.o_match_dnd_source.oo-drag{border:2px dashed #f0ad4e !important}.source-bottom .o_match_dnd_source,.source-top .o_match_dnd_source{margin:0 0 10px 0}.o_match_dnd_targets .oo-accepted{border:2px solid #1f7e9a;border-radius:4px}.o_match_dnd_target{padding:10px 10px 0 10px;margin:0 0 10px 10px;border:2px solid #5bc0de;border-radius:4px;background:#d9edf7}.o_match_dnd_target:before,.o_match_dnd_target:after{content:" ";display:table}.o_match_dnd_target:after{clear:both}.o_match_dnd_target .o_match_dnd_target_drop_zone{margin:0;padding:5px 0 0 15px;min-height:30px}.o_match_dnd_target .o_match_dnd_target_drop_zone .o_match_dnd_source{border:2px dashed #777}.target-bottom .o_match_dnd_target,.target-top .o_match_dnd_target{margin:0 0 10px 0}.target-bottom .o_match_dnd_target .o_match_dnd_target_drop_zone,.target-top .o_match_dnd_target .o_match_dnd_target_drop_zone{padding-left:0px}.target-bottom .o_match_dnd_target .o_match_dnd_target_drop_zone .o_match_dnd_source,.target-top .o_match_dnd_target .o_match_dnd_target_drop_zone .o_match_dnd_source{padding-left:15px}.table.o_match_true_false_edit th.o_sel_match_target_0,.table.o_match_true_false_edit th.o_sel_match_target_1,.table.o_match_true_false_edit th.o_sel_match_target_2{width:12%}.match_true_false input[type="checkbox"]{-webkit-appearance:radio;-moz-appearance:radio;-ms-appearance:radio;appearance:radio}.match_true_false .table>tbody>tr>td.o_match_true_false_unanswered,.match_true_false .table>tbody>tr>td.o_match_true_false_right,.match_true_false .table>tbody>tr>td.o_match_true_false_wrong{vertical-align:middle;width:11%}.match_true_false th.o_match_true_false_unanswered,.match_true_false th.o_match_true_false_right,.match_true_false th.o_match_true_false_wrong{width:11%}.match_true_false td.o_match_true_false_answer,.match_true_false th.o_match_true_false_answer{width:67%}.match_true_false td.o_match_true_false_unanswered{background-color:#fbfbfb}.match_true_false td.o_match_true_false_right{background-color:#eaf6ea}.match_true_false td.o_match_true_false_wrong{background-color:#fdf7f7}.o_assessmentitem .mathEntryInteraction{border:1px solid #ddedfc;background-color:#edf1f6;background:linear-gradient(to top, #edf1f6 0%, #f6f9fb 100%);border-radius:0.4em;padding:1em;margin:0.5em 0}.o_assessmentitem .mathEntryInteraction .inputPanel{line-height:1em;text-align:left}.o_assessmentitem .mathEntryInteraction .inputPanel input{margin:0;padding:0}.o_assessmentitem .mathEntryInteraction .previewPanel{text-align:center}.o_assessmentitem .mathEntryInteraction.horizontal{min-height:5em;width:40em}.o_assessmentitem .mathEntryInteraction.horizontal .inputPanel{width:45%;float:left;margin:2em 0}.o_assessmentitem .mathEntryInteraction.horizontal .previewPanel{width:50%;margin-left:40%}.o_assessmentitem .mathEntryInteraction.vertical{min-height:6em}.o_assessmentitem .mathEntryInteraction.vertical .inputPanel{padding:0 5em}.o_assessmentitem .mathEntryInteraction.vertical .inputPanel:before{content:'Input Maths: '}.o_assessmentitem .mathEntryInteraction.vertical .previewPanel{margin-top:2em;min-height:4em}.o_assessmentitem div.upConversionAjaxControlMessage{width:auto;text-align:center;display:inline;padding:0.5em 0 0.5em 20px}.o_assessmentitem div.success{background:#5cb85c}.o_assessmentitem div.failure{background-color:#f0ad4e}.o_assessmentitem div.error{background-color:#d9534f}.o_assessmentitem div.upConversionAjaxControlPreview{margin:0.5em 0;font-size:110%}.o_assessmentitem table.inputHelp{border-collapse:collapse;width:100%;font-size:90%}.o_assessmentitem table.inputHelp th{border:1px solid #999999;padding:0.2em 0.5em;background-color:#cad8e5}.o_assessmentitem table.inputHelp td{color:#999999;border:1px solid #999999;padding:0.2em 0.5em}.o_assessmentitem table.inputHelp kbd{color:black;font-size:100%;line-height:100%}.o_assessmentitem table.inputHelp .longComma{margin-right:0.5em}.o_togglebox_wrapper #modal-correct-solution div.o_togglebox_content{background-color:#fcf8e3;border-color:#8a6d3b}.o_candidatecomment{padding:0;margin:2em 0 1em 0;border:none}.o_candidatecomment legend{font-size:110%;font-weight:bold;color:#777;margin-bottom:0;border-bottom:0}.o_candidatecomment div.o_item_container_help{margin:0;padding:0}.o_candidatecomment textarea{display:block;color:#777}.o_qti_menu_menustyle ul.o_testpartnavigation{list-style:none;padding:0;margin:0}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentsection{border:1px solid #e7e7e7;border-radius:4px;background:#f8f8f8;padding:0 1em 0.5em 1em;margin:0 0 0.5em 0}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentsection header{margin:0 0 1em 0}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentsection header div.rubric{font-style:italic}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentsection ul.o_testpartnavigation_inner{list-style:none;padding:0;margin:0}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem{padding:0.1em 0}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem a{color:#777}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem a:hover,.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem a:focus{color:#333}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem.active a{color:#337ab7;font-weight:bold}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem.active a:hover,.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem.active a:focus{color:#23527c;background-color:#eee}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem span{vertical-align:middle}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem .o_assessmentitem_status{display:inline;position:relative;left:-0.3em;background:transparent;border:0}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem .o_assessmentitem_status span{display:none}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem .o_assessmentitem_attempts{float:right;display:block;padding:0.3em;border-radius:2px;background-color:#fafafa;color:#777;font-size:0.7em}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem .o_assessmentitem_attempts.o_assessmentitem_attempts_limited{color:#f0ad4e}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem .o_assessmentitem_attempts.o_assessmentitem_attempts_nomore{color:#5bc0de}.o_qti_menu_menustyle ul.o_testpartnavigation li.o_assessmentitem .o_assessmentitem_marks{float:right;display:inline-block;font-size:0.8em;position:relative;top:0.3em;right:-0.5em}.o_qti_menu_menustyle ul.o_testpartnavigation .o_assessmentitem .questionTitle{margin-right:1em}.testFeedback h1:first-of-type{margin-top:0}ul.testPartDrilldown{list-style:none;padding:0;margin:0}ul.testPartDrilldown li.o_assessmentsection{border:1px solid #e7e7e7;border-radius:4px;background:#f8f8f8;padding:0 1em 0.5em 1em}ul.testPartDrilldown li.o_assessmentsection header{margin:0 0 1em 0}ul.testPartDrilldown li.o_assessmentsection header div.rubric{font-style:italic}ul.testPartDrilldown li.o_assessmentsection ul.testPartDrilldownInner{list-style:none;padding:0;margin:0}ul.testPartDrilldown li.currentItem{border:1px solid #e7e7e7;border-radius:0.5em;padding:0 1em;margin-top:1em}.testItemControl{margin-top:0.5em}.o_qti_statistics_answer{background:#F5F5F5;padding:1px 2px;width:90%}.o_qti_statistics_answer p{display:inline-block}.o_assessment_test_results .o_qti_assessment_title{border-bottom:1px solid #ddd}.o_assessment_test_results table th{width:40%}.o_assessment_test_results .o_qti_sectionsummary .o_qti_section{text-align:center}.o_assessment_test_results .o_qti_sectionsummary .o_qti_section .o_qti_section_sublisting{padding:0 10%;min-height:3em}.o_assessment_test_results .o_qti_sections .o_qti_section{margin-top:40px}.o_assessment_test_results .o_qti_sections .o_qti_section h3{margin-bottom:20px}.o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_id{display:none}.o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_comment{margin:0;padding:5px 10px 10px 5px;border-top:1px solid #ddd;broder-bottom:1px solid #ddd}.o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_comment h4,.o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_comment .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_assessment_test_results .o_qti_sections .o_qti_section .o_qti_items .o_qti_item .o_qti_item_comment h2{font-size:100%;font-weight:bold;color:inherit}.o_assessment_test_results .o_qti_to_overview{text-align:right}.o_sel_assessment_item_feedbacks{min-height:250px}.o_alternative_question_types h4 select,.o_alternative_question_types .o_cal .fc-header-title h2 select,.o_cal .fc-header-title .o_alternative_question_types h2 select{display:inline-block;width:auto}#o_dev_tool #o_dev_tool_mode{width:1em;height:1em;float:left;border:1px solid #000;margin-right:5px}a.o_dev{position:absolute;left:0;top:0;z-index:4000;background:#f0ad4e;border:1px solid #d59645;border-top:none;border-left:none;border-radius:0 0 4px 0;color:#fff}a.o_dev:hover{color:#d9534f}.o_dev_w{margin:1px}.o_dev_w .o_dev_h{color:#000;font-size:8px;line-height:10px;margin:0}.o_dev_w .o_dev_h span{background:#f4c37d;border:1px solid #f0ad4e;border-bottom:0}.o_dev_w .o_dev_c{position:relative;border:1px dotted #eee}.o_dev_w .o_dev_c .o_dev_i{position:absolute;top:0px;left:24px;height:auto;width:auto;padding:5px;border:1px solid black;display:none;margin:0px;z-index:999;font-size:11px;background-color:#BBF}.o_dev_w.o_dev_m>.o_dev_c{border:1px solid #f0ad4e;margin:0px;background-color:#f8e9d4}.o_wikimod_nav .o_noti{margin:0}.o_wikimod_editform_wrapper{margin-top:30px}.o_wiki-file-deleted{text-decoration:line-through}div.o_wiki_wrapper a.wikiimg{text-decoration:none;color:inherit;font-weight:inherit}div.o_wiki_wrapper div.imgcaption{padding:0.3em 0em 0.2em 0.3em}div.o_wiki_wrapper div.imgleft{clear:left;float:left;margin:0.3em 0.3em 0.3em 0em}div.o_wiki_wrapper div.imgright{clear:right;float:right;margin:0.3em 0em 0.3em 0.3em}div.o_wiki_wrapper div.imgcenter{clear:both;overflow:hidden;text-align:center;margin:0.3em 0em 0.3em 0em}div.o_wiki_wrapper div.imgthumb{border:1px solid #bbbbbb;padding:0.3em}div.o_wiki_wrapper table.gallery{border:1px solid #ccc;margin:2px;padding:2px;background-color:white}div.o_wiki_wrapper table.gallery tr{vertical-align:middle}div.o_wiki_wrapper table.gallery td{background-color:#f9f9f9;border:solid 2px white;text-align:center;vertical-align:middle;width:150px}div.o_wiki_wrapper img.gallery{border:1px solid #bbbbbb;padding:0.3em}div.o_wiki_wrapper a.edit{font-style:italic;color:red}div.o_wiki_wrapper a.externallink:before{padding-right:2px}div.o_wiki_wrapper a.externallink:before:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;padding-right:0.5em;content:""}.o_ep_icon_map:before{content:""}.o_ep_icon_collection:before{content:""}.o_ep_icon_page:before{content:""}.o_ep_icon_struct:before{content:""}.o_ep_icon_liveblog:before{content:""}.o_artefact_closed:before{content:""}.o_portfolio_toc .o_ep_link{float:right;margin-right:0px}.o_portfolio_toc .o_ep_commentlink{float:right;margin-right:10%}.o_portfolio_toc li.level1{font-size:1.2em;margin:1.2em 0 0.2em 0;border-bottom:1px solid #ddd}.o_portfolio_toc li.level2{padding-left:20px;font-size:1.1em;border-bottom:1px dotted #ddd}.o_portfolio_toc li.level3{padding-left:40px}.o_eportfolio_page .o_eportfolio_structure>h5{border-bottom:1px solid #ddd;margin-top:1.2em}.o_eportfolio_maps .panel{font-family:'Century Gothic', 'Apple Gothic', sans-serif;box-shadow:3px 3px 4px rgba(20,20,20,0.4)}.o_eportfolio_maps .panel-heading{padding:5px 10px}.o_eportfolio_maps h4,.o_eportfolio_maps .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps h2{padding:11px 15px;background:rgba(255,255,230,0.7) none;border-radius:6px}.o_eportfolio_maps .table>tbody>tr>td{border-top:none}.o_eportfolio_maps .panel-body{border-top:none}.o_eportfolio_maps .panel>.panel-body+.table{border-top:none}.panel-footer .o_ep_options{display:inline-block}.o_eportfolio_map{padding:0 20px 2px 3px;border-radius:6px 10px 6px 0;font-family:'Century Gothic', 'Apple Gothic', sans-serif}.o_map_header{padding-left:5px}.o_eportfolio_map ul.nav-tabs li:not(.active) a{background-color:rgba(240,240,240,0.7);border-radius:4px 4px 0 0}.o_eportfolio_edit{border-radius:4px 4px 0 0}.o_ep_actualpage,.o_eportfolio_edit{padding:15px;background-color:#fff}.o_ep_content{margin-top:15px}.o_ep_filter .o_date.form-inline .form-group,.o_ep_filter .o_date.o_navbar-form .form-group{margin-left:8px}.o_eportfolio_share_policy_wrapper{border:1px solid #ddd;border-radius:4px}.o_eportfolio_share_header{padding:10px 15px;border-bottom:1px solid #ddd;background-color:#f5f5f5}.o_eportfolio_share_policy{padding:10px 15px}.o_map-default{background:#fafafa;background:#fafafa -webkit-gradient(linear, 37% 20%, 53% 100%, from(#fafafa), to(#efefef));background:#fafafa -moz-linear-gradient(43% 71% 101deg, #efefef, #fafafa);background:#fafafa -o-linear-gradient(#fafafa, #efefef);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#fafafa', EndColorStr='#efefef');border:1px solid #efefef;border-left:3px solid rgba(188,188,188,0.8)}.o_eportfolio_maps .o_map-default h4,.o_eportfolio_maps .o_map-default .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-default h2{color:#444;background:none}.o_eportfolio_maps .o_map-default .panel-body,.o_eportfolio_maps .o_map-default td,.o_eportfolio_maps .o_map-default a{color:#000}.o_map-comic{background:#a2c3e8 none;font-family:'Comic Sans MS', 'Comic Sans', fantasy;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_map-leather{background-color:#957352;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(248,248,248,0.7)), color-stop(100%, rgba(193,193,193,0.5))),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-webkit-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-moz-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-ms-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-o-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");font-family:Palatino, Georgia, serif;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-leather h4,.o_eportfolio_maps .o_map-leather .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-leather h2{background:rgba(243,230,225,0.3) none}.o_eportfolio_maps .o_map-leather .panel-body,.o_eportfolio_maps .o_map-leather td{color:#333}.o_eportfolio_maps .o_map-leather a{color:#fad9a4}.o_eportfolio_map.o_map-leather .o_map_header h4,.o_eportfolio_map.o_map-leather .o_map_header .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_map.o_map-leather .o_map_header h2,.o_eportfolio_map.o_map-leather .o_map_header p,.o_eportfolio_map.o_map-leather .o_map_header a,.o_eportfolio_map.o_map-leather .o_map_header span,.o_eportfolio_map.o_map-leather .o_map_header label{color:#333}.o_map-epmst-green{background-color:#ECF69A;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-green h4,.o_eportfolio_maps .o_map-epmst-green .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green h2{color:#444}.o_eportfolio_maps .o_map-epmst-green .panel-body,.o_eportfolio_maps .o_map-epmst-green td,.o_eportfolio_maps .o_map-epmst-green a{color:#000}.o_map-epmst-green2{background:#99E44D;background:#99E44D -webkit-gradient(linear, 37% 20%, 53% 100%, from(#99E44D), to(#CBF1A5));background:#99E44D -moz-linear-gradient(43% 71% 101deg, #CBF1A5, #99E44D);background:#99E44D -o-linear-gradient(#99E44D, #CBF1A5);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#99E44D', EndColorStr='#CBF1A5');border:1px solid #bbb;border-left:3px solid rgba(136,136,136,0.8)}.o_eportfolio_maps .o_map-epmst-green2 h4,.o_eportfolio_maps .o_map-epmst-green2 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green2 h2{color:#555}.o_eportfolio_maps .o_map-epmst-green2 .panel-body,.o_eportfolio_maps .o_map-epmst-green2 td,.o_eportfolio_maps .o_map-epmst-green2 a{color:#000}.o_map-epmst-green3{background:#DFF0C1;background:#DFF0C1 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#DFF0C1), to(#A0D346));background:#DFF0C1 -moz-linear-gradient(43% 71% 101deg, #A0D346, #DFF0C1);background:#DFF0C1 -o-linear-gradient(#DFF0C1, #A0D346);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#DFF0C1', EndColorStr='#A0D346');border:1px solid #bbb;border-left:3px solid rgba(136,136,136,0.8)}.o_eportfolio_maps .o_map-epmst-green3 h4,.o_eportfolio_maps .o_map-epmst-green3 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green3 h2{color:#555}.o_eportfolio_maps .o_map-epmst-green3 .panel-body,.o_eportfolio_maps .o_map-epmst-green3 td,.o_eportfolio_maps .o_map-epmst-green3 a{color:#000}.o_map-epmst-green4{background-color:#D7DBB5;border:1px solid #bbb;border-left:3px solid rgba(136,136,136,0.8)}.o_eportfolio_maps .o_map-epmst-green4 h4,.o_eportfolio_maps .o_map-epmst-green4 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green4 h2{color:#555}.o_eportfolio_maps .o_map-epmst-green4 .panel-body,.o_eportfolio_maps .o_map-epmst-green4 td,.o_eportfolio_maps .o_map-epmst-green4 a{color:#000}.o_map-epmst-red{background:#FFBA71;background:#FFBA71 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#FFBA71), to(#FFBA99));background:#FFBA71 -moz-linear-gradient(43% 71% 101deg, #FFBA99, #FFBA71);background:#FFBA71 -o-linear-gradient(#FFBA71, #FFBA99);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#FFBA71', EndColorStr='#FFBA99');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red h4,.o_eportfolio_maps .o_map-epmst-red .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red h2{color:#444}.o_eportfolio_maps .o_map-epmst-red .panel-body,.o_eportfolio_maps .o_map-epmst-red td,.o_eportfolio_maps .o_map-epmst-red a{color:#000}.o_map-epmst-red2{background:#FF9772;background:#FF9772 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#FF9772), to(#FF9780));background:#FF9772 -moz-linear-gradient(43% 71% 101deg, #FF9780, #FF9772);background:#FF9772 -o-linear-gradient(#FF9772, #FF9780);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#FF9772', EndColorStr='#FF9780');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red2 h4,.o_eportfolio_maps .o_map-epmst-red2 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red2 h2{color:#444}.o_eportfolio_maps .o_map-epmst-red2 .panel-body,.o_eportfolio_maps .o_map-epmst-red2 td,.o_eportfolio_maps .o_map-epmst-red2 a{color:#000}.o_map-epmst-red3{background:#E8AFBB;background:#E8AFBB -webkit-gradient(linear, 37% 20%, 53% 100%, from(#E8AFBB), to(#E8AFA0));background:#E8AFBB -moz-linear-gradient(43% 71% 101deg, #E8AFA0, #E8AFBB);background:#E8AFBB -o-linear-gradient(#E8AFBB, #E8AFA0);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#E8AFBB', EndColorStr='#E8AFA0');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red3 h4,.o_eportfolio_maps .o_map-epmst-red3 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red3 h2{color:#444}.o_eportfolio_maps .o_map-epmst-red3 .panel-body,.o_eportfolio_maps .o_map-epmst-red3 td,.o_eportfolio_maps .o_map-epmst-red3 a{color:#000}.o_map-epmst-red4{background:#FFA800;background:#FFA800 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#FFA800), to(#FFAF00));background:#FFA800 -moz-linear-gradient(43% 71% 101deg, #FFAF00, #FFA800);background:#FFA800 -o-linear-gradient(#FFA800, #FFAF00);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#FFA800', EndColorStr='#FFAF00');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red4 h4,.o_eportfolio_maps .o_map-epmst-red4 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red4 h2{color:#444}.o_eportfolio_maps .o_map-epmst-red4 .panel-body,.o_eportfolio_maps .o_map-epmst-red4 td,.o_eportfolio_maps .o_map-epmst-red4 a{color:#000}.o_map-epmst-blue{background:#00D2F8;background:#00D2F8 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#00D2F8), to(#4A9EAD));background:#00D2F8 -moz-linear-gradient(43% 71% 101deg, #4A9EAD, #00D2F8);background:#00D2F8 -o-linear-gradient(#00D2F8, #4A9EAD);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#00D2F8', EndColorStr='#4A9EAD');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue h4,.o_eportfolio_maps .o_map-epmst-blue .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue .panel-body,.o_eportfolio_maps .o_map-epmst-blue td,.o_eportfolio_maps .o_map-epmst-blue a{color:#000}.o_map-epmst-blue2{background-color:#C4F6FF;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue2 h4,.o_eportfolio_maps .o_map-epmst-blue2 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue2 h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue2 .panel-body,.o_eportfolio_maps .o_map-epmst-blue2 td,.o_eportfolio_maps .o_map-epmst-blue2 a{color:#000}.o_map-epmst-blue3{background-color:#B3E2F7;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue3{box-shadow:3px 3px 4px rgba(20,20,20,0.4)}.o_eportfolio_maps .o_map-epmst-blue3 h4,.o_eportfolio_maps .o_map-epmst-blue3 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue3 h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue3 .panel-body,.o_eportfolio_maps .o_map-epmst-blue3 td,.o_eportfolio_maps .o_map-epmst-blue3 a{color:#000}.o_map-epmst-blue4{background:#DEE7F7;background:#DEE7F7 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#DEE7F7), to(#C1E9FD));background:#DEE7F7 -moz-linear-gradient(43% 71% 101deg, #C1E9FD, #DEE7F7);background:#DEE7F7 -o-linear-gradient(#DEE7F7, #C1E9FD);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#DEE7F7', EndColorStr='#C1E9FD');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue4 h4,.o_eportfolio_maps .o_map-epmst-blue4 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue4 h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue4 .panel-body,.o_eportfolio_maps .o_map-epmst-blue4 td,.o_eportfolio_maps .o_map-epmst-blue4 a{color:#000}.o_portfolio div#o_main_toolbar.o_toolbar{margin-top:0px}.o_section_lead,.o_page_lead,.o_assignment_lead{padding:10px 10px;margin-bottom:10px;background-color:#f2f2f2;border-radius:3px;border:1px #d9d9d9 solid}.o_section_ended .o_section_lead{border-color:#eba5a3;background-color:#f4cecd}.o_media.o_media_right,.o_media.o_media_right_large{float:right;margin-left:2em;margin-bottom:2em}.o_media.o_media_left,.o_media.o_media_left_large{float:left;margin-right:2em;margin-bottom:2em}.o_media.o_media_left,.o_media.o_media_right{max-height:200px;max-width:50%}.o_media.o_media_left img,.o_media.o_media_right img{max-height:200px}.o_media.o_media_right_large,.o_media.o_media_left_large{max-height:300px;max-width:75%}.o_media.o_media_right_large img,.o_media.o_media_left_large img{max-height:300px}.o_media img{border-radius:3px;border:1px #d9d9d9 solid;background:#fff;height:auto;width:auto}@media (max-width: 767px){.o_page_lead .o_media.o_media_right,.o_page_lead .o_media.o_media_right_large{margin-left:1em;margin-bottom:1em}.o_page_lead .o_media.o_media_left,.o_page_lead .o_media.o_media_left_large{margin-right:1em;margin-bottom:1em}.o_page_lead .o_media.o_media_left,.o_page_lead .o_media.o_media_right{max-height:120px;max-width:30%}.o_page_lead .o_media.o_media_left img,.o_page_lead .o_media.o_media_right img{max-height:120px}.o_page_lead .o_media.o_media_right_large,.o_page_lead .o_media.o_media_left_large{max-height:180px;max-width:50%}.o_page_lead .o_media.o_media_right_large img,.o_page_lead .o_media.o_media_left_large img{max-height:180px}}.o_portfolio_page .o_block_imagebg{border:1px #d9d9d9 solid}.o_page_lead{padding:20px}.o_page_lead h2{margin-bottom:5px}.o_page_lead .o_portfolio_page_meta{margin-bottom:5px}.o_page_lead .o_page_summary{font-size:18px}.o_page_lead .o_media.o_desc_empty{max-height:300px;text-align:center}.o_page_lead .o_media.o_desc_empty img{max-height:300px}.o_page_lead .o_portfolio_status_block{border-top:1px solid #d9d9d9;padding-top:1em;margin-bottom:-1em}.o_page_lead .o_portfolio_status{display:inline-block;padding-right:2em}.o_page_lead.o_block_imagebg .o_portfolio_status{padding:2px;background-color:rgba(255,255,255,0.8)}.o_portfolio_status_block p.o_section_ended{font-size:120%}.o_page_assignment{font-size:12px}.o_page_assignment.o_togglebox_wrapper div.o_togglebox_content{margin:10px 0 20px 0;padding:20px;border-left:3px solid #d9534f;background-color:#f2dede}.o_page_assignment .o_page_assignement_info{position:relative;left:-1em}.o_page_export .o_page_assignment .o_opener,.o_binder_export .o_page_assignment .o_opener{visibility:hidden}.o_page_export .o_page_assignment .o_closer,.o_binder_export .o_page_assignment .o_closer{display:none}.o_portfolio_listing.o_rendertype_custom .o_table_body.container-fluid{padding-right:0px;padding-left:0px}.o_portfolio_listing.o_rendertype_custom .o_portfolio_entry{position:relative;display:inline-block;height:230px;width:400px;vertical-align:top;margin-right:10px}.o_portfolio_listing.o_rendertype_custom .o_portfolio_entry ul{padding-left:2em}.o_portfolio_listing.o_rendertype_custom .panel-imagebg .panel-body ul{margin:0;padding:0;list-style-type:none}.o_portfolio_listing.o_rendertype_custom .panel-imagebg .panel-body ul li{padding:2px}.o_binder.o_portfolio_assignments .panel-heading,.o_binder.o_portfolio_assignments .panel-body{border-left:3px solid #d9534f}.panel-default.o_portfolio_assignments .panel-heading,.panel-default.o_portfolio_assignments .panel-body{border-left:3px solid #d9534f}.o_portfolio_page .o_portfolio_assignments .o_portfolio_page_body{border-left:3px solid #d9534f}.o_portfolio_page .o_portfolio_assignments .o_portfolio_page_body .o_portfolio_page_meta_wrapper,.o_portfolio_page .o_portfolio_assignments .o_portfolio_page_body .o_portfolio_page_summary{padding-left:10px}.o_portfolio_page_summary .o_media.o_media_right,.o_portfolio_page_summary .o_media.o_media_right_large{margin-left:1em;margin-bottom:1em}.o_portfolio_page_summary .o_media.o_media_left,.o_portfolio_page_summary .o_media.o_media_left_large{margin-right:1em;margin-bottom:1em}.o_portfolio_page_summary .o_media.o_media_left,.o_portfolio_page_summary .o_media.o_media_right{max-height:150px}.o_portfolio_page_summary .o_media.o_media_left img,.o_portfolio_page_summary .o_media.o_media_right img{max-height:150px}.o_portfolio_page_summary .o_media.o_media_right_large,.o_portfolio_page_summary .o_media.o_media_left_large{max-height:230px}.o_portfolio_page_summary .o_media.o_media_right_large img,.o_portfolio_page_summary .o_media.o_media_left_large img{max-height:230px}.o_portfolio_categories .tag{font-size:80%;font-weight:normal}.o_portfolio_categories div,.o_portfolio_categories form{display:inline-block}.o_portfolio_categories_edit .bootstrap-tagsinput{margin-bottom:0;padding:0px 4px}.o_portfolio_last_modified+.o_portfolio_categories,.o_portfolio_page_meta+.o_portfolio_categories{margin-left:1em}.o_rendertype_classic .o_pf_page,.o_rendertype_classic .o_pf_assignment{padding-left:1em}.o_portfolio_timeline .o_timeline_up{text-align:center}.o_portfolio_timeline .o_timeline_down{text-align:center}.o_portfolio_timeline .axis path,.o_portfolio_timeline .axis line{fill:none;stroke:#000;shape-rendering:crispEdges}.o_portfolio_timeline .x.axis line,.o_portfolio_timeline .x.axis path{display:none}.o_portfolio_timeline path.o_timeline_curve{fill:none;stroke:#ccc;shape-rendering:crispEdges}.o_portfolio_timeline .y.axis .tick line,.o_portfolio_timeline .y.axis path.domain{stroke:#ddd}.o_portfolio_timeline text{fill:#888;stroke:none;font-size:10px}.o_portfolio_timeline .dot.o_pf_status_draft{fill:#f0ad4e}.o_portfolio_timeline .dot.o_pf_status_published{fill:#337ab7}.o_portfolio_timeline .dot.o_pf_status_inrevision{fill:#d9534f}.o_portfolio_timeline .dot.o_pf_status_closed{fill:#5cb85c}.o_portfolio_timeline .dot.o_pf_status_deleted{fill:#000}.o_pf_comments{margin-top:3em}.o_pf_content .o_cit,.o_pf_content .o_text,.o_pf_content .o_file{background-color:#f8f8f8;padding:10px;border-radius:10px}.o_pf_content .o_forum{border:1px #f8f8f8 solid;padding:10px;border-radius:10px}.o_pf_content .o_image,.o_pf_content .o_video{padding:10px;width:100%}.o_pf_content .o_image img,.o_pf_content .o_video img{border:1px #f8f8f8 solid;border-radius:10px}.o_pf_content .o_image .o_artefact_metadata,.o_pf_content .o_video .o_artefact_metadata{text-align:left}.o_pf_content .o_efficiencystatement,.o_pf_content .o_feed,.o_pf_content .o_forum,.o_pf_content .o_wiki{background-color:#f8f8f8;padding:10px;border-radius:10px}.o_pf_content .o_efficiencystatement h3,.o_pf_content .o_efficiencystatement .h3,.o_pf_content .o_feed h3,.o_pf_content .o_feed .h3,.o_pf_content .o_forum h3,.o_pf_content .o_forum .h3,.o_pf_content .o_wiki h3,.o_pf_content .o_wiki .h3{font-size:14px}.o_pf_content .o_efficiencystatement .row,.o_pf_content .o_feed .row,.o_pf_content .o_forum .row,.o_pf_content .o_wiki .row{margin:0}.o_pf_content .o_efficiencystatement .o_block_with_datecomp,.o_pf_content .o_feed .o_block_with_datecomp,.o_pf_content .o_forum .o_block_with_datecomp,.o_pf_content .o_wiki .o_block_with_datecomp{margin-top:0.5em;margin-bottom:0}.o_pf_video_placeholder{background-color:#f8f8f8;border:1px solid #f8f8f8;border-radius:10px;display:table;min-width:400px;text-align:center;padding:40px 10px}.o_pf_video_placeholder i{display:table-cell;vertical-align:middle}.o_pf_content_editor .o_toolbar{border:none}.o_pf_content_editor .o_page_part{border:2px solid transparent}.o_pf_content_editor .o_page_part:hover{border:2px dotted #78acd9}.o_pf_content_editor .o_page_fragment_edit{position:relative}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_above{height:25px;width:100%;background:#78acd9;position:absolute;z-index:3;left:0;top:-25px;box-shadow:3px -8px 10px 0px rgba(0,0,0,0.2)}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_above .o_page_add_above{position:absolute;left:0;top:-25px;height:25px;border-left:2px dashed #78acd9;border-top:2px dashed #78acd9;border-right:2px dashed #78acd9;border-radius:10px 10px 0 0;box-shadow:0 -5px 10px 0px rgba(0,0,0,0.2);background:#fff}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_above .o_sel_add_element_above{display:inline-block;padding:5px 5px 0 5px}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_above .o_page_others_above{padding-right:25px;line-height:25px;vertical-align:middle}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_above .o_page_others_above .o_page_type{display:none}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_above .o_page_others_above a{float:right;color:#fff;padding-right:1em}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_above .o_page_others_above a:hover{color:#e6e6e6}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_dd{position:absolute;z-index:4;top:0;right:0;width:25px;height:100%;background:#78acd9}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_dd a{position:absolute;display:inline-block;width:25px;height:25px;line-height:25px;text-align:center;vertical-align:middle;color:#fff}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_dd a:hover{color:#e6e6e6}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_dd a.o_disabled{color:rgba(255,255,255,0.5) !important}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_dd a.o_disabled:hover{color:rgba(255,255,255,0.5) !important}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_dd a.o_sel_move_up_element{z-index:4;top:-25px}.o_pf_content_editor .o_page_fragment_edit .o_page_tools_dd a.o_sel_move_down_element{bottom:0}.o_pf_content_editor .o_page_fragment_edit .o_page_part.o_page_edit{padding-right:25px;border:2px solid #78acd9;box-shadow:5px 5px 10px 0px rgba(0,0,0,0.2)}.o_pf_content_editor .o_page_fragment_edit .o_page_part.o_page_edit:hover{border:2px solid #78acd9}.o_pf_content_editor .o_page_fragment_edit .o_page_part.o_page_edit .o_page_edit_toolbar{position:absolute;z-index:5;left:5px;top:-25px;display:inline-block;height:25px;line-height:25px;vertical-align:middle}.o_pf_content_editor .o_page_fragment_edit .o_page_part.o_page_edit .o_page_edit_toolbar a{color:#fff}.o_pf_content_editor .o_page_fragment_edit .o_page_part.o_page_edit .o_page_edit_toolbar a:hover{color:#e6e6e6}.o_pf_content_editor .o_page_fragment_edit .o_page_part.o_page_edit .o_page_edit_toolbar a.o_disabled{color:rgba(255,255,255,0.5) !important}.o_pf_content_editor .o_page_fragment_edit .o_page_part.o_page_edit .o_page_edit_toolbar a.o_disabled:hover{color:rgba(255,255,255,0.5) !important}.o_pf_content_editor .o_page_fragment_edit .o_page_part.o_page_edit .o_page_edit_title .o_page_edit_toolbar li{font-weight:bold}.o_pf_content_editor .o_page_fragment_edit .o_page_part.o_page_edit .o_richtext_mce textarea{border:0}.o_pf_content_editor .o_page_fragment_edit .o_page_add_below{position:absolute;z-index:3;left:0;bottom:-25px;height:25px;border-left:2px dashed #78acd9;border-bottom:2px dashed #78acd9;border-right:2px dashed #78acd9;border-radius:0 0 10px 10px;box-shadow:3px 8px 10px 0px rgba(0,0,0,0.2);background:#fff}.o_pf_content_editor .o_page_fragment_edit .o_page_add_below .o_sel_add_element_below{display:inline-block;padding:0 5px 5px 5px}.o_pf_content_editor .o_pf_add_contents{margin-top:30px}.o_portfolio_add_callout a span{display:none}.o_portfolio_add_callout ul.list-inline{margin-bottom:0}.o_portfolio_image_options{clear:both;width:300px;padding:5px}.o_binder_page_listing .o_portfolio_page_links{background-color:#f8f8f8;border-radius:4px}.o_binder_page_listing .o_portfolio_page_links .o_portfolio_comment{float:right}.o_portfolio_toc{padding-bottom:6em}.o_portfolio_toc .o_portfolio_section_meta{font-size:80%;color:#777;position:relative;top:-15px}.o_portfolio_toc .o_section{position:relative}.o_portfolio_toc .o_section .o_header_with_buttons h4,.o_portfolio_toc .o_section .o_header_with_buttons .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_portfolio_toc .o_section .o_header_with_buttons h2{padding-right:0.5em}.o_portfolio_toc .o_section_actions{position:absolute;top:0;right:0}.o_portfolio_toc .o_section_actions .o_section_move_up_and_down{display:inline-block}.o_portfolio_toc .o_section_actions .o_section_dropdown{display:inline-block;position:relative;top:-0.5em;padding-left:0.5em}.o_portfolio_toc ul>li>ul{padding-left:1.5em}.o_portfolio div span.badge{padding:3px 7px}.o_portfolio div .o_portfolio_entry_draft{background-color:#f0ad4e}.o_portfolio div .o_portfolio_published{background-color:#337ab7}.o_portfolio div .o_portfolio_entry_revision{background-color:#d9534f}.o_portfolio div .o_portfolio_entry_closed{background-color:#5cb85c}.o_portfolio div .o_portfolio_entry_deleted{background-color:#000}.o_portfolio div .o_portfolio_entry_incoming{background-color:#5cb85c}.o_portfolio div .o_portfolio_entry_inprocess{background-color:#c8c8c8}.o_portfolio div .o_portfolio_entry_done{background-color:#5cb85c}.o_portfolio_content .o_portfolio_toc.o_portfolio_toc_withtimeline{width:70%;float:left}.o_portfolio_content .o_portfolio_timeline{width:29%;float:right}.o_portfolio_content .o_portfolio_toc.o_portfolio_withtimeline,.o_portfolio_content .o_portfolio_entries.o_portfolio_withtimeline{width:70%;float:left}.o_portfolio_content .o_portfolio_timeline{width:29%;float:right}.o_portfolio_page_meta_wrapper{background-position:left top;background-repeat:no-repeat}.o_portfolio_rights table .o_portfolio_section td:first-child{padding-left:1.5em}.o_portfolio_rights table .o_portfolio_page td:first-child{padding-left:2.5em}.o_portfolio_publication table{padding-bottom:10px}.o_portfolio_publication table td{padding:5px 5px 5px 0}.o_portfolio_publication .o_portfolio_ac{font-size:90%}.o_portfolio_publication .o_portfolio_ac table td:nth-of-type(2){width:200px;white-space:nowrap}.o_portfolio_publication .o_portfolio_ac table td:nth-of-type(3){width:40px;white-space:nowrap}.o_portfolio_publication ul ul{margin-left:2em;margin-bottom:5px}.o_portfolio_publication ul li{background:#fbfbfb;padding:3px;margin-bottom:2px}.o_portfolio_publication ul li li{background:#f2f2f2}.o_portfolio_publication ul li li li{background:#eee}.o_portfolio_publication ul li li .table{margin-bottom:0px}@media (max-width: 767px){.o_portfolio_content .o_portfolio_toc.o_portfolio_withtimeline,.o_portfolio_content .o_portfolio_entries.o_portfolio_withtimeline{width:100%;float:none}.o_portfolio_content .o_sel_timeline_off,.o_portfolio_content .o_sel_timeline_on,.o_portfolio_content .o_portfolio_timeline{display:none}.o_portfolio_content .o_portfolio_content .o_portfolio_toc.o_portfolio_withtimeline{width:100%;float:none}}.o_portfolio_media_browser .o_portfolio_medias{position:relative;margin-bottom:20px;margin-top:20px}.o_portfolio_media_browser .o_portfolio_medias:before,.o_portfolio_media_browser .o_portfolio_medias:after{content:" ";display:table}.o_portfolio_media_browser .o_portfolio_medias:after{clear:both}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media{position:relative;float:left;margin:0 20px 20px 0;width:180px}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media:last-child{margin-right:0}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_visual{border:1px solid #337ab7;position:relative;height:180px;width:180px}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_visual span.o_visual_not_available{width:100%;height:100%;display:block}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_visual.o_icon span.o_visual_not_available{background-image:none}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_visual.o_icon{font-size:6em;text-align:center;color:#eee;line-height:140px}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_meta{position:absolute;left:0;bottom:0;width:100%;border:1px solid #337ab7;border-top:0;background-color:rgba(255,255,255,0.8)}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_meta .o_title{margin:0;text-align:center;line-height:2em;height:2em;width:100%;overflow:hidden}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_meta .o_title a{display:block;color:#337ab7;font-family:inherit;font-weight:inherit}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_meta .o_title a:hover{color:#286090}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_meta .o_title a>i{display:none}@media (min-width: 768px) and (max-width: 991px){.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media{width:80px;margin:0 10px 10px 0}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_visual{height:80px;width:80px}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_visual.o_icon{font-size:2.5em;line-height:55px}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_title{font-size:90%}}@media (max-width: 767px){.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media{width:80px;margin:0 1px 1px 0}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_visual{height:80px;width:80px}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_visual.o_icon{font-size:2.5em;line-height:55px}.o_portfolio_media_browser .o_portfolio_medias .o_portfolio_media .o_title{font-size:90%}}.o_ed_htitle h1,.o_ed_htitle .h1{font-size:30px}.o_ed_htitle h2,.o_ed_htitle .h2{font-size:24px}.o_ed_htitle h3,.o_ed_htitle .h3{font-size:18px}.o_ed_htitle h4,.o_ed_htitle .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_ed_htitle h2,.o_ed_htitle .h4{font-size:14px}.o_ed_htitle h5,.o_ed_htitle .h5{font-size:12px}.o_ed_htitle h6,.o_ed_htitle .h6{font-size:12px}@media print{.o_binder h1{font-size:43.2px;margin-top:10cm}.o_portfolio_section{margin-bottom:1cm}.o_portfolio_section h3:first-of-type{font-size:36px}.o_page_lead{border:0;border-bottom:1px solid #d9d9d9;border-radius:0;background-color:none;padding:0;margin-bottom:10px}.o_page_lead .o_portfolio_status_block{border-top:0;margin-bottom:0}.o_page_lead .o_media img{border:0}.o_page_lead .o_portfolio_categories{display:block;margin-left:0}.o_page_lead .o_portfolio_status_block{padding-top:0}.o_page_lead .o_page_summary{margin-top:1em;font-style:italic}.o_pf_content .o_cit,.o_pf_content .o_text,.o_pf_content .o_file,.o_pf_content .o_forum,.o_pf_content .o_image,.o_pf_content .o_video,.o_pf_content .o_efficiencystatement,.o_pf_content .o_feed,.o_pf_content .o_forum,.o_pf_content .o_wiki{padding:0;border-radius:0;border:0}.o_pf_content .o_cit .o_desc p,.o_pf_content .o_text .o_desc p,.o_pf_content .o_file .o_desc p,.o_pf_content .o_forum .o_desc p,.o_pf_content .o_image .o_desc p,.o_pf_content .o_video .o_desc p,.o_pf_content .o_efficiencystatement .o_desc p,.o_pf_content .o_feed .o_desc p,.o_pf_content .o_forum .o_desc p,.o_pf_content .o_wiki .o_desc p{margin:0}.o_efficiencystatement table{font-size:90%}.o_artefact_metadata{page-break-inside:avoid;border:0;border-left:5px solid #eee;padding-left:10px;font-size:80%}.o_artefact_metadata table td,.o_artefact_metadata table th{border:0 !important;padding:2px !important}.o_artefact_metadata table th:first-of-type{width:20%}.o_pf_video_placeholder{background-color:#f8f8f8 !important;-webkit-print-color-adjust:exact;color-adjust:exact}.o_pf_video_placeholder.visible-print-block{display:table !important}}.o_rubric_insufficient{background-color:#fee08b}.o_rubric_neutral{background-color:#ffffbf}.o_rubric_sufficient{background-color:#d9ef8b}.o_evaluation_form .o_evaluation_block{margin-top:2em;margin-bottom:2em}.o_evaluation_form .o_evaluation_step_labels{margin-bottom:1em;font-weight:bold}.o_evaluation_form .o_evaluation_step_labels div,.o_evaluation_form .o_evaluation_step_labels span{display:inline-block;text-align:center;align-self:flex-end}.o_evaluation_form .o_slider{margin-bottom:1em}.o_evaluation_form .o_slider label{padding:0}.o_evaluation_form .o_slider input{padding:0;margin:0;position:relative}.o_evaluation_form .o_slider .o_evaluation_no_response label{margin-top:-3px}.o_evaluation_form .o_slider.hover{background-color:#f5f5f5}.o_evaluation_form .o_evaluation_discrete_radio .o_slider .o_evaluation_steps{display:flex;justify-content:space-between}.o_evaluation_form .o_evaluation_discrete_radio .o_slider .o_evaluation_steps label{padding:0;margin:0;text-align:center}.o_evaluation_form .o_evaluation_discrete_radio .o_slider .o_evaluation_steps .radio{background-color:#f9f9f9;padding:0px;margin-top:0px;text-align:center}.o_evaluation_form .o_evaluation_discrete_radio .o_slider .o_evaluation_steps .radio:hover{background-color:#f5f5f5}.o_evaluation_form .o_evaluation_discrete_radio .o_slider .o_evaluation_no_response div.checkbox{margin-top:0px}.o_evaluation_form .o_evaluation_discrete_radio .o_evaluation_step_labels{display:flex;justify-content:space-between}.o_evaluation_form .o_slider .ui-slider.ui-slider-horizontal.ui-widget-content{margin-top:0.3em}.o_evaluation_form .o_evaluation_left_label{text-align:right;font-weight:normal}.o_evaluation_form .o_evaluation_left_label.o_evaluation_left_label_la{text-align:left;padding-left:0px;font-weight:normal}.o_evaluation_form .o_evaluation_right_label{text-align:left;font-weight:normal}.o_evaluation_form .o_evaluation_legend{padding-left:0.5em;margin-bottom:0.5em}.o_evaluation_form .o_evaluation_mc_other{margin-top:-20px;margin-left:20px}.o_evaluation_form .o_evaluation_rubric_diagrams .o_slider{margin-left:15px;margin-right:15px}.o_evaluation_form .o_evaluation_rubric_diagrams .o_end_label{text-align:right;padding-right:20px}.o_evaluation_form .o_evaluation_rubric_diagrams .o_continous .x .tick{visibility:hidden}.o_evaluation_form .o_ed_rubrictablehandler .table{margin-top:5px}.o_evaluation_form .svg-container{display:inline-block;position:relative;width:100%;padding-bottom:50%;vertical-align:top;overflow:hidden}.o_evaluation_form .svg-content-responsive{display:inline-block;position:absolute;top:10px;left:0}.d3chart .o_eva_bar{fill:#337ab7}.o_evaluation_discrete_slider .o_evaluation_step_labels{position:relative}.o_evaluation_discrete_slider .o_evaluation_step_labels div:first-child{position:absolute;left:0px;text-align:left}.o_evaluation_discrete_slider .o_evaluation_step_labels div{display:inline-block;text-align:center}.o_evaluation_discrete_slider .o_evaluation_step_labels div:last-child{position:absolute;right:0px;text-align:right}.o_slider_overview{width:100%;height:20px;position:relative}.o_slider_overview .o_slider_overview_line{top:5px;left:0px;position:absolute;width:100%;height:11px;border:1px solid #999;border-radius:4px}.o_slider_overview .o_slider_overview_point{position:absolute;width:10px;height:10px;background-color:#337ab7}.o_evaluation_editor_form{margin:10px 10px 0 10px}.o_evaluation_editor_form .o_slider_editor{margin-top:10px;position:relative}.o_evaluation_editor_form .o_evaluation_step_labels{display:inline-block}.o_evaluation_editor_form .o_evaluation_step_labels input{width:100%}.o_evaluation_editor_form .o_slider_descrete_radio{display:flex;justify-content:space-between}.o_evaluation_editor_form .o_slider_descrete_radio .radio{background-color:#f9f9f9;padding:0px;margin-top:0px;text-align:center}.o_evaluation_editor_form .o_slider_descrete_radio .radio:hover{background-color:#f5f5f5}.o_evaluation_editor_form .o_slider_continous{padding-top:10px;padding-bottom:-10px}.o_evaluation_editor_form .o_slider_descrete{padding-top:5px;padding-bottom:-5px}.o_evaluation_editor_form .o_evaluation_example{font-size:90%}.o_evaluation_editor_form .o_slider_editor_delete{padding-right:48px}.o_evaluation_editor_form .o_slider_editor_delete .o_slider_editor_delete_button{position:absolute;right:15px}@media (max-width: 768px){.o_evaluation_form .o_evaluation_left_label{text-align:left;margin-bottom:0.5em}.o_evaluation_form .o_evaluation_right_label{text-align:right}.o_evaluation_form .o_evaluation_no_response{text-align:left}.o_evaluation_form .o_evaluation_no_response .o_evaluation_no_resp_value{font-weight:bold}.o_evaluation_form .o_evaluation_slider .o_evaluation_no_response{margin-top:0.7em}.o_evaluation_form .o_slider{margin-bottom:2em}.o_evaluation_form .o_slider div{padding-left:0}}@media (min-width: 768px){.o_evaluation_form .o_evaluation_no_resp_value{display:none}}@media print{.o_evaluation_block{page-break-inside:avoid}.o_evaluation_discrete_radio .o_slider .o_evaluation_steps div.radio{-webkit-print-color-adjust:exact;color-adjust:exact;background-color:#f9f9f9 !important}}.o_surv_run.withCmds .o_eva_report{margin-top:-44px}.o_eva_report .o_eva_overview .o_eva_rubric .table{margin-top:5px}.o_eva_report .o_ed_rubrictablehandler .o_table_footer{font-weight:bold}.o_eva_report .o_rubric_avg{font-weight:bold}.o_qual_execute .o_qual_context_table th{width:30%}.o_qual_execute .o_qual_context_table td{width:70%}.o_cit{position:relative;margin:10px 0}.o_cit blockquote.o_quote{color:#555;font-size:18px;margin-top:6px;margin-bottom:0;padding:0 12px;font-style:italic;padding:5px 5px 0;border:0}.o_cit blockquote.o_quote p:last-child:after{content:'1)';top:-0.5em;font-size:75%;line-height:0;position:relative;vertical-align:baseline}.o_cit .o_cit_bibinfo{font-size:90%;margin-left:1em;position:relative}.o_cit .o_cit_bibinfo>div:first-child:before{content:'1)';position:absolute;top:0.5em;left:-1em;font-size:75%;line-height:0;vertical-align:baseline}.o_cit .title,.o_cit .url,.o_cit .authors,.o_cit .pages,.o_cit .date,.o_cit .dateAdded,.o_cit .place,.o_cit .institution,.o_cit .issue,.o_cit .publisher,.o_cit .publicationTitle,.o_cit .edition,.o_cit .series,.o_cit .volume{margin-right:0.5em}.o_cit .title{font-style:italic}.o_cit .publicationTitle{color:black}.o_cit .links{padding-left:2em}.o_cit .notes{padding-left:2em;color:grey}.o_cit .note{font-style:italic}.o_cit .note p:first-child{margin-top:0}.o_cit .note p:first-child{margin-bottom:0}.o_cit .listing.web .item{padding-left:0;text-indent:0}.o_cit .listing.web .title{display:block;font-weight:bold;font-style:normal}.o_cit .listing.web .publicationTitle{display:block;font-style:italic}.o_cit .listing.web .url{display:block}.o_cit .listing.web .links{padding-left:0}.o_cit .listing.web .notes{padding-left:0}.o_cit .general-info{border-top:1px solid #eee;padding-top:30px;margin-top:30px}.o_cit .copyright{display:none}@media print{.o_cit blockquote.o_quote{page-break-inside:avoid}}.o_video_poster{position:relative;display:inline-block;width:400px;max-width:100%;height:225px;background-size:cover;background-repeat:no-repeat;border:1px solid #eee}.o_video_poster_select{text-align:center}.o_video_poster_select .o_video_poster{margin:5px}.o_video_poster_select .o_video_poster a{position:absolute;left:0;top:0;width:100%;height:100%}.o_video_poster_select .o_video_poster a span{position:absolute;bottom:0;width:100%;display:block;line-height:3em;background:#f8f8f8;opacity:0.8}.o_video_poster_select .o_video_poster a:hover{border:1px solid #bbb}.o_video_poster_select .o_video_poster a:hover span{opacity:0.9}.o_video_peekview{text-align:center}.o_video_listing .o_table_body.container-fluid{padding-right:0px;padding-left:0px}.o_video_listing .o_video_entry{position:relative;display:inline-block;height:230px;width:250px;vertical-align:top;margin-right:10px}.o_video_listing .o_video_poster{width:250px;max-width:100%;height:140px;border:1px solid #eee}.o_video_listing .o_timecode{position:absolute;bottom:2px;right:3px;padding:3px 4px;background:#333;color:#fff;font-size:12px;line-height:12px}.o_video_listing .o_meta{padding:2px;font-size:11px}.o_video_listing .o_meta h5{font-size:14px;margin-top:0;margin-bottom:5px;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.o_video_listing .o_date{margin-left:10px;display:inline-block}.o_video_listing .o_date:before{content:'\002022';margin-right:10px;display:inline-block}.o_video_run h1{font-size:1.8rem;font-weight:normal}.o_video_run .o_author{margin-top:0.5em;margin-bottom:1em;line-height:normal;font-size:90%;color:#3c763d}.o_video_run .o_ratings_and_comments{margin-top:2em;border-top:1px solid #eee;padding-top:1em}.o_video_chapter_editor .o_table_wrapper.o_table_flexi .table{margin-top:0}.mejs__controls .mejs__sourcechooser-button>button{background:transparent;display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}.mejs__controls .mejs__sourcechooser-button>button:before{content:"";color:white;font-size:18px}.mejs__controls .mejs__sourcechooser-button .mejs__sourcechooser-selector{visibility:visible !important;width:170px;padding-left:10px}.mejs__controls .mejs__sourcechooser-button .mejs__sourcechooser-selector ul li label{font-weight:normal;font-size:10px;width:140px}.mejs__controls .mejs__sourcechooser-button .mejs__sourcechooser-selector ul li label:hover{color:#eee}.mejs__controls .mejs__sourcechooser-button .mejs__sourcechooser-selector ul li label .type{display:none}.mejs__controls .mejs__sourcechooser-button .mejs__sourcechooser-selector ul li input{visibility:hidden;margin:0;width:0}.mejs__controls .mejs__sourcechooser-button .mejs__sourcechooser-selector ul li input:checked+label{color:#d9534f}.mejs__controls .mejs__captions-button .mejs__captions-selector{right:-26px}.mejs__controls .mejs__captions-button .mejs__captions-selector ul li label{font-weight:normal;font-size:10px}.mejs__controls .mejs__captions-button .mejs__captions-selector ul li label:hover{color:#eee}.mejs__controls .mejs__captions-button .mejs__captions-selector ul li label .type{display:none}.mejs__controls .mejs__captions-button .mejs__captions-selector ul li input{visibility:hidden;margin:0;width:0}.mejs__controls .mejs__captions-button .mejs__captions-selector ul li input:checked+label{color:#d9534f}.mejs__button.mejs__speed-button{width:36px}.mejs__controls .mejs__speed-button>button{background:transparent;width:36px;margin:11px 0 0 0;font-size:11px;line-height:normal;color:#ffffff}.mejs__controls .mejs__speed-button .mejs__speed-selector{height:150px;top:auto;bottom:40px}.mejs__controls .mejs__speed-button .mejs__speed-selector ul li label{font-weight:normal;font-size:10px}.mejs__chapters .mejs__chapter .mejs__chapter-block .ch-title,.mejs__chapters .mejs__chapter .mejs__chapter-block .ch-time{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}.o_userbulk_changedcell{font-style:italic;font-weight:bold}.o_qpool_source_status{text-align:center}.o_qitem_author{white-space:nowrap}.dropdown-toggle.o_qpool_tools_status>i{margin:0 0 3px 0}.dropdown-menu.o_qpool_tools_status{cursor:pointer}a.o_qpool_status{margin:0 2px 2px 2px;text-align:left}a.o_qpool_status_draft,.dropdown-toggle.o_qpool_status_draft{background-color:#4a6785 !important;border-color:#4a6785;color:#fff !important}a.o_qpool_status_review,.dropdown-toggle.o_qpool_status_review{background-color:#ffd351 !important;border-color:#ffd351;color:#fff !important}a.o_qpool_status_revised,.dropdown-toggle.o_qpool_status_revised{background-color:#933 !important;border-color:#933;color:#fff !important}a.o_qpool_status_finalVersion,.dropdown-toggle.o_qpool_status_finalVersion{background-color:#14892c !important;border-color:#14892c;color:#fff !important}a.o_qpool_status_endOfLife,.dropdown-toggle.o_qpool_status_endOfLife{background-color:#aaa !important;border-color:#aaa;color:#fff !important}.o_qpool_status_draft_light{border-color:#4a6785;color:#4a6785}.o_qpool_status_review_light{border-color:#ffd351;color:#333}.o_qpool_status_revised_light{border-color:#933;color:#933}.o_qpool_status_finalVersion_light{border-color:#14892c;color:#14892c}.o_qpool_status_endOfLife_light{border-color:#aaa;color:#aaa}.btn-arrow-right.o_qpool_qitem_draft{background:#f8f8f8;border-bottom-color:#4a6785;border-bottom-width:3px}.btn-arrow-right.o_qpool_qitem_review{background:#f8f8f8;border-bottom-color:#ffd351;border-bottom-width:3px}.btn-arrow-right.o_qpool_qitem_revised{background:#f8f8f8;border-bottom-color:#933;border-bottom-width:3px}.btn-arrow-right.o_qpool_qitem_final{background:#f8f8f8;border-bottom-color:#14892c;border-bottom-width:3px}.btn-arrow-right.o_qpool_qitem_end_of_life{background:#f8f8f8;border-bottom-color:#aaa;border-bottom-width:3px}.btn-arrow-right.o_qpool_status_slected{background-color:#e7e7e7;color:#555}.btn-arrow-right,.btn-arrow-left{position:relative;padding-left:18px;padding-right:18px;margin-bottom:5px}.btn-arrow-right{padding-left:36px}.btn-arrow-left{padding-right:36px}.btn-arrow-right:before,.btn-arrow-right:after,.btn-arrow-left:before,.btn-arrow-left:after{content:"";position:absolute;top:5px;width:22.627417px;height:22.627417px;background:inherit;border:inherit;border-left-color:transparent;border-bottom-color:transparent;border-radius:0px 4px 0px 0px;-webkit-border-radius:0px 4px 0px 0px;-moz-border-radius:0px 4px 0px 0px}.btn-arrow-right:before,.btn-arrow-right:after{transform:rotate(45deg);-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-o-transform:rotate(45deg);-ms-transform:rotate(45deg)}.btn-arrow-left:before,.btn-arrow-left:after{transform:rotate(225deg);-webkit-transform:rotate(225deg);-moz-transform:rotate(225deg);-o-transform:rotate(225deg);-ms-transform:rotate(225deg)}.btn-arrow-right:before,.btn-arrow-left:before{left:-11px}.btn-arrow-right:after,.btn-arrow-left:after{right:-11px}.btn-arrow-right:after,.btn-arrow-left:before{z-index:1}.btn-arrow-right:before,.btn-arrow-left:after{background-color:white}body.o_dmz{background:transparent}body.o_dmz #o_bg{position:absolute;top:0;left:0;width:100%;height:100%;border-top:50px solid transparent;border-bottom:70px solid transparent;background:url("../light/images/learn-bg.jpg");background-size:cover;background-position:center center;background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#00ffffff', endColorstr='#ffffff',GradientType=1 )}body.o_dmz #o_bg:after{content:" ";position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(to right, rgba(255,255,255,0.1) 0.2%, rgba(255,255,255,0.6) 60%, rgba(255,255,255,0.8) 100%);background-size:cover;background-position:center center;background-repeat:no-repeat}body.o_dmz #o_toplink{display:none}body.o_dmz #o_main_wrapper,body.o_dmz #o_main_wrapper #o_main_container{background:transparent}.o_login{padding-bottom:20px;padding-left:10%;padding-right:10%;text-align:right}.o_login .o_login_intro{padding-left:10%}.o_login .o_login_intro h1{margin-bottom:40px;color:#337ab7}.o_login .o_login_intro .lead{color:#333}.o_login .o_login_intro .lead h1,.o_login .o_login_intro .lead h2,.o_login .o_login_intro .lead h3,.o_login .o_login_intro .lead h4,.o_login .o_login_intro .lead .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_login .o_login_intro .lead h2,.o_login .o_login_intro .lead h5{margin-bottom:20px;color:#337ab7}.o_login .o_login_messages,.o_login .o_login_box{display:inline-block;width:400px;text-align:left}.o_login .o_login_messages .o_infomessage_wrapper{background:rgba(255,255,255,0.5);border:1px solid transparent;border-radius:4px;padding:6px 12px}.o_login .o_login_messages .o_infomessage_wrapper .o_info,.o_login .o_login_messages .o_infomessage_wrapper .o_warning,.o_login .o_login_messages .o_infomessage_wrapper .o_note{margin:0}.o_login .o_login_box{padding-top:10px}.o_login .o_login_providers{margin-bottom:6px;border-radius:4px;-webkit-box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3);box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3)}.o_login .o_login_providers a span{display:block;font-size:9px;padding-top:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_login .o_login_providers .o_icon_provider_olat{font-size:1em}.o_login .o_login_provider{background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3);box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3)}.o_login .o_login_form{position:relative;padding:10px 12px}.o_login .o_login_form .o_login_pwd{position:absolute;bottom:2em;right:12px}.o_login .o_login_form .o_form .o_desc{margin:0 0 30px 0;padding:0;border-left:0;background-color:transparent}.o_login .o_login_register{display:block;line-height:2em;font-size:18px;text-align:center;color:#fff;background-color:#5bc0de;border-color:#46b8da;border-radius:4px;margin-top:16px;padding:10px 12px}.o_login .o_login_register:hover,.o_login .o_login_register:focus,.o_login .o_login_register.focus,.o_login .o_login_register:active,.o_login .o_login_register.active,.open>.o_login .o_login_register.dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#269abc}.o_login .o_login_register:active,.o_login .o_login_register.active,.open>.o_login .o_login_register.dropdown-toggle{background-image:none}.o_login .o_login_register.disabled,.o_login .o_login_register.disabled:hover,.o_login .o_login_register.disabled:focus,.o_login .o_login_register.disabled.focus,.o_login .o_login_register.disabled:active,.o_login .o_login_register.disabled.active,.o_login .o_login_register[disabled],.o_login .o_login_register[disabled]:hover,.o_login .o_login_register[disabled]:focus,.o_login .o_login_register[disabled].focus,.o_login .o_login_register[disabled]:active,.o_login .o_login_register[disabled].active,fieldset[disabled] .o_login .o_login_register,fieldset[disabled] .o_login .o_login_register:hover,fieldset[disabled] .o_login .o_login_register:focus,fieldset[disabled] .o_login .o_login_register.focus,fieldset[disabled] .o_login .o_login_register:active,fieldset[disabled] .o_login .o_login_register.active{background-color:#5bc0de;border-color:#46b8da}.o_login .o_login_register .badge{color:#5bc0de;background-color:#fff}.o_login .o_login_register small{font-size:14px}.o_login .o_login_social{position:relative;padding:10px 12px}.o_login .o_login_social li{padding:10px 12px}.o_login .o_login_social li>a{display:block;line-height:2em;text-align:center;font-size:18px;border-radius:4px;padding:10px 12px}.o_login .o_login_social .btn-default.o_sel_auth_facebook{color:#fff;background-color:#4568b2;border-color:#3e5da0}.o_login .o_login_social .btn-default.o_sel_auth_facebook:hover,.o_login .o_login_social .btn-default.o_sel_auth_facebook:focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook.focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_facebook.dropdown-toggle{color:#fff;background-color:#37538d;border-color:#2d4374}.o_login .o_login_social .btn-default.o_sel_auth_facebook:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_facebook.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled],.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook.active{background-color:#4568b2;border-color:#3e5da0}.o_login .o_login_social .btn-default.o_sel_auth_facebook .badge{color:#4568b2;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_twitter{color:#fff;background-color:#2cc5ff;border-color:#13beff}.o_login .o_login_social .btn-default.o_sel_auth_twitter:hover,.o_login .o_login_social .btn-default.o_sel_auth_twitter:focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter.focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_twitter.dropdown-toggle{color:#fff;background-color:#00b4f8;border-color:#009ad4}.o_login .o_login_social .btn-default.o_sel_auth_twitter:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_twitter.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled],.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter.active{background-color:#2cc5ff;border-color:#13beff}.o_login .o_login_social .btn-default.o_sel_auth_twitter .badge{color:#2cc5ff;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_google{color:#fff;background-color:#e15f4f;border-color:#dd4b39}.o_login .o_login_social .btn-default.o_sel_auth_google:hover,.o_login .o_login_social .btn-default.o_sel_auth_google:focus,.o_login .o_login_social .btn-default.o_sel_auth_google.focus,.o_login .o_login_social .btn-default.o_sel_auth_google:active,.o_login .o_login_social .btn-default.o_sel_auth_google.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_google.dropdown-toggle{color:#fff;background-color:#d83825;border-color:#ba3120}.o_login .o_login_social .btn-default.o_sel_auth_google:active,.o_login .o_login_social .btn-default.o_sel_auth_google.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_google.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_google.disabled,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled],.o_login .o_login_social .btn-default.o_sel_auth_google[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google.active{background-color:#e15f4f;border-color:#dd4b39}.o_login .o_login_social .btn-default.o_sel_auth_google .badge{color:#e15f4f;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_linkedin{color:#fff;background-color:#0181bd;border-color:#0170a4}.o_login .o_login_social .btn-default.o_sel_auth_linkedin:hover,.o_login .o_login_social .btn-default.o_sel_auth_linkedin:focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_linkedin.dropdown-toggle{color:#fff;background-color:#015e8a;border-color:#014667}.o_login .o_login_social .btn-default.o_sel_auth_linkedin:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_linkedin.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled],.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin.active{background-color:#0181bd;border-color:#0170a4}.o_login .o_login_social .btn-default.o_sel_auth_linkedin .badge{color:#0181bd;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_adfs{color:#fff;background-color:#337ab7;border-color:#2e6da4}.o_login .o_login_social .btn-default.o_sel_auth_adfs:hover,.o_login .o_login_social .btn-default.o_sel_auth_adfs:focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs.focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_adfs.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.o_login .o_login_social .btn-default.o_sel_auth_adfs:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_adfs.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled],.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs.active{background-color:#337ab7;border-color:#2e6da4}.o_login .o_login_social .btn-default.o_sel_auth_adfs .badge{color:#337ab7;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect{color:#fff;background-color:#337ab7;border-color:#2e6da4}.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect:hover,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect:focus,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.focus,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect:active,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect:active,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.disabled,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect[disabled],.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect.active{background-color:#337ab7;border-color:#2e6da4}.o_login .o_login_social .btn-default.o_sel_auth_OpenIDConnect .badge{color:#337ab7;background-color:#fff}.o_old_browser{display:none}.o_browser_ie7 .o_old_browser,.o_browser_ie8 .o_old_browser,.o_browser_ie9 .o_old_browser,.o_browser_ie10 .o_old_browser{display:block}@media (max-width: 767px){body.o_dmz #o_bg{background:none;display:none}.o_login{padding:0}.o_login .o_login_intro{padding:0;text-align:left}.o_login .o_login_box_wrapper{text-align:center;padding:0}.o_login .o_login_box{padding-left:0;padding-right:0}.o_login .o_login_box .o_login_providers,.o_login .o_login_box .o_login_provider{-webkit-box-shadow:none;box-shadow:none}.o_login .o_login_messages,.o_login .o_login_box{width:100%;display:block}}.o_home_main h1{text-align:center}.o_home_main .o_icon_rss{line-height:20px;vertical-align:middle}.o_showall{font-size:12px;text-align:right;margin-bottom:5px;margin-top:10px}.o_portlet{position:relative;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1)}.o_portlet .o_header{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:6px 12px;border-bottom:1px solid #ddd;background-color:#f5f5f5;border-top-right-radius:4px;border-top-left-radius:4px}.o_portlet .o_content{padding:6px 12px}.o_portlet .o_portlet_table{margin:-12px;margin-bottom:-6px;margin-top:0}.o_portlet .o_table_empty.o_info{padding:6px}.o_portlet .o_toolbox{position:absolute;top:-1px;right:-1px;z-index:2;background-color:#fff;border:1px solid #faebcc;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;padding:6px 12px}.o_portlet .o_toolbox div{display:inline}.o_portlet .o_edit_shim{position:absolute;height:100%;width:100%;z-index:1;background:#fcf8e3;opacity:0.8}.o_inactive .o_header a{float:right;margin-left:12px;margin-top:10px}.o_portlet_dyk_q{margin-top:5px;font-style:italic}.o_portlet_dyk_a{margin:5px 0}.o_portlet_dyk_next{margin:5px 0;text-align:right}.o_library_icon:before{content:""}.o_library ul{list-style:none;margin:0 0 15px 0;padding:0}.o_library ul ul{margin:0}.o_library_overview .o_library_newest_files ul li{float:left;margin-right:15px}.o_library_item{margin-bottom:10px;position:relative}.o_library_item .o_library_visual,.o_library_item .o_library_extra,.o_library_item .o_library_meta{margin-top:15px}.o_library_item .o_library_visual{float:left;background-color:#fff;border-radius:4px;border:1px solid #ddd}.o_library_item .o_library_visual .o_thumbnail_available,.o_library_item .o_library_visual .o_thumbnail_unavailable{background-size:146px auto;width:150px !important;height:150px !important;background-repeat:no-repeat;background-position:50% 50%}.o_library_item .o_library_visual .o_thumbnail_available:before,.o_library_item .o_library_visual .o_thumbnail_unavailable:before{content:none}.o_library_item .o_library_visual .o_thumbnail_available{background-size:146px auto}.o_library_item .o_library_visual .o_thumbnail_unavailable{display:none}.o_library_item .o_library_extra{float:right;width:200px}.o_library_item .o_library_meta{clear:both}.o_library_item .o_library_meta .o_library_desc{padding-bottom:10px}.o_library_item .o_library_meta small{display:block;word-wrap:break-word}.o_library_item h4,.o_library_item .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_library_item h2{margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:normal}.o_library_item .btn{display:block;margin-bottom:0.5em}.o_library_item .o_comments{display:inline-block}.o_library_item .table{table-layout:fixed;word-wrap:break-word;margin-bottom:0}.o_library_item p.o_library_show_more{text-align:right;margin:0;padding-top:20px}.o_library_item .o_library_more{padding-top:20px;display:none}.o_library_folder{margin-top:-20px}.o_library .o_ratings_and_comments .o_rating_title,.o_library .o_ratings_and_comments .o_rating_explanation{display:none}@media (min-width: 768px){.o_library_item .o_library_meta{clear:none;margin-left:150px;margin-right:200px;padding:0 10px}.o_library_item .o_library_more{display:none}.o_library_item .o_library_more table tbody{vertical-align:top}.o_library_item .o_library_more table tr,.o_library_item .o_library_more table th,.o_library_item .o_library_more table td{display:inline-block}.o_library_item .o_library_more table tr{width:49%}.o_library_item .o_library_more table th{width:30%}.o_library_item .o_library_more table td{width:70%}}.o_library_item_compact .o_library_extra{width:auto}.o_library_item_compact .o_library_meta{padding:0 10px 0 0;margin:0;overflow:hidden}.o_library_item_compact .btn{display:inline-block}.o_library_item_compact h4,.o_library_item_compact .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_library_item_compact h2{overflow:hidden;margin-right:70px}.o_library_item_compact h4 a,.o_library_item_compact .o_cal .fc-header-title h2 a,.o_cal .fc-header-title .o_library_item_compact h2 a{text-overflow:ellipsis;white-space:nowrap}.o_library_item_compact p.o_library_show_more{padding:20px;position:absolute;top:0;right:0}span.o_translation_i18nitem{position:relative !important}span.o_translation_i18nitem a.o_translation_i18nitem_launcher{position:absolute !important;z-index:100 !important;width:18px !important;height:20px !important;top:0 !important;left:5px !important;background:#fff;border:1px solid #337ab7 !important;border-radius:3px;text-align:center;padding:0 !important}.o_user_infos{position:relative}.o_user_infos .o_user_portrait{position:absolute;top:0;left:15px;width:100px;height:100px}.o_user_infos .o_user_infos_inner{margin:0 30px 0 100px}.o_user_infos .o_user_infos_inner table{margin:0 30px 15px 30px}.o_useradmin .o_user_infos .o_user_infos_inner{margin-right:45px}div.o_skype_button{display:inline-block}div.o_skype_button p{margin:0 0 0 0}div.o_skype_button p a img{margin:0 !important;vertical-align:middle !important}.o_useradmin div#o_main_toolbar.o_toolbar{margin-top:0px}.o_members_pagination{text-align:center}.o_bcard_logo{margin-left:10px;height:66px}.o_bcard_title_with_logo{clear:both;padding:20px 0 0 0}.o_visitingcard_image,.o_visitingcard_logo{height:66px}.o_visitingcard .o_icon_visitingcard{display:none}.o_visitingcard .o_portrait_avatar,.o_visitingcard .o_portrait_dummy,.o_visitingcard .o_portrait_dummy_female_big,.o_visitingcard .o_portrait_dummy_male_big,.o_visitingcard .o_portrait_anonymous{width:66px;height:66px;margin-right:10px}@media (max-width: 767px){.o_visitingcard .o_portrait_avatar,.o_visitingcard .o_portrait_dummy,.o_visitingcard .o_portrait_dummy_female_big,.o_visitingcard .o_portrait_dummy_male_big,.o_visitingcard .o_portrait_anonymous{width:50px;height:50px;margin:5px 5px 0 0}.o_visitingcard_image,.o_visitingcard_logo{height:50px}.o_visitingcard_logo,.o_bcard_logo{height:50px;margin:5px 0 0 5px}.o_visitingcard_logo img,.o_bcard_logo img{position:relative;transform:scale(.7575757576);top:-8px}}@media (max-width: 414px){.o_visitingcard_logo img{max-width:260px}}@media (max-width: 375px){.o_visitingcard_logo img{max-width:220px}}@media (max-width: 320px){.o_visitingcard_logo img{max-width:180px}.o_bcard_logo img{max-width:150px}}.o_gta_coach_selection .o_noti{display:inline-block;float:none;margin:0}.o_gta_coach_selection .o_gta_coach_selection_bar{position:relative}.o_gta_coach_selection .o_gta_coach_selection_bar .o_noti{position:absolute;top:3px;right:0}p.o_gta_reopen_warning{margin-top:-20px}.o_lecture_authorized_absence div.form-inline,.o_lecture_authorized_absence div.o_navbar-form{display:inline}.o_lectures_teacher_overview .o_table_wrapper.o_table_flexi .table{margin-top:0}.o_lectures_teacher_overview .o_table_wrapper.o_table_flexi .table thead th.o_col_date,.o_lectures_teacher_overview .o_table_wrapper.o_table_flexi .table thead th.o_col_startTime,.o_lectures_teacher_overview .o_table_wrapper.o_table_flexi .table thead th.o_col_endTime,.o_lectures_teacher_overview .o_table_wrapper.o_table_flexi .table thead th.o_col_details,.o_lectures_teacher_overview .o_table_wrapper.o_table_flexi .table thead th.o_col_tools{width:1%}.o_lectures_teacher_overview .o_lectures_current_wrapper{border:1px solid transparent;background:#f8f8f8;border-radius:4px;margin:10px -10px 20px -10px;padding:10px}.o_lectures_teacher_overview .o_lectures_current_wrapper .o_button_group{margin-bottom:0}.o_lectures_teacher_overview .o_lectures_teacher_search .o_form .o_date{padding-right:10px;position:relative}.o_lectures_teacher_overview .o_lectures_teacher_search span.o_chelp_wrapper{position:absolute;top:0;right:0}.o_lectures_rollcall legend{margin-bottom:10px}.o_lectures_rollcall .o_desc,.o_lectures_rollcall .o_preparation{margin:0}.o_rollcall_next_previous_group{text-align:center}.o_rollcall_next_previous_group a.o_sel_close{float:left}.o_rollcall_next_previous_group a.o_sel_close span{display:none}.o_rollcall_next_previous_group .form-control{display:inline;width:auto}@media (max-width: 767px){.o_rollcall_next_previous_group a span{display:none}}.o_lecture_free{color:#777}.o_rollcall_portrait>div{margin:0 auto 10px auto;width:100px}.o_edubase_pv{overflow:hidden;padding-top:10px}.o_edubase_pv_fig{display:inline-block;vertical-align:top;width:110px;margin-right:3%}.o_edubase_run_enabled .o_edubase_page{font-size:12px;color:#777}.o_edubase_run_disabled .o_edubase_booksection{margin-right:3%;margin-bottom:3%;width:177px;display:inline-table}.o_edubase_run_disabled .o_edubase_page{font-size:12px;color:#777}.o_edubase_bs_buttons{padding-top:10px}.o_edubase_bs_book_id{margin-top:-2px}.o_edubase_bs_details{margin-left:-20px}.o_edubase_bs_details_label{visibility:hidden}.o_edubase_bs_cover object{margin-left:10px;margin-top:10px;height:120px}.o_edubase_bs_cover img{margin-left:10px;margin-top:10px;height:120px}.o_edubase_edit_books .o_icon_error{visibility:hidden}.o_edubase_edit_books .o_icon_help{margin-bottom:0px}.o_edubase_edit_books .row{margin-bottom:5px}.o_taxonomy div#o_main_toolbar.o_toolbar{margin-top:0px}.o_taxonomy_listing.o_rendertype_custom .o_table_body.container-fluid{padding-right:0px;padding-left:0px}.o_taxonomy_listing.o_rendertype_custom .o_taxonomy_row{position:relative;display:inline-block;height:200px;width:450px;vertical-align:top;margin-right:10px}.o_taxonomy_listing.o_rendertype_custom .o_taxonomy_row ul{padding-left:2em}.ui-widget{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:100%}.ui-widget-header{border-top:none;border-left:none;border-right:none;border-bottom:1px solid #eee;background:#fff;font-weight:bold}.ui-icon,.ui-widget-content .ui-icon,.ui-widget-header .ui-icon,.ui-state-default .ui-icon,.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-state-active .ui-icon,.ui-state-highlight .ui-icon,.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background:none;background-image:none}.ui-dialog{-webkit-box-shadow:0px 1px 8px -1px rgba(0,0,0,0.35);box-shadow:0px 1px 8px -1px rgba(0,0,0,0.35);background-color:#fefefe}.ui-dialog .ui-widget-header .ui-dialog-title{color:#337ab7;font-weight:500;font-family:inherit;line-height:1.1}.ui-dialog .ui-widget-header .ui-dialog-titlebar-close:before{content:"" !important}.ui-dialog .ui-widget-header .ui-dialog-titlebar-close{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;font-size:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ui-dialog .ui-widget-header .ui-dialog-titlebar-close span{display:none}.ui-dialog .ui-widget-header .ui-button.ui-corner-all{border:none !important;background:#fff !important;float:right}.ui-dialog .ui-widget-content{border-color:#fff;padding:5px;overflow:auto;background:white !important}.ui-dialog .ui-dialog-titlebar{padding:4px 7px 4px 7px;background-color:#eee !important}.ui-dialog.ui-corner-all{border-radius:4px}.ui-dialog.ui-widget-content{border:1px solid transparent}.ui-dialog.o_modal-ui{max-width:100vw;max-height:100vh}.ui-dialog.o_modal-ui div.ui-dialog-buttonpane{display:none}@media (max-width: 767px){.ui-dialog.o_modal-ui{height:100vh !important;width:100vw !important}.ui-dialog.o_modal-ui div.ui-dialog-content{height:90vh !important}}.ui-slider.ui-slider-horizontal.ui-widget-content{border-color:#aaa;background:#f9f9f9}.ui-slider.ui-slider-horizontal.ui-widget-content.ui-state-disabled{opacity:0.65}.o_has_value.ui-slider.ui-slider-horizontal.ui-widget-content .ui-slider-handle{border:1px solid #337ab7;background-image:none;background-color:#337ab7}.o_no_value.ui-slider.ui-slider-horizontal.ui-widget-content .ui-slider-handle{border:3px solid #337ab7;background-image:none}.ui-datepicker{z-index:2000 !important;-webkit-box-shadow:0px 1px 5px -1px rgba(0,0,0,0.15);box-shadow:0px 1px 5px -1px rgba(0,0,0,0.15)}.ui-datepicker .ui-widget-header .ui-corner-all,.ui-datepicker .ui-widget-header .ui-datepicker-next.ui-corner-all{border:none !important;background:#fff !important}.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-e:before{content:"";font-weight:normal;color:black}.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-w:before{content:"";font-weight:normal;color:black}.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-e,.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-w{font-family:'FontAwesome';display:inline-block;background-image:none;background-position:0 0;font-weight:normal;text-indent:0;color:white}.ui-datepicker .ui-widget-header .ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-widget-header .ui-datepicker .ui-datepicker-next-hover{top:2px}.ui-datepicker .ui-state-default{background:#eee}.ui-datepicker .ui-state-highlight,.ui-datepicker .ui-widget-content .ui-state-highlight{border:1px solid #2e6da4;background:#337ab7;color:#fff}.ui-datepicker.ui-corner-all{border-radius:4px}.ui-datepicker.ui-widget-content{border:1px solid transparent}label.mce-label{display:inline;max-width:150px;margin-bottom:0;font-weight:normal}.o_richtext_mce_without_path .mce-statusbar{border:none}.o_richtext_mce_without_path .mce-path{display:none !important}.o_richtext_mce_without_path .mce-menubtn.mce-fixed-width span{width:auto}.o_richtext_mce>.o_richtext_mce_modes{text-align:right;padding-right:4px}.o_richtext_mce>.o_richtext_mce_modes a{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}i.mce-ico.mce-i-media,i.mce-ico.mce-i-movie,i.mce-ico.mce-i-help,i.mce-ico.mce-i-gaptext,i.mce-ico.mce-i-gapnumerical,i.mce-ico.mce-i-hottext,i.mce-ico.mce-i-edit{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}i.mce-ico.mce-i-media:before{content:""}i.mce-ico.mce-i-movie:before{content:""}i.mce-ico.mce-i-gaptext:before{content:""}i.mce-ico.mce-i-gapnumerical:before{content:""}i.mce-ico.mce-i-hottext:before{content:""}i.mce-ico.mce-i-math:before{content:'\03A3'}i.mce-ico.mce-i-edit:before{content:""}i.mce-ico.mce-i-help{width:9px;height:9px;padding-top:1px}i.mce-ico.mce-i-help:before{content:"";color:white}.mce-tabs span.o_chelp_wrapper{float:right;margin:5px}.mce-wordcount:after{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:""}.mce-danger .mce-wordcount:after{color:#d9534f;content:""}.mce-statusbar.mce-danger{background-color:#f2dede}.mce-textbox.mce-danger{border-color:#ce8383;background-color:#f2dede}div.o_table_search span.twitter-typeahead{display:table-cell;padding-top:3px}.tag.label.label-info{margin-right:3px}@media print{a[href]:after{content:""}#o_header_wrapper,#o_offcanvas_right,#o_navbar_wrapper,#o_footer_wrapper,#o_toplink,#o_main_left,#o_main_right,#o_main_toolbar,#jsMath_PrintWarning,.o_segments,.o_noti,.o_opener,.o_hide,.o_noprint{display:none !important}.o_print_break_avoid{page-break-inside:avoid}.o_print_break_before{page-break-before:always}.o_print_break_after{clear:both;page-break-after:always}.btn{display:none}.o_form textarea,.o_form .form-control.textarea_disabled{-webkit-print-color-adjust:exact;color-adjust:exact;background:#fff !important;height:auto !important;color:#000 !important;resize:none}#o_comment_form_link,.o_comments form{display:none !important}.o_avatar{display:none}body.o_dmz{background:white !important;-webkit-print-color-adjust:exact;color-adjust:exact}.modal-content{border:0}.modal-header{display:none}.modal-body{padding:0}.modal-dialog{margin:0 !important;width:100% !important;height:100% !important;background:#fff !important;-webkit-print-color-adjust:exact;color-adjust:exact}.progress{page-break-inside:avoid;-webkit-print-color-adjust:exact;color-adjust:exact;background-color:rgba(0,0,0,0.1) !important;border:1px solid rgba(0,0,0,0.5)}.progress-bar{-webkit-print-color-adjust:exact;background-color:#000 !important;border:10px solid #000}.ui-slider.ui-slider-horizontal.ui-widget-content{-webkit-print-color-adjust:exact;color-adjust:exact;background:#f9f9f9 !important}.ui-slider.ui-slider-horizontal.ui-widget-content .ui-slider-handle{-webkit-print-color-adjust:exact;color-adjust:exact}.o_has_value.ui-slider.ui-slider-horizontal.ui-widget-content .ui-slider-handle{background-color:#337ab7 !important}.o_no_value.ui-slider.ui-slider-horizontal.ui-widget-content .ui-slider-handle{border:none !important}.radial-progress{page-break-inside:avoid;-webkit-print-color-adjust:exact;color-adjust:exact;background-color:#eee !important}.radial-progress .circle .mask .fill{-webkit-print-color-adjust:exact;color-adjust:exact;background-color:#000 !important}.radial-progress .inset{-webkit-print-color-adjust:exact;color-adjust:exact;background-color:#fff !important}body{margin:0}table,figure,figure{page-break-inside:avoid}h1,h2,h3,h4,.o_cal .fc-header-title h2,h5,h6{page-break-after:avoid}.o_disclaimer .o_disclaimer_content{max-height:none}}.o_highscore .o_position{text-align:center;font-size:1.2em;font-weight:bold}.o_highscore .o_position h2{font-size:3em;font-weight:700;line-height:1.2em}@media screen and (-webkit-min-device-pixel-ratio: 0){.o_highscore .o_position h2{background:linear-gradient(330deg, #e05252 0%, #99e052 25%, #52e0e0 50%, #9952e0 75%, #e05252 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;display:inline}.o_highscore .o_position h2:after{content:"\A";white-space:pre}}.o_highscore .o_position_relative{font-size:1em;font-weight:normal}.o_highscore .o_podium{position:relative;vertical-align:bottom;height:300px;margin-bottom:50px}.o_highscore .o_rank{width:30%;position:absolute;bottom:0;text-shadow:rgba(102,102,102,0.5) 0 -1px 0,rgba(255,255,255,0.6) 0 2px 1px}.o_highscore .o_rank:before{position:absolute;bottom:0;left:0;width:100%;text-align:center}.o_highscore .o_rank .o_name{position:absolute;top:100%;width:100%;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-top:1em;text-shadow:none}.o_highscore .o_rank .o_score{color:#777;font-size:90%;width:100%;text-align:center;position:absolute;top:-20px;text-shadow:none}.o_highscore .o_rank .o_singleportrait{position:absolute;width:100%;text-align:center;top:-125px}.o_highscore .o_rank .o_rank_portraits{position:relative;left:0;top:-210px;height:180px;width:200px;text-align:center;vertical-align:bottom;display:table-cell}.o_highscore .o_rank .o_rank_portraits ul{display:inline-block}.o_highscore .o_rank .o_rank_portraits .o_portrait{margin:5px}.o_highscore .o_first{height:150px;left:30%;border:1px solid #d9d9d9;border-top-left-radius:4px;border-top-right-radius:4px;background:gold;background:-moz-linear-gradient(top, #fff7cc 0%, #ffdf33 50%, gold 51%, #ffe766 100%);background:-webkit-linear-gradient(top, #fff7cc 0%, #ffdf33 50%, gold 51%, #ffe766 100%);background:linear-gradient(top, #fff7cc 0%, #ffdf33 50%, gold 51%, #ffe766 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='$basecolor', endColorstr='lighten($basecolor,20%)',GradientType=0 )}.o_highscore .o_first:before{content:"1";font-size:700%;line-height:150px;color:#666}.o_highscore .o_second{height:100px;left:0;background:silver;background:-moz-linear-gradient(top, #fff 0%, #dadada 50%, silver 51%, #f3f3f3 100%);background:-webkit-linear-gradient(top, #fff 0%, #dadada 50%, silver 51%, #f3f3f3 100%);background:linear-gradient(top, #fff 0%, #dadada 50%, silver 51%, #f3f3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='$basecolor', endColorstr='lighten($basecolor,20%)',GradientType=0 );border-left:1px solid #d9d9d9;border-top:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;border-top-left-radius:4px}.o_highscore .o_second:before{content:"2";font-size:500%;line-height:100px;color:#666}.o_highscore .o_third{height:80px;left:60%;background:#cd7f32;background:-moz-linear-gradient(top, #f5e5d6 0%, #d7995b 50%, #cd7f32 51%, #e1b284 100%);background:-webkit-linear-gradient(top, #f5e5d6 0%, #d7995b 50%, #cd7f32 51%, #e1b284 100%);background:linear-gradient(top, #f5e5d6 0%, #d7995b 50%, #cd7f32 51%, #e1b284 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='$basecolor', endColorstr='lighten($basecolor,20%)',GradientType=0 );border-right:1px solid #d9d9d9;border-top:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;border-top-right-radius:4px}.o_highscore .o_third:before{content:"3";font-size:300%;line-height:80px;color:#666}.o_highscore .o_histogram{position:relative;bottom:-40px;margin-bottom:40px}.o_highscore .o_histogram .d3chart{width:100%;padding-top:50px;height:300px}.o_highscore .o_histogram .d3chart text{fill:#888}.o_highscore .o_histogram .d3chart .axis path,.o_highscore .o_histogram .d3chart .axis line{stroke:#888}.o_highscore .o_histogram .d3chart .o_myself{fill:#337ab7}.o_highscore .o_histogram .d3chart .o_myself:hover{fill:#5094ce}.o_highscore .o_histogram .d3chart .o_other{fill:#777}.o_highscore .o_histogram .d3chart .o_other:hover{fill:#919191}.o_highscore .o_histogram .d3chart .o_empty{fill:#000}.o_listing .o_table_wrapper.o_table_flexi .table{margin-top:0}.o_listing table th:nth-of-type(1),.o_listing table th :nth-of-type(2){width:5em}body.o_browser_ie7 #o_offcanvas_right,body.o_browser_ie8 #o_offcanvas_right{right:0px}
\ No newline at end of file
diff --git a/src/test/java/org/olat/admin/user/delete/service/UserDeletionManagerTest.java b/src/test/java/org/olat/admin/user/delete/service/UserDeletionManagerTest.java
index 267b9f306bd..657740eb2b3 100644
--- a/src/test/java/org/olat/admin/user/delete/service/UserDeletionManagerTest.java
+++ b/src/test/java/org/olat/admin/user/delete/service/UserDeletionManagerTest.java
@@ -120,7 +120,7 @@ public class UserDeletionManagerTest extends OlatTestCase {
 		RepositoryEntry course = JunitTestHelper.deployBasicCourse(identity);
 		dbInstance.commitAndCloseSession();
 		Assert.assertEquals(username, course.getInitialAuthor());
-		Assert.assertTrue(repositoryService.hasRole(identity, false, GroupRoles.owner.name()));
+		Assert.assertTrue(repositoryService.hasRoleExpanded(identity, GroupRoles.owner.name()));
 		
 		//delete the identity
 		userDeletionManager.deleteIdentity(identity, null);
@@ -146,7 +146,7 @@ public class UserDeletionManagerTest extends OlatTestCase {
 		Assert.assertFalse(isMember);
 		RepositoryEntry reloadedCourse = repositoryService.loadByKey(course.getKey());
 		Assert.assertFalse(reloadedCourse.getInitialAuthor().equals(username));
-		boolean isOwner = repositoryService.hasRole(identity, false, GroupRoles.owner.name());
+		boolean isOwner = repositoryService.hasRoleExpanded(identity, GroupRoles.owner.name());
 		Assert.assertFalse(isOwner);
 		
 		User deletedUser = deletedIdentity.getUser();
diff --git a/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java b/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java
index 269e813afe0..e4f4cab25f0 100644
--- a/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java
+++ b/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java
@@ -309,15 +309,15 @@ public class BaseSecurityManagerTest extends OlatTestCase {
 	 */
 	@Test
 	public void testUpdateRoles_giveAllRights() {
-		Identity id1 = JunitTestHelper.createAndPersistIdentityAsUser( "roles-" + UUID.randomUUID().toString());
-		Identity id2 = JunitTestHelper.createAndPersistIdentityAsUser( "roles-" + UUID.randomUUID().toString());
+		Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser( "roles-1");
+		Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser( "roles-2");
 		Roles roles = securityManager.getRoles(id1);
 		Assert.assertNotNull(roles);
 		dbInstance.commitAndCloseSession();
 
 		//update roles
 		Organisation defOrganisation = organisationService.getDefaultOrganisation();
-		RolesByOrganisation modifiedRoles = RolesByOrganisation.roles(defOrganisation, false, false, true, false, true, true, true, true, true, true, true);
+		RolesByOrganisation modifiedRoles = RolesByOrganisation.roles(defOrganisation, false, false, false, true, true, true, true, true, true, true);
 		securityManager.updateRoles(id2, id1, modifiedRoles);
 		dbInstance.commitAndCloseSession();
 		
@@ -329,8 +329,8 @@ public class BaseSecurityManagerTest extends OlatTestCase {
 		Assert.assertFalse(reloadRoles.isGuestOnly());
 		Assert.assertTrue(reloadRoles.isLearnResourceManager());
 		Assert.assertFalse(reloadRoles.isInvitee());
-		Assert.assertTrue(reloadRoles.isOLATAdmin());
-		Assert.assertTrue(reloadRoles.isQPoolManager());
+		Assert.assertTrue(reloadRoles.isAdministrator());
+		Assert.assertTrue(reloadRoles.isPoolManager());
 		Assert.assertTrue(reloadRoles.isCurriculumManager());
 		Assert.assertTrue(reloadRoles.isUserManager());
 	}
@@ -340,15 +340,15 @@ public class BaseSecurityManagerTest extends OlatTestCase {
 	 */
 	@Test
 	public void testUpdateRoles_someRights() {
-		Identity id1 = JunitTestHelper.createAndPersistIdentityAsUser( "roles-" + UUID.randomUUID().toString());
-		Identity id2 = JunitTestHelper.createAndPersistIdentityAsUser( "roles-" + UUID.randomUUID().toString());
+		Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser( "roles-3");
+		Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser( "roles-4");
 		Roles roles = securityManager.getRoles(id1);
 		Assert.assertNotNull(roles);
 		dbInstance.commitAndCloseSession();
 
 		//update roles
 		Organisation defOrganisation = organisationService.getDefaultOrganisation();
-		RolesByOrganisation modifiedRoles = RolesByOrganisation.roles(defOrganisation, false, false, true, false, true, false, false, true, true, false, false);
+		RolesByOrganisation modifiedRoles = RolesByOrganisation.roles(defOrganisation, false, false, false, true, false, false, true, true, false, false);
 		securityManager.updateRoles(id2, id1, modifiedRoles);
 		dbInstance.commitAndCloseSession();
 		
@@ -360,8 +360,8 @@ public class BaseSecurityManagerTest extends OlatTestCase {
 		Assert.assertFalse(reloadRoles.isGuestOnly());
 		Assert.assertFalse(reloadRoles.isLearnResourceManager());
 		Assert.assertFalse(reloadRoles.isInvitee());
-		Assert.assertFalse(reloadRoles.isOLATAdmin());
-		Assert.assertFalse(reloadRoles.isQPoolManager());
+		Assert.assertFalse(reloadRoles.isAdministrator());
+		Assert.assertFalse(reloadRoles.isPoolManager());
 		Assert.assertTrue(reloadRoles.isCurriculumManager());
 		Assert.assertTrue(reloadRoles.isUserManager());
 	}
@@ -391,7 +391,7 @@ public class BaseSecurityManagerTest extends OlatTestCase {
 		Assert.assertTrue(reloadRoles.isGuestOnly());
 		Assert.assertFalse(reloadRoles.isLearnResourceManager());
 		Assert.assertFalse(reloadRoles.isInvitee());
-		Assert.assertFalse(reloadRoles.isOLATAdmin());
+		Assert.assertFalse(reloadRoles.isAdministrator());
 		Assert.assertFalse(reloadRoles.isUserManager());
 	}
 	
diff --git a/src/test/java/org/olat/core/commons/services/webdav/WebDAVCommandsTest.java b/src/test/java/org/olat/core/commons/services/webdav/WebDAVCommandsTest.java
index 2aeb847b6aa..e3f82594b71 100644
--- a/src/test/java/org/olat/core/commons/services/webdav/WebDAVCommandsTest.java
+++ b/src/test/java/org/olat/core/commons/services/webdav/WebDAVCommandsTest.java
@@ -469,7 +469,7 @@ public class WebDAVCommandsTest extends WebDAVTestCase {
 		createFile(folderContainer, "tolock.txt");
 		VFSItem itemToLock = folderContainer.resolve("tolock.txt");
 		Assert.assertNotNull(itemToLock);
-		boolean locked = lockManager.lock(itemToLock, assistant, new Roles(false, false, false, true, false, false, false));
+		boolean locked = lockManager.lock(itemToLock, assistant, Roles.authorRoles());
 		Assert.assertTrue(locked);
 		
 		//author make a propfind in the locked resource
@@ -527,7 +527,7 @@ public class WebDAVCommandsTest extends WebDAVTestCase {
 		Assert.assertNotNull(lockToken);
 
 		//check vfs lock
-		Roles adminRoles = new Roles(true, false, false, false, false, false, false);
+		Roles adminRoles = Roles.administratorRoles();
 		boolean lockedForMe = lockManager.isLockedForMe(item, user, adminRoles);
 		Assert.assertTrue(lockedForMe);
 		LockInfo lock = lockManager.getLock(item);
diff --git a/src/test/java/org/olat/core/id/IdentityEnvironmentTest.java b/src/test/java/org/olat/core/id/IdentityEnvironmentTest.java
index 9f8ec4f9406..8dc007ff306 100644
--- a/src/test/java/org/olat/core/id/IdentityEnvironmentTest.java
+++ b/src/test/java/org/olat/core/id/IdentityEnvironmentTest.java
@@ -34,8 +34,8 @@ public class IdentityEnvironmentTest {
 	@Test
 	public void testSetRoles() {
 		IdentityEnvironment env = new IdentityEnvironment();
-		env.setRoles(new Roles(true, true, true, true, true, true, true));
-		env.setRoles(new Roles(true, true, true, true, true, true, true));
+		env.setRoles(Roles.administratorRoles());
+		env.setRoles(Roles.administratorRoles());
 	}
 	
 	/**
@@ -44,8 +44,8 @@ public class IdentityEnvironmentTest {
 	@Test(expected=AssertException.class)
 	public void testSetDifferentRoles() {
 		IdentityEnvironment env = new IdentityEnvironment();
-		env.setRoles(new Roles(true, true, true, true, true, true, true));
-		env.setRoles(new Roles(true, false, false, false, false, false, false));
+		env.setRoles(Roles.administratorRoles());
+		env.setRoles(Roles.userRoles());
 	}
 
 }
diff --git a/src/test/java/org/olat/course/certificate/manager/CertificatesManagerTest.java b/src/test/java/org/olat/course/certificate/manager/CertificatesManagerTest.java
index 84d3ac2af29..84b7b553191 100644
--- a/src/test/java/org/olat/course/certificate/manager/CertificatesManagerTest.java
+++ b/src/test/java/org/olat/course/certificate/manager/CertificatesManagerTest.java
@@ -378,7 +378,7 @@ public class CertificatesManagerTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		//delete the course
-		Roles roles = new Roles(true, false, false, false, false, false, false);
+		Roles roles = Roles.administratorRoles();
 		repositoryService.deletePermanently(entry, identity, roles, Locale.ENGLISH);
 		dbInstance.commitAndCloseSession();
 		
@@ -423,7 +423,7 @@ public class CertificatesManagerTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		//delete the course
-		Roles roles = new Roles(true, false, false, false, false, false, false);
+		Roles roles = Roles.administratorRoles();
 		repositoryService.deletePermanently(entryToDelete, identity, roles, Locale.ENGLISH);
 		dbInstance.commitAndCloseSession();
 		
diff --git a/src/test/java/org/olat/course/condition/ConditionTest.java b/src/test/java/org/olat/course/condition/ConditionTest.java
index 76b38c64eaf..694c6cf8b86 100644
--- a/src/test/java/org/olat/course/condition/ConditionTest.java
+++ b/src/test/java/org/olat/course/condition/ConditionTest.java
@@ -20,7 +20,6 @@
 package org.olat.course.condition;
 
 import java.util.Collection;
-import java.util.UUID;
 
 import org.junit.Assert;
 import org.junit.Test;
@@ -350,9 +349,9 @@ public class ConditionTest extends OlatTestCase {
 	}
 	
 	private UserCourseEnvironment getUserDemoCourseEnvironment() {
-		Identity author = JunitTestHelper.createAndPersistIdentityAsUser("junit_auth-" + UUID.randomUUID().toString());
+		Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("junit_auth");
 		Identity id = JunitTestHelper.createAndPersistIdentityAsUser("condition");
-		Roles roles = new Roles(false, false, false, false, false, false, false);
+		Roles roles = Roles.userRoles();
 		RepositoryEntry re = JunitTestHelper.deployDemoCourse(author);
 		ICourse course = CourseFactory.loadCourse(re);
 		IdentityEnvironment identityEnv = new IdentityEnvironment(id, roles);
diff --git a/src/test/java/org/olat/course/nodes/en/EnrollmentManagerConcurrentTest.java b/src/test/java/org/olat/course/nodes/en/EnrollmentManagerConcurrentTest.java
index abddd7a9bb4..74ea25c83fd 100644
--- a/src/test/java/org/olat/course/nodes/en/EnrollmentManagerConcurrentTest.java
+++ b/src/test/java/org/olat/course/nodes/en/EnrollmentManagerConcurrentTest.java
@@ -415,7 +415,7 @@ public class EnrollmentManagerConcurrentTest extends OlatTestCase implements Win
 				ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrap(group));
 
 				sleep(Math.round(new Random().nextDouble() * 100l));
-				enrollmentManager.doEnroll(identity, JunitTestHelper.getUserRoles(), group, enNode, coursePropertyManager, EnrollmentManagerConcurrentTest.this /*WindowControl mock*/, testTranslator,
+				enrollmentManager.doEnroll(identity, Roles.userRoles(), group, enNode, coursePropertyManager, EnrollmentManagerConcurrentTest.this /*WindowControl mock*/, testTranslator,
 						new ArrayList<Long>()/*enrollableGroupNames*/, new ArrayList<Long>()/*enrollableAreaNames*/, courseGroupManager);
 				DBFactory.getInstance().commit();
 			} catch (Exception e) {
diff --git a/src/test/java/org/olat/gatling/EfficiencyStatementManagerGatling.java b/src/test/java/org/olat/gatling/EfficiencyStatementManagerGatling.java
index ca0d14d5820..e7f63e660a6 100644
--- a/src/test/java/org/olat/gatling/EfficiencyStatementManagerGatling.java
+++ b/src/test/java/org/olat/gatling/EfficiencyStatementManagerGatling.java
@@ -61,7 +61,7 @@ public class EfficiencyStatementManagerGatling extends OlatTestCase {
 	@Test
 	public void testBigDatas() {
 		SearchRepositoryEntryParameters params = new SearchRepositoryEntryParameters();
-		params.setRoles(new Roles(true, false, false, false, false, false, false));
+		params.setRoles(Roles.administratorRoles());
 		params.setResourceTypes(Collections.singletonList("CourseModule"));
 		List<RepositoryEntry> entries = repositoryManager.genericANDQueryWithRolesRestriction(params, 0, -1, true);
 		
diff --git a/src/test/java/org/olat/group/test/BusinessGroupServiceTest.java b/src/test/java/org/olat/group/test/BusinessGroupServiceTest.java
index 0e0fb91a6a2..5cd1a8c6d04 100644
--- a/src/test/java/org/olat/group/test/BusinessGroupServiceTest.java
+++ b/src/test/java/org/olat/group/test/BusinessGroupServiceTest.java
@@ -42,6 +42,7 @@ import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.BaseSecurityModule;
 import org.olat.basesecurity.Group;
 import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.basesecurity.manager.GroupDAO;
 import org.olat.collaboration.CollaborationTools;
 import org.olat.collaboration.CollaborationToolsFactory;
@@ -486,7 +487,7 @@ public class BusinessGroupServiceTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		businessGroupService.addToWaitingList(admin, Collections.singletonList(ident1), group, null);
 		businessGroupService.addToWaitingList(admin, Collections.singletonList(ident2), group, null);
-		businessGroupService.addParticipants(admin, JunitTestHelper.getAdminRoles(), Collections.singletonList(ident3), group, null);
+		businessGroupService.addParticipants(admin, Roles.administratorRoles(), Collections.singletonList(ident3), group, null);
 		dbInstance.commitAndCloseSession();
 		
 		//move id1 from waiting-list to participant
@@ -1155,7 +1156,7 @@ public class BusinessGroupServiceTest extends OlatTestCase {
 	@Ignore @Test
 	public void parallelRemoveParticipants() {
 		mailModule.setInterSystem(true);
-		businessGroupModule.setMandatoryEnrolmentEmailForUsers("true");
+		businessGroupModule.setMandatoryEnrolmentEmailFor(OrganisationRoles.user, "true");
 		
 		Identity admin = JunitTestHelper.createAndPersistIdentityAsRndUser("remove-p1-1");
 		
@@ -1206,7 +1207,7 @@ public class BusinessGroupServiceTest extends OlatTestCase {
 		}	
 		
 
-		businessGroupModule.setMandatoryEnrolmentEmailForUsers("false");
+		businessGroupModule.setMandatoryEnrolmentEmailFor(OrganisationRoles.user, "false");
 	}
 	
 	private class RemoveParticipantsThread extends Thread {
diff --git a/src/test/java/org/olat/portfolio/EPFrontendManagerTest.java b/src/test/java/org/olat/portfolio/EPFrontendManagerTest.java
index 243fdb56c80..df8eb7d1245 100644
--- a/src/test/java/org/olat/portfolio/EPFrontendManagerTest.java
+++ b/src/test/java/org/olat/portfolio/EPFrontendManagerTest.java
@@ -828,7 +828,7 @@ public class EPFrontendManagerTest extends OlatTestCase {
 
 		//delete
 		RepositoryEntry reloadedRe = repositoryService.loadByKey(re.getKey());
-		Roles roles = new Roles(true, false, false, false, false, false, false);
+		Roles roles = Roles.administratorRoles();
 		repositoryService.deletePermanently(reloadedRe, id, roles, Locale.GERMAN);
 		dbInstance.commit();	
 	}
diff --git a/src/test/java/org/olat/portfolio/EPPerformanceTest.java b/src/test/java/org/olat/portfolio/EPPerformanceTest.java
index 88a5aed8d44..a8f83eadd8a 100644
--- a/src/test/java/org/olat/portfolio/EPPerformanceTest.java
+++ b/src/test/java/org/olat/portfolio/EPPerformanceTest.java
@@ -140,14 +140,14 @@ public class EPPerformanceTest extends OlatTestCase {
 		EPFilterSettings filterSettings = new EPFilterSettings();
 		filterSettings.setTagFilter(new ArrayList<String>(Arrays.asList("Schule")));
 		start = System.currentTimeMillis();
-		artList = epFrontendManager.filterArtefactsByFilterSettings(filterSettings, ident1, new Roles(false, false, false, false, false, false, false));
+		artList = epFrontendManager.filterArtefactsByFilterSettings(filterSettings, ident1, Roles.userRoles());
 		now = System.currentTimeMillis();
 		logger.info("filter artefacts by one tag took: " + (now - start) + " ms.");
 		assertEquals(artList.size(), artefactAmount/2);
 		
 		filterSettings.setTagFilter(tagList1);
 		start = System.currentTimeMillis();
-		artList = epFrontendManager.filterArtefactsByFilterSettings(filterSettings, ident1, new Roles(false, false, false, false, false, false, false));
+		artList = epFrontendManager.filterArtefactsByFilterSettings(filterSettings, ident1, Roles.userRoles());
 		now = System.currentTimeMillis();
 		logger.info("filter artefacts by tagList1 took: " + (now - start) + " ms.");
 		assertEquals(artList.size(), artefactAmount/2);
diff --git a/src/test/java/org/olat/portfolio/manager/EPStructureManagerTest.java b/src/test/java/org/olat/portfolio/manager/EPStructureManagerTest.java
index 4ca4e4a2ad6..95c9cd08a40 100644
--- a/src/test/java/org/olat/portfolio/manager/EPStructureManagerTest.java
+++ b/src/test/java/org/olat/portfolio/manager/EPStructureManagerTest.java
@@ -697,7 +697,7 @@ public class EPStructureManagerTest extends OlatTestCase {
 		assertFalse(singleAuthor.contains(ident2));//owner
 		
 		securityGroupDao.getSecurityGroupsForIdentity(ident1);
-		repositoryManager.queryResourcesLimitType(ident1, new Roles(false, false, false, false, false, false, false), null, null, null, null, true, false);
+		repositoryManager.queryResourcesLimitType(ident1, Roles.userRoles(), 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 4f6cd768c35..ac86f9f66ee 100644
--- a/src/test/java/org/olat/repository/RepositoryManagerTest.java
+++ b/src/test/java/org/olat/repository/RepositoryManagerTest.java
@@ -42,7 +42,6 @@ import org.junit.Assert;
 import org.junit.Test;
 import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.GroupRoles;
-import org.olat.basesecurity.OrganisationRoles;
 import org.olat.basesecurity.OrganisationService;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.commons.services.mark.MarkManager;
@@ -50,7 +49,6 @@ import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Organisation;
 import org.olat.core.id.Roles;
-import org.olat.core.id.UserConstants;
 import org.olat.core.logging.AssertException;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
@@ -67,7 +65,6 @@ import org.olat.resource.OLATResource;
 import org.olat.resource.OLATResourceManager;
 import org.olat.test.JunitTestHelper;
 import org.olat.test.OlatTestCase;
-import org.olat.user.UserManager;
 import org.springframework.beans.factory.annotation.Autowired;
 
 
@@ -82,8 +79,6 @@ public class RepositoryManagerTest extends OlatTestCase {
 	@Autowired
 	private DB dbInstance;
 	@Autowired
-	private UserManager userManager;
-	@Autowired
 	private BaseSecurity securityManager;
 	@Autowired
 	private OLATResourceManager resourceManager;
@@ -399,7 +394,7 @@ public class RepositoryManagerTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		//participant bookmarks
-		Roles roles = new Roles(false, false, false, false, false, false, false);
+		Roles roles = Roles.userRoles();
 		List<RepositoryEntry> courses = repositoryManager.getLearningResourcesAsBookmark(participant, roles, "CourseModule", 0, -1);
 		Assert.assertNotNull(courses);
 		Assert.assertEquals(1, courses.size());
@@ -419,7 +414,7 @@ public class RepositoryManagerTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		//participant bookmarks
-		Roles roles = new Roles(false, false, false, false, false, false, false);
+		Roles roles = Roles.userRoles();
 		List<RepositoryEntry> courses = repositoryManager.getLearningResourcesAsBookmark(participant, roles, "CourseModule", 0, -1);
 		Assert.assertNotNull(courses);
 		Assert.assertEquals(0, courses.size());
@@ -716,23 +711,7 @@ public class RepositoryManagerTest extends OlatTestCase {
 		Assert.assertTrue((endCreate - startCreate) > (endSearchReferencable - startSearchReferencable));
 	}
 	
-	@Test
-	public void isOwnerOfRepositoryEntry() {
-		//create a repository entry with an owner and a participant
-		Identity owner = JunitTestHelper.createAndPersistIdentityAsUser("re-owner-is-" + UUID.randomUUID().toString());
-		Identity part = JunitTestHelper.createAndPersistIdentityAsUser("re-owner-is-" + UUID.randomUUID().toString());
-		RepositoryEntry re = JunitTestHelper.createAndPersistRepositoryEntry();
-		dbInstance.commitAndCloseSession();
-		repositoryEntryRelationDao.addRole(owner, re, GroupRoles.owner.name());
-		repositoryEntryRelationDao.addRole(part, re, GroupRoles.participant.name());
-		dbInstance.commitAndCloseSession();
-		
-		//check
-		boolean isOwnerOwner = repositoryManager.isOwnerOfRepositoryEntry(owner, re);
-		Assert.assertTrue(isOwnerOwner);
-		boolean isPartOwner = repositoryManager.isOwnerOfRepositoryEntry(part, re);
-		Assert.assertFalse(isPartOwner);
-	}
+
 	
 	@Test
 	public void countLearningResourcesAsOwner() {
@@ -762,28 +741,6 @@ public class RepositoryManagerTest extends OlatTestCase {
 		Assert.assertTrue(1 <= count);
 	}
 	
-	@Test
-	public void isIdentityInTutorSecurityGroup() {
-		//create a repository entry with an owner and a participant
-		Identity identity = JunitTestHelper.createAndPersistIdentityAsUser("re-tutor-is-" + UUID.randomUUID().toString());
-		RepositoryEntry re1 = JunitTestHelper.createAndPersistRepositoryEntry();
-		RepositoryEntry re2 = JunitTestHelper.createAndPersistRepositoryEntry();
-		RepositoryEntry re3 = JunitTestHelper.createAndPersistRepositoryEntry();
-		dbInstance.commitAndCloseSession();
-		repositoryEntryRelationDao.addRole(identity, re1, GroupRoles.coach.name());
-		repositoryEntryRelationDao.addRole(identity, re2, GroupRoles.participant.name());
-		repositoryEntryRelationDao.addRole(identity, re3, GroupRoles.owner.name());
-		dbInstance.commitAndCloseSession();
-		
-		//check
-		boolean isTutor1 = repositoryManager.isIdentityInTutorSecurityGroup(identity, re1);
-		Assert.assertTrue(isTutor1);
-		boolean isTutor2 = repositoryManager.isIdentityInTutorSecurityGroup(identity, re2);
-		Assert.assertFalse(isTutor2);
-		boolean isTutor3 = repositoryManager.isIdentityInTutorSecurityGroup(identity, re3);
-		Assert.assertFalse(isTutor3);
-	}
-	
 	@Test
 	public void getRepositoryentryMembership() {
 		//create a repository entry with an owner and a participant
@@ -867,46 +824,6 @@ public class RepositoryManagerTest extends OlatTestCase {
 		Assert.assertNotNull(membership2s);
 		Assert.assertTrue(membership2s.isEmpty());
 	}
-	
-	/**
-	 * How can be a resource manager if Constants.ORESOURCE_USERMANAGER is never used?
-	 */
-	@Test
-	public void isInstitutionalRessourceManagerFor() {
-		Identity owner1 = JunitTestHelper.createAndPersistIdentityAsRndUser("instit-1");
-		Identity owner2 = JunitTestHelper.createAndPersistIdentityAsRndUser("instit-2");
-		Identity part3 = JunitTestHelper.createAndPersistIdentityAsRndUser("instit-3");
-		RepositoryEntry re = JunitTestHelper.createAndPersistRepositoryEntry();
-		repositoryEntryRelationDao.addRole(owner1, re, GroupRoles.owner.name());
-		repositoryEntryRelationDao.addRole(owner2, re, GroupRoles.owner.name());
-		repositoryEntryRelationDao.addRole(part3, re, GroupRoles.participant.name());
-		dbInstance.commit();
-		
-		//set the institutions
-		owner1.getUser().setProperty(UserConstants.INSTITUTIONALNAME, "volks");
-		owner2.getUser().setProperty(UserConstants.INSTITUTIONALNAME, "volks");
-		part3.getUser().setProperty(UserConstants.INSTITUTIONALNAME, "volks");
-		userManager.updateUserFromIdentity(owner1);
-		userManager.updateUserFromIdentity(owner2);
-		userManager.updateUserFromIdentity(part3);
-		dbInstance.commit();
-		
-		//promote owner1 to institution resource manager
-		organisationService.addMember(owner1, OrganisationRoles.learnresourcemanager);
-		dbInstance.commitAndCloseSession();
-		
-		//check
-		Roles rolesOwner1 = securityManager.getRoles(owner1);
-		Roles rolesOwner2 = securityManager.getRoles(owner2);
-		Roles rolesPart3 = securityManager.getRoles(part3);
-		boolean institutionMgr1 = repositoryManager.isLearnResourceManagerFor(rolesOwner1, re);
-		boolean institutionMgr2 = repositoryManager.isLearnResourceManagerFor(rolesOwner2, re);
-		boolean institutionMgr3 = repositoryManager.isLearnResourceManagerFor(rolesPart3, re);
-	
-		Assert.assertTrue(institutionMgr1);
-		Assert.assertFalse(institutionMgr2);
-		Assert.assertFalse(institutionMgr3);
-	}
 
 	@Test
 	public void testCountByTypeLimitAccess() {
diff --git a/src/test/java/org/olat/repository/manager/RepositoryEntryQueriesTest.java b/src/test/java/org/olat/repository/manager/RepositoryEntryQueriesTest.java
index d91ac95542b..2eb55a91f2f 100644
--- a/src/test/java/org/olat/repository/manager/RepositoryEntryQueriesTest.java
+++ b/src/test/java/org/olat/repository/manager/RepositoryEntryQueriesTest.java
@@ -257,7 +257,7 @@ public class RepositoryEntryQueriesTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		SearchRepositoryEntryParameters params = new SearchRepositoryEntryParameters();
-		params.setRoles(new Roles(true, false, false, false, false, false, false));
+		params.setRoles(Roles.administratorRoles());
 		params.setAuthor(owner.getName());
 		List<RepositoryEntry> myEntries = repositoryEntryQueries.searchEntries(params, 0, -1, true);
 		Assert.assertNotNull(myEntries);
@@ -275,7 +275,7 @@ public class RepositoryEntryQueriesTest extends OlatTestCase {
 		
 		//search managed
 		SearchRepositoryEntryParameters paramsManaged = new SearchRepositoryEntryParameters();
-		paramsManaged.setRoles(new Roles(true, false, false, false, false, false, false));
+		paramsManaged.setRoles(Roles.administratorRoles());
 		paramsManaged.setManaged(Boolean.TRUE);
 		List<RepositoryEntry> managedEntries = repositoryEntryQueries.searchEntries(paramsManaged, 0, -1, true);
 		Assert.assertNotNull(managedEntries);
@@ -285,7 +285,7 @@ public class RepositoryEntryQueriesTest extends OlatTestCase {
 
 		//search unmanaged
 		SearchRepositoryEntryParameters paramsFree = new SearchRepositoryEntryParameters();
-		paramsFree.setRoles(new Roles(true, false, false, false, false, false, false));
+		paramsFree.setRoles(Roles.administratorRoles());
 		paramsFree.setManaged(Boolean.FALSE);
 		List<RepositoryEntry> freeEntries = repositoryEntryQueries.searchEntries(paramsFree, 0, -1, true);
 		Assert.assertNotNull(freeEntries);
@@ -297,8 +297,9 @@ public class RepositoryEntryQueriesTest extends OlatTestCase {
 	@Test
 	public void genericANDQueryWithRolesWithStandardUser() {
 		//create 2 identities (repo owner and tutor)
-		Identity id1 = JunitTestHelper.createAndPersistIdentityAsUser("re-gen-1-" + UUID.randomUUID().toString());
-		Identity id2 = JunitTestHelper.createAndPersistIdentityAsUser("re-gen-2-" + UUID.randomUUID().toString());
+		Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("re-gen-1");
+		Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("re-gen-2");
+		
 		RepositoryEntry re1 = JunitTestHelper.createAndPersistRepositoryEntry();
 		RepositoryEntry re2 = JunitTestHelper.createAndPersistRepositoryEntry(true);
 		repositoryEntryRelationDao.addRole(id1, re2, GroupRoles.participant.name());
@@ -309,7 +310,7 @@ public class RepositoryEntryQueriesTest extends OlatTestCase {
 		
 		//check for guest (negative test)
 		SearchRepositoryEntryParameters params1 = new SearchRepositoryEntryParameters();
-		params1.setRoles(new Roles(false, false, false, false, true, false, false));
+		params1.setRoles(Roles.guestRoles());
 		List<RepositoryEntry> entries1 = repositoryEntryQueries.searchEntries(params1, 0, -1, true);
 		Assert.assertNotNull(entries1);
 		Assert.assertFalse(entries1.contains(re1));
@@ -321,7 +322,7 @@ public class RepositoryEntryQueriesTest extends OlatTestCase {
 		//check for identity 1 (participant re2 + re1 accessible to all users)
 		SearchRepositoryEntryParameters params2 = new SearchRepositoryEntryParameters();
 		params2.setIdentity(id1);
-		params2.setRoles(new Roles(false, false, false, false, false, false, false));
+		params2.setRoles(Roles.userRoles());
 		List<RepositoryEntry> entries2 = repositoryEntryQueries.searchEntries(params2, 0, -1, true);
 		Assert.assertNotNull(entries2);
 		Assert.assertFalse(entries2.isEmpty());
@@ -336,7 +337,7 @@ public class RepositoryEntryQueriesTest extends OlatTestCase {
 		//check for identity 1 (re1 accessible to all users)
 		SearchRepositoryEntryParameters params3 = new SearchRepositoryEntryParameters();
 		params3.setIdentity(id2);
-		params3.setRoles(new Roles(false, false, false, false, false, false, false));
+		params3.setRoles(Roles.userRoles());
 		List<RepositoryEntry> entries3 = repositoryEntryQueries.searchEntries(params3, 0, -1, true);
 		Assert.assertNotNull(entries3);
 		Assert.assertFalse(entries3.isEmpty());
@@ -363,7 +364,7 @@ public class RepositoryEntryQueriesTest extends OlatTestCase {
 		//check for id 1 (owner of the repository entry)
 		SearchRepositoryEntryParameters params1 = new SearchRepositoryEntryParameters();
 		params1.setIdentity(id1);
-		params1.setRoles(new Roles(false, false, false, false, false, false, false));
+		params1.setRoles(Roles.userRoles());
 		params1.setOnlyExplicitMember(true);
 		List<RepositoryEntry> entries1 = repositoryEntryQueries.searchEntries(params1, 0, -1, true);
 		Assert.assertNotNull(entries1);
@@ -378,7 +379,7 @@ public class RepositoryEntryQueriesTest extends OlatTestCase {
 		//check for id2 (tutor)
 		SearchRepositoryEntryParameters params2 = new SearchRepositoryEntryParameters();
 		params2.setIdentity(id2);
-		params2.setRoles(new Roles(false, false, false, false, false, false, false));
+		params2.setRoles(Roles.userRoles());
 		params2.setOnlyExplicitMember(true);
 		List<RepositoryEntry> entries2 = repositoryEntryQueries.searchEntries(params2, 0, -1, true);
 		Assert.assertNotNull(entries2);
@@ -393,7 +394,7 @@ public class RepositoryEntryQueriesTest extends OlatTestCase {
 		//check for id3 (negative test)
 		SearchRepositoryEntryParameters params3 = new SearchRepositoryEntryParameters();
 		params3.setIdentity(id3);
-		params3.setRoles(new Roles(false, false, false, false, false, false, false));
+		params3.setRoles(Roles.userRoles());
 		params3.setOnlyExplicitMember(true);
 		List<RepositoryEntry> entries3 = repositoryEntryQueries.searchEntries(params3, 0, -1, true);
 		Assert.assertNotNull(entries3);
@@ -462,7 +463,7 @@ public class RepositoryEntryQueriesTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		//check
-		Roles learnResourceManagerRoles = new Roles(false, false, false, false, false, true, false);
+		Roles learnResourceManagerRoles = Roles.learnResourceManagerRoles();
 		SearchRepositoryEntryParameters params = new SearchRepositoryEntryParameters(id, learnResourceManagerRoles, re.getOlatResource().getResourceableTypeName());
 		List<RepositoryEntry> entries = repositoryEntryQueries.searchEntries(params, 0, -1, false);
 		
diff --git a/src/test/java/org/olat/repository/manager/RepositoryEntryRelationDAOTest.java b/src/test/java/org/olat/repository/manager/RepositoryEntryRelationDAOTest.java
index 9076f886844..c0738753f95 100644
--- a/src/test/java/org/olat/repository/manager/RepositoryEntryRelationDAOTest.java
+++ b/src/test/java/org/olat/repository/manager/RepositoryEntryRelationDAOTest.java
@@ -30,6 +30,7 @@ import org.junit.Assert;
 import org.junit.Test;
 import org.olat.basesecurity.Group;
 import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.basesecurity.OrganisationService;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.id.Identity;
@@ -102,6 +103,17 @@ public class RepositoryEntryRelationDAOTest extends OlatTestCase {
 		Assert.assertFalse(participant);
 	}
 	
+	@Test
+	public void hasRole_admin() {
+		Identity id = JunitTestHelper.createAndPersistIdentityAsRndAdmin("admin-role-3-");
+		Organisation defOrganisation = organisationService.getDefaultOrganisation();
+		RepositoryEntry re = repositoryService.create(null, "Rei Ayanami", "rel", "rel", null, null, 0, defOrganisation);
+		dbInstance.commit();
+		
+		boolean admin = repositoryEntryRelationDao.hasRole(id, re, true, OrganisationRoles.administrator.name());
+		Assert.assertTrue(admin);
+	}
+	
 	@Test
 	public void getRoles() {
 		Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("get-roles-1-");
diff --git a/src/test/java/org/olat/repository/manager/RepositoryServiceImplTest.java b/src/test/java/org/olat/repository/manager/RepositoryServiceImplTest.java
index 0646ba586be..bbd0a1437ad 100644
--- a/src/test/java/org/olat/repository/manager/RepositoryServiceImplTest.java
+++ b/src/test/java/org/olat/repository/manager/RepositoryServiceImplTest.java
@@ -25,11 +25,13 @@ import java.util.Locale;
 import org.junit.Assert;
 import org.junit.Test;
 import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.OrganisationRoles;
 import org.olat.basesecurity.OrganisationService;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.id.Identity;
 import org.olat.core.id.Organisation;
 import org.olat.core.id.Roles;
+import org.olat.core.id.UserConstants;
 import org.olat.group.BusinessGroup;
 import org.olat.group.BusinessGroupService;
 import org.olat.group.model.SearchBusinessGroupParams;
@@ -39,6 +41,7 @@ import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryRelationType;
 import org.olat.test.JunitTestHelper;
 import org.olat.test.OlatTestCase;
+import org.olat.user.UserManager;
 import org.springframework.beans.factory.annotation.Autowired;
 
 /**
@@ -52,6 +55,8 @@ public class RepositoryServiceImplTest extends OlatTestCase {
 	@Autowired
 	private DB dbInstance;
 	@Autowired
+	private UserManager userManager;
+	@Autowired
 	private CatalogManager catalogManager;
 	@Autowired
 	private RepositoryServiceImpl repositoryService;
@@ -176,12 +181,67 @@ public class RepositoryServiceImplTest extends OlatTestCase {
 		RepositoryEntry re = JunitTestHelper.deployDemoCourse(initialAuthor);
 		dbInstance.commitAndCloseSession();
 		
-		Roles roles = new Roles(false, false, false, true, false, false, false);
+		Roles roles = Roles.authorRoles();
 		ErrorList errors = repositoryService.deletePermanently(re, initialAuthor, roles, Locale.ENGLISH);
 		Assert.assertNotNull(errors);
 		Assert.assertFalse(errors.hasErrors());
 	}
 	
+	/**
+	 * How can be a resource manager if Constants.ORESOURCE_USERMANAGER is never used?
+	 */
+	@Test
+	public void isInstitutionalRessourceManagerFor() {
+		Identity owner1 = JunitTestHelper.createAndPersistIdentityAsRndUser("instit-1");
+		Identity owner2 = JunitTestHelper.createAndPersistIdentityAsRndUser("instit-2");
+		Identity part3 = JunitTestHelper.createAndPersistIdentityAsRndUser("instit-3");
+		RepositoryEntry re = JunitTestHelper.createAndPersistRepositoryEntry();
+		repositoryEntryRelationDao.addRole(owner1, re, GroupRoles.owner.name());
+		repositoryEntryRelationDao.addRole(owner2, re, GroupRoles.owner.name());
+		repositoryEntryRelationDao.addRole(part3, re, GroupRoles.participant.name());
+		dbInstance.commit();
+		
+		//set the institutions
+		owner1.getUser().setProperty(UserConstants.INSTITUTIONALNAME, "volks");
+		owner2.getUser().setProperty(UserConstants.INSTITUTIONALNAME, "volks");
+		part3.getUser().setProperty(UserConstants.INSTITUTIONALNAME, "volks");
+		userManager.updateUserFromIdentity(owner1);
+		userManager.updateUserFromIdentity(owner2);
+		userManager.updateUserFromIdentity(part3);
+		dbInstance.commit();
+		
+		//promote owner1 to institution resource manager
+		organisationService.addMember(owner1, OrganisationRoles.learnresourcemanager);
+		dbInstance.commitAndCloseSession();
+		
+		//check
+		boolean institutionMgr1 = repositoryService.hasRoleExpanded(owner1, re, OrganisationRoles.learnresourcemanager.name());
+		boolean institutionMgr2 = repositoryService.hasRoleExpanded(owner2, re, OrganisationRoles.learnresourcemanager.name());
+		boolean institutionMgr3 = repositoryService.hasRoleExpanded(part3, re, OrganisationRoles.learnresourcemanager.name());
+	
+		Assert.assertTrue(institutionMgr1);
+		Assert.assertFalse(institutionMgr2);
+		Assert.assertFalse(institutionMgr3);
+	}
+	
+	@Test
+	public void isOwnerOfRepositoryEntry() {
+		//create a repository entry with an owner and a participant
+		Identity owner = JunitTestHelper.createAndPersistIdentityAsRndUser("re-owner-1-is");
+		Identity part = JunitTestHelper.createAndPersistIdentityAsRndUser("re-owner-2-is");
+		RepositoryEntry re = JunitTestHelper.createAndPersistRepositoryEntry();
+		dbInstance.commitAndCloseSession();
+		repositoryEntryRelationDao.addRole(owner, re, GroupRoles.owner.name());
+		repositoryEntryRelationDao.addRole(part, re, GroupRoles.participant.name());
+		dbInstance.commitAndCloseSession();
+		
+		//check
+		boolean isOwnerOwner = repositoryService.hasRoleExpanded(owner, re, GroupRoles.owner.name());
+		Assert.assertTrue(isOwnerOwner);
+		boolean isPartOwner = repositoryService.hasRoleExpanded(part, re, GroupRoles.owner.name());
+		Assert.assertFalse(isPartOwner);
+	}
+	
 	
 
 }
diff --git a/src/test/java/org/olat/resource/accesscontrol/ACFrontendManagerTest.java b/src/test/java/org/olat/resource/accesscontrol/ACFrontendManagerTest.java
index 1e16c488cb7..b5200399e25 100644
--- a/src/test/java/org/olat/resource/accesscontrol/ACFrontendManagerTest.java
+++ b/src/test/java/org/olat/resource/accesscontrol/ACFrontendManagerTest.java
@@ -373,7 +373,7 @@ public class ACFrontendManagerTest extends OlatTestCase {
 	public void testStandardMethods() {
 		Identity ident = JunitTestHelper.createAndPersistIdentityAsRndUser("ac-method-mgr");
 		
-		Roles roles = new Roles(false, false, false, true, false, false, false);
+		Roles roles = Roles.authorRoles();
 		List<AccessMethod> methods = acService.getAvailableMethods(ident, roles);
 		assertNotNull(methods);
 		assertTrue(methods.size() >= 2);
diff --git a/src/test/java/org/olat/resource/references/ReferenceManagerTest.java b/src/test/java/org/olat/resource/references/ReferenceManagerTest.java
index 5e2cded9fea..9229a637e7d 100644
--- a/src/test/java/org/olat/resource/references/ReferenceManagerTest.java
+++ b/src/test/java/org/olat/resource/references/ReferenceManagerTest.java
@@ -40,7 +40,6 @@ import org.olat.core.commons.persistence.DB;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Organisation;
-import org.olat.core.id.Roles;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryService;
@@ -52,9 +51,6 @@ import org.olat.test.OlatTestCase;
 import org.springframework.beans.factory.annotation.Autowired;
 
 
-/**
- * 
- */
 public class ReferenceManagerTest extends OlatTestCase {
 
 	@Autowired
@@ -217,8 +213,7 @@ public class ReferenceManagerTest extends OlatTestCase {
 	
 	@Test
 	public void getReferencesInfos_simpleCase() {
-		Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("Asuka");
-		Roles adminRoles = new Roles(true, false, false, false, false, false, false);
+		Identity admin = JunitTestHelper.createAndPersistIdentityAsRndAdmin("Asuka");
 
 		Organisation defOrganisation = organisationService.getDefaultOrganisation();
 		RepositoryEntry course1 = repositoryService.create(null,"Asuka Langley", "-", "Reference Manager course 1", "", null, 0, defOrganisation);
@@ -230,7 +225,7 @@ public class ReferenceManagerTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		//ref of course 1
-		List<ReferenceInfos> refCourse1s = referenceManager.getReferencesInfos(Collections.singletonList(course1), id, adminRoles);
+		List<ReferenceInfos> refCourse1s = referenceManager.getReferencesInfos(Collections.singletonList(course1), admin);
 		Assert.assertNotNull(refCourse1s);
 		Assert.assertEquals(1, refCourse1s.size());
 		ReferenceInfos ref = refCourse1s.get(0);
@@ -242,7 +237,7 @@ public class ReferenceManagerTest extends OlatTestCase {
 		List<RepositoryEntry> courses = new ArrayList<>(2);
 		courses.add(course1);
 		courses.add(course2);
-		List<ReferenceInfos> refCourse1and2s = referenceManager.getReferencesInfos(courses, id, adminRoles);
+		List<ReferenceInfos> refCourse1and2s = referenceManager.getReferencesInfos(courses, admin);
 		Assert.assertNotNull(refCourse1and2s);
 		Assert.assertEquals(1, refCourse1and2s.size());
 		ReferenceInfos ref1nd2 = refCourse1and2s.get(0);
@@ -252,15 +247,14 @@ public class ReferenceManagerTest extends OlatTestCase {
 		
 		//ref empty
 		List<RepositoryEntry> emptyList = new ArrayList<>(2);
-		List<ReferenceInfos> emptyRefList = referenceManager.getReferencesInfos(emptyList, id, adminRoles);
+		List<ReferenceInfos> emptyRefList = referenceManager.getReferencesInfos(emptyList, admin);
 		Assert.assertNotNull(emptyRefList);
 		Assert.assertEquals(0, emptyRefList.size());
 	}
 	
 	@Test
 	public void getReferencesInfos_difficultCase() {
-		Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("Asuka");
-		Roles adminRoles = new Roles(true, false, false, false, false, false, false);
+		Identity admin = JunitTestHelper.createAndPersistIdentityAsRndAdmin("Asuka");
 
 		Organisation defOrganisation = organisationService.getDefaultOrganisation();
 		RepositoryEntry course1 = repositoryService.create(null, "Asuka Langley", "-", "Reference Manager course 1", "", null, 0, defOrganisation);
@@ -283,7 +277,7 @@ public class ReferenceManagerTest extends OlatTestCase {
 		List<RepositoryEntry> courses12 = new ArrayList<>(2);
 		courses12.add(course1);
 		courses12.add(course2);
-		List<ReferenceInfos> refCourses12 = referenceManager.getReferencesInfos(courses12, id, adminRoles);
+		List<ReferenceInfos> refCourses12 = referenceManager.getReferencesInfos(courses12, admin);
 		Assert.assertNotNull(refCourses12);
 		Assert.assertEquals(3, refCourses12.size());
 		//test12
@@ -305,7 +299,7 @@ public class ReferenceManagerTest extends OlatTestCase {
 		//course 2
 		List<RepositoryEntry> courses2 = new ArrayList<>(2);
 		courses2.add(course2);
-		List<ReferenceInfos> refCourses2 = referenceManager.getReferencesInfos(courses2, id, adminRoles);
+		List<ReferenceInfos> refCourses2 = referenceManager.getReferencesInfos(courses2, admin);
 		Assert.assertNotNull(refCourses2);
 		Assert.assertEquals(3, refCourses2.size());
 		//test12
@@ -327,7 +321,7 @@ public class ReferenceManagerTest extends OlatTestCase {
 		//course 4
 		List<RepositoryEntry> courses4 = new ArrayList<>(2);
 		courses4.add(course4);
-		List<ReferenceInfos> refCourses4 = referenceManager.getReferencesInfos(courses4, id, adminRoles);
+		List<ReferenceInfos> refCourses4 = referenceManager.getReferencesInfos(courses4, admin);
 		Assert.assertNotNull(refCourses4);
 		Assert.assertEquals(1, refCourses4.size());
 		//test234
@@ -341,7 +335,6 @@ public class ReferenceManagerTest extends OlatTestCase {
 	public void getReferencesInfos_permission() {
 		Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("Asuka");
 		Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("Rei");
-		Roles roles = new Roles(false, false, false, false, false, false, false);
 
 		Organisation defOrganisation = organisationService.getDefaultOrganisation();
 		RepositoryEntry course1 = repositoryService.create(null, "Asuka Langley", "-", "Reference Manager course 1 permission", "", null, 0, defOrganisation);
@@ -368,7 +361,7 @@ public class ReferenceManagerTest extends OlatTestCase {
 		List<RepositoryEntry> courses12 = new ArrayList<>(2);
 		courses12.add(course1);
 		courses12.add(course2);
-		List<ReferenceInfos> refCourses12 = referenceManager.getReferencesInfos(courses12, id1, roles);
+		List<ReferenceInfos> refCourses12 = referenceManager.getReferencesInfos(courses12, id1);
 		Assert.assertNotNull(refCourses12);
 		Assert.assertEquals(3, refCourses12.size());
 		//test12
@@ -390,7 +383,7 @@ public class ReferenceManagerTest extends OlatTestCase {
 		//course 2
 		List<RepositoryEntry> courses2 = new ArrayList<>(2);
 		courses2.add(course2);
-		List<ReferenceInfos> refCourses2 = referenceManager.getReferencesInfos(courses2, id2, roles);
+		List<ReferenceInfos> refCourses2 = referenceManager.getReferencesInfos(courses2, id2);
 		Assert.assertNotNull(refCourses2);
 		Assert.assertEquals(3, refCourses2.size());
 		//test12
diff --git a/src/test/java/org/olat/restapi/CourseTest.java b/src/test/java/org/olat/restapi/CourseTest.java
index addbb2a3c0a..3b718f0635f 100644
--- a/src/test/java/org/olat/restapi/CourseTest.java
+++ b/src/test/java/org/olat/restapi/CourseTest.java
@@ -238,7 +238,7 @@ public class CourseTest extends OlatJerseyTestCase {
 		
 		List<String> courseType = new ArrayList<>();
 		courseType.add(CourseModule.getCourseTypeName());
-		Roles roles = new Roles(true, true, true, true, false, true, false);
+		Roles roles = Roles.administratorRoles();
 
 		SearchRepositoryEntryParameters params = new SearchRepositoryEntryParameters("*", "*", "*", courseType, null, roles);
 		List<RepositoryEntry> repoEntries = repositoryManager.genericANDQueryWithRolesRestriction(params, 0, -1, true);
diff --git a/src/test/java/org/olat/restapi/MyForumsTest.java b/src/test/java/org/olat/restapi/MyForumsTest.java
index 0ce92ddfc95..ba473efa8cb 100644
--- a/src/test/java/org/olat/restapi/MyForumsTest.java
+++ b/src/test/java/org/olat/restapi/MyForumsTest.java
@@ -106,7 +106,7 @@ public class MyForumsTest extends OlatJerseyTestCase {
 		Assert.assertEquals(0, forums.getForums().length);
 		
 		//subscribe to the forum
-		IdentityEnvironment ienv = new IdentityEnvironment(id, new Roles(false, false, false, false, false, false, false));
+		IdentityEnvironment ienv = new IdentityEnvironment(id, Roles.userRoles());
 		new CourseTreeVisitor(myCourse, ienv).visit(new Visitor() {
 			@Override
 			public void visit(INode node) {
diff --git a/src/test/java/org/olat/restapi/NotificationsSubscribersTest.java b/src/test/java/org/olat/restapi/NotificationsSubscribersTest.java
index 7d91d0a52cb..995a93b5619 100644
--- a/src/test/java/org/olat/restapi/NotificationsSubscribersTest.java
+++ b/src/test/java/org/olat/restapi/NotificationsSubscribersTest.java
@@ -91,7 +91,7 @@ public class NotificationsSubscribersTest extends OlatJerseyTestCase {
 		ICourse course = CourseFactory.loadCourse(courseEntry);
 		
 		//find the forum
-		IdentityEnvironment ienv = new IdentityEnvironment(id1, new Roles(false, false, false, false, false, false, false));
+		IdentityEnvironment ienv = new IdentityEnvironment(id1, Roles.userRoles());
 		ForumVisitor forumVisitor = new ForumVisitor(course);
 		new CourseTreeVisitor(course, ienv).visit(forumVisitor, new VisibleTreeFilter());
 		FOCourseNode courseNode = forumVisitor.firstNode;
@@ -152,7 +152,7 @@ public class NotificationsSubscribersTest extends OlatJerseyTestCase {
 		ICourse course = CourseFactory.loadCourse(courseEntry);
 		
 		//find the forum
-		IdentityEnvironment ienv = new IdentityEnvironment(id1, new Roles(false, false, false, false, false, false, false));
+		IdentityEnvironment ienv = new IdentityEnvironment(id1, Roles.userRoles());
 		ForumVisitor forumVisitor = new ForumVisitor(course);
 		new CourseTreeVisitor(course, ienv).visit(forumVisitor, new VisibleTreeFilter());
 		FOCourseNode courseNode = forumVisitor.firstNode;
diff --git a/src/test/java/org/olat/restapi/RepositoryEntryWebServiceTest.java b/src/test/java/org/olat/restapi/RepositoryEntryWebServiceTest.java
index f9e7376bcf9..548fcde639e 100644
--- a/src/test/java/org/olat/restapi/RepositoryEntryWebServiceTest.java
+++ b/src/test/java/org/olat/restapi/RepositoryEntryWebServiceTest.java
@@ -88,7 +88,6 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 public class RepositoryEntryWebServiceTest extends OlatJerseyTestCase {
 
 	private static final OLog log = Tracing.createLoggerFor(RepositoryEntryWebServiceTest.class);
-	private static final Roles ADMIN_ROLES = new Roles(true, false, false, false, false, false, false);
 	
 	@Autowired
 	private DB dbInstance;
@@ -279,8 +278,8 @@ public class RepositoryEntryWebServiceTest extends OlatJerseyTestCase {
 		Identity coach1 = JunitTestHelper.createAndPersistIdentityAsAuthor("coach-1-" + UUID.randomUUID().toString());
 		Identity coach2 = JunitTestHelper.createAndPersistIdentityAsAuthor("coach-2-" + UUID.randomUUID().toString());
 		RepositoryEntry re = JunitTestHelper.createAndPersistRepositoryEntry();
-		repositoryManager.addTutors(coach1, ADMIN_ROLES, new IdentitiesAddEvent(coach1), re, new MailPackage(false));
-		repositoryManager.addTutors(coach1, ADMIN_ROLES, new IdentitiesAddEvent(coach2), re, new MailPackage(false));
+		repositoryManager.addTutors(coach1, Roles.administratorRoles(), new IdentitiesAddEvent(coach1), re, new MailPackage(false));
+		repositoryManager.addTutors(coach1, Roles.administratorRoles(), new IdentitiesAddEvent(coach2), re, new MailPackage(false));
 		dbInstance.commitAndCloseSession();
 
 		//get the coaches
@@ -373,7 +372,7 @@ public class RepositoryEntryWebServiceTest extends OlatJerseyTestCase {
 	public void removeCoach() throws IOException, URISyntaxException {
 		Identity coach = JunitTestHelper.createAndPersistIdentityAsAuthor("coach-4-" + UUID.randomUUID());
 		RepositoryEntry re = JunitTestHelper.createAndPersistRepositoryEntry();
-		repositoryManager.addTutors(coach, ADMIN_ROLES, new IdentitiesAddEvent(coach), re, new MailPackage(false));
+		repositoryManager.addTutors(coach, Roles.administratorRoles(), new IdentitiesAddEvent(coach), re, new MailPackage(false));
 		dbInstance.commitAndCloseSession();
 
 		//remove the owner
diff --git a/src/test/java/org/olat/restapi/UserFoldersTest.java b/src/test/java/org/olat/restapi/UserFoldersTest.java
index 76b6ae6e056..127ed45971c 100644
--- a/src/test/java/org/olat/restapi/UserFoldersTest.java
+++ b/src/test/java/org/olat/restapi/UserFoldersTest.java
@@ -114,7 +114,7 @@ public class UserFoldersTest extends OlatJerseyTestCase {
 		Assert.assertEquals(0, folders.getFolders().length);
 		
 		//subscribe to the forum
-		IdentityEnvironment ienv = new IdentityEnvironment(id, new Roles(false, false, false, false, false, false, false));
+		IdentityEnvironment ienv = new IdentityEnvironment(id, Roles.userRoles());
 		new CourseTreeVisitor(myCourse, ienv).visit(new Visitor() {
 			@Override
 			public void visit(INode node) {
diff --git a/src/test/java/org/olat/restapi/UserMgmtTest.java b/src/test/java/org/olat/restapi/UserMgmtTest.java
index 7a9517f9246..89ff82b2c4d 100644
--- a/src/test/java/org/olat/restapi/UserMgmtTest.java
+++ b/src/test/java/org/olat/restapi/UserMgmtTest.java
@@ -1020,8 +1020,8 @@ public class UserMgmtTest extends OlatJerseyTestCase {
 		Assert.assertFalse(reloadRoles.isGuestOnly());
 		Assert.assertFalse(reloadRoles.isLearnResourceManager());
 		Assert.assertFalse(reloadRoles.isInvitee());
-		Assert.assertFalse(reloadRoles.isOLATAdmin());
-		Assert.assertFalse(reloadRoles.isQPoolManager());
+		Assert.assertFalse(reloadRoles.isAdministrator());
+		Assert.assertFalse(reloadRoles.isPoolManager());
 		Assert.assertTrue(reloadRoles.isUserManager());
 		conn.shutdown();
 	}
diff --git a/src/test/java/org/olat/selenium/page/core/AdministrationPage.java b/src/test/java/org/olat/selenium/page/core/AdministrationPage.java
index ea7d3b6ab3f..456b433eb83 100644
--- a/src/test/java/org/olat/selenium/page/core/AdministrationPage.java
+++ b/src/test/java/org/olat/selenium/page/core/AdministrationPage.java
@@ -141,8 +141,8 @@ public class AdministrationPage {
 	}
 	
 	public AdministrationPage setGroupConfirmationForAuthor(boolean mandatory) {
-		By authorConfirmationBy = By.xpath("//label[input[@name='mandatory.membership' and @value='authors']]");
-		By authorConfirmationCheckBy = By.xpath("//label/input[@name='mandatory.membership' and @value='authors']");
+		By authorConfirmationBy = By.xpath("//label[input[@name='mandatory.membership' and @value='author']]");
+		By authorConfirmationCheckBy = By.xpath("//label/input[@name='mandatory.membership' and @value='author']");
 		
 		OOGraphene.waitElement(authorConfirmationBy, 5, browser);
 		OOGraphene.scrollTo(authorConfirmationBy, browser);
diff --git a/src/test/java/org/olat/selenium/page/user/ImportUserPage.java b/src/test/java/org/olat/selenium/page/user/ImportUserPage.java
index ac77367275c..828c74bdb9b 100644
--- a/src/test/java/org/olat/selenium/page/user/ImportUserPage.java
+++ b/src/test/java/org/olat/selenium/page/user/ImportUserPage.java
@@ -84,7 +84,7 @@ public class ImportUserPage {
 	/**
 	 * Append a line in the form:<br/>
 	 * Benutzername *	Passwort	Sprache	Vorname *	Nachname *	E-Mail *	Institution	Institutionsnummer	Institutions E-Mail<br/>
-	 * demo	olat4you	de	Peter	Muster	peter.muster@openolat.org	Universität Zürich	08-123-987	peter.muster@uzh.ch<br/>
+	 * demo	olat4you	de	Peter	Muster	peter.muster@openolat.org	Universität Zürich	08-123-987	peter.muster@frentix.com<br/>
 	 * 
 	 * 
 	 * 
diff --git a/src/test/java/org/olat/test/JunitTestHelper.java b/src/test/java/org/olat/test/JunitTestHelper.java
index 9bbef7c11cb..150cc6e2877 100644
--- a/src/test/java/org/olat/test/JunitTestHelper.java
+++ b/src/test/java/org/olat/test/JunitTestHelper.java
@@ -44,7 +44,6 @@ import org.olat.core.commons.persistence.DB;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Organisation;
-import org.olat.core.id.Roles;
 import org.olat.core.id.User;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
@@ -89,14 +88,6 @@ public class JunitTestHelper {
 		}
 	}
 	
-	public static Roles getAdminRoles() {
-		return new Roles(true, true, true, true, false, false, false);
-	}
-	
-	public static Roles getUserRoles() {
-		return new Roles(false, false, false, false, false, false, false);
-	}
-	
 	public static final OLATResource createRandomResource() {
 		String resName = UUID.randomUUID().toString().replace("-", "");
 		long resId = randomResId.nextInt(Integer.MAX_VALUE - 10) + 1;
@@ -181,6 +172,11 @@ public class JunitTestHelper {
 		return identity;
 	}
 	
+	public static final Identity createAndPersistIdentityAsRndAdmin(String prefixLogin) {
+		String login = getRandomizedLoginName(prefixLogin);
+		return createAndPersistIdentityAsAdmin(login);
+	}
+	
 	/**
 	 * Create an identity with admin permissions
 	 * @param login
-- 
GitLab