From e337c320966240d0f19e8e11312d45e58d61b0c2 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Mon, 28 May 2018 13:38:24 +0200
Subject: [PATCH] OO-3504: export forum messages of user

---
 .../model/CourseCreationConfiguration.java    |  35 ++-
 .../collaboration/CollaborationTools.java     |   6 +-
 .../olat/core/gui/DefaultGlobalSettings.java  |  38 +++
 .../gui/control/winmgr/WindowManagerImpl.java |   2 +-
 .../olat/course/nodes/DialogCourseNode.java   |   4 +-
 .../org/olat/course/nodes/FOCourseNode.java   |   6 +-
 .../QTI21ResultsExportMediaResource.java      |  34 +--
 .../modules/fo/ForumNotificationsHandler.java |   2 +-
 .../fo/archiver/ForumArchiveManager.java      |  27 +-
 .../formatters/ForumDownloadResource.java     |   5 +-
 .../formatters/ForumRTFFormatter.java         |   7 +-
 .../formatters/ForumStreamedRTFFormatter.java |   9 +-
 .../olat/modules/fo/manager/ForumManager.java |  30 ++-
 .../fo/manager/ForumUserDataManager.java      | 230 ++++++++++++++++++
 .../fo/manager/_content/export_message.html   |  36 +++
 .../fo/portfolio/ForumArtefactHandler.java    |   3 +-
 .../fo/restapi/ForumCourseNodeWebService.java |   5 +-
 .../fo/restapi/ForumImportWebService.java     |   3 +-
 .../modules/fo/restapi/ForumWebService.java   |   4 +-
 .../ui/export/ExportBinderAsCPResource.java   |  34 +--
 .../ui/export/ExportBinderAsPDFResource.java  |  34 +--
 .../olat/modules/wiki/WikiMainController.java |   6 +-
 ...PageChangeOrCreateNotificationHandler.java |   2 +-
 .../search/service/indexer/ForumIndexer.java  |   3 +-
 .../indexer/group/GroupForumIndexer.java      |   5 +-
 .../course/DialogCourseNodeIndexer.java       |   4 +-
 .../course/FOCourseNodeIndexer.java           |   5 +-
 .../ui/data/_i18n/LocalStrings_de.properties  |   3 +-
 .../ui/data/_i18n/LocalStrings_en.properties  |   1 +
 .../logging/activity/LoggingResourceable.java |   3 +-
 src/test/java/org/olat/restapi/ForumTest.java |  20 +-
 .../java/org/olat/restapi/GroupMgmtTest.java  |  38 +--
 .../org/olat/restapi/NotificationsTest.java   |   9 +-
 .../java/org/olat/restapi/UserMgmtTest.java   |  10 +-
 34 files changed, 441 insertions(+), 222 deletions(-)
 create mode 100644 src/main/java/org/olat/core/gui/DefaultGlobalSettings.java
 create mode 100644 src/main/java/org/olat/modules/fo/manager/ForumUserDataManager.java
 create mode 100644 src/main/java/org/olat/modules/fo/manager/_content/export_message.html

diff --git a/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/model/CourseCreationConfiguration.java b/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/model/CourseCreationConfiguration.java
index 5cfd5176fd4..50042b0cbd0 100644
--- a/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/model/CourseCreationConfiguration.java
+++ b/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/model/CourseCreationConfiguration.java
@@ -32,18 +32,21 @@
 
 package de.tuchemnitz.wizard.workflows.coursecreation.model;
 
-import org.apache.commons.io.IOUtils;
+import java.io.IOException;
+
 import org.apache.velocity.context.Context;
 import org.olat.core.commons.editor.htmleditor.WysiwygFactory;
+import org.olat.core.gui.DefaultGlobalSettings;
 import org.olat.core.gui.GlobalSettings;
 import org.olat.core.gui.components.velocity.VelocityContainer;
-import org.olat.core.gui.control.winmgr.AJAXFlags;
 import org.olat.core.gui.render.RenderResult;
 import org.olat.core.gui.render.Renderer;
 import org.olat.core.gui.render.StringOutput;
 import org.olat.core.gui.render.velocity.VelocityHelper;
 import org.olat.core.gui.render.velocity.VelocityRenderDecorator;
 import org.olat.core.gui.translator.Translator;
+import org.olat.core.logging.OLog;
+import org.olat.core.logging.Tracing;
 import org.olat.course.editor.CourseAccessAndProperties;
 import org.olat.repository.CatalogEntry;
 
