diff --git a/src/main/java/org/olat/course/assessment/portfolio/EfficiencyStatementMediaHandler.java b/src/main/java/org/olat/course/assessment/portfolio/EfficiencyStatementMediaHandler.java
index 1dbcd0ed1de1b9bef93a4d1d7c72f689f7c8e01a..dd92a5b75f1bfa790779c8cc08a2066bc547d329 100644
--- a/src/main/java/org/olat/course/assessment/portfolio/EfficiencyStatementMediaHandler.java
+++ b/src/main/java/org/olat/course/assessment/portfolio/EfficiencyStatementMediaHandler.java
@@ -36,6 +36,7 @@ import org.olat.modules.portfolio.MediaInformations;
 import org.olat.modules.portfolio.MediaLight;
 import org.olat.modules.portfolio.handler.AbstractMediaHandler;
 import org.olat.modules.portfolio.manager.MediaDAO;
+import org.olat.modules.portfolio.ui.media.StandardEditMediaController;
 import org.olat.portfolio.model.artefacts.AbstractArtefact;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -125,4 +126,9 @@ public class EfficiencyStatementMediaHandler extends AbstractMediaHandler {
 		ctrl.disableMediaCollector();
 		return ctrl;
 	}
+
+	@Override
+	public Controller getEditMediaController(UserRequest ureq, WindowControl wControl, Media media) {
+		return new StandardEditMediaController(ureq, wControl, media);
+	}
 }
diff --git a/src/main/java/org/olat/modules/fo/portfolio/ForumMediaHandler.java b/src/main/java/org/olat/modules/fo/portfolio/ForumMediaHandler.java
index dfdc5314e3382c4b9343185997ec8734041f87df..0732a20c46f0a2984ccf14ede889bd1bdee77c3a 100644
--- a/src/main/java/org/olat/modules/fo/portfolio/ForumMediaHandler.java
+++ b/src/main/java/org/olat/modules/fo/portfolio/ForumMediaHandler.java
@@ -44,6 +44,7 @@ import org.olat.modules.portfolio.MediaLight;
 import org.olat.modules.portfolio.handler.AbstractMediaHandler;
 import org.olat.modules.portfolio.manager.MediaDAO;
 import org.olat.modules.portfolio.manager.PortfolioFileStorage;
+import org.olat.modules.portfolio.ui.media.StandardEditMediaController;
 import org.olat.portfolio.manager.EPFrontendManager;
 import org.olat.portfolio.model.artefacts.AbstractArtefact;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -154,5 +155,9 @@ public class ForumMediaHandler extends AbstractMediaHandler {
 	public Controller getMediaController(UserRequest ureq, WindowControl wControl, Media media) {
 		return new ForumMessageMediaController(ureq, wControl, media);
 	}
-	
+
+	@Override
+	public Controller getEditMediaController(UserRequest ureq, WindowControl wControl, Media media) {
+		return new StandardEditMediaController(ureq, wControl, media);
+	}
 }
diff --git a/src/main/java/org/olat/modules/portfolio/Media.java b/src/main/java/org/olat/modules/portfolio/Media.java
index 9391b80fc9e11dc6acb627dfef95eab4d6d8e7c7..2360ec6415cfbfcdcd8a4012f1ca6f6ae4f0c79f 100644
--- a/src/main/java/org/olat/modules/portfolio/Media.java
+++ b/src/main/java/org/olat/modules/portfolio/Media.java
@@ -51,12 +51,18 @@ public interface Media extends MediaLight, DublinCoreMetadata {
 
 	@Override
 	public String getTitle();
+	
+	public void setTitle(String title);
 
 	@Override
 	public String getDescription();
 	
+	public void setDescription(String description);
+	
 	public String getContent();
 	
+	public void setContent(String content);
+	
 	@Override
 	public String getBusinessPath();
 	
diff --git a/src/main/java/org/olat/modules/portfolio/MediaHandler.java b/src/main/java/org/olat/modules/portfolio/MediaHandler.java
index 901e4e170996d959614f0a67135a096261a58951..545fe96ab8baee401074aa5637a957cc0d8f644f 100644
--- a/src/main/java/org/olat/modules/portfolio/MediaHandler.java
+++ b/src/main/java/org/olat/modules/portfolio/MediaHandler.java
@@ -54,5 +54,7 @@ public interface MediaHandler {
 	public Media createMedia(AbstractArtefact artefact);
 	
 	public Controller getMediaController(UserRequest ureq, WindowControl wControl, Media media);
+	
+	public Controller getEditMediaController(UserRequest ureq, WindowControl wControl, Media media);
 
 }
diff --git a/src/main/java/org/olat/modules/portfolio/handler/CitationHandler.java b/src/main/java/org/olat/modules/portfolio/handler/CitationHandler.java
index 6d4559f80889cccaff9685ebe4ca52cc03ca037b..b347c9bce8606835a45c21faac8e02a053b11da3 100644
--- a/src/main/java/org/olat/modules/portfolio/handler/CitationHandler.java
+++ b/src/main/java/org/olat/modules/portfolio/handler/CitationHandler.java
@@ -91,6 +91,11 @@ public class CitationHandler extends AbstractMediaHandler implements Interactive
 		return new CitationMediaController(ureq, wControl, media);
 	}
 
+	@Override
+	public Controller getEditMediaController(UserRequest ureq, WindowControl wControl, Media media) {
+		return new CollectCitationMediaController(ureq, wControl, media);
+	}
+
 	@Override
 	public PageElementAddController getAddPageElementController(UserRequest ureq, WindowControl wControl) {
 		return new CollectCitationMediaController(ureq, wControl);
diff --git a/src/main/java/org/olat/modules/portfolio/handler/FileHandler.java b/src/main/java/org/olat/modules/portfolio/handler/FileHandler.java
index 76c64740e4c4f2c50768137a30c28e7719608272..b68a39e2656e8d4d2434cf06927c88e81fd23d53 100644
--- a/src/main/java/org/olat/modules/portfolio/handler/FileHandler.java
+++ b/src/main/java/org/olat/modules/portfolio/handler/FileHandler.java
@@ -115,6 +115,11 @@ public class FileHandler extends AbstractMediaHandler implements InteractiveAddP
 		return thumbnail;
 	}
 	
