diff --git a/src/main/java/org/olat/core/commons/services/webdav/servlets/WebDAVDispatcherImpl.java b/src/main/java/org/olat/core/commons/services/webdav/servlets/WebDAVDispatcherImpl.java
index 371b0853f6e74ba118e4c657f24496dfdff0741e..663f984779f101650d914455e76f6343a490f4f9 100644
--- a/src/main/java/org/olat/core/commons/services/webdav/servlets/WebDAVDispatcherImpl.java
+++ b/src/main/java/org/olat/core/commons/services/webdav/servlets/WebDAVDispatcherImpl.java
@@ -470,7 +470,7 @@ public class WebDAVDispatcherImpl
         throws ServletException, IOException {
 
         String path = getRelativePath(req);
-        if (path.endsWith("/"))
+        if (path.length() > 1 && path.endsWith("/"))
             path = path.substring(0, path.length() - 1);
 
         // Properties which are to be displayed.
diff --git a/src/main/java/org/olat/core/util/vfs/MergeSource.java b/src/main/java/org/olat/core/util/vfs/MergeSource.java
index 5082df681c34a56585b3598278b1f972a01dd6c1..10eedc406b42bdc64792bc03fb348eb4246ef037 100644
--- a/src/main/java/org/olat/core/util/vfs/MergeSource.java
+++ b/src/main/java/org/olat/core/util/vfs/MergeSource.java
@@ -69,6 +69,10 @@ public class MergeSource extends AbstractVirtualContainer {
 			mergedContainersChildren = new ArrayList<VFSContainer>(2);
 		}
 	}
+	
+	protected void setMergedContainers(List<VFSContainer> mergedContainers) {
+		this.mergedContainers = mergedContainers;
+	}
 
 	@Override
 	public boolean exists() {
@@ -81,8 +85,12 @@ public class MergeSource extends AbstractVirtualContainer {
 	 * @param container
 	 */
 	public void addContainer(VFSContainer container) {
+		addContainerToList(container, mergedContainers);
+	}
+	
+	public void addContainerToList(VFSContainer container, List<VFSContainer> containers) {
 		VFSContainer newContainer = container;
-		if (isContainerNameTaken(newContainer.getName())) {
+		if (isContainerNameTaken(newContainer.getName(), containers)) {
 			String newName = newContainer.getName() + "_" + CodeHelper.getRAMUniqueID();
 			newContainer = new NamedContainerImpl(newName, container);
 		}
@@ -92,7 +100,7 @@ public class MergeSource extends AbstractVirtualContainer {
 			newContainer.setDefaultItemFilter(defaultFilter);
 		}
 		newContainer.setParentContainer(this);
-		mergedContainers.add(newContainer);
+		containers.add(newContainer);
 	}
 	
 	/**
@@ -295,14 +303,13 @@ public class MergeSource extends AbstractVirtualContainer {
 		return rootWriteContainer;
 	}
 	
-	private boolean isContainerNameTaken(String containerName) {
-		for (Iterator<VFSContainer> iter = mergedContainers.iterator(); iter.hasNext();) {
-			VFSContainer mergedContainer = iter.next();
-			if (mergedContainer.getName().equals(containerName)) return true;
-			
+	private boolean isContainerNameTaken(String containerName, List<VFSContainer> containers) {
+		for (Iterator<VFSContainer> iter = containers.iterator(); iter.hasNext();) {
+			VFSContainer container = iter.next();
+			if (container.getName().equals(containerName)) {
+				return true;
+			}
 		}
 		return false;
 	}
-
 }
-
diff --git a/src/main/java/org/olat/course/CoursefolderWebDAVMergeSource.java b/src/main/java/org/olat/course/CoursefolderWebDAVMergeSource.java
index 439f0e9d043c8376fb3262d33f88e6467aa68e80..0e778b9e39a863d1382ce6b82991452bb8ff4282 100644
--- a/src/main/java/org/olat/course/CoursefolderWebDAVMergeSource.java
+++ b/src/main/java/org/olat/course/CoursefolderWebDAVMergeSource.java
@@ -19,6 +19,7 @@
  */
 package org.olat.course;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.olat.core.id.Identity;
@@ -26,6 +27,7 @@ import org.olat.core.util.Formatter;
 import org.olat.core.util.vfs.MergeSource;
 import org.olat.core.util.vfs.NamedContainerImpl;
 import org.olat.core.util.vfs.VFSConstants;
+import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
 import org.olat.core.util.vfs.VFSManager;
 import org.olat.core.util.vfs.VFSStatus;
@@ -128,12 +130,14 @@ class CoursefolderWebDAVMergeSource extends MergeSource {
 		super.init();
 		RepositoryManager rm = RepositoryManager.getInstance();
 		List<RepositoryEntry> courseEntries = rm.queryByEditor(identity, CourseModule.getCourseTypeName());
+		List<VFSContainer> containers = new ArrayList<>();
 		// Add all found repo entries to merge source
 		for (RepositoryEntry re:courseEntries) {
 			String courseTitle = Formatter.makeStringFilesystemSave(re.getDisplayname());
 			NamedContainerImpl cfContainer = new CoursefolderWebDAVNamedContainer(courseTitle, re.getOlatResource());
-			addContainer(cfContainer);
+			addContainerToList(cfContainer, containers);
 		}
+		setMergedContainers(containers);
 		loadTime = System.currentTimeMillis();
 		init = true;
 	}
diff --git a/src/main/java/org/olat/group/GroupfoldersWebDAVMergeSource.java b/src/main/java/org/olat/group/GroupfoldersWebDAVMergeSource.java
index 1e46dfbb3b819fb57913093d82399eb7344269f7..fbcb57481464413d63393ee3e66261a321298cda 100644
--- a/src/main/java/org/olat/group/GroupfoldersWebDAVMergeSource.java
+++ b/src/main/java/org/olat/group/GroupfoldersWebDAVMergeSource.java
@@ -19,6 +19,7 @@
  */
 package org.olat.group;
 
+import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -143,29 +144,34 @@ class GroupfoldersWebDAVMergeSource extends MergeSource {
 	@Override
 	protected void init() {
 		super.init();
-	// collect buddy groups
+
+		// collect buddy groups
 		BusinessGroupService bgs = CoreSpringFactory.getImpl(BusinessGroupService.class);
 
 		Set<Long> addedGroupKeys = new HashSet<Long>();
 		Set<String> addedGroupNames = new HashSet<String>();
+		List<VFSContainer> containers = new ArrayList<>();
 		
 		SearchBusinessGroupParams params = new SearchBusinessGroupParams(identity, true, false);
 		params.addTools(CollaborationTools.TOOL_FOLDER);
 		List<BusinessGroup> tutorGroups = bgs.findBusinessGroups(params, null, 0, -1);
 		for (BusinessGroup group : tutorGroups) {
-			addContainer(group, addedGroupKeys, addedGroupNames, true);
+			addContainer(group, addedGroupKeys, addedGroupNames, containers, true);
 		}
 
 		SearchBusinessGroupParams paramsParticipants = new SearchBusinessGroupParams(identity, false, true);
+		paramsParticipants.addTools(CollaborationTools.TOOL_FOLDER);
 		List<BusinessGroup> participantsGroups = bgs.findBusinessGroups(paramsParticipants, null, 0, -1);
 		for (BusinessGroup group : participantsGroups) {
-			addContainer(group, addedGroupKeys, addedGroupNames, false);
+			addContainer(group, addedGroupKeys, addedGroupNames, containers, false);
 		}
+		setMergedContainers(containers);
 		loadTime = System.currentTimeMillis();
 		init = true;
 	}
 	
-	private void addContainer(BusinessGroup group, Set<Long> addedGroupKeys, Set<String> addedGroupNames, boolean isOwner) {
+	private void addContainer(BusinessGroup group, Set<Long> addedGroupKeys, Set<String> addedGroupNames,
+			List<VFSContainer> containers, boolean isOwner) {
 		if(addedGroupKeys.contains(group.getKey())) {
 			return;
 		}
@@ -176,7 +182,7 @@ class GroupfoldersWebDAVMergeSource extends MergeSource {
 
 		VFSContainer grpContainer = getGroupContainer(name, group, isOwner);
 		// add container
-		addContainer(grpContainer);
+		addContainerToList(grpContainer, containers);
 		addedGroupKeys.add(group.getKey());
 	}
 	
@@ -231,7 +237,7 @@ class GroupfoldersWebDAVMergeSource extends MergeSource {
 		return grpContainer;
 	}
 	
-	private class FullAccessWithLazyQuotaCallback extends FullAccessWithQuotaCallback {
+	private static class FullAccessWithLazyQuotaCallback extends FullAccessWithQuotaCallback {
 		
 		private final String folderPath;
 		
diff --git a/src/main/java/org/olat/modules/sharedfolder/SharedFolderWebDAVMergeSource.java b/src/main/java/org/olat/modules/sharedfolder/SharedFolderWebDAVMergeSource.java
index ceaad730a90ea06fbe36ca9a71e0fcab0fa5250c..55e2e8a65593dfc2d87f628f491f545009db6691 100644
--- a/src/main/java/org/olat/modules/sharedfolder/SharedFolderWebDAVMergeSource.java
+++ b/src/main/java/org/olat/modules/sharedfolder/SharedFolderWebDAVMergeSource.java
@@ -23,9 +23,10 @@ import static org.olat.modules.sharedfolder.SharedFolderWebDAVProvider.readOnlyC
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
-import org.olat.core.commons.persistence.PersistenceHelper;
 import org.olat.core.id.Identity;
 import org.olat.core.id.Roles;
 import org.olat.core.logging.OLog;
@@ -147,41 +148,25 @@ public class SharedFolderWebDAVMergeSource extends MergeSource {
 		return shared;
 	}
 	
-	/**
-	 * Outsourced helper method for adding an entry to the root container.
-	 * 
-	 * @param rootContainer
-	 * @param sfm
-	 * @param ownerEntries
-	 * @param entry
-	 */
-	private void addReadonlyFolder(MergeSource rootContainer, RepositoryEntry entry, SharedFolderManager sfm,
-			List<RepositoryEntry> addedEntries) {
-		//
-		if (addedEntries == null || !PersistenceHelper.listContainsObjectByKey(addedEntries, entry)) {
-			// add the entry (readonly)
-			VFSContainer folder = sfm.getNamedSharedFolder(entry, true);
-			folder.setLocalSecurityCallback(readOnlyCallback);
-			rootContainer.addContainer(folder);
-			addedEntries.add(entry);
-		}
-	}
-	
 	@Override
 	protected void init() {
 		super.init();
 
 		SharedFolderManager sfm = SharedFolderManager.getInstance();
 		RepositoryManager repoManager = RepositoryManager.getInstance();
+		List<VFSContainer> containers = new ArrayList<>();
+		Set<Long> addedEntries = new HashSet<>();
 		List<RepositoryEntry> ownerEntries = (List<RepositoryEntry>) repoManager.queryByOwner(identity, SharedFolderFileResource.TYPE_NAME);
-		for (RepositoryEntry repoEntry : ownerEntries) {
-			addContainer(sfm.getNamedSharedFolder(repoEntry, true));
+		for (RepositoryEntry entry : ownerEntries) {
+			VFSContainer container = sfm.getNamedSharedFolder(entry, true);
+			addContainerToList(container, containers);
+			addedEntries.add(entry.getKey());
 		}
 
 		// see /olat3/webapp/WEB-INF/olat_extensions.xml
 		if (publiclyReadableFolders != null && publiclyReadableFolders.size() > 0) {
 			// Temporarily save added entries. This is needed to make sure not to add an entry twice.
-			List<RepositoryEntry> addedEntries = new ArrayList<RepositoryEntry>(ownerEntries);
+			
 			String firstItem = publiclyReadableFolders.get(0);
 			// If the first value in the list is '*', list all resource folders.
 			if (firstItem != null && firstItem.equals("*")) {
@@ -190,7 +175,7 @@ public class SharedFolderWebDAVMergeSource extends MergeSource {
 				List<String> types = Collections.singletonList(SharedFolderFileResource.TYPE_NAME);
 				List<RepositoryEntry> allEntries = repoManager.queryByTypeLimitAccess(identity, types, registeredUserRole);
 				for (RepositoryEntry entry : allEntries) {
-					addReadonlyFolder(this, entry, sfm, addedEntries);
+					addReadonlyFolder(entry, sfm, addedEntries, containers);
 				}
 			} else {
 				// only list the specified folders
@@ -199,7 +184,7 @@ public class SharedFolderWebDAVMergeSource extends MergeSource {
 				for (RepositoryEntry entry:entries) {
 					if (entry.getAccess() >= RepositoryEntry.ACC_USERS || (entry.getAccess() == RepositoryEntry.ACC_OWNERS && entry.isMembersOnly())) {
 						// add folder (which is a repo entry) to root container if not present
-						addReadonlyFolder(this, entry, sfm, addedEntries);
+						addReadonlyFolder(entry, sfm, addedEntries, containers);
 					} else {
 						log.warn("Access denied on entry::" + entry.getKey(), null);
 					}
@@ -207,9 +192,23 @@ public class SharedFolderWebDAVMergeSource extends MergeSource {
 			}
 		}
 
+		setMergedContainers(containers);
 		loadTime = System.currentTimeMillis();
 		init = true;
 	}
+
+	private void addReadonlyFolder(RepositoryEntry entry, SharedFolderManager sfm,
+			Set<Long> addedEntries, List<VFSContainer> containers) {
+		//
+		if (!addedEntries.contains(entry.getKey())) {
+			// add the entry (readonly)
+			VFSContainer folder = sfm.getNamedSharedFolder(entry, true);
+			folder.setLocalSecurityCallback(readOnlyCallback);
+			addContainerToList(folder, containers);
+			addedEntries.add(entry.getKey());
+		}
+	}
+	
 	
 	private List<Long> getSharedKeys() {
 		List<Long> publiclyReadableFoldersKeys = new ArrayList<Long>();