@@ -62,6 +65,8 @@ import de.tuchemnitz.wizard.workflows.coursecreation.CourseCreationHelper;
  * @author Sebastian Fritzsche (seb.fritzsche@googlemail.com)
  */
 public class CourseCreationConfiguration {
+	
+	private static final OLog log = Tracing.createLoggerFor(CourseCreationConfiguration.class);
 
 	public static final String ACL_GUEST = "acl_guest";
 	public static final String ACL_OLAT = "acl_olat";
@@ -360,29 +365,21 @@ public class CourseCreationConfiguration {
 		vc.contextPut("coursetitle", courseTitle);
 		
 		//prepare rendering of velocity page for the content of the single page node
-		GlobalSettings globalSettings = new GlobalSettings() {
-			public int getFontSize() { return 100;}
-			public AJAXFlags getAjaxFlags() { return new EmptyAJAXFlags();}
-			public boolean isIdDivsForced() { return false; }
-		};
+		GlobalSettings globalSettings = new DefaultGlobalSettings();
 		
 		Context context = vc.getContext();
 		Renderer fr = Renderer.getInstance(vc, translator, null, new RenderResult(), globalSettings);
 		StringOutput wOut = new StringOutput(10000);
-		VelocityRenderDecorator vrdec = new VelocityRenderDecorator(fr, vc, wOut);			
-		context.put("r", vrdec);
-		VelocityHelper.getInstance().mergeContent(vc.getPage(), context, wOut, null);
-		//free the decorator
-		context.remove("r");
-		IOUtils.closeQuietly(vrdec);
+		try(VelocityRenderDecorator vrdec = new VelocityRenderDecorator(fr, vc, wOut)) {
+			context.put("r", vrdec);
+			VelocityHelper.getInstance().mergeContent(vc.getPage(), context, wOut, null);
+			//free the decorator
+			context.remove("r");
+		} catch(IOException e) {
+			log.error("", e);
+		}
 		return WysiwygFactory.createXHtmlFileContent(wOut.toString(), courseTitle);
 	}
-	
-	private static class EmptyAJAXFlags extends AJAXFlags {
-		public EmptyAJAXFlags() { super(null); }
-		@Override
-		public boolean isIframePostEnabled() { return false; }
-	}
 
 	/**
 	 * @param subscriberCount The subscriberCount to set.
diff --git a/src/main/java/org/olat/collaboration/CollaborationTools.java b/src/main/java/org/olat/collaboration/CollaborationTools.java
index a0bf3b5c890..28cd3a738ee 100644
--- a/src/main/java/org/olat/collaboration/CollaborationTools.java
+++ b/src/main/java/org/olat/collaboration/CollaborationTools.java
@@ -336,7 +336,7 @@ public class CollaborationTools implements Serializable {
 	}
 	
 	public Forum getForum() {
-		final ForumManager fom = ForumManager.getInstance();
+		final ForumManager fom = CoreSpringFactory.getImpl(ForumManager.class);
 		final NarrowedPropertyManager npm = NarrowedPropertyManager.getInstance(ores);
 		Property forumProperty = npm.findProperty(null, null, PROP_CAT_BG_COLLABTOOLS, KEY_FORUM);
 		
@@ -655,7 +655,7 @@ public class CollaborationTools implements Serializable {
 		/*
 		 * delete the forum, if existing
 		 */
-		ForumManager fom = ForumManager.getInstance();
+		ForumManager fom = CoreSpringFactory.getImpl(ForumManager.class);
 		Property forumKeyProperty = npm.findProperty(null, null, PROP_CAT_BG_COLLABTOOLS, KEY_FORUM);
 		if (forumKeyProperty != null) {
 			// if there was a forum, delete it
@@ -1027,7 +1027,7 @@ public class CollaborationTools implements Serializable {
 			String archiveForumName = "del_forum_" + forumKeyProperty.getLongValue();
 			VFSContainer archiveForumContainer = archiveContainer.createChildContainer(archiveForumName);
 			ForumFormatter ff = new ForumRTFFormatter(archiveForumContainer, false, I18nModule.getDefaultLocale());
-			ForumArchiveManager.getInstance().applyFormatter(ff, forumKeyProperty.getLongValue(), null);
+			CoreSpringFactory.getImpl(ForumArchiveManager.class).applyFormatter(ff, forumKeyProperty.getLongValue(), null);
 		}
 	}
 
diff --git a/src/main/java/org/olat/core/gui/DefaultGlobalSettings.java b/src/main/java/org/olat/core/gui/DefaultGlobalSettings.java
new file mode 100644
index 00000000000..e0c34064791
--- /dev/null
+++ b/src/main/java/org/olat/core/gui/DefaultGlobalSettings.java
@@ -0,0 +1,38 @@
+package org.olat.core.gui;
+
+import org.olat.core.gui.control.winmgr.AJAXFlags;
+
+/**
+ * 
+ * Initial date: 28 mai 2018<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class DefaultGlobalSettings implements GlobalSettings {
+	@Override
+	public int getFontSize() {
+		return 100;
+	}
+	
+	@Override
+	public AJAXFlags getAjaxFlags() {
+		return new EmptyAJAXFlags();
+	}
+	
+	@Override
+	public boolean isIdDivsForced() {
+		return false;
+	}
+	
+	private static class EmptyAJAXFlags extends AJAXFlags {
+		
+		public EmptyAJAXFlags() {
+			super(null);
+		}
+		
+		@Override
+		public boolean isIframePostEnabled() {
+			return false;
+		}
+	}
+}
diff --git a/src/main/java/org/olat/core/gui/control/winmgr/WindowManagerImpl.java b/src/main/java/org/olat/core/gui/control/winmgr/WindowManagerImpl.java
index 377cbdeccb7..f3228866dda 100644
--- a/src/main/java/org/olat/core/gui/control/winmgr/WindowManagerImpl.java
+++ b/src/main/java/org/olat/core/gui/control/winmgr/WindowManagerImpl.java
@@ -50,7 +50,7 @@ import org.olat.core.manager.BasicManager;
  */
 public class WindowManagerImpl extends BasicManager implements WindowManager {
 	
-	private List<WindowBackOfficeImpl> wbos = new ArrayList<WindowBackOfficeImpl>();
+	private List<WindowBackOfficeImpl> wbos = new ArrayList<>();
 	
 	private GlobalSettings globalSettings;
 	private boolean ajaxEnabled = false;
diff --git a/src/main/java/org/olat/course/nodes/DialogCourseNode.java b/src/main/java/org/olat/course/nodes/DialogCourseNode.java
index 60863ee013c..45a551d6226 100644
--- a/src/main/java/org/olat/course/nodes/DialogCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/DialogCourseNode.java
@@ -228,7 +228,7 @@ public class DialogCourseNode extends AbstractAccessableCourseNode {
 		diaNodeElemExportContainer.setLocalSecurityCallback(new FullAccessCallback());
 		diaNodeElemExportContainer.copyFrom(dialogFile);
 
-		ForumArchiveManager fam = ForumArchiveManager.getInstance();
+		ForumArchiveManager fam = CoreSpringFactory.getImpl(ForumArchiveManager.class);
 		ForumFormatter ff = new ForumRTFFormatter(diaNodeElemExportContainer, false, locale);
 		fam.applyFormatter(ff, element.getForum().getKey(), null);
 	}
@@ -264,7 +264,7 @@ public class DialogCourseNode extends AbstractAccessableCourseNode {
 			ZipUtil.addToZip(item, exportDirName, exportStream);
 		}
 
-		ForumArchiveManager fam = ForumArchiveManager.getInstance();
+		ForumArchiveManager fam = CoreSpringFactory.getImpl(ForumArchiveManager.class);
 		ForumFormatter ff = new ForumStreamedRTFFormatter(exportStream, exportDirName, false, locale);
 		fam.applyFormatter(ff, element.getForum().getKey(), null);
 	}
diff --git a/src/main/java/org/olat/course/nodes/FOCourseNode.java b/src/main/java/org/olat/course/nodes/FOCourseNode.java
index 566c6dcb7ab..61ddb57d90f 100644
--- a/src/main/java/org/olat/course/nodes/FOCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/FOCourseNode.java
@@ -440,14 +440,14 @@ public class FOCourseNode extends AbstractAccessableCourseNode {
 			return false;
 		}
 		Long forumKey = forumKeyProperty.getLongValue();
-		if(ForumManager.getInstance().countThreadsByForumID(forumKey) <= 0) {
+		if(CoreSpringFactory.getImpl(ForumManager.class).countThreadsByForumID(forumKey) <= 0) {
 			return false;
 		}
 		
 		String forumName = "forum_" + Formatter.makeStringFilesystemSave(getShortTitle())
 				+ "_" + Formatter.formatDatetimeFilesystemSave(new Date(System.currentTimeMillis()));
 		ForumStreamedRTFFormatter rtff = new ForumStreamedRTFFormatter(exportStream, forumName, false, locale);	
-		ForumArchiveManager.getInstance().applyFormatter(rtff, forumKey, null);
+		CoreSpringFactory.getImpl(ForumArchiveManager.class).applyFormatter(rtff, forumKey, null);
 		return true;
 	}
 
@@ -479,7 +479,7 @@ public class FOCourseNode extends AbstractAccessableCourseNode {
 		Property forumKeyProperty = cpm.findCourseNodeProperty(this, null, null, FORUM_KEY);
 		if (forumKeyProperty != null) {
 			Long forumKey = forumKeyProperty.getLongValue();
-			ForumManager.getInstance().deleteForum(forumKey); // delete the forum
+			CoreSpringFactory.getImpl(ForumManager.class).deleteForum(forumKey); // delete the forum
 			cpm.deleteProperty(forumKeyProperty); // delete the property
 		}
 	}
diff --git a/src/main/java/org/olat/ims/qti21/resultexport/QTI21ResultsExportMediaResource.java b/src/main/java/org/olat/ims/qti21/resultexport/QTI21ResultsExportMediaResource.java
index 5290ee82a35..09a58c0ac3a 100644
--- a/src/main/java/org/olat/ims/qti21/resultexport/QTI21ResultsExportMediaResource.java
+++ b/src/main/java/org/olat/ims/qti21/resultexport/QTI21ResultsExportMediaResource.java
@@ -44,13 +44,12 @@ import javax.servlet.http.HttpServletResponse;
 import org.apache.velocity.VelocityContext;
 import org.olat.admin.user.imp.TransientIdentity;
 import org.olat.core.CoreSpringFactory;
-import org.olat.core.gui.GlobalSettings;
+import org.olat.core.gui.DefaultGlobalSettings;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
-import org.olat.core.gui.control.winmgr.AJAXFlags;
 import org.olat.core.gui.media.MediaResource;
 import org.olat.core.gui.render.RenderResult;
 import org.olat.core.gui.render.Renderer;
@@ -340,7 +339,7 @@ public class QTI21ResultsExportMediaResource implements MediaResource {
 		mainVC.put("results", results);
 		
 		//render VelocityContainer to StringOutPut
-		Renderer renderer = Renderer.getInstance(mainVC, translator, ubu, new RenderResult(), new EmptyGlobalSettings());
+		Renderer renderer = Renderer.getInstance(mainVC, translator, ubu, new RenderResult(), new DefaultGlobalSettings());
 		try(StringOutput sb = new StringOutput(32000);
 				VelocityRenderDecorator vrdec = new VelocityRenderDecorator(renderer, mainVC, sb)) {
 			mainVC.contextPut("r", vrdec);
@@ -416,33 +415,4 @@ public class QTI21ResultsExportMediaResource implements MediaResource {
 	public void release() {
 		//
 	}
-
-	private static class EmptyAJAXFlags extends AJAXFlags {
-		
-		public EmptyAJAXFlags() {
-			super(null);
-		}
-		
-		@Override
-		public boolean isIframePostEnabled() {
-			return false;
-		}
-	}
-	
-	private static class EmptyGlobalSettings implements GlobalSettings {
-		@Override
-		public int getFontSize() {
-			return 100;
-		}
-		
-		@Override
-		public AJAXFlags getAjaxFlags() {
-			return new EmptyAJAXFlags();
-		}
-		
-		@Override
-		public boolean isIdDivsForced() {
-			return false;
-		}
-	}
 }
diff --git a/src/main/java/org/olat/modules/fo/ForumNotificationsHandler.java b/src/main/java/org/olat/modules/fo/ForumNotificationsHandler.java
index d96d83d1d5d..c6b2bfe5f76 100644
--- a/src/main/java/org/olat/modules/fo/ForumNotificationsHandler.java
+++ b/src/main/java/org/olat/modules/fo/ForumNotificationsHandler.java
@@ -96,7 +96,7 @@ public class ForumNotificationsHandler extends LogDelegator implements Notificat
 					}
 				}
 				
-				final List<Message> mInfos = ForumManager.getInstance().getNewMessageInfo(forumKey, compareDate);
+				final List<Message> mInfos = CoreSpringFactory.getImpl(ForumManager.class).getNewMessageInfo(forumKey, compareDate);
 				final Translator translator = Util.createPackageTranslator(ForumNotificationsHandler.class, locale);
 				
 				businessControlString = p.getBusinessPath() + "[Message:";
diff --git a/src/main/java/org/olat/modules/fo/archiver/ForumArchiveManager.java b/src/main/java/org/olat/modules/fo/archiver/ForumArchiveManager.java
index 54843950fcc..eb9e66bc092 100644
--- a/src/main/java/org/olat/modules/fo/archiver/ForumArchiveManager.java
+++ b/src/main/java/org/olat/modules/fo/archiver/ForumArchiveManager.java
@@ -39,26 +39,20 @@ import org.olat.modules.fo.ForumCallback;
 import org.olat.modules.fo.Message;
 import org.olat.modules.fo.archiver.formatters.ForumFormatter;
 import org.olat.modules.fo.manager.ForumManager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
 
 /**
  *          Initial Date: Nov 11, 2005 <br>
  * @author Alexander Schneider
  */
-
+@Service
 public class ForumArchiveManager {
+	
 	private static final OLog log = Tracing.createLoggerFor(ForumArchiveManager.class);
-	private static final ForumArchiveManager instance = new ForumArchiveManager();
 	
-	private ForumArchiveManager() {
-		// private since singleton
-	}
-	
-	/**
-	 * @return the singleton
-	 */
-	public static ForumArchiveManager getInstance() {
-		return instance;
-	}
+	@Autowired
+	private ForumManager forumManager;
 	
 	/**
 	 * If the forumCallback is null no restriction applies to the forum archiver. 
@@ -98,10 +92,9 @@ public class ForumArchiveManager {
 	 */
 	private List<MessageNode> convertToThreadTrees(Long forumId, ForumCallback forumCallback){
 		List<MessageNode> topNodeList = new ArrayList<>();
-		ForumManager fm = ForumManager.getInstance();
-	
-		Forum f = fm.loadForum(forumId);
-		List<Message> messages = fm.getMessagesByForum(f);
+
+		Forum f = forumManager.loadForum(forumId);
+		List<Message> messages = forumManager.getMessagesByForum(f);
 		
 		for (Iterator<Message> iterTop = messages.iterator(); iterTop.hasNext();) {
 			Message msg = iterTop.next();
@@ -144,7 +137,7 @@ public class ForumArchiveManager {
 	 */
 	private MessageNode convertToThreadTree(Long topMessageId){
 		MessageNode topNode = null;
-		List<Message> messages = ForumManager.getInstance().getThread(topMessageId);
+		List<Message> messages = forumManager.getThread(topMessageId);
 		for (Iterator<Message> iterTop = messages.iterator(); iterTop.hasNext();) {
 			Message msg = iterTop.next();
 			if (msg.getParent() == null) {
diff --git a/src/main/java/org/olat/modules/fo/archiver/formatters/ForumDownloadResource.java b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumDownloadResource.java
index 60292670b7e..4a5a9890cfc 100644
--- a/src/main/java/org/olat/modules/fo/archiver/formatters/ForumDownloadResource.java
+++ b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumDownloadResource.java
@@ -30,6 +30,7 @@ import java.util.zip.ZipOutputStream;
 
 import javax.servlet.http.HttpServletResponse;
 
+import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.media.MediaResource;
 import org.olat.core.gui.media.ServletUtil;
 import org.olat.core.logging.OLog;
@@ -146,10 +147,10 @@ public class ForumDownloadResource implements MediaResource {
 			
 			ForumOpenXMLFormatter openXmlFormatter = new ForumOpenXMLFormatter(mediaContainer, locale);
 			if(topMessageId != null) {
-				ForumArchiveManager.getInstance()
+				CoreSpringFactory.getImpl(ForumArchiveManager.class)
 					.applyFormatterForOneThread(openXmlFormatter, forum.getKey(), topMessageId);
 			} else {
-				ForumArchiveManager.getInstance()
+				CoreSpringFactory.getImpl(ForumArchiveManager.class)
 					.applyFormatter(openXmlFormatter, forum.getKey(), foCallback);
 			}
 			
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 f48c1a4eb61..b65c09fd248 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
@@ -40,6 +40,7 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.apache.commons.lang.StringEscapeUtils;
+import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
 import org.olat.core.id.Identity;
 import org.olat.core.id.UserConstants;
@@ -72,7 +73,6 @@ public class ForumRTFFormatter extends ForumFormatter {
 
 	private VFSContainer container;
 	private VFSItem vfsFil = null;
-	private ForumManager fm = ForumManager.getInstance();
 	private VFSContainer tempContainer;
 	
 	final Pattern PATTERN_HTML_BOLD = Pattern.compile("<strong>(.*?)</strong>", Pattern.CASE_INSENSITIVE);
@@ -91,6 +91,8 @@ public class ForumRTFFormatter extends ForumFormatter {
 	//TODO: (LD) translate this!
 	private String HIDDEN_STR = "VERBORGEN";
 	
+	private final ForumManager forumManager;
+	
 	/**
 	 * 
 	 * @param container
@@ -103,6 +105,7 @@ public class ForumRTFFormatter extends ForumFormatter {
 		// where to write
 		this.container = container;
 		this.filePerThread = filePerThread;
+		forumManager = CoreSpringFactory.getImpl(ForumManager.class);
 	}
 
 	/**
@@ -167,7 +170,7 @@ public class ForumRTFFormatter extends ForumFormatter {
 		}
 		sb.append(" \\par}");
 		// attachment(s)
-		VFSContainer msgContainer = fm.getMessageContainer(getForumKey(), mn.getKey());
+		VFSContainer msgContainer = forumManager.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 fd85dbb2f54..49847b8ff0c 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
@@ -39,6 +39,7 @@ 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.CoreSpringFactory;
 import org.olat.core.id.Identity;
 import org.olat.core.id.UserConstants;
 import org.olat.core.logging.AssertException;
@@ -65,7 +66,6 @@ public class ForumStreamedRTFFormatter extends ForumFormatter {
 	private static final OLog log = Tracing.createLoggerFor(ForumStreamedRTFFormatter.class);
 
 	private ZipOutputStream exportStream;
-	private ForumManager fm = ForumManager.getInstance();
 	
 	final Pattern PATTERN_HTML_BOLD = Pattern.compile("<strong>(.*?)</strong>", Pattern.CASE_INSENSITIVE);
 	final Pattern PATTERN_HTML_ITALIC = Pattern.compile("<em>(.*?)</em>", Pattern.CASE_INSENSITIVE);
@@ -82,6 +82,8 @@ public class ForumStreamedRTFFormatter extends ForumFormatter {
 	
 	private String HIDDEN_STR = "VERBORGEN";
 	private final String path;
+	
+	private final ForumManager forumManager;
 		
 	/**
 	 * 
@@ -92,6 +94,9 @@ public class ForumStreamedRTFFormatter extends ForumFormatter {
 	public ForumStreamedRTFFormatter(ZipOutputStream exportStream, String path, boolean filePerThread, Locale locale) {
 		// init String Buffer in ForumFormatter
 		super(locale);
+		
+		forumManager = CoreSpringFactory.getImpl(ForumManager.class);
+		
 		// where to write
 		this.exportStream = exportStream;
 		this.filePerThread = filePerThread;
@@ -152,7 +157,7 @@ public class ForumStreamedRTFFormatter extends ForumFormatter {
 		}
 		sb.append(" \\par}");
 		// attachment(s)
-		VFSContainer msgContainer = fm.getMessageContainer(getForumKey(), mn.getKey());
+		VFSContainer msgContainer = forumManager.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/manager/ForumManager.java b/src/main/java/org/olat/modules/fo/manager/ForumManager.java
index 935aeacb113..a72e0fad806 100644
--- a/src/main/java/org/olat/modules/fo/manager/ForumManager.java
+++ b/src/main/java/org/olat/modules/fo/manager/ForumManager.java
@@ -90,8 +90,7 @@ import org.springframework.stereotype.Service;
 @Service
 public class ForumManager {
 	private static final OLog log = Tracing.createLoggerFor(ForumManager.class);
-	
-	private static ForumManager INSTANCE;
+
 	@Autowired
 	private DB dbInstance;
 	@Autowired
@@ -102,20 +101,6 @@ public class ForumManager {
 	private UserManager userManager;
 	@Autowired
 	private MarkingService markingService;
-
-	/**
-	 * [spring]
-	 */
-	private ForumManager() {
-		INSTANCE = this;
-	}
-
-	/**
-	 * @return the singleton
-	 */
-	public static ForumManager getInstance() {
-		return INSTANCE;
-	}
 	
 	public int countThread(Long messageKey) {
 		String query = "select count(msg) from fomessage as msg where msg.key=:messageKey or msg.threadtop.key=:messageKey";
@@ -374,6 +359,19 @@ public class ForumManager {
 				.getResultList();
 		return messages == null || messages.isEmpty() ? null : messages.get(0);
 	}
+	
+	public List<Message> getMessageByCreator(IdentityRef creator) {
+		StringBuilder query = new StringBuilder();
+		query.append("select msg from fomessage as msg")
+		     .append(" inner join msg.creator as creator")
+		     .append(" inner join fetch msg.forum as forum")
+		     .append(" where msg.creator.key=:identityKey");
+		
+		return dbInstance.getCurrentEntityManager()
+				.createQuery(query.toString(), Message.class)
+				.setParameter("identityKey", creator.getKey())
+				.getResultList();
+	}
 
 	public boolean isPseudonymProtected(String pseudonym) {
 		StringBuilder query = new StringBuilder();
diff --git a/src/main/java/org/olat/modules/fo/manager/ForumUserDataManager.java b/src/main/java/org/olat/modules/fo/manager/ForumUserDataManager.java
new file mode 100644
index 00000000000..407e206953b
--- /dev/null
+++ b/src/main/java/org/olat/modules/fo/manager/ForumUserDataManager.java
@@ -0,0 +1,230 @@
+/**
+ * <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.modules.fo.manager;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import org.olat.core.commons.persistence.DB;
+import org.olat.core.gui.DefaultGlobalSettings;
+import org.olat.core.gui.components.velocity.VelocityContainer;
+import org.olat.core.gui.render.EmptyURLBuilder;
+import org.olat.core.gui.render.RenderResult;
+import org.olat.core.gui.render.Renderer;
+import org.olat.core.gui.render.StringOutput;
+import org.olat.core.gui.render.velocity.VelocityRenderDecorator;
+import org.olat.core.gui.translator.Translator;
+import org.olat.core.id.Identity;
+import org.olat.core.id.OLATResourceable;
+import org.olat.core.id.context.BusinessControlFactory;
+import org.olat.core.logging.OLog;
+import org.olat.core.logging.Tracing;
+import org.olat.core.util.FileUtils;
+import org.olat.core.util.StringHelper;
+import org.olat.core.util.Util;
+import org.olat.core.util.io.SystemFileFilter;
+import org.olat.core.util.resource.OresHelper;
+import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupService;
+import org.olat.modules.fo.Forum;
+import org.olat.modules.fo.ForumModule;
+import org.olat.modules.fo.Message;
+import org.olat.modules.wiki.WikiManager;
+import org.olat.properties.Property;
+import org.olat.properties.PropertyManager;
+import org.olat.repository.RepositoryEntry;
+import org.olat.repository.RepositoryManager;
+import org.olat.user.UserDataExportable;
+import org.olat.user.manager.ManifestBuilder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 
+ * Initial date: 28 mai 2018<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+@Service
+public class ForumUserDataManager implements UserDataExportable {
+	
+	private static final OLog log = Tracing.createLoggerFor(ForumUserDataManager.class);
+
+	public static final String FORUM_KEY = "forumKey";// course and group
+	
+	@Autowired
+	private DB dbInstance;
+	@Autowired
+	private ForumManager forumManager;
+	@Autowired
+	private PropertyManager propertyManager;
+	@Autowired
+	private RepositoryManager repositoryManager;
+	@Autowired
+	private BusinessGroupService businessGroupService;
+
+	@Override
+	public String getExporterID() {
+		return "forums";
+	}
+
+	@Override
+	public void export(Identity identity, ManifestBuilder manifest, File archiveDirectory, Locale locale) {
+		List<Message> messages = forumManager.getMessageByCreator(identity);
+		dbInstance.commitAndCloseSession();
+		if(messages.isEmpty()) return;
+
+
+		File forumArchive = new File(archiveDirectory, "Forums");
+		forumArchive.mkdir();
+		Map<Long,Property> properties = loadMappingProperties();
+		Map<Long, Location> locations = new HashMap<>();
+		Translator translator = Util.createPackageTranslator(ForumModule.class, locale);
+		int count = 1;
+		for(Message message:messages) {
+			String name = count++ + "_" + StringHelper.transformDisplayNameToFileSystemName(message.getTitle());
+
+			Forum forum = message.getForum();
+			Location location = locations.computeIfAbsent(forum.getKey(), forumKey -> resolveLocation(forumKey, properties));
+			
+			List<File> attachments;
+			File msgContainer = forumManager.getMessageDirectory(forum.getKey(), message.getKey(), false);
+			if(msgContainer != null && msgContainer.exists()) {
+				File[] attachmentArr = msgContainer.listFiles(new SystemFileFilter(true, false));
+				attachments = Arrays.asList(attachmentArr);
+				if(!attachments.isEmpty()) {
+					File messageAttachementDir = new File(forumArchive, name);
+					messageAttachementDir.mkdir();
+					for(File attachment:attachments) {
+						FileUtils.copyFileToDir(attachment, messageAttachementDir, "Copy forum message attachments");
+					}
+				}
+			} else {
+				attachments = Collections.emptyList();
+			}
+			
+			File messageFile = new File(forumArchive, name + ".html");
+			try(OutputStream out = new FileOutputStream(messageFile)) {
+				String content = renderForumMessage(location, message, attachments, translator);
+				out.write(content.getBytes("UTF-8"));
+				out.flush();
+			} catch(IOException e) {
+				log.error("", e);
+			}
+		}
+
+	}
+	
+	private Location resolveLocation(Long forumKey, Map<Long,Property> properties) {
+		Property property = properties.get(forumKey);
+		String name = null;
+		String businessPath = null;
+		if(property != null) {
+			if("CourseModule".equals(property.getResourceTypeName())) {
+				OLATResourceable resourceable = OresHelper.createOLATResourceableInstance(property.getResourceTypeName(), property.getResourceTypeId());
+				RepositoryEntry entry = repositoryManager.lookupRepositoryEntry(resourceable, false);
+				if(entry != null) {
+					name = entry.getDisplayname();
+					businessPath = "[RepositoryEntry:" + entry.getKey() + "]";
+					String nodeId = extractNodeId(property);
+					if(nodeId != null) {
+						businessPath += "[CourseNode:" + nodeId + "]";
+					}
+				}	
+			} else if("BusinessGroup".equals(property.getResourceTypeName())) {
+				BusinessGroup businessGroup = businessGroupService.loadBusinessGroup(property.getResourceTypeId());
+				if(businessGroup != null) {
+					name = businessGroup.getName();
+					businessPath += "[BusinessGroup:" + businessGroup.getKey() + "]";
+				}
+			}
+		}
+		
+		String url = businessPath == null ? null : BusinessControlFactory.getInstance().getURLFromBusinessPathString(businessPath);
+		return new Location(name, url);
+	}
+	
+	private String extractNodeId(Property property) {
+		if(property.getCategory() != null) {
+			String category = property.getCategory();
+			int index = category.indexOf("::");
+			if(index > 0 && index + 2 < category.length()) {
+				return category.substring(index + 2, category.length());
+			}
+		}	
+		return null;
+	}
+	
+	private Map<Long,Property> loadMappingProperties() {
+		Map<Long,Property> propertyMap = new HashMap<>();
+		List<Property> properties = propertyManager.listProperties(null, null, null, null, null, FORUM_KEY);
+		for(Property property:properties) {
+			propertyMap.put(property.getLongValue(), property);
+		}
+		
+		List<Property> wikiProperties = propertyManager.listProperties(null, null, null, null, null, WikiManager.FORUM_KEY);
+		for(Property property:wikiProperties) {
+			propertyMap.put(property.getLongValue(), property);
+		}
+		return propertyMap;
+	}
+
+	
+	private String renderForumMessage(Location location, Message message, List<File> attachments, Translator translator) {
+		StringOutput sb = new StringOutput(10000);
+		String pagePath = Util.getPackageVelocityRoot(ForumUserDataManager.class) + "/export_message.html";
+		VelocityContainer component = new VelocityContainer("html", pagePath, translator, null);
+		component.contextPut("message", message);
+		component.contextPut("attachments", attachments);
+		component.contextPut("location", location);
+		
+		Renderer renderer = Renderer.getInstance(component, translator, new EmptyURLBuilder(), new RenderResult(), new DefaultGlobalSettings());
+		VelocityRenderDecorator vrdec = new VelocityRenderDecorator(renderer, component, sb);
+		component.contextPut("r", vrdec);
+		renderer.render(sb, component, null);
+		return sb.toString();
+	}
+	
+	public static class Location {
+		private final String name;
+		private final String url;
+		
+		public Location(String name, String url) {
+			this.name = name;
+			this.url = url;
+		}
+
+		public String getName() {
+			return name;
+		}
+
+		public String getUrl() {
+			return url;
+		}
+	}
+}
diff --git a/src/main/java/org/olat/modules/fo/manager/_content/export_message.html b/src/main/java/org/olat/modules/fo/manager/_content/export_message.html
new file mode 100644
index 00000000000..19a0a32db7b
--- /dev/null
+++ b/src/main/java/org/olat/modules/fo/manager/_content/export_message.html
@@ -0,0 +1,36 @@
+<html>
+	<head>
+		<title>$r.escapeHtml($message.title)</title>
+		<meta http-equiv="Content-type" content="text/html; charset=utf-8">
+	</head>
+	<body>
+		<div class="o_forum_message_header clearfix">
+			<h4 class="o_forum_message_title">$r.escapeHtml($message.title)</h4>
+			<div class="o_date">
+				$r.translate("msg.creationdate") $r.formatDateAndTime($message.creationDate)
+			</div>
+			#if($r.isNotEmpty($location.url))
+			<div class="o_path">
+				<a href="$location.url">$location.name <small>$location.url</small></a>
+			</div>
+			#end
+		</div>
+		<div class="o_forum_message_body o_user_content_block">
+			<div class="clearfix o_scrollblock">$r.formatLatexFormulas($message.body)</div>
+		</div>
+		
+		#if($r.isNotEmpty($attachments))
+		<div class="o_forum_message_attachments">
+			<h5>$r.translate("attachments"):</h5>
+			<ul class="list-inline">
+			#foreach($attachment in $attachments)
+				#set($fname = $attachment.getName())
+				<li class="o_attachment">
+					<a href="${message.forum.key}_${message.key}/${fname}" target="_blank"><span class="o_filename">$r.escapeHtml($fname)</span></a>		
+				</li>
+			#end 
+			</ul>
+		</div>
+		#end
+	</body>
+</html>
\ No newline at end of file
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 6850fbf8ce2..14f713116ee 100755
--- a/src/main/java/org/olat/modules/fo/portfolio/ForumArtefactHandler.java
+++ b/src/main/java/org/olat/modules/fo/portfolio/ForumArtefactHandler.java
@@ -21,6 +21,7 @@ package org.olat.modules.fo.portfolio;
 
 import java.util.List;
 
+import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
@@ -51,7 +52,7 @@ public class ForumArtefactHandler extends EPAbstractHandler<ForumArtefact> {
 		super.prefillArtefactAccordingToSource(artefact, source);
 		if (source instanceof OLATResourceable){
 			OLATResourceable ores = (OLATResourceable) source;
-			ForumManager fMgr = ForumManager.getInstance();
+			ForumManager fMgr = CoreSpringFactory.getImpl(ForumManager.class);
 			Message fm = fMgr.loadMessage(ores.getResourceableId());
 			String thread = fm.getThreadtop() != null ? fm.getThreadtop().getTitle() + " - " : "";
 			artefact.setTitle(thread + fm.getTitle());
diff --git a/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java b/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java
index 34d5202c0b1..cf11317ed75 100644
--- a/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java
+++ b/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java
@@ -53,6 +53,7 @@ import javax.ws.rs.core.Response.Status;
 
 import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.BaseSecurityManager;
+import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.services.notifications.NotificationsManager;
 import org.olat.core.commons.services.notifications.Subscriber;
 import org.olat.core.gui.UserRequest;
@@ -388,7 +389,7 @@ public class ForumCourseNodeWebService extends AbstractCourseNodeWebService {
 		CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager();
 		Property forumKeyProp = cpm.findCourseNodeProperty(courseNode, null, null, FOCourseNode.FORUM_KEY);
 		Forum forum = null;
-		ForumManager fom = ForumManager.getInstance();
+		ForumManager fom = CoreSpringFactory.getImpl(ForumManager.class);
 		if(forumKeyProp!=null) {
       // Forum does already exist, load forum with key from properties
 		  Long forumKey = forumKeyProp.getLongValue();
@@ -455,7 +456,7 @@ public class ForumCourseNodeWebService extends AbstractCourseNodeWebService {
 		@Override
 		public void configure(ICourse course, CourseNode newNode, ModuleConfiguration moduleConfig) {
 			// create the forum
-			ForumManager fom = ForumManager.getInstance();
+			ForumManager fom = CoreSpringFactory.getImpl(ForumManager.class);
 			CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager();
 			Forum forum = fom.addAForum();
 			Long forumKey = forum.getKey();
diff --git a/src/main/java/org/olat/modules/fo/restapi/ForumImportWebService.java b/src/main/java/org/olat/modules/fo/restapi/ForumImportWebService.java
index d15989eed7a..e042b1b7765 100644
--- a/src/main/java/org/olat/modules/fo/restapi/ForumImportWebService.java
+++ b/src/main/java/org/olat/modules/fo/restapi/ForumImportWebService.java
@@ -27,6 +27,7 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
+import org.olat.core.CoreSpringFactory;
 import org.olat.modules.fo.Forum;
 import org.olat.modules.fo.manager.ForumManager;
 
@@ -65,7 +66,7 @@ public class ForumImportWebService {
 	 */
 	@Path("{forumKey}")
 	public ForumWebService getForumWebservice(@PathParam("forumKey") Long forumKey) {
-		ForumManager fom = ForumManager.getInstance();
+		ForumManager fom = CoreSpringFactory.getImpl(ForumManager.class);
 		Forum forum = fom.loadForum(forumKey);
 		return new ForumWebService(forum);
 	}
diff --git a/src/main/java/org/olat/modules/fo/restapi/ForumWebService.java b/src/main/java/org/olat/modules/fo/restapi/ForumWebService.java
index 484c84d8e14..d621a1535b7 100644
--- a/src/main/java/org/olat/modules/fo/restapi/ForumWebService.java
+++ b/src/main/java/org/olat/modules/fo/restapi/ForumWebService.java
@@ -60,6 +60,7 @@ import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.io.IOUtils;
 import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.BaseSecurityManager;
+import org.olat.core.CoreSpringFactory;
 import org.olat.core.id.Identity;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
@@ -100,10 +101,11 @@ public class ForumWebService {
 	}
 	
 	private final Forum forum;
-	private final ForumManager fom = ForumManager.getInstance();
+	private final ForumManager fom;
 	
 	public ForumWebService(Forum forum) {
 		this.forum = forum;
+		fom = CoreSpringFactory.getImpl(ForumManager.class);
 	}
 	
 	/**
diff --git a/src/main/java/org/olat/modules/portfolio/ui/export/ExportBinderAsCPResource.java b/src/main/java/org/olat/modules/portfolio/ui/export/ExportBinderAsCPResource.java
index 9ff9848763f..292664baa77 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/export/ExportBinderAsCPResource.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/export/ExportBinderAsCPResource.java
@@ -47,12 +47,11 @@ import org.olat.core.commons.services.commentAndRating.ui.UserCommentsController
 import org.olat.core.dispatcher.DispatcherModule;
 import org.olat.core.dispatcher.mapper.Mapper;
 import org.olat.core.dispatcher.mapper.MapperService;
-import org.olat.core.gui.GlobalSettings;
+import org.olat.core.gui.DefaultGlobalSettings;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.WindowControl;
-import org.olat.core.gui.control.winmgr.AJAXFlags;
 import org.olat.core.gui.media.MediaResource;
 import org.olat.core.gui.render.RenderResult;
 import org.olat.core.gui.render.Renderer;
@@ -375,7 +374,7 @@ public class ExportBinderAsCPResource implements MediaResource {
 	private String renderVelocityContainer(VelocityContainer mainVC) {
 		StringOutput sb = new StringOutput(32000);
 		URLBuilder ubu = new URLBuilder("auth", "1", "0");
-		Renderer renderer = Renderer.getInstance(mainVC, translator, ubu, new RenderResult(), new EmptyGlobalSettings());
+		Renderer renderer = Renderer.getInstance(mainVC, translator, ubu, new RenderResult(), new DefaultGlobalSettings());
 		VelocityRenderDecorator vrdec = new VelocityRenderDecorator(renderer, mainVC, sb);
 		mainVC.contextPut("r", vrdec);
 		renderer.render(sb, mainVC, null);
@@ -535,35 +534,6 @@ public class ExportBinderAsCPResource implements MediaResource {
 		}
 	}
 	
-	private static class EmptyGlobalSettings implements GlobalSettings {
-		@Override
-		public int getFontSize() {
-			return 100;
-		}
-		
-		@Override
-		public AJAXFlags getAjaxFlags() {
-			return new EmptyAJAXFlags();
-		}
-		
-		@Override
-		public boolean isIdDivsForced() {
-			return false;
-		}
-	};
-	
-	private static class EmptyAJAXFlags extends AJAXFlags {
-		
-		public EmptyAJAXFlags() {
-			super(null);
-		}
-		
-		@Override
-		public boolean isIframePostEnabled() {
-			return false;
-		}
-	}
-	
 	private class PortfolioPageProvider implements PageProvider {
 		
 		private final List<PageElementHandler> handlers = new ArrayList<>();
diff --git a/src/main/java/org/olat/modules/portfolio/ui/export/ExportBinderAsPDFResource.java b/src/main/java/org/olat/modules/portfolio/ui/export/ExportBinderAsPDFResource.java
index 6ab3ff44b91..46af8f17b1b 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/export/ExportBinderAsPDFResource.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/export/ExportBinderAsPDFResource.java
@@ -40,12 +40,11 @@ import org.olat.core.CoreSpringFactory;
 import org.olat.core.dispatcher.DispatcherModule;
 import org.olat.core.dispatcher.mapper.Mapper;
 import org.olat.core.dispatcher.mapper.MapperService;
-import org.olat.core.gui.GlobalSettings;
+import org.olat.core.gui.DefaultGlobalSettings;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.WindowControl;
-import org.olat.core.gui.control.winmgr.AJAXFlags;
 import org.olat.core.gui.media.MediaResource;
 import org.olat.core.gui.render.RenderResult;
 import org.olat.core.gui.render.Renderer;
@@ -225,7 +224,7 @@ public class ExportBinderAsPDFResource implements MediaResource {
 		
 		StringOutput sb = new StringOutput(32000);
 		URLBuilder ubu = new URLBuilder("auth", "1", "0");
-		Renderer renderer = Renderer.getInstance(mainVC, translator, ubu, new RenderResult(), new EmptyGlobalSettings());
+		Renderer renderer = Renderer.getInstance(mainVC, translator, ubu, new RenderResult(), new DefaultGlobalSettings());
 		VelocityRenderDecorator vrdec = new VelocityRenderDecorator(renderer, mainVC, sb);
 		mainVC.contextPut("r", vrdec);
 		renderer.render(sb, mainVC, null);
@@ -369,33 +368,4 @@ public class ExportBinderAsPDFResource implements MediaResource {
 			return cleanedSrc;
 		}
 	}
-	
-	private static class EmptyGlobalSettings implements GlobalSettings {
-		@Override
-		public int getFontSize() {
-			return 100;
-		}
-		
-		@Override
-		public AJAXFlags getAjaxFlags() {
-			return new EmptyAJAXFlags();
-		}
-		
-		@Override
-		public boolean isIdDivsForced() {
-			return false;
-		}
-	};
-	
-	private static class EmptyAJAXFlags extends AJAXFlags {
-		
-		public EmptyAJAXFlags() {
-			super(null);
-		}
-		
-		@Override
-		public boolean isIframePostEnabled() {
-			return false;
-		}
-	}
 }
diff --git a/src/main/java/org/olat/modules/wiki/WikiMainController.java b/src/main/java/org/olat/modules/wiki/WikiMainController.java
index 945a00ad300..269d19b0af9 100644
--- a/src/main/java/org/olat/modules/wiki/WikiMainController.java
+++ b/src/main/java/org/olat/modules/wiki/WikiMainController.java
@@ -189,6 +189,8 @@ public class WikiMainController extends BasicController implements CloneableCont
 	private WikiMediaHandler wikiMediaHandler;
 	@Autowired
 	private PortfolioV2Module portfolioModule;
+	@Autowired
+	private ForumManager forumManager;
 
 	public WikiMainController(UserRequest ureq, WindowControl wControl, OLATResourceable ores,
 			WikiSecurityCallback securityCallback, String initialPageName) {
@@ -672,10 +674,10 @@ public class WikiMainController extends BasicController implements CloneableCont
 			 **********************************************************************/
 			Forum forum = null;
 			if (page.getForumKey() > 0) {
-				forum = ForumManager.getInstance().loadForum(Long.valueOf(page.getForumKey()));
+				forum = forumManager.loadForum(Long.valueOf(page.getForumKey()));
 			}
 			if (forum == null) {
-				forum = ForumManager.getInstance().addAForum();
+				forum = forumManager.addAForum();
 				page.setForumKey(forum.getKey().longValue());
 				WikiManager.getInstance().updateWikiPageProperties(ores, page);
 			}
diff --git a/src/main/java/org/olat/modules/wiki/WikiPageChangeOrCreateNotificationHandler.java b/src/main/java/org/olat/modules/wiki/WikiPageChangeOrCreateNotificationHandler.java
index 5083eba9447..2642172fea7 100644
--- a/src/main/java/org/olat/modules/wiki/WikiPageChangeOrCreateNotificationHandler.java
+++ b/src/main/java/org/olat/modules/wiki/WikiPageChangeOrCreateNotificationHandler.java
@@ -171,7 +171,7 @@ public class WikiPageChangeOrCreateNotificationHandler implements NotificationsH
 					}
 					
 					long forumKey = element.getForumKey();
-					List<Message> mInfos = ForumManager.getInstance().getNewMessageInfo(forumKey, compareDate);
+					List<Message> mInfos = CoreSpringFactory.getImpl(ForumManager.class).getNewMessageInfo(forumKey, compareDate);
 					
 					for (Message mInfo : mInfos) {
 						String messageTitle = mInfo.getTitle();
diff --git a/src/main/java/org/olat/search/service/indexer/ForumIndexer.java b/src/main/java/org/olat/search/service/indexer/ForumIndexer.java
index 47b6c1b25e1..bacc1bd6ebd 100644
--- a/src/main/java/org/olat/search/service/indexer/ForumIndexer.java
+++ b/src/main/java/org/olat/search/service/indexer/ForumIndexer.java
@@ -30,6 +30,7 @@ import java.io.IOException;
 import java.util.List;
 
 import org.apache.lucene.document.Document;
+import org.olat.core.CoreSpringFactory;
 import org.olat.modules.fo.Forum;
 import org.olat.modules.fo.Message;
 import org.olat.modules.fo.manager.ForumManager;
@@ -48,7 +49,7 @@ public abstract class ForumIndexer extends AbstractHierarchicalIndexer {
 			return;
 		}
 		// loop over all messages of a forum
-		List<Message> messages = ForumManager.getInstance().getMessagesByForum(forum);
+		List<Message> messages = CoreSpringFactory.getImpl(ForumManager.class).getMessagesByForum(forum);
 		for(Message message : messages) {
 			SearchResourceContext searchResourceContext = new SearchResourceContext(parentResourceContext);
 			searchResourceContext.setBusinessControlFor(message);
diff --git a/src/main/java/org/olat/search/service/indexer/group/GroupForumIndexer.java b/src/main/java/org/olat/search/service/indexer/group/GroupForumIndexer.java
index d9903a8d540..f73a39d3c22 100644
--- a/src/main/java/org/olat/search/service/indexer/group/GroupForumIndexer.java
+++ b/src/main/java/org/olat/search/service/indexer/group/GroupForumIndexer.java
@@ -31,6 +31,7 @@ import java.io.IOException;
 import org.olat.basesecurity.Constants;
 import org.olat.basesecurity.BaseSecurityManager;
 import org.olat.collaboration.CollaborationTools;
+import org.olat.core.CoreSpringFactory;
 import org.olat.core.id.Identity;
 import org.olat.core.id.Roles;
 import org.olat.core.id.context.BusinessControl;
@@ -73,7 +74,7 @@ public class GroupForumIndexer extends ForumIndexer{
 		BusinessGroup businessGroup = (BusinessGroup)businessObj;
 		
 		NarrowedPropertyManager npm = NarrowedPropertyManager.getInstance(businessGroup);
-		ForumManager fom = ForumManager.getInstance();
+		ForumManager fom = CoreSpringFactory.getImpl(ForumManager.class);
 
 		Property forumKeyProperty = npm.findProperty(null, null, CollaborationTools.PROP_CAT_BG_COLLABTOOLS, CollaborationTools.KEY_FORUM);
 		// Check if forum-property exist
@@ -102,7 +103,7 @@ public class GroupForumIndexer extends ForumIndexer{
 	public boolean checkAccess(ContextEntry contextEntry, BusinessControl businessControl, Identity identity, Roles roles) {
 		ContextEntry ce = businessControl.popLauncherContextEntry();
 		Long resourceableId = ce.getOLATResourceable().getResourceableId();
-		Message message = ForumManager.getInstance().loadMessage(resourceableId);
+		Message message = CoreSpringFactory.getImpl(ForumManager.class).loadMessage(resourceableId);
 		if(message == null)  return false;
 
 		Message threadtop = message.getThreadtop();
diff --git a/src/main/java/org/olat/search/service/indexer/repository/course/DialogCourseNodeIndexer.java b/src/main/java/org/olat/search/service/indexer/repository/course/DialogCourseNodeIndexer.java
index 4c6fe478f95..94489c2cd85 100644
--- a/src/main/java/org/olat/search/service/indexer/repository/course/DialogCourseNodeIndexer.java
+++ b/src/main/java/org/olat/search/service/indexer/repository/course/DialogCourseNodeIndexer.java
@@ -130,7 +130,7 @@ public class DialogCourseNodeIndexer extends DefaultIndexer implements CourseNod
 
 	private void doIndexAllMessages(SearchResourceContext parentResourceContext, Forum forum, OlatFullIndexer indexWriter) throws IOException,InterruptedException {
 		// loop over all messages of a forum
-		List<Message> messages = ForumManager.getInstance().getMessagesByForum(forum);
+		List<Message> messages = CoreSpringFactory.getImpl(ForumManager.class).getMessagesByForum(forum);
 		for(Message message:messages){
 			SearchResourceContext searchResourceContext = new SearchResourceContext(parentResourceContext);
 			searchResourceContext.setBusinessControlFor(message);
@@ -160,7 +160,7 @@ public class DialogCourseNodeIndexer extends DefaultIndexer implements CourseNod
 		} else if (ores.getResourceableTypeName().equals(OresHelper.calculateTypeName(Message.class))) {
 			// it is message => check message access
 			Long resourceableId = ores.getResourceableId();
-			Message message = ForumManager.getInstance().loadMessage(resourceableId);
+			Message message = CoreSpringFactory.getImpl(ForumManager.class).loadMessage(resourceableId);
 			Message threadtop = message.getThreadtop();
 			if(threadtop==null) {
 				threadtop = message;
diff --git a/src/main/java/org/olat/search/service/indexer/repository/course/FOCourseNodeIndexer.java b/src/main/java/org/olat/search/service/indexer/repository/course/FOCourseNodeIndexer.java
index 0b6526a0446..dcd418f59be 100644
--- a/src/main/java/org/olat/search/service/indexer/repository/course/FOCourseNodeIndexer.java
+++ b/src/main/java/org/olat/search/service/indexer/repository/course/FOCourseNodeIndexer.java
@@ -30,6 +30,7 @@ import java.io.IOException;
 import org.apache.lucene.document.Document;
 import org.olat.basesecurity.BaseSecurityManager;
 import org.olat.basesecurity.Constants;
+import org.olat.core.CoreSpringFactory;
 import org.olat.core.id.Identity;
 import org.olat.core.id.Roles;
 import org.olat.core.id.context.BusinessControl;
@@ -90,7 +91,7 @@ public class FOCourseNodeIndexer extends ForumIndexer implements CourseNodeIndex
 		}
 		
 		Long resourceableId = ce.getOLATResourceable().getResourceableId();
-		Message message = ForumManager.getInstance().loadMessage(resourceableId);
+		Message message = CoreSpringFactory.getImpl(ForumManager.class).loadMessage(resourceableId);
 		if(message != null) {
 			Message threadtop = message.getThreadtop();
 			if(threadtop == null) {
@@ -117,7 +118,7 @@ public class FOCourseNodeIndexer extends ForumIndexer implements CourseNodeIndex
 	 */
 	private void doIndexForum(SearchResourceContext parentResourceContext, ICourse course, CourseNode courseNode, OlatFullIndexer indexWriter) throws IOException,InterruptedException  {
 		if (log.isDebug()) log.debug("Index Course Forum...");
-		ForumManager fom = ForumManager.getInstance();
+		ForumManager fom = CoreSpringFactory.getImpl(ForumManager.class);
 		CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager();
 
 		Property forumKeyProperty = cpm.findCourseNodeProperty(courseNode, null, null, FOCourseNode.FORUM_KEY);
diff --git a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_de.properties
index e28608c4d07..54789b0ca66 100644
--- a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_de.properties
@@ -7,8 +7,6 @@ chat=Chat
 disclaimer=Nutzungsbedigung
 display.portrait=Profilbild
 download.data=Dateien herunterladen
-dx=dr
-dy=dr
 efficiency.statements=Leistungnachweise
 export.options=Export Elemente
 export.start=Start export
@@ -20,6 +18,7 @@ export.user.data.processing=Der Export ist gerade bearbeitet.
 export.user.data.ready=Der Benutzer kann den Export mit dem folgenden Link herunterladen. Sie k\u00F6nnen auch ein en neuen Export erfordern.
 export.user.data.ready.subject=Export von "{0}" ist fertig
 export.user.data.ready.text=<p>Export von "{0}" ist fertig. Es konnte unter <a href\="{1}">{1}</a> heruntergeladen werden</p>
+forums=Foren
 group.memberships=Zugeh\u00F6rigkeit zu Gruppen
 mail=Mail
 notes=Pers\u00F6nliche Notizen
diff --git a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_en.properties
index 860f801c21b..6236b054fd3 100644
--- a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_en.properties
@@ -13,6 +13,7 @@ efficiency.statements=Evidences of achievement
 export.options=Export elements
 export.start=Start export
 export.url=Link to the data
+forums=Forums
 group.memberships=Membership to groups
 mail=Emails
 notes=Notes
diff --git a/src/main/java/org/olat/util/logging/activity/LoggingResourceable.java b/src/main/java/org/olat/util/logging/activity/LoggingResourceable.java
index 2663cad2f67..b8139b7090c 100644
--- a/src/main/java/org/olat/util/logging/activity/LoggingResourceable.java
+++ b/src/main/java/org/olat/util/logging/activity/LoggingResourceable.java
@@ -29,6 +29,7 @@ package org.olat.util.logging.activity;
 import java.io.UnsupportedEncodingException;
 
 import org.olat.commons.calendar.model.Kalendar;
+import org.olat.core.CoreSpringFactory;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.context.ContextEntry;
@@ -447,7 +448,7 @@ public class LoggingResourceable implements ILoggingResourceable {
 	 * @return a LoggingResourceable wrapping the given Forum
 	 */
 	public static LoggingResourceable wrap(Forum forum) {
-		final String name = ForumManager.getInstance().getForumNameForLogging(forum);
+		final String name = CoreSpringFactory.getImpl(ForumManager.class).getForumNameForLogging(forum);
 		return new LoggingResourceable(forum, OlatResourceableType.forum, forum.getResourceableTypeName(),
 				String.valueOf(forum.getResourceableId()), name, false);
 	}
diff --git a/src/test/java/org/olat/restapi/ForumTest.java b/src/test/java/org/olat/restapi/ForumTest.java
index 6e75f8528af..6b73bb8538d 100644
--- a/src/test/java/org/olat/restapi/ForumTest.java
+++ b/src/test/java/org/olat/restapi/ForumTest.java
@@ -216,8 +216,7 @@ public class ForumTest extends OlatJerseyTestCase {
 		
 		//really saved?
 		boolean saved = false;
-		ForumManager fm = ForumManager.getInstance();
-		List<Message> allMessages = fm.getMessagesByForum(forum);
+		List<Message> allMessages = forumManager.getMessagesByForum(forum);
 		for(Message message:allMessages) {
 			if(message.getKey().equals(thread.getKey())) {
 				saved = true;
@@ -249,8 +248,7 @@ public class ForumTest extends OlatJerseyTestCase {
 		
 		//really saved?
 		boolean saved = false;
-		ForumManager fm = ForumManager.getInstance();
-		List<Message> allMessages = fm.getMessagesByForum(forum);
+		List<Message> allMessages = forumManager.getMessagesByForum(forum);
 		for(Message msg:allMessages) {
 			if(msg.getKey().equals(message.getKey())) {
 				saved = true;
@@ -326,8 +324,7 @@ public class ForumTest extends OlatJerseyTestCase {
 		assertEquals(200, attachResponse.getStatusLine().getStatusCode());
 		
 		//check if the file exists
-		ForumManager fm = ForumManager.getInstance();
-		VFSContainer container = fm.getMessageContainer(message.getForumKey(), message.getKey());
+		VFSContainer container = forumManager.getMessageContainer(message.getForumKey(), message.getKey());
 		VFSItem uploadedFile = container.resolve("portrait.jpg");
 		assertNotNull(uploadedFile);
 		assertTrue(uploadedFile instanceof VFSLeaf);
@@ -374,8 +371,7 @@ public class ForumTest extends OlatJerseyTestCase {
 		assertEquals(200, attachCode.getStatusLine().getStatusCode());
 		
 		//check if the file exists
-		ForumManager fm = ForumManager.getInstance();
-		VFSContainer container = fm.getMessageContainer(message.getForumKey(), message.getKey());
+		VFSContainer container = forumManager.getMessageContainer(message.getForumKey(), message.getKey());
 		VFSItem uploadedFile = container.resolve("portrait64.jpg");
 		assertNotNull(uploadedFile);
 		assertTrue(uploadedFile instanceof VFSLeaf);
@@ -439,9 +435,8 @@ public class ForumTest extends OlatJerseyTestCase {
 		}
 		
 		
-		//check if the file exists
-		ForumManager fm = ForumManager.getInstance();
-		VFSContainer container = fm.getMessageContainer(message.getForumKey(), message.getKey());
+		//check if the file existsforumManager
+		VFSContainer container = forumManager.getMessageContainer(message.getForumKey(), message.getKey());
 		VFSItem uploadedFile = container.resolve("portrait64.jpg");
 		assertNotNull(uploadedFile);
 		assertTrue(uploadedFile instanceof VFSLeaf);
@@ -493,8 +488,7 @@ public class ForumTest extends OlatJerseyTestCase {
 		assertEquals(200, attachCode.getStatusLine().getStatusCode());
 		
 		//check if the file exists
-		ForumManager fm = ForumManager.getInstance();
-		VFSContainer container = fm.getMessageContainer(message.getForumKey(), message.getKey());
+		VFSContainer container = forumManager.getMessageContainer(message.getForumKey(), message.getKey());
 		VFSItem uploadedFile = container.resolve("portrait64vo.jpg");
 		assertNotNull(uploadedFile);
 		assertTrue(uploadedFile instanceof VFSLeaf);
diff --git a/src/test/java/org/olat/restapi/GroupMgmtTest.java b/src/test/java/org/olat/restapi/GroupMgmtTest.java
index 86aa3af55b5..a025a6f9184 100644
--- a/src/test/java/org/olat/restapi/GroupMgmtTest.java
+++ b/src/test/java/org/olat/restapi/GroupMgmtTest.java
@@ -61,7 +61,6 @@ import org.olat.collaboration.CollaborationTools;
 import org.olat.collaboration.CollaborationToolsFactory;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.persistence.DB;
-import org.olat.core.commons.persistence.DBFactory;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.logging.OLog;
@@ -111,6 +110,8 @@ public class GroupMgmtTest extends OlatJerseyTestCase {
 	@Autowired
 	private DB dbInstance;
 	@Autowired
+	private ForumManager forumManager;
+	@Autowired
 	private BusinessGroupService businessGroupService;
 	@Autowired
 	private BusinessGroupRelationDAO businessGroupRelationDao;
@@ -139,7 +140,7 @@ public class GroupMgmtTest extends OlatJerseyTestCase {
 		course = rm.findOrPersistResourceable(resourceable);
 		RepositoryService rs = CoreSpringFactory.getImpl(RepositoryService.class);
 		RepositoryEntry re = rs.create("administrator", "-", "rest-re", null, course);
-		DBFactory.getInstance().commit();
+		dbInstance.commit();
 		assertNotNull(re);
 		
 		//create learn group
@@ -148,7 +149,7 @@ public class GroupMgmtTest extends OlatJerseyTestCase {
 		// create groups without waiting list
 		g1 = businessGroupService.createBusinessGroup(null, "rest-g1", null, 0, 10, false, false, c1);
 		g2 = businessGroupService.createBusinessGroup(null, "rest-g2", null, 0, 10, false, false, c1);
-		DBFactory.getInstance().commit();
+		dbInstance.commit();
 		//permission to see owners and participants
 		businessGroupService.updateDisplayMembers(g1, false, false, false, false, false, false, false);
 		businessGroupService.updateDisplayMembers(g2, true, true, false, false, false, false, false);
@@ -169,7 +170,7 @@ public class GroupMgmtTest extends OlatJerseyTestCase {
 		// groups
 		g3 = businessGroupService.createBusinessGroup(null, "rest-g3", null, -1, -1, false, false, c2);
 		g4 = businessGroupService.createBusinessGroup(null, "rest-g4", null, -1, -1, false, false, c2);
-		DBFactory.getInstance().commit();
+		dbInstance.commit();
 		// members
 		businessGroupRelationDao.addRole(owner1, g3, GroupRoles.participant.name());
 		businessGroupRelationDao.addRole(owner2, g4, GroupRoles.participant.name());
@@ -189,42 +190,41 @@ public class GroupMgmtTest extends OlatJerseyTestCase {
 		CollaborationTools collabTools2 = CollaborationToolsFactory.getInstance().getOrCreateCollaborationTools(g2);
 		collabTools2.setToolEnabled(CollaborationTools.TOOL_FORUM, true);
     
-		DBFactory.getInstance().closeSession(); // simulate user clicks
+		dbInstance.closeSession(); // simulate user clicks
     
 		//4) fill forum for g1
 		NarrowedPropertyManager npm = NarrowedPropertyManager.getInstance(g1);
 		Property forumKeyProperty = npm.findProperty(null, null, CollaborationTools.PROP_CAT_BG_COLLABTOOLS, CollaborationTools.KEY_FORUM);
-		ForumManager fm = ForumManager.getInstance();
-		Forum forum = fm.loadForum(forumKeyProperty.getLongValue());
+		Forum forum = forumManager.loadForum(forumKeyProperty.getLongValue());
 		
-		m1 = fm.createMessage(forum, owner1, false);
+		m1 = forumManager.createMessage(forum, owner1, false);
 		m1.setTitle("Thread-1");
 		m1.setBody("Body of Thread-1");
-		fm.addTopMessage(m1);
+		forumManager.addTopMessage(m1);
 		
-		m2 = fm.createMessage(forum, owner2, false);
+		m2 = forumManager.createMessage(forum, owner2, false);
 		m2.setTitle("Thread-2");
 		m2.setBody("Body of Thread-2");
-		fm.addTopMessage(m2);
+		forumManager.addTopMessage(m2);
 		
-		DBFactory.getInstance().intermediateCommit();
+		dbInstance.intermediateCommit();
 		
-		m3 = fm.createMessage(forum, owner3, false);
+		m3 = forumManager.createMessage(forum, owner3, false);
 		m3.setTitle("Message-1.1");
 		m3.setBody("Body of Message-1.1");
-		fm.replyToMessage(m3, m1);
+		forumManager.replyToMessage(m3, m1);
 		
-		m4 = fm.createMessage(forum, part1, false);
+		m4 = forumManager.createMessage(forum, part1, false);
 		m4.setTitle("Message-1.1.1");
 		m4.setBody("Body of Message-1.1.1");
-		fm.replyToMessage(m4, m3);
+		forumManager.replyToMessage(m4, m3);
 		
-		m5 = fm.createMessage(forum, part2, false);
+		m5 = forumManager.createMessage(forum, part2, false);
 		m5.setTitle("Message-1.2");
 		m5.setBody("Body of Message-1.2");
-		fm.replyToMessage(m5, m1);
+		forumManager.replyToMessage(m5, m1);
 
-		DBFactory.getInstance().intermediateCommit();
+		dbInstance.intermediateCommit();
 	}
 	
 	@After
diff --git a/src/test/java/org/olat/restapi/NotificationsTest.java b/src/test/java/org/olat/restapi/NotificationsTest.java
index e9d06a4b99f..1ee9ef3b96c 100644
--- a/src/test/java/org/olat/restapi/NotificationsTest.java
+++ b/src/test/java/org/olat/restapi/NotificationsTest.java
@@ -110,6 +110,8 @@ public class NotificationsTest extends OlatJerseyTestCase {
 	@Autowired
 	private DB dbInstance;
 	@Autowired
+	private ForumManager forumManager;
+	@Autowired
 	private BusinessGroupService businessGroupService;
 	@Autowired
 	private NotificationsManager notificationManager;
@@ -134,7 +136,7 @@ public class NotificationsTest extends OlatJerseyTestCase {
 			}
 			
 			//create a forum
-			forum = ForumManager.getInstance().addAForum();
+			forum = forumManager.addAForum();
 			Message m1 = createMessage(userSubscriberId, forum);
 			Assert.assertNotNull(m1);
 			
@@ -501,11 +503,10 @@ public class NotificationsTest extends OlatJerseyTestCase {
 	}
 	
 	private Message createMessage(Identity id, Forum fo) {
-		ForumManager fm = ForumManager.getInstance();
-		Message m1 = fm.createMessage(fo, id, false);
+		Message m1 = forumManager.createMessage(fo, id, false);
 		m1.setTitle("Thread-1");
 		m1.setBody("Body of Thread-1");
-		fm.addTopMessage(m1);
+		forumManager.addTopMessage(m1);
 		return m1;
 	}
 	
diff --git a/src/test/java/org/olat/restapi/UserMgmtTest.java b/src/test/java/org/olat/restapi/UserMgmtTest.java
index 0bac254f21e..12c3e7e167d 100644
--- a/src/test/java/org/olat/restapi/UserMgmtTest.java
+++ b/src/test/java/org/olat/restapi/UserMgmtTest.java
@@ -144,6 +144,8 @@ public class UserMgmtTest extends OlatJerseyTestCase {
 	@Autowired
 	private DB dbInstance;
 	@Autowired
+	private ForumManager forumManager;
+	@Autowired
 	private BusinessGroupRelationDAO businessGroupRelationDao;
 	@Autowired
 	private BusinessGroupService businessGroupService;
@@ -223,10 +225,10 @@ public class UserMgmtTest extends OlatJerseyTestCase {
 		CollaborationTools g1CTSMngr = CollaborationToolsFactory.getInstance().getOrCreateCollaborationTools(g1);
 		g1CTSMngr.setToolEnabled(CollaborationTools.TOOL_FORUM, true);
 		Forum g1Forum = g1CTSMngr.getForum();//create the forum
-		Message m1 = ForumManager.getInstance().createMessage(g1Forum, id1, false);
+		Message m1 = forumManager.createMessage(g1Forum, id1, false);
 		m1.setTitle("Thread-1");
 		m1.setBody("Body of Thread-1");
-		ForumManager.getInstance().addTopMessage(m1);
+		forumManager.addTopMessage(m1);
 		
 		dbInstance.commitAndCloseSession();
 		
@@ -259,10 +261,10 @@ public class UserMgmtTest extends OlatJerseyTestCase {
 					if(demoForumNode == null) {
 						demoForumNode = (FOCourseNode)node;
 						Forum courseForum = demoForumNode.loadOrCreateForum(demoCourse.getCourseEnvironment());
-						Message message1 = ForumManager.getInstance().createMessage(courseForum, id1, false);
+						Message message1 = forumManager.createMessage(courseForum, id1, false);
 						message1.setTitle("Thread-1");
 						message1.setBody("Body of Thread-1");
-						ForumManager.getInstance().addTopMessage(message1);
+						forumManager.addTopMessage(message1);
 					}	
 				} else if (node instanceof BCCourseNode) {
 					if(demoBCCourseNode == null) {
-- 
GitLab