diff --git a/src/main/java/org/olat/course/nodes/BigBlueButtonCourseNode.java b/src/main/java/org/olat/course/nodes/BigBlueButtonCourseNode.java
index 796778256290610649a22a404ca28e538bd651b1..9e13e72689afe464dfe45c0b30cfb933362bccb6 100644
--- a/src/main/java/org/olat/course/nodes/BigBlueButtonCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/BigBlueButtonCourseNode.java
@@ -101,9 +101,9 @@ public class BigBlueButtonCourseNode extends AbstractAccessableCourseNode {
 			String message = trans.translate("guestnoaccess.message");
 			controller = MessageUIFactory.createInfoMessage(ureq, wControl, title, message);
 		} else {
-			// check if user is moderator of the virtual classroom
-			boolean admin = userCourseEnv.isAdmin();
-			boolean moderator = admin || userCourseEnv.isCoach();
+			// check if user is admin. / moderator of the virtual classroom
+			boolean admin = userCourseEnv.isAdmin() || userCourseEnv.isCoach();
+			boolean moderator = userCourseEnv.isAdmin() || userCourseEnv.isCoach();
 			// create run controller
 			RepositoryEntry entry = userCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
 
diff --git a/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonManager.java b/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonManager.java
index e0a3030259b62486784f9eb597cd94ae3d3b8a77..2a735966437c126e02117a717cec7d19b942b701 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonManager.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonManager.java
@@ -23,6 +23,7 @@ import java.util.Date;
 import java.util.List;
 
 import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.group.BusinessGroup;
 import org.olat.modules.bigbluebutton.model.BigBlueButtonErrors;
 import org.olat.repository.RepositoryEntry;
@@ -70,6 +71,10 @@ public interface BigBlueButtonManager {
 
 	public List<BigBlueButtonMeetingTemplate> getTemplates();
 	
+	public List<BigBlueButtonMeetingTemplate> getTemplates(List<BigBlueButtonRoles> editionRoles);
+
+	public List<BigBlueButtonRoles> calculatePermittedRoles(RepositoryEntry entry, BusinessGroup businessGroup, Identity identity, Roles userRoles);
+	
 	public BigBlueButtonMeetingTemplate updateTemplate(BigBlueButtonMeetingTemplate template);
 	
 	public void deleteTemplate(BigBlueButtonMeetingTemplate template);
diff --git a/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonMeetingTemplate.java b/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonMeetingTemplate.java
index 73a211b60d96d4788731e73eee24e401d51e18e4..d2d156ad93b12048424ba9a9251e115bccd06a49 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonMeetingTemplate.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonMeetingTemplate.java
@@ -139,6 +139,16 @@ public interface BigBlueButtonMeetingTemplate extends ModifiedInfo, CreateInfo {
 	public GuestPolicyEnum getGuestPolicyEnum();
 
 	public void setGuestPolicyEnum(GuestPolicyEnum guestPolicy);
-
-
+	
+	public default boolean availableTo(List<BigBlueButtonRoles> editionRoles) {
+		List<BigBlueButtonRoles> roles = getPermittedRolesEnum();
+		for(BigBlueButtonRoles role:roles) {
+			for(BigBlueButtonRoles editionRole:editionRoles) {
+				if(role.accept(editionRole)) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
 }
diff --git a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java
index 2e6002532731a9a74f4c63a89b6552eda1564fa7..265eab6d52315bd064b6c06dd478c9ce9d3dd54b 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java
@@ -20,6 +20,7 @@
 package org.olat.modules.bigbluebutton.manager;
 
 import java.net.URI;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
@@ -35,6 +36,7 @@ import org.olat.commons.calendar.model.Kalendar;
 import org.olat.commons.calendar.model.KalendarEvent;
 import org.olat.commons.calendar.ui.components.KalendarRenderWrapper;
 import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.core.id.User;
 import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.logging.Tracing;
@@ -44,6 +46,7 @@ import org.olat.core.util.WebappHelper;
 import org.olat.course.CourseFactory;
 import org.olat.course.ICourse;
 import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupService;
 import org.olat.modules.bigbluebutton.BigBlueButtonManager;
 import org.olat.modules.bigbluebutton.BigBlueButtonMeeting;
 import org.olat.modules.bigbluebutton.BigBlueButtonMeetingTemplate;
@@ -56,6 +59,8 @@ import org.olat.modules.bigbluebutton.model.BigBlueButtonErrorCodes;
 import org.olat.modules.bigbluebutton.model.BigBlueButtonErrors;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryRef;
+import org.olat.repository.RepositoryEntrySecurity;
+import org.olat.repository.RepositoryManager;
 import org.olat.repository.manager.RepositoryEntryDAO;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -76,10 +81,14 @@ public class BigBlueButtonManagerImpl implements BigBlueButtonManager, Initializ
 	@Autowired
 	private CalendarManager calendarManager;
 	@Autowired
+	private RepositoryManager repositoryManager;
+	@Autowired
 	private RepositoryEntryDAO repositoryEntryDao;
 	@Autowired
 	private BigBlueButtonModule bigBlueButtonModule;
 	@Autowired
+	private BusinessGroupService businessGroupService;
+	@Autowired
 	private BigBlueButtonMeetingDAO bigBlueButtonMeetingDao;
 	@Autowired
 	private BigBlueButtonMeetingTemplateDAO bigBlueButtonMeetingTemplateDao;
@@ -249,6 +258,19 @@ public class BigBlueButtonManagerImpl implements BigBlueButtonManager, Initializ
 		return bigBlueButtonMeetingTemplateDao.getTemplates();
 	}
 
+	@Override
+	public List<BigBlueButtonMeetingTemplate> getTemplates(List<BigBlueButtonRoles> editionRoles) {
+		List<BigBlueButtonMeetingTemplate> templates = getTemplates();
+		
+		List<BigBlueButtonMeetingTemplate> authorisedTemplates = new ArrayList<>();
+		for(BigBlueButtonMeetingTemplate template:templates) {
+			if(template.isEnabled() && template.availableTo(editionRoles))  {
+				authorisedTemplates.add(template);
+			}
+		}
+		return authorisedTemplates;
+	}
+
 	@Override
 	public List<BigBlueButtonMeeting> getAllMeetings() {
 		return bigBlueButtonMeetingDao.getAllMeetings();
@@ -334,6 +356,38 @@ public class BigBlueButtonManagerImpl implements BigBlueButtonManager, Initializ
 		}
 		return wrapper == null ? null: wrapper.getKalendar();
 	}
+	
+	@Override
+	public List<BigBlueButtonRoles> calculatePermittedRoles(RepositoryEntry entry, BusinessGroup businessGroup, Identity identity, Roles userRoles) {
+		List<BigBlueButtonRoles> editionRoles = new ArrayList<>();
+		if(userRoles.isAdministrator() || userRoles.isSystemAdmin()) {
+			editionRoles.add(BigBlueButtonRoles.administrator);
+		}
+		if(userRoles.isAuthor() || userRoles.isLearnResourceManager()) {
+			// global authors / LR-managers can use author templates also in groups
+			editionRoles.add(BigBlueButtonRoles.author);
+		}
+		
+		if(businessGroup != null) {
+			if(businessGroupService.isIdentityInBusinessGroup(identity, businessGroup)) {
+				// all group user can choose the group templates (if they are allowed to create group online-meetings)
+				editionRoles.add(BigBlueButtonRoles.group);	
+				if(businessGroupService.isIdentityInBusinessGroup(identity, businessGroup.getKey(), true, false, null)) {
+					editionRoles.add(BigBlueButtonRoles.coach);
+				}
+			}
+		} else if(entry != null) {
+			RepositoryEntrySecurity reSecurity = repositoryManager.isAllowed(identity, userRoles, entry);
+			if(reSecurity.isEntryAdmin()) {
+				editionRoles.add(BigBlueButtonRoles.owner);
+			}
+			if(reSecurity.isCourseCoach()) {
+				editionRoles.add(BigBlueButtonRoles.coach);
+			}
+		}
+		
+		return editionRoles;
+	}
 
 	@Override
 	public boolean isMeetingRunning(BigBlueButtonMeeting meeting) {
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonEditMeetingsController.java b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonEditMeetingsController.java
index cf603c792c1abfa0b4334199617d76faf0d116a0..38c9c6490673b0d4de407a963ddf8ca243cb6470 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonEditMeetingsController.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonEditMeetingsController.java
@@ -19,7 +19,6 @@
  */
 package org.olat.modules.bigbluebutton.ui;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import org.olat.core.commons.persistence.SortKey;
@@ -42,9 +41,7 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
 import org.olat.core.gui.control.generic.modal.DialogBoxController;
 import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
-import org.olat.core.id.Roles;
 import org.olat.group.BusinessGroup;
-import org.olat.group.BusinessGroupService;
 import org.olat.modules.bigbluebutton.BigBlueButtonManager;
 import org.olat.modules.bigbluebutton.BigBlueButtonMeeting;
 import org.olat.modules.bigbluebutton.BigBlueButtonModule;
@@ -53,8 +50,6 @@ import org.olat.modules.bigbluebutton.model.BigBlueButtonErrors;
 import org.olat.modules.bigbluebutton.ui.BigBlueButtonMeetingTableModel.BMeetingsCols;
 import org.olat.modules.gotomeeting.ui.GoToMeetingTableModel.MeetingsCols;
 import org.olat.repository.RepositoryEntry;
-import org.olat.repository.RepositoryEntrySecurity;
-import org.olat.repository.RepositoryManager;
 import org.springframework.beans.factory.annotation.Autowired;
 
 /**
@@ -78,14 +73,10 @@ public class BigBlueButtonEditMeetingsController extends FormBasicController {
 	private final RepositoryEntry entry;
 	private final BusinessGroup businessGroup;
 
-	@Autowired
-	private RepositoryManager repositoryManager;
 	@Autowired
 	private BigBlueButtonModule bigBlueButtonModule;
 	@Autowired
 	private BigBlueButtonManager bigBlueButtonManager;
-	@Autowired
-	private BusinessGroupService businessGroupService;
 	
 	public BigBlueButtonEditMeetingsController(UserRequest ureq, WindowControl wControl,
 			RepositoryEntry entry, String subIdentifier, BusinessGroup group, boolean readOnly) {
@@ -194,7 +185,8 @@ public class BigBlueButtonEditMeetingsController extends FormBasicController {
 	private void doAddMeeting(UserRequest ureq) {
 		if(guardModalController(editMeetingCtlr)) return;
 
-		List<BigBlueButtonRoles> editionRoles= getPermittedRoles(ureq);
+		List<BigBlueButtonRoles> editionRoles= bigBlueButtonManager
+				.calculatePermittedRoles(entry, businessGroup, getIdentity(), ureq.getUserSession().getRoles());
 		editMeetingCtlr = new EditBigBlueButtonMeetingController(ureq, getWindowControl(),
 				entry, subIdent, businessGroup, editionRoles);
 		listenTo(editMeetingCtlr);
@@ -208,7 +200,8 @@ public class BigBlueButtonEditMeetingsController extends FormBasicController {
 	private void doEditMeeting(UserRequest ureq, BigBlueButtonMeeting meeting) {
 		if(guardModalController(editMeetingCtlr)) return;
 		
-		List<BigBlueButtonRoles> editionRoles= getPermittedRoles(ureq);
+		List<BigBlueButtonRoles> editionRoles= bigBlueButtonManager
+				.calculatePermittedRoles(entry, businessGroup, getIdentity(), ureq.getUserSession().getRoles());
 		editMeetingCtlr = new EditBigBlueButtonMeetingController(ureq, getWindowControl(),
 				meeting, editionRoles);
 		listenTo(editMeetingCtlr);
@@ -219,40 +212,6 @@ public class BigBlueButtonEditMeetingsController extends FormBasicController {
 		listenTo(cmc);
 	}
 	
-	private List<BigBlueButtonRoles> getPermittedRoles(UserRequest ureq) {
-		Roles roles = ureq.getUserSession().getRoles();
-		
-		List<BigBlueButtonRoles> editionRoles = new ArrayList<>();
-		if(businessGroup != null) {
-			if(roles.isAdministrator() || roles.isSystemAdmin()) {
-				editionRoles.add(BigBlueButtonRoles.administrator);
-			}
-			if(roles.isAuthor() || roles.isLearnResourceManager()) {
-				// global authors / LR-managers can use author templates also in groups
-				editionRoles.add(BigBlueButtonRoles.author);
-			}
-			if(businessGroupService.isIdentityInBusinessGroup(getIdentity(), businessGroup)) {
-				// all group user can choose the group templates (if they are allowed to create group online-meetings)
-				editionRoles.add(BigBlueButtonRoles.group);
-			}
-		} else if(entry != null) {
-			RepositoryEntrySecurity reSecurity = repositoryManager.isAllowed(getIdentity(), roles, entry);
-			if(roles.isAdministrator() || roles.isSystemAdmin()) {
-				editionRoles.add(BigBlueButtonRoles.administrator);
-			}
-			if(reSecurity.isAuthor() || roles.isLearnResourceManager()) {
-				editionRoles.add(BigBlueButtonRoles.author);
-			}
-			if(reSecurity.isEntryAdmin()) {
-				editionRoles.add(BigBlueButtonRoles.owner);
-			}
-			if(reSecurity.isCourseCoach()) {
-				editionRoles.add(BigBlueButtonRoles.coach);
-			}
-		}
-		return editionRoles;
-	}
-	
 	private void doConfirmDelete(UserRequest ureq, BigBlueButtonMeeting meeting) {
 		String confirmDeleteTitle = translate("confirm.delete.meeting.title", new String[]{ meeting.getName() });
 		String confirmDeleteText = translate("confirm.delete.meeting", new String[]{ meeting.getName() });
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonRunController.java b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonRunController.java
index 5b64ec2f044c00e29b4f4939cd7237b34a842550..0c7c29216579f91a05529651a4bcd744d0cbc188 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonRunController.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonRunController.java
@@ -19,7 +19,6 @@
  */
 package org.olat.modules.bigbluebutton.ui;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import org.olat.core.gui.UserRequest;
@@ -35,12 +34,10 @@ 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.Roles;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.StateEntry;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.group.BusinessGroup;
-import org.olat.group.BusinessGroupService;
 import org.olat.modules.bigbluebutton.BigBlueButtonManager;
 import org.olat.modules.bigbluebutton.BigBlueButtonMeeting;
 import org.olat.modules.bigbluebutton.BigBlueButtonMeetingTemplate;
@@ -79,8 +76,6 @@ public class BigBlueButtonRunController extends BasicController implements Activ
 
 	@Autowired
 	private BigBlueButtonManager bigBlueButtonManager;
-	@Autowired
-	private BusinessGroupService businessGroupService;
 	
 	public BigBlueButtonRunController(UserRequest ureq, WindowControl wControl, RepositoryEntry entry, String subIdentifier,
 			BusinessGroup group, BigBlueButtonMeetingDefaultConfiguration configuration, boolean admin, boolean moderator, boolean readOnly) {
@@ -122,40 +117,15 @@ public class BigBlueButtonRunController extends BasicController implements Activ
 
 	
 	private boolean hasAtLeastOneTemplate(UserRequest ureq) {
-		// TODO: refactor: copy paste from BigBlueButtonEditMeetingsController.getPermittedRoles()
-		// should also apply to group config form: don't let regular students enable bbb in groups when they have no 
+		// TODO bbb should also apply to group config form: don't let regular students enable bbb in groups when they have no 
 		// template to choose from.
-		Roles userRoles = ureq.getUserSession().getRoles();
-		
-		List<BigBlueButtonRoles> editionRoles = new ArrayList<>();
-		if(userRoles.isAdministrator() || userRoles.isSystemAdmin()) {
-			editionRoles.add(BigBlueButtonRoles.administrator);
-		}
-		if(userRoles.isAuthor() || userRoles.isLearnResourceManager()) {
-			// global authors / LR-managers can use author templates also in groups
-			editionRoles.add(BigBlueButtonRoles.author);
-		}
-		if(businessGroupService.isIdentityInBusinessGroup(getIdentity(), group)) {
-			// all group user can choose the group templates (if they are allowed to create group online-meetings)
-			editionRoles.add(BigBlueButtonRoles.group);
-		}
-		
-		List<BigBlueButtonMeetingTemplate> templates = bigBlueButtonManager.getTemplates();
-		for(BigBlueButtonMeetingTemplate template:templates) {
-			if(!template.isEnabled()) continue;			
-			List<BigBlueButtonRoles> roles = template.getPermittedRolesEnum();
-			for(BigBlueButtonRoles role:roles) {
-				for(BigBlueButtonRoles editionRole:editionRoles) {
-					if(role.accept(editionRole)) {
-						return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-
+		List<BigBlueButtonRoles> editionRoles = bigBlueButtonManager
+				.calculatePermittedRoles(entry, group, getIdentity(), ureq.getUserSession().getRoles());
+		bigBlueButtonManager.getTemplates(editionRoles);
 	
+		List<BigBlueButtonMeetingTemplate> templates = bigBlueButtonManager.getTemplates(editionRoles);
+		return !templates.isEmpty();
+	}
 	
 	@Override
 	protected void doDispose() {
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonMeetingController.java b/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonMeetingController.java
index 4522835379024f86fe3a6e49ac94f10864a7274a..8d2ffdb3e8c9f563887b9e61cd87e73c822cca51 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonMeetingController.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonMeetingController.java
@@ -131,7 +131,8 @@ public class EditBigBlueButtonMeetingController extends FormBasicController {
 				? null : meeting.getTemplate().getKey();
 		KeyValues templatesKeyValues = new KeyValues();
 		for(BigBlueButtonMeetingTemplate template:templates) {
-			if(accept(template) || template.getKey().equals(selectedTemplateKey)) {
+			if((template.isEnabled() && template.availableTo(editionRoles))
+					|| template.getKey().equals(selectedTemplateKey)) {
 				templatesKeyValues.add(KeyValues.entry(template.getKey().toString(), template.getName()));
 			}
 		}
@@ -196,20 +197,6 @@ public class EditBigBlueButtonMeetingController extends FormBasicController {
 		uifactory.addFormSubmitButton("save", buttonLayout);
 	}
 	
-	private boolean accept(BigBlueButtonMeetingTemplate template) {
-		if(!template.isEnabled()) return false;
-		
-		List<BigBlueButtonRoles> roles = template.getPermittedRolesEnum();
-		for(BigBlueButtonRoles role:roles) {
-			for(BigBlueButtonRoles editionRole:editionRoles) {
-				if(role.accept(editionRole)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-	
 	private void updateUI() {
 		boolean permanent = permanentEl.isAtLeastSelected(1);
 		startDateEl.setVisible(!permanent);
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties
index 32d118f1c3f788d2f57f40d1fc9b0bd499f2880f..7d64804bda756a734c486403f05e71665d5843ec 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties
@@ -47,7 +47,7 @@ meeting.welcome=Welcome message
 meetings.admin.title=Meeting management
 meetings.past=Past online-meetings
 meetings.title=Online-meetings
-meetings.upcoming=Current and upcoming onlin-meetings
+meetings.upcoming=Current and upcoming online-meetings
 minutes={0} min.
 no.meeting.configured=There are no online-meetings available at this time.
 no.recordings=There is no recording available for this online-meeting at this time.