diff --git a/src/main/java/org/olat/course/CourseModule.java b/src/main/java/org/olat/course/CourseModule.java
index 2d9a10b544a66b93cb1112039567624a6e0f9cd7..4a1fde26e97d1fe3b72fcf15de2e7f7f6e339f9f 100644
--- a/src/main/java/org/olat/course/CourseModule.java
+++ b/src/main/java/org/olat/course/CourseModule.java
@@ -50,6 +50,7 @@ import org.olat.properties.Property;
 import org.olat.properties.PropertyManager;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
+import org.olat.repository.RepositoryService;
 import org.olat.resource.OLATResource;
 import org.olat.resource.OLATResourceManager;
 
@@ -77,7 +78,7 @@ public class CourseModule extends AbstractOLATModule {
 	private CourseFactory courseFactory;
 	private Map<String, String> logVisibilities;
 	private List<DeployableCourseExport> deployableCourseExports;
-	private RepositoryManager repositoryManager;
+	private RepositoryService repositoryService;
 	private OLATResourceManager olatResourceManager;
 	
 
@@ -85,11 +86,11 @@ public class CourseModule extends AbstractOLATModule {
 	/**
 	 * [used by spring]
 	 */
-	private CourseModule(CoordinatorManager coordinatorManager, PropertyManager propertyManager, CourseFactory courseFactory, RepositoryManager repositoryManager, OLATResourceManager olatResourceManager) {
+	private CourseModule(CoordinatorManager coordinatorManager, PropertyManager propertyManager, CourseFactory courseFactory, RepositoryService repositoryService, OLATResourceManager olatResourceManager) {
 		this.coordinatorManager = coordinatorManager;
 		this.propertyManager = propertyManager;
 		this.courseFactory = courseFactory;
-		this.repositoryManager = repositoryManager;
+		this.repositoryService = repositoryService;
 		this.olatResourceManager = olatResourceManager;
 		coordinatorManager.getCoordinator().getEventBus().registerFor(this, null, FrameworkStartupEventChannel.getStartupEventChannel());
 	}
@@ -277,7 +278,7 @@ public class CourseModule extends AbstractOLATModule {
 	private void deleteCourseAndProperty(Property prop, RepositoryEntry re) {
 		try {
 			propertyManager.deleteProperty(prop);
-			repositoryManager.deleteRepositoryEntryAndBasesecurity(re);
+			repositoryService.deleteRepositoryEntryAndBaseGroups(re);
 			CourseFactory.deleteCourse(re.getOlatResource());
 			OLATResource ores = olatResourceManager.findResourceable(re.getOlatResource());
 			olatResourceManager.deleteOLATResource(ores);
diff --git a/src/main/java/org/olat/course/_spring/courseContext.xml b/src/main/java/org/olat/course/_spring/courseContext.xml
index 78bd0820525fa92732ac24b92640f98f18836abc..89a122c83cab3832210417c9a1ac05085d01434a 100644
--- a/src/main/java/org/olat/course/_spring/courseContext.xml
+++ b/src/main/java/org/olat/course/_spring/courseContext.xml
@@ -24,7 +24,7 @@
 	<constructor-arg index="0" ref="coordinatorManager" />
 	<constructor-arg index="1" ref="propertyManager" />
 	<constructor-arg index="2" ref="courseFactory" />
-	<constructor-arg index="3" ref="repositoryManager" />
+	<constructor-arg index="3" ref="repositoryService" />
 	<constructor-arg index="4" ref="resourceManager" />
 	
 	<property name="persistedProperties">
diff --git a/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java b/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java
index 6f73653aec640942fb56f8cfb824f521c8f058c8..fef06048e548a957649c121b5696cbb061219c65 100644
--- a/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java
+++ b/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java
@@ -263,6 +263,7 @@ public class PersistingCourseGroupManager extends BasicManager implements Course
 	/**
 	 * @see org.olat.course.groupsandrights.CourseGroupManager#deleteCourseGroupmanagement()
 	 */
+	@Override
 	public void deleteCourseGroupmanagement() {
 		//delete permission group to course
 		RepositoryEntry re = RepositoryManager.getInstance().lookupRepositoryEntry(getCourseResource(), false);
diff --git a/src/main/java/org/olat/ims/qti/repository/handlers/QTIHandler.java b/src/main/java/org/olat/ims/qti/repository/handlers/QTIHandler.java
index e09900fbf3b375d12b5caf11fe49b526d2e15042..3a3b83332f8a2737d4f2abf74d03fccb5cc6f945 100644
--- a/src/main/java/org/olat/ims/qti/repository/handlers/QTIHandler.java
+++ b/src/main/java/org/olat/ims/qti/repository/handlers/QTIHandler.java
@@ -39,6 +39,7 @@ import org.olat.core.gui.control.generic.layout.MainLayoutController;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
+import org.olat.core.id.Roles;
 import org.olat.core.util.Util;
 import org.olat.core.util.ZipUtil;
 import org.olat.core.util.coordinate.CoordinatorManager;
@@ -53,6 +54,7 @@ import org.olat.ims.qti.process.Resolver;
 import org.olat.modules.iq.IQManager;
 import org.olat.modules.iq.IQPreviewSecurityCallback;
 import org.olat.modules.iq.IQSecurityCallback;
+import org.olat.repository.ErrorList;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
 import org.olat.repository.RepositoryService;
@@ -155,18 +157,18 @@ public abstract class QTIHandler extends FileHandler {
 	}
 
 	@Override
-	public boolean readyToDelete(OLATResourceable res, UserRequest ureq, WindowControl wControl) {
+	public boolean readyToDelete(OLATResourceable res, Identity identity, Roles roles, Locale locale, ErrorList errors) {
 		ReferenceManager refM = ReferenceManager.getInstance();
-		String referencesSummary = refM.getReferencesToSummary(res, ureq.getLocale());
+		String referencesSummary = refM.getReferencesToSummary(res, locale);
 		if (referencesSummary != null) {
-			Translator translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale());
-			wControl.setError(translator.translate("details.delete.error.references",
+			Translator translator = Util.createPackageTranslator(RepositoryManager.class, locale);
+			errors.setError(translator.translate("details.delete.error.references",
 					new String[] { referencesSummary }));
 			return false;
 		}
 		if (CoordinatorManager.getInstance().getCoordinator().getLocker().isLocked(res, null)) {
-			Translator translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale());
-			wControl.setError(translator.translate("details.delete.error.editor"));
+			Translator translator = Util.createPackageTranslator(RepositoryManager.class, locale);
+			errors.setError(translator.translate("details.delete.error.editor"));
 			return false;
 		}
 		return true;
diff --git a/src/main/java/org/olat/repository/ErrorList.java b/src/main/java/org/olat/repository/ErrorList.java
new file mode 100644
index 0000000000000000000000000000000000000000..21f558bec9bbd35214d5d0cff30b712b22ffd3e1
--- /dev/null
+++ b/src/main/java/org/olat/repository/ErrorList.java
@@ -0,0 +1,47 @@
+/**
+ * <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.repository;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 
+ * Initial date: 16.06.2014<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class ErrorList {
+	
+	private final List<String> errors = new ArrayList<>(2);
+
+	
+	public boolean hasErrors() {
+		return errors.size() > 0;
+	}
+	
+	public String getFirstError() {
+		return errors.size() > 0 ? errors.get(0) : null;
+	}
+	
+	public void setError(String error) {
+		errors.add(error);
+	}
+}
diff --git a/src/main/java/org/olat/repository/RepositoryEntry.java b/src/main/java/org/olat/repository/RepositoryEntry.java
index a340c04b1c21d40534c413b519088af3f4c0151e..b4689ba12a7da851e5cdbb9fdf5e87713416cc6b 100644
--- a/src/main/java/org/olat/repository/RepositoryEntry.java
+++ b/src/main/java/org/olat/repository/RepositoryEntry.java
@@ -108,7 +108,8 @@ public class RepositoryEntry implements CreateInfo, Persistable , RepositoryEntr
 	@JoinColumn(name="fk_olatresource", nullable=false, insertable=true, updatable=false)
 	private OLATResource olatResource;
 	
-	@OneToMany(targetEntity=RepositoryEntryToGroupRelation.class, fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.REMOVE})
+	@OneToMany(targetEntity=RepositoryEntryToGroupRelation.class, fetch=FetchType.LAZY,
+			orphanRemoval=true, cascade={CascadeType.PERSIST, CascadeType.REMOVE})
 	@JoinColumn(name="fk_entry_id")
 	private Set<RepositoryEntryToGroupRelation> groups;
 	
diff --git a/src/main/java/org/olat/repository/RepositoryManager.java b/src/main/java/org/olat/repository/RepositoryManager.java
index bed0186f04bb835c34467e5ea1b0537b49140114..8cdea0b9a34c9cf6df0c31b33880b8c15d53b42e 100644
--- a/src/main/java/org/olat/repository/RepositoryManager.java
+++ b/src/main/java/org/olat/repository/RepositoryManager.java
@@ -41,13 +41,11 @@ import javax.persistence.TypedQuery;
 
 import org.olat.admin.securitygroup.gui.IdentitiesAddEvent;
 import org.olat.basesecurity.BaseSecurity;
-import org.olat.basesecurity.Group;
 import org.olat.basesecurity.GroupRoles;
 import org.olat.basesecurity.IdentityImpl;
 import org.olat.basesecurity.IdentityRef;
 import org.olat.basesecurity.manager.GroupDAO;
 import org.olat.catalog.CatalogEntry;
-import org.olat.catalog.CatalogManager;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.modules.bc.FolderConfig;
 import org.olat.core.commons.persistence.DB;
@@ -55,10 +53,8 @@ import org.olat.core.commons.persistence.DBQuery;
 import org.olat.core.commons.persistence.PersistenceHelper;
 import org.olat.core.commons.services.image.ImageService;
 import org.olat.core.commons.services.image.Size;
-import org.olat.core.commons.services.mark.MarkManager;
 import org.olat.core.commons.services.mark.impl.MarkImpl;
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.control.WindowControl;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Roles;
@@ -78,8 +74,6 @@ import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.core.util.vfs.VFSManager;
 import org.olat.course.assessment.manager.UserCourseInformationsManager;
 import org.olat.group.GroupLoggingAction;
-import org.olat.repository.handlers.RepositoryHandler;
-import org.olat.repository.handlers.RepositoryHandlerFactory;
 import org.olat.repository.manager.RepositoryEntryRelationDAO;
 import org.olat.repository.model.RepositoryEntryLifecycle;
 import org.olat.repository.model.RepositoryEntryMembership;
@@ -203,72 +197,7 @@ public class RepositoryManager extends BasicManager {
 		Size size = imageHelper.scaleImage(newImageFile, repoImage, PICTUREWIDTH, PICTUREWIDTH, false);
 		return size != null;
 	}
-	
-	/**
-	 * clean up a repo entry with all children and associated data like bookmarks and user references to it
-	 * @param ureq
-	 * @param wControl
-	 * @param entry
-	 * @return
-	 * FIXME: we need a delete method without ureq, wControl for manager use. In general, very bad idea to pass ureq and
-	 * wControl down to the manger layer.
-	 */
-	public boolean deleteRepositoryEntryWithAllData(UserRequest ureq, WindowControl wControl, RepositoryEntry entry) {
-		// invoke handler delete callback
-		logDebug("deleteRepositoryEntry start entry=" + entry);
-		entry = (RepositoryEntry) dbInstance.loadObject(entry,true);
-		logDebug("deleteRepositoryEntry after load entry=" + entry);
-		RepositoryHandler handler = RepositoryHandlerFactory.getInstance().getRepositoryHandler(entry);
-		OLATResource resource = entry.getOlatResource();
-		//delete old context
-		if (!handler.readyToDelete(resource, ureq, wControl)) {
-			return false;
-		}
-
-		// start transaction
-		// delete entry picture
-		deleteImage(entry);
-		userCourseInformationsManager.deleteUserCourseInformations(entry);
-		
-		// delete all bookmarks referencing deleted entry
-		CoreSpringFactory.getImpl(MarkManager.class).deleteMarks(entry);
-		// delete all catalog entries referencing deleted entry
-		CatalogManager.getInstance().resourceableDeleted(entry);
-		
-		//delete all policies
-		securityManager.deletePolicies(resource);
-		
-		// inform handler to do any cleanup work... handler must delete the
-		// referenced resourceable a swell.
-		handler.cleanupOnDelete(resource);
-		
-		dbInstance.commit();
 
-		logDebug("deleteRepositoryEntry after reload entry=" + entry);
-		deleteRepositoryEntryAndBasesecurity(entry);
-
-		logDebug("deleteRepositoryEntry Done");
-		return true;
-	}
-	
-	/**
-	 * 
-	 * @param addedEntry
-	 */
-	public void deleteRepositoryEntryAndBasesecurity(RepositoryEntry entry) {
-		RepositoryEntry reloadedEntry = dbInstance.getCurrentEntityManager()
-				.getReference(RepositoryEntry.class, entry.getKey());
-		
-		Group defaultGroup = repositoryEntryRelationDao.getDefaultGroup(reloadedEntry);
-		groupDao.removeMemberships(defaultGroup);
-		repositoryEntryRelationDao.removeRelations(reloadedEntry);
-		groupDao.removeGroup(defaultGroup);
-		dbInstance.getCurrentEntityManager().remove(reloadedEntry);
-
-		dbInstance.commit();
-
-		deleteImage(entry);
-	}
 	
 	/**
 	 * Lookup repo entry by key.
diff --git a/src/main/java/org/olat/repository/RepositoryService.java b/src/main/java/org/olat/repository/RepositoryService.java
index 5a3b774d3dd1b135231330e01720dbd9103b27bb..00dd30185a933826274f86e53f3c36abc0110bfe 100644
--- a/src/main/java/org/olat/repository/RepositoryService.java
+++ b/src/main/java/org/olat/repository/RepositoryService.java
@@ -20,10 +20,12 @@
 package org.olat.repository;
 
 import java.util.List;
+import java.util.Locale;
 
 import org.olat.basesecurity.Group;
 import org.olat.basesecurity.IdentityRef;
 import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.repository.model.SearchAuthorRepositoryEntryViewParams;
 import org.olat.repository.model.SearchMyRepositoryEntryViewParams;
@@ -57,6 +59,22 @@ public interface RepositoryService {
 	
 	public RepositoryEntry update(RepositoryEntry re);
 	
+	/**
+	 * Delete the learning resource with all its attached resources.
+	 * @param entry
+	 * @param identity
+	 * @param roles
+	 * @param locale
+	 * @return
+	 */
+	public ErrorList delete(RepositoryEntry entry, Identity identity, Roles roles, Locale locale);
+	
+	/**
+	 * Delete only the database object
+	 * @param entry
+	 */
+	public void deleteRepositoryEntryAndBaseGroups(RepositoryEntry entry);
+	
 
 	public void incrementLaunchCounter(RepositoryEntry re);
 	
diff --git a/src/main/java/org/olat/repository/delete/service/RepositoryDeletionManager.java b/src/main/java/org/olat/repository/delete/service/RepositoryDeletionManager.java
index ae50ad7a7241e895f8a46f98de67f4ab0fc20aac..5ee02fc14a40e31fb6e6991b8843b4fc27eaa2a0 100644
--- a/src/main/java/org/olat/repository/delete/service/RepositoryDeletionManager.java
+++ b/src/main/java/org/olat/repository/delete/service/RepositoryDeletionManager.java
@@ -52,6 +52,7 @@ import org.olat.core.util.mail.MailTemplate;
 import org.olat.core.util.mail.MailerResult;
 import org.olat.properties.Property;
 import org.olat.properties.PropertyManager;
+import org.olat.repository.ErrorList;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
 import org.olat.repository.RepositoryService;
@@ -392,7 +393,10 @@ public class RepositoryDeletionManager extends BasicManager implements UserDataD
 			}
 			String archiveFileName = repositoryHandler.archive(ureq.getIdentity(), getArchivFilePath(), repositoryEntry);
 			logAudit("Repository-Deletion: archived repositoryEntry=" + repositoryEntry + " , archive-file-name=" + archiveFileName);
-			RepositoryManager.getInstance().deleteRepositoryEntryWithAllData( ureq, wControl, repositoryEntry );
+			ErrorList errors = repositoryService.delete(repositoryEntry, ureq.getIdentity(), ureq.getUserSession().getRoles(), ureq.getLocale());
+			if(errors.hasErrors()) {
+				wControl.setError(errors.getFirstError());
+			}
 			LifeCycleManager.createInstanceFor(repositoryEntry).deleteTimestampFor(SEND_DELETE_EMAIL_ACTION);
 			LifeCycleManager.createInstanceFor(repositoryEntry).markTimestampFor(REPOSITORY_DELETED_ACTION, createLifeCycleLogDataFor(repositoryEntry));
 			logAudit("Repository-Deletion: deleted repositoryEntry=" + repositoryEntry);
diff --git a/src/main/java/org/olat/repository/handlers/BlogHandler.java b/src/main/java/org/olat/repository/handlers/BlogHandler.java
index cf4dc28d42d52b79fa048217ee5b944a2a2d07aa..f858c09c004195099ff42e5ac93297550ad82011 100644
--- a/src/main/java/org/olat/repository/handlers/BlogHandler.java
+++ b/src/main/java/org/olat/repository/handlers/BlogHandler.java
@@ -35,6 +35,7 @@ import org.olat.core.gui.media.MediaResource;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
+import org.olat.core.id.Roles;
 import org.olat.core.logging.AssertException;
 import org.olat.core.util.Util;
 import org.olat.core.util.coordinate.CoordinatorManager;
@@ -51,6 +52,7 @@ import org.olat.modules.webFeed.FeedSecurityCallback;
 import org.olat.modules.webFeed.managers.FeedManager;
 import org.olat.modules.webFeed.ui.FeedMainController;
 import org.olat.modules.webFeed.ui.blog.BlogUIFactory;
+import org.olat.repository.ErrorList;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
 import org.olat.repository.RepositoryService;
@@ -201,12 +203,12 @@ public class BlogHandler implements RepositoryHandler {
 	}
 
 	@Override
-	public boolean readyToDelete(OLATResourceable res, UserRequest ureq, WindowControl wControl) {
+	public boolean readyToDelete(OLATResourceable res, Identity identity, Roles roles, Locale locale, ErrorList errors) {
 		ReferenceManager refM = ReferenceManager.getInstance();
-		String referencesSummary = refM.getReferencesToSummary(res, ureq.getLocale());
+		String referencesSummary = refM.getReferencesToSummary(res, locale);
 		if (referencesSummary != null) {
-			Translator translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale());
-			wControl.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary }));
+			Translator translator = Util.createPackageTranslator(RepositoryManager.class, locale);
+			errors.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary }));
 			return false;
 		}
 		return true;
diff --git a/src/main/java/org/olat/repository/handlers/CourseHandler.java b/src/main/java/org/olat/repository/handlers/CourseHandler.java
index c3cd587e3f000afc2a9411ac468a35a3c1f02387..a40fc06943e38f1b618fea27a5c97a27ebf6ee2a 100644
--- a/src/main/java/org/olat/repository/handlers/CourseHandler.java
+++ b/src/main/java/org/olat/repository/handlers/CourseHandler.java
@@ -53,6 +53,7 @@ import org.olat.core.gui.translator.Translator;
 import org.olat.core.helpers.Settings;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
+import org.olat.core.id.Roles;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.CodeHelper;
@@ -100,6 +101,7 @@ import org.olat.modules.sharedfolder.SharedFolderManager;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryImportExport;
 import org.olat.repository.RepositoryEntryImportExport.RepositoryEntryImport;
+import org.olat.repository.ErrorList;
 import org.olat.repository.RepositoryEntryManagedFlag;
 import org.olat.repository.RepositoryManager;
 import org.olat.repository.RepositoryService;
@@ -539,19 +541,19 @@ public class CourseHandler implements RepositoryHandler {
 		//archiving is done within readyToDelete		
 		CourseFactory.deleteCourse(res);
 		// delete resourceable
-		OLATResourceManager rm = OLATResourceManager.getInstance();
-		OLATResource ores = rm.findResourceable(res);
-		rm.deleteOLATResource(ores);
+		//OLATResourceManager rm = OLATResourceManager.getInstance();
+		//OLATResource ores = rm.findResourceable(res);
+		//rm.deleteOLATResource(ores);
 		return true;
 	}
 
 	@Override
-	public boolean readyToDelete(OLATResourceable res, UserRequest ureq, WindowControl wControl) {
+	public boolean readyToDelete(OLATResourceable res, Identity identity, Roles roles, Locale locale, ErrorList errors) {
 		ReferenceManager refM = ReferenceManager.getInstance();
-		String referencesSummary = refM.getReferencesToSummary(res, ureq.getLocale());
+		String referencesSummary = refM.getReferencesToSummary(res, locale);
 		if (referencesSummary != null) {
-			Translator translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale());
-			wControl.setError(translator.translate("details.delete.error.references",
+			Translator translator = Util.createPackageTranslator(RepositoryManager.class, locale);
+			errors.setError(translator.translate("details.delete.error.references",
 					new String[] { referencesSummary }));
 			return false;
 		}
@@ -559,9 +561,9 @@ public class CourseHandler implements RepositoryHandler {
 		 * make an archive of the course nodes with valuable data
 		 */
 		UserManager um = UserManager.getInstance();
-		String charset = um.getUserCharset(ureq.getIdentity());
+		String charset = um.getUserCharset(identity);
 		try {
-			CourseFactory.archiveCourse(res,charset, ureq.getLocale(), ureq.getIdentity(), ureq.getUserSession().getRoles());
+			CourseFactory.archiveCourse(res,charset, locale, identity, roles);
 		} catch (CorruptedCourseException e) {
 			log.error("The course is corrupted, cannot archive it: " + res, e);
 		}
diff --git a/src/main/java/org/olat/repository/handlers/FileHandler.java b/src/main/java/org/olat/repository/handlers/FileHandler.java
index e5eccb7ab150907b80a86e46f8a7bbf421ea37b6..473684a263b239a613a47045c0c6353b199aebb7 100644
--- a/src/main/java/org/olat/repository/handlers/FileHandler.java
+++ b/src/main/java/org/olat/repository/handlers/FileHandler.java
@@ -26,6 +26,7 @@
 package org.olat.repository.handlers;
 
 import java.io.File;
+import java.util.Locale;
 
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.Controller;
@@ -34,12 +35,14 @@ import org.olat.core.gui.media.MediaResource;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
+import org.olat.core.id.Roles;
 import org.olat.core.util.Util;
 import org.olat.core.util.ZipUtil;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.resource.OLATResourceableJustBeforeDeletedEvent;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.fileresource.FileResourceManager;
+import org.olat.repository.ErrorList;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
 import org.olat.resource.references.ReferenceManager;
@@ -80,11 +83,11 @@ public abstract class FileHandler implements RepositoryHandler {
 	}
 
 	@Override
-	public boolean readyToDelete(OLATResourceable res, UserRequest ureq, WindowControl wControl) {
-		String referencesSummary = ReferenceManager.getInstance().getReferencesToSummary(res, ureq.getLocale());
+	public boolean readyToDelete(OLATResourceable res, Identity identity, Roles roles, Locale locale, ErrorList errors) {
+		String referencesSummary = ReferenceManager.getInstance().getReferencesToSummary(res, locale);
 		if (referencesSummary != null) {
-			Translator translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale());
-			wControl.setError(translator.translate("details.delete.error.references",
+			Translator translator = Util.createPackageTranslator(RepositoryManager.class, locale);
+			errors.setError(translator.translate("details.delete.error.references",
 					new String[] { referencesSummary }));
 			return false;
 		}
diff --git a/src/main/java/org/olat/repository/handlers/GlossaryHandler.java b/src/main/java/org/olat/repository/handlers/GlossaryHandler.java
index 77fe9c006d497d05a435d769236ab76ad51224fd..ce352cd0500eef242d861069d040728c6eee0305 100644
--- a/src/main/java/org/olat/repository/handlers/GlossaryHandler.java
+++ b/src/main/java/org/olat/repository/handlers/GlossaryHandler.java
@@ -46,6 +46,7 @@ import org.olat.core.gui.media.MediaResource;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
+import org.olat.core.id.Roles;
 import org.olat.core.logging.AssertException;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.Util;
@@ -60,6 +61,7 @@ import org.olat.fileresource.types.ResourceEvaluation;
 import org.olat.modules.glossary.GlossaryEditSettingsController;
 import org.olat.modules.glossary.GlossaryManager;
 import org.olat.modules.glossary.GlossaryRegisterSettingsController;
+import org.olat.repository.ErrorList;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
 import org.olat.repository.RepositoryService;
@@ -254,12 +256,12 @@ public class GlossaryHandler implements RepositoryHandler {
 	}
 
 	@Override
-	public boolean readyToDelete(OLATResourceable res, UserRequest ureq, WindowControl wControl) {
+	public boolean readyToDelete(OLATResourceable res, Identity identity, Roles roles, Locale locale, ErrorList errors) {
 		ReferenceManager refM = ReferenceManager.getInstance();
-		String referencesSummary = refM.getReferencesToSummary(res, ureq.getLocale());
+		String referencesSummary = refM.getReferencesToSummary(res, locale);
 		if (referencesSummary != null) {
-			Translator translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale());
-			wControl.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary }));
+			Translator translator = Util.createPackageTranslator(RepositoryManager.class, locale);
+			errors.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary }));
 			return false;
 		}
 		return true;
diff --git a/src/main/java/org/olat/repository/handlers/PodcastHandler.java b/src/main/java/org/olat/repository/handlers/PodcastHandler.java
index 6d16ed2aaede6705007bccdc2331ec46ca9b8222..681ea318b93847b4eea3e37a8a93547e0ddeff27 100644
--- a/src/main/java/org/olat/repository/handlers/PodcastHandler.java
+++ b/src/main/java/org/olat/repository/handlers/PodcastHandler.java
@@ -35,6 +35,7 @@ import org.olat.core.gui.media.MediaResource;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
+import org.olat.core.id.Roles;
 import org.olat.core.logging.AssertException;
 import org.olat.core.util.Util;
 import org.olat.core.util.coordinate.CoordinatorManager;
@@ -51,6 +52,7 @@ import org.olat.modules.webFeed.FeedSecurityCallback;
 import org.olat.modules.webFeed.managers.FeedManager;
 import org.olat.modules.webFeed.ui.FeedMainController;
 import org.olat.modules.webFeed.ui.podcast.PodcastUIFactory;
+import org.olat.repository.ErrorList;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
 import org.olat.repository.RepositoryService;
@@ -199,12 +201,12 @@ public class PodcastHandler implements RepositoryHandler {
 	}
 
 	@Override
-	public boolean readyToDelete(OLATResourceable res, UserRequest ureq, WindowControl wControl) {
+	public boolean readyToDelete(OLATResourceable res, Identity identity, Roles roles, Locale locale, ErrorList errors) {
 		ReferenceManager refM = ReferenceManager.getInstance();
-		String referencesSummary = refM.getReferencesToSummary(res, ureq.getLocale());
+		String referencesSummary = refM.getReferencesToSummary(res, locale);
 		if (referencesSummary != null) {
-			Translator translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale());
-			wControl.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary }));
+			Translator translator = Util.createPackageTranslator(RepositoryManager.class, locale);
+			errors.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary }));
 			return false;
 		}
 		return true;