+	public VFSItem getItem(Media media) {
+		VFSContainer storageContainer = fileStorage.getMediaContainer(media);
+		return storageContainer.resolve(media.getRootFilename());
+	}
+	
 	@Override
 	public MediaInformations getInformations(Object mediaObject) {
 		String title = null;
@@ -176,6 +181,11 @@ public class FileHandler extends AbstractMediaHandler implements InteractiveAddP
 		return new FileMediaController(ureq, wControl, media);
 	}
 
+	@Override
+	public Controller getEditMediaController(UserRequest ureq, WindowControl wControl, Media media) {
+		return new CollectFileMediaController(ureq, wControl, media);
+	}
+
 	@Override
 	public PageElementAddController getAddPageElementController(UserRequest ureq, WindowControl wControl) {
 		return new CollectFileMediaController(ureq, wControl);
diff --git a/src/main/java/org/olat/modules/portfolio/handler/ImageHandler.java b/src/main/java/org/olat/modules/portfolio/handler/ImageHandler.java
index 46e30b33cbbf551a2c04c9a82116102722055e48..7a341b54d723601fad9afb69cf6083a5cc973de7 100644
--- a/src/main/java/org/olat/modules/portfolio/handler/ImageHandler.java
+++ b/src/main/java/org/olat/modules/portfolio/handler/ImageHandler.java
@@ -122,6 +122,11 @@ public class ImageHandler extends AbstractMediaHandler implements InteractiveAdd
 		
 		return thumbnail;
 	}
