diff --git a/src/main/java/org/olat/admin/quota/GenericQuotaEditController.java b/src/main/java/org/olat/admin/quota/GenericQuotaEditController.java
index 056a39d114f092d23e5ef66e909294bca9e5ff11..1e0e590421594558adf8b3e5099ea210e7100a54 100644
--- a/src/main/java/org/olat/admin/quota/GenericQuotaEditController.java
+++ b/src/main/java/org/olat/admin/quota/GenericQuotaEditController.java
@@ -143,6 +143,8 @@ public class GenericQuotaEditController extends BasicController {
 		myContent.contextPut("repository",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_REPO));
 		myContent.contextPut("coursefolder",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_COURSE));
 		myContent.contextPut("nodefolder",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_NODES));
+		myContent.contextPut("feeds",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_FEEDS));
+		
 	}
 	
 	private void initQuotaForm(UserRequest ureq, Quota quota) {
diff --git a/src/main/java/org/olat/admin/quota/QuotaConstants.java b/src/main/java/org/olat/admin/quota/QuotaConstants.java
index 43a5211e8da4e1cf98bf5cc0e5623ff2bc4a7659..87de59cd101e05c4f30de4ca85b843e392e377f9 100644
--- a/src/main/java/org/olat/admin/quota/QuotaConstants.java
+++ b/src/main/java/org/olat/admin/quota/QuotaConstants.java
@@ -35,5 +35,6 @@ public class QuotaConstants {
 	public static final String IDENTIFIER_DEFAULT_REPO = IDENTIFIER_DEFAULT + "REPOSITORY";
 	public static final String IDENTIFIER_DEFAULT_COURSE = IDENTIFIER_DEFAULT + "COURSEFOLDERS";
 	public static final String IDENTIFIER_DEFAULT_NODES = IDENTIFIER_DEFAULT + "NODEFOLDERS";
+	public static final String IDENTIFIER_DEFAULT_FEEDS = IDENTIFIER_DEFAULT + "BLOGSPODCASTS";
 
 }
diff --git a/src/main/java/org/olat/admin/quota/QuotaImpl.java b/src/main/java/org/olat/admin/quota/QuotaImpl.java
index 863aab63017e57a18ede306dc1deae6bc40a2a9a..ebab7b16798742219c879095cc1117f684a7739f 100644
--- a/src/main/java/org/olat/admin/quota/QuotaImpl.java
+++ b/src/main/java/org/olat/admin/quota/QuotaImpl.java
@@ -25,7 +25,9 @@
 
 package org.olat.admin.quota;
 
+import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
 import org.olat.core.util.vfs.Quota;
+import org.olat.core.util.vfs.VFSManager;
 
 
 /**
@@ -65,5 +67,21 @@ public class QuotaImpl implements Quota {
 	public Long getUlLimitKB() {
 		return ulLimitKB;
 	}
-
+	
+	public Long getRemainingSpace() {
+		long quotaKB = getQuotaKB().longValue();
+		long remainingQuotaKB;
+		if (quotaKB == Quota.UNLIMITED) {
+			remainingQuotaKB = quotaKB;
+		} else {
+			OlatRootFolderImpl container = new OlatRootFolderImpl(path, null);
+			long actualUsage = VFSManager.getUsageKB(container);
+			if (quotaKB - actualUsage < 0) {
+				remainingQuotaKB = 0l;
+			} else {
+				remainingQuotaKB = quotaKB - actualUsage;
+			}
+		}
+		return new Long(remainingQuotaKB);
+	}
 }
diff --git a/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java b/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java
index ef4c77b738d185744972753357bc70927d2a4560..3cacaedc41a2d9819d97ffe76b335011a410d797 100644
--- a/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java
+++ b/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java
@@ -98,21 +98,29 @@ public class QuotaManagerImpl extends QuotaManager {
 
 	private void initDefaultQuotas() {
 		defaultQuotas = new HashMap<String,Quota>();
-		Quota defaultQuotaUsers = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_USERS);
+		Quota defaultQuotaUsers = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_USERS, 1.0d);
 		defaultQuotas.put(QuotaConstants.IDENTIFIER_DEFAULT_USERS, defaultQuotaUsers);
-		Quota defaultQuotaPowerusers = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_POWER);
+		Quota defaultQuotaPowerusers = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_POWER, 1.0d);
 		defaultQuotas.put(QuotaConstants.IDENTIFIER_DEFAULT_POWER, defaultQuotaPowerusers);
-		Quota defaultQuotaGroups = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_GROUPS);
+		Quota defaultQuotaGroups = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_GROUPS, 1.0d);
 		defaultQuotas.put(QuotaConstants.IDENTIFIER_DEFAULT_GROUPS, defaultQuotaGroups);
-		Quota defaultQuotaRepository = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_REPO);
+		Quota defaultQuotaRepository = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_REPO, 1.0d);
 		defaultQuotas.put(QuotaConstants.IDENTIFIER_DEFAULT_REPO, defaultQuotaRepository);
-		Quota defaultQuotaCourseFolder = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_COURSE);
+		Quota defaultQuotaCourseFolder = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_COURSE, 1.0d);
 		defaultQuotas.put(QuotaConstants.IDENTIFIER_DEFAULT_COURSE, defaultQuotaCourseFolder);
-		Quota defaultQuotaNodeFolder = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_NODES);
+		Quota defaultQuotaNodeFolder = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_NODES, 1.0d);
 		defaultQuotas.put(QuotaConstants.IDENTIFIER_DEFAULT_NODES, defaultQuotaNodeFolder);
+		Quota defaultQuotaFeed = initDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_FEEDS, 2.0d);
+		defaultQuotas.put(QuotaConstants.IDENTIFIER_DEFAULT_FEEDS, defaultQuotaFeed);
 	}
 
-	private Quota initDefaultQuota(String quotaIdentifier) {
+	/**
+	 * 
+	 * @param quotaIdentifier
+	 * @param factor Multiplier for some long running resources as blogs
+	 * @return
+	 */
+	private Quota initDefaultQuota(String quotaIdentifier, double factor) {
 		Quota q = null;
 		Property p = propertyManager.findProperty(null, null, quotaResource, QUOTA_CATEGORY, quotaIdentifier);
 		if (p != null) q = parseQuota(p);
diff --git a/src/main/java/org/olat/admin/quota/_content/edit.html b/src/main/java/org/olat/admin/quota/_content/edit.html
index 7f3b1e233bb670272ba5397a052c636442485712..fef31f3ab0b41d29e58a558000bce3b31d8cc20c 100644
--- a/src/main/java/org/olat/admin/quota/_content/edit.html
+++ b/src/main/java/org/olat/admin/quota/_content/edit.html
@@ -31,6 +31,7 @@
 			<tr><td>$r.translate("qd.repository")</td><td>$repository.getQuotaKB()</td><td>$repository.getUlLimitKB()</td></tr>
 			<tr><td>$r.translate("qd.coursefolder")</td><td>$coursefolder.getQuotaKB()</td><td>$coursefolder.getUlLimitKB()</td></tr>
 			<tr><td>$r.translate("qd.nodefolder")</td><td>$nodefolder.getQuotaKB()</td><td>$nodefolder.getUlLimitKB()</td></tr>
+			<tr><td>$r.translate("qd.feeds")</td><td>$feeds.getQuotaKB()</td><td>$feeds.getUlLimitKB()</td></tr>
 		</tbody>
 	</table>
 </fieldset>
\ No newline at end of file
diff --git a/src/main/java/org/olat/admin/quota/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/quota/_i18n/LocalStrings_de.properties
index 8e776f7de886e4a65179cf0c2e1469003e00ecaa..3cd0d744c7d3c1378acc495a49604a7af7baa674 100644
--- a/src/main/java/org/olat/admin/quota/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/admin/quota/_i18n/LocalStrings_de.properties
@@ -6,6 +6,7 @@ qd.powerusers=Poweruser (Autoren)
 qd.repository=Lernressourcen
 qd.title=Default Quotas
 qd.users=Normale Benutzer
+qd.feeds=Blogs und Podcasts
 qf.del=Quota l\u00F6schen
 qf.deleted=Quota {0} wurde gel\u00F6scht.
 qf.cannot.del.default=Default Quotas k\u00F6nnen nicht gel\u00F6scht werden.
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 7225fcffb75423822f40a8398ae267262af5072f..d8c8aec8bb5e4ad8010738b0ce0c2a4f5c37ac3b 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
@@ -142,8 +142,15 @@ public class FileLinkChooserController extends BasicController {
 				}
 			}
 		}
-		uploadCtr = new FileUploadController(wControl, fileUploadBase, ureq,
-				(int)FolderConfig.getLimitULKB(), Quota.UNLIMITED, mimeTypes, true);
+		
+		int remainingSpace = Quota.UNLIMITED;
+		long uploadLimit = FolderConfig.getLimitULKB();
+		if( fileUploadBase.getLocalSecurityCallback() != null && fileUploadBase.getLocalSecurityCallback().getQuota() != null) {
+			remainingSpace = fileUploadBase.getLocalSecurityCallback().getQuota().getRemainingSpace().intValue();
+			uploadLimit = fileUploadBase.getLocalSecurityCallback().getQuota().getUlLimitKB();
+		}
+		uploadCtr = new FileUploadController(wControl, fileUploadBase, ureq, (int)uploadLimit, remainingSpace, mimeTypes, true);
+		
 		listenTo(uploadCtr);
 		// set specific upload path
 		uploadCtr.setUploadRelPath(uploadRelPath);
@@ -162,55 +169,6 @@ public class FileLinkChooserController extends BasicController {
 		// no events to catch
 	}
 
-	private String getPathRelativeToFilename(String selectedPath) {
-		// VFSLeaf chosen = (VFSLeaf) rootDir.resolve(selectedPath);
-		// compute rel path to base dir of the current file
-		// String relPath = VFSManager.calculateRelativePath(fileName,
-		// selectedPath);
-		// selpath = /a/irwas/subsub/nochsub/note.html 5
-		// filenam = /a/irwas/index.html 3
-		// --> subsub/nochsub/note.gif
-
-		// or /a/irwas/bla/index.html
-		// to /a/other/b/gugus.gif
-		// --> ../../ other/b/gugus.gif
-
-		// or /a/other/b/main.html
-		// to /a/irwas/bla/goto.html
-		// --> ../../ other/b/gugus.gif
-
-		String target = selectedPath;
-		String base = fileName; // assume "/" is here
-		if (!(fileName.indexOf("/") == 0)) {
-			base = "/" + fileName;
-		}
-
-		String[] baseA = base.split("/");
-		String[] targetA = target.split("/");
-		int sp = 1;
-		for (; sp < Math.min(baseA.length, targetA.length); sp++) {
-			if (!baseA[sp].equals(targetA[sp])) {
-				break;
-			}
-		}
-		// special case: self-reference
-		if (target.equals(base)) {
-			sp = 1;
-		}
-		StringBuilder buffer = new StringBuilder();
-		for (int i = sp; i < baseA.length - 1; i++) {
-			buffer.append("../");
-		}
-		for (int i = sp; i < targetA.length; i++) {
-			buffer.append(targetA[i] + "/");
-		}
-		buffer.deleteCharAt(buffer.length() - 1);
-		String path = buffer.toString();
-
-		String trimmed = path; // selectedPath.substring(1);
-		return trimmed;
-	}
-
 	/**
 	 * @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)
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 05f6e4415d6f93af2092988e14a4b37c6b1f097d..eee6d477ae666e74798b3c5e4e84974d55859234 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
@@ -127,6 +127,10 @@ public class LinkChooserController extends BasicController {
 			mainPanel.setContent(closeVC);
 			
 		} else if (event == Event.CANCELLED_EVENT) {
+			removeAsListenerAndDispose(fileLinkChooserController);
+			removeAsListenerAndDispose(courseLinkChooserController);
+			removeAsListenerAndDispose(customMediaChooserCtr);
+			
 			// Close the window, no URL selected
 			closeVC = createVelocityContainer("close");
 			closeVC.contextPut("imagepath", "");
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java
index b7037f5dbea499a94fd7acf870529a1b2cc2aa31..2eec89cc298102db079e803501d2bcd525ccf6d9 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java
@@ -33,8 +33,8 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.Map.Entry;
+import java.util.Set;
 
 import org.apache.commons.fileupload.FileItemIterator;
 import org.apache.commons.fileupload.FileItemStream;
@@ -59,7 +59,6 @@ import org.olat.core.util.CodeHelper;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.ValidationStatus;
 import org.olat.core.util.ValidationStatusHelper;
-import org.olat.core.util.WebappHelper;
 import org.olat.core.util.component.FormComponentTraverser;
 import org.olat.core.util.component.FormComponentVisitor;
 
diff --git a/src/main/java/org/olat/core/util/vfs/Quota.java b/src/main/java/org/olat/core/util/vfs/Quota.java
index ecf52d86ac875aff92c23eca887af684831a0009..060496625f680801b08ba5456e327e95379be3a8 100644
--- a/src/main/java/org/olat/core/util/vfs/Quota.java
+++ b/src/main/java/org/olat/core/util/vfs/Quota.java
@@ -52,5 +52,11 @@ public interface Quota {
 	 * @return Upload Limit in KB.
 	 */
 	public abstract Long getUlLimitKB();
+	
+	/**
+	 * Every time calculated. I can be very costly. Use it wisely
+	 * @return
+	 */
+	public abstract Long getRemainingSpace();
 
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/nodes/feed/FeedNodeEditController.java b/src/main/java/org/olat/course/nodes/feed/FeedNodeEditController.java
index 44d730c2dff1ff78a6c33fa0e5a17f1f5a15bf24..96054ac3c812bcdfb7c009d7121b66b7ca6e4280 100644
--- a/src/main/java/org/olat/course/nodes/feed/FeedNodeEditController.java
+++ b/src/main/java/org/olat/course/nodes/feed/FeedNodeEditController.java
@@ -46,7 +46,6 @@ import org.olat.course.nodes.AbstractFeedCourseNode;
 import org.olat.course.nodes.CourseNodeFactory;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.course.tree.CourseEditorTreeModel;
-import org.olat.group.ui.context.BGContextEvent;
 import org.olat.modules.ModuleConfiguration;
 import org.olat.modules.webFeed.FeedPreviewSecurityCallback;
 import org.olat.modules.webFeed.FeedSecurityCallback;
diff --git a/src/main/java/org/olat/fileresource/FileResourceManager.java b/src/main/java/org/olat/fileresource/FileResourceManager.java
index 04a51a7400f2766db3ae29d696e8f6b83467f7d5..b09182d0fa258c0bee4233b89afcc65bdb95410a 100644
--- a/src/main/java/org/olat/fileresource/FileResourceManager.java
+++ b/src/main/java/org/olat/fileresource/FileResourceManager.java
@@ -328,7 +328,23 @@ public class FileResourceManager extends BasicManager {
 	 */
 	public File unzipFileResource(final OLATResourceable res) {
 		final File dir = getFileResourceRoot(res);
-		if (!dir.exists()) return null;
+		return unzipFileResource(res, dir);
+	}
+	
+	public OlatRootFolderImpl unzipContainerResource(final OLATResourceable res) {
+		OlatRootFolderImpl container = getFileResourceRootImpl(res);
+		File dir = container.getBasefile();
+		File unzipDir = unzipFileResource(res, dir);
+		if(unzipDir == null) {
+			return null;
+		}
+		return (OlatRootFolderImpl)container.resolve(unzipDir.getName());
+	}
+	
+	private final File unzipFileResource(final OLATResourceable res, final File dir) {
+		if (!dir.exists()) {
+			return null;
+		}
 		File zipTargetDir = new File(dir, ZIPDIR);
 		if (!zipTargetDir.exists()) {
 			// if not unzipped yet, synchronize all unzipping processes
diff --git a/src/main/java/org/olat/ims/cp/ui/CPFileImportController.java b/src/main/java/org/olat/ims/cp/ui/CPFileImportController.java
index bbb423024624c32c62f3bf94e013cbd6a1c4c7e6..bb6606f93c9a47345c32e118568214a4678624f9 100644
--- a/src/main/java/org/olat/ims/cp/ui/CPFileImportController.java
+++ b/src/main/java/org/olat/ims/cp/ui/CPFileImportController.java
@@ -24,16 +24,13 @@
 */
 package org.olat.ims.cp.ui;
 
-import java.util.ArrayList;
 import java.util.LinkedList;
-import java.util.List;
 import java.util.Set;
 
 import org.olat.core.commons.modules.bc.FileUploadController;
 import org.olat.core.gui.UserRequest;
 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.FormUIFactory;
 import org.olat.core.gui.components.form.flexible.elements.FileElement;
 import org.olat.core.gui.components.form.flexible.elements.FormLink;
 import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
@@ -101,6 +98,10 @@ public class CPFileImportController extends FormBasicController {
 			file.setErrorKey("NoFileChosen", null);
 			return false;
 		}
+		if (file.getUploadSize() / 1024 > file.getMaxUploadSizeKB()) {
+			return false;
+		}
+		
 		return super.validateFormLogic(ureq);
 	}
 
@@ -116,6 +117,12 @@ public class CPFileImportController extends FormBasicController {
 		file = uifactory.addFileElement("file", this.flc);
 		file.setLabel("cpfileuploadcontroller.import.text", null);
 		file.addActionListener(this, FormEvent.ONCHANGE);
+		
+		Long uploadLimitKb = getUploadLimitKb();
+		if(uploadLimitKb != null) {
+			Long uploadLimitMb =  new Long(uploadLimitKb / 1024);
+			file.setMaxUploadSizeKB(uploadLimitKb.intValue(), "cpfileuploadcontroller.tooBig", new String[]{ uploadLimitMb.toString() });
+		}
 
 		// checkboxes
 		String[] keys = { "htm", "pdf", "doc", "xls", "ppt", ALL };
@@ -129,6 +136,14 @@ public class CPFileImportController extends FormBasicController {
 		uifactory.addFormSubmitButton("submit", "cpfileuploadcontroller.import.button", buttonLayout);
 		cancelButton = uifactory.addFormLink("cancel", buttonLayout, Link.BUTTON);
 	}
+	
+	private Long getUploadLimitKb() {
+		if(cp.getRootDir() != null && cp.getRootDir().getLocalSecurityCallback() != null
+				&& cp.getRootDir().getLocalSecurityCallback().getQuota() != null) {
+			return cp.getRootDir().getLocalSecurityCallback().getQuota().getUlLimitKB();
+		}
+		return null;
+	}
 
 	/**
 	 * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#doDispose()
diff --git a/src/main/java/org/olat/ims/cp/ui/VFSRootCPContainer.java b/src/main/java/org/olat/ims/cp/ui/VFSRootCPContainer.java
index 6c3b07abe1e14e5ba7f3430ed15cf84b9ad0941d..49f832326520263509466434e349d40fc6f0aa82 100644
--- a/src/main/java/org/olat/ims/cp/ui/VFSRootCPContainer.java
+++ b/src/main/java/org/olat/ims/cp/ui/VFSRootCPContainer.java
@@ -71,6 +71,8 @@ public class VFSRootCPContainer extends AbstractVirtualContainer implements VFSC
 		VFSContainer rawContainer = new VFSMediaFilesContainer(rawTitle, cloneContainer(rootContainer));
 		rawContainer.setDefaultItemFilter(new VFSMediaFilter(false));
 		roots.add(rawContainer);
+		
+		secCallback = rootContainer.getLocalSecurityCallback();
 	}
 	
 	private VFSContainer cloneContainer(VFSContainer container) {
diff --git a/src/main/java/org/olat/ims/cp/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/cp/ui/_i18n/LocalStrings_de.properties
index 61f746a2c54fc4b7a350494d28914a693f7a2218..757b257fb5a962c9cb9b117c3b11477fe8eb0499 100644
--- a/src/main/java/org/olat/ims/cp/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/ims/cp/ui/_i18n/LocalStrings_de.properties
@@ -44,6 +44,7 @@ cpfileuploadcontroller.virtual.root=Dateien
 cpfileuploadcontroller.pages=Inhalt
 cpfileuploadcontroller.media=Media
 cpfileuploadcontroller.raw=Alle Dateien
+cpfileuploadcontroller.tooBig=Datei ist zu gross. Es sind maximal {0} MB m\u00F6glich.
 
 pagecontroller.title=Seite editieren
 saveandclose=Speichern und schliessen
diff --git a/src/main/java/org/olat/modules/webFeed/managers/FeedManager.java b/src/main/java/org/olat/modules/webFeed/managers/FeedManager.java
index d5ad07a33296112f47c46d1c959bc74b604a58d1..cc0625fee2b178087c445c74f9674f12f9cedb37 100644
--- a/src/main/java/org/olat/modules/webFeed/managers/FeedManager.java
+++ b/src/main/java/org/olat/modules/webFeed/managers/FeedManager.java
@@ -22,6 +22,7 @@ package org.olat.modules.webFeed.managers;
 import java.io.File;
 import java.util.List;
 
+import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
 import org.olat.core.commons.services.commentAndRating.CommentAndRatingService;
 import org.olat.core.commons.services.commentAndRating.CommentAndRatingServiceFactory;
 import org.olat.core.gui.components.form.flexible.elements.FileElement;
@@ -31,6 +32,7 @@ import org.olat.core.id.OLATResourceable;
 import org.olat.core.manager.BasicManager;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.coordinate.LockResult;
+import org.olat.core.util.vfs.Quota;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
 import org.olat.core.util.vfs.VFSLeaf;
@@ -159,6 +161,8 @@ public abstract class FeedManager extends BasicManager implements CommentAndRati
 	 * @return The newly read feed (without items)
 	 */
 	public abstract Feed getFeed(OLATResourceable feed);
+	
+	public abstract OlatRootFolderImpl getResourceContainer(OLATResourceable ores);
 
 	/**
 	 * Returns the media file of the item
@@ -251,6 +255,8 @@ public abstract class FeedManager extends BasicManager implements CommentAndRati
 	 * @return The feed container
 	 */
 	public abstract VFSContainer getFeedContainer(OLATResourceable feed);
+	
+	public abstract Quota getQuota(OLATResourceable feed);
 
 	/**
 	 * Validates a feed url.
diff --git a/src/main/java/org/olat/modules/webFeed/managers/FeedManagerImpl.java b/src/main/java/org/olat/modules/webFeed/managers/FeedManagerImpl.java
index 9849a16fce63b88acc9ebd3b5762610c1f9601e2..95cd4edfc268dcee9cbafaa8388d4118a1d5b8f1 100644
--- a/src/main/java/org/olat/modules/webFeed/managers/FeedManagerImpl.java
+++ b/src/main/java/org/olat/modules/webFeed/managers/FeedManagerImpl.java
@@ -28,7 +28,9 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
+import org.olat.admin.quota.QuotaConstants;
 import org.olat.core.commons.modules.bc.FolderConfig;
+import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
 import org.olat.core.commons.persistence.PersistenceHelper;
 import org.olat.core.commons.services.commentAndRating.CommentAndRatingService;
 import org.olat.core.gui.components.form.flexible.elements.FileElement;
@@ -52,6 +54,8 @@ import org.olat.core.util.coordinate.SyncerExecutor;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.core.util.vfs.LocalFileImpl;
 import org.olat.core.util.vfs.LocalFolderImpl;
+import org.olat.core.util.vfs.Quota;
+import org.olat.core.util.vfs.QuotaManager;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
 import org.olat.core.util.vfs.VFSLeaf;
@@ -784,7 +788,7 @@ public abstract class FeedManagerImpl extends FeedManager {
 	 * @param ores
 	 * @return The resource (root) container of the feed
 	 */
-	private VFSContainer getResourceContainer(OLATResourceable ores) {
+	public OlatRootFolderImpl getResourceContainer(OLATResourceable ores) {
 		return fileResourceManager.getFileResourceRootImpl(ores);
 	}
 
@@ -1219,6 +1223,19 @@ public abstract class FeedManagerImpl extends FeedManager {
 		LockResult lockResult = coordinator.getLocker().acquireLock(itemResource, identity, key);
 		return lockResult;
 	}
+	
+	@Override
+	public Quota getQuota(OLATResourceable feed) {
+		OlatRootFolderImpl container = getResourceContainer(feed);
+
+		Quota quota = QuotaManager.getInstance().getCustomQuota(container.getRelPath());
+		if (quota == null) {
+			Quota defQuota = QuotaManager.getInstance().getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_FEEDS);
+			quota = QuotaManager.getInstance().createQuota(container.getRelPath(), defQuota.getQuotaKB(), defQuota.getUlLimitKB());
+		}
+		
+		return quota;	
+	}
 
 	/**
 	 * @see org.olat.modules.webFeed.managers.FeedManager#setImage(org.olat.core.gui.components.form.flexible.elements.FileElement,
diff --git a/src/main/java/org/olat/modules/webFeed/models/Feed.java b/src/main/java/org/olat/modules/webFeed/models/Feed.java
index 3063fab7e179eb56d3a73a725e1d010255e49c40..522f9a2316c59ddaa34afc5c0271e53d446d06fc 100644
--- a/src/main/java/org/olat/modules/webFeed/models/Feed.java
+++ b/src/main/java/org/olat/modules/webFeed/models/Feed.java
@@ -29,6 +29,7 @@ import org.olat.basesecurity.BaseSecurityManager;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Roles;
+import org.olat.core.util.resource.OresHelper;
 import org.olat.modules.webFeed.FeedSecurityCallback;
 
 /**
@@ -85,6 +86,10 @@ public class Feed implements OLATResourceable, Serializable {
 		// new model constructor, set to current version
 		this.modelVersion = CURRENT_MODEL_VERSION;
 	}
+	
+	public OLATResourceable getResource() {
+		return OresHelper.createOLATResourceableInstanceWithoutCheck(type, id);
+	}
 
 	/**
 	 * Setter for title
diff --git a/src/main/java/org/olat/modules/webFeed/ui/FeedFormController.java b/src/main/java/org/olat/modules/webFeed/ui/FeedFormController.java
index 403fb898f27d2a770a0318b4f283486e9e3c4d8b..9311532a38bb8b36ebc28ce2b38f1cec9efd303d 100644
--- a/src/main/java/org/olat/modules/webFeed/ui/FeedFormController.java
+++ b/src/main/java/org/olat/modules/webFeed/ui/FeedFormController.java
@@ -42,8 +42,11 @@ 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.media.MediaResource;
+import org.olat.core.util.Formatter;
 import org.olat.core.util.Util;
+import org.olat.core.util.WebappHelper;
 import org.olat.core.util.vfs.LocalFileImpl;
+import org.olat.core.util.vfs.Quota;
 import org.olat.core.util.vfs.VFSMediaResource;
 import org.olat.modules.webFeed.managers.FeedManager;
 import org.olat.modules.webFeed.managers.ValidatedURL;
@@ -63,6 +66,8 @@ import org.olat.modules.webFeed.models.Feed;
  */
 class FeedFormController extends FormBasicController {
 	private Feed feed;
+	private Quota feedQuota;
+	
 	private TextElement title;
 	private FileElement file;
 	private RichTextElement description;
@@ -84,6 +89,7 @@ class FeedFormController extends FormBasicController {
 	public FeedFormController(UserRequest ureq, WindowControl wControl, Feed feed, FeedUIFactory uiFactory) {
 		super(ureq, wControl);
 		this.feed = feed;
+		this.feedQuota = FeedManager.getInstance().getQuota(feed.getResource());
 		setTranslator(uiFactory.getTranslator());
 		initForm(ureq);
 	}
@@ -133,7 +139,7 @@ class FeedFormController extends FormBasicController {
 					file.clearError();
 					MediaResource newResource = new VFSMediaResource(new LocalFileImpl(newFile));
 					setImage(newResource);
-				}
+				}	
 			}
 		} else if (source == deleteImageLink && event.wasTriggerdBy(FormEvent.ONCLICK)) {
 			unsetImage();
@@ -150,6 +156,18 @@ class FeedFormController extends FormBasicController {
 			description.setErrorKey("input.toolong", new String[]{"4000"});
 			allOk = false;
 		}
+		
+		if (file.isUploadSuccess()) {
+			File newFile = file.getUploadFile();
+			Long remainingQuotaKb = feedQuota.getRemainingSpace();
+			if (remainingQuotaKb != -1 && newFile.length() / 1024 > remainingQuotaKb) {
+				unsetImage();
+				String supportAddr = WebappHelper.getMailConfig("mailSupport");
+				Long uploadLimitKB = feedQuota.getUlLimitKB();
+				getWindowControl().setError(translate("ULLimitExceeded", new String[] { Formatter.roundToString(uploadLimitKB.floatValue() / 1024f, 1), supportAddr }));				
+			}
+		}
+
 		return allOk && validateExternalFeedUrl() && super.validateFormLogic(ureq);
 	}
 	
@@ -273,6 +291,10 @@ class FeedFormController extends FormBasicController {
 		mimeTypes.add("image/png");
 		mimeTypes.add("image/gif");
 		file.limitToMimeType(mimeTypes, "feed.form.file.type.error.images", null);
+		
+		int maxFileSizeKB = feedQuota.getUlLimitKB().intValue();
+		String supportAddr = WebappHelper.getMailConfig("mailSupport");
+		file.setMaxUploadSizeKB(maxFileSizeKB, "ULLimitExceeded", new String[]{ new Long(maxFileSizeKB / 1024).toString(), supportAddr });
 
 		// if external feed, display feed-url text-element:
 		if(feed.isExternal()){
diff --git a/src/main/java/org/olat/modules/webFeed/ui/FeedMainController.java b/src/main/java/org/olat/modules/webFeed/ui/FeedMainController.java
index b57a4f60165c6a089a6504240dc4bdcfdbe2a724..03b7a35ac5162962153e8bb3844dcd42171bc499 100644
--- a/src/main/java/org/olat/modules/webFeed/ui/FeedMainController.java
+++ b/src/main/java/org/olat/modules/webFeed/ui/FeedMainController.java
@@ -258,6 +258,9 @@ public class FeedMainController extends BasicController implements Activateable,
 				}
 				// release the lock
 				feedManager.releaseLock(lock);
+
+				removeAsListenerAndDispose(feedFormCtr);
+				feedFormCtr = null;
 			}
 		} else if (source == itemsCtr && event.equals(ItemsController.HANDLE_NEW_EXTERNAL_FEED_DIALOG_EVENT)) {
 			oldFeedUrl = feed.getExternalFeedUrl();			
diff --git a/src/main/java/org/olat/modules/webFeed/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/webFeed/ui/_i18n/LocalStrings_de.properties
index d0bac74d755fe0044f0dcd7c68bb86b8095a59f2..2af164dacdd3ee60efc472433586fb910d2eb451 100644
--- a/src/main/java/org/olat/modules/webFeed/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/modules/webFeed/ui/_i18n/LocalStrings_de.properties
@@ -14,6 +14,7 @@ feed.form.feedurl.invalid.not_found = Die angegebene URL existiert nicht oder Do
 feed.form.feedurl.invalid.no_media = Die angegebene URL ist keine Podcast URL
 feed.form.file.type.error = Der gew\u00E4hlte Dateityp wird nicht unterst\u00FCtzt. Unterst\u00FCtzte Formate sind FLV, MP3, MP4, M4V, M4A und AAC.
 feed.form.file.type.error.images = Der gew\u00E4hlte Dateityp wird nicht unterst\u00FCtzt. Unterst\u00FCtzte Formate sind JPEG, PNG und GIF.
+ULLimitExceeded=$org.olat.core.commons.modules.bc\:ULLimitExceeded
 feed.no.image = Kein Bild vorhanden
 feed.url.label = Feed-URL:
 feed.url.is.personal.warning = Diese URL ist pers\u00F6nlich und darf nicht an Dritte weitergegeben werden.
diff --git a/src/main/java/org/olat/modules/webFeed/ui/blog/BlogPostFormController.java b/src/main/java/org/olat/modules/webFeed/ui/blog/BlogPostFormController.java
index 2ed5ac28890096dbb37305ecbe6714827a925ddb..0d90a415a1430bda723e18b0402e1d9dec4d490b 100644
--- a/src/main/java/org/olat/modules/webFeed/ui/blog/BlogPostFormController.java
+++ b/src/main/java/org/olat/modules/webFeed/ui/blog/BlogPostFormController.java
@@ -41,7 +41,9 @@ 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.translator.Translator;
+import org.olat.core.util.vfs.Quota;
 import org.olat.core.util.vfs.VFSContainer;
+import org.olat.core.util.vfs.callbacks.FullAccessWithQuotaCallback;
 import org.olat.modules.webFeed.managers.FeedManager;
 import org.olat.modules.webFeed.models.Feed;
 import org.olat.modules.webFeed.models.Item;
@@ -57,7 +59,8 @@ import org.olat.modules.webFeed.models.Item;
 public class BlogPostFormController extends FormBasicController {
 
 	private Item post;
-	private Feed blog;
+	private VFSContainer baseDir;
+	
 	private TextElement title;
 	private RichTextElement description, content;
 	private DateChooser publishDateChooser;
@@ -75,7 +78,11 @@ public class BlogPostFormController extends FormBasicController {
 		super(ureq, control);
 		this.post = post;
 		this.currentlyDraft = post.isDraft();
-		this.blog = blog;
+		this.baseDir = FeedManager.getInstance().getItemContainer(post, blog);
+		if(baseDir.getLocalSecurityCallback() == null) {
+			Quota quota = FeedManager.getInstance().getQuota(blog.getResource());
+			baseDir.setLocalSecurityCallback(new FullAccessWithQuotaCallback(quota));
+		}
 		setTranslator(translator);
 		initForm(ureq);
 	}
@@ -174,7 +181,6 @@ public class BlogPostFormController extends FormBasicController {
 		title.setMandatory(true);
 		title.setNotEmptyCheck("feed.form.field.is_mandatory");
 
-		VFSContainer baseDir = FeedManager.getInstance().getItemContainer(post, blog);
 		// Description
 		description = uifactory.addRichTextElementForStringData("description", "feed.form.description", post.getDescription(), 8, -1, false,
 				false, baseDir, null, formLayout, ureq.getUserSession(), getWindowControl());
diff --git a/src/main/java/org/olat/modules/webFeed/ui/podcast/EpisodeFormController.java b/src/main/java/org/olat/modules/webFeed/ui/podcast/EpisodeFormController.java
index 2d1ff1ad68ef0a6e4ad38ca20430148c64f109e0..a5c0d003980fe480d4b5e2edc5100d3102dc71bc 100644
--- a/src/main/java/org/olat/modules/webFeed/ui/podcast/EpisodeFormController.java
+++ b/src/main/java/org/olat/modules/webFeed/ui/podcast/EpisodeFormController.java
@@ -39,8 +39,12 @@ import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.FileUtils;
+import org.olat.core.util.Formatter;
 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;
+import org.olat.core.util.vfs.callbacks.FullAccessWithQuotaCallback;
 import org.olat.modules.webFeed.managers.FeedManager;
 import org.olat.modules.webFeed.models.Feed;
 import org.olat.modules.webFeed.models.Item;
@@ -80,6 +84,11 @@ public class EpisodeFormController extends FormBasicController {
 		this.episode = episode;
 		this.podcast = podcast;
 		this.baseDir = FeedManager.getInstance().getItemContainer(episode, podcast);
+		if(baseDir.getLocalSecurityCallback() == null) {
+			Quota quota = FeedManager.getInstance().getQuota(podcast.getResource());
+			baseDir.setLocalSecurityCallback(new FullAccessWithQuotaCallback(quota));
+		}
+		
 		setTranslator(translator);
 		initForm(ureq);
 	}
@@ -139,6 +148,8 @@ public class EpisodeFormController extends FormBasicController {
 			fireEvent(ureq, Event.CANCELLED_EVENT);
 		} else if (source == file && event.wasTriggerdBy(FormEvent.ONCHANGE)) {
 			// display the uploaded file
+
+			file.clearError();
 			if (file.isUploadSuccess()) {
 				String newFilename = file.getUploadFileName();
 				boolean isValidFileType = newFilename.toLowerCase().matches(MIME_TYPES_ALLOWED);
@@ -149,8 +160,6 @@ public class EpisodeFormController extends FormBasicController {
 					} else if (!isFilenameValid) {
 						file.setErrorKey("podcastfile.name.notvalid", null);
 					}
-				} else {
-					file.clearError();
 				}
 			}
 		}
@@ -179,11 +188,20 @@ public class EpisodeFormController extends FormBasicController {
 					allOk = false;
 				}
 			} else {
-				file.clearError();
 				flc.setDirty(true);
 			}
 		}
 		
+		if(baseDir.getLocalSecurityCallback() == null || baseDir.getLocalSecurityCallback().getQuota() != null) {
+			Quota feedQuota = baseDir.getLocalSecurityCallback().getQuota();
+			Long remainingQuotaKb = feedQuota.getRemainingSpace();
+			if (remainingQuotaKb != -1 && file.getUploadFile().length() / 1024 > remainingQuotaKb) {
+				String supportAddr = WebappHelper.getMailConfig("mailSupport");
+				Long uploadLimitKB = feedQuota.getUlLimitKB();
+				getWindowControl().setError(translate("ULLimitExceeded", new String[] { Formatter.roundToString(uploadLimitKB.floatValue() / 1024f, 1), supportAddr }));
+			}
+		}
+		
 		//fxdiff FXOLAT-118: size for video podcast
 		String width = widthEl.getValue();
 		widthEl.clearError();
@@ -245,6 +263,11 @@ public class EpisodeFormController extends FormBasicController {
 		File mediaFile = FeedManager.getInstance().getItemEnclosureFile(episode, podcast);
 		file.setInitialFile(mediaFile);
 		file.addActionListener(this, FormEvent.ONCHANGE);
+		if(baseDir.getLocalSecurityCallback() != null && baseDir.getLocalSecurityCallback().getQuota() != null) {
+			Long uploadLimitKB = baseDir.getLocalSecurityCallback().getQuota().getUlLimitKB();
+			String supportAddr = WebappHelper.getMailConfig("mailSupport");
+			file.setMaxUploadSizeKB(uploadLimitKB.intValue(), "ULLimitExceeded", new String[] { Formatter.roundToString((uploadLimitKB.floatValue()) / 1024f, 1), supportAddr });
+		}
 		
 		String width = episode.getWidth() > 0 ? Integer.toString(episode.getWidth()) : "";
 		widthEl = uifactory.addTextElement("video-width", "podcast.episode.file.width", 12, width, flc);
diff --git a/src/main/java/org/olat/modules/webFeed/ui/podcast/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/webFeed/ui/podcast/_i18n/LocalStrings_de.properties
index ca6432773a87934432b2ffdf697df65df148ca06..560b123bb66c3daa972e1432174d73c28bc4711a 100644
--- a/src/main/java/org/olat/modules/webFeed/ui/podcast/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/modules/webFeed/ui/podcast/_i18n/LocalStrings_de.properties
@@ -11,7 +11,7 @@ podcast.episode.download = Episode herunterladen
 podcast.episodes = Episoden
 podcast.episode.mandatory = Eine Episode verlangt eine Audio- oder Videodatei, die mit Flash abgespielt werden kann.
 podcastfile.name.notvalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid
-
+ULLimitExceeded=$org.olat.core.commons.modules.bc\:ULLimitExceeded
 feed.make.internal = Episoden selbst erstellen 
 feed.make.external = Einen bestehenden externen Podcast einbinden
 feed.edit = Podcast bearbeiten
diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties
index 99d01574fb984905696031e7291cf28c23c401ae..94d337b14eaaf707e3106f2556b68318d1955072 100644
--- a/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties
@@ -375,6 +375,7 @@ tab.glossary=Glossar
 tab.layout=Layout
 tab.log=Logfiles
 tab.public=Allgemein
+tab.quota.edit=Quota
 tab.glossary.flexions=Morphologischer Dienst
 tab.glossary.register=Alphabetisches Register
 tab.glossary.edit=Schreibberechtigung
diff --git a/src/main/java/org/olat/repository/controllers/RepositoryEditPropertiesController.java b/src/main/java/org/olat/repository/controllers/RepositoryEditPropertiesController.java
index cd9adadcd1fc7099fa9c2eeffbc46c7370bd9b0a..bb22fb9ed3075497c93392fc41eae1b5decbd42b 100644
--- a/src/main/java/org/olat/repository/controllers/RepositoryEditPropertiesController.java
+++ b/src/main/java/org/olat/repository/controllers/RepositoryEditPropertiesController.java
@@ -28,11 +28,10 @@ package org.olat.repository.controllers;
 import java.util.Iterator;
 import java.util.List;
 
-import org.olat.basesecurity.BaseSecurityManager;
-import org.olat.basesecurity.Constants;
 import org.olat.basesecurity.SecurityGroup;
 import org.olat.commons.calendar.CalendarManager;
 import org.olat.commons.calendar.ui.events.KalendarModifiedEvent;
+import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
 import org.olat.core.commons.persistence.DBFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
@@ -56,8 +55,7 @@ import org.olat.core.util.coordinate.LockResult;
 import org.olat.core.util.event.EventBus;
 import org.olat.core.util.event.MultiUserEvent;
 import org.olat.core.util.resource.OresHelper;
-import org.olat.core.util.vfs.NamedContainerImpl;
-import org.olat.core.util.vfs.VFSContainer;
+import org.olat.core.util.vfs.QuotaManager;
 import org.olat.course.CourseFactory;
 import org.olat.course.CourseModule;
 import org.olat.course.ICourse;
@@ -71,7 +69,11 @@ import org.olat.course.config.ui.CourseEfficencyStatementController;
 import org.olat.course.config.ui.CourseSharedFolderController;
 import org.olat.course.config.ui.courselayout.CourseLayoutGeneratorController;
 import org.olat.course.run.RunMainController;
+import org.olat.fileresource.FileResourceManager;
+import org.olat.fileresource.types.BlogFileResource;
 import org.olat.fileresource.types.GlossaryResource;
+import org.olat.fileresource.types.ImsCPFileResource;
+import org.olat.fileresource.types.PodcastFileResource;
 import org.olat.instantMessaging.InstantMessagingModule;
 import org.olat.modules.glossary.GlossaryEditSettingsController;
 import org.olat.modules.glossary.GlossaryManager;
@@ -92,7 +94,6 @@ import org.olat.util.logging.activity.LoggingResourceable;
  */
 public class RepositoryEditPropertiesController extends BasicController {
 	
-	private static final String ACTION_PUB = "pub";
 	private static final String ACTION_FORWARD ="forw";
 	private static final String ACTION_BACKWARD ="bckw";
 	
@@ -113,9 +114,6 @@ public class RepositoryEditPropertiesController extends BasicController {
 	private TabbedPane tabbedPane;
 	private RepositoryEntry repositoryEntry;
 	
-	private boolean isOwner;
-	private boolean isAuthor;
-	
   private LockResult courseLockEntry;
   
   private CourseConfig initialCourseConfig; //deep clone of the courseConfig
@@ -149,14 +147,6 @@ public class RepositoryEditPropertiesController extends BasicController {
 		//o_clusterREVIEW
 		secGroup = (SecurityGroup) DBFactory.getInstance().loadObject(secGroup);
 		
-		if (ureq.getUserSession().getRoles().isOLATAdmin()) {
-			isOwner = true;
-			isAuthor = true;
-		} else {
-			isOwner = BaseSecurityManager.getInstance().isIdentityPermittedOnResourceable(ureq.getIdentity(), Constants.PERMISSION_ACCESS, secGroup);
-			isAuthor = ureq.getUserSession().getRoles().isAuthor();
-		}
-		
 		bgVC = createVelocityContainer("bgrep");
 		bgVC.contextPut("title", entry.getDisplayname());
 		tabbedPane = new TabbedPane("descTB", ureq.getLocale());
@@ -233,6 +223,15 @@ public class RepositoryEditPropertiesController extends BasicController {
 			GlossaryEditSettingsController glossEditCtr = new GlossaryEditSettingsController(ureq, getWindowControl(), repositoryEntry.getOlatResource());
 			tabbedPane.addTab(translate("tab.glossary.edit"), glossEditCtr.getInitialComponent());
 		
+		} else if (ImsCPFileResource.TYPE_NAME.equals(repositoryEntry.getOlatResource().getResourceableTypeName())) {
+			OlatRootFolderImpl cpRoot = FileResourceManager.getInstance().unzipContainerResource(repositoryEntry.getOlatResource());
+			Controller quotaCtrl = QuotaManager.getInstance().getQuotaEditorInstance(ureq, wControl, cpRoot.getRelPath(), false);
+			tabbedPane.addTab(translate("tab.quota.edit"), quotaCtrl.getInitialComponent());
+		} else if (BlogFileResource.TYPE_NAME.equals(repositoryEntry.getOlatResource().getResourceableTypeName())
+				|| PodcastFileResource.TYPE_NAME.equals(repositoryEntry.getOlatResource().getResourceableTypeName())) {
+			OlatRootFolderImpl feedRoot = FileResourceManager.getInstance().getFileResourceRootImpl(repositoryEntry.getOlatResource());
+			Controller quotaCtrl = QuotaManager.getInstance().getQuotaEditorInstance(ureq, wControl, feedRoot.getRelPath(), false);
+			tabbedPane.addTab(translate("tab.quota.edit"), quotaCtrl.getInitialComponent());
 		}
 
 		bgVC.put("descTB", tabbedPane);
diff --git a/src/main/java/org/olat/repository/handlers/ImsCPHandler.java b/src/main/java/org/olat/repository/handlers/ImsCPHandler.java
index c5de1f9ef1eff2826ef6be0034b5a58ea9553963..5ca513d99a00e5f4a71fb53bb1ae0ee22403587a 100644
--- a/src/main/java/org/olat/repository/handlers/ImsCPHandler.java
+++ b/src/main/java/org/olat/repository/handlers/ImsCPHandler.java
@@ -29,6 +29,8 @@ import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.olat.admin.quota.QuotaConstants;
+import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
@@ -41,6 +43,10 @@ import org.olat.core.logging.AssertException;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.coordinate.LockResult;
 import org.olat.core.util.vfs.LocalFolderImpl;
+import org.olat.core.util.vfs.Quota;
+import org.olat.core.util.vfs.QuotaManager;
+import org.olat.core.util.vfs.callbacks.FullAccessWithQuotaCallback;
+import org.olat.core.util.vfs.callbacks.VFSSecurityCallback;
 import org.olat.course.nodes.cp.CPRunController;
 import org.olat.fileresource.FileResourceManager;
 import org.olat.fileresource.types.ImsCPFileResource;
@@ -157,10 +163,17 @@ public class ImsCPHandler extends FileHandler implements RepositoryHandler {
 	 */
 	public Controller createEditorController(OLATResourceable res, UserRequest ureq, WindowControl wControl) {
 		// only unzips, if not already unzipped
-		File cpRoot = FileResourceManager.getInstance().unzipFileResource(res);
-		LocalFolderImpl vfsWrapper = new LocalFolderImpl(cpRoot);
-		return new CPEditMainController(ureq, wControl, vfsWrapper, res);
+		OlatRootFolderImpl cpRoot = FileResourceManager.getInstance().unzipContainerResource(res);
+
+		Quota quota = QuotaManager.getInstance().getCustomQuota(cpRoot.getRelPath());
+		if (quota == null) {
+			Quota defQuota = QuotaManager.getInstance().getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_REPO);
+			quota = QuotaManager.getInstance().createQuota(cpRoot.getRelPath(), defQuota.getQuotaKB(), defQuota.getUlLimitKB());
+		}
+		VFSSecurityCallback secCallback = new FullAccessWithQuotaCallback(quota);
+		cpRoot.setLocalSecurityCallback(secCallback);
 
+		return new CPEditMainController(ureq, wControl, cpRoot, res);
 	}
 
 	/**