diff --git a/src/main/java/org/olat/course/CoursefolderWebDAVMergeSource.java b/src/main/java/org/olat/course/CoursefolderWebDAVMergeSource.java
index 062e2f20d4c0aa933380d0f86771c4e1cb24f0be..41eb961b6e8826cb2a964beb193f614d8f2ea310 100644
--- a/src/main/java/org/olat/course/CoursefolderWebDAVMergeSource.java
+++ b/src/main/java/org/olat/course/CoursefolderWebDAVMergeSource.java
@@ -74,20 +74,20 @@ class CoursefolderWebDAVMergeSource extends WebDAVMergeSource {
 		}
 		boolean prependReference = webDAVModule.isPrependCourseReferenceToTitle();
 		
-		Set<RepositoryEntry> duplicates = new HashSet<>();
+		UniqueNames container = new UniqueNames();
 		List<RepositoryEntry> editorEntries = repositoryManager.queryByOwner(getIdentity(), "CourseModule");
-		appendCourses(editorEntries, true, containers, useTerms, terms, noTermContainer, prependReference, duplicates);
+		appendCourses(editorEntries, true, containers, useTerms, terms, noTermContainer, prependReference, container);
 		
 		//add courses as participant and coaches
 		if(webDAVModule.isEnableLearnersParticipatingCourses()) {
 			List<RepositoryEntry> entries = repositoryManager.getLearningResourcesAsParticipantAndCoach(getIdentity(), "CourseModule");
-			appendCourses(entries, false, containers, useTerms, terms, noTermContainer, prependReference, duplicates);
+			appendCourses(entries, false, containers, useTerms, terms, noTermContainer, prependReference, container);
 		}
 		
 		//add bookmarked courses
 		if(webDAVModule.isEnableLearnersBookmarksCourse()) {
 			List<RepositoryEntry> bookmarkedEntries = repositoryManager.getLearningResourcesAsBookmark(getIdentity(), identityEnv.getRoles(), "CourseModule", 0, -1);
-			appendCourses(bookmarkedEntries, false, containers, useTerms, terms, noTermContainer, prependReference, duplicates);
+			appendCourses(bookmarkedEntries, false, containers, useTerms, terms, noTermContainer, prependReference, container);
 		}
 
 		if (useTerms) {
@@ -102,21 +102,19 @@ class CoursefolderWebDAVMergeSource extends WebDAVMergeSource {
 	
 	private void appendCourses(List<RepositoryEntry> courseEntries, boolean editor, List<VFSContainer> containers,
 			boolean useTerms, Map<String, VFSContainer> terms, VirtualContainer noTermContainer,
-			boolean prependReference, Set<RepositoryEntry> duplicates) {	
+			boolean prependReference, UniqueNames container) {	
 		
 		// Add all found repo entries to merge source
 		for (RepositoryEntry re:courseEntries) {
-			if(duplicates.contains(re)) {
+			if(container.isDuplicate(re)) {
 				continue;
 			}
-			duplicates.add(re);
 			
 			String displayName = re.getDisplayname();
 			if(prependReference && StringHelper.containsNonWhitespace(re.getExternalRef())) {
 				displayName = re.getExternalRef() + " " + displayName;
 			}
 			String courseTitle = RequestUtil.normalizeFilename(displayName);
-			NamedContainerImpl cfContainer = new CoursefolderWebDAVNamedContainer(courseTitle, re, editor ? null : identityEnv);
 			
 			if (useTerms) {
 				RepositoryEntryLifecycle lc = re.getLifecycle();
@@ -131,15 +129,73 @@ class CoursefolderWebDAVMergeSource extends WebDAVMergeSource {
 						terms.put(termSoftKey, termContainer);
 						addContainerToList(termContainer, containers);
 					}
+					
+					String name = container.getTermUniqueName(termSoftKey, courseTitle);
+					NamedContainerImpl cfContainer = new CoursefolderWebDAVNamedContainer(name, re, editor ? null : identityEnv);
 					termContainer.getItems().add(cfContainer);
 				} else {
 					// no semester term found, add to no-term folder
+					String name = container.getNoTermUniqueName(courseTitle);
+					NamedContainerImpl cfContainer = new CoursefolderWebDAVNamedContainer(name, re, editor ? null : identityEnv);
 					noTermContainer.getItems().add(cfContainer);
-				
 				}
 			} else {
-				addContainerToList(cfContainer, containers);				
+				String name = container.getContainersUniqueName(courseTitle);
+				NamedContainerImpl cfContainer = new CoursefolderWebDAVNamedContainer(name, re, editor ? null : identityEnv);
+				addContainerToList(cfContainer, containers);
 			}
 		}
 	}
+	
+	private static class UniqueNames {
+		
+		private final Set<RepositoryEntry> duplicates = new HashSet<>();
+		private final Set<String> containers = new HashSet<>();
+		private final Set<String> noTermContainer = new HashSet<>();
+		private final Map<String,Set<String>> termContainers = new HashMap<>();
+		
+		public boolean isDuplicate(RepositoryEntry re) {
+			boolean duplicate = duplicates.contains(re);
+			if(!duplicate) {
+				duplicates.add(re);
+			}
+			return duplicate;
+		}
+		
+		private String getTermUniqueName(String term, String courseTitle) {
+			String name = courseTitle;
+			if(termContainers.containsKey(term)) {
+				Set<String> termContainer = termContainers.get(term);
+				name = getUniqueName(courseTitle, termContainer);
+			} else {
+				Set<String> termContainer = new HashSet<>();
+				termContainer.add(courseTitle);
+				termContainers.put(term, termContainer);
+			}
+			return name;
+		}
+		
+		private String getNoTermUniqueName(String courseTitle) {
+			return getUniqueName(courseTitle, noTermContainer);
+		}
+		
+		private String getContainersUniqueName(String courseTitle) {
+			return getUniqueName(courseTitle, containers);
+		}
+		
+		private String getUniqueName(String name, Set<String> set) {
+			String uniqueName = name;
+			if(set.contains(name)) {
+				// attach a serial to the group name to avoid duplicate mount points...
+				int serial = 1;
+				while (set.contains(name + " " + serial) && serial < 255) {
+					serial++;
+				}
+				uniqueName = name + " " + serial;
+			}
+			set.add(uniqueName);
+			return uniqueName;
+		}
+		
+	}
 }
\ No newline at end of file