diff --git a/src/main/java/org/olat/repository/handlers/PortfolioHandler.java b/src/main/java/org/olat/repository/handlers/PortfolioHandler.java
index a53ebe784141cb7cb8ee7e8d2917632e1a24af16..3a2e4cea3474661b7973a723798a001dabf51034 100644
--- a/src/main/java/org/olat/repository/handlers/PortfolioHandler.java
+++ b/src/main/java/org/olat/repository/handlers/PortfolioHandler.java
@@ -37,6 +37,7 @@ import org.olat.core.gui.media.MediaResource;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
+import org.olat.core.id.Roles;
 import org.olat.core.logging.AssertException;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
@@ -58,6 +59,7 @@ import org.olat.portfolio.model.structel.EPStructuredMapTemplate;
 import org.olat.portfolio.model.structel.PortfolioStructure;
 import org.olat.portfolio.model.structel.PortfolioStructureMap;
 import org.olat.portfolio.ui.structel.EPCreateMapController;
+import org.olat.repository.ErrorList;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
 import org.olat.repository.RepositoryService;
@@ -185,7 +187,7 @@ public class PortfolioHandler implements RepositoryHandler {
 	}
 
 	@Override
-	public boolean readyToDelete(OLATResourceable res, UserRequest ureq, WindowControl wControl) {
+	public boolean readyToDelete(OLATResourceable res, Identity identity, Roles roles, Locale locale, ErrorList errors) {
 		EPFrontendManager ePFMgr = (EPFrontendManager) CoreSpringFactory.getBean("epFrontendManager");
 		PortfolioStructure map = ePFMgr.loadPortfolioStructure(res);
 		if(map != null) {
@@ -197,10 +199,10 @@ public class PortfolioHandler implements RepositoryHandler {
 			if (ePFMgr.isTemplateInUse(exercise, null, null, null)) return false;
 		}
 		ReferenceManager refM = ReferenceManager.getInstance();
-		String referencesSummary = refM.getReferencesToSummary(res, ureq.getLocale());
+		String referencesSummary = refM.getReferencesToSummary(res, locale);
 		if (referencesSummary != null) {
-			Translator translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale());
-			wControl.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary }));
+			Translator translator = Util.createPackageTranslator(RepositoryManager.class, locale);
+			errors.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary }));
 			return false;
 		}		
 		return true;
