diff --git a/src/main/java/org/olat/admin/sysinfo/InfoMessageControllerSingleVM.java b/src/main/java/org/olat/admin/sysinfo/InfoMessageControllerSingleVM.java
index 081031a8aa7da7de3adb77caca01a569c6fe2e00..238b5876d3e5d7a25df5afc08d4e7611138fe299 100644
--- a/src/main/java/org/olat/admin/sysinfo/InfoMessageControllerSingleVM.java
+++ b/src/main/java/org/olat/admin/sysinfo/InfoMessageControllerSingleVM.java
@@ -25,21 +25,23 @@
 package org.olat.admin.sysinfo;
 
 import org.olat.admin.AdminModule;
-import org.olat.core.CoreSpringFactory;
+import org.olat.admin.sysinfo.manager.CustomStaticFolderManager;
 import org.olat.core.commons.fullWebApp.util.GlobalStickyMessage;
+import org.olat.core.commons.modules.bc.FolderRunController;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
 import org.olat.core.gui.components.panel.StackedPanel;
-import org.olat.core.gui.components.panel.SimpleStackedPanel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
+import org.olat.core.helpers.Settings;
 import org.olat.properties.Property;
 import org.olat.properties.PropertyManager;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * Description:<br>
@@ -51,10 +53,18 @@ import org.olat.properties.PropertyManager;
  */
 public class InfoMessageControllerSingleVM extends BasicController {
 	
-	private Link infomsgEditButton,infomsgClearButton, maintenancemsgEditButton,maintenancemsgClearButton;
-	private VelocityContainer infoMsgView, infoMsgEdit;
-	private InfoMsgForm infoMsgForm, maintenanceMsgForm;
-	private StackedPanel container;
+	private final Link infomsgEditButton,infomsgClearButton, maintenancemsgEditButton, maintenancemsgClearButton;
+	private final VelocityContainer infoMsgView, infoMsgEdit;
+	private final InfoMsgForm infoMsgForm, maintenanceMsgForm;
+	private final FolderRunController staticFolderCtrl;
+	private final StackedPanel container;
+	
+	@Autowired
+	private PropertyManager pm;
+	@Autowired
+	private InfoMessageManager mrg;
+	@Autowired
+	private CustomStaticFolderManager staticFolderMgr;
 	
 	/**
 	 * 
@@ -63,12 +73,11 @@ public class InfoMessageControllerSingleVM extends BasicController {
 	 */
 	public InfoMessageControllerSingleVM(UserRequest ureq, WindowControl control) {
 		super(ureq, control);
-		container = new SimpleStackedPanel("container");
 		infoMsgView = createVelocityContainer("infomsg");
 		infoMsgEdit = createVelocityContainer("infomsgEdit");
 		infoMsgView.contextPut("cluster", Boolean.FALSE);
 		infoMsgEdit.contextPut("cluster", Boolean.FALSE);
-		PropertyManager pm = PropertyManager.getInstance();
+
 		Property p = pm.findProperty(null, null, null, AdminModule.SYSTEM_PROPERTY_CATEGORY, AdminModule.PROPERTY_MAINTENANCE_MESSAGE);
 		String adminToken = (p == null ? "" : p.getStringValue());
 		infoMsgView.contextPut("admintoken", adminToken);
@@ -78,15 +87,13 @@ public class InfoMessageControllerSingleVM extends BasicController {
 		maintenancemsgEditButton = LinkFactory.createButton("maintenancemsgEdit", infoMsgView, this);
 		maintenancemsgClearButton = LinkFactory.createButton("maintenancemsgClear", infoMsgView, this);
 		
-		//info message stuff
-		InfoMessageManager mrg = (InfoMessageManager)CoreSpringFactory.getBean(InfoMessageManager.class);
+		//login
 		String infoMsg = mrg.getInfoMessage();
 		if (infoMsg != null && infoMsg.length() > 0) {
 			infoMsgView.contextPut("infomsg", infoMsg);
 		}
 		infoMsgForm = new InfoMsgForm(ureq, control, infoMsg);
 		listenTo(infoMsgForm);
-		
 		infoMsgEdit.put("infoMsgForm", infoMsgForm.getInitialComponent());
 		
 		//maintenance message stuff
@@ -98,47 +105,48 @@ public class InfoMessageControllerSingleVM extends BasicController {
 		listenTo(maintenanceMsgForm);
 		infoMsgEdit.put("maintenanceMsgForm", maintenanceMsgForm.getInitialComponent());
 		
-		container.setContent(infoMsgView);
+		// /customizing/static/
+		staticFolderCtrl = new FolderRunController(staticFolderMgr.getRootContainer(), true, ureq, control);
+		listenTo(staticFolderCtrl);
+		infoMsgEdit.put("staticFolder", staticFolderCtrl.getInitialComponent());
+		
+		String url = Settings.getServerContextPathURI() + "/raw/static/";
+		infoMsgEdit.contextPut("extlink", url);
 
-		putInitialPanel(container);
+		container = putInitialPanel(infoMsgView);
 	}
 
-	
+	@Override
+	protected void doDispose() {
+		//
+	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, org.olat.core.gui.components.Component, org.olat.core.gui.control.Event)
-	 */
 	@Override
 	protected void event(UserRequest ureq, Component source, Event event) {
 		if (source == infomsgEditButton){
 			infoMsgEdit.contextPut("infoEdit", Boolean.TRUE);
 			infoMsgEdit.contextPut("cluster", Boolean.FALSE);
 			container.pushContent(infoMsgEdit);
-		}
-		else if (source == maintenancemsgEditButton){
+		} else if (source == maintenancemsgEditButton){
 			infoMsgEdit.contextPut("infoEdit", Boolean.FALSE);
 			infoMsgEdit.contextPut("cluster", Boolean.FALSE);
 			container.pushContent(infoMsgEdit);
-		}
-		
-		// clear buttons
-		else if (source == maintenancemsgClearButton){
+		} else if (source == maintenancemsgClearButton){
 			GlobalStickyMessage.setGlobalStickyMessage("", true);
 			infoMsgView.contextRemove("maintenanceMsgAllNodes");
 			maintenanceMsgForm.reset();
-		}
-		else if (source == infomsgClearButton){
-			InfoMessageManager mrg = (InfoMessageManager)CoreSpringFactory.getBean(InfoMessageManager.class);
+		} else if (source == infomsgClearButton){
 			mrg.setInfoMessage("");
 			infoMsgView.contextRemove("infomsg");
 			infoMsgForm.reset();
 		}
 	}
 		
+	@Override
 	protected void event(UserRequest ureq, Controller source, Event event) {
-		if (source == infoMsgForm && event == Event.DONE_EVENT) {
+		if (source == infoMsgForm) {
+			if(event == Event.DONE_EVENT) {
 				String infoMsg = infoMsgForm.getInfoMsg();
-				InfoMessageManager mrg = (InfoMessageManager)CoreSpringFactory.getBean(InfoMessageManager.class);
 				mrg.setInfoMessage(infoMsg);
 				if (infoMsg != null && infoMsg.length() > 0) {
 					infoMsgView.contextPut("infomsg", infoMsg);
@@ -146,8 +154,10 @@ public class InfoMessageControllerSingleVM extends BasicController {
 				} else {
 					infoMsgView.contextRemove("infomsg");
 				}
-				container.popContent();
-		} else if (source == maintenanceMsgForm && event == Event.DONE_EVENT) {
+			}
+			container.popContent();
+		} else if (source == maintenanceMsgForm) {
+			if(event == Event.DONE_EVENT) {
 				String maintenanceMsg = maintenanceMsgForm.getInfoMsg();
 				GlobalStickyMessage.setGlobalStickyMessage(maintenanceMsg, true);
 				if (maintenanceMsg != null && maintenanceMsg.length() > 0) {
@@ -156,38 +166,24 @@ public class InfoMessageControllerSingleVM extends BasicController {
 				} else {
 					infoMsgView.contextRemove("maintenanceMsgAllNodes");
 				}
-				container.popContent();
-		}
-		
-		if (event == Event.CANCELLED_EVENT && (source == infoMsgForm || source == maintenanceMsgForm)) {
+			}
 			container.popContent();
 		}
-		
 	}
 	
 	protected VelocityContainer getViewContainer() {
 		return infoMsgView;
 	}
+	
 	protected VelocityContainer getEditContainer() {
 		return infoMsgEdit;
 	}
+	
 	protected StackedPanel getMainContainer() {
 		return container;
 	}
+	
 	protected InfoMsgForm getMaintenanceMsgForm() {
 		return maintenanceMsgForm;
 	}
-	
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#doDispose()
-	 */
-	@Override
-	protected void doDispose() {
-	// TODO Auto-generated method stub
-
-	}
-
-
-
-
-}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/admin/sysinfo/InfoMsgForm.java b/src/main/java/org/olat/admin/sysinfo/InfoMsgForm.java
index ce12d1c3b73912b31e7713bf5a343f8b20c1c83b..3829cb30a9c0029066e3f7cb512c13a896891fc4 100644
--- a/src/main/java/org/olat/admin/sysinfo/InfoMsgForm.java
+++ b/src/main/java/org/olat/admin/sysinfo/InfoMsgForm.java
@@ -29,6 +29,7 @@
 
 package org.olat.admin.sysinfo;
 
+import org.olat.admin.sysinfo.manager.CustomStaticFolderManager;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.elements.RichTextElement;
@@ -38,6 +39,7 @@ import org.olat.core.gui.components.form.flexible.impl.elements.richText.RichTex
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * Initial Date:  Apr 30, 2004
@@ -49,7 +51,10 @@ import org.olat.core.gui.control.WindowControl;
 public class InfoMsgForm extends FormBasicController {
 	
 	private RichTextElement msg;
-	private String infomsg;
+	private final String infomsg;
+
+	@Autowired
+	private CustomStaticFolderManager staticFolderMgr;
 	
 	/**
 	 * @param name
@@ -73,7 +78,6 @@ public class InfoMsgForm extends FormBasicController {
 		msg.setValue("");
 	}
 
-
 	@Override
 	protected void formOK(UserRequest ureq) {
 		fireEvent(ureq, Event.DONE_EVENT);
@@ -86,9 +90,9 @@ public class InfoMsgForm extends FormBasicController {
 	
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-		msg = uifactory.addRichTextElementForStringData("msg", "infomsg", infomsg, 20, 70, true, null, null, formLayout, ureq.getUserSession(), getWindowControl());
+		msg = uifactory.addRichTextElementForStringData("msg", "infomsg", infomsg, 20, 70, true, staticFolderMgr.getRootContainer(), null, formLayout, ureq.getUserSession(), getWindowControl());
 		msg.setMaxLength(1024);
-		
+
 		RichTextConfiguration richTextConfig = msg.getEditorConfiguration();
 		// manually enable the source edit button
 		richTextConfig.enableCode();
@@ -98,6 +102,7 @@ public class InfoMsgForm extends FormBasicController {
 		// add style buttons to make alert style available
 		richTextConfig.setContentCSSFromTheme(getWindowControl().getWindowBackOffice().getWindow().getGuiTheme());
 		richTextConfig.enableStyleSelection();
+		richTextConfig.setLinkBrowserAbsolutFilePath("/raw/static/");
 		
 		FormLayoutContainer buttonGroupLayout = FormLayoutContainer.createButtonLayout("buttonGroupLayout", getTranslator());
 		formLayout.add(buttonGroupLayout);
@@ -109,5 +114,4 @@ public class InfoMsgForm extends FormBasicController {
 	protected void doDispose() {
 		//
 	}
-
-}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/admin/sysinfo/_content/infomsgEdit.html b/src/main/java/org/olat/admin/sysinfo/_content/infomsgEdit.html
index 8a478f2ab40f9f2243e897874e58b56226b6729b..66cd49fdc280b5c791d07ee5221b67199c965dd0 100644
--- a/src/main/java/org/olat/admin/sysinfo/_content/infomsgEdit.html
+++ b/src/main/java/org/olat/admin/sysinfo/_content/infomsgEdit.html
@@ -1,4 +1,3 @@
-
 #if ($infoEdit)
 	<h3>$r.translate("infomsgEdit")</h3>
 	#if ($cluster)
@@ -13,4 +12,8 @@
 	#else
 		$r.render("maintenanceMsgForm")
 	#end
-#end
\ No newline at end of file
+#end
+
+<h3>$r.translate("staticFolder")</h3>
+<div class="o_copy_code">$extlink</div>
+$r.render("staticFolder")
\ No newline at end of file
diff --git a/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_de.properties
index 6d79e6de702ba621e393c1c01f272c9f31b022f9..29a4e5c6ed7fb661c70e068f193f1b19584473cb 100644
--- a/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_de.properties
@@ -151,6 +151,7 @@ session.timeout.label=DMZ Session Timeout in Sekunden
 sessionadministration.title=Session Administration
 sessions=Sessions
 snoop=Snoop
+staticFolder=Static Ordner
 sysinfo=Systeminformation
 sysinfo.basedir=Webapp Verzeichnis
 sysinfo.cluster=Cluster
diff --git a/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_en.properties
index 9b152c90f87d4f5f9f4872c65c5870235f994ba8..a0edc35c75b248b314b35c4142fff4df3358beef 100644
--- a/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_en.properties
@@ -151,6 +151,7 @@ session.timeout.label=DMZ session timeout in seconds
 sessionadministration.title=Session administration
 sessions=Sessions
 snoop=Snoop
+staticFolder=Static folder
 sysinfo=System information
 sysinfo.basedir=Webapp directory
 sysinfo.cluster=Cluster
diff --git a/src/main/java/org/olat/admin/sysinfo/manager/CustomStaticFolderManager.java b/src/main/java/org/olat/admin/sysinfo/manager/CustomStaticFolderManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..a751c329b965b31ba38159462bc257bd889bb856
--- /dev/null
+++ b/src/main/java/org/olat/admin/sysinfo/manager/CustomStaticFolderManager.java
@@ -0,0 +1,79 @@
+/**
+ * <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.admin.sysinfo.manager;
+
+import java.io.File;
+
+import org.olat.core.commons.services.webdav.WebDAVProvider;
+import org.olat.core.id.IdentityEnvironment;
+import org.olat.core.logging.OLog;
+import org.olat.core.logging.Tracing;
+import org.olat.core.util.WebappHelper;
+import org.olat.core.util.vfs.LocalFolderImpl;
+import org.olat.core.util.vfs.VFSContainer;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.stereotype.Service;
+
+/**
+ * 
+ * Initial date: 22.01.2015<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+@Service
+public class CustomStaticFolderManager implements InitializingBean, WebDAVProvider {
+
+	private static final OLog log = Tracing.createLoggerFor(CustomStaticFolderManager.class);
+	public static final String STATIC_FOLDER = "/customizing/static/";
+
+	private static final String MOUNT_POINT = "customizing";
+	
+	@Override
+	public void afterPropertiesSet() throws Exception {
+		File file = new File(WebappHelper.getUserDataRoot(), STATIC_FOLDER);
+		if(!file.exists()) {
+			if(!file.mkdirs()) {
+				log.error("/customizing/static/ folder cannot be created");
+			}
+		}
+	}
+
+	public VFSContainer getRootContainer() {
+		File file = new File(WebappHelper.getUserDataRoot(), STATIC_FOLDER);
+		return new LocalFolderImpl(file);
+	}
+	
+	public File getRootFile() {
+		return new File(WebappHelper.getUserDataRoot(), STATIC_FOLDER);
+	}
+
+	@Override
+	public String getMountPoint() {
+		return MOUNT_POINT;
+	}
+
+	@Override
+	public VFSContainer getContainer(IdentityEnvironment identityEnv) {
+		if(identityEnv != null && identityEnv.getRoles() != null && identityEnv.getRoles().isOLATAdmin()) {
+			return getRootContainer();
+		}
+		return null;
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java b/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java
index e957eb2544b8facf99f6a43a3a10df3a8e674cbc..0ae0ba7dfe3d9d757d9f1cdba87ca6df878f4ad2 100644
--- a/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java
+++ b/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java
@@ -45,6 +45,7 @@ import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.util.FileUtils;
+import org.olat.core.util.StringHelper;
 import org.olat.core.util.WebappHelper;
 import org.olat.core.util.vfs.Quota;
 import org.olat.core.util.vfs.VFSContainer;
@@ -77,6 +78,7 @@ public class FileLinkChooserController extends BasicController {
 
 	private final String fileName;
 	private String[] suffixes;
+	private final String absolutePath;
 	private VFSContainer rootDir;
 	@Autowired
 	private MovieService movieService;
@@ -93,11 +95,12 @@ public class FileLinkChooserController extends BasicController {
 	 *          index.html
 	 */
 	public FileLinkChooserController(UserRequest ureq, WindowControl wControl,
-			VFSContainer rootDir, String uploadRelPath, String[] suffixes, String fileName) {
+			VFSContainer rootDir, String uploadRelPath, String absolutePath, String[] suffixes, String fileName) {
 		super(ureq, wControl);
 		this.fileName = fileName;
 		this.suffixes = suffixes;
 		this.rootDir = rootDir;
+		this.absolutePath = absolutePath;
 		this.mainVC = createVelocityContainer("filechooser");
 
 		// file uploads are relative to the currently edited file 
@@ -174,19 +177,12 @@ public class FileLinkChooserController extends BasicController {
 		putInitialPanel(mainVC);
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.components.Component,
-	 *      org.olat.core.gui.control.Event)
-	 */
+	@Override
 	public void event(UserRequest ureq, Component source, Event event) {
 		// no events to catch
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event)
-	 */
+	@Override
 	public void event(UserRequest ureq, Controller source, Event event) {
 		if (source == uploadCtr) {
 			if (event instanceof FolderEvent) {
@@ -197,10 +193,16 @@ public class FileLinkChooserController extends BasicController {
 					if(item != null) {
 						size = getSize(item, item.getName());
 					}
+					
+					String relPath = folderEvent.getFilename();
+					if(StringHelper.containsNonWhitespace(absolutePath)) {
+						relPath = absolutePath + relPath;
+					}
+					
 					if(size != null) {
-						fireEvent(ureq, new URLChoosenEvent(folderEvent.getFilename(), null, null, null, size.getWidth(), size.getHeight()));
+						fireEvent(ureq, new URLChoosenEvent(relPath, null, null, null, size.getWidth(), size.getHeight()));
 					} else {
-						fireEvent(ureq, new URLChoosenEvent(folderEvent.getFilename()));
+						fireEvent(ureq, new URLChoosenEvent(relPath));
 					}
 				} else {
 					setErrorMessage(folderEvent.getFilename());
@@ -224,6 +226,9 @@ public class FileLinkChooserController extends BasicController {
 				String relPath = FileChooserUIFactory
 						.getSelectedRelativeItemPath(fileEvent, rootDir, fileName);
 				// notify parent controller
+				if(StringHelper.containsNonWhitespace(absolutePath)) {
+					relPath = absolutePath + relPath;
+				}
 				
 				if(size != null) {
 					fireEvent(ureq, new URLChoosenEvent(relPath, null, null, null, size.getWidth(), size.getHeight()));
@@ -249,13 +254,13 @@ public class FileLinkChooserController extends BasicController {
 		return size;
 	}
 
-	private boolean isFileSuffixOk(String fileName) {
+	private boolean isFileSuffixOk(String filename) {
 		if (suffixes == null) {
 			// no defined suffixes => all allowed
 			return true;
 		} else {
 			// check if siffix one of allowed suffixes
-			String suffix = getSuffix(fileName);
+			String suffix = getSuffix(filename);
 			for (String allowedSuffix : suffixes) {
 				if (allowedSuffix.equals(suffix)) {
 					return true;
@@ -280,13 +285,14 @@ public class FileLinkChooserController extends BasicController {
 										allowedSuffixes.toString() }));
 	}
 
-	private String getSuffix(String fileName) {
-		return fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
+	private String getSuffix(String filename) {
+		return filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();
 	}
 
 	/**
 	 * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
 	 */
+	@Override
 	protected void doDispose() {
 		// controllers autodisposed by basic controller
 	}
diff --git a/src/main/java/org/olat/core/commons/controllers/linkchooser/LinkChooserController.java b/src/main/java/org/olat/core/commons/controllers/linkchooser/LinkChooserController.java
index 68b12f523b5e2e4b6bd70627f8aef0cbb8b174ac..163555ff388581504810c164e9a5c4760f80e806 100644
--- a/src/main/java/org/olat/core/commons/controllers/linkchooser/LinkChooserController.java
+++ b/src/main/java/org/olat/core/commons/controllers/linkchooser/LinkChooserController.java
@@ -69,7 +69,8 @@ public class LinkChooserController extends BasicController {
 	 *          tree model. The internal-link chooser tab won't be shown when the
 	 *          internalLinkTreeModel is null.
 	 */
-	public LinkChooserController(UserRequest ureq, WindowControl wControl, VFSContainer rootDir, String uploadRelPath, String[] suffixes, String fileName,
+	public LinkChooserController(UserRequest ureq, WindowControl wControl, VFSContainer rootDir,
+			String uploadRelPath, String absolutPath, String[] suffixes, String fileName,
 			CustomLinkTreeModel customLinkTreeModel) {
 		super(ureq, wControl);
 		
@@ -78,7 +79,7 @@ public class LinkChooserController extends BasicController {
 		linkChooserTabbedPane = new TabbedPane("linkChooserTabbedPane", ureq.getLocale());
 		tabbedPaneViewVC.put("linkChooserTabbedPane", linkChooserTabbedPane);
 
-		fileLinkChooserController = new FileLinkChooserController(ureq, wControl, rootDir, uploadRelPath, suffixes, fileName);		
+		fileLinkChooserController = new FileLinkChooserController(ureq, wControl, rootDir, uploadRelPath, absolutPath, suffixes, fileName);		
 		listenTo(fileLinkChooserController);
 		linkChooserTabbedPane.addTab(translate("linkchooser.tabbedpane.label.filechooser"), fileLinkChooserController.getInitialComponent());
 		
diff --git a/src/main/java/org/olat/core/commons/controllers/linkchooser/MediaChooserController.java b/src/main/java/org/olat/core/commons/controllers/linkchooser/MediaChooserController.java
index 2ded6153438ea0360ef21c7a47197e9df8e63d68..9953249ffb57966c843f401257d3d2d9d3ce7687 100644
--- a/src/main/java/org/olat/core/commons/controllers/linkchooser/MediaChooserController.java
+++ b/src/main/java/org/olat/core/commons/controllers/linkchooser/MediaChooserController.java
@@ -64,7 +64,7 @@ public class MediaChooserController extends LinkChooserController {
 	 */
 	public MediaChooserController(UserRequest ureq, WindowControl wControl, VFSContainer rootDir, String uploadRelPath, String[] suffixes, String fileName,
 			CustomLinkTreeModel customLinkTreeModel) {
-		super(ureq, wControl, rootDir, uploadRelPath, suffixes, fileName, customLinkTreeModel);
+		super(ureq, wControl, rootDir, uploadRelPath, null, suffixes, fileName, customLinkTreeModel);
 	}
 
 	/**
diff --git a/src/main/java/org/olat/core/commons/modules/bc/FileCopyController.java b/src/main/java/org/olat/core/commons/modules/bc/FileCopyController.java
index 1a277b66eb5b575cf947ce0f30ce69a58529c9fc..325776f5866f8f81dfb7c5b787fadfd5fe9967fb 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/FileCopyController.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/FileCopyController.java
@@ -87,7 +87,7 @@ public class FileCopyController extends LinkChooserController {
 	
 	public FileCopyController(UserRequest ureq, WindowControl wControl, VFSContainer rootDir,
 			FolderComponent folderComponent) {
-		super(ureq, wControl, rootDir, null, null, "", null);
+		super(ureq, wControl, rootDir, null, null, null, "", null);
 		this.folderComponent = folderComponent;
 		vfsLockManager = CoreSpringFactory.getImpl(VFSLockManager.class);
 	}
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextConfiguration.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextConfiguration.java
index 2470e4e4af04d03915e908dda23f24d2bc71d7e5..647847f6321cda968274c6f4784d6a896a717724 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextConfiguration.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextConfiguration.java
@@ -139,6 +139,7 @@ public class RichTextConfiguration implements Disposable {
 	private VFSContainer linkBrowserBaseContainer;
 	private String linkBrowserUploadRelPath;
 	private String linkBrowserRelativeFilePath;
+	private String linkBrowserAbsolutFilePath;
 	private CustomLinkTreeModel linkBrowserCustomTreeModel;	
 	// DOM ID of the flexi form element
 	private String domID;
@@ -698,6 +699,14 @@ public class RichTextConfiguration implements Disposable {
 		return linkBrowserRelativeFilePath;
 	}
 	
+	public String getLinkBrowserAbsolutFilePath() {
+		return linkBrowserAbsolutFilePath;
+	}
+
+	public void setLinkBrowserAbsolutFilePath(String linkBrowserAbsolutFilePath) {
+		this.linkBrowserAbsolutFilePath = linkBrowserAbsolutFilePath;
+	}
+
 	/**
 	 * Get the optional custom link browser tree model
 	 * @return the model or NULL if not defined
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextElementComponent.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextElementComponent.java
index 03ea1913f3626b12694de2c6665a31c89e9efe28..e119913df7b2d60e041660b12f311822ad018de9 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextElementComponent.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextElementComponent.java
@@ -23,7 +23,6 @@ package org.olat.core.gui.components.form.flexible.impl.elements.richText;
 import org.olat.core.commons.controllers.linkchooser.CustomLinkTreeModel;
 import org.olat.core.commons.controllers.linkchooser.LinkChooserController;
 import org.olat.core.commons.fullWebApp.LayoutMain3ColsController;
-import org.olat.core.dispatcher.impl.StaticMediaDispatcher;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.Windows;
 import org.olat.core.gui.components.ComponentRenderer;
@@ -33,9 +32,7 @@ import org.olat.core.gui.control.JSAndCSSAdder;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.creator.ControllerCreator;
 import org.olat.core.gui.control.generic.popup.PopupBrowserWindow;
-import org.olat.core.gui.render.StringOutput;
 import org.olat.core.gui.render.ValidationResult;
-import org.olat.core.helpers.Settings;
 import org.olat.core.util.vfs.VFSContainer;
 
 /**
@@ -54,13 +51,11 @@ class RichTextElementComponent extends FormBaseComponentImpl {
 	private static final String CMD_IMAGEBROWSER = "image";
 	private static final String CMD_FLASHPLAYERBROWSER = "flashplayer";
 	private static final String CMD_FILEBROWSER = "file";
+	private static final ComponentRenderer RENDERER = new RichTextElementRenderer();
 
-	private ComponentRenderer RENDERER = new RichTextElementRenderer();
-	private RichTextElementImpl element;
+	private final RichTextElementImpl element;
 	private int cols;
 	private int rows;
-	
-	private boolean useTiny4 = true;
 
 	/**
 	 * Constructor for a text area element
@@ -108,54 +103,13 @@ class RichTextElementComponent extends FormBaseComponentImpl {
 		this.rows = rows;
 	}
 
-	public boolean isUseTiny4() {
-		return useTiny4;
-	}
-
-	/**
-	 * @see org.olat.core.gui.components.Component#validate(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.render.ValidationResult)
-	 */
 	@Override
 	public void validate(UserRequest ureq, ValidationResult vr) {
 		super.validate(ureq, vr);
 		JSAndCSSAdder jsa = vr.getJsAndCSSAdder();
-		
-		if(useTiny4) {
-			jsa.addRequiredStaticJsFile("js/tinymce4/BTinyHelper.js");
-		} else {
-			// Add tiny helper library
-			//jsa.addRequiredJsFile(RichTextElementComponent.class,"js/BTinyHelper.js", "UTF-8");
-			jsa.addRequiredStaticJsFile("js/tinymce/BTinyHelper.js");
-	
-			// When the tiny_mce.js is inserted via AJAX, we need to setup some
-			// variables first to make it load properly:
-			StringOutput sb = new StringOutput();
-			// 1) Use tinyMCEPreInit to prevent TinyMCE to guess the script URL. The
-			// script URL is needed because TinyMCE will load CSS, plugins and other
-			// resources
-			sb.append("tinyMCEPreInit = {};")
-			  .append("tinyMCEPreInit.suffix = '';")
-			  .append("tinyMCEPreInit.base = '");
-			StaticMediaDispatcher.renderStaticURI(sb, "js/tinymce/tinymce", false);
-			sb.append("';");
-	
-			// 2) Tell TinyMCE that the page has already been loaded
-			sb.append("tinyMCE_GZ = {};");
-			sb.append("tinyMCE_GZ.loaded = true;");
-			String preAJAXinsertionCode = sb.toString();
-	
-			// Now add tiny library itself. TinyMCE files are written in iso-8859-1
-			// (important, IE panics otherwise with error 8002010)
-			if (Settings.isDebuging()) {
-				jsa.addRequiredStaticJsFile("js/tinymce/tinymce/tiny_mce_src.js", "ISO-8859-1",preAJAXinsertionCode);
-			} else {
-				jsa.addRequiredStaticJsFile("js/tinymce/tinymce/tiny_mce.js", "ISO-8859-1", preAJAXinsertionCode);
-			}
-		}
+		jsa.addRequiredStaticJsFile("js/tinymce4/BTinyHelper.js");
 	}
 
-	
 	@Override
 	protected void doDispatchRequest(UserRequest ureq) {
 		// SPECIAL CASE - normally this method is never overriden. For the rich text
@@ -170,7 +124,6 @@ class RichTextElementComponent extends FormBaseComponentImpl {
 		setDirty(false);
 	}
 	
-	
 	private void createFileSelectorPopupWindow(final UserRequest ureq, final String type, final String fileName) {
 		// Get allowed suffixes from configuration and requested media browser type from event
 		final RichTextConfiguration config = element.getEditorConfiguration();
@@ -195,14 +148,15 @@ class RichTextElementComponent extends FormBaseComponentImpl {
 				LinkChooserController myLinkChooserController;
 				VFSContainer baseContainer = config.getLinkBrowserBaseContainer();
 				String uploadRelPath = config.getLinkBrowserUploadRelPath();
+				String absolutePath = config.getLinkBrowserAbsolutFilePath();
 				CustomLinkTreeModel linkBrowserCustomTreeModel = config.getLinkBrowserCustomLinkTreeModel();
 				if (type.equals(CMD_FILEBROWSER)) {
 					// when in file mode we include the internal links to the selection
 					//FIXME: user activity logger
-					myLinkChooserController = new LinkChooserController(lureq, lwControl, baseContainer, uploadRelPath, suffixes, fileName, linkBrowserCustomTreeModel);			
+					myLinkChooserController = new LinkChooserController(lureq, lwControl, baseContainer, uploadRelPath, absolutePath, suffixes, fileName, linkBrowserCustomTreeModel);			
 				} else {
 					// in media or image mode, internal links make no sense here
-					myLinkChooserController = new LinkChooserController(lureq, lwControl, baseContainer, uploadRelPath, suffixes, fileName, null);						
+					myLinkChooserController = new LinkChooserController(lureq, lwControl, baseContainer, uploadRelPath, absolutePath, suffixes, fileName, null);						
 				}
 				return new LayoutMain3ColsController(lureq, lwControl, myLinkChooserController);
 			}
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextElementRenderer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextElementRenderer.java
index 6fff98f2ef5a0540198b843960660e4f34f54513..abadef55ba81091d09e4606718f965c5cf416e46 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextElementRenderer.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextElementRenderer.java
@@ -25,11 +25,10 @@ import java.util.List;
 import org.apache.commons.lang.StringEscapeUtils;
 import org.olat.core.dispatcher.impl.StaticMediaDispatcher;
 import org.olat.core.gui.components.Component;
-import org.olat.core.gui.components.ComponentRenderer;
+import org.olat.core.gui.components.DefaultComponentRenderer;
 import org.olat.core.gui.components.form.flexible.impl.FormJSHelper;
 import org.olat.core.gui.render.RenderResult;
 import org.olat.core.gui.render.Renderer;
-import org.olat.core.gui.render.RenderingState;
 import org.olat.core.gui.render.StringOutput;
 import org.olat.core.gui.render.URLBuilder;
 import org.olat.core.gui.translator.Translator;
@@ -46,7 +45,7 @@ import org.olat.core.util.Formatter;
  * 
  * @author gnaegi
  */
-class RichTextElementRenderer implements ComponentRenderer {
+class RichTextElementRenderer extends DefaultComponentRenderer {
 
 	/**
 	 * @see org.olat.core.gui.components.ComponentRenderer#render(org.olat.core.gui.render.Renderer,
@@ -85,7 +84,7 @@ class RichTextElementRenderer implements ComponentRenderer {
 			sb.append("\" >");
 			sb.append(Formatter.formatLatexFormulas(value));
 			sb.append("</div>");
-		} else if(teC.isUseTiny4()) {
+		} else {
 			renderTinyMCE_4(sb, domID, teC, ubu, source.getTranslator());
 		}
 	}
@@ -165,32 +164,4 @@ class RichTextElementRenderer implements ComponentRenderer {
 		sb.append(StringEscapeUtils.escapeHtml(value));
 		sb.append("</textarea>");
 	}
-
-	/**
-	 * @see org.olat.core.gui.components.ComponentRenderer#renderBodyOnLoadJSFunctionCall(org.olat.core.gui.render.Renderer,
-	 *      org.olat.core.gui.render.StringOutput,
-	 *      org.olat.core.gui.components.Component,
-	 *      org.olat.core.gui.render.RenderingState)
-	 */
-	@Override
-	public void renderBodyOnLoadJSFunctionCall(Renderer renderer,
-			StringOutput sb, Component source, RenderingState rstate) {
-		// nothing to load
-	}
-
-	/**
-	 * @see org.olat.core.gui.components.ComponentRenderer#renderHeaderIncludes(org.olat.core.gui.render.Renderer,
-	 *      org.olat.core.gui.render.StringOutput,
-	 *      org.olat.core.gui.components.Component,
-	 *      org.olat.core.gui.render.URLBuilder,
-	 *      org.olat.core.gui.translator.Translator,
-	 *      org.olat.core.gui.render.RenderingState)
-	 */
-	@Override
-	public void renderHeaderIncludes(Renderer renderer, StringOutput sb,
-			Component source, URLBuilder ubu, Translator translator,
-			RenderingState rstate) {
-		// no headers to include
-	}
-
 }
diff --git a/src/main/java/org/olat/core/servlets/StaticServlet.java b/src/main/java/org/olat/core/servlets/StaticServlet.java
index 8126618cfe63b8e003d970b4aebd9bdda19d4feb..4b72e70d8e2ecc2a6d395bd4fb2f06b4d4e65a22 100644
--- a/src/main/java/org/olat/core/servlets/StaticServlet.java
+++ b/src/main/java/org/olat/core/servlets/StaticServlet.java
@@ -27,6 +27,8 @@ import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.olat.admin.sysinfo.manager.CustomStaticFolderManager;
+import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.media.FileMediaResource;
 import org.olat.core.gui.media.MediaResource;
 import org.olat.core.gui.media.ServletUtil;
@@ -81,6 +83,18 @@ public class StaticServlet extends HttpServlet {
 		if (pathInfo.indexOf(NOVERSION) != -1) {
 			// no version provided - only remove mapper
 			staticRelPath = pathInfo.substring(NOVERSION.length() + 1, pathInfo.length());
+		} else if (pathInfo.startsWith(STATIC_DIR_NAME)) {
+			staticRelPath = pathInfo.substring(STATIC_DIR_NAME.length() + 1, pathInfo.length());
+			//customizing 
+			CustomStaticFolderManager folderManager = CoreSpringFactory.getImpl(CustomStaticFolderManager.class);
+			File file = new File(folderManager.getRootFile(), staticRelPath);
+			if(file.exists()) {
+				MediaResource resource = new FileMediaResource(file);
+		    	ServletUtil.serveResource(request, response, resource);
+			} else {
+				response.sendError(HttpServletResponse.SC_NOT_FOUND);
+			}
+			return;
 		} else {
 			// version provided - remove it
 			String version;
diff --git a/src/main/java/org/olat/modules/dialog/DialogElementsController.java b/src/main/java/org/olat/modules/dialog/DialogElementsController.java
index 1b620ad6f7a24a1f7fea886c35699a4b4acfea50..51e1b3a8dda4eedb7197972c06187b0183dfcec2 100644
--- a/src/main/java/org/olat/modules/dialog/DialogElementsController.java
+++ b/src/main/java/org/olat/modules/dialog/DialogElementsController.java
@@ -463,7 +463,7 @@ public class DialogElementsController extends BasicController {
 	
 	private class MyLinkChooserController extends LinkChooserController {
 		public MyLinkChooserController(UserRequest ureq, WindowControl wControl, VFSContainer rootDir, String uploadRelPath) {
-			super(ureq, wControl, rootDir, uploadRelPath, null, "", null);
+			super(ureq, wControl, rootDir, uploadRelPath, null, null, "", null);
 		}
 		
 		@Override
diff --git a/src/main/webapp/static/movie/player.js b/src/main/webapp/static/movie/player.js
index a75ccd661487acb727f37c3545a407490ac068b2..c24830e308c7a2d037892cc4ec72083a3da0a703 100644
--- a/src/main/webapp/static/movie/player.js
+++ b/src/main/webapp/static/movie/player.js
@@ -25,7 +25,7 @@ var BPlayer = {
 	
 	insertHTML5Player : function (address, domId, width, height, start, duration, provider, streamer, autostart, repeat, controlbar, poster) {
 		var videoUrl = address
-		if(address.indexOf('://') < 0 && (address.indexOf('/secstatic/qtieditor/') >= 0 || address.indexOf('/secstatic/qti/') >= 0)) {
+		if(address.indexOf('://') < 0 && (address.indexOf('/raw/static/') == 0 || address.indexOf('/secstatic/qtieditor/') >= 0 || address.indexOf('/secstatic/qti/') >= 0)) {
 			videoUrl = address;
 		} else if(address.indexOf('://') < 0 && ((provider != "rtmp" && provider != "http") ||
 				((provider == "rtmp" || provider == "http") && (streamer == undefined || streamer.length == 0)))) {