diff --git a/src/main/java/org/olat/course/nodes/BigBlueButtonCourseNode.java b/src/main/java/org/olat/course/nodes/BigBlueButtonCourseNode.java
index 9d06c57cedfc6de143aeed715ec1e7645142757e..796778256290610649a22a404ca28e538bd651b1 100644
--- a/src/main/java/org/olat/course/nodes/BigBlueButtonCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/BigBlueButtonCourseNode.java
@@ -21,7 +21,6 @@ package org.olat.course.nodes;
 
 import java.util.List;
 
-import org.apache.logging.log4j.Logger;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.stack.BreadcrumbPanel;
 import org.olat.core.gui.control.Controller;
@@ -30,7 +29,6 @@ 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.Roles;
-import org.olat.core.logging.Tracing;
 import org.olat.core.util.Util;
 import org.olat.course.ICourse;
 import org.olat.course.condition.ConditionEditController;
@@ -57,7 +55,6 @@ import org.olat.repository.RepositoryEntry;
 public class BigBlueButtonCourseNode extends AbstractAccessableCourseNode {
 	
 	private static final long serialVersionUID = 7965344505304490859L;
-	private static final Logger log = Tracing.createLoggerFor(BigBlueButtonCourseNode.class);
 	public static final String TYPE = "bigbluebutton";
 
 	// configuration
diff --git a/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonRoles.java b/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonRoles.java
index 53c3192410b9880db559cc109f89c254bb457409..b161539fc508e22ed9bc0c8bade491721f7fde24 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonRoles.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonRoles.java
@@ -19,6 +19,13 @@
  */
 package org.olat.modules.bigbluebutton;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import org.olat.core.util.StringHelper;
+
+import edu.emory.mathcs.backport.java.util.Collections;
+
 /**
  * 
  * Initial date: 24 mars 2020<br>
@@ -30,6 +37,59 @@ public enum BigBlueButtonRoles {
 	coach,
 	owner,
 	author,
-	administrator
-
+	administrator;
+	
+	public boolean accept(BigBlueButtonRoles role) {
+		if(role == null) return false;
+		if(this == role) {
+			return true;
+		}
+		if(role == administrator) {
+			return true;
+		}
+		if(role == author) {
+			return (this == author || this == owner || this == coach);
+		}
+		return false;
+	}
+	
+	public static List<BigBlueButtonRoles> valuesAsList() {
+		List<BigBlueButtonRoles> roles = new ArrayList<>();
+		Collections.addAll(roles, BigBlueButtonRoles.values());
+		return roles;
+	}
+	
+	public static List<BigBlueButtonRoles> toList(String val) {
+		List<BigBlueButtonRoles> roles = new ArrayList<>();
+		if(StringHelper.containsNonWhitespace(val)) {
+			String[] valArray = val.split("[,]");
+			if(valArray != null && valArray.length > 0) {
+				for(String v:valArray) {
+					BigBlueButtonRoles role = BigBlueButtonRoles.valueOfSecure(v);
+					if(role != null) {
+						roles.add(role);
+					}
+				}
+			}	
+		}
+		return roles;
+	}
+	
+	public static BigBlueButtonRoles valueOfSecure(String val) {
+		for(BigBlueButtonRoles role:BigBlueButtonRoles.values()) {
+			if(role.name().equals(val)) {
+				return role;
+			}
+		}
+		return null;
+	}
+	
+	public static String toString(List<BigBlueButtonRoles> roles) {
+		StringBuilder sb = new StringBuilder();
+		for(BigBlueButtonRoles role:roles) {
+			if(sb.length() > 0) sb.append(",");
+			sb.append(role.name());
+		}
+		return sb.toString();
+	}
 }
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 1a40c108ea861396d51661a6a82a4a95c297a2c6..5e21ba35451d0a7f3cbe6bf9a6ee834d27340989 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java
@@ -49,6 +49,7 @@ import org.olat.modules.bigbluebutton.BigBlueButtonMeeting;
 import org.olat.modules.bigbluebutton.BigBlueButtonMeetingTemplate;
 import org.olat.modules.bigbluebutton.BigBlueButtonModule;
 import org.olat.modules.bigbluebutton.BigBlueButtonRecording;
+import org.olat.modules.bigbluebutton.BigBlueButtonRoles;
 import org.olat.modules.bigbluebutton.GuestPolicyEnum;
 import org.olat.modules.bigbluebutton.model.BigBlueButtonError;
 import org.olat.modules.bigbluebutton.model.BigBlueButtonErrorCodes;
@@ -137,6 +138,7 @@ public class BigBlueButtonManagerImpl implements BigBlueButtonManager, Initializ
 		template.setMaxConcurrentMeetings(maxConcurrentMeetings);
 		template.setMaxParticipants(maxParticipants);
 		template.setMaxDuration(maxDuration);
+		template.setPermittedRolesEnum(BigBlueButtonRoles.valuesAsList());
 		template.setMuteOnStart(muteOnStart);
 		template.setAutoStartRecording(autoStartRecording);
 		template.setAllowStartStopRecording(allowStartStopRecording);
diff --git a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingDAO.java b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingDAO.java
index 2b14f332bc92b6917cc811d6d0ed63d7cdb6a630..6ec4098e3133ef150c5f1657ce77b0ce14eb5fe1 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingDAO.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingDAO.java
@@ -167,13 +167,13 @@ public class BigBlueButtonMeetingDAO {
 		  .append(" inner join meeting.template as template")
 		  .append(" where template.key=:templateKey")
 		  .append(" and (")
-		  .append("  (meeting.startWithLeadTime>=:startDate and meeting.startWithLeadTime<=:endDate)")
+		  .append("  (meeting.startDate>=:startDate and meeting.startDate<:endDate)")
 		  .append("  or")
-		  .append("  (meeting.endWithFollowupTime>=:startDate and meeting.endWithFollowupTime<=:endDate)")
+		  .append("  (meeting.endDate>:startDate and meeting.endDate<=:endDate)")
 		  .append("  or")
-		  .append("  (meeting.startWithLeadTime>=:startDate and meeting.endWithFollowupTime<=:endDate)")
+		  .append("  (meeting.startDate>=:startDate and meeting.endDate<=:endDate)")
 		  .append("  or")
-		  .append("  (meeting.startWithLeadTime<=:startDate and meeting.endWithFollowupTime>=:endDate)")
+		  .append("  (meeting.startDate<=:startDate and meeting.endDate>=:endDate)")
 		  .append(")");
 		return dbInstance.getCurrentEntityManager()
 				.createQuery(sb.toString(), Long.class)
diff --git a/src/main/java/org/olat/modules/bigbluebutton/model/BigBlueButtonMeetingTemplateImpl.java b/src/main/java/org/olat/modules/bigbluebutton/model/BigBlueButtonMeetingTemplateImpl.java
index 328155bd45308605325c64bb129a093365299bd8..14e9816315ef97d54ebd489e36f503f3170f97cd 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/model/BigBlueButtonMeetingTemplateImpl.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/model/BigBlueButtonMeetingTemplateImpl.java
@@ -387,7 +387,7 @@ public class BigBlueButtonMeetingTemplateImpl implements Persistable, BigBlueBut
 
 	@Override
 	public List<BigBlueButtonRoles> getPermittedRolesEnum() {
-		return null;
+		return BigBlueButtonRoles.toList(permittedRoles);
 	}
 
 	@Override
@@ -395,7 +395,7 @@ public class BigBlueButtonMeetingTemplateImpl implements Persistable, BigBlueBut
 		if(roles == null || roles.isEmpty()) {
 			setPermittedRoles(null);
 		} else {
-			
+			setPermittedRoles(BigBlueButtonRoles.toString(roles));
 		}
 	}
 
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 ffaf19c6c2f485516fe99512f93ee072c1f8066f..7dced6ae695c205d0a479aa49f34e0bc990e1594 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonEditMeetingsController.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonEditMeetingsController.java
@@ -19,6 +19,7 @@
  */
 package org.olat.modules.bigbluebutton.ui;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.olat.core.commons.persistence.SortKey;
@@ -41,14 +42,19 @@ 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;
+import org.olat.modules.bigbluebutton.BigBlueButtonRoles;
 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;
 
 /**
@@ -72,10 +78,14 @@ 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) {
@@ -183,8 +193,10 @@ public class BigBlueButtonEditMeetingsController extends FormBasicController {
 
 	private void doAddMeeting(UserRequest ureq) {
 		if(guardModalController(editMeetingCtlr)) return;
-		
-		editMeetingCtlr = new EditBigBlueButtonMeetingController(ureq, getWindowControl(), entry, subIdent, businessGroup);
+
+		List<BigBlueButtonRoles> editionRoles= getPermittedRoles(ureq);
+		editMeetingCtlr = new EditBigBlueButtonMeetingController(ureq, getWindowControl(),
+				entry, subIdent, businessGroup, editionRoles);
 		listenTo(editMeetingCtlr);
 		
 		cmc = new CloseableModalController(getWindowControl(), "close", editMeetingCtlr.getInitialComponent(),
@@ -196,7 +208,9 @@ public class BigBlueButtonEditMeetingsController extends FormBasicController {
 	private void doEditMeeting(UserRequest ureq, BigBlueButtonMeeting meeting) {
 		if(guardModalController(editMeetingCtlr)) return;
 		
-		editMeetingCtlr = new EditBigBlueButtonMeetingController(ureq, getWindowControl(), meeting);
+		List<BigBlueButtonRoles> editionRoles= getPermittedRoles(ureq);
+		editMeetingCtlr = new EditBigBlueButtonMeetingController(ureq, getWindowControl(),
+				meeting, editionRoles);
 		listenTo(editMeetingCtlr);
 		
 		cmc = new CloseableModalController(getWindowControl(), "close", editMeetingCtlr.getInitialComponent(),
@@ -205,6 +219,35 @@ 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()) {
+				editionRoles.add(BigBlueButtonRoles.administrator);
+			}
+			if(businessGroupService.isIdentityInBusinessGroup(getIdentity(), businessGroup.getKey(), true, false, null)) {
+				editionRoles.add(BigBlueButtonRoles.coach);
+			}
+		} else if(entry != null) {
+			RepositoryEntrySecurity reSecurity = repositoryManager.isAllowed(getIdentity(), roles, entry);
+			if(roles.isAdministrator()) {
+				editionRoles.add(BigBlueButtonRoles.administrator);
+			}
+			if(reSecurity.isAuthor()) {
+				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/EditBigBlueButtonMeetingController.java b/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonMeetingController.java
index d0a85df1da4615a503e662d21a905460b0f98825..bace9acb687a62ab8296d1d2e8965e8bc40ed08f 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonMeetingController.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonMeetingController.java
@@ -44,6 +44,7 @@ import org.olat.modules.bigbluebutton.BigBlueButtonManager;
 import org.olat.modules.bigbluebutton.BigBlueButtonMeeting;
 import org.olat.modules.bigbluebutton.BigBlueButtonMeetingTemplate;
 import org.olat.modules.bigbluebutton.BigBlueButtonModule;
+import org.olat.modules.bigbluebutton.BigBlueButtonRoles;
 import org.olat.repository.RepositoryEntry;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -71,6 +72,7 @@ public class EditBigBlueButtonMeetingController extends FormBasicController {
 	private final RepositoryEntry entry;
 	private final BusinessGroup businessGroup;
 	private BigBlueButtonMeeting meeting;
+	private final List<BigBlueButtonRoles> editionRoles;
 	private List<BigBlueButtonMeetingTemplate> templates;
 	
 	private FormLink openCalLink;
@@ -83,23 +85,26 @@ public class EditBigBlueButtonMeetingController extends FormBasicController {
 	private BigBlueButtonManager bigBlueButtonManager;
 	
 	public EditBigBlueButtonMeetingController(UserRequest ureq, WindowControl wControl,
-			RepositoryEntry entry, String subIdent, BusinessGroup businessGroup) {
+			RepositoryEntry entry, String subIdent, BusinessGroup businessGroup, List<BigBlueButtonRoles> editionRoles) {
 		super(ureq, wControl);
 		this.entry = entry;
 		this.subIdent = subIdent;
 		this.businessGroup = businessGroup;
+		this.editionRoles = editionRoles;
 		templates = bigBlueButtonManager.getTemplates();
 		
 		initForm(ureq);
 		updateUI();
 	}
 	
-	public EditBigBlueButtonMeetingController(UserRequest ureq, WindowControl wControl, BigBlueButtonMeeting meeting) {
+	public EditBigBlueButtonMeetingController(UserRequest ureq, WindowControl wControl,
+			BigBlueButtonMeeting meeting, List<BigBlueButtonRoles> editionRoles) {
 		super(ureq, wControl);
 		entry = meeting.getEntry();
 		subIdent = meeting.getSubIdent();
 		businessGroup = meeting.getBusinessGroup();
 		this.meeting = meeting;
+		this.editionRoles = editionRoles;
 		templates = bigBlueButtonManager.getTemplates();
 		
 		initForm(ureq);
@@ -125,7 +130,7 @@ public class EditBigBlueButtonMeetingController extends FormBasicController {
 				? null : meeting.getTemplate().getKey();
 		KeyValues templatesKeyValues = new KeyValues();
 		for(BigBlueButtonMeetingTemplate template:templates) {
-			if(template.isEnabled() || template.getKey().equals(selectedTemplateKey)) {
+			if(accept(template) || template.getKey().equals(selectedTemplateKey)) {
 				templatesKeyValues.add(KeyValues.entry(template.getKey().toString(), template.getName()));
 			}
 		}
@@ -145,7 +150,7 @@ public class EditBigBlueButtonMeetingController extends FormBasicController {
 				}
 			}
 		}
-		if(!templateSelected) {
+		if(!templateSelected && templatesKeys.length > 0) {
 			templateEl.select(templatesKeys[0], true);
 		}
 		openCalLink = uifactory.addFormLink("calendar.open", formLayout);
@@ -184,6 +189,20 @@ 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);
@@ -263,8 +282,8 @@ public class EditBigBlueButtonMeetingController extends FormBasicController {
 			}
 		}
 		
-		allOk &= validateTime(leadTimeEl);
-		allOk &= validateTime(followupTimeEl);
+		allOk &= validateTime(leadTimeEl, 15l);
+		allOk &= validateTime(followupTimeEl, 15l);
 		
 		templateEl.clearError();
 		if(!templateEl.isOneSelected()) {
@@ -289,12 +308,17 @@ public class EditBigBlueButtonMeetingController extends FormBasicController {
 		return allOk;
 	}
 	
-	private boolean validateTime(TextElement el) {
+	private boolean validateTime(TextElement el, long maxValue) {
 		boolean allOk = true;
 		el.clearError();
-		if(StringHelper.containsNonWhitespace(el.getValue()) && !StringHelper.isLong(el.getValue())) {
-			el.setErrorKey("form.error.nointeger", null);
-			allOk &= false;
+		if(StringHelper.containsNonWhitespace(el.getValue())) {
+			if(!StringHelper.isLong(el.getValue())) {
+				el.setErrorKey("form.error.nointeger", null);
+				allOk &= false;
+			} else if(Long.parseLong(el.getValue()) > maxValue) {
+				el.setErrorKey("error.too.long.time", new String[] { Long.toString(maxValue) });
+				allOk &= false;
+			}
 		}
 		return allOk;
 	}
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonTemplateController.java b/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonTemplateController.java
index de560d92bf29895b491f5cfeeff45b6a70670c3a..802ffbf2a3b1f650adb55e1b50ed8b79c81a892a 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonTemplateController.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonTemplateController.java
@@ -19,6 +19,10 @@
  */
 package org.olat.modules.bigbluebutton.ui;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.olat.core.commons.persistence.DB;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
@@ -28,12 +32,14 @@ import org.olat.core.gui.components.form.flexible.elements.TextElement;
 import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
 import org.olat.core.gui.components.form.flexible.impl.FormEvent;
 import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
+import org.olat.core.gui.components.util.KeyValues;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.util.StringHelper;
 import org.olat.modules.bigbluebutton.BigBlueButtonManager;
 import org.olat.modules.bigbluebutton.BigBlueButtonMeetingTemplate;
+import org.olat.modules.bigbluebutton.BigBlueButtonRoles;
 import org.springframework.beans.factory.annotation.Autowired;
 
 /**
@@ -51,6 +57,7 @@ public class EditBigBlueButtonTemplateController extends FormBasicController {
 	private TextElement descriptionEl;
 	
 	private MultipleSelectionElement enableEl;
+	private MultipleSelectionElement rolesEl;
 	
 	private TextElement maxConcurrentMeetingsEl;
 	private TextElement maxParticipantsEl;
@@ -77,6 +84,8 @@ public class EditBigBlueButtonTemplateController extends FormBasicController {
 	private final boolean readOnly;
 	private BigBlueButtonMeetingTemplate template;
 	
+	@Autowired
+	private DB dbInstance;
 	@Autowired
 	private BigBlueButtonManager bigBlueButtonManager;
 	
@@ -112,6 +121,22 @@ public class EditBigBlueButtonTemplateController extends FormBasicController {
 		enableEl = uifactory.addCheckboxesHorizontal("template.enabled", "template.enabled", formLayout, onKeys, new String[] { "" });
 		enableEl.select(onKeys[0], enable);
 		
+		KeyValues rolesKeyValues = new KeyValues();
+		for(BigBlueButtonRoles role:BigBlueButtonRoles.values()) {
+			rolesKeyValues.add(KeyValues.entry(role.name(), translate("role.".concat(role.name()))));
+		}
+		rolesEl = uifactory.addCheckboxesVertical("template.roles", "template.roles", formLayout,
+				rolesKeyValues.keys(), rolesKeyValues.values(), 1);
+		List<BigBlueButtonRoles> roles;
+		if(template != null) {
+			roles = template.getPermittedRolesEnum();
+		} else {
+			roles = BigBlueButtonRoles.valuesAsList();
+		}
+		for(BigBlueButtonRoles role:roles) {
+			rolesEl.select(role.name(), true);
+		}
+		
 		String maxConcurrentMeetings = template == null || template.getMaxConcurrentMeetings() == null ? "" : template.getMaxConcurrentMeetings().toString();
 		maxConcurrentMeetingsEl = uifactory.addTextElement("template.max.concurrent.meetings", "template.max.concurrent.meetings", 8, maxConcurrentMeetings, formLayout);
 		
@@ -119,7 +144,12 @@ public class EditBigBlueButtonTemplateController extends FormBasicController {
 		maxParticipantsEl = uifactory.addTextElement("template.maxParticipants", "template.maxParticipants", 8, maxParticipants, formLayout);
 		maxParticipantsEl.setMandatory(true);
 		
-		String maxDuration = template == null || template.getMaxDuration() == null ? null : template.getMaxDuration().toString();
+		String maxDuration = null;
+		if(template == null) {
+			maxDuration = "240";
+		} else if(template.getMaxDuration() != null) {
+			maxDuration = template.getMaxDuration().toString();
+		}
 		maxDurationEl = uifactory.addTextElement("template.maxDuration", "template.maxDuration", 8, maxDuration, formLayout);
 
 		String[] onValues = new String[] { translate("yes"), translate("no")  };
@@ -307,6 +337,10 @@ public class EditBigBlueButtonTemplateController extends FormBasicController {
 		template.setDescription(descriptionEl.getValue());
 		template.setEnabled(enableEl.isAtLeastSelected(1));
 		
+		List<BigBlueButtonRoles> roles = rolesEl.getSelectedKeys().stream()
+				.map(BigBlueButtonRoles::valueOf).collect(Collectors.toList());
+		template.setPermittedRolesEnum(roles);
+		
 		if(StringHelper.containsNonWhitespace(maxConcurrentMeetingsEl.getValue())
 				&& StringHelper.isLong(maxConcurrentMeetingsEl.getValue())) {
 			template.setMaxConcurrentMeetings(Long.valueOf(maxConcurrentMeetingsEl.getValue()).intValue());
@@ -348,6 +382,7 @@ public class EditBigBlueButtonTemplateController extends FormBasicController {
 		template.setLockSettingsLockOnJoinConfigurable(getSelected(lockSettingsLockOnJoinConfigurableEl));
 		
 		template = bigBlueButtonManager.updateTemplate(template);
+		dbInstance.commit();
 		fireEvent(ureq, Event.DONE_EVENT);
 	}
 	
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/TemplateMinuteCellRenderer.java b/src/main/java/org/olat/modules/bigbluebutton/ui/TemplateMinuteCellRenderer.java
index e2a2ebff59fe5aef76b6fa4c093208efd017abcc..353a00e475c89e6d3e1b749a2aa19668ad6504b1 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/TemplateMinuteCellRenderer.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/TemplateMinuteCellRenderer.java
@@ -44,7 +44,7 @@ public class TemplateMinuteCellRenderer implements FlexiCellRenderer {
 	public void render(Renderer renderer, StringOutput target, Object cellValue, int row, FlexiTableComponent source,
 			URLBuilder ubu, Translator transl) {
 		if(cellValue instanceof Number) {
-			translator.translate("minutes", new String[] { Integer.toString(((Number)cellValue).intValue()) });
+			target.append(translator.translate("minutes", new String[] { Integer.toString(((Number)cellValue).intValue()) }));
 		}
 	}
 }
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties
index c13653cf8b4cc4abe4b85a676e8a959b8639c748..7c4725999d29ff7c52649a86db9921dc495f403a 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties
@@ -27,6 +27,7 @@ error.end.past=Meeting kann nicht in Vergangenheit geplant werden.
 error.prefix=Ein Fehler ist aufgetreten\:
 error.server.raw={1} <small>Schl\u00FCssel\: {0}</small>
 error.start.after.end=Das Datum f\u00FCr das Ende des Meetings darf nicht vor dem Beginn Datum sein.
+error.too.long.time=Zeit ist zu lang. Es ist auf {0} Minuten limitiert.
 guest.policy.always.accept=Always accept
 guest.policy.always.deny=Always deny
 guest.policy.ask.moderator=Ask moderator
@@ -65,6 +66,10 @@ recordings=Aufzeichnungen
 recording.browser.infos=Aufzeichnungen k\u00F6nnen nur mit Google Chrome und Firefox gesehen werden.
 recording.type.podcast=Podcast
 recording.type.presentation=Vorstellung
+role.administrator=Administrator
+role.author=Autor
+role.coach=Coach
+role.owner=Course owner
 server.overloaded=Es gibt kein Platz verf\u00FCgbar auf dem Server an den gew\u00E4hlten Datum.
 table.header.enabled=Eingeschaltet
 table.header.permanent=Dauernd
@@ -103,6 +108,7 @@ template.max.concurrent.meetings=Max. gleichzeitige Meetings
 template.muteOnStart=Mute on start
 template.name=Name
 template.record=Aufzeichnen
+template.roles=Erlaubt Vorlage zu verwenden
 template.webcamsOnlyForModerator=Webcams only for moderators
 templates.title=Vorlagen
 view=Ansehen
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 5567d1df68a301d754b308d94a1532e545a0096e..1728d68cdd79057f28dfe37fc32a6f5dc1206210 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
@@ -27,6 +27,7 @@ error.end.past=Meeting cannot be planned in the past.
 error.prefix=An error happened\:
 error.server.raw={1} <small>Key {0}</small>
 error.start.after.end=The end date of the meeting must not be before the start date.
+error.too.long.time=Time is too long. It is limited to {0} minutes.
 guest.policy.always.accept=Always accept
 guest.policy.always.deny=Always deny
 guest.policy.ask.moderator=Ask moderator
@@ -65,6 +66,10 @@ recordings=Recordings
 recording.browser.infos=Recordings can only be viewed with Google Chrome or Firefox.
 recording.type.podcast=Podcast
 recording.type.presentation=Presentation
+role.administrator=Administrator
+role.author=Author
+role.coach=coach
+role.owner=Kursbesitzer
 server.overloaded=There is no place available on the server for the choosen dates.
 table.header.enabled=Enabled
 table.header.permanent=Permanent
@@ -103,6 +108,7 @@ template.max.concurrent.meetings=Max. concurrent meetings
 template.muteOnStart=Mute on start
 template.name=Name
 template.record=Record
+template.roles=Allow to use the template
 template.webcamsOnlyForModerator=Webcams only for moderators
 templates.title=Templates
 view=View
diff --git a/src/test/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingDAOTest.java b/src/test/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingDAOTest.java
index bc6596e92437b86ca411ea628a2af8e58e6f4e18..12e6947fd801ec0f78a97f851547cd852a016ac9 100644
--- a/src/test/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingDAOTest.java
+++ b/src/test/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingDAOTest.java
@@ -164,14 +164,20 @@ public class BigBlueButtonMeetingDAOTest extends OlatTestCase {
 		List<Long> concurrent = bigBlueButtonMeetingDao.getConcurrentMeetings(template, date(1, 15), date(1, 19));
 		Assert.assertEquals(2, concurrent.size());
 		
-		List<Long>  concurrentFollowup = bigBlueButtonMeetingDao.getConcurrentMeetings(template, date(1, 20), date(1, 21));
-		Assert.assertEquals(1, concurrentFollowup.size());
+		List<Long> concurrentFollowup = bigBlueButtonMeetingDao.getConcurrentMeetings(template, date(1, 17), date(1, 21));
+		Assert.assertEquals(2, concurrentFollowup.size());
 		
-		List<Long>  concurrentWidePeriod = bigBlueButtonMeetingDao.getConcurrentMeetings(template, date(0, 10), date(3, 21));
+		List<Long> concurrentWidePeriod = bigBlueButtonMeetingDao.getConcurrentMeetings(template, date(0, 10), date(3, 21));
 		Assert.assertEquals(4, concurrentWidePeriod.size());
 		
-		List<Long>  concurrentWithin = bigBlueButtonMeetingDao.getConcurrentMeetings(template, date(2, 13), date(2, 14));
+		List<Long> concurrentWithin = bigBlueButtonMeetingDao.getConcurrentMeetings(template, date(2, 13), date(2, 14));
 		Assert.assertEquals(1, concurrentWithin.size());
+		
+		List<Long> concurrentOverlapAfter = bigBlueButtonMeetingDao.getConcurrentMeetings(template, date(1, 19), date(1, 21));
+		Assert.assertTrue(concurrentOverlapAfter.isEmpty());
+		
+		List<Long> concurrentOverlapBefore = bigBlueButtonMeetingDao.getConcurrentMeetings(template, date(1, 7), date(1, 10));
+		Assert.assertTrue(concurrentOverlapBefore.isEmpty());
 	}
 	
 	private BigBlueButtonMeeting createMeeting(String name, Date start, int leadTime, Date end, int followupTime,