diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/elements/FormLink.java b/src/main/java/org/olat/core/gui/components/form/flexible/elements/FormLink.java
index 7cc9b21961a7fd61abbd3ad93a08a35a7c1ec4ed..27c91daa46761eb49cbcdd6ffa37f9aabcbcae3d 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/elements/FormLink.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/elements/FormLink.java
@@ -39,6 +39,8 @@ public interface FormLink extends FormItem {
 	
 	public boolean isNewWindowAfterDispatchUrl();
 	
+	public boolean isNewWindowWithSubmit();
+	
 	/**
 	 * Specify if the link open a new window. This is not equivalent to the
 	 * method setUrl to open the link in a new window with Ctrl + click. The
@@ -54,8 +56,9 @@ public interface FormLink extends FormItem {
 	 * @param openInNewWindow Open a new window
 	 * @param afterDispatchUrl true if the URL will be send after the
 	 * 		link is clicked with a JS command.
+	 * @param withSubmit Form is submitted by the button
 	 */
-	public void setNewWindow(boolean openInNewWindow, boolean afterDispatchUrl);
+	public void setNewWindow(boolean openInNewWindow, boolean afterDispatchUrl, boolean withSubmit);
 	
 	public boolean isPopup();
 	
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormJSHelper.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormJSHelper.java
index 41668dc123f99862f64ac68ec66f5f452720b718..628ebb2ba86ad09789004ebdbead17bae8ba5ef3 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormJSHelper.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormJSHelper.java
@@ -29,12 +29,12 @@ import java.io.IOException;
 import java.util.Iterator;
 import java.util.Set;
 
+import org.apache.logging.log4j.Logger;
 import org.json.JSONException;
 import org.json.JSONObject;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.render.StringOutput;
 import org.olat.core.logging.OLATRuntimeException;
-import org.apache.logging.log4j.Logger;
 import org.olat.core.logging.Tracing;
 
 /**
@@ -135,8 +135,8 @@ public class FormJSHelper {
 	 * @param pairs Additional name value pairs send by the link
 	 * @return
 	 */
-	public static String getXHRFnCallFor(FormItem item, boolean dirtyCheck, boolean pushState, NameValuePair... pairs) {
-		return getXHRFnCallFor(item.getRootForm(), item.getFormDispatchId(), 1, dirtyCheck, pushState, false, pairs);
+	public static String getXHRFnCallFor(FormItem item, boolean dirtyCheck, boolean pushState, boolean submit, NameValuePair... pairs) {
+		return getXHRFnCallFor(item.getRootForm(), item.getFormDispatchId(), 1, dirtyCheck, pushState, submit, pairs);
 	}
 	
 	/**
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FormLinkImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FormLinkImpl.java
index f88e5a8fa45f462be465192f016121304cafdf73..2282d1af71d341076a4fdd638b9269fb8fbd4e9a 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FormLinkImpl.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FormLinkImpl.java
@@ -67,6 +67,7 @@ public class FormLinkImpl extends FormItemImpl implements FormLink {
 	private boolean ownDirtyFormWarning = false;
 	private boolean newWindow;
 	private boolean newWindowAfterDispatchUrl;
+	private boolean newWindowWithSubmit;
 	private LinkPopupSettings popup;
 	private String iconLeftCSS;
 	private String iconRightCSS;
@@ -149,8 +150,14 @@ public class FormLinkImpl extends FormItemImpl implements FormLink {
 	}
 
 	@Override
-	public void setNewWindow(boolean openInNewWindow, boolean afterDispatchUrl) {
+	public boolean isNewWindowWithSubmit() {
+		return newWindowWithSubmit;
+	}
+
+	@Override
+	public void setNewWindow(boolean openInNewWindow, boolean afterDispatchUrl, boolean withSubmit) {
 		newWindow = openInNewWindow;
+		newWindowWithSubmit = withSubmit;
 		newWindowAfterDispatchUrl = afterDispatchUrl;
 		if(component != null) {
 			component.setNewWindow(openInNewWindow, afterDispatchUrl);
diff --git a/src/main/java/org/olat/core/gui/components/link/LinkRenderer.java b/src/main/java/org/olat/core/gui/components/link/LinkRenderer.java
index 6b2bd37271746a22ed8ea0db2127e863dda3c2c5..f89bc9c205ed75e995d614237d5cf9c3e4d318bf 100644
--- a/src/main/java/org/olat/core/gui/components/link/LinkRenderer.java
+++ b/src/main/java/org/olat/core/gui/components/link/LinkRenderer.java
@@ -362,7 +362,8 @@ public class LinkRenderer extends DefaultComponentRenderer {
 				boolean hasUrl = StringHelper.containsNonWhitespace(link.getUrl());
 				String href = hasUrl ? link.getUrl() : "javascript:;";
 				sb.append("href=\"").append(href).append("\" onclick=\"")
-				  .append(FormJSHelper.getXHRFnCallFor(flexiLink, false, false, new NameValuePair("oo-opennewwindow-oo", "true")))
+				  .append(FormJSHelper.getXHRFnCallFor(flexiLink, false, false, flexiLink.isNewWindowWithSubmit(),
+						  new NameValuePair("oo-opennewwindow-oo", "true")))
 				  .append("; return false;\"");
 			} else {
 				String dispatchUri = flexiLink.getFormDispatchId();
diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java
index 654186f1ed452a5ba666989c7a92e702afc6c1ae..9f225075ed6086be147daaf0c83210208f53a92d 100644
--- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java
+++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java
@@ -641,7 +641,7 @@ public class AssessmentTestComponentRenderer extends AssessmentObjectComponentRe
 			sb.append("<li class='o_assessmentitem'>");
 			sb.append("<button type='button' ");
 			String key = itemNode.getKey().toString();
-			sb.onClickKeyEnter(FormJSHelper.getXHRFnCallFor(component.getQtiItem(), true, true,
+			sb.onClickKeyEnter(FormJSHelper.getXHRFnCallFor(component.getQtiItem(), true, true, false,
 					new NameValuePair("cid", Event.reviewItem.name()), new NameValuePair("item", key)))
 			  .append(" class='btn btn-default' ").append(" disabled", !reviewable).append("><span class='questionTitle'>")
 			  .append(StringHelper.escapeHtml(itemNode.getSectionPartTitle())).append("</span>");
diff --git a/src/main/java/org/olat/modules/appointments/ui/AppointmentListController.java b/src/main/java/org/olat/modules/appointments/ui/AppointmentListController.java
index 4398c0ca93ae1d98d6f4fdbe5ff5f6e02f74db86..541230b0550ec9c8cc7aaf2d46a8387327d238f0 100644
--- a/src/main/java/org/olat/modules/appointments/ui/AppointmentListController.java
+++ b/src/main/java/org/olat/modules/appointments/ui/AppointmentListController.java
@@ -432,7 +432,7 @@ public abstract class AppointmentListController extends FormBasicController impl
 			name = name + "  ";
 			link.setI18nKey(name);
 			link.setIconLeftCSS("o_icon o_icon_lg o_vc_icon");
-			link.setNewWindow(true, true);
+			link.setNewWindow(true, true, false);
 			link.setUserObject(recording);
 			recordingLinks.add(link);
 		}
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonGuestJoinController.java b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonGuestJoinController.java
index 8f61b7b0e553e224e74258a259d18851fa5204b9..cfc709f47d589966c8ee623a225cf3d167d80b5b 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonGuestJoinController.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonGuestJoinController.java
@@ -25,11 +25,13 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.elements.FormLink;
+import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
 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.link.Link;
+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;
@@ -76,6 +78,7 @@ public class BigBlueButtonGuestJoinController extends FormBasicController implem
 	
 	private TextElement nameEl;
 	private FormLink joinButton;
+	private MultipleSelectionElement acknowledgeRecordingEl;
 
 	private boolean readOnly = false;
 	private boolean moderatorStartMeeting;
@@ -146,6 +149,12 @@ public class BigBlueButtonGuestJoinController extends FormBasicController implem
 		joinButton.setElementCssClass("o_sel_bbb_guest_join");
 		joinButton.setVisible(!end);
 		joinButton.setTextReasonForDisabling(translate("warning.no.access"));
+		
+		KeyValues acknowledgeKeyValue = new KeyValues();
+		acknowledgeKeyValue.add(KeyValues.entry("agree", translate("meeting.acknowledge.recording.agree")));
+		acknowledgeRecordingEl = uifactory.addCheckboxesHorizontal("meeting.acknowledge.recording", null, formLayout,
+				acknowledgeKeyValue.keys(), acknowledgeKeyValue.values());
+		acknowledgeRecordingEl.setVisible(!end && BigBlueButtonUIHelper.isRecord(meeting));
 	}
 	
 	private void reloadButtonsAndStatus() {
@@ -182,6 +191,7 @@ public class BigBlueButtonGuestJoinController extends FormBasicController implem
 		}
 		// update button style to indicate that the user must now press to start
 		joinButton.setPrimary(joinButton.isEnabled());
+		acknowledgeRecordingEl.setVisible(joinButton.isEnabled() && BigBlueButtonUIHelper.isRecord(meeting));
 
 	}
 	
@@ -277,6 +287,13 @@ public class BigBlueButtonGuestJoinController extends FormBasicController implem
 			allOk &= false;
 		}
 		
+		acknowledgeRecordingEl.clearError();
+		if(acknowledgeRecordingEl.isVisible()
+				&& acknowledgeRecordingEl.isEnabled() && !acknowledgeRecordingEl.isAtLeastSelected(1)) {
+			acknowledgeRecordingEl.setErrorKey("form.legende.mandatory", null);
+			allOk &= false;
+		}
+		
 		return allOk;
 	}
 
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 1ff808d6935d8e024a31d699d088a5ac06a429d9..640b77f4f82716a9be3940fdf9e6f6fcdcc1a5fd 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonMeetingController.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonMeetingController.java
@@ -26,11 +26,11 @@ import java.util.TimerTask;
 
 import org.olat.core.commons.services.taskexecutor.TaskExecutorManager;
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement;
 import org.olat.core.gui.components.form.flexible.elements.FormLink;
+import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
 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;
@@ -40,9 +40,8 @@ import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTable
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.SelectionEvent;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.StaticFlexiCellRenderer;
-import org.olat.core.gui.components.link.ExternalLink;
 import org.olat.core.gui.components.link.Link;
-import org.olat.core.gui.components.link.LinkFactory;
+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;
@@ -50,8 +49,6 @@ import org.olat.core.gui.control.generic.closablewrapper.CloseableCalloutWindowC
 import org.olat.core.gui.control.generic.modal.DialogBoxController;
 import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
 import org.olat.core.gui.control.winmgr.CommandFactory;
-import org.olat.core.gui.media.MediaResource;
-import org.olat.core.gui.media.RedirectMediaResource;
 import org.olat.core.helpers.Settings;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.util.Formatter;
@@ -91,8 +88,9 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen
 	private final boolean moderatorStartMeeting;
 	private final OLATResourceable meetingOres;
 
-	private Link joinButton;
-	private ExternalLink guestJoinButton;
+	private FormLink joinButton;
+	private FormLink guestJoinButton;
+	private MultipleSelectionElement acknowledgeRecordingEl;
 	private FlexiTableElement tableEl;
 	private BigBlueButtonRecordingTableModel recordingTableModel;
 
@@ -167,19 +165,22 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen
 			}
 		}
 		
-		joinButton = LinkFactory.createButtonLarge("meeting.join.button", flc.getFormItemComponent(), this);
+		joinButton = uifactory.addFormLink("meeting.join.button", translate("meeting.join.button"), null,
+				formLayout, Link.BUTTON | Link.NONTRANSLATED);
 		joinButton.setElementCssClass("o_sel_bbb_join");
-		joinButton.setTarget("_blank");
+		joinButton.setNewWindow(true, true, true);
 		joinButton.setVisible(!ended && !guest);
 		joinButton.setTextReasonForDisabling(translate("warning.no.access"));
 		
-		String url = Settings.getServerContextPathURI() + "/bigbluebutton/" + meeting.getIdentifier();
-		guestJoinButton = LinkFactory.createExternalLink("meeting.guest.join.button", "meeting.guest.join.button", url);
+		guestJoinButton = uifactory.addFormLink("meeting.guest.join.button", formLayout, Link.BUTTON);
 		guestJoinButton.setElementCssClass("btn btn-lg btn-default o_sel_bbb_guest_join");
-		guestJoinButton.setName(translate("meeting.guest.join.button"));
-		guestJoinButton.setTarget("_blank");
+		guestJoinButton.setNewWindow(true, true, true);
 		guestJoinButton.setVisible(!ended && guest);
-		flc.getFormItemComponent().put("meeting.guest.join.button", guestJoinButton);
+		
+		KeyValues acknowledgeKeyValue = new KeyValues();
+		acknowledgeKeyValue.add(KeyValues.entry("agree", translate("meeting.acknowledge.recording.agree")));
+		acknowledgeRecordingEl = uifactory.addCheckboxesHorizontal("meeting.acknowledge.recording", null, formLayout,
+				acknowledgeKeyValue.keys(), acknowledgeKeyValue.values());
 	}
 	
 	private void initRecordings(FormItemContainer formLayout) {
@@ -303,9 +304,9 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen
 			if(moderator || administrator) {
 				flc.contextPut("notStarted", Boolean.FALSE);
 				if(!running && moderatorStartMeeting) {
-					joinButton.setCustomDisplayText(translate("meeting.start.button"));
+					joinButton.setI18nKey(translate("meeting.start.button"));
 				} else {
-					joinButton.setCustomDisplayText(translate("meeting.join.button"));
+					joinButton.setI18nKey(translate("meeting.join.button"));
 				}
 			} else if(!running && moderatorStartMeeting) {
 				flc.contextPut("notStarted", Boolean.TRUE);
@@ -327,6 +328,9 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen
 			guestJoinButton.setElementCssClass("btn btn-lg btn-default o_sel_bbb_guest_join");			
 		}
 		joinButton.setPrimary(joinButton.isEnabled());
+		acknowledgeRecordingEl.setVisible(BigBlueButtonUIHelper.isRecord(meeting)
+				&& ((joinButton.isVisible() && joinButton.isEnabled())
+						|| (guestJoinButton.isEnabled() && guestJoinButton.isVisible())));
 	}
 
 	@Override
@@ -344,14 +348,6 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen
 		}
 	}
 
-	@Override
-	public void event(UserRequest ureq, Component source, Event event) {
-		if(joinButton == source) {
-			doJoin(ureq);
-		}
-		super.event(ureq, source, event);
-	}
-	
 	@Override
 	protected void event(UserRequest ureq, Controller source, Event event) {
 		if(confirmDeleteRecordingDialog == source) {
@@ -381,9 +377,29 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen
 		publishCtrl = null;
 	}
 
+	@Override
+	protected boolean validateFormLogic(UserRequest ureq) {
+		boolean allOk = super.validateFormLogic(ureq);
+		
+		if(acknowledgeRecordingEl != null) {
+			acknowledgeRecordingEl.clearError();
+			if(acknowledgeRecordingEl.isVisible()
+					&& acknowledgeRecordingEl.isEnabled() && !acknowledgeRecordingEl.isAtLeastSelected(1)) {
+				acknowledgeRecordingEl.setErrorKey("form.legende.mandatory", null);
+				allOk &= false;
+			}
+		}
+		
+		return allOk;
+	}
+
 	@Override
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
-		if(tableEl == source) {
+		if(joinButton == source) {
+			doJoin(ureq);
+		} else if(this.guestJoinButton == source) {
+			doGuestJoin(ureq);
+		} else if(tableEl == source) {
 			if(event instanceof SelectionEvent) {
 				SelectionEvent se = (SelectionEvent)event;
 				if("delete".equals(se.getCommand())) {
@@ -415,12 +431,28 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen
 		listenTo(publishCalloutCtrl);
 		publishCalloutCtrl.activate();
 	}
+	
+	private void doGuestJoin(UserRequest ureq) {
+		if(!validateFormLogic(ureq)) {
+			getWindowControl().getWindowBackOffice().sendCommandTo(CommandFactory.createNewWindowCancelRedirectTo());
+			return;
+		}
+		
+		String meetingUrl = Settings.getServerContextPathURI() + "/bigbluebutton/" + meeting.getIdentifier();
+		getWindowControl().getWindowBackOffice().sendCommandTo(CommandFactory.createNewWindowRedirectTo(meetingUrl));
+	}
 
 	private void doJoin(UserRequest ureq) {
+		if(!validateFormLogic(ureq)) {
+			getWindowControl().getWindowBackOffice().sendCommandTo(CommandFactory.createNewWindowCancelRedirectTo());
+			return;
+		}
+
 		meeting = bigBlueButtonManager.getMeeting(meeting);
 		if(meeting == null) {
 			showWarning("warning.no.meeting");
 			fireEvent(ureq, Event.BACK_EVENT);
+			getWindowControl().getWindowBackOffice().sendCommandTo(CommandFactory.createNewWindowCancelRedirectTo());
 			return;
 		}
 		
@@ -436,16 +468,16 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen
 			BigBlueButtonAttendeeRoles role = guest ? BigBlueButtonAttendeeRoles.guest : BigBlueButtonAttendeeRoles.viewer;
 			meetingUrl = bigBlueButtonManager.join(meeting, getIdentity(), null, role, Boolean.TRUE, errors);
 		}
-		redirectTo(ureq, meetingUrl, errors);
+		redirectTo(meetingUrl, errors);
 	}
 	
-	private void redirectTo(UserRequest ureq, String meetingUrl, BigBlueButtonErrors errors) {
+	private void redirectTo(String meetingUrl, BigBlueButtonErrors errors) {
 		if(errors.hasErrors()) {
-			getWindowControl().setError(BigBlueButtonErrorHelper.formatErrors(getTranslator(), errors));
+			getWindowControl().getWindowBackOffice().sendCommandTo(CommandFactory.createNewWindowCancelRedirectTo());
 		} else if(StringHelper.containsNonWhitespace(meetingUrl)) {
-			MediaResource redirect = new RedirectMediaResource(meetingUrl);
-			ureq.getDispatchResult().setResultingMediaResource(redirect);
+			getWindowControl().getWindowBackOffice().sendCommandTo(CommandFactory.createNewWindowRedirectTo(meetingUrl));
 		} else {
+			getWindowControl().getWindowBackOffice().sendCommandTo(CommandFactory.createNewWindowCancelRedirectTo());
 			showWarning("warning.no.access");
 		}
 	}
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonUIHelper.java b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonUIHelper.java
index 9dc917213963fc3869a3c286ac5502b92dbc52c3..a1b896ec1e98925d1603a36b633517022a3dc76b 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonUIHelper.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonUIHelper.java
@@ -240,6 +240,12 @@ public class BigBlueButtonUIHelper {
 		return followupTime;
 	}
 	
+	public static boolean isRecord(BigBlueButtonMeeting meeting) {
+		return meeting != null && meeting.getTemplate() != null
+				&& meeting.getTemplate().getRecord() != null
+				&& meeting.getTemplate().getRecord().booleanValue();
+	}
+	
 	private static BigBlueButtonManager getBigBlueButtonManager() {
 		return CoreSpringFactory.getImpl(BigBlueButtonManager.class);
 	}
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/_content/guest_join.html b/src/main/java/org/olat/modules/bigbluebutton/ui/_content/guest_join.html
index a56d296686ec0b11a899f2f2820783021076e78d..df47a6c9329492f9e25ed81918d50f1a5381b9c2 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/_content/guest_join.html
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/_content/guest_join.html
@@ -31,6 +31,18 @@
 			</div>
 			#end
 		</div>
+		
+		#if($r.visible("meeting.acknowledge.recording"))
+		<div class="o_warning">
+			<h4>$r.translate("meeting.acknowledge.recording.explain.title")</h4>
+			<p>$r.translate("meeting.acknowledge.recording.explain")</p>
+			$r.render("meeting.acknowledge.recording")
+			#if($f.hasError("meeting.acknowledge.recording"))
+				$r.render("meeting.acknowledge.recording_ERROR")
+			#end
+		</div>
+		#end
+		
 		<div class=o_button_group>
 			$r.render("meeting.join.button")
 		</div>
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 76be8c6d270cc4be4b0c79aff1a019f2b7958dde..15cea5366ef4a6d917be41bbd01b5ad5222279ad 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
@@ -34,10 +34,18 @@
 <div class="o_block_large o_info">$r.translate("meeting.create.intro")</div>
 #end
 
-<div class="o_button_group">
-#if($r.available("meeting.start.button") && $r.visible("meeting.start.button"))
-	$r.render("meeting.start.button")
+#if($r.visible("meeting.acknowledge.recording"))
+<div class="o_warning">
+	<h4>$r.translate("meeting.acknowledge.recording.explain.title")</h4>
+	<p>$r.translate("meeting.acknowledge.recording.explain")</p>
+	$r.render("meeting.acknowledge.recording")
+	#if($f.hasError("meeting.acknowledge.recording"))
+		$r.render("meeting.acknowledge.recording_ERROR")
+	#end
+</div>
 #end
+
+<div class="o_button_group">
 #if($r.available("meeting.join.button") && $r.visible("meeting.join.button"))
 	$r.render("meeting.join.button")
 #end
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 aaa6235274290e8d512f6ce3ebe5742bd2b92cda..6564961420b672626fd1aa05d8e1b47537385a69 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,9 @@ filter.all.instances=Alle OpenOlats
 filter.this.instance=Dieses OpenOlat
 layout.standard=Standard
 layout.webcam=Webcam Termin
+meeting.acknowledge.recording.agree=Ich bin einverstanden
+meeting.acknowledge.recording.explain=Dieses Meeting mit allen Video-, Audio-, Chat-Nachrichten- und Whiteboard-Anmerkungen wird aufgezeichnet und kann nach dem Meeting ver\u00F6ffentlicht werden.
+meeting.acknowledge.recording.explain.title=Aufzeichnungen
 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
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 8b2d070941e53b5c07970ed602df98e47248ad1d..99867cf0eedbf79f0701db2f5edb68d06119cc04 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,9 @@ filter.all.instances=All OpenOlats
 filter.this.instance=This OpenOlat
 layout.standard=Standard
 layout.webcam=Webcam meeting
+meeting.acknowledge.recording.agree=I agree
+meeting.acknowledge.recording.explain=This meeting including all video, audio, chat message and whiteboard annotations will be recorded and can be published after the meeting.
+meeting.acknowledge.recording.explain.title=Meeting recording
 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