From 4d7999ac8ba90c90e263800aaeb364e938590ff2 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Thu, 6 Aug 2020 18:44:47 +0200
Subject: [PATCH] OO-4820: add creator and presenter to BigBlueButton meeting
 and metadata

---
 .../bigbluebutton/BigBlueButtonManager.java   |  4 +-
 .../bigbluebutton/BigBlueButtonMeeting.java   |  7 ++++
 .../manager/BigBlueButtonManagerImpl.java     |  5 ++-
 .../manager/BigBlueButtonMeetingDAO.java      |  9 ++++-
 .../BigBlueButtonNativeRecordingsHandler.java | 35 +++++++++++++---
 ...igBlueButtonOpenCastRecordingsHandler.java | 40 ++++++++++++++-----
 .../model/BigBlueButtonMeetingImpl.java       | 30 +++++++++++++-
 .../BigBlueButtonEditMeetingsController.java  | 10 ++++-
 .../ui/BigBlueButtonMeetingController.java    |  4 ++
 .../EditBigBlueButtonMeetingController.java   | 24 +++++++++--
 .../bigbluebutton/ui/_content/meeting.html    |  9 +++--
 .../ui/_i18n/LocalStrings_de.properties       |  2 +
 .../ui/_i18n/LocalStrings_en.properties       |  2 +
 .../ui/_i18n/LocalStrings_fr.properties       |  1 +
 ...gButtonMeetingConfigurationController.java |  5 +++
 .../recurring/RecurringMeetingsContext.java   |  9 +++++
 .../database/mysql/alter_15_1_x_to_15_2_0.sql |  4 ++
 .../database/mysql/setupDatabase.sql          |  7 +++-
 .../oracle/alter_15_1_x_to_15_2_0.sql         |  6 +++
 .../postgresql/alter_15_1_x_to_15_2_0.sql     |  6 +++
 .../database/postgresql/setupDatabase.sql     |  4 ++
 .../manager/BigBlueButtonAttendeeDAOTest.java | 10 ++---
 .../manager/BigBlueButtonMeetingDAOTest.java  | 40 ++++++++++++-------
 .../BigBlueButtonMeetingTemplateDAOTest.java  |  2 +-
 24 files changed, 224 insertions(+), 51 deletions(-)