+	
+	public VFSItem getImage(Media media) {
+		VFSContainer storageContainer = fileStorage.getMediaContainer(media);
+		return storageContainer.resolve(media.getRootFilename());
+	}
 
 	@Override
 	public MediaInformations getInformations(Object mediaObject) {
@@ -180,12 +185,19 @@ public class ImageHandler extends AbstractMediaHandler implements InteractiveAdd
 	public Controller getMediaController(UserRequest ureq, WindowControl wControl, Media media) {
 		return new ImageMediaController(ureq, wControl, media);
 	}
+	
+	
 /*
 	@Override
 	public Controller getEditor(UserRequest ureq, WindowControl wControl, PageElement element) {
 		return new ImageMediaEditorController(ureq, wControl, (MediaPart)element);
 	}*/
 
+	@Override
+	public Controller getEditMediaController(UserRequest ureq, WindowControl wControl, Media media) {
+		return new CollectImageMediaController(ureq, wControl, media);
+	}
+
 	@Override
 	public PageElementAddController getAddPageElementController(UserRequest ureq, WindowControl wControl) {
 		return new CollectImageMediaController(ureq, wControl);
diff --git a/src/main/java/org/olat/modules/portfolio/handler/TextHandler.java b/src/main/java/org/olat/modules/portfolio/handler/TextHandler.java
index ef038df022944672f58a00f05c665bc51566ead5..70e27ba5afc2f3a88b24db3193617f3ab8554ae2 100644
--- a/src/main/java/org/olat/modules/portfolio/handler/TextHandler.java
+++ b/src/main/java/org/olat/modules/portfolio/handler/TextHandler.java
@@ -106,6 +106,11 @@ public class TextHandler extends AbstractMediaHandler implements InteractiveAddP
 		return new TextMediaController(ureq, wControl, media);
 	}
 
+	@Override
+	public Controller getEditMediaController(UserRequest ureq, WindowControl wControl, Media media) {
+		return new CollectTextMediaController(ureq, wControl, media);
+	}
+
 	@Override
 	public PageElementAddController getAddPageElementController(UserRequest ureq, WindowControl wControl) {
 		return new CollectTextMediaController(ureq, wControl);
diff --git a/src/main/java/org/olat/modules/portfolio/handler/VideoHandler.java b/src/main/java/org/olat/modules/portfolio/handler/VideoHandler.java
index 82e0259343e483090f9f3c77ce6a01112c0b75a4..bc9cad6bdb12d7d225f49a83f9e331a3287073d1 100644
--- a/src/main/java/org/olat/modules/portfolio/handler/VideoHandler.java
+++ b/src/main/java/org/olat/modules/portfolio/handler/VideoHandler.java
@@ -120,6 +120,11 @@ public class VideoHandler extends AbstractMediaHandler implements InteractiveAdd
 		
 		return thumbnail;
 	}
+	
+	public VFSItem getVideoItem(Media media) {
+		VFSContainer storageContainer = fileStorage.getMediaContainer(media);
+		return storageContainer.resolve(media.getRootFilename());
+	}
 
 	@Override
 	public MediaInformations getInformations(Object mediaObject) {
@@ -178,6 +183,11 @@ public class VideoHandler extends AbstractMediaHandler implements InteractiveAdd
 	public Controller getMediaController(UserRequest ureq, WindowControl wControl, Media media) {
 		return new VideoMediaController(ureq, wControl, media);
 	}
+	
+	@Override
+	public Controller getEditMediaController(UserRequest ureq, WindowControl wControl, Media media) {
+		return new CollectVideoMediaController(ureq, wControl, media);
+	}
 
 	@Override
 	public PageElementAddController getAddPageElementController(UserRequest ureq, WindowControl wControl) {
diff --git a/src/main/java/org/olat/modules/portfolio/ui/BinderController.java b/src/main/java/org/olat/modules/portfolio/ui/BinderController.java
index 3daf14e82396cdd3461e33ea29c46942b67c655c..f54b6110f2d31485d3d4496540ac97b00f889f8c 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/BinderController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/BinderController.java
@@ -125,8 +125,6 @@ public class BinderController extends BasicController implements TooledControlle
 	protected void doDispose() {
 		//
 	}
-	
-	
 
 	@Override
 	public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
diff --git a/src/main/java/org/olat/modules/portfolio/ui/MediaCenterController.java b/src/main/java/org/olat/modules/portfolio/ui/MediaCenterController.java
index a86f9e44949879382e2b2d6963264f570421c86f..9bcd6e497ad4285b32b3ae2b5f87122c284dd42d 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/MediaCenterController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/MediaCenterController.java
@@ -440,7 +440,7 @@ public class MediaCenterController extends FormBasicController
 		OLATResourceable bindersOres = OresHelper.createOLATResourceableInstance("Media", mediaKey);
 		WindowControl swControl = addToHistory(ureq, bindersOres, null);
 		Media media = portfolioService.getMediaByKey(mediaKey);
-		detailsCtrl = new MediaDetailsController(ureq, swControl, media);
+		detailsCtrl = new MediaDetailsController(ureq, swControl, stackPanel, media);
 		listenTo(detailsCtrl);
 		
 		String displayName = StringHelper.escapeHtml(media.getTitle());
diff --git a/src/main/java/org/olat/modules/portfolio/ui/MediaDetailsController.java b/src/main/java/org/olat/modules/portfolio/ui/MediaDetailsController.java
index 17d1eeecc23f002365c2618122d9c8b704509f1a..191931e55da8f76fb644921abbb14dbeaa8ec398 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/MediaDetailsController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/MediaDetailsController.java
@@ -26,6 +26,7 @@ import java.util.stream.Collectors;
 
 import org.olat.NewControllerFactory;
 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;
@@ -34,8 +35,14 @@ import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
 import org.olat.core.gui.components.form.flexible.impl.FormEvent;
 import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
 import org.olat.core.gui.components.link.Link;
+import org.olat.core.gui.components.link.LinkFactory;
+import org.olat.core.gui.components.stack.TooledController;
+import org.olat.core.gui.components.stack.TooledStackedPanel;
+import org.olat.core.gui.components.stack.TooledStackedPanel.Align;
 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.generic.closablewrapper.CloseableModalController;
 import org.olat.core.gui.control.generic.dtabs.Activateable2;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.StateEntry;
@@ -56,27 +63,43 @@ import org.springframework.beans.factory.annotation.Autowired;
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
-public class MediaDetailsController extends FormBasicController implements Activateable2 {
+public class MediaDetailsController extends FormBasicController implements Activateable2, TooledController {
+
+	private Link editLink;
+	private final TooledStackedPanel stackPanel;
+
+	private Controller mediaCtrl;
+	private Controller mediaEditCtrl;
+	private CloseableModalController cmc;
 	
 	private int counter;
 	private Media media;
-	private MediaHandler handler;
-	
-	private Controller mediaCtrl;
+	private final MediaHandler handler;
+	private final List<BinderLight> usedInList;
 	
 	@Autowired
 	private UserManager userManager;
 	@Autowired
 	private PortfolioService portfolioService;
 	
-	public MediaDetailsController(UserRequest ureq, WindowControl wControl, Media media) {
+	public MediaDetailsController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel, Media media) {
 		super(ureq, wControl, "media_details");
 		this.media = media;
+		this.stackPanel = stackPanel;
 		handler = portfolioService.getMediaHandler(media.getType());
-		
+		usedInList = portfolioService.getUsedInBinders(media);
 		initForm(ureq);
 	}
 
+	@Override
+	public void initTools() {
+		if(usedInList == null || usedInList.isEmpty()) {
+			editLink = LinkFactory.createToolLink("edit", translate("edit"), this);
+			editLink.setIconLeftCSS("o_icon o_icon-lg o_icon_edit");
+			stackPanel.addTool(editLink, Align.left);
+		}
+	}
+
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		if(formLayout instanceof FormLayoutContainer) {
@@ -114,7 +137,7 @@ public class MediaDetailsController extends FormBasicController implements Activ
 				categoriesEl.setEnabled(false);
 			}
 			
-			List<BinderLight> usedInList = portfolioService.getUsedInBinders(media);
+			
 			List<FormLink> binderLinks = new ArrayList<>(usedInList.size());
 			for(BinderLight binder:usedInList) {
 				FormLink link = uifactory.addFormLink("binder_" + (++counter), binder.getTitle(), null, layoutCont, Link.LINK | Link.NONTRANSLATED);
@@ -124,6 +147,10 @@ public class MediaDetailsController extends FormBasicController implements Activ
 			layoutCont.contextPut("binderLinks", binderLinks);
 		}
 	}
+	
+	private void reload(UserRequest ureq) {
+		initForm(flc, this, ureq);
+	}
 
 	@Override
 	protected void doDispose() {
@@ -140,6 +167,36 @@ public class MediaDetailsController extends FormBasicController implements Activ
 		//
 	}
 
+	@Override
+	public void event(UserRequest ureq, Component source, Event event) {
+		if(editLink == source) {
+			doEdit(ureq);
+		}
+		super.event(ureq, source, event);
+	}
+
+	@Override
+	protected void event(UserRequest ureq, Controller source, Event event) {
+		if(mediaEditCtrl == source) {
+			if(event == Event.DONE_EVENT || event == Event.CHANGED_EVENT) {
+				reload(ureq);
+				fireEvent(ureq, Event.CHANGED_EVENT);
+			}
+			cmc.deactivate();
+			cleanUp();
+		} else if(cmc == source) {
+			cleanUp();
+		}
+		super.event(ureq, source, event);
+	}
+	
+	private void cleanUp() {
+		removeAsListenerAndDispose(mediaEditCtrl);
+		removeAsListenerAndDispose(cmc);
+		mediaEditCtrl = null;
+		cmc = null;
+	}
+
 	@Override
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
 		if(source instanceof FormLink) {
@@ -152,4 +209,16 @@ public class MediaDetailsController extends FormBasicController implements Activ
 		}
 		super.formInnerEvent(ureq, source, event);
 	}
+	
+	private void doEdit(UserRequest ureq) {
+		if(mediaEditCtrl != null) return;
+		
+		mediaEditCtrl = handler.getEditMediaController(ureq, getWindowControl(), media);
+		listenTo(mediaEditCtrl);
+		
+		String title = translate("edit");
+		cmc = new CloseableModalController(getWindowControl(), null, mediaEditCtrl.getInitialComponent(), true, title, true);
+		listenTo(cmc);
+		cmc.activate();
+	}
 }
diff --git a/src/main/java/org/olat/modules/portfolio/ui/media/CollectCitationMediaController.java b/src/main/java/org/olat/modules/portfolio/ui/media/CollectCitationMediaController.java
index 0e7d6d4d2348328b4c6ed44c3742faca77fc7a5f..705c8ce29eb32ce1c9676dd5d2f346f9d6e79be7 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/media/CollectCitationMediaController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/media/CollectCitationMediaController.java
@@ -41,6 +41,7 @@ import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.util.Formatter;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
+import org.olat.modules.portfolio.Category;
 import org.olat.modules.portfolio.CitationSourceType;
 import org.olat.modules.portfolio.Media;
 import org.olat.modules.portfolio.PortfolioService;
@@ -75,6 +76,11 @@ public class CollectCitationMediaController extends FormBasicController implemen
 	private TextElement descriptionEl, textEl;
 	private TextBoxListElement categoriesEl;
 	
+	private SingleSelection sourceTypeEl;
+	private TextElement urlEl, sourceEl, languageEl;
+	private TextElement creatorsEl, placeEl, publisherEl;
+	private TextElement editionEl, volumeEl, seriesEl, publicationTitleEl, issueEl, pagesEl, institutionEl;
+	
 	private CitationXml citation;
 	private Media mediaReference;
 	private Map<String,String> categories = new HashMap<>();
@@ -96,6 +102,21 @@ public class CollectCitationMediaController extends FormBasicController implemen
 		updateCitationFieldsVisibility();
 	}
 	
+	public CollectCitationMediaController(UserRequest ureq, WindowControl wControl, Media media) {
+		super(ureq, wControl);
+		setTranslator(Util.createPackageTranslator(PortfolioHomeController.class, getLocale(), getTranslator()));
+		setTranslator(Util.createPackageTranslator(MetaInfoController.class, getLocale(), getTranslator()));
+		businessPath = media.getBusinessPath();
+		mediaReference = media;
+		
+		List<Category> categoryList = portfolioService.getCategories(media);
+		for(Category category:categoryList) {
+			categories.put(category.getName(), category.getName());
+		}
+		initForm(ureq);
+		updateCitationFieldsVisibility();
+	}
+	
 	public Media getMediaReference() {
 		return mediaReference;
 	}
@@ -119,12 +140,15 @@ public class CollectCitationMediaController extends FormBasicController implemen
 
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-		titleEl = uifactory.addTextElement("artefact.title", "artefact.title", 255, "", formLayout);
+		String title = mediaReference == null ? null : mediaReference.getTitle();
+		titleEl = uifactory.addTextElement("artefact.title", "artefact.title", 255, title, formLayout);
 		titleEl.setMandatory(true);
 		
-		descriptionEl = uifactory.addRichTextElementForStringData("artefact.descr", "artefact.descr", "", 6, 6, false, null, null, formLayout, ureq.getUserSession(), getWindowControl());
+		String desc = mediaReference == null ? null : mediaReference.getDescription();
+		descriptionEl = uifactory.addRichTextElementForStringData("artefact.descr", "artefact.descr", desc, 6, 6, false, null, null, formLayout, ureq.getUserSession(), getWindowControl());
 		
-		textEl = uifactory.addRichTextElementForStringData("citation", "citation", "", 10, 6, false, null, null, formLayout, ureq.getUserSession(), getWindowControl());
+		String text = mediaReference == null ? null : mediaReference.getContent();
+		textEl = uifactory.addRichTextElementForStringData("citation", "citation", text, 10, 6, false, null, null, formLayout, ureq.getUserSession(), getWindowControl());
 		
 		categoriesEl = uifactory.addTextBoxListElement("categories", "categories", "categories.hint", categories, formLayout, getTranslator());
 		categoriesEl.setElementCssClass("o_sel_ep_tagsinput");
@@ -133,7 +157,8 @@ public class CollectCitationMediaController extends FormBasicController implemen
 		initMetadataForm(formLayout);
 		initCitationForm(formLayout);
 		
-		String date = Formatter.getInstance(getLocale()).formatDate(new Date());
+		Date collectDate = mediaReference == null ? new Date() : mediaReference.getCollectionDate();
+		String date = Formatter.getInstance(getLocale()).formatDate(collectDate);
 		uifactory.addStaticTextElement("artefact.collect.date", "artefact.collect.date", date, formLayout);
 
 		if(StringHelper.containsNonWhitespace(businessPath)) {
@@ -146,12 +171,7 @@ public class CollectCitationMediaController extends FormBasicController implemen
 		uifactory.addFormSubmitButton("save", "save", buttonsCont);
 		uifactory.addFormCancelButton("cancel", buttonsCont, ureq, getWindowControl());
 	}
-	
-	private TextElement creatorsEl, placeEl, publisherEl;
-	//date
-	private TextElement urlEl, sourceEl, languageEl;
-	
-	
+
 	protected void initMetadataForm(FormItemContainer formLayout) {
 		String creators = (mediaReference != null ? mediaReference.getCreators() : null);
 		creatorsEl = uifactory.addTextElement("creator", "mf.creator", -1, creators, formLayout);
@@ -171,10 +191,6 @@ public class CollectCitationMediaController extends FormBasicController implemen
 		String language = (mediaReference != null ? mediaReference.getLanguage() : null);
 		languageEl = uifactory.addTextElement("language", "mf.language", -1, language, formLayout);
 	}
-	
-	private SingleSelection sourceTypeEl;
-	
-	private TextElement editionEl, volumeEl, seriesEl, publicationTitleEl, issueEl, pagesEl, institutionEl;
 
 	protected void initCitationForm(FormItemContainer formLayout) {
 		
diff --git a/src/main/java/org/olat/modules/portfolio/ui/media/CollectFileMediaController.java b/src/main/java/org/olat/modules/portfolio/ui/media/CollectFileMediaController.java
index b4a49b89581b1a00abd7c3b1ef03339876d129db..56bad804b4d3d28ed0e4c0583546408fb52e1033 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/media/CollectFileMediaController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/media/CollectFileMediaController.java
@@ -40,6 +40,9 @@ import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.util.Formatter;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
+import org.olat.core.util.vfs.JavaIOItem;
+import org.olat.core.util.vfs.VFSItem;
+import org.olat.modules.portfolio.Category;
 import org.olat.modules.portfolio.Media;
 import org.olat.modules.portfolio.PortfolioService;
 import org.olat.modules.portfolio.handler.FileHandler;
@@ -81,6 +84,19 @@ public class CollectFileMediaController extends FormBasicController implements P
 		initForm(ureq);
 	}
 	
+	public CollectFileMediaController(UserRequest ureq, WindowControl wControl, Media media) {
+		super(ureq, wControl);
+		mediaReference = media;
+		setTranslator(Util.createPackageTranslator(PortfolioHomeController.class, getLocale(), getTranslator()));
+		businessPath = media.getBusinessPath();
+		
+		List<Category> categoryList = portfolioService.getCategories(media);
+		for(Category category:categoryList) {
+			categories.put(category.getName(), category.getName());
+		}
+		initForm(ureq);
+	}
+	
 	public Media getMediaReference() {
 		return mediaReference;
 	}
@@ -104,15 +120,24 @@ public class CollectFileMediaController extends FormBasicController implements P
 
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-		titleEl = uifactory.addTextElement("artefact.title", "artefact.title", 255, "", formLayout);
+		String title = mediaReference == null ? null : mediaReference.getTitle();
+		titleEl = uifactory.addTextElement("artefact.title", "artefact.title", 255, title, formLayout);
 		titleEl.setMandatory(true);
 		
-		descriptionEl = uifactory.addRichTextElementForStringData("artefact.descr", "artefact.descr", "", 8, 6, false, null, null, formLayout, ureq.getUserSession(), getWindowControl());
+		String desc = mediaReference == null ? null : mediaReference.getTitle();
+		descriptionEl = uifactory.addRichTextElementForStringData("artefact.descr", "artefact.descr", desc, 8, 6, false, null, null, formLayout, ureq.getUserSession(), getWindowControl());
 		
 		fileEl = uifactory.addFileElement(getWindowControl(), "artefact.file", "artefact.file", formLayout);
 		fileEl.addActionListener(FormEvent.ONCHANGE);
-		
-		
+		if(mediaReference != null) {
+			fileEl.setEnabled(false);
+			
+			VFSItem item = fileHandler.getItem(mediaReference);
+			if(item instanceof JavaIOItem) {
+				fileEl.setInitialFile(((JavaIOItem)item).getBasefile());
+			}
+		}
+
 		categoriesEl = uifactory.addTextBoxListElement("categories", "categories", "categories.hint", categories, formLayout, getTranslator());
 		categoriesEl.setElementCssClass("o_sel_ep_tagsinput");
 		categoriesEl.setAllowDuplicates(false);
@@ -120,7 +145,8 @@ public class CollectFileMediaController extends FormBasicController implements P
 		//String source = "Forum";
 		//uifactory.addStaticTextElement("artefact.source", "artefact.source", source, formLayout);
 		
-		String date = Formatter.getInstance(getLocale()).formatDate(new Date());
+		Date collectDate = mediaReference == null ? new Date() : mediaReference.getCollectionDate();
+		String date = Formatter.getInstance(getLocale()).formatDate(collectDate);
 		uifactory.addStaticTextElement("artefact.collect.date", "artefact.collect.date", date, formLayout);
 
 		if(StringHelper.containsNonWhitespace(businessPath)) {
@@ -144,7 +170,7 @@ public class CollectFileMediaController extends FormBasicController implements P
 		boolean allOk = true;
 		
 		fileEl.clearError();
-		if(fileEl.getUploadFile() == null || fileEl.getUploadSize() < 1) {
+		if(fileEl.getInitialFile() == null && (fileEl.getUploadFile() == null || fileEl.getUploadSize() < 1)) {
 			fileEl.setErrorKey("form.legende.mandatory", null);
 			allOk &= false;
 		}
@@ -161,7 +187,9 @@ public class CollectFileMediaController extends FormBasicController implements P
 			String uploadedFilename = fileEl.getUploadFileName();
 			mediaReference = fileHandler.createMedia(title, description, uploadedFile, uploadedFilename, businessPath, getIdentity());
 		} else {
-			//TODO can we update an artefact?
+			mediaReference.setTitle(titleEl.getValue());
+			mediaReference.setDescription(descriptionEl.getValue());
+			mediaReference = portfolioService.updateMedia(mediaReference);
 		}
 
 		List<String> updatedCategories = categoriesEl.getValueList();
diff --git a/src/main/java/org/olat/modules/portfolio/ui/media/CollectImageMediaController.java b/src/main/java/org/olat/modules/portfolio/ui/media/CollectImageMediaController.java
index 8ed4bc325bf2cc9dd8ec203d5660f78e77ace0c7..7867937c592b45b4e855b5eac29f6315310952c8 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/media/CollectImageMediaController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/media/CollectImageMediaController.java
@@ -40,6 +40,9 @@ import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.util.Formatter;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
+import org.olat.core.util.vfs.JavaIOItem;
+import org.olat.core.util.vfs.VFSItem;
+import org.olat.modules.portfolio.Category;
 import org.olat.modules.portfolio.Media;
 import org.olat.modules.portfolio.PortfolioService;
 import org.olat.modules.portfolio.handler.ImageHandler;
@@ -81,6 +84,19 @@ public class CollectImageMediaController extends FormBasicController implements
 		initForm(ureq);
 	}
 	
+	public CollectImageMediaController(UserRequest ureq, WindowControl wControl, Media media) {
+		super(ureq, wControl);
+		setTranslator(Util.createPackageTranslator(PortfolioHomeController.class, getLocale(), getTranslator()));
+		businessPath = media.getBusinessPath();
+		mediaReference = media;
+		
+		List<Category> categoryList = portfolioService.getCategories(media);
+		for(Category category:categoryList) {
+			categories.put(category.getName(), category.getName());
+		}
+		initForm(ureq);
+	}
+	
 	public Media getMediaReference() {
 		return mediaReference;
 	}
@@ -104,25 +120,32 @@ public class CollectImageMediaController extends FormBasicController implements
 
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-		titleEl = uifactory.addTextElement("artefact.title", "artefact.title", 255, "", formLayout);
+		String title = mediaReference == null ? null : mediaReference.getTitle();
+		titleEl = uifactory.addTextElement("artefact.title", "artefact.title", 255, title, formLayout);
 		titleEl.setMandatory(true);
 		
-		descriptionEl = uifactory.addRichTextElementForStringData("artefact.descr", "artefact.descr", "", 8, 6, false, null, null, formLayout, ureq.getUserSession(), getWindowControl());
+		String desc = mediaReference == null ? null : mediaReference.getDescription();
+		descriptionEl = uifactory.addRichTextElementForStringData("artefact.descr", "artefact.descr", desc, 8, 6, false, null, null, formLayout, ureq.getUserSession(), getWindowControl());
 		
 		fileEl = uifactory.addFileElement(getWindowControl(), "artefact.file", "artefact.file", formLayout);
 		fileEl.addActionListener(FormEvent.ONCHANGE);
 		fileEl.setMaxUploadSizeKB(10000, null, null);
 		fileEl.setPreview(ureq.getUserSession(), true);
 		fileEl.setDeleteEnabled(true);
+		if(mediaReference != null) {
+			fileEl.setEnabled(false);
+			VFSItem item = fileHandler.getImage(mediaReference);
+			if(item instanceof JavaIOItem) {
+				fileEl.setInitialFile(((JavaIOItem)item).getBasefile());
+			}
+		}
 		
 		categoriesEl = uifactory.addTextBoxListElement("categories", "categories", "categories.hint", categories, formLayout, getTranslator());
 		categoriesEl.setElementCssClass("o_sel_ep_tagsinput");
 		categoriesEl.setAllowDuplicates(false);
-		
-		//String source = "Forum";
-		//uifactory.addStaticTextElement("artefact.source", "artefact.source", source, formLayout);
-		
-		String date = Formatter.getInstance(getLocale()).formatDate(new Date());
+
+		Date collectDate = mediaReference == null ? new Date() : mediaReference.getCollectionDate();
+		String date = Formatter.getInstance(getLocale()).formatDate(collectDate);
 		uifactory.addStaticTextElement("artefact.collect.date", "artefact.collect.date", date, formLayout);
 
 		if(StringHelper.containsNonWhitespace(businessPath)) {
@@ -146,7 +169,7 @@ public class CollectImageMediaController extends FormBasicController implements
 		boolean allOk = true;
 		
 		fileEl.clearError();
-		if(fileEl.getUploadFile() == null || fileEl.getUploadSize() < 1) {
+		if(fileEl.getInitialFile() == null && (fileEl.getUploadFile() == null || fileEl.getUploadSize() < 1)) {
 			fileEl.setErrorKey("form.legende.mandatory", null);
 			allOk &= false;
 		}
@@ -163,7 +186,9 @@ public class CollectImageMediaController extends FormBasicController implements
 			String uploadedFilename = fileEl.getUploadFileName();
 			mediaReference = fileHandler.createMedia(title, description, uploadedFile, uploadedFilename, businessPath, getIdentity());
 		} else {
-			//TODO can we update an artefact?
+			mediaReference.setTitle(titleEl.getValue());
+			mediaReference.setDescription(descriptionEl.getValue());
+			mediaReference = portfolioService.updateMedia(mediaReference);
 		}
 
 		List<String> updatedCategories = categoriesEl.getValueList();
diff --git a/src/main/java/org/olat/modules/portfolio/ui/media/CollectTextMediaController.java b/src/main/java/org/olat/modules/portfolio/ui/media/CollectTextMediaController.java
index 94a8f131bc290a6e8f8f141df29673fb32654889..246e5f0d4cd7821a4b781c5c1d6941a9be2cd912 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/media/CollectTextMediaController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/media/CollectTextMediaController.java
@@ -37,6 +37,7 @@ import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.util.Formatter;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
+import org.olat.modules.portfolio.Category;
 import org.olat.modules.portfolio.Media;
 import org.olat.modules.portfolio.PortfolioService;
 import org.olat.modules.portfolio.handler.TextHandler;
@@ -77,6 +78,20 @@ public class CollectTextMediaController extends FormBasicController implements P
 		initForm(ureq);
 	}
 	
+	public CollectTextMediaController(UserRequest ureq, WindowControl wControl, Media media) {
+		super(ureq, wControl);
+		setTranslator(Util.createPackageTranslator(PortfolioHomeController.class, getLocale(), getTranslator()));
+		businessPath = media.getBusinessPath();
+		mediaReference = media;
+		
+		List<Category> categoryList = portfolioService.getCategories(media);
+		for(Category category:categoryList) {
+			categories.put(category.getName(), category.getName());
+		}
+		
+		initForm(ureq);
+	}
+	
 	public Media getMediaReference() {
 		return mediaReference;
 	}
@@ -100,18 +115,22 @@ public class CollectTextMediaController extends FormBasicController implements P
 
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-		titleEl = uifactory.addTextElement("artefact.title", "artefact.title", 255, "", formLayout);
+		String title = mediaReference == null ? null : mediaReference.getTitle();
+		titleEl = uifactory.addTextElement("artefact.title", "artefact.title", 255, title, formLayout);
 		titleEl.setMandatory(true);
 		
-		descriptionEl = uifactory.addRichTextElementForStringData("artefact.descr", "artefact.descr", "", 6, 6, false, null, null, formLayout, ureq.getUserSession(), getWindowControl());
+		String desc = mediaReference == null ? null : mediaReference.getDescription();
+		descriptionEl = uifactory.addRichTextElementForStringData("artefact.descr", "artefact.descr", desc, 6, 6, false, null, null, formLayout, ureq.getUserSession(), getWindowControl());
 		
-		textEl = uifactory.addRichTextElementForStringData("artefact.text", "artefact.text", "", 10, 6, false, null, null, formLayout, ureq.getUserSession(), getWindowControl());
+		String content = mediaReference == null ? null : mediaReference.getContent();
+		textEl = uifactory.addRichTextElementForStringData("artefact.text", "artefact.text", content, 10, 6, false, null, null, formLayout, ureq.getUserSession(), getWindowControl());
 		
 		categoriesEl = uifactory.addTextBoxListElement("categories", "categories", "categories.hint", categories, formLayout, getTranslator());
 		categoriesEl.setElementCssClass("o_sel_ep_tagsinput");
 		categoriesEl.setAllowDuplicates(false);
 		
-		String date = Formatter.getInstance(getLocale()).formatDate(new Date());
+		Date collectDate = mediaReference == null ? new Date() : mediaReference.getCollectionDate();
+		String date = Formatter.getInstance(getLocale()).formatDate(collectDate);
 		uifactory.addStaticTextElement("artefact.collect.date", "artefact.collect.date", date, formLayout);
 
 		if(StringHelper.containsNonWhitespace(businessPath)) {
@@ -145,7 +164,10 @@ public class CollectTextMediaController extends FormBasicController implements P
 			String content = textEl.getValue();
 			mediaReference = fileHandler.createMedia(title, description, content, businessPath, getIdentity());
 		} else {
-			//TODO can we update an artefact?
+			mediaReference.setTitle(titleEl.getValue());
+			mediaReference.setDescription(descriptionEl.getValue());
+			mediaReference.setContent(textEl.getValue());
+			mediaReference = portfolioService.updateMedia(mediaReference);
 		}
 
 		List<String> updatedCategories = categoriesEl.getValueList();
diff --git a/src/main/java/org/olat/modules/portfolio/ui/media/CollectVideoMediaController.java b/src/main/java/org/olat/modules/portfolio/ui/media/CollectVideoMediaController.java
index 0f38580edd8b176457cefb209c9459d16438e392..c0cbd38e22eef41b3af965aa9d2248eefbe8a2b4 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/media/CollectVideoMediaController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/media/CollectVideoMediaController.java
@@ -40,9 +40,12 @@ import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.util.Formatter;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
+import org.olat.core.util.vfs.JavaIOItem;
+import org.olat.core.util.vfs.VFSItem;
+import org.olat.modules.portfolio.Category;
 import org.olat.modules.portfolio.Media;
 import org.olat.modules.portfolio.PortfolioService;
-import org.olat.modules.portfolio.handler.ImageHandler;
+import org.olat.modules.portfolio.handler.VideoHandler;
 import org.olat.modules.portfolio.model.MediaPart;
 import org.olat.modules.portfolio.ui.PortfolioHomeController;
 import org.olat.modules.portfolio.ui.editor.AddElementInfos;
@@ -70,7 +73,7 @@ public class CollectVideoMediaController extends FormBasicController implements
 	private AddElementInfos userObject;
 	
 	@Autowired
-	private ImageHandler fileHandler;
+	private VideoHandler fileHandler;
 	@Autowired
 	private PortfolioService portfolioService;
 
@@ -81,6 +84,20 @@ public class CollectVideoMediaController extends FormBasicController implements
 		initForm(ureq);
 	}
 	
+	public CollectVideoMediaController(UserRequest ureq, WindowControl wControl, Media media) {
+		super(ureq, wControl);
+		setTranslator(Util.createPackageTranslator(PortfolioHomeController.class, getLocale(), getTranslator()));
+		businessPath = media.getBusinessPath();
+		mediaReference = media;
+		
+		List<Category> categoryList = portfolioService.getCategories(media);
+		for(Category category:categoryList) {
+			categories.put(category.getName(), category.getName());
+		}
+		
+		initForm(ureq);
+	}
+	
 	public Media getMediaReference() {
 		return mediaReference;
 	}
@@ -104,25 +121,33 @@ public class CollectVideoMediaController extends FormBasicController implements
 
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-		titleEl = uifactory.addTextElement("artefact.title", "artefact.title", 255, "", formLayout);
+		String title = mediaReference == null ? null : mediaReference.getTitle();
+		titleEl = uifactory.addTextElement("artefact.title", "artefact.title", 255, title, formLayout);
 		titleEl.setMandatory(true);
 		
-		descriptionEl = uifactory.addRichTextElementForStringData("artefact.descr", "artefact.descr", "", 8, 6, false, null, null, formLayout, ureq.getUserSession(), getWindowControl());
+		String desc = mediaReference == null ? null : mediaReference.getDescription();
+		descriptionEl = uifactory.addRichTextElementForStringData("artefact.descr", "artefact.descr", desc, 8, 6, false, null, null, formLayout, ureq.getUserSession(), getWindowControl());
 		
 		fileEl = uifactory.addFileElement(getWindowControl(), "artefact.file", "artefact.file", formLayout);
 		fileEl.addActionListener(FormEvent.ONCHANGE);
 		fileEl.setMaxUploadSizeKB(250000, null, null);
 		fileEl.setPreview(ureq.getUserSession(), true);
 		fileEl.setDeleteEnabled(true);
+		if(mediaReference != null) {
+			fileEl.setEnabled(false);
+			
+			VFSItem item = fileHandler.getVideoItem(mediaReference);
+			if(item instanceof JavaIOItem) {
+				fileEl.setInitialFile(((JavaIOItem)item).getBasefile());
+			}
+		}
 		
 		categoriesEl = uifactory.addTextBoxListElement("categories", "categories", "categories.hint", categories, formLayout, getTranslator());
 		categoriesEl.setElementCssClass("o_sel_ep_tagsinput");
 		categoriesEl.setAllowDuplicates(false);
 		
-		//String source = "Forum";
-		//uifactory.addStaticTextElement("artefact.source", "artefact.source", source, formLayout);
-		
-		String date = Formatter.getInstance(getLocale()).formatDate(new Date());
+		Date collectDate = mediaReference == null ? new Date() : mediaReference.getCollectionDate();
+		String date = Formatter.getInstance(getLocale()).formatDate(collectDate);
 		uifactory.addStaticTextElement("artefact.collect.date", "artefact.collect.date", date, formLayout);
 
 		if(StringHelper.containsNonWhitespace(businessPath)) {
@@ -146,7 +171,7 @@ public class CollectVideoMediaController extends FormBasicController implements
 		boolean allOk = true;
 		
 		fileEl.clearError();
-		if(fileEl.getUploadFile() == null || fileEl.getUploadSize() < 1) {
+		if(fileEl.getInitialFile() == null && (fileEl.getUploadFile() == null || fileEl.getUploadSize() < 1)) {
 			fileEl.setErrorKey("form.legende.mandatory", null);
 			allOk &= false;
 		}
@@ -163,7 +188,9 @@ public class CollectVideoMediaController extends FormBasicController implements
 			String uploadedFilename = fileEl.getUploadFileName();
 			mediaReference = fileHandler.createMedia(title, description, uploadedFile, uploadedFilename, businessPath, getIdentity());
 		} else {
-			//TODO can we update an artefact?
+			mediaReference.setTitle(titleEl.getValue());
+			mediaReference.setDescription(descriptionEl.getValue());
+			mediaReference = portfolioService.updateMedia(mediaReference);
 		}
 
 		List<String> updatedCategories = categoriesEl.getValueList();
diff --git a/src/main/java/org/olat/modules/portfolio/ui/media/StandardEditMediaController.java b/src/main/java/org/olat/modules/portfolio/ui/media/StandardEditMediaController.java
new file mode 100644
index 0000000000000000000000000000000000000000..6733747c906a63dca8d3132dd65def79d8a25b0d
--- /dev/null
+++ b/src/main/java/org/olat/modules/portfolio/ui/media/StandardEditMediaController.java
@@ -0,0 +1,128 @@
+/**
+ * <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.portfolio.ui.media;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.form.flexible.FormItemContainer;
+import org.olat.core.gui.components.form.flexible.elements.TextBoxListElement;
+import org.olat.core.gui.components.form.flexible.elements.TextElement;
+import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
+import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
+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.id.context.BusinessControlFactory;
+import org.olat.core.util.Formatter;
+import org.olat.core.util.StringHelper;
+import org.olat.core.util.Util;
+import org.olat.modules.portfolio.Category;
+import org.olat.modules.portfolio.Media;
+import org.olat.modules.portfolio.PortfolioService;
+import org.olat.modules.portfolio.ui.PortfolioHomeController;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * 
+ * Initial date: 03.08.2016<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class StandardEditMediaController extends FormBasicController {
+	
+	private TextElement titleEl;
+	private TextElement descriptionEl;
+	private TextBoxListElement categoriesEl;
+
+	private Media mediaReference;
+	private final String businessPath;
+	private Map<String,String> categories = new HashMap<>();
+	
+	@Autowired
+	private PortfolioService portfolioService;
+	
+	public StandardEditMediaController(UserRequest ureq, WindowControl wControl, Media media) {
+		super(ureq, wControl);
+		setTranslator(Util.createPackageTranslator(PortfolioHomeController.class, getLocale(), getTranslator()));
+		businessPath = media.getBusinessPath();
+		mediaReference = media;
+		
+		List<Category> categoryList = portfolioService.getCategories(media);
+		for(Category category:categoryList) {
+			categories.put(category.getName(), category.getName());
+		}
+		
+		initForm(ureq);
+	}
+
+	@Override
+	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
+		String title = mediaReference == null ? null : mediaReference.getTitle();
+		titleEl = uifactory.addTextElement("artefact.title", "artefact.title", 255, title, formLayout);
+		titleEl.setMandatory(true);
+		
+		String desc = mediaReference == null ? null : mediaReference.getDescription();
+		descriptionEl = uifactory.addRichTextElementForStringData("artefact.descr", "artefact.descr", desc, 8, 6, false, null, null, formLayout, ureq.getUserSession(), getWindowControl());
+
+		categoriesEl = uifactory.addTextBoxListElement("categories", "categories", "categories.hint", categories, formLayout, getTranslator());
+		categoriesEl.setElementCssClass("o_sel_ep_tagsinput");
+		categoriesEl.setAllowDuplicates(false);
+		
+		Date collectDate = mediaReference == null ? new Date() : mediaReference.getCollectionDate();
+		String date = Formatter.getInstance(getLocale()).formatDate(collectDate);
+		uifactory.addStaticTextElement("artefact.collect.date", "artefact.collect.date", date, formLayout);
+
+		if(StringHelper.containsNonWhitespace(businessPath)) {
+			String link = BusinessControlFactory.getInstance().getURLFromBusinessPathString(businessPath);
+			uifactory.addStaticTextElement("artefact.collect.link", "artefact.collect.link", link, formLayout);
+		}
+		
+		FormLayoutContainer buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
+		formLayout.add(buttonsCont);
+		uifactory.addFormSubmitButton("save", "save", buttonsCont);
+		uifactory.addFormCancelButton("cancel", buttonsCont, ureq, getWindowControl());
+	}
+	
+	@Override
+	protected void doDispose() {
+		//
+	}
+	
+	@Override
+	protected void formOK(UserRequest ureq) {
+		mediaReference.setTitle(titleEl.getValue());
+		mediaReference.setDescription(descriptionEl.getValue());
+		mediaReference = portfolioService.updateMedia(mediaReference);
+
+		List<String> updatedCategories = categoriesEl.getValueList();
+		portfolioService.updateCategories(mediaReference, updatedCategories);
+		
+		fireEvent(ureq, Event.DONE_EVENT);
+	}
+
+	@Override
+	protected void formCancelled(UserRequest ureq) {
+		fireEvent(ureq, Event.CANCELLED_EVENT);
+	}
+}
diff --git a/src/main/java/org/olat/modules/portfolio/ui/media/UploadMedia.java b/src/main/java/org/olat/modules/portfolio/ui/media/UploadMedia.java
index 96114aa1ada9467b97d7eb1a38fc9478a5269b42..43d5c45af6e3c542c44e6c8d9b9add2d407e6101 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/media/UploadMedia.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/media/UploadMedia.java
@@ -1,3 +1,22 @@
+/**
+ * <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.portfolio.ui.media;
 
 import java.io.File;
diff --git a/src/main/java/org/olat/modules/webFeed/portfolio/BlogEntryMediaHandler.java b/src/main/java/org/olat/modules/webFeed/portfolio/BlogEntryMediaHandler.java
index 9ec3417a872813e1a3ef3d03ab146216e36814d0..4801ea2a0a738ed502954ff00e333fbc8bf65cf2 100644
--- a/src/main/java/org/olat/modules/webFeed/portfolio/BlogEntryMediaHandler.java
+++ b/src/main/java/org/olat/modules/webFeed/portfolio/BlogEntryMediaHandler.java
@@ -36,6 +36,7 @@ import org.olat.modules.portfolio.MediaLight;
 import org.olat.modules.portfolio.handler.AbstractMediaHandler;
 import org.olat.modules.portfolio.manager.MediaDAO;
 import org.olat.modules.portfolio.manager.PortfolioFileStorage;
+import org.olat.modules.portfolio.ui.media.StandardEditMediaController;
 import org.olat.modules.webFeed.managers.FeedManager;
 import org.olat.modules.webFeed.models.Feed;
 import org.olat.modules.webFeed.models.Item;
@@ -135,4 +136,9 @@ public class BlogEntryMediaHandler extends AbstractMediaHandler {
 	public Controller getMediaController(UserRequest ureq, WindowControl wControl, Media media) {
 		return new BlogEntryMediaController(ureq, wControl, media, true);
 	}
+
+	@Override
+	public Controller getEditMediaController(UserRequest ureq, WindowControl wControl, Media media) {
+		return new StandardEditMediaController(ureq, wControl, media);
+	}
 }
diff --git a/src/main/java/org/olat/modules/wiki/portfolio/WikiMediaHandler.java b/src/main/java/org/olat/modules/wiki/portfolio/WikiMediaHandler.java
index 0581316926b2442d4531899ff1c7029500701bec..66b2351285294aa88f629fddeb1dd02f0a77902f 100644
--- a/src/main/java/org/olat/modules/wiki/portfolio/WikiMediaHandler.java
+++ b/src/main/java/org/olat/modules/wiki/portfolio/WikiMediaHandler.java
@@ -31,6 +31,7 @@ import org.olat.modules.portfolio.MediaInformations;
 import org.olat.modules.portfolio.MediaLight;
 import org.olat.modules.portfolio.handler.AbstractMediaHandler;
 import org.olat.modules.portfolio.manager.MediaDAO;
+import org.olat.modules.portfolio.ui.media.StandardEditMediaController;
 import org.olat.modules.wiki.WikiPage;
 import org.olat.portfolio.model.artefacts.AbstractArtefact;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -105,4 +106,9 @@ public class WikiMediaHandler extends AbstractMediaHandler {
 	public Controller getMediaController(UserRequest ureq, WindowControl wControl, Media media) {
 		return new WikiPageMediaController(ureq, wControl, media);
 	}
+
+	@Override
+	public Controller getEditMediaController(UserRequest ureq, WindowControl wControl, Media media) {
+		return new StandardEditMediaController(ureq, wControl, media);
+	}
 }