diff --git a/src/main/java/org/olat/admin/user/imp/ImportStep00.java b/src/main/java/org/olat/admin/user/imp/ImportStep00.java
index 73f7b1642371ecb68d1d772a038123328eff3ea0..07b01ba2d231ea083c7001f26893d659717ff71e 100644
--- a/src/main/java/org/olat/admin/user/imp/ImportStep00.java
+++ b/src/main/java/org/olat/admin/user/imp/ImportStep00.java
@@ -26,6 +26,7 @@ package org.olat.admin.user.imp;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -369,8 +370,14 @@ class ImportStep00 extends BasicStep {
 				// check that no user with same (institutional) e-mail is already in OLAT
 				if ( (thisKey.equals(UserConstants.INSTITUTIONALEMAIL) || thisKey.equals(UserConstants.EMAIL)) && !thisValue.isEmpty() ) {
 					// check that no user with same email is already in OLAT
-					Identity identity = UserManager.getInstance().findIdentityByEmail(thisValue);
-					if (identity != null && !ud.equals(identity)) {
+					List<Identity> identities = UserManager.getInstance().findIdentitiesByEmail(Collections.singletonList(thisValue));
+					if(identities.size() > 1) {
+						textAreaElement.setErrorKey("error.email.douplicate", new String[] { String.valueOf(i + 1), thisValue });
+						importDataError = true;
+						break;
+					}
+					
+					if (identities.size() == 1 && !ud.equals(identities.get(0))) {
 						textAreaElement.setErrorKey("error.email.exists", new String[] { String.valueOf(i + 1), thisValue });
 						importDataError = true;
 						break;
diff --git a/src/main/java/org/olat/ims/qti/process/QTIHelper.java b/src/main/java/org/olat/ims/qti/process/QTIHelper.java
index fb570c381e4869224993e05f72ca407b98dd816a..70a37eacbb02bcb08aad17015393a20aa20d9ba8 100644
--- a/src/main/java/org/olat/ims/qti/process/QTIHelper.java
+++ b/src/main/java/org/olat/ims/qti/process/QTIHelper.java
@@ -440,8 +440,6 @@ public class QTIHelper {
 			// we use a putSilent here (no invalidation notifications to other cluster nodes), since
 			// we did not generate new data, but simply asked to reload it. 
 			ehCachLoadedQTIDocs.put(key, new Object[] { lmf, doc });
-			log.audit("load, parse and cache Document for [[" + key + "]]");
-
 			if (isDebugEnabled) {
 				log.debug("[" + debugEnabledTime + "] Document loaded, parsed and put into cache!");
 				log.debug("[" + debugEnabledTime + "] Document approx Mem usage " + ObjectCloner.getObjectSize(doc));
diff --git a/src/main/java/org/olat/modules/fo/FilterForUserController.java b/src/main/java/org/olat/modules/fo/FilterForUserController.java
index ba33f14ca126928a9533072d8e86669e5fea387b..d7aa7f65b3886d05064b5d69e35cba8c1ddc68d7 100644
--- a/src/main/java/org/olat/modules/fo/FilterForUserController.java
+++ b/src/main/java/org/olat/modules/fo/FilterForUserController.java
@@ -34,7 +34,6 @@ import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.fullWebApp.popup.BaseFullWebappPopupLayoutFactory;
 import org.olat.core.commons.modules.bc.meta.MetaInfo;
 import org.olat.core.commons.modules.bc.meta.tagged.MetaTagged;
-import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
 import org.olat.core.commons.services.mark.Mark;
 import org.olat.core.commons.services.mark.MarkResourceStat;
 import org.olat.core.commons.services.mark.MarkingService;
@@ -75,6 +74,7 @@ import org.olat.core.logging.AssertException;
 import org.olat.core.util.Formatter;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.resource.OresHelper;
+import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.core.util.vfs.VFSMediaResource;
@@ -476,7 +476,7 @@ public class FilterForUserController extends BasicController {
 		map.put("modified", dateFormat.format(m.getLastModified()));
 		// message attachments
 		ForumManager fm = ForumManager.getInstance();
-		OlatRootFolderImpl msgContainer = fm.getMessageContainer(forum.getKey(), m.getKey());
+		VFSContainer msgContainer = fm.getMessageContainer(forum.getKey(), m.getKey());
 		map.put("messageContainer", msgContainer);
 		List<VFSItem> attachments = new ArrayList<VFSItem>(msgContainer.getItems(new VFSItemExcludePrefixFilter(MessageEditController.ATTACHMENT_EXCLUDE_PREFIXES)));
 //		List attachments = msgContainer.getItems();
diff --git a/src/main/java/org/olat/modules/fo/ForumController.java b/src/main/java/org/olat/modules/fo/ForumController.java
index 436719b2a18231e2b845ef98a9f08448ad99879c..3967c45039d662645a0ff0e1596915be49fa8f40 100644
--- a/src/main/java/org/olat/modules/fo/ForumController.java
+++ b/src/main/java/org/olat/modules/fo/ForumController.java
@@ -1229,7 +1229,7 @@ public class ForumController extends BasicController implements GenericEventList
 		map.put("lastname", Formatter.truncate(creator.getUser().getProperty(UserConstants.LASTNAME, ureq.getLocale()),18));
 		map.put("modified", f.formatDateAndTime(m.getLastModified()));
 		// message attachments
-		OlatRootFolderImpl msgContainer = fm.getMessageContainer(forum.getKey(), m.getKey());
+		VFSContainer msgContainer = fm.getMessageContainer(forum.getKey(), m.getKey());
 		map.put("messageContainer", msgContainer);
 		final List<VFSItem> attachments = new ArrayList<VFSItem>(msgContainer.getItems(new VFSItemExcludePrefixFilter(MessageEditController.ATTACHMENT_EXCLUDE_PREFIXES)));				
 		map.put("attachments", attachments);
diff --git a/src/main/java/org/olat/modules/fo/ForumManager.java b/src/main/java/org/olat/modules/fo/ForumManager.java
index 05be5bc980b3cb62cb05b2fa557ccfc887f0e3bd..4bcea1c544007638b08d96654bc6f0818a4ef41c 100644
--- a/src/main/java/org/olat/modules/fo/ForumManager.java
+++ b/src/main/java/org/olat/modules/fo/ForumManager.java
@@ -25,7 +25,6 @@
 
 package org.olat.modules.fo;
 
-import java.io.File;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashSet;
@@ -48,7 +47,8 @@ import org.olat.core.commons.services.text.TextService;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.logging.AssertException;
-import org.olat.core.manager.BasicManager;
+import org.olat.core.logging.OLog;
+import org.olat.core.logging.Tracing;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.core.util.vfs.VFSContainer;
@@ -61,7 +61,8 @@ import org.springframework.stereotype.Service;
  * @author Felix Jost
  */
 @Service
-public class ForumManager extends BasicManager {
+public class ForumManager {
+	private static final OLog log = Tracing.createLoggerFor(ForumManager.class);
 	
 	private static ForumManager INSTANCE;
 	@Autowired
@@ -104,7 +105,7 @@ public class ForumManager extends BasicManager {
 	
 	public List<Message> getThread(Long msgid, int firstResult, int maxResults, Message.OrderBy orderBy, boolean asc) {
 		long rstart = 0;
-		if (isLogDebugEnabled()){
+		if (log.isDebug()){
 			rstart = System.currentTimeMillis();
 		}
 		
@@ -124,9 +125,9 @@ public class ForumManager extends BasicManager {
 		}
 		
 		List<Message> messages = dbQuery.list();
-		if (isLogDebugEnabled()){
+		if (log.isDebug()){
 			long rstop = System.currentTimeMillis();
-			logDebug("time to fetch thread with topmsg_id " + msgid + " :" + (rstop - rstart), null);
+			log.debug("time to fetch thread with topmsg_id " + msgid + " :" + (rstop - rstart), null);
 		}
 		return messages;
 	}
@@ -201,7 +202,7 @@ public class ForumManager extends BasicManager {
 	 */
 	private List<Message> getMessagesByForumID(Long forum_id, int firstResult, int maxResults, boolean onlyThreads, Message.OrderBy orderBy, boolean asc) {
 		long rstart = 0;
-		if(isLogDebugEnabled()){
+		if(log.isDebug()){
 			rstart = System.currentTimeMillis();
 		}
 		
@@ -224,9 +225,9 @@ public class ForumManager extends BasicManager {
 		}
 		
 		List<Message> messages = dbQuery.list();
-		if(isLogDebugEnabled()){
+		if(log.isDebug()){
 			long rstop = System.currentTimeMillis();
-			logDebug("time to fetch forum with forum_id " + forum_id + " :" + (rstop - rstart), null);
+			log.debug("time to fetch forum with forum_id " + forum_id + " :" + (rstop - rstart), null);
 		}
 		return messages;
 	}
@@ -483,8 +484,8 @@ public class ForumManager extends BasicManager {
 		OLATResourceable ores = OresHelper.createOLATResourceableInstance(Forum.class, forumKey);
 		markingService.getMarkManager().deleteMarks(ores, m.getKey().toString());
 		
-		if(isLogDebugEnabled()){
-			logDebug("Deleting message ", m.getKey().toString());
+		if(log.isDebug()){
+			log.debug("Deleting message ", m.getKey().toString());
 		}
 	}
 
@@ -530,25 +531,22 @@ public class ForumManager extends BasicManager {
 	 * @param messageKey
 	 * @return the valid container for the attachments to place into
 	 */
-	public OlatRootFolderImpl getMessageContainer(Long forumKey, Long messageKey) {
-		String fKey = forumKey.toString();
-		String mKey = messageKey.toString();
-		StringBuilder sb = new StringBuilder();
-		sb.append("/forum/");
-		sb.append(fKey);
-		sb.append("/");
-		sb.append(mKey);
-		String pathToMsgDir = sb.toString();
-		OlatRootFolderImpl messageContainer = new OlatRootFolderImpl(pathToMsgDir, null);
-		File baseFile = messageContainer.getBasefile();
-		baseFile.mkdirs();
-		return messageContainer;
+	public VFSContainer getMessageContainer(Long forumKey, Long messageKey) {
+		VFSContainer forumContainer = getForumContainer(forumKey);
+		VFSItem messageContainer = forumContainer.resolve(messageKey.toString());
+		if(messageContainer == null) {
+			return forumContainer.createChildContainer(messageKey.toString());
+		} else if(messageContainer instanceof VFSContainer) {
+			return (VFSContainer)messageContainer;
+		}
+		log.error("The following message container is not a directory: " + messageContainer);
+		return null;
 	}
 	
 	private void moveMessageContainer(Long fromForumKey, Long fromMessageKey, Long toForumKey, Long toMessageKey) {
 		// copy message container
-		OlatRootFolderImpl toMessageContainer = getMessageContainer(toForumKey, toMessageKey);
-		OlatRootFolderImpl fromMessageContainer = getMessageContainer(fromForumKey, fromMessageKey);
+		VFSContainer toMessageContainer = getMessageContainer(toForumKey, toMessageKey);
+		VFSContainer fromMessageContainer = getMessageContainer(fromForumKey, fromMessageKey);
 		for (VFSItem vfsItem : fromMessageContainer.getItems()) {
 			toMessageContainer.copyFrom(vfsItem);
 		}
@@ -564,16 +562,16 @@ public class ForumManager extends BasicManager {
 		fContainer.delete();
 	}
 
-	private OlatRootFolderImpl getForumContainer(Long forumKey) {
-		String fKey = forumKey.toString();
-		StringBuilder sb = new StringBuilder();
-		sb.append("/forum/");
-		sb.append(fKey);
-		String pathToForumDir = sb.toString();
-		OlatRootFolderImpl fContainer = new OlatRootFolderImpl(pathToForumDir, null);
-		File baseFile = fContainer.getBasefile();
-		baseFile.mkdirs();
-		return fContainer;
+	private VFSContainer getForumContainer(Long forumKey) {
+		OlatRootFolderImpl fContainer = new OlatRootFolderImpl("/forum", null);
+		VFSItem forumContainer = fContainer.resolve(forumKey.toString());
+		if(forumContainer == null) {
+			return fContainer.createChildContainer(forumKey.toString());
+		} else if(forumContainer instanceof VFSContainer) {
+			return (VFSContainer)forumContainer;
+		}
+		log.error("The following forum container is not a directory: " + forumContainer);
+		return null;
 	}
 	
 	/**
diff --git a/src/main/java/org/olat/modules/fo/MessageEditController.java b/src/main/java/org/olat/modules/fo/MessageEditController.java
index e057a0fe33e85f8af57f3f7bf70a8c7d700ddef6..8c0bcf16d587524811463bde6244222351a71691 100644
--- a/src/main/java/org/olat/modules/fo/MessageEditController.java
+++ b/src/main/java/org/olat/modules/fo/MessageEditController.java
@@ -228,7 +228,7 @@ public class MessageEditController extends FormBasicController {
 		List<VFSItem> attachments = new ArrayList<VFSItem>();
 		// add already existing attachments:
 		if (message.getKey() != null) {
-			OlatRootFolderImpl msgContainer = fm.getMessageContainer(message.getForum().getKey(), message.getKey());
+			VFSContainer msgContainer = fm.getMessageContainer(message.getForum().getKey(), message.getKey());
 			attachments.addAll(msgContainer.getItems(exclFilter));
 		}
 		// add files from TempFolder
@@ -328,7 +328,7 @@ public class MessageEditController extends FormBasicController {
 						fileExists = true;
 					}
 					if (message.getKey() != null) {
-						OlatRootFolderImpl msgContainer = fm.getMessageContainer(message.getForum().getKey(), message.getKey());
+						VFSContainer msgContainer = fm.getMessageContainer(message.getForum().getKey(), message.getKey());
 						if (msgContainer.resolve(fileName) != null) {
 							fileExists = true;
 						}
@@ -459,7 +459,7 @@ public class MessageEditController extends FormBasicController {
 	 */
 	public void persistTempUploadedFiles(Message tmpMessage) {
 		if (tmpMessage == null) throw new AssertException("Message may not be null to persist temp files");
-		OlatRootFolderImpl msgContainer = fm.getMessageContainer(message.getForum().getKey(), message.getKey());
+		VFSContainer msgContainer = fm.getMessageContainer(message.getForum().getKey(), message.getKey());
 		if (msgContainer != null) {
 			List<VFSItem> tmpFList = getTempFolderFileList();
 			for (VFSItem file : tmpFList) {
@@ -472,11 +472,7 @@ public class MessageEditController extends FormBasicController {
 					);
 				} catch (IOException e) {
 					removeTempUploadedFiles();
-					throw new RuntimeException (
-							"I/O error saving uploaded file:"
-							+msgContainer.getBasefile().getAbsolutePath()
-							+File.separator +leaf.getName()
-					);
+					throw new RuntimeException ("I/O error saving uploaded file:" + msgContainer + "/" + leaf.getName());
 				}
 			}
 		}
diff --git a/src/main/java/org/olat/modules/fo/archiver/formatters/ForumRTFFormatter.java b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumRTFFormatter.java
index a1b8f0c290a18ab82d5dd90d787a93feceefdbfd..e7939387212bea9146637b291ec0e58eb03540f6 100644
--- a/src/main/java/org/olat/modules/fo/archiver/formatters/ForumRTFFormatter.java
+++ b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumRTFFormatter.java
@@ -157,7 +157,7 @@ public class ForumRTFFormatter extends ForumFormatter {
 		}
 		sb.append(" \\par}");
 		// attachment(s)
-		OlatRootFolderImpl msgContainer = fm.getMessageContainer(getForumKey(), mn.getKey());
+		VFSContainer msgContainer = fm.getMessageContainer(getForumKey(), mn.getKey());
 		List<VFSItem> attachments = msgContainer.getItems();
 		if (attachments != null && attachments.size() > 0){
 			VFSItem item = container.resolve("attachments");
diff --git a/src/main/java/org/olat/modules/fo/archiver/formatters/ForumStreamedRTFFormatter.java b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumStreamedRTFFormatter.java
index 582272afcb09e2a0c580e0742b5d010fb9656695..ea3c1df4ca2637791b7eea3ab6e7cfe082ad9f00 100644
--- a/src/main/java/org/olat/modules/fo/archiver/formatters/ForumStreamedRTFFormatter.java
+++ b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumStreamedRTFFormatter.java
@@ -38,7 +38,6 @@ import java.util.zip.ZipOutputStream;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringEscapeUtils;
-import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
 import org.olat.core.id.Identity;
 import org.olat.core.id.UserConstants;
 import org.olat.core.logging.AssertException;
@@ -48,6 +47,7 @@ import org.olat.core.util.WebappHelper;
 import org.olat.core.util.ZipUtil;
 import org.olat.core.util.filter.FilterFactory;
 import org.olat.core.util.nodes.INode;
+import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
 import org.olat.modules.fo.ForumManager;
 import org.olat.modules.fo.MessageNode;
@@ -143,7 +143,7 @@ public class ForumStreamedRTFFormatter extends ForumFormatter {
 		}
 		sb.append(" \\par}");
 		// attachment(s)
-		OlatRootFolderImpl msgContainer = fm.getMessageContainer(getForumKey(), mn.getKey());
+		VFSContainer msgContainer = fm.getMessageContainer(getForumKey(), mn.getKey());
 		List<VFSItem> attachments = msgContainer.getItems();
 		if (attachments != null && attachments.size() > 0){
 			sb.append("{\\pard \\f0\\fs15 Attachment(s): ");
diff --git a/src/main/java/org/olat/modules/fo/portfolio/ForumArtefactHandler.java b/src/main/java/org/olat/modules/fo/portfolio/ForumArtefactHandler.java
index a76db64d7af6fbeb0254ac9d454c7eab68a07cee..18d501539967343511c9650eadab7467eec9b153 100755
--- a/src/main/java/org/olat/modules/fo/portfolio/ForumArtefactHandler.java
+++ b/src/main/java/org/olat/modules/fo/portfolio/ForumArtefactHandler.java
@@ -21,11 +21,11 @@ package org.olat.modules.fo.portfolio;
 
 import java.util.List;
 
-import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.id.OLATResourceable;
+import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
 import org.olat.modules.fo.ForumManager;
 import org.olat.modules.fo.Message;
@@ -56,7 +56,7 @@ public class ForumArtefactHandler extends EPAbstractHandler<ForumArtefact> {
 			String thread = fm.getThreadtop() != null ? fm.getThreadtop().getTitle() + " - " : "";
 			artefact.setTitle(thread + fm.getTitle());
 			
-			OlatRootFolderImpl msgContainer = fMgr.getMessageContainer(fm.getForum().getKey(), fm.getKey());
+			VFSContainer msgContainer = fMgr.getMessageContainer(fm.getForum().getKey(), fm.getKey());
 			if (msgContainer != null) {
 				List<VFSItem> foAttach = msgContainer.getItems();
 				if (foAttach.size()!=0){