diff --git a/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonManager.java b/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonManager.java
index 70b27046daf..5a5382ebc37 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonManager.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonManager.java
@@ -74,9 +74,11 @@ public interface BigBlueButtonManager {
 	 * @param entry The repository entry (optional but this or group)
 	 * @param subIdent The sub-identifier (optional)
 	 * @param businessGroup The business group (optional but this or entry)
+	 * @param creator Who creates the meeting
 	 * @return A meeting with some default values
 	 */
-	public BigBlueButtonMeeting createAndPersistMeeting(String name, RepositoryEntry entry, String subIdent, BusinessGroup businessGroup);
+	public BigBlueButtonMeeting createAndPersistMeeting(String name, RepositoryEntry entry, String subIdent,
+			BusinessGroup businessGroup, Identity creator);
 	
 	/**
 	 * Is there a server available.
diff --git a/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonMeeting.java b/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonMeeting.java
index ecb9e3fa256..360567af3ff 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonMeeting.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonMeeting.java
@@ -22,6 +22,7 @@ package org.olat.modules.bigbluebutton;
 import java.util.Date;
 
 import org.olat.core.id.CreateInfo;
+import org.olat.core.id.Identity;
 import org.olat.core.id.ModifiedInfo;
 import org.olat.group.BusinessGroup;
 import org.olat.repository.RepositoryEntry;
@@ -92,6 +93,12 @@ public interface BigBlueButtonMeeting extends ModifiedInfo, CreateInfo {
 
 	public Date getEndWithFollowupTime();
 	
+	public String getMainPresenter();
+	
+	public void setMainPresenter(String name);
+	
+	public Identity getCreator();
+	
 	public BigBlueButtonMeetingTemplate getTemplate();
 
 	public void setTemplate(BigBlueButtonMeetingTemplate template);
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 ce3d5bcf31b..e597cd4715b 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java
@@ -334,8 +334,9 @@ public class BigBlueButtonManagerImpl implements BigBlueButtonManager,
 	}
 
 	@Override
-	public BigBlueButtonMeeting createAndPersistMeeting(String name, RepositoryEntry entry, String subIdent, BusinessGroup businessGroup) {
-		return bigBlueButtonMeetingDao.createAndPersistMeeting(name, entry, subIdent, businessGroup);
+	public BigBlueButtonMeeting createAndPersistMeeting(String name, RepositoryEntry entry, String subIdent,
+			BusinessGroup businessGroup, Identity creator) {
+		return bigBlueButtonMeetingDao.createAndPersistMeeting(name, entry, subIdent, businessGroup, creator);
 	}
 	
 	@Override
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 8f3d37fe97c..7b4c400f25d 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingDAO.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingDAO.java
@@ -30,6 +30,7 @@ import javax.persistence.TypedQuery;
 
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.commons.persistence.QueryBuilder;
+import org.olat.core.id.Identity;
 import org.olat.core.util.StringHelper;
 import org.olat.group.BusinessGroup;
 import org.olat.modules.bigbluebutton.BigBlueButtonMeeting;
@@ -55,7 +56,7 @@ public class BigBlueButtonMeetingDAO {
 	private DB dbInstance;
 	
 	public BigBlueButtonMeeting createAndPersistMeeting(String name,
-			RepositoryEntry entry, String subIdent, BusinessGroup businessGroup) {
+			RepositoryEntry entry, String subIdent, BusinessGroup businessGroup, Identity creator) {
 		BigBlueButtonMeetingImpl meeting = new BigBlueButtonMeetingImpl();
 		meeting.setCreationDate(new Date());
 		meeting.setLastModified(meeting.getCreationDate());
@@ -72,6 +73,8 @@ public class BigBlueButtonMeetingDAO {
 		meeting.setSubIdent(subIdent);
 		meeting.setBusinessGroup(businessGroup);
 		
+		meeting.setCreator(creator);
+		
 		dbInstance.getCurrentEntityManager().persist(meeting);
 		return meeting;
 	}
@@ -83,6 +86,8 @@ public class BigBlueButtonMeetingDAO {
 		  .append(" left join fetch meeting.businessGroup as businessGroup")
 		  .append(" left join fetch meeting.template as template")
 		  .append(" left join fetch meeting.server as server")
+		  .append(" left join fetch meeting.creator as creator")
+		  .append(" left join fetch creator.user as creatorUser")
 		  .append(" where meeting.key=:meetingKey");
 		
 		List<BigBlueButtonMeeting> meetings = dbInstance.getCurrentEntityManager()
@@ -99,6 +104,8 @@ public class BigBlueButtonMeetingDAO {
 		  .append(" left join fetch meeting.businessGroup as businessGroup")
 		  .append(" left join fetch meeting.template as template")
 		  .append(" left join fetch meeting.server as server")
+		  .append(" left join fetch meeting.creator as creator")
+		  .append(" left join fetch creator.user as creatorUser")
 		  .append(" where meeting.identifier=:identifier or meeting.readableIdentifier=:identifier");
 		
 		List<BigBlueButtonMeeting> meetings = dbInstance.getCurrentEntityManager()
diff --git a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonNativeRecordingsHandler.java b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonNativeRecordingsHandler.java
index e76b62eebeb..c818c0dd9aa 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonNativeRecordingsHandler.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonNativeRecordingsHandler.java
@@ -27,6 +27,7 @@ import java.util.Locale;
 
 import org.apache.logging.log4j.Logger;
 import org.olat.core.gui.translator.Translator;
+import org.olat.core.id.User;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.Formatter;
 import org.olat.core.util.StringHelper;
@@ -108,9 +109,11 @@ public class BigBlueButtonNativeRecordingsHandler implements BigBlueButtonRecord
 		uriBuilder.optionalParameter("meta_dc-title", meeting.getName());
 		// Media package and event identifier
 		uriBuilder.optionalParameter("meta_dc-identifier", meeting.getMeetingId());
-		
-		//TODO OO-4820
-		uriBuilder.optionalParameter("meta_dc-creator", "creator");
+
+		String creator = getCreator(meeting);
+		if(StringHelper.containsNonWhitespace(creator)) {
+			uriBuilder.optionalParameter("meta_dc-creator", creator);
+		}
 
 		// Series identifier of which the event is part of
 		RepositoryEntry re = meeting.getEntry();
@@ -129,7 +132,7 @@ public class BigBlueButtonNativeRecordingsHandler implements BigBlueButtonRecord
 
 		// The primary language
 		if (re != null && StringHelper.containsNonWhitespace(re.getMainLanguage())) {
-				uriBuilder.optionalParameter("meta_dc-language", re.getMainLanguage().trim());
+			uriBuilder.optionalParameter("meta_dc-language", re.getMainLanguage().trim());
 		}
 
 		// Description of the event
@@ -143,8 +146,28 @@ public class BigBlueButtonNativeRecordingsHandler implements BigBlueButtonRecord
 		uriBuilder.optionalParameter("meta_dc-created", Formatter.formatDatetime(meetingCreation));							
 
 		// Rights holder
-		//TODO OO-4820
-		uriBuilder.optionalParameter("meta_dc-rightsHolder", "Main presenter");
+		if(StringHelper.containsNonWhitespace(meeting.getMainPresenter())) {
+			uriBuilder.optionalParameter("meta_dc-rightsHolder", meeting.getMainPresenter());
+		}
+	}
+	
+	private String getCreator(BigBlueButtonMeeting meeting) {
+		if(meeting.getCreator() == null) return null;
+		
+		User creator = meeting.getCreator().getUser();
+		StringBuilder sb = new StringBuilder();
+		if(StringHelper.containsNonWhitespace(creator.getFirstName())) {
+			sb.append(creator.getFirstName());
+		}
+		if(StringHelper.containsNonWhitespace(creator.getLastName())) {
+			if(sb.length() > 0) sb.append(" ");
+			sb.append(creator.getLastName());
+		}
+		if(StringHelper.containsNonWhitespace(creator.getEmail())) {
+			if(sb.length() > 0) sb.append(" ");
+			sb.append("<").append(creator.getEmail()).append(">");
+		}
+		return sb.toString();
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonOpenCastRecordingsHandler.java b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonOpenCastRecordingsHandler.java
index 957414c3126..a9398c18e5d 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonOpenCastRecordingsHandler.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonOpenCastRecordingsHandler.java
@@ -25,6 +25,8 @@ import java.util.List;
 import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
+import org.olat.core.id.User;
+import org.olat.core.id.UserConstants;
 import org.olat.core.util.Formatter;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
@@ -88,8 +90,21 @@ public class BigBlueButtonOpenCastRecordingsHandler implements BigBlueButtonReco
 		// Media package and event identifier
 		uriBuilder.optionalParameter("meta_dc-identifier", meeting.getMeetingId());
 		
-		//TODO OO-4820
-		uriBuilder.optionalParameter("meta_dc-creator", "creator.firstname lastname");
+		User creator = null;
+		if(meeting.getCreator() != null) {
+			creator = meeting.getCreator().getUser();
+			
+			String creatorFirstLastName = creatorFirstLastName(creator);
+			if(StringHelper.containsNonWhitespace(creatorFirstLastName)) {
+				uriBuilder.optionalParameter("meta_dc-creator", creatorFirstLastName);
+			}
+			
+			String username = creator.getProperty(UserConstants.NICKNAME, null);
+			if(StringHelper.containsNonWhitespace(username)) {
+				uriBuilder.optionalParameter("meta_dc-rightsHolder", username);
+				uriBuilder.optionalParameter("meta_opencast-acl-read-roles", "ROLE_OAUTH_USER ROLE_USER_" + username);
+			}
+		}
 
 		// Series identifier of which the event is part of
 		RepositoryEntry re = meeting.getEntry();
@@ -117,7 +132,7 @@ public class BigBlueButtonOpenCastRecordingsHandler implements BigBlueButtonReco
 		uriBuilder.optionalParameter("meta_dc-isPartOf", context);
 
 		// The primary language
-		if (re != null) {
+		if (re != null && StringHelper.containsNonWhitespace(re.getMainLanguage())) {
 			uriBuilder.optionalParameter("meta_dc-language", re.getMainLanguage().trim());
 		}
 
@@ -126,14 +141,19 @@ public class BigBlueButtonOpenCastRecordingsHandler implements BigBlueButtonReco
 		// Date of the event
 		uriBuilder.optionalParameter("meta_dc-created", Formatter.formatDatetime(meetingCreation));							
 
-		// Rights holder
-		//TODO OO-4820
-		uriBuilder.optionalParameter("meta_dc-rightsHolder", "creator.username");
-		
 		uriBuilder.optionalParameter("meta_opencast-series-dc-title", seriesTitle);
-
-		//TODO OO-4820
-		uriBuilder.optionalParameter("meta_opencast-acl-read-roles", "ROLE_OAUTH_USER ROLE_USER_{upperCase(creator.username)}");
+	}
+	
+	private String creatorFirstLastName(User creator) {
+		StringBuilder sb = new StringBuilder();
+		if(StringHelper.containsNonWhitespace(creator.getFirstName())) {
+			sb.append(creator.getFirstName());
+		}
+		if(StringHelper.containsNonWhitespace(creator.getLastName())) {
+			if(sb.length() > 0) sb.append(" ");
+			sb.append(creator.getLastName());
+		}
+		return sb.toString();
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/modules/bigbluebutton/model/BigBlueButtonMeetingImpl.java b/src/main/java/org/olat/modules/bigbluebutton/model/BigBlueButtonMeetingImpl.java
index 327ce6b8c6b..bf2211ba58c 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/model/BigBlueButtonMeetingImpl.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/model/BigBlueButtonMeetingImpl.java
@@ -33,6 +33,8 @@ import javax.persistence.Table;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 
+import org.olat.basesecurity.IdentityImpl;
+import org.olat.core.id.Identity;
 import org.olat.core.id.Persistable;
 import org.olat.group.BusinessGroup;
 import org.olat.group.BusinessGroupImpl;
@@ -108,13 +110,20 @@ public class BigBlueButtonMeetingImpl implements Persistable, BigBlueButtonMeeti
 	private String attendeePassword;
 	@Column(name="b_moderator_pw", nullable=false, insertable=true, updatable=false)
 	private String moderatorPassword;
+
+	@Column(name="b_main_presenter", nullable=true, insertable=true, updatable=true)
+	private String mainPresenter;
+	
+	@ManyToOne(targetEntity=IdentityImpl.class, fetch=FetchType.LAZY, optional=true)
+	@JoinColumn(name="fk_creator_id", nullable=true, insertable=true, updatable=false)
+	private Identity creator;
 	
 	@ManyToOne(targetEntity=RepositoryEntry.class, fetch=FetchType.LAZY, optional=true)
 	@JoinColumn(name="fk_entry_id", nullable=true, insertable=true, updatable=false)
 	private RepositoryEntry entry;
 	@Column(name="a_sub_ident", nullable=true, insertable=true, updatable=false)
 	private String subIdent;
-	
+
 	@ManyToOne(targetEntity=BusinessGroupImpl.class, fetch=FetchType.LAZY, optional=true)
 	@JoinColumn(name="fk_group_id", nullable=true, insertable=true, updatable=false)
 	private BusinessGroup businessGroup;
@@ -333,6 +342,25 @@ public class BigBlueButtonMeetingImpl implements Persistable, BigBlueButtonMeeti
 		this.endWithFollowupTime = endWithFollowupTime;
 	}
 
+	@Override
+	public String getMainPresenter() {
+		return mainPresenter;
+	}
+
+	@Override
+	public void setMainPresenter(String mainPresenter) {
+		this.mainPresenter = mainPresenter;
+	}
+
+	@Override
+	public Identity getCreator() {
+		return creator;
+	}
+
+	public void setCreator(Identity creator) {
+		this.creator = creator;
+	}
+
 	@Override
 	public RepositoryEntry getEntry() {
 		return entry;
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 19df7d74470..f6c5f96cba6 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonEditMeetingsController.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonEditMeetingsController.java
@@ -65,6 +65,7 @@ import org.olat.modules.bigbluebutton.ui.recurring.RecurringMeetingsContext;
 import org.olat.modules.bigbluebutton.ui.recurring.RecurringMeetingsContext.RecurringMode;
 import org.olat.modules.gotomeeting.ui.GoToMeetingTableModel.MeetingsCols;
 import org.olat.repository.RepositoryEntry;
+import org.olat.user.UserManager;
 import org.springframework.beans.factory.annotation.Autowired;
 
 /**
@@ -95,6 +96,8 @@ public class BigBlueButtonEditMeetingsController extends FormBasicController {
 	private final RepositoryEntry entry;
 	private final BusinessGroup businessGroup;
 
+	@Autowired
+	private UserManager userManager;
 	@Autowired
 	private BigBlueButtonModule bigBlueButtonModule;
 	@Autowired
@@ -306,6 +309,8 @@ public class BigBlueButtonEditMeetingsController extends FormBasicController {
 				.calculatePermissions(entry, businessGroup, getIdentity(), ureq.getUserSession().getRoles());
 		final RecurringMeetingsContext context = new RecurringMeetingsContext(entry, subIdent, businessGroup,
 				permissions, RecurringMode.daily);
+		context.setMainPresenter(userManager.getUserDisplayName(getIdentity()));
+		
 		RecurringMeeting1Step step = new RecurringMeeting1Step(ureq, context);
 		StepRunnerCallback finishCallback = (uureq, swControl, runContext) -> {
 			addRecurringMeetings(context);
@@ -324,6 +329,8 @@ public class BigBlueButtonEditMeetingsController extends FormBasicController {
 				.calculatePermissions(entry, businessGroup, getIdentity(), ureq.getUserSession().getRoles());
 		final RecurringMeetingsContext context = new RecurringMeetingsContext(entry, subIdent, businessGroup,
 				permissions, RecurringMode.weekly);
+		context.setMainPresenter(userManager.getUserDisplayName(getIdentity()));
+
 		RecurringMeeting1Step step = new RecurringMeeting1Step(ureq, context);
 		StepRunnerCallback finishCallback = (uureq, swControl, runContext) -> {
 			addRecurringMeetings(context);
@@ -342,9 +349,10 @@ public class BigBlueButtonEditMeetingsController extends FormBasicController {
 			}
 			
 			BigBlueButtonMeeting bMeeting = bigBlueButtonManager.createAndPersistMeeting(context.getName(),
-					context.getEntry(), context.getSubIdent(), context.getBusinessGroup());
+					context.getEntry(), context.getSubIdent(), context.getBusinessGroup(), getIdentity());
 			bMeeting.setDescription(context.getDescription());
 			bMeeting.setWelcome(context.getWelcome());
+			bMeeting.setMainPresenter(context.getMainPresenter());
 			bMeeting.setPermanent(false);
 			bMeeting.setTemplate(context.getTemplate());
 			bMeeting.setStartDate(meeting.getStartDate());
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonMeetingController.java b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonMeetingController.java
index 26228d3d1c4..7e377e63817 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonMeetingController.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonMeetingController.java
@@ -146,6 +146,10 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen
 				String url = BigBlueButtonDispatcher.getMeetingUrl(meeting.getReadableIdentifier());
 				layoutCont.contextPut("externalUrl", url);
 			}
+			
+			if(StringHelper.containsNonWhitespace(meeting.getMainPresenter())) {
+				layoutCont.contextPut("mainPresenter", meeting.getMainPresenter());
+			}
 		}
 		
 		joinButton = LinkFactory.createButtonLarge("meeting.join.button", flc.getFormItemComponent(), this);
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 b11a2165270..070c15e0b0d 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonMeetingController.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonMeetingController.java
@@ -40,6 +40,7 @@ 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.id.Identity;
 import org.olat.core.util.CodeHelper;
 import org.olat.core.util.StringHelper;
 import org.olat.group.BusinessGroup;
@@ -51,6 +52,7 @@ import org.olat.modules.bigbluebutton.BigBlueButtonMeetingTemplate;
 import org.olat.modules.bigbluebutton.BigBlueButtonModule;
 import org.olat.modules.bigbluebutton.BigBlueButtonTemplatePermissions;
 import org.olat.repository.RepositoryEntry;
+import org.olat.user.UserManager;
 import org.springframework.beans.factory.annotation.Autowired;
 
 /**
@@ -66,6 +68,7 @@ public class EditBigBlueButtonMeetingController extends FormBasicController {
 	private FormLink openCalLink;
 	private TextElement nameEl;
 	private TextElement descriptionEl;
+	private TextElement mainPresenterEl;
 	private TextElement welcomeEl;
 	private TextElement leadTimeEl;
 	private TextElement followupTimeEl;
@@ -89,6 +92,8 @@ public class EditBigBlueButtonMeetingController extends FormBasicController {
 	private BigBlueButtonMeetingsCalendarController calCtr;
 	private CloseableModalController cmc;
 	
+	@Autowired
+	private UserManager userManager;
 	@Autowired
 	private BigBlueButtonModule bigBlueButtonModule;
 	@Autowired
@@ -144,6 +149,12 @@ public class EditBigBlueButtonMeetingController extends FormBasicController {
 			nameEl.setFocus(true);
 		}
 		
+		Identity creator = meeting == null ? getIdentity() : meeting.getCreator();
+		if(creator != null) {
+			String creatorFullName = userManager.getUserDisplayName(creator);
+			uifactory.addStaticTextElement("meeting.creator", creatorFullName, formLayout);
+		}
+		
 		String description = meeting == null ? "" : meeting.getDescription();
 		descriptionEl = uifactory.addTextAreaElement("meeting.description", "meeting.description", 2000, 4, 72, false, false, description, formLayout);
 		descriptionEl.setEnabled(editable);
@@ -152,6 +163,11 @@ public class EditBigBlueButtonMeetingController extends FormBasicController {
 		welcomeEl = uifactory.addRichTextElementForStringDataMinimalistic("meeting.welcome", "meeting.welcome", welcome, 8, 60, formLayout, getWindowControl());
 		welcomeEl.setEnabled(editable);
 		
+		String presenter = meeting == null ? userManager.getUserDisplayName(getIdentity()) : meeting.getMainPresenter();
+		mainPresenterEl = uifactory.addTextElement("meeting.main.presenter", "meeting.main.presenter", 128, presenter, formLayout);
+		mainPresenterEl.setElementCssClass("o_sel_bbb_edit_meeting_presenter");
+		mainPresenterEl.setEnabled(editable);
+		
 		Long selectedTemplateKey = meeting == null || meeting.getTemplate() == null
 				? null : meeting.getTemplate().getKey();
 		KeyValues templatesKeyValues = new KeyValues();
@@ -206,6 +222,7 @@ public class EditBigBlueButtonMeetingController extends FormBasicController {
 		guestEl = uifactory.addCheckboxesHorizontal("meeting.guest", formLayout, onKeys, guestValues);
 		guestEl.setVisible(entry != null && entry.isGuests());
 		guestEl.select(onKeys[0], meeting != null && meeting.isGuest());
+		guestEl.setEnabled(editable);
 		
 		String externalLink = meeting == null ? CodeHelper.getForeverUniqueID() + "" : meeting.getReadableIdentifier();
 		externalLinkEl = uifactory.addTextElement("meeting.external.users", 64, externalLink, formLayout);
@@ -546,7 +563,8 @@ public class EditBigBlueButtonMeetingController extends FormBasicController {
 	@Override
 	protected void formOK(UserRequest ureq) {
 		if(meeting == null) {
-			meeting = bigBlueButtonManager.createAndPersistMeeting(nameEl.getValue(), entry, subIdent, businessGroup);
+			meeting = bigBlueButtonManager
+					.createAndPersistMeeting(nameEl.getValue(), entry, subIdent, businessGroup, getIdentity());
 		} else {
 			meeting = bigBlueButtonManager.getMeeting(meeting);
 			meeting.setName(nameEl.getValue());
@@ -554,6 +572,7 @@ public class EditBigBlueButtonMeetingController extends FormBasicController {
 		
 		meeting.setDescription(descriptionEl.getValue());
 		meeting.setWelcome(welcomeEl.getValue());
+		meeting.setMainPresenter(mainPresenterEl.getValue());
 		BigBlueButtonMeetingTemplate template = getSelectedTemplate();
 		meeting.setTemplate(template);
 		
@@ -591,7 +610,7 @@ public class EditBigBlueButtonMeetingController extends FormBasicController {
 			meeting.setMeetingLayout(BigBlueButtonMeetingLayoutEnum.standard);
 		}
 		
-		bigBlueButtonManager.updateMeeting(meeting);
+		meeting = bigBlueButtonManager.updateMeeting(meeting);
 
 		fireEvent(ureq, Event.DONE_EVENT);
 	}
@@ -602,7 +621,6 @@ public class EditBigBlueButtonMeetingController extends FormBasicController {
 	}
 	
 	public enum Mode {
-		
 		permanent,
 		dates
 	}
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/_content/meeting.html b/src/main/java/org/olat/modules/bigbluebutton/ui/_content/meeting.html
index 6fd809d69e8..107c91c3edf 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/_content/meeting.html
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/_content/meeting.html
@@ -1,14 +1,18 @@
 <div class="o_sel_bbb_meeting">
 <h3>$r.escapeHtml($title)</h3>
-#if($errorMessage && !${errorMessage.isEmpty()})
+#if($r.isNotEmpty($errorMessage))
 	<div class="o_error">$errorMessage</div>
 #end
 #if($r.isNotNull($start) || $r.isNotNull($end))
 <div><i class="o_icon o_icon_lifecycle_date"> </i> #if($r.isNotNull($start))$start#end - #if($r.isNotNull($end))$end#end</div>
 #end
-#if($description && !${description.isEmpty()})
+#if($r.isNotEmpty($mainPresenter))
+<div><i class="o_icon o_icon_user"> </i> $r.escapeHtml($mainPresenter)</div>
+#end
+#if($r.isNotEmpty($description))
 	<div class="o_block_large o_info">$r.xssScan($description)</div>
 #end
+
 #if($r.isNotEmpty($externalUrl) && $r.isFalse($ended))
 <div class="o_block_large">
 	<label forid="externalusersmeetingurl">$r.translate("meeting.url.external.users")</label>
@@ -55,4 +59,3 @@
 </div>
 #end
 </div>
-
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 6718607a444..7700f434889 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
@@ -62,6 +62,7 @@ filter.this.instance=Dieses OpenOlat
 layout.standard=Standard
 layout.webcam=Webcam Termin
 meeting.create.intro=Der Online-Termin wurde vom Betreuer noch nicht er\u00F6ffnet. Teilnehmer k\u00F6nnen den Raum noch nicht betreten.
+meeting.creator=Erstellt durch
 meeting.day=Datum des Meetings
 meeting.deleted=Das Meeting wurde erfolgreich gel\u00F6scht.
 meeting.description=Beschreibung
@@ -81,6 +82,7 @@ meeting.join.button=Meeting beitreten
 meeting.layout=Darstellung
 meeting.leadTime=Vorlaufzeit (Min.)
 meeting.leadTime.explain=Die Vorlaufzeit ist nur f\u00FCr Moderatoren relevant.
+meeting.main.presenter=Main presenter
 meeting.name=Name
 meeting.permanent=Online-Termin planung
 meeting.permanent.on=Ohne Datum
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 24b71f1eadc..293c8ae4c21 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
@@ -62,6 +62,7 @@ filter.this.instance=This OpenOlat
 layout.standard=Standard
 layout.webcam=Webcam meeting
 meeting.create.intro=The meeting has not yet been started by the coach. Participants are not able to enter the classroom.
+meeting.creator=Creator
 meeting.day=Date of the meeting
 meeting.deleted=The meeting was successfully deleted.
 meeting.description=Description
@@ -81,6 +82,7 @@ meeting.join.button=Join the online-meeting
 meeting.layout=Layout
 meeting.leadTime=Prep time (min.)
 meeting.leadTime.explain=Prep time is only relevant for moderators.
+meeting.main.presenter=Hauptmoderator
 meeting.name=Name
 meeting.permanent=Online-Meeting scheduling
 meeting.permanent.on=Without date
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_fr.properties
index 4deb217f69f..ef7b7ce61cb 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_fr.properties
@@ -61,6 +61,7 @@ filter.this.instance=Cet OpenOlat
 layout.standard=Standard
 layout.webcam=Meeting webcam
 meeting.create.intro=Le meeting n'est pas encore disponible. Les participants \u00E0 cette classe ne peuvent pas encore y acc\u00E9der.
+meeting.creator==Cr\u00e9ateur
 meeting.day=Date du meeting
 meeting.deleted=Le meeting a \u00E9t\u00E9 effac\u00E9.
 meeting.description=Description
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/recurring/BigBlugButtonMeetingConfigurationController.java b/src/main/java/org/olat/modules/bigbluebutton/ui/recurring/BigBlugButtonMeetingConfigurationController.java
index 20725034bd2..62c6a78b32a 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/recurring/BigBlugButtonMeetingConfigurationController.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/recurring/BigBlugButtonMeetingConfigurationController.java
@@ -54,6 +54,7 @@ public class BigBlugButtonMeetingConfigurationController extends StepFormBasicCo
 	
 	private TextElement nameEl;
 	private TextElement descriptionEl;
+	private TextElement mainPresenterEl;
 	private TextElement welcomeEl;
 	private TextElement leadTimeEl;
 	private TextElement followupTimeEl;
@@ -95,6 +96,9 @@ public class BigBlugButtonMeetingConfigurationController extends StepFormBasicCo
 		String welcome = meetingsContext.getWelcome();
 		welcomeEl = uifactory.addRichTextElementForStringDataMinimalistic("meeting.welcome", "meeting.welcome", welcome, 8, 60, formLayout, getWindowControl());
 		
+		String mainPresenter = meetingsContext.getMainPresenter();
+		mainPresenterEl = uifactory.addTextElement("meeting.main.presenter", "meeting.main.presenter", 128, mainPresenter, formLayout);
+		
 		Long selectedTemplateKey = meetingsContext.getTemplate() == null ? null : meetingsContext.getTemplate().getKey();
 		KeyValues templatesKeyValues = new KeyValues();
 		for(BigBlueButtonMeetingTemplate template:templates) {
@@ -333,6 +337,7 @@ public class BigBlugButtonMeetingConfigurationController extends StepFormBasicCo
 		meetingsContext.setName(nameEl.getValue());
 		meetingsContext.setDescription(descriptionEl.getValue());
 		meetingsContext.setWelcome(welcomeEl.getValue());
+		meetingsContext.setMainPresenter(mainPresenterEl.getValue());
 		BigBlueButtonMeetingTemplate template = getSelectedTemplate();
 		meetingsContext.setTemplate(template);
 
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/recurring/RecurringMeetingsContext.java b/src/main/java/org/olat/modules/bigbluebutton/ui/recurring/RecurringMeetingsContext.java
index 43250ed9d97..80c88b99144 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/recurring/RecurringMeetingsContext.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/recurring/RecurringMeetingsContext.java
@@ -41,6 +41,7 @@ public class RecurringMeetingsContext {
 	private String name;
 	private String description;
 	private String welcome;
+	private String mainPresenter;
 	private Date startTime;
 	private Date endTime;
 	private long leadTime;
@@ -110,6 +111,14 @@ public class RecurringMeetingsContext {
 		this.welcome = welcome;
 	}
 
+	public String getMainPresenter() {
+		return mainPresenter;
+	}
+
+	public void setMainPresenter(String mainPresenter) {
+		this.mainPresenter = mainPresenter;
+	}
+
 	public Date getStartTime() {
 		return startTime;
 	}
diff --git a/src/main/resources/database/mysql/alter_15_1_x_to_15_2_0.sql b/src/main/resources/database/mysql/alter_15_1_x_to_15_2_0.sql
index 7542ec9305a..8acb8c28e7b 100644
--- a/src/main/resources/database/mysql/alter_15_1_x_to_15_2_0.sql
+++ b/src/main/resources/database/mysql/alter_15_1_x_to_15_2_0.sql
@@ -19,3 +19,7 @@ alter table o_bbb_attendee ENGINE = InnoDB;
 alter table o_bbb_attendee add constraint bbb_attend_ident_idx foreign key (fk_identity_id) references o_bs_identity (id);
 alter table o_bbb_attendee add constraint bbb_attend_meet_idx foreign key (fk_meeting_id) references o_bbb_meeting (id);
 
+alter table o_bbb_meeting add column b_main_presenter varchar(255);
+alter table o_bbb_meeting add column fk_creator_id bigint;
+alter table o_bbb_meeting add constraint bbb_meet_creator_idx foreign key (fk_creator_id) references o_bs_identity (id);
+
diff --git a/src/main/resources/database/mysql/setupDatabase.sql b/src/main/resources/database/mysql/setupDatabase.sql
index d0d6a916ffc..3926681e51a 100644
--- a/src/main/resources/database/mysql/setupDatabase.sql
+++ b/src/main/resources/database/mysql/setupDatabase.sql
@@ -345,8 +345,8 @@ create table if not exists o_user (
    u_officemobilephone varchar(255),
    u_department varchar(255),
    u_privateemail varchar(255),
-   u_employeenumber varchar(255),
-   u_organizationalunit varchar(255),
+   u_employeenumber text(255),
+   u_organizationalunit text(255),
 
    u_edupersonaffiliation text(255),
    u_swissedupersonstaffcategory text(255),
@@ -1219,6 +1219,8 @@ create table o_bbb_meeting (
    b_end_date datetime default null,
    b_followuptime bigint default 0 not null,
    b_end_with_followuptime datetime,
+   b_main_presenter varchar(255),
+   fk_creator_id bigint default null,
    fk_entry_id bigint default null,
    a_sub_ident varchar(64) default null,
    fk_group_id bigint default null,
@@ -3746,6 +3748,7 @@ alter table o_aconnect_user add constraint aconn_ident_idx foreign key (fk_ident
 alter table o_bbb_meeting add constraint bbb_meet_entry_idx foreign key (fk_entry_id) references o_repositoryentry (repositoryentry_id);
 alter table o_bbb_meeting add constraint bbb_meet_grp_idx foreign key (fk_group_id) references o_gp_business (group_id);
 alter table o_bbb_meeting add constraint bbb_meet_template_idx foreign key (fk_template_id) references o_bbb_template (id);
+alter table o_bbb_meeting add constraint bbb_meet_creator_idx foreign key (fk_creator_id) references o_bs_identity (id);
 
 alter table o_bbb_meeting add constraint bbb_meet_serv_idx foreign key (fk_server_id) references o_bbb_server (id);
 
diff --git a/src/main/resources/database/oracle/alter_15_1_x_to_15_2_0.sql b/src/main/resources/database/oracle/alter_15_1_x_to_15_2_0.sql
index b6c8539c07a..eb4513519be 100644
--- a/src/main/resources/database/oracle/alter_15_1_x_to_15_2_0.sql
+++ b/src/main/resources/database/oracle/alter_15_1_x_to_15_2_0.sql
@@ -18,3 +18,9 @@ alter table o_bbb_attendee add constraint bbb_attend_ident_idx foreign key (fk_i
 create index idx_bbb_attend_ident_idx on o_bbb_attendee(fk_identity_id);
 alter table o_bbb_attendee add constraint bbb_attend_meet_idx foreign key (fk_meeting_id) references o_bbb_meeting (id);
 create index idx_bbb_attend_meet_idx on o_bbb_attendee(fk_meeting_id);
+
+
+alter table o_bbb_meeting add b_main_presenter varchar2(255);
+alter table o_bbb_meeting add fk_creator_id number(20);
+alter table o_bbb_meeting add constraint bbb_meet_creator_idx foreign key (fk_creator_id) references o_bs_identity (id);
+create index idx_bbb_meet_creator_idx on o_bbb_meeting(fk_creator_id);
diff --git a/src/main/resources/database/postgresql/alter_15_1_x_to_15_2_0.sql b/src/main/resources/database/postgresql/alter_15_1_x_to_15_2_0.sql
index 479b4253d44..0b0d9a4f266 100644
--- a/src/main/resources/database/postgresql/alter_15_1_x_to_15_2_0.sql
+++ b/src/main/resources/database/postgresql/alter_15_1_x_to_15_2_0.sql
@@ -19,3 +19,9 @@ create index idx_bbb_attend_ident_idx on o_bbb_attendee(fk_identity_id);
 alter table o_bbb_attendee add constraint bbb_attend_meet_idx foreign key (fk_meeting_id) references o_bbb_meeting (id);
 create index idx_bbb_attend_meet_idx on o_bbb_attendee(fk_meeting_id);
 
+
+alter table o_bbb_meeting add column b_main_presenter varchar(255);
+alter table o_bbb_meeting add column fk_creator_id int8;
+alter table o_bbb_meeting add constraint bbb_meet_creator_idx foreign key (fk_creator_id) references o_bs_identity (id);
+create index idx_bbb_meet_creator_idx on o_bbb_meeting(fk_creator_id);
+
diff --git a/src/main/resources/database/postgresql/setupDatabase.sql b/src/main/resources/database/postgresql/setupDatabase.sql
index 9cbff2da4cd..8441cff58ba 100644
--- a/src/main/resources/database/postgresql/setupDatabase.sql
+++ b/src/main/resources/database/postgresql/setupDatabase.sql
@@ -1241,6 +1241,8 @@ create table o_bbb_meeting (
    b_end_date timestamp default null,
    b_followuptime bigint default 0 not null,
    b_end_with_followuptime timestamp,
+   b_main_presenter varchar(255),
+   fk_creator_id int8,
    fk_entry_id int8 default null,
    a_sub_ident varchar(64) default null,
    fk_group_id int8 default null,
@@ -3662,6 +3664,8 @@ alter table o_bbb_meeting add constraint bbb_meet_template_idx foreign key (fk_t
 create index idx_bbb_meet_template_idx on o_bbb_meeting(fk_template_id);
 alter table o_bbb_meeting add constraint bbb_meet_serv_idx foreign key (fk_server_id) references o_bbb_server (id);
 create index idx_bbb_meet_serv_idx on o_bbb_meeting(fk_server_id);
+alter table o_bbb_meeting add constraint bbb_meet_creator_idx foreign key (fk_creator_id) references o_bs_identity (id);
+create index idx_bbb_meet_creator_idx on o_bbb_meeting(fk_creator_id);
 
 alter table o_bbb_attendee add constraint bbb_attend_ident_idx foreign key (fk_identity_id) references o_bs_identity (id);
 create index idx_bbb_attend_ident_idx on o_bbb_attendee(fk_identity_id);
diff --git a/src/test/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonAttendeeDAOTest.java b/src/test/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonAttendeeDAOTest.java
index 8ba09e3dbbb..a5cb297495e 100644
--- a/src/test/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonAttendeeDAOTest.java
+++ b/src/test/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonAttendeeDAOTest.java
@@ -56,7 +56,7 @@ public class BigBlueButtonAttendeeDAOTest extends OlatTestCase {
 	public void createAttendee() {
 		Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("bbb-attendee-1");
 		BusinessGroup group = businessGroupDao.createAndPersist(null, "BBB Attendees 1", "bbb-desc", -1, -1, false, false, false, false, false);
-		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting("Attend - 1", null, null, group);
+		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting("Attend - 1", null, null, group, id);
 		dbInstance.commit();
 		
 		BigBlueButtonAttendee attendee = bigBlueButtonAttendeeDao
@@ -75,7 +75,7 @@ public class BigBlueButtonAttendeeDAOTest extends OlatTestCase {
 	@Test
 	public void createAttendee_guest() {
 		BusinessGroup group = businessGroupDao.createAndPersist(null, "BBB Attendees 1", "bbb-desc", -1, -1, false, false, false, false, false);
-		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting("Attend - 1", null, null, group);
+		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting("Attend - 1", null, null, group, null);
 		dbInstance.commit();
 		
 		BigBlueButtonAttendee attendee = bigBlueButtonAttendeeDao
@@ -96,7 +96,7 @@ public class BigBlueButtonAttendeeDAOTest extends OlatTestCase {
 		Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("bbb-attendee-2");
 		Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("bbb-attendee-3");
 		BusinessGroup group = businessGroupDao.createAndPersist(null, "BBB Attendees 2", "bbb-desc", -1, -1, false, false, false, false, false);
-		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting("Attend - 1", null, null, group);
+		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting("Attend - 1", null, null, group, id2);
 		BigBlueButtonAttendee attendee1 = bigBlueButtonAttendeeDao
 				.createAttendee(id1, null, BigBlueButtonAttendeeRoles.moderator, new Date(), meeting);
 		dbInstance.commitAndCloseSession();
@@ -111,7 +111,7 @@ public class BigBlueButtonAttendeeDAOTest extends OlatTestCase {
 	@Test
 	public void hasAttendee_guest() {
 		BusinessGroup group = businessGroupDao.createAndPersist(null, "BBB Attendees 2", "bbb-desc", -1, -1, false, false, false, false, false);
-		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting("Attend - 1", null, null, group);
+		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting("Attend - 1", null, null, group, null);
 		BigBlueButtonAttendee attendee1 = bigBlueButtonAttendeeDao
 				.createAttendee(null, "Jeremey", BigBlueButtonAttendeeRoles.guest, new Date(), meeting);
 		dbInstance.commitAndCloseSession();
@@ -127,7 +127,7 @@ public class BigBlueButtonAttendeeDAOTest extends OlatTestCase {
 	public void getAttendee() {
 		Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("bbb-attendee-4");
 		BusinessGroup group = businessGroupDao.createAndPersist(null, "BBB Attendees 2", "bbb-desc", -1, -1, false, false, false, false, false);
-		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting("Attend - 1", null, null, group);
+		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting("Attend - 1", null, null, group, null);
 		BigBlueButtonAttendee attendee = bigBlueButtonAttendeeDao
 				.createAttendee(id, null, BigBlueButtonAttendeeRoles.moderator, new Date(), meeting);
 		dbInstance.commitAndCloseSession();
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 c0d9f00cd89..8c428e34d01 100644
--- a/src/test/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingDAOTest.java
+++ b/src/test/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingDAOTest.java
@@ -28,6 +28,7 @@ import org.junit.Assert;
 import org.junit.Test;
 import org.olat.commons.calendar.CalendarUtils;
 import org.olat.core.commons.persistence.DB;
+import org.olat.core.id.Identity;
 import org.olat.group.BusinessGroup;
 import org.olat.group.manager.BusinessGroupDAO;
 import org.olat.modules.bigbluebutton.BigBlueButtonMeeting;
@@ -63,8 +64,9 @@ public class BigBlueButtonMeetingDAOTest extends OlatTestCase {
 		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
 		String name = "BigBlueButton - 1";
 		String subIdent = UUID.randomUUID().toString();
+		Identity creator = JunitTestHelper.createAndPersistIdentityAsRndUser("bbb-creator-3");
 		
-		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting(name, entry, subIdent, null);
+		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting(name, entry, subIdent, null, creator);
 		dbInstance.commit();
 		Assert.assertNotNull(meeting.getKey());
 		Assert.assertNotNull(meeting.getCreationDate());
@@ -74,6 +76,7 @@ public class BigBlueButtonMeetingDAOTest extends OlatTestCase {
 		Assert.assertNotNull(meeting.getModeratorPassword());
 		Assert.assertEquals(entry, meeting.getEntry());
 		Assert.assertEquals(subIdent, meeting.getSubIdent());
+		Assert.assertEquals(creator, meeting.getCreator());
 		Assert.assertNull(meeting.getBusinessGroup());	
 	}
 	
@@ -83,8 +86,9 @@ public class BigBlueButtonMeetingDAOTest extends OlatTestCase {
 		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
 		String name = "BigBlueButton - 2";
 		String subIdent = UUID.randomUUID().toString();
+		Identity creator = JunitTestHelper.createAndPersistIdentityAsRndUser("bbb-creator-4");
 		
-		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting(name, entry, subIdent, null);
+		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting(name, entry, subIdent, null, creator);
 		dbInstance.commit();
 		meeting.setName("A brand new name");
 		meeting.setDescription("A little description");
@@ -94,6 +98,7 @@ public class BigBlueButtonMeetingDAOTest extends OlatTestCase {
 		meeting.setLeadTime(15);
 		meeting.setEndDate(new Date());
 		meeting.setFollowupTime(7);
+		meeting.setMainPresenter("John Smith");
 		
 		meeting = bigBlueButtonMeetingDao.updateMeeting(meeting);
 		dbInstance.commit();
@@ -120,12 +125,15 @@ public class BigBlueButtonMeetingDAOTest extends OlatTestCase {
 		Assert.assertNotNull(meeting.getEndWithFollowupTime());
 		
 		Assert.assertNull(reloadedMeeting.getBusinessGroup());
+		
+		Assert.assertEquals("John Smith", reloadedMeeting.getMainPresenter());
+		Assert.assertEquals(creator, reloadedMeeting.getCreator());
 	}
 	
 	@Test
 	public void loadByIdentifier() {
 		BusinessGroup group = businessGroupDao.createAndPersist(null, "BBB 8 group", "bbb-desc", -1, -1, false, false, false, false, false);
-		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting("BigBlueButton - 8", null, null, group);
+		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting("BigBlueButton - 8", null, null, group, null);
 		dbInstance.commitAndCloseSession();
 		
 		BigBlueButtonMeeting loadedMeeting = bigBlueButtonMeetingDao.loadByIdentifier(meeting.getIdentifier());
@@ -136,8 +144,8 @@ public class BigBlueButtonMeetingDAOTest extends OlatTestCase {
 	@Test
 	public void isIdentifierInUse() {
 		BusinessGroup group = businessGroupDao.createAndPersist(null, "BBB 12 group", "bbb-desc", -1, -1, false, false, false, false, false);
-		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting("BigBlueButton - 12", null, null, group);
-		BigBlueButtonMeeting meetingOther = bigBlueButtonMeetingDao.createAndPersistMeeting("BigBlueButton - 13", null, null, group);
+		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting("BigBlueButton - 12", null, null, group, null);
+		BigBlueButtonMeeting meetingOther = bigBlueButtonMeetingDao.createAndPersistMeeting("BigBlueButton - 13", null, null, group, null);
 		dbInstance.commit();
 		String identifier = UUID.randomUUID().toString();
 		meeting.setReadableIdentifier(identifier);
@@ -155,13 +163,15 @@ public class BigBlueButtonMeetingDAOTest extends OlatTestCase {
 	@Test
 	public void loadByKey() {
 		String name = "BigBlueButton - 9";
+		Identity creator = JunitTestHelper.createAndPersistIdentityAsRndUser("bbb-creator-1");
 		BusinessGroup group = businessGroupDao.createAndPersist(null, "BBB 9 group", "bbb-desc", -1, -1, false, false, false, false, false);
-		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting(name, null, null, group);
+		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting(name, null, null, group, creator);
 		dbInstance.commitAndCloseSession();
 		
 		BigBlueButtonMeeting loadedMeeting = bigBlueButtonMeetingDao.loadByKey(meeting.getKey());
 		Assert.assertNotNull(loadedMeeting);
 		Assert.assertEquals(meeting, loadedMeeting);
+		Assert.assertEquals(creator, loadedMeeting.getCreator());
 	}
 	
 	@Test
@@ -169,14 +179,14 @@ public class BigBlueButtonMeetingDAOTest extends OlatTestCase {
 		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
 		String name = "BigBlueButton - 2";
 		String subIdent = UUID.randomUUID().toString();
-		
-		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting(name, entry, subIdent, null);
+		Identity creator = JunitTestHelper.createAndPersistIdentityAsRndUser("bbb-creator-2");
+		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting(name, entry, subIdent, null, creator);
 		dbInstance.commit();
 
-		
 		BigBlueButtonMeeting reloadedMeeting = bigBlueButtonMeetingDao.loadForUpdate(meeting);
 		dbInstance.commit();
 		Assert.assertNotNull(reloadedMeeting);
+		Assert.assertEquals(meeting, reloadedMeeting);
 	}
 	
 	@Test
@@ -185,7 +195,7 @@ public class BigBlueButtonMeetingDAOTest extends OlatTestCase {
 		String name = "BigBlueButton - 2";
 		String subIdent = UUID.randomUUID().toString();
 		
-		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting(name, entry, subIdent, null);
+		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting(name, entry, subIdent, null, null);
 		dbInstance.commit();
 		
 		List<BigBlueButtonMeeting> meetings = bigBlueButtonMeetingDao.getMeetings(entry, subIdent, null, false);
@@ -199,8 +209,8 @@ public class BigBlueButtonMeetingDAOTest extends OlatTestCase {
 		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
 		String subIdent = UUID.randomUUID().toString();
 		
-		BigBlueButtonMeeting meetingMember = bigBlueButtonMeetingDao.createAndPersistMeeting("BigBlueButton - 10", entry, subIdent, null);
-		BigBlueButtonMeeting meetingGuest = bigBlueButtonMeetingDao.createAndPersistMeeting("BigBlueButton - 11", entry, subIdent, null);
+		BigBlueButtonMeeting meetingMember = bigBlueButtonMeetingDao.createAndPersistMeeting("BigBlueButton - 10", entry, subIdent, null, null);
+		BigBlueButtonMeeting meetingGuest = bigBlueButtonMeetingDao.createAndPersistMeeting("BigBlueButton - 11", entry, subIdent, null, null);
 		dbInstance.commit();
 		meetingGuest.setGuest(true);
 		meetingGuest = bigBlueButtonMeetingDao.updateMeeting(meetingGuest);
@@ -217,7 +227,7 @@ public class BigBlueButtonMeetingDAOTest extends OlatTestCase {
 	public void getAllMeetings() {
 		String name = "BigBlueButton - 3";
 		BusinessGroup group = businessGroupDao.createAndPersist(null, "BBB group", "bbb-desc", -1, -1, false, false, false, false, false);
-		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting(name, null, null, group);
+		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting(name, null, null, group, null);
 		dbInstance.commit();
 		
 		List<BigBlueButtonMeeting> meetings = bigBlueButtonMeetingDao.getAllMeetings();
@@ -234,7 +244,7 @@ public class BigBlueButtonMeetingDAOTest extends OlatTestCase {
 		
 		String name = "BigBlueButton - 7";
 		BusinessGroup group = businessGroupDao.createAndPersist(null, "BBB server", "bbb-server", -1, -1, false, false, false, false, false);
-		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting(name, null, null, group);
+		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting(name, null, null, group, null);
 		dbInstance.commit();
 		
 		((BigBlueButtonMeetingImpl)meeting).setServer(server);
@@ -283,7 +293,7 @@ public class BigBlueButtonMeetingDAOTest extends OlatTestCase {
 	
 	private BigBlueButtonMeeting createMeeting(String name, Date start, int leadTime, Date end, int followupTime,
 			BigBlueButtonMeetingTemplate template, BusinessGroup group) {
-		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting(name, null, null, group);
+		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting(name, null, null, group, null);
 		meeting.setStartDate(start);
 		meeting.setLeadTime(leadTime);
 		meeting.setEndDate(end);
diff --git a/src/test/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingTemplateDAOTest.java b/src/test/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingTemplateDAOTest.java
index 8b13be36310..173ee7ffa2c 100644
--- a/src/test/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingTemplateDAOTest.java
+++ b/src/test/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonMeetingTemplateDAOTest.java
@@ -127,7 +127,7 @@ public class BigBlueButtonMeetingTemplateDAOTest extends OlatTestCase {
 		// make a template and use it in a meeting
 		BigBlueButtonMeetingTemplate template = bigBlueButtonMeetingTemplateDao.createTemplate("A new template", UUID.randomUUID().toString(), false);
 		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
-		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting("BigBlueButton templated - 10", entry, UUID.randomUUID().toString(), null);
+		BigBlueButtonMeeting meeting = bigBlueButtonMeetingDao.createAndPersistMeeting("BigBlueButton templated - 10", entry, UUID.randomUUID().toString(), null, null);
 		meeting.setTemplate(template);
 		bigBlueButtonMeetingDao.updateMeeting(meeting);
 		dbInstance.commitAndCloseSession();
-- 
GitLab