diff --git a/src/main/java/de/bps/course/nodes/ll/LLRunController.java b/src/main/java/de/bps/course/nodes/ll/LLRunController.java
index 3d6bb868ae04abd4de56fd2383bd4c60414aaf7e..98e586cb92d845f0e2cc13ba8478d1bf934c387f 100644
--- a/src/main/java/de/bps/course/nodes/ll/LLRunController.java
+++ b/src/main/java/de/bps/course/nodes/ll/LLRunController.java
@@ -24,7 +24,7 @@ import java.util.List;
 import javax.servlet.http.HttpServletRequest;
 
 import org.olat.core.CoreSpringFactory;
-import org.olat.core.commons.controllers.linkchooser.CustomMediaChooserController;
+import org.olat.core.commons.controllers.linkchooser.CustomMediaChooserFactory;
 import org.olat.core.dispatcher.mapper.Mapper;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
@@ -56,30 +56,28 @@ import de.bps.course.nodes.LLCourseNode;
  */
 public class LLRunController extends BasicController {
 
-	private VelocityContainer runVC;
-	
 
 	public LLRunController(UserRequest ureq, WindowControl wControl, ModuleConfiguration moduleConfig, LLCourseNode llCourseNode,
 			UserCourseEnvironment userCourseEnv, boolean showLinkComments) {
 		super(ureq, wControl);
-		this.runVC = this.createVelocityContainer("run");
-		final List<LLModel> linkList = (List<LLModel>) moduleConfig.get(LLCourseNode.CONF_LINKLIST);
-		this.runVC.contextPut("linkList", linkList);
-		this.runVC.contextPut("showLinkComments", Boolean.valueOf(showLinkComments));
+		VelocityContainer runVC = createVelocityContainer("run");
 		
+		@SuppressWarnings("unchecked")
+		final List<LLModel> linkList = (List<LLModel>) moduleConfig.get(LLCourseNode.CONF_LINKLIST);
+		runVC.contextPut("linkList", linkList);
+		runVC.contextPut("showLinkComments", Boolean.valueOf(showLinkComments));
 		
 		CourseEnvironment courseEnv = userCourseEnv.getCourseEnvironment();
 		VFSContainer courseContainer = courseEnv.getCourseFolderContainer();
 		Mapper customMapper = null;
-		if (CoreSpringFactory.containsBean(CustomMediaChooserController.class.getName())) {
-			CustomMediaChooserController customMediaChooserFactory = (CustomMediaChooserController) CoreSpringFactory.getBean(CustomMediaChooserController.class.getName());
-			customMapper = customMediaChooserFactory.getMapperInstance(courseContainer, null, null);
+		if (CoreSpringFactory.containsBean(CustomMediaChooserFactory.class.getName())) {
+			CustomMediaChooserFactory customMediaChooserFactory = (CustomMediaChooserFactory)CoreSpringFactory.getBean(CustomMediaChooserFactory.class.getName());
+			customMapper = customMediaChooserFactory.getMapperInstance();
 		}
 		String mapperID = courseEnv.getCourseResourceableId() + "/" + llCourseNode.getIdent();
 		String mapperBaseUrl = registerCacheableMapper(ureq, mapperID, new LLMapper(linkList, customMapper, courseContainer));
 		
 		runVC.contextPut("mapperBaseUrl", mapperBaseUrl);
-		
 		putInitialPanel(runVC);
 	}
 
diff --git a/src/main/java/org/olat/commons/calendar/ui/KalendarEntryDetailsController.java b/src/main/java/org/olat/commons/calendar/ui/KalendarEntryDetailsController.java
index 899c2d3a6911e3601e9c0819d9bdef9bf05459a8..d2b9fe88b7bbdaa33a47c7a5244a6306ea34647c 100644
--- a/src/main/java/org/olat/commons/calendar/ui/KalendarEntryDetailsController.java
+++ b/src/main/java/org/olat/commons/calendar/ui/KalendarEntryDetailsController.java
@@ -37,6 +37,7 @@ import org.olat.commons.calendar.model.KalendarEventLink;
 import org.olat.commons.calendar.ui.components.KalendarRenderWrapper;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.controllers.linkchooser.CustomMediaChooserController;
+import org.olat.core.commons.controllers.linkchooser.CustomMediaChooserFactory;
 import org.olat.core.commons.controllers.linkchooser.URLChoosenEvent;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
@@ -109,12 +110,12 @@ public class KalendarEntryDetailsController extends BasicController {
 			pane.addTab(translate("tab.links"), linkVC);
 			
 			//custom media chooser
-			if (CoreSpringFactory.containsBean(CustomMediaChooserController.class.getName())) {
-				CustomMediaChooserController customMediaChooserFactory = (CustomMediaChooserController) CoreSpringFactory.getBean(CustomMediaChooserController.class.getName());
-				customMediaChooserCtr = customMediaChooserFactory.getInstance(ureq, wControl, null, null, null); 
+			if (CoreSpringFactory.containsBean(CustomMediaChooserFactory.class.getName())) {
+				CustomMediaChooserFactory customMediaChooserFactory = (CustomMediaChooserFactory) CoreSpringFactory.getBean(CustomMediaChooserFactory.class.getName());
+				customMediaChooserCtr = customMediaChooserFactory.getInstance(ureq, wControl); 
 				if (customMediaChooserCtr != null) {
 					listenTo(customMediaChooserCtr);
-					mediaLinksController = new MediaLinksController(ureq, wControl, kalendarEvent, customMediaChooserCtr);
+					mediaLinksController = new MediaLinksController(ureq, wControl, kalendarEvent, customMediaChooserFactory);
 					pane.addTab(customMediaChooserCtr.getTabbedPaneTitle(), mediaLinksController.getInitialComponent());	
 					listenTo(mediaLinksController);
 				}				
diff --git a/src/main/java/org/olat/commons/calendar/ui/MediaLinksController.java b/src/main/java/org/olat/commons/calendar/ui/MediaLinksController.java
index d951ff3b21fd858dfe9aedea672fea8b1b1d9bd8..0f137e22cac2d1fa55c30e397af28e158bb79079 100644
--- a/src/main/java/org/olat/commons/calendar/ui/MediaLinksController.java
+++ b/src/main/java/org/olat/commons/calendar/ui/MediaLinksController.java
@@ -31,9 +31,9 @@ import org.olat.commons.calendar.CalendarManager;
 import org.olat.commons.calendar.model.KalendarEvent;
 import org.olat.commons.calendar.model.KalendarEventLink;
 import org.olat.core.commons.controllers.linkchooser.CustomMediaChooserController;
+import org.olat.core.commons.controllers.linkchooser.CustomMediaChooserFactory;
 import org.olat.core.commons.controllers.linkchooser.URLChoosenEvent;
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.elements.FormLink;
@@ -76,16 +76,16 @@ public class MediaLinksController extends FormBasicController {
 	private FormLayoutContainer linksContainer;
 	private CloseableModalController mediaDialogBox;
 	private CustomMediaChooserController mediaChooserController;
-	private CustomMediaChooserController customMediaChooserController;
 
 	public MediaLinksController(UserRequest ureq, WindowControl wControl, KalendarEvent kalendarEvent,
-			CustomMediaChooserController customMediaChooserController) {
+			CustomMediaChooserFactory customMediaChooserFactory) {
 		super(ureq, wControl, LAYOUT_VERTICAL);
 		setBasePackage(CalendarManager.class);
 		
 		this.kalendarEvent = kalendarEvent;
-		this.customMediaChooserController = customMediaChooserController;
-		this.provider = customMediaChooserController.getClass().getSimpleName();
+		mediaChooserController = customMediaChooserFactory.getInstance(ureq, wControl);
+		listenTo(mediaChooserController);
+		this.provider = mediaChooserController.getClass().getSimpleName();
 
 		externalLinks = new ArrayList<LinkWrapper>();
 		List<KalendarEventLink> links = kalendarEvent.getKalendarEventLinks();
@@ -204,11 +204,7 @@ public class MediaLinksController extends FormBasicController {
 				}
 			} else if (currentLink.getMediaButton().equals(source)) {
 				removeAsListenerAndDispose(mediaDialogBox);
-				removeAsListenerAndDispose(mediaChooserController);
-				
-				mediaChooserController = customMediaChooserController.getInstance(ureq, getWindowControl(), null, null, "");
-				listenTo(mediaChooserController);
-				
+
 				mediaDialogBox = new CloseableModalController(getWindowControl(), translate("choose"), mediaChooserController.getInitialComponent());
 				mediaDialogBox.activate();
 				listenTo(mediaDialogBox);
@@ -216,18 +212,12 @@ public class MediaLinksController extends FormBasicController {
 		}
 	}
 
-	@Override
-	public void event(UserRequest ureq, Component source, Event event) {
-		super.event(ureq, source, event);
-	}
 
 	@Override
 	protected void event(UserRequest ureq, Controller source, Event event) {
 		if(source == mediaDialogBox) {
 			removeAsListenerAndDispose(mediaDialogBox);
-			removeAsListenerAndDispose(mediaChooserController);
 			mediaDialogBox = null;
-			mediaChooserController = null;
 		} else if(mediaChooserController == source) {
 			if(event instanceof URLChoosenEvent) {
 				URLChoosenEvent choosenEvent = (URLChoosenEvent)event;
@@ -240,9 +230,7 @@ public class MediaLinksController extends FormBasicController {
 			}
 			mediaDialogBox.deactivate();
 			removeAsListenerAndDispose(mediaDialogBox);
-			removeAsListenerAndDispose(mediaChooserController);
 			mediaDialogBox = null;
-			mediaChooserController = null;
 		}
 		super.event(ureq, source, event);
 	}
@@ -283,7 +271,7 @@ public class MediaLinksController extends FormBasicController {
 		//remove deleted links
 		for(Iterator<KalendarEventLink> it=links.iterator(); it.hasNext(); ) {
 			KalendarEventLink link = it.next();
-			if(provider.equals(link.getId()) && !usedUuids.contains(link.getId())) {
+			if(provider.equals(link.getProvider()) && !usedUuids.contains(link.getId())) {
 				it.remove();
 			}
 		}
diff --git a/src/main/java/org/olat/core/commons/controllers/linkchooser/CustomMediaChooserController.java b/src/main/java/org/olat/core/commons/controllers/linkchooser/CustomMediaChooserController.java
index fca3fb63d79dc80db77f377178a6e3b4ebc67a64..5ce480e449d2664aeb115e0e9c076a0a5a8b031c 100644
--- a/src/main/java/org/olat/core/commons/controllers/linkchooser/CustomMediaChooserController.java
+++ b/src/main/java/org/olat/core/commons/controllers/linkchooser/CustomMediaChooserController.java
@@ -34,11 +34,8 @@ package org.olat.core.commons.controllers.linkchooser;
  * 
  * @author Florian Gnägi, frentix GmbH, http://www.frentix.com
  */
-import org.olat.core.dispatcher.mapper.Mapper;
-import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.DefaultController;
 import org.olat.core.gui.control.WindowControl;
-import org.olat.core.util.vfs.VFSContainer;
 
 public abstract class CustomMediaChooserController extends DefaultController {
 
@@ -51,28 +48,8 @@ public abstract class CustomMediaChooserController extends DefaultController {
 		super(wControl);
 	}
 
-	/**
-	 * Factory method to create a custom media chooser controller from a (Spring)
-	 * instance
-	 * 
-	 * @param ureq
-	 * @param wControl
-	 * @param rootDir
-	 * @param suffixes
-	 * @param fileName
-	 * @param userActivityLogger
-	 * @return true if success, false if no success, e.g. because user has no
-	 *         access right to start this controller
-	 */
-	abstract public CustomMediaChooserController getInstance(UserRequest ureq, WindowControl wControl, VFSContainer rootDir,
-			String[] suffixes, String fileName);
-	
-	//fxdiff
-	abstract public Mapper getMapperInstance(VFSContainer rootDir, String[] suffixes, String fileName);
-
 	/**
 	 * @return Title for media chooser tabbed pane
 	 */
-	abstract public String getTabbedPaneTitle();
-
+	 public abstract String getTabbedPaneTitle();
 }
diff --git a/src/main/java/org/olat/core/commons/controllers/linkchooser/CustomMediaChooserFactory.java b/src/main/java/org/olat/core/commons/controllers/linkchooser/CustomMediaChooserFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..c6725eaffbc5d9fa22d8afc927699c06e2f51919
--- /dev/null
+++ b/src/main/java/org/olat/core/commons/controllers/linkchooser/CustomMediaChooserFactory.java
@@ -0,0 +1,38 @@
+/**
+ * <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.core.commons.controllers.linkchooser;
+
+import org.olat.core.dispatcher.mapper.Mapper;
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.control.WindowControl;
+
+/**
+ * 
+ * Initial date: 04.12.2014<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public interface CustomMediaChooserFactory  {
+	
+	public Mapper getMapperInstance();
+
+	public CustomMediaChooserController getInstance(UserRequest ureq, WindowControl wControl);
+	
+}
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 59f8706173064d1ceb2ae722fe51a290e134b753..68b12f523b5e2e4b6bd70627f8aef0cbb8b174ac 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
@@ -90,9 +90,9 @@ public class LinkChooserController extends BasicController {
 		
 		// try to add custom media chooser from spring configuration. 
 		// This one will be added as additional tab.
-		if (CoreSpringFactory.containsBean(CustomMediaChooserController.class.getName())) {
-			CustomMediaChooserController customMediaChooserFactory = (CustomMediaChooserController) CoreSpringFactory.getBean(CustomMediaChooserController.class.getName());
-			customMediaChooserCtr = customMediaChooserFactory.getInstance(ureq, wControl, rootDir, suffixes, fileName); 
+		if (CoreSpringFactory.containsBean(CustomMediaChooserFactory.class.getName())) {
+			CustomMediaChooserFactory customMediaChooserFactory = (CustomMediaChooserFactory) CoreSpringFactory.getBean(CustomMediaChooserFactory.class.getName());
+			customMediaChooserCtr = customMediaChooserFactory.getInstance(ureq, wControl); 
 			if (customMediaChooserCtr != null) {
 				listenTo(customMediaChooserCtr);
 				linkChooserTabbedPane.addTab(customMediaChooserCtr.getTabbedPaneTitle(), customMediaChooserCtr.getInitialComponent());				
diff --git a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdServeResource.java b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdServeResource.java
index a4529e5b0b42d83b4e3e2d0917b63646e2a04943..7c904ddd6006453f50d82b75a2c01966d1adbc11 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdServeResource.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdServeResource.java
@@ -88,43 +88,47 @@ public class CmdServeResource implements FolderCommand {
 				// set the http content-type and the encoding
 				// try to load in iso-8859-1
 				InputStream is = vfsfile.getInputStream();
-				String page = FileUtils.load(is, DEFAULT_ENCODING);
-				// search for the <meta content="text/html; charset=utf-8"
-				// http-equiv="Content-Type" /> tag
-				// if none found, assume iso-8859-1
-				String enc = DEFAULT_ENCODING;
-				boolean useLoaded = false;
-				// <meta.*charset=([^"]*)"
-				Matcher m = PATTERN_ENCTYPE.matcher(page);
-				boolean found = m.find();
-				if (found) {
-					String htmlcharset = m.group(1);
-					enc = htmlcharset;
-					if (htmlcharset.equals(DEFAULT_ENCODING)) {
+				if(is == null) {
+					mr = new NotFoundMediaResource(path);
+				} else {
+					String page = FileUtils.load(is, DEFAULT_ENCODING);
+					// search for the <meta content="text/html; charset=utf-8"
+					// http-equiv="Content-Type" /> tag
+					// if none found, assume iso-8859-1
+					String enc = DEFAULT_ENCODING;
+					boolean useLoaded = false;
+					// <meta.*charset=([^"]*)"
+					Matcher m = PATTERN_ENCTYPE.matcher(page);
+					boolean found = m.find();
+					if (found) {
+						String htmlcharset = m.group(1);
+						enc = htmlcharset;
+						if (htmlcharset.equals(DEFAULT_ENCODING)) {
+							useLoaded = true;
+						}
+					} else {
 						useLoaded = true;
 					}
-				} else {
-					useLoaded = true;
-				}
-				// set the new encoding to remember for any following .js file loads
-				g_encoding = enc;
-				if (useLoaded) {
-					StringMediaResource smr = new StringMediaResource();
-					String mimetype = forceDownload ? VFSMediaResource.MIME_TYPE_FORCE_DOWNLOAD : "text/html;charset=" + enc;
-					smr.setContentType(mimetype);
-					smr.setEncoding(enc);
-					smr.setData(page);
-					mr = smr;
-				} else {
-					// found a new charset other than iso-8859-1 -> let it load again
-					// as bytes (so we do not need to convert to string and back
-					// again)
-					VFSMediaResource vmr = new VFSMediaResource(vfsfile);
-					vmr.setEncoding(enc);
-					if(forceDownload) {
-						vmr.setDownloadable(true);
+					// set the new encoding to remember for any following .js file loads
+					g_encoding = enc;
+					if (useLoaded) {
+						StringMediaResource smr = new StringMediaResource();
+						String mimetype = forceDownload ? VFSMediaResource.MIME_TYPE_FORCE_DOWNLOAD : "text/html;charset=" + enc;
+						smr.setContentType(mimetype);
+						smr.setEncoding(enc);
+						smr.setData(page);
+						mr = smr;
+					} else {
+						// found a new charset other than iso-8859-1 -> let it load again
+						// as bytes (so we do not need to convert to string and back
+						// again)
+						VFSMediaResource vmr = new VFSMediaResource(vfsfile);
+						vmr.setEncoding(enc);
+						if(forceDownload) {
+							vmr.setDownloadable(true);
+						}
+						mr = vmr;
 					}
-					mr = vmr;
 				}
 			} else if (path.endsWith(".js")) { // a javascript library
 				VFSMediaResource vmr = new VFSMediaResource(vfsfile);
diff --git a/src/main/java/org/olat/core/util/vfs/LocalFolderImpl.java b/src/main/java/org/olat/core/util/vfs/LocalFolderImpl.java
index 8db7ad2b282594d362239e595b28ce0bb61587e0..ec48aad3c800344a0f2cd06add668c28466a385e 100644
--- a/src/main/java/org/olat/core/util/vfs/LocalFolderImpl.java
+++ b/src/main/java/org/olat/core/util/vfs/LocalFolderImpl.java
@@ -91,12 +91,16 @@ public class LocalFolderImpl extends LocalImpl implements VFSContainer {
 	/**
 	 * @see org.olat.core.util.vfs.VFSContainer#getItems(org.olat.core.util.vfs.filters.VFSItemFilter)
 	 */
+	@Override
 	public List<VFSItem> getItems(VFSItemFilter filter) {
 		File aFolder = getBasefile();
 		if(! aFolder.isDirectory()){
 			throw new AssertException("basefile is not a directory: "+aFolder.getAbsolutePath());			
 		}
 		File[] children = aFolder.listFiles();
+		if(children == null) {
+			children = new File[0];
+		}
 		int len = children.length;
 		List<VFSItem> res = new ArrayList<VFSItem>(len);
 
diff --git a/src/main/java/org/olat/portfolio/ui/EPTemplateRuntimeController.java b/src/main/java/org/olat/portfolio/ui/EPTemplateRuntimeController.java
index 6e92ef67e157cc9068617270e7ad700424abff11..64fc5a727688b9e6e772f3f28e75e4bd33225860 100644
--- a/src/main/java/org/olat/portfolio/ui/EPTemplateRuntimeController.java
+++ b/src/main/java/org/olat/portfolio/ui/EPTemplateRuntimeController.java
@@ -53,7 +53,6 @@ public class EPTemplateRuntimeController extends RepositoryEntryRuntimeControlle
 		if(getRuntimeController() instanceof EPMapViewController) {
 			EPMapViewController mapCtrl = (EPMapViewController)getRuntimeController();
 			if(mapCtrl.canEditStructure()) {
-				mapCtrl.delegateEditButton();
 				editLink = LinkFactory.createToolLink("edit.cmd", translate("details.openeditor"), this, "o_sel_repository_editor");
 				editLink.setElementCssClass("o_sel_ep_edit_map");
 				editLink.setIconLeftCSS("o_icon o_icon-lg o_icon_edit");
diff --git a/src/main/java/org/olat/portfolio/ui/structel/EPMapViewController.java b/src/main/java/org/olat/portfolio/ui/structel/EPMapViewController.java
index eec057fcf9b766531d586e19f2494ade0e2b38e2..191629607d3e15f71f8f03f423dc01031efb0758 100644
--- a/src/main/java/org/olat/portfolio/ui/structel/EPMapViewController.java
+++ b/src/main/java/org/olat/portfolio/ui/structel/EPMapViewController.java
@@ -81,7 +81,6 @@ public class EPMapViewController extends BasicController implements Activateable
 	private EPStructureTreeAndDetailsEditController editCtrl;
 	private DialogBoxController confirmationSubmissionCtr;
 	private final boolean back;
-	private boolean editInToolbar = false;
 	
 	private EditMode editMode = EditMode.view;
 	private PortfolioStructureMap map;
@@ -135,12 +134,6 @@ public class EPMapViewController extends BasicController implements Activateable
 		return secCallback.canEditStructure();
 	}
 	
-	public void delegateEditButton() {
-		if(editButton != null) {
-			editButton.setVisible(false);
-		}
-	}
-
 	protected void initForm(UserRequest ureq) {
 		Identity ownerIdentity = ePFMgr.getFirstOwnerIdentity(map);
 		if(ownerIdentity != null) {
@@ -161,9 +154,6 @@ public class EPMapViewController extends BasicController implements Activateable
 			} else {
 				editButton.setCustomDisplayText(translate("map.editButton.off"));
 			}
-			if(editInToolbar) {
-				mainVc.remove(mainVc.getComponent("map.editButton"));
-			}
 		} 
 		if(back) {
 			backLink = LinkFactory.createLinkBack(mainVc, this);
@@ -262,6 +252,7 @@ public class EPMapViewController extends BasicController implements Activateable
 				selectedPage = pageCtrl.getSelectedPage();
 			}
 			initOrUpdateEditMode(ureq, selectedPage);
+			editMode = EditMode.editor;
 		}
 	}