diff --git a/src/main/java/org/olat/repository/handlers/RepositoryHandler.java b/src/main/java/org/olat/repository/handlers/RepositoryHandler.java
index 2c738a5ead51b77425a1d91b1d1de8bcaaaa8879..054ed7e69b4344c56040cc1edb03de48c58fe3c2 100644
--- a/src/main/java/org/olat/repository/handlers/RepositoryHandler.java
+++ b/src/main/java/org/olat/repository/handlers/RepositoryHandler.java
@@ -36,9 +36,11 @@ import org.olat.core.gui.control.generic.wizard.StepsMainRunController;
 import org.olat.core.gui.media.MediaResource;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
+import org.olat.core.id.Roles;
 import org.olat.core.util.coordinate.LockResult;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.fileresource.types.ResourceEvaluation;
+import org.olat.repository.ErrorList;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.controllers.WizardCloseResourceController;
 import org.olat.repository.ui.author.AuthoringEditEntrySettingsController;
@@ -200,19 +202,13 @@ public interface RepositoryHandler {
 	 * from the repository. Return status wether to proceed with the delete action. If
 	 * this method returns false, the entry will not be deleted.
 	 * @param res
-	 * @param ureq
-	 * @param wControl
+	 * @param identity
+	 * @param roles TODO
+	 * @param locale TODO
+	 * @param errors
 	 * @return true if ressource is ready to delete, false if not.
 	 */
-	public boolean readyToDelete(OLATResourceable res, UserRequest ureq, WindowControl wControl);
-
-	/**
-	 * Create a copy of the given resourceable.
-	 * @param res
-	 * @param ureq
-	 * @return Copy of given resourceable.
-	 */
-	//public OLATResourceable createCopy(OLATResourceable res, UserRequest ureq);
+	public boolean readyToDelete(OLATResourceable res, Identity identity, Roles roles, Locale locale, ErrorList errors);
 	
 	/**
 	 * If a handler likes to provied any details on a resourceable in the repository's details
diff --git a/src/main/java/org/olat/repository/handlers/SharedFolderHandler.java b/src/main/java/org/olat/repository/handlers/SharedFolderHandler.java
index 88d377645012def186f6b174553b6b1db95f6432..4b26b129966c6731463b8730cd33a8a17a6f78d5 100644
--- a/src/main/java/org/olat/repository/handlers/SharedFolderHandler.java
+++ b/src/main/java/org/olat/repository/handlers/SharedFolderHandler.java
@@ -55,6 +55,7 @@ import org.olat.fileresource.types.SharedFolderFileResource;
 import org.olat.modules.sharedfolder.SharedFolderDisplayController;
 import org.olat.modules.sharedfolder.SharedFolderEditorController;
 import org.olat.modules.sharedfolder.SharedFolderManager;
+import org.olat.repository.ErrorList;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
 import org.olat.repository.RepositoryService;
@@ -228,12 +229,12 @@ public class SharedFolderHandler implements RepositoryHandler {
 	}
 
 	@Override
-	public boolean readyToDelete(OLATResourceable res, UserRequest ureq, WindowControl wControl) {
+	public boolean readyToDelete(OLATResourceable res, Identity identity, Roles roles, Locale locale, ErrorList errors) {
 		ReferenceManager refM = ReferenceManager.getInstance();
-		String referencesSummary = refM.getReferencesToSummary(res, ureq.getLocale());
+		String referencesSummary = refM.getReferencesToSummary(res, locale);
 		if (referencesSummary != null) {
-			Translator translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale());
-			wControl.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary }));
+			Translator translator = Util.createPackageTranslator(RepositoryManager.class, locale);
+			errors.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary }));
 			return false;
 		}
 		return true;
diff --git a/src/main/java/org/olat/repository/handlers/WikiHandler.java b/src/main/java/org/olat/repository/handlers/WikiHandler.java
index c15687cd5f1b49e14d07ce11ed644998a8922481..82d940794e54ad51df25efe8f2bf602f33af0784 100644
--- a/src/main/java/org/olat/repository/handlers/WikiHandler.java
+++ b/src/main/java/org/olat/repository/handlers/WikiHandler.java
@@ -48,6 +48,7 @@ import org.olat.core.gui.media.MediaResource;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
+import org.olat.core.id.Roles;
 import org.olat.core.id.context.BusinessControl;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.logging.AssertException;
@@ -74,6 +75,7 @@ import org.olat.modules.wiki.WikiPage;
 import org.olat.modules.wiki.WikiSecurityCallback;
 import org.olat.modules.wiki.WikiSecurityCallbackImpl;
 import org.olat.modules.wiki.WikiToZipUtils;
+import org.olat.repository.ErrorList;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
 import org.olat.repository.RepositoryService;
@@ -293,12 +295,12 @@ public class WikiHandler implements RepositoryHandler {
 	}
 
 	@Override
-	public boolean readyToDelete(OLATResourceable res, UserRequest ureq, WindowControl wControl) {
+	public boolean readyToDelete(OLATResourceable res, Identity identity, Roles roles, Locale locale, ErrorList errors) {
 		ReferenceManager refM = ReferenceManager.getInstance();
-		String referencesSummary = refM.getReferencesToSummary(res, ureq.getLocale());
+		String referencesSummary = refM.getReferencesToSummary(res, locale);
 		if (referencesSummary != null) {
-			Translator translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale());
-			wControl.setError(translator.translate("details.delete.error.references",
+			Translator translator = Util.createPackageTranslator(RepositoryManager.class, locale);
+			errors.setError(translator.translate("details.delete.error.references",
 					new String[] { referencesSummary }));
 			return false;
 		}
diff --git a/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java b/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java
index bdbf22289c8ce45e49c7381e7f27ac7abbaba035..117431ef6642c2af3b650a5f66ef961339dce002 100644
--- a/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java
+++ b/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java
@@ -266,13 +266,10 @@ public class RepositoryEntryRelationDAO {
 			.setParameter("repoKey", re.getKey())
 			.setParameter("groupKey", group.getKey())
 			.getResultList();
-		
+
 		for(RepositoryEntryToGroupRelation rel:rels) {
 			em.remove(rel);
 		}
-		if(re instanceof RepositoryEntry) {
-			((RepositoryEntry)re).getGroups().removeAll(rels);
-		}
 		return rels.size();
 	}
 	
@@ -285,13 +282,9 @@ public class RepositoryEntryRelationDAO {
 		List<RepositoryEntryToGroupRelation> rels = em.createQuery(sb.toString(), RepositoryEntryToGroupRelation.class)
 			.setParameter("repoKey", re.getKey())
 			.getResultList();
-		
 		for(RepositoryEntryToGroupRelation rel:rels) {
 			em.remove(rel);
 		}
-		if(re instanceof RepositoryEntry) {
-			((RepositoryEntry)re).getGroups().removeAll(rels);
-		}
 		return rels.size();
 	}
 
diff --git a/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java b/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
index 6af011a6719c3a804aebad268b0a507e1186cc27..e35505e0a729b5c74c2fb1e5166d217aec67788e 100644
--- a/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
+++ b/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
@@ -23,6 +23,7 @@ import java.io.File;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Locale;
 import java.util.Set;
 
 import org.olat.basesecurity.BaseSecurity;
@@ -30,10 +31,16 @@ import org.olat.basesecurity.Group;
 import org.olat.basesecurity.GroupRoles;
 import org.olat.basesecurity.IdentityRef;
 import org.olat.basesecurity.manager.GroupDAO;
+import org.olat.catalog.CatalogManager;
+import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.modules.bc.FolderConfig;
 import org.olat.core.commons.persistence.DB;
+import org.olat.core.commons.services.mark.MarkManager;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
+import org.olat.core.id.Roles;
+import org.olat.core.logging.OLog;
+import org.olat.core.logging.Tracing;
 import org.olat.core.util.CodeHelper;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.resource.OresHelper;
@@ -41,6 +48,8 @@ import org.olat.core.util.vfs.LocalFolderImpl;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
 import org.olat.core.util.vfs.VFSLeaf;
+import org.olat.course.assessment.manager.UserCourseInformationsManager;
+import org.olat.repository.ErrorList;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryAuthorView;
 import org.olat.repository.RepositoryEntryMyView;
@@ -68,6 +77,8 @@ import org.springframework.stereotype.Service;
  */
 @Service("repositoryService")
 public class RepositoryServiceImpl implements RepositoryService {
+	
+	private static final OLog log = Tracing.createLoggerFor(RepositoryServiceImpl.class);
 
 	@Autowired
 	private DB dbInstance;
@@ -87,6 +98,8 @@ public class RepositoryServiceImpl implements RepositoryService {
 	private RepositoryEntryAuthorQueries authorViewQueries;
 	@Autowired
 	private OLATResourceManager resourceManager;
+	@Autowired
+	private UserCourseInformationsManager userCourseInformationsManager;
 
 	@Autowired
 	private LifeFullIndexer lifeIndexer;
@@ -210,6 +223,66 @@ public class RepositoryServiceImpl implements RepositoryService {
 		}
 		return null;
 	}
+	
+	public ErrorList delete(RepositoryEntry entry, Identity identity, Roles roles, Locale locale) {
+		ErrorList errors = new ErrorList();
+		
+		boolean debug = log.isDebug();
+
+		// invoke handler delete callback
+		if(debug) log.debug("deleteRepositoryEntry start entry=" + entry);
+		entry = (RepositoryEntry) dbInstance.loadObject(entry,true);
+		if(debug) log.debug("deleteRepositoryEntry after load entry=" + entry);
+		RepositoryHandler handler = RepositoryHandlerFactory.getInstance().getRepositoryHandler(entry);
+		OLATResource resource = entry.getOlatResource();
+		//delete old context
+		if (!handler.readyToDelete(resource, identity, roles, locale, errors)) {
+			return errors;
+		}
+
+		// start transaction
+		// delete entry picture
+		
+		userCourseInformationsManager.deleteUserCourseInformations(entry);
+		
+		// delete all bookmarks referencing deleted entry
+		CoreSpringFactory.getImpl(MarkManager.class).deleteMarks(entry);
+		// delete all catalog entries referencing deleted entry
+		CatalogManager.getInstance().resourceableDeleted(entry);
+		
+		//delete all policies
+		securityManager.deletePolicies(resource);
+		
+		// inform handler to do any cleanup work... handler must delete the
+		// referenced resourceable a swell.
+		handler.cleanupOnDelete(resource);
+		
+		dbInstance.commit();
+
+		if(debug) log.debug("deleteRepositoryEntry after reload entry=" + entry);
+		deleteRepositoryEntryAndBaseGroups(entry);
+
+		if(debug) log.debug("deleteRepositoryEntry Done");
+		return errors;
+	}
+	
+	/**
+	 * 
+	 * @param entry
+	 */
+	@Override
+	public void deleteRepositoryEntryAndBaseGroups(RepositoryEntry entry) {
+		RepositoryEntry reloadedEntry = dbInstance.getCurrentEntityManager()
+				.getReference(RepositoryEntry.class, entry.getKey());
+		
+		Group defaultGroup = reToGroupDao.getDefaultGroup(reloadedEntry);
+		groupDao.removeMemberships(defaultGroup);
+		reToGroupDao.removeRelations(reloadedEntry);
+		dbInstance.commit();
+		dbInstance.getCurrentEntityManager().remove(reloadedEntry);
+		groupDao.removeGroup(defaultGroup);
+		dbInstance.commit();
+	}
 
 	@Override
 	public void incrementLaunchCounter(RepositoryEntry re) {
diff --git a/src/main/java/org/olat/repository/ui/author/AuthoringEntryDetailsController.java b/src/main/java/org/olat/repository/ui/author/AuthoringEntryDetailsController.java
index 4db3b6665d4abe2eb71f945f5127949689f61c30..1f0638872e358f3156ebefb83e30252c98942f42 100644
--- a/src/main/java/org/olat/repository/ui/author/AuthoringEntryDetailsController.java
+++ b/src/main/java/org/olat/repository/ui/author/AuthoringEntryDetailsController.java
@@ -71,6 +71,7 @@ import org.olat.course.run.RunMainController;
 import org.olat.group.BusinessGroup;
 import org.olat.group.BusinessGroupService;
 import org.olat.group.model.SearchBusinessGroupParams;
+import org.olat.repository.ErrorList;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryManagedFlag;
 import org.olat.repository.RepositoryEntryRef;
@@ -97,6 +98,7 @@ import org.olat.resource.accesscontrol.ui.PriceFormat;
 import org.olat.user.UserManager;
 import org.springframework.beans.factory.annotation.Autowired;
 
+
 /**
  * 
  * Initial date: 29.04.2014<br>
@@ -483,7 +485,7 @@ public class AuthoringEntryDetailsController extends RepositoryEntryDetailsContr
 			}
 		} else if (deleteDialogCtrl == source){
 			if (DialogBoxUIFactory.isYesEvent(event)){
-				deleteRepositoryEntry(ureq, getWindowControl());
+				deleteRepositoryEntry(ureq);
 			}	
 		} else if(copyCtrl == source) {
 			cmc.deactivate();
@@ -688,12 +690,14 @@ public class AuthoringEntryDetailsController extends RepositoryEntryDetailsContr
 		listenTo(catalogCtlr);
 	}
 	
-	private void deleteRepositoryEntry(UserRequest ureq, WindowControl wControl) {
-		if (RepositoryManager.getInstance().deleteRepositoryEntryWithAllData( ureq, wControl, entry) ) {
+	private void deleteRepositoryEntry(UserRequest ureq) {
+		Roles roles = ureq.getUserSession().getRoles();
+		ErrorList errors = repositoryService.delete(entry, getIdentity(), roles, getLocale());
+		if (errors.hasErrors()) {
+			showInfo("info.could.not.delete.entry");
+		} else {
 			fireEvent(ureq, new EntryChangedEvent(entry, EntryChangedEvent.DELETED));
 			showInfo("info.entry.deleted");
-		} else {
-			showInfo("info.could.not.delete.entry");
 		}
 	}
 }
diff --git a/src/main/java/org/olat/restapi/repository/RepositoryEntryResource.java b/src/main/java/org/olat/restapi/repository/RepositoryEntryResource.java
index 9c14e940856285e3ea7c7a82419e883a22ea999e..a9c0f480604795cd24f2c85ec4892119f03da8ca 100644
--- a/src/main/java/org/olat/restapi/repository/RepositoryEntryResource.java
+++ b/src/main/java/org/olat/restapi/repository/RepositoryEntryResource.java
@@ -65,6 +65,7 @@ import org.olat.core.util.FileUtils;
 import org.olat.core.util.coordinate.LockResult;
 import org.olat.fileresource.FileResourceManager;
 import org.olat.fileresource.types.ImsCPFileResource;
+import org.olat.repository.ErrorList;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
 import org.olat.repository.RepositoryService;
@@ -75,7 +76,6 @@ import org.olat.repository.model.RepositoryEntryLifecycle;
 import org.olat.resource.OLATResource;
 import org.olat.resource.OLATResourceManager;
 import org.olat.restapi.security.RestSecurityHelper;
-import org.olat.restapi.support.ErrorWindowControl;
 import org.olat.restapi.support.MultipartReader;
 import org.olat.restapi.support.ObjectFactory;
 import org.olat.restapi.support.vo.RepositoryEntryLifecycleVO;
@@ -670,8 +670,11 @@ public class RepositoryEntryResource {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 		UserRequest ureq = getUserRequest(request);
-		ErrorWindowControl error = new ErrorWindowControl();
-		repositoryManager.deleteRepositoryEntryWithAllData(ureq, error, re);
+		RepositoryService rs = CoreSpringFactory.getImpl(RepositoryService.class);
+		ErrorList errors = rs.delete(re, ureq.getIdentity(), ureq.getUserSession().getRoles(), ureq.getLocale());
+		if(errors.hasErrors()) {
+			return Response.serverError().status(500).build();
+		}
 		return Response.ok().build();
 	}
 	
diff --git a/src/main/java/org/olat/restapi/repository/course/CourseWebService.java b/src/main/java/org/olat/restapi/repository/course/CourseWebService.java
index 3f453cc533251d7551e0aa172c60eb8f630fbd42..d1b0532bc7bfc0bd5e11ad9ba35c23873d114d5b 100644
--- a/src/main/java/org/olat/restapi/repository/course/CourseWebService.java
+++ b/src/main/java/org/olat/restapi/repository/course/CourseWebService.java
@@ -71,6 +71,7 @@ import org.olat.course.CourseFactory;
 import org.olat.course.ICourse;
 import org.olat.course.config.CourseConfig;
 import org.olat.course.nodes.cal.CourseCalendars;
+import org.olat.repository.ErrorList;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
 import org.olat.repository.RepositoryService;
@@ -81,7 +82,6 @@ import org.olat.resource.OLATResourceManager;
 import org.olat.resource.accesscontrol.ACService;
 import org.olat.resource.accesscontrol.AccessResult;
 import org.olat.restapi.security.RestSecurityHelper;
-import org.olat.restapi.support.ErrorWindowControl;
 import org.olat.restapi.support.ObjectFactory;
 import org.olat.restapi.support.vo.CourseConfigVO;
 import org.olat.restapi.support.vo.CourseVO;
@@ -287,10 +287,14 @@ public class CourseWebService {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 		UserRequest ureq = getUserRequest(request);
-		ErrorWindowControl error = new ErrorWindowControl();
 		RepositoryManager rm = RepositoryManager.getInstance();
+		RepositoryService rs = CoreSpringFactory.getImpl(RepositoryService.class);
 		RepositoryEntry re = rm.lookupRepositoryEntry(course, true);
-		rm.deleteRepositoryEntryWithAllData(ureq, error, re);
+		
+		ErrorList errors = rs.delete(re, ureq.getIdentity(), ureq.getUserSession().getRoles(), ureq.getLocale());
+		if(errors.hasErrors()) {
+			return Response.serverError().status(500).build();
+		}
 		return Response.ok().build();
 	}
 	
diff --git a/src/test/java/org/olat/repository/manager/RepositoryServiceImplTest.java b/src/test/java/org/olat/repository/manager/RepositoryServiceImplTest.java
index f9a241c8c0e804ea9ce53ffa8fb56527aff8ec34..a76aa4ae6e87223e5cc7f510debe628f60663247 100644
--- a/src/test/java/org/olat/repository/manager/RepositoryServiceImplTest.java
+++ b/src/test/java/org/olat/repository/manager/RepositoryServiceImplTest.java
@@ -19,10 +19,14 @@
  */
 package org.olat.repository.manager;
 
+import java.util.Locale;
+
 import org.junit.Assert;
 import org.junit.Test;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
+import org.olat.repository.ErrorList;
 import org.olat.repository.RepositoryEntry;
 import org.olat.test.JunitTestHelper;
 import org.olat.test.OlatTestCase;
@@ -86,7 +90,18 @@ public class RepositoryServiceImplTest extends OlatTestCase {
 		Assert.assertEquals(0, re.getAccess());
 	}
 	
-
+	@Test
+	public void deleteCourse() {
+		Identity initialAuthor = JunitTestHelper.createAndPersistIdentityAsRndUser("auth-del-1");
+		RepositoryEntry re = JunitTestHelper.deployDemoCourse(initialAuthor);
+		dbInstance.commitAndCloseSession();
+		
+		Roles roles = new Roles(false, false, false, true, false, false, false);
+		ErrorList errors = repositoryService.delete(re, initialAuthor, roles, Locale.ENGLISH);
+		Assert.assertNotNull(errors);
+		Assert.assertFalse(errors.hasErrors());
+	}
+	
 	
 
 }
diff --git a/src/test/profile/mysql/olat.eclipse.properties b/src/test/profile/mysql/olat.eclipse.properties
index c14b342cc1dfd998dccdc1e03c446a07cb519a22..680947553cad6102a7c4cf6bca612e4baa76e0bc 100644
--- a/src/test/profile/mysql/olat.eclipse.properties
+++ b/src/test/profile/mysql/olat.eclipse.properties
@@ -47,6 +47,7 @@ db.name=olattest
 db.user=olat
 db.pass=olat
 db.host.port=3306
+db.show_sql=true
 db.database.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
 auto.upgrade.database=false
 db.hibernate.c3p0.debugUnreturnedConnectionStackTraces=true