diff --git a/src/main/java/org/olat/basesecurity/manager/GroupDAO.java b/src/main/java/org/olat/basesecurity/manager/GroupDAO.java
index 9af367f4cb1e0bb3875ed51239df55b06635612c..284a188ee9c29c46c6e6fd670271b3e7a5a50292 100644
--- a/src/main/java/org/olat/basesecurity/manager/GroupDAO.java
+++ b/src/main/java/org/olat/basesecurity/manager/GroupDAO.java
@@ -19,11 +19,13 @@
  */
 package org.olat.basesecurity.manager;
 
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 
@@ -219,6 +221,15 @@ public class GroupDAO {
 			.getResultList();
 	}
 	
+	public List<Identity> getMembers(Collection<Group> group, String role) {
+		List<Long> groupKeys = group.stream().map(Group::getKey).collect(Collectors.toList());
+		return dbInstance.getCurrentEntityManager()
+			.createNamedQuery("membersByGroupsAndRole", Identity.class)
+			.setParameter("groupKeys", groupKeys)
+			.setParameter("role", role)
+			.getResultList();
+	}
+	
 	public List<GroupMembership> getMemberships(Group group) {
 		return dbInstance.getCurrentEntityManager()
 			.createNamedQuery("membershipsByGroup", GroupMembership.class)
diff --git a/src/main/java/org/olat/basesecurity/model/GroupMembershipImpl.java b/src/main/java/org/olat/basesecurity/model/GroupMembershipImpl.java
index 3a43e73b0b5af74944c46f43965eef8a0199273d..917a97f2f2aeee8a82470d68928e72c7b9ff0c27 100644
--- a/src/main/java/org/olat/basesecurity/model/GroupMembershipImpl.java
+++ b/src/main/java/org/olat/basesecurity/model/GroupMembershipImpl.java
@@ -62,6 +62,7 @@ import org.olat.core.util.StringHelper;
 @NamedQuery(name="countMembersByGroup", query="select count(membership.key) from bgroupmember as membership where membership.group.key=:groupKey")
 @NamedQuery(name="countMembersByGroupAndRole", query="select count(membership.key) from bgroupmember as membership where membership.group.key=:groupKey and membership.role=:role")
 @NamedQuery(name="membersByGroupAndRole", query="select distinct membership.identity from bgroupmember as membership where membership.group.key=:groupKey and membership.role=:role")
+@NamedQuery(name="membersByGroupsAndRole", query="select distinct membership.identity from bgroupmember as membership where membership.group.key in(:groupKeys) and membership.role=:role")
 @NamedQuery(name="hasRoleByGroupIdentityAndRole", query="select count(membership.key) from bgroupmember as membership where membership.group.key=:groupKey and membership.identity.key=:identityKey and membership.role=:role")
 public class GroupMembershipImpl implements GroupMembership, ModifiedInfo, Persistable {
 
diff --git a/src/main/java/org/olat/course/nodes/appointments/AppointmentsService.java b/src/main/java/org/olat/course/nodes/appointments/AppointmentsService.java
index 99757bd60ce8ba8335f558a171a14de5c0251cd9..03a32e6734e4e5c95c35fdcb485c8c66712050fb 100644
--- a/src/main/java/org/olat/course/nodes/appointments/AppointmentsService.java
+++ b/src/main/java/org/olat/course/nodes/appointments/AppointmentsService.java
@@ -73,10 +73,24 @@ public interface AppointmentsService {
 	
 	public void removeTopicRestriction(Topic topic, IdentityRef identity);
 	
+	public boolean hasGroupRestrictions(TopicRef topic);
+	
 	public List<Group> getGroupRestrictions(TopicRef topic);
 
+	/**
+	 *
+	 * @param topic
+	 * @return the identities of the topic group.
+	 */
 	public List<Identity> getUserRestrictions(Topic topic);
 	
+	/**
+	 *
+	 * @param topic
+	 * @return the identities of the all restriction groups.
+	 */
+	public List<Identity> getRestrictionMembers(TopicRef topic);
+	
 	public Appointment createUnsavedAppointment(Topic topic);
 
 	public Appointment saveAppointment(Appointment appointment);
diff --git a/src/main/java/org/olat/course/nodes/appointments/manager/AppointmentsServiceImpl.java b/src/main/java/org/olat/course/nodes/appointments/manager/AppointmentsServiceImpl.java
index 5f45a649f78f1f511020633eeec40caf6e6d3133..7781a79d25592f8ccaae9524e4d800b99f5654a8 100644
--- a/src/main/java/org/olat/course/nodes/appointments/manager/AppointmentsServiceImpl.java
+++ b/src/main/java/org/olat/course/nodes/appointments/manager/AppointmentsServiceImpl.java
@@ -245,6 +245,11 @@ public class AppointmentsServiceImpl implements AppointmentsService {
 		}
 	}
 	
+	@Override
+	public boolean hasGroupRestrictions(TopicRef topic) {
+		return topicToGroupDao.loadGroupCount(topic).longValue() > 0;
+	}
+	
 	@Override
 	public List<Group> getGroupRestrictions(TopicRef topic) {
 		return topicToGroupDao.loadGroups(topic);
@@ -281,6 +286,15 @@ public class AppointmentsServiceImpl implements AppointmentsService {
 		}
 		return Collections.emptyList();
 	}
+	
+	@Override
+	public List<Identity> getRestrictionMembers(TopicRef topic) {
+		List<Group> groups = topicToGroupDao.loadGroups(topic);
+		if (!groups.isEmpty()) {
+			return groupDao.getMembers(groups, TOPIC_USER_RESTRICTION_ROLE);
+		}
+		return Collections.emptyList();
+	}
 
 	@Override
 	public Appointment createUnsavedAppointment(Topic topic) {
diff --git a/src/main/java/org/olat/course/nodes/appointments/manager/TopicToGroupDAO.java b/src/main/java/org/olat/course/nodes/appointments/manager/TopicToGroupDAO.java
index 123b14ee0a244af23527fb53c1f3dfa3d0186fae..4b7820f94a2fe3fcb173b587a5caafaa6617279e 100644
--- a/src/main/java/org/olat/course/nodes/appointments/manager/TopicToGroupDAO.java
+++ b/src/main/java/org/olat/course/nodes/appointments/manager/TopicToGroupDAO.java
@@ -144,6 +144,18 @@ public class TopicToGroupDAO {
 				.setParameter("topicToGroupKey", topic.getKey())
 				.getResultList();
 	}
+	
+	Long loadGroupCount(TopicRef topic) {
+		QueryBuilder sb = new QueryBuilder();
+		sb.append("select count (distinct topictogroup.group.id)");
+		sb.append("  from appointmenttopictogroup topictogroup");
+		sb.and().append(" topictogroup.topic.key = :topicToGroupKey");
+		
+		return dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString(), Long.class)
+				.setParameter("topicToGroupKey", topic.getKey())
+				.getSingleResult();
+	}
 
 	List<Group> loadGroups(TopicRef topic) {
 		QueryBuilder sb = new QueryBuilder();
diff --git a/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentListController.java b/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentListController.java
index 3de3a6014b0d3f0d97be01f9c4fa6c12fb49bf74..936d301ee478c953d52f7114d0d40d52947d5295 100644
--- a/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentListController.java
+++ b/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentListController.java
@@ -96,6 +96,7 @@ public abstract class AppointmentListController extends FormBasicController impl
 	private CloseableModalController cmc;
 	private TopicHeaderController headerCtrl;
 	private DialogBoxController confirmParticipationCrtl;
+	private FindingConfirmationController findingConfirmationCtrl;
 	private AppointmentEditController appointmentEditCtrl;
 	private UserSearchController userSearchCtrl;
 	private ParticipationRemoveController removeCtrl;
@@ -362,7 +363,7 @@ public abstract class AppointmentListController extends FormBasicController impl
 		row.setAddUserLink(link);
 	}
 
-	protected void forgeRemoveLink(AppointmentRow row) {
+	protected void forgeRemoveUserLink(AppointmentRow row) {
 		FormLink link = uifactory.addFormLink("remove_" + row.getKey(), CMD_REMOVE, "remove.user", null, null, Link.LINK);
 		link.setUserObject(row);
 		row.setRemoveLink(link);
@@ -407,7 +408,7 @@ public abstract class AppointmentListController extends FormBasicController impl
 				doConfirmDeletion(ureq, row.getAppointment());
 			} else if (CMD_CONFIRM.equals(cmd)) {
 				AppointmentRow row = (AppointmentRow)link.getUserObject();
-				doConfirm(row.getAppointment());
+				doConfirm(ureq, row.getAppointment());
 			} else if (CMD_ADD_USER.equals(cmd)) {
 				AppointmentRow row = (AppointmentRow)link.getUserObject();
 				doSelectUser(ureq, row.getAppointment());
@@ -428,6 +429,12 @@ public abstract class AppointmentListController extends FormBasicController impl
 				doCreateParticipation(appointment);
 				updateModel();
 			}
+		} else if (findingConfirmationCtrl == source) {
+			if (event == Event.DONE_EVENT) {
+				updateModel();
+			}
+			cmc.deactivate();
+			cleanUp();
 		} else if (appointmentEditCtrl == source) {
 			if (event == Event.DONE_EVENT) {
 				updateModel();
@@ -470,11 +477,13 @@ public abstract class AppointmentListController extends FormBasicController impl
 	}
 	
 	private void cleanUp() {
+		removeAsListenerAndDispose(findingConfirmationCtrl);
 		removeAsListenerAndDispose(appointmentDeleteCtrl);
 		removeAsListenerAndDispose(appointmentEditCtrl);
 		removeAsListenerAndDispose(userSearchCtrl);
 		removeAsListenerAndDispose(removeCtrl);
 		removeAsListenerAndDispose(cmc);
+		findingConfirmationCtrl = null;
 		appointmentDeleteCtrl = null;
 		appointmentEditCtrl = null;
 		userSearchCtrl = null;
@@ -545,15 +554,29 @@ public abstract class AppointmentListController extends FormBasicController impl
 		cmc.activate();
 	}
 
-	private void doConfirm(Appointment appointment) {
+	private void doConfirm(UserRequest ureq, Appointment appointment) {
 		if (Status.planned == appointment.getStatus()) {
-			appointmentsService.confirmAppointment(appointment);
+			if (Type.finding == topic.getType()) {
+				doConfirmFinding(ureq, appointment);
+			} else {
+				appointmentsService.confirmAppointment(appointment);
+			}
 		} else {
 			appointmentsService.unconfirmAppointment(appointment);
 		}
 		updateModel();
 	}
 
+	private void doConfirmFinding(UserRequest ureq, Appointment appointment) {
+		findingConfirmationCtrl = new FindingConfirmationController(ureq, getWindowControl(), appointment);
+		listenTo(findingConfirmationCtrl);
+
+		cmc = new CloseableModalController(getWindowControl(), "close", findingConfirmationCtrl.getInitialComponent(), true,
+				translate("edit.appointment.title"));
+		listenTo(cmc);
+		cmc.activate();
+	}
+
 	private void doSelectUser(UserRequest ureq, Appointment appointment) {
 		userSearchCtrl = new UserSearchController(ureq, getWindowControl(), true, true, false);
 		userSearchCtrl.setUserObject(appointment);
diff --git a/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentListEditController.java b/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentListEditController.java
index cea2b295ffca1069897fc1bc5ad1ace372d09385..2dd806fae8b910e2aed7997c446a1e1a966381af 100644
--- a/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentListEditController.java
+++ b/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentListEditController.java
@@ -138,11 +138,11 @@ public class AppointmentListEditController extends AppointmentListController {
 			row.setStatusCSS("o_ap_status_" + appointment.getStatus().name());
 		}
 		
-		boolean rebookable = Type.finding == topic.getType()
-				? false
+		boolean removeUser = Type.finding == topic.getType()
+				? participations.size() > 0 && Status.confirmed == appointment.getStatus()
 				: participations.size() > 0;
-		if (rebookable) {
-			forgeRemoveLink(row);
+		if (removeUser) {
+			forgeRemoveUserLink(row);
 		}
 		
 		if (Type.finding == topic.getType()) {
diff --git a/src/main/java/org/olat/course/nodes/appointments/ui/FindingConfirmationController.java b/src/main/java/org/olat/course/nodes/appointments/ui/FindingConfirmationController.java
new file mode 100644
index 0000000000000000000000000000000000000000..3817d5f286e44093f2fffa71607559d07827870d
--- /dev/null
+++ b/src/main/java/org/olat/course/nodes/appointments/ui/FindingConfirmationController.java
@@ -0,0 +1,221 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.course.nodes.appointments.ui;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.olat.basesecurity.BaseSecurityManager;
+import org.olat.basesecurity.BaseSecurityModule;
+import org.olat.basesecurity.GroupRoles;
+import org.olat.core.gui.UserRequest;
+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.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.form.flexible.impl.elements.table.DefaultFlexiColumnModel;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory;
+import org.olat.core.gui.control.Controller;
+import org.olat.core.gui.control.WindowControl;
+import org.olat.core.id.Identity;
+import org.olat.course.nodes.appointments.Appointment;
+import org.olat.course.nodes.appointments.AppointmentsService;
+import org.olat.course.nodes.appointments.Participation;
+import org.olat.course.nodes.appointments.ParticipationSearchParams;
+import org.olat.course.nodes.appointments.Topic;
+import org.olat.course.nodes.appointments.ui.UserRestrictionTableModel.UserRestrictionCols;
+import org.olat.repository.RepositoryEntry;
+import org.olat.repository.RepositoryEntryRelationType;
+import org.olat.repository.RepositoryService;
+import org.olat.user.UserManager;
+import org.olat.user.UserPropertiesRow;
+import org.olat.user.propertyhandlers.UserPropertyHandler;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * 
+ * Initial date: 25 Jun 2020<br>
+ * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
+ *
+ */
+public class FindingConfirmationController extends FormBasicController {
+	
+	private static final String usageIdentifyer = UserRestrictionTableModel.class.getCanonicalName();
+
+	private UserRestrictionTableModel usersTableModel;
+	private FlexiTableElement usersTableEl;
+	
+	private final Appointment appointment;
+	private final Topic topic;
+	private final RepositoryEntry entry;
+	private final boolean isAdministrativeUser;
+	private final List<UserPropertyHandler> userPropertyHandlers;
+	private List<Participation> participations;
+	private List<Long> participationIdentityKeys;
+	
+	@Autowired
+	private AppointmentsService appointmentsService;
+	@Autowired
+	private RepositoryService repositoryService;
+	@Autowired
+	private BaseSecurityManager securityManager;
+	@Autowired
+	private BaseSecurityModule securityModule;
+	@Autowired
+	private UserManager userManager;
+
+	public FindingConfirmationController(UserRequest ureq, WindowControl wControl, Appointment appointment) {
+		super(ureq, wControl, LAYOUT_VERTICAL);
+		setTranslator(userManager.getPropertyHandlerTranslator(getTranslator()));
+		this.appointment = appointment;
+		this.topic = appointment.getTopic();
+		this.entry = topic.getEntry();
+		
+		isAdministrativeUser = securityModule.isUserAllowedAdminProps(ureq.getUserSession().getRoles());
+		userPropertyHandlers = userManager.getUserPropertyHandlersFor(usageIdentifyer, isAdministrativeUser);
+	
+		initForm(ureq);
+		loadModel();
+	}
+
+	@Override
+	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
+		setFormInfo("finding.confirmation.info");
+		
+		FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
+		if(isAdministrativeUser) {
+			columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(UserRestrictionCols.username));
+		}
+		
+		int colIndex = UserRestrictionTableModel.USER_PROPS_OFFSET;
+		for (int i = 0; i < userPropertyHandlers.size(); i++) {
+			UserPropertyHandler userPropertyHandler	= userPropertyHandlers.get(i);
+			boolean visible = userManager.isMandatoryUserProperty(usageIdentifyer , userPropertyHandler);
+			columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(visible, userPropertyHandler.i18nColumnDescriptorLabelKey(), colIndex, null, true, "userProp-" + colIndex));
+			colIndex++;
+		}
+		
+		usersTableModel = new UserRestrictionTableModel(columnsModel, getLocale()); 
+		usersTableEl = uifactory.addTableElement(getWindowControl(), "users", usersTableModel, 20, false, getTranslator(), formLayout);
+		usersTableEl.setAndLoadPersistedPreferences(ureq, "finding.confirmation");
+		usersTableEl.setEmtpyTableMessageKey("finding.confirmation.empty.table");
+		usersTableEl.setSelectAllEnable(true);
+		usersTableEl.setMultiSelect(true);
+		
+		FormLayoutContainer buttonCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
+		buttonCont.setRootForm(mainForm);
+		formLayout.add(buttonCont);
+		uifactory.addFormSubmitButton("save", buttonCont);
+		uifactory.addFormCancelButton("cancel", buttonCont, ureq, getWindowControl());
+	}
+	
+	private void loadModel() {
+		boolean groupRestrictions = appointmentsService.hasGroupRestrictions(topic);
+		
+		List<Identity> restrictedIdentities = groupRestrictions
+				? appointmentsService.getRestrictionMembers(topic)
+				: repositoryService.getMembers(entry, RepositoryEntryRelationType.all, GroupRoles.participant.name());
+				
+		
+		ParticipationSearchParams params = new ParticipationSearchParams();
+		params.setAppointment(appointment);
+		params.setFetchIdentities(true);
+		params.setFetchUser(true);
+		participations = appointmentsService.getParticipations(params);
+		
+		List<Identity> participationIdentities = new ArrayList<>(participations.size());
+		participationIdentityKeys = new ArrayList<>(participations.size());
+		for (Participation participation : participations) {
+			Identity identity = participation.getIdentity();
+			participationIdentities.add(identity);
+			participationIdentityKeys.add(identity.getKey());
+		}
+		
+		Set<Identity> allIdentities = new HashSet<>();
+		allIdentities.addAll(participationIdentities);
+		allIdentities.addAll(restrictedIdentities);
+		
+		List<UserPropertiesRow> rows = new ArrayList<>(allIdentities.size());
+		for (Identity identity : allIdentities) {
+			rows.add(new UserPropertiesRow(identity, userPropertyHandlers, getLocale()));
+		}
+		
+		usersTableModel.setObjects(rows);
+		usersTableEl.reset(true, true, true);
+	
+		Set<Integer> selectedRows = new HashSet<>();
+		for(int i=usersTableModel.getRowCount(); i--> 0; ) {
+			UserPropertiesRow row = usersTableModel.getObject(i);
+			if(participationIdentityKeys.contains(row.getIdentityKey())) {
+				selectedRows.add(Integer.valueOf(i));
+			}
+		}
+		usersTableEl.setMultiSelectedIndex(selectedRows);
+	}
+	
+	@Override
+	protected void formCancelled(UserRequest ureq) {
+		fireEvent(ureq, FormEvent.CANCELLED_EVENT);
+	}
+
+	@Override
+	protected void formOK(UserRequest ureq) {
+		Set<Integer> index = usersTableEl.getMultiSelectedIndex();
+		List<Long> selectedIdentityKeys = new ArrayList<>(index.size());
+		for (Integer i : index) {
+			UserPropertiesRow row = usersTableModel.getObject(i.intValue());
+			selectedIdentityKeys.add(row.getIdentityKey());
+		}
+		
+		Collection<Long> addedIdentityKeys = new ArrayList<>();
+		for (Long selectedKey : selectedIdentityKeys) {
+			if (!participationIdentityKeys.contains(selectedKey)) {
+				addedIdentityKeys.add(selectedKey);
+			}
+		}
+		Collection<Identity> identities = securityManager.loadIdentityByKeys(addedIdentityKeys);
+		appointmentsService.createParticipations(appointment, identities, getIdentity(), topic.isMultiParticipation(),
+				topic.isAutoConfirmation());
+		
+		List<Participation> unselectedParticipations = new ArrayList<>();
+		for (Participation participation : participations) {
+			Long identityKey = participation.getIdentity().getKey();
+			if (!selectedIdentityKeys.contains(identityKey)) {
+				unselectedParticipations.add(participation);
+			}
+		}
+		appointmentsService.deleteParticipations(unselectedParticipations);
+		
+		appointmentsService.confirmAppointment(appointment);
+		
+		fireEvent(ureq, FormEvent.DONE_EVENT);
+	}
+
+	@Override
+	protected void doDispose() {
+		//
+	}
+
+}
diff --git a/src/main/java/org/olat/course/nodes/appointments/ui/TopicGroupsController.java b/src/main/java/org/olat/course/nodes/appointments/ui/TopicGroupsController.java
index fadf59ef847b1ff261b9926fe42949988ada99e0..6a64ecbe4b01caa471456ddff219606ac9fa9cf4 100644
--- a/src/main/java/org/olat/course/nodes/appointments/ui/TopicGroupsController.java
+++ b/src/main/java/org/olat/course/nodes/appointments/ui/TopicGroupsController.java
@@ -233,7 +233,7 @@ public class TopicGroupsController extends FormBasicController {
 		
 		usersTableModel = new UserRestrictionTableModel(columnsModel, getLocale()); 
 		usersTableEl = uifactory.addTableElement(getWindowControl(), "users", usersTableModel, 20, false, getTranslator(), usersLayout);
-		usersTableEl.setAndLoadPersistedPreferences(ureq, "");
+		usersTableEl.setAndLoadPersistedPreferences(ureq, "topic.groups.users");
 		usersTableEl.setEmtpyTableMessageKey("groups.users.empty.table");
 		usersTableEl.setSelectAllEnable(true);
 		usersTableEl.setMultiSelect(true);
diff --git a/src/main/java/org/olat/course/nodes/appointments/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/nodes/appointments/ui/_i18n/LocalStrings_de.properties
index b0b2ee2f5995ae71d84456e1a0cec690a831465d..317e2b8cb89987b7ee05b695963a13b7958f6aac 100644
--- a/src/main/java/org/olat/course/nodes/appointments/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/course/nodes/appointments/ui/_i18n/LocalStrings_de.properties
@@ -75,6 +75,8 @@ error.user.remove.atleastone=Sie m\u00fcssen mindestens einen Benutzer ausw\u00e
 filter.all=Alle anzeigen
 filter.future=Zuk\u00fcnftig
 filter.participated=Ausgew\u00e4hlt
+finding.confirmation.empty.table=Es haben keine Teilnehmer diesen Termin ausgew\u00e4hlt.
+finding.confirmation.info=Wollen Sie diesen Termin wirklich best\u00e4tigen?<br><br>In der Liste unten siehen Sie, welche Teilnehmer diesen Termin gew\u00e4hlt haben. Sie k\u00f6nnen weitere Teilnehmer zum Termin hinzuf\u00fcgen oder Teilnehmer aus dem Termin entfernen.
 full.day=Ganzer Tag
 groups.business.groups=Gruppenteilnehmer
 groups.course=Kursteilnehmer
diff --git a/src/main/java/org/olat/course/nodes/appointments/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/nodes/appointments/ui/_i18n/LocalStrings_en.properties
index b71e69c5c7ed4ff8310f725b2fa7603f756cda19..3ac5e6f017767344df349b026c57b2a6bb740691 100644
--- a/src/main/java/org/olat/course/nodes/appointments/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/course/nodes/appointments/ui/_i18n/LocalStrings_en.properties
@@ -74,6 +74,8 @@ error.user.remove.atleastone=You have to select at least one user.
 filter.all=Show all
 filter.future=Future
 filter.participated=Selected
+finding.confirmation.empty.table=No participants could select this appointment.
+finding.confirmation.info=Do you really want to confirm this appointment?<br><br>In the list below you can see which participants have chosen this appointment. You can add more participants to the appointment or remove participants from the appointment.
 full.day=Full day
 groups.business.groups=Group participants
 groups.course=Course participants
diff --git a/src/test/java/org/olat/basesecurity/manager/GroupDAOTest.java b/src/test/java/org/olat/basesecurity/manager/GroupDAOTest.java
index 5febf6910c3cff3ccf1f5c66fa1100ed458d3bc8..e9a3383b892a8dec97aa39b9bea0e09ebd1f9521 100644
--- a/src/test/java/org/olat/basesecurity/manager/GroupDAOTest.java
+++ b/src/test/java/org/olat/basesecurity/manager/GroupDAOTest.java
@@ -19,6 +19,8 @@
  */
 package org.olat.basesecurity.manager;
 
+import static java.util.Arrays.asList;
+
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
@@ -171,6 +173,26 @@ public class GroupDAOTest extends OlatTestCase {
 		Assert.assertEquals(1, members.size());
 	}
 	
+	@Test
+	public void getMembersOfGroupCollection() {
+		Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("bgrp-3a-1");
+		Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("bgrp-3a-2");
+		Identity id3 = JunitTestHelper.createAndPersistIdentityAsRndUser("bgrp-3a-3");
+		Identity id4 = JunitTestHelper.createAndPersistIdentityAsRndUser("bgrp-3a-4");
+		Group group1 = groupDao.createGroup();
+		Group group2 = groupDao.createGroup();
+		groupDao.addMembershipTwoWay(group1, id1, "author");
+		groupDao.addMembershipTwoWay(group1, id2, "author");
+		groupDao.addMembershipTwoWay(group2, id1, "author");
+		groupDao.addMembershipTwoWay(group2, id3, "author");
+		groupDao.addMembershipTwoWay(group2, id4, "participant");
+		dbInstance.commitAndCloseSession();
+		
+		List<Identity> members = groupDao.getMembers(asList(group1, group2), "author");
+		Assert.assertNotNull(members);
+		Assert.assertEquals(3, members.size());
+	}
+	
 	@Test
 	public void countMembers() {
 		Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("bgrp-4-");
diff --git a/src/test/java/org/olat/course/nodes/appointments/manager/TopicToGroupDAOTest.java b/src/test/java/org/olat/course/nodes/appointments/manager/TopicToGroupDAOTest.java
index 5686de95663225eb6c78bb8f627fd6700ca945ba..89ebf3ae97b305ca7851f7cace574d72df22bdb6 100644
--- a/src/test/java/org/olat/course/nodes/appointments/manager/TopicToGroupDAOTest.java
+++ b/src/test/java/org/olat/course/nodes/appointments/manager/TopicToGroupDAOTest.java
@@ -187,6 +187,24 @@ public class TopicToGroupDAOTest extends OlatTestCase {
 				.doesNotContain(topicToGroup21);
 	}
 	
+	@Test
+	public void shouldLoadGroupCountByTopic() {
+		RepositoryEntry entry1 = JunitTestHelper.createAndPersistRepositoryEntry();
+		Topic topic1 = appointmentsService.createTopic(entry1, random());
+		Topic topic2 = appointmentsService.createTopic(entry1, random());
+		Group group11 = groupDAO.createGroup();
+		Group group12 = groupDAO.createGroup();
+		Group group21 = groupDAO.createGroup();
+		sut.create(topic1, group11);
+		sut.create(topic1, group12);
+		sut.create(topic2, group21);
+		dbInstance.commitAndCloseSession();
+		
+		Long count = sut.loadGroupCount(topic1);
+		
+		assertThat(count).isEqualTo(2);
+	}
+	
 	@Test
 	public void shouldLoadGroupsByTopic() {
 		RepositoryEntry entry1 = JunitTestHelper.createAndPersistRepositoryEntry();