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());