diff --git a/src/main/java/org/olat/admin/user/delete/service/UserDeletionManager.java b/src/main/java/org/olat/admin/user/delete/service/UserDeletionManager.java
index a261b2f8442dd2ed1a68fd29f9a9aee154c42c3e..914715f89d6a97fc08146795531e1c6d497adf8a 100644
--- a/src/main/java/org/olat/admin/user/delete/service/UserDeletionManager.java
+++ b/src/main/java/org/olat/admin/user/delete/service/UserDeletionManager.java
@@ -28,7 +28,9 @@ package org.olat.admin.user.delete.service;
 import java.io.File;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.Comparator;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
@@ -39,12 +41,12 @@ import javax.persistence.TemporalType;
 import org.olat.admin.user.delete.SelectionController;
 import org.olat.basesecurity.Authentication;
 import org.olat.basesecurity.BaseSecurity;
-import org.olat.basesecurity.BaseSecurityManager;
 import org.olat.basesecurity.IdentityImpl;
 import org.olat.basesecurity.SecurityGroup;
 import org.olat.basesecurity.manager.GroupDAO;
 import org.olat.commons.lifecycle.LifeCycleManager;
 import org.olat.core.CoreSpringFactory;
+import org.olat.core.commons.persistence.DB;
 import org.olat.core.commons.persistence.DBFactory;
 import org.olat.core.commons.persistence.DBQuery;
 import org.olat.core.gui.translator.Translator;
@@ -59,7 +61,6 @@ import org.olat.core.util.mail.MailBundle;
 import org.olat.core.util.mail.MailManager;
 import org.olat.core.util.mail.MailTemplate;
 import org.olat.core.util.mail.MailerResult;
-import org.olat.course.assessment.manager.EfficiencyStatementManager;
 import org.olat.properties.Property;
 import org.olat.properties.PropertyManager;
 import org.olat.registration.RegistrationManager;
@@ -71,6 +72,8 @@ import org.olat.user.propertyhandlers.UserPropertyHandler;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import edu.emory.mathcs.backport.java.util.Collections;
+
 
 /**
  * Manager for user-deletion.
@@ -108,6 +111,8 @@ public class UserDeletionManager extends BasicManager {
 	private MailManager mailManager;
 	@Autowired
 	private GroupDAO groupDao;
+	@Autowired
+	private DB dbInstance;
 
 	/**
 	 * [used by spring]
@@ -192,7 +197,7 @@ public class UserDeletionManager extends BasicManager {
 		sb.append("select ident from ").append(IdentityImpl.class.getName()).append(" as ident")
 		  .append(" inner join fetch ident.user as user")
 		  .append(" where ident.status=").append(Identity.STATUS_ACTIV).append(" and (ident.lastLogin = null or ident.lastLogin < :lastLogin)");	
-		List<Identity> identities = DBFactory.getInstance().getCurrentEntityManager()
+		List<Identity> identities = dbInstance.getCurrentEntityManager()
 				.createQuery(sb.toString(), Identity.class)
 				.setParameter("lastLogin", lastLoginLimit.getTime(), TemporalType.TIMESTAMP)
 				.getResultList();
@@ -261,27 +266,23 @@ public class UserDeletionManager extends BasicManager {
 		logInfo("Start deleteIdentity for identity=" + identity);
 
 		String newName = getBackupStringWithDate(identity.getName());
-		
-
-		// TODO: chg: Workaround: instances each manager which implements UaserDataDeletable interface
-		// Each manager register themself as deletable 
-		// Should be better with new config concept
-		
-		logInfo("Start EfficiencyStatementManager.archiveUserData for identity=" + identity);
-		CoreSpringFactory.getImpl(EfficiencyStatementManager.class).archiveUserData(identity, getArchivFilePath(identity) );
 
 		logInfo("Start Deleting user=" + identity);
-		Map<String,UserDataDeletable> userDataDeletableResources = CoreSpringFactory.getBeansOfType(UserDataDeletable.class);
-		for (UserDataDeletable element : userDataDeletableResources.values()) {
+		File archiveFilePath = getArchivFilePath(identity);
+		Map<String,UserDataDeletable> userDataDeletableResourcesMap = CoreSpringFactory.getBeansOfType(UserDataDeletable.class);
+		List<UserDataDeletable> userDataDeletableResources = new ArrayList<>(userDataDeletableResourcesMap.values());
+		Collections.sort(userDataDeletableResources, new UserDataDeletableComparator());
+		System.out.println("");
+		for (UserDataDeletable element : userDataDeletableResources) {
 			logInfo("UserDataDeletable-Loop element=" + element);
-			element.deleteUserData(identity, newName);
+			element.deleteUserData(identity, newName, archiveFilePath);
 		}
+		
 		// Delete all authentications for certain identity
 		List<Authentication> authentications = securityManager.getAuthentications(identity);
-		for (Iterator<Authentication> iter = authentications.iterator(); iter.hasNext();) {
-			Authentication auth = iter.next();
+		for (Authentication auth:authentications) {
 			logInfo("deleteAuthentication auth=" + auth);
-			BaseSecurityManager.getInstance().deleteAuthentication(auth);
+			securityManager.deleteAuthentication(auth);
 			logDebug("Delete auth=" + auth + "  of identity="  + identity);
 		}
 		
@@ -326,7 +327,7 @@ public class UserDeletionManager extends BasicManager {
 		UserManager.getInstance().updateUserFromIdentity(identity);
 		
 		logInfo("deleteUserProperties user=" + persistedUser);
-		DBFactory.getInstance().commit();
+		dbInstance.commit();
 		identity = securityManager.loadIdentityByKey(identity.getKey());
 		//keep email only -> change login-name
 		if (!keepUserEmailAfterDeletion) {
@@ -340,7 +341,6 @@ public class UserDeletionManager extends BasicManager {
 		LifeCycleManager.createInstanceFor(identity).deleteTimestampFor(SEND_DELETE_EMAIL_ACTION);
 		LifeCycleManager.createInstanceFor(identity).markTimestampFor(USER_DELETED_ACTION, createLifeCycleLogDataFor(identity));
 
-		// TODO: chg: ev. logAudit at another place
 		logAudit("User-Deletion: Delete all userdata for identity=" + identity);
 	}
 	
@@ -447,5 +447,13 @@ public class UserDeletionManager extends BasicManager {
 	public static boolean isKeepUserLoginAfterDeletion() {
 		return keepUserLoginAfterDeletion;
 	}
-
+	
+	public static class UserDataDeletableComparator implements Comparator<UserDataDeletable> {
+		@Override
+		public int compare(UserDataDeletable o1, UserDataDeletable o2) {
+			int p1 = o1.deleteUserDataPriority();
+			int p2 = o2.deleteUserDataPriority();
+			return -Integer.compare(p1, p2);
+		}
+	}
 }
diff --git a/src/main/java/org/olat/admin/user/delete/service/UserFileDeletionManager.java b/src/main/java/org/olat/admin/user/delete/service/UserFileDeletionManager.java
index c46bfcd0f3ebcf33f754803eab936361e493a17b..91ae05e23c15b53775a72b57f66fee9eb541bf2c 100644
--- a/src/main/java/org/olat/admin/user/delete/service/UserFileDeletionManager.java
+++ b/src/main/java/org/olat/admin/user/delete/service/UserFileDeletionManager.java
@@ -25,6 +25,8 @@
 
 package org.olat.admin.user.delete.service;
 
+import java.io.File;
+
 import org.olat.core.commons.services.taskexecutor.TaskExecutorManager;
 import org.olat.core.id.Identity;
 import org.olat.user.UserDataDeletable;
@@ -44,7 +46,7 @@ public class UserFileDeletionManager implements UserDataDeletable {
 	private TaskExecutorManager taskExecutorManager;
 
 	@Override
-	public void deleteUserData(final Identity identity, final String newDeletedUserName) {
+	public void deleteUserData(final Identity identity, final String newDeletedUserName, File archivePath) {
 		taskExecutorManager.execute(new DeleteUserDataTask(identity.getKey(), identity.getName()));
 	}
 }
diff --git a/src/main/java/org/olat/commons/calendar/manager/ICalFileCalendarUserDeleteManager.java b/src/main/java/org/olat/commons/calendar/manager/ICalFileCalendarUserDeleteManager.java
index a2b775fcf6bb6f85982bd293249c397af9dd3b25..eaf82a91bb71b806807ec083070d2e93035541ef 100644
--- a/src/main/java/org/olat/commons/calendar/manager/ICalFileCalendarUserDeleteManager.java
+++ b/src/main/java/org/olat/commons/calendar/manager/ICalFileCalendarUserDeleteManager.java
@@ -19,6 +19,8 @@
  */
 package org.olat.commons.calendar.manager;
 
+import java.io.File;
+
 import org.olat.commons.calendar.CalendarManager;
 import org.olat.core.id.Identity;
 import org.olat.core.logging.OLog;
@@ -42,7 +44,7 @@ public class ICalFileCalendarUserDeleteManager implements UserDataDeletable {
 	private CalendarManager calendarManager;
 
 	@Override
-	public void deleteUserData(Identity identity, String newDeletedUserName) {
+	public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) {
 		calendarManager.deletePersonalCalendar(identity);
 		log.debug("Personal calendar deleted for identity=" + identity);
 	}
diff --git a/src/main/java/org/olat/core/commons/services/notifications/NotificationsManager.java b/src/main/java/org/olat/core/commons/services/notifications/NotificationsManager.java
index dd08b127cf22b6a1610f87c634082ba36d467d14..0bbb0f85e874b2e33973742724df22bebb18261d 100644
--- a/src/main/java/org/olat/core/commons/services/notifications/NotificationsManager.java
+++ b/src/main/java/org/olat/core/commons/services/notifications/NotificationsManager.java
@@ -262,11 +262,6 @@ public abstract class NotificationsManager extends BasicManager {
 
 	public abstract SubscriptionInfo getNoSubscriptionInfo();
 
-	/**
-	 * Delete all subscribers for certain identity.
-	 * @param identity
-	 */
-	public abstract void deleteUserData(Identity identity, String newDeletedUserName);
 
 	/**
 	 * subscribers for ONE person (e.g. subscribed to 5 forums -> 5 subscribers
diff --git a/src/main/java/org/olat/core/commons/services/notifications/manager/NotificationsManagerImpl.java b/src/main/java/org/olat/core/commons/services/notifications/manager/NotificationsManagerImpl.java
index cf07db61650bfa40996077d8d8c4b852c2fba154..ff4c67ca9d086bfd8da2b617c66d54a57ba35e26 100644
--- a/src/main/java/org/olat/core/commons/services/notifications/manager/NotificationsManagerImpl.java
+++ b/src/main/java/org/olat/core/commons/services/notifications/manager/NotificationsManagerImpl.java
@@ -25,6 +25,7 @@
 
 package org.olat.core.commons.services.notifications.manager;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Collection;
@@ -1209,7 +1210,8 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us
 	 * Delete all subscribers for certain identity.
 	 * @param identity
 	 */
-	public void deleteUserData(Identity identity, String newDeletedUserName) {
+	@Override
+	public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) {
 		List<Subscriber> subscribers = getSubscribers(identity);
 		for (Iterator<Subscriber> iter = subscribers.iterator(); iter.hasNext();) {
 			deleteSubscriber( iter.next() );
diff --git a/src/main/java/org/olat/core/util/coordinate/DBPersistentLockManager.java b/src/main/java/org/olat/core/util/coordinate/DBPersistentLockManager.java
index 3253425cdee91a94f6645fa484b6779275d6ff41..fff5639dc5a1a03cf63095a88de614d866f289b5 100644
--- a/src/main/java/org/olat/core/util/coordinate/DBPersistentLockManager.java
+++ b/src/main/java/org/olat/core/util/coordinate/DBPersistentLockManager.java
@@ -24,6 +24,8 @@
 */
 package org.olat.core.util.coordinate;
 
+import java.io.File;
+
 import org.hibernate.type.StandardBasicTypes;
 import org.hibernate.type.Type;
 import org.olat.basesecurity.BaseSecurityManager;
@@ -51,18 +53,12 @@ public class DBPersistentLockManager implements PersistentLockManager, UserDataD
 	private static final OLog log = Tracing.createLoggerFor(DBPersistentLockManager.class);
 	private static final String CATEGORY_PERSISTENTLOCK = "o_lock";
 	
-	/**
-	 * [used by spring]
-	 * @param userDeletionManager
-	 */
-	private DBPersistentLockManager() {
-		//
-	}
 
 	/**
 	 * @see org.olat.core.util.locks.PersistentLockManager#aquirePersistentLock(org.olat.core.id.OLATResourceable,
 	 *      org.olat.core.id.Identity, java.lang.String)
 	 */
+	@Override
 	public LockResult aquirePersistentLock(OLATResourceable ores, Identity ident, String locksubkey) {
 		//synchronisation is solved in the LockManager
 		LockResult lres;
@@ -109,6 +105,7 @@ public class DBPersistentLockManager implements PersistentLockManager, UserDataD
 	/**
 	 * @see org.olat.core.util.locks.PersistentLockManager#releasePersistentLock(org.olat.core.util.locks.LockEntry)
 	 */
+	@Override
 	public void releasePersistentLock(LockResult le) {
 		//synchronisation is solved in the LockManager
 		String derivedLockString = ((LockResultImpl)le).getLockEntry().getKey();
@@ -126,7 +123,8 @@ public class DBPersistentLockManager implements PersistentLockManager, UserDataD
 	 * Delete all persisting-locks for certain identity.
 	 * @see org.olat.user.UserDataDeletable#deleteUserData(org.olat.core.id.Identity)
 	 */
-	public void deleteUserData(Identity identity, String newDeletedUserName) {		
+	@Override
+	public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) {		
 		String query = "from v in class org.olat.properties.Property where v.category = ? and v.longValue = ?";
 		DBFactory.getInstance().delete(query, new Object[] { CATEGORY_PERSISTENTLOCK, identity.getKey() },
 				new Type[] { StandardBasicTypes.STRING, StandardBasicTypes.LONG });
diff --git a/src/main/java/org/olat/core/util/mail/MailBoxExtension.java b/src/main/java/org/olat/core/util/mail/MailBoxExtension.java
index 5d0e681930e18e08e5147218f683625acd5e5c96..648970272bf4d05b67c3c5b64f9f1fab072e6eef 100644
--- a/src/main/java/org/olat/core/util/mail/MailBoxExtension.java
+++ b/src/main/java/org/olat/core/util/mail/MailBoxExtension.java
@@ -19,6 +19,7 @@
  */
 package org.olat.core.util.mail;
 
+import java.io.File;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
@@ -75,7 +76,7 @@ public class MailBoxExtension implements MailContextResolver, UserDataDeletable,
 	}
 
 	@Override
-	public void deleteUserData(Identity identity, String newDeletedUserName) {
+	public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) {
 		//set as deleted all recipients
 		log.info("Delete intern messages");
 		
diff --git a/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java b/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java
index dced06eca948647bc55491dd814f608986eb031a..bfc8e3bd90891bb8a724db96efd30b6f0101f80f 100644
--- a/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java
+++ b/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java
@@ -332,7 +332,7 @@ public class AssessmentToolManagerImpl implements AssessmentToolManager {
 			sb.append("count(ident.key)").append(" from ").append(IdentityImpl.class.getName()).append(" as ident ")
 			  .append(" inner join ident.user user ");
 		}
-		sb.append(" where ");
+		sb.append(" where ident.status<").append(Identity.STATUS_DELETED).append(" and");
 		if(params.getBusinessGroupKeys() != null && params.getBusinessGroupKeys().size() > 0) {
 			sb.append(" ident.key in (select participant.identity.key from repoentrytogroup as rel, businessgroup bgi, bgroupmember as participant")
 	          .append("    where rel.entry.key=:repoEntryKey and rel.group=bgi.baseGroup and rel.group=participant.group and bgi.key in (:businessGroupKeys) ")
diff --git a/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementManager.java b/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementManager.java
index e21c54fb5cac528b4319b36566d14959e9a3f789..6dc72a23526dcec97efe52343bb1c80d69cb3eaa 100644
--- a/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementManager.java
+++ b/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementManager.java
@@ -710,11 +710,17 @@ public class EfficiencyStatementManager implements UserDataDeletable {
 	}
 	
 	/**
-	 * Delete all efficiency-statements for certain identity.
+	 * Archive efficiency statement and than delete them for the specified identity.
+	 * 
 	 * @param identity  Delete data for this identity.
 	 */
 	@Override
-	public void deleteUserData(Identity identity, String newDeletedUserName) {
+	public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) {
+		archiveUserData(identity, archivePath);
+		deleteEfficientyStatement(identity);
+	}
+	
+	public void deleteEfficientyStatement(Identity identity) {
 		try {
 			StringBuilder sb = new StringBuilder();
 			sb.append("delete from ").append(UserEfficiencyStatementImpl.class.getName()).append(" as statement ")
diff --git a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
index ff562a682a854e00170fd8911712531c440d32f4..5cef78b7fa898f45193f066841ff8a2a3ced3281 100644
--- a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
+++ b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
@@ -168,7 +168,7 @@ public class BusinessGroupServiceImpl implements BusinessGroupService, UserDataD
 	private DB dbInstance;
 	
 	@Override
-	public void deleteUserData(Identity identity, String newDeletedUserName) {
+	public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) {
 		// remove as Participant 
 		List<BusinessGroup> attendedGroups = findBusinessGroupsAttendedBy(identity);
 		for (Iterator<BusinessGroup> iter = attendedGroups.iterator(); iter.hasNext();) {
diff --git a/src/main/java/org/olat/ims/qti/QTIResultManager.java b/src/main/java/org/olat/ims/qti/QTIResultManager.java
index 0ad0aba96f0aa679cd584b702bf4be0db3c680dd..57f3aa97f3496f232b2512c0e28141e26ff28a62 100644
--- a/src/main/java/org/olat/ims/qti/QTIResultManager.java
+++ b/src/main/java/org/olat/ims/qti/QTIResultManager.java
@@ -25,6 +25,7 @@
 
 package org.olat.ims.qti;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -335,7 +336,8 @@ public class QTIResultManager implements UserDataDeletable {
 	 * Delete all ResultSet for certain identity.
 	 * @param identity
 	 */
-	public void deleteUserData(Identity identity, String newDeletedUserName) {
+	@Override
+	public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) {
 		List<QTIResultSet> qtiResults = findQtiResultSets(identity);
 		for (QTIResultSet set:qtiResults) {
 			deleteResultSet(set);
diff --git a/src/main/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAO.java b/src/main/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAO.java
index cde3cd51bc0e8d4d95c0684f9e3dc4d55db03578..053582b7822fdc7d57f35a7d6335bfbe461c4546 100644
--- a/src/main/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAO.java
+++ b/src/main/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAO.java
@@ -50,7 +50,6 @@ import org.springframework.stereotype.Service;
 @Service
 public class AssessmentTestSessionDAO {
 	
-
 	private final DateFormat formater = new SimpleDateFormat("yyyyMMdd'T'HHmmss");
 	
 	@Autowired
@@ -319,6 +318,18 @@ public class AssessmentTestSessionDAO {
 		}
 		return query.getResultList();
 	}
+	
+	public List<AssessmentTestSession> getUserTestSessions(IdentityRef identity) {
+		StringBuilder sb = new StringBuilder();
+		sb.append("select session from qtiassessmenttestsession session")
+		  .append(" left join fetch session.testEntry testEntry")
+		  .append(" left join fetch testEntry.olatResource testResource")
+		  .append(" where session.identity.key=:identityKey ");;
+		return dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString(), AssessmentTestSession.class)
+				.setParameter("identityKey", identity.getKey())
+				.getResultList();
+	}
 
 	public List<AssessmentTestSession> getUserTestSessions(RepositoryEntryRef courseEntry, String courseSubIdent, IdentityRef identity) {
 		StringBuilder sb = new StringBuilder();
diff --git a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
index 918ee6b3798305b27ffb5d832369391eb4d568a2..07909101ab8b294dbc65c03bfad84f7585168f6e 100644
--- a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
+++ b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
@@ -86,6 +86,7 @@ import org.olat.modules.assessment.AssessmentEntry;
 import org.olat.modules.assessment.manager.AssessmentEntryDAO;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryRef;
+import org.olat.user.UserDataDeletable;
 import org.springframework.beans.factory.DisposableBean;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -144,7 +145,7 @@ import uk.ac.ed.ph.qtiworks.mathassess.MathAssessExtensionPackage;
  *
  */
 @Service
-public class QTI21ServiceImpl implements QTI21Service, InitializingBean, DisposableBean {
+public class QTI21ServiceImpl implements QTI21Service, UserDataDeletable, InitializingBean, DisposableBean {
 	
 	private static final OLog log = Tracing.createLoggerFor(QTI21ServiceImpl.class);
 	
@@ -361,7 +362,20 @@ public class QTI21ServiceImpl implements QTI21Service, InitializingBean, Disposa
 			}
 		});
 	}
-	
+
+	@Override
+	public int deleteUserDataPriority() {
+		return 10;
+	}
+
+	@Override
+	public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) {
+		List<AssessmentTestSession> sessions = testSessionDao.getUserTestSessions(identity);
+		for(AssessmentTestSession session:sessions) {
+			testSessionDao.deleteTestSession(session);
+		}
+	}
+
 	@Override
 	public boolean deleteAssessmentTestSession(List<Identity> identities, RepositoryEntryRef testEntry, RepositoryEntryRef entry, String subIdent) {
 		Set<AssessmentEntry> entries = new HashSet<>();
diff --git a/src/main/java/org/olat/modules/assessment/manager/AssessmentEntryDAO.java b/src/main/java/org/olat/modules/assessment/manager/AssessmentEntryDAO.java
index b4192c06797b45dc1f2eff8f327aaa17fcb184a2..04ec3455b6e6b84afde1e1d54b4bf258a66f81be 100644
--- a/src/main/java/org/olat/modules/assessment/manager/AssessmentEntryDAO.java
+++ b/src/main/java/org/olat/modules/assessment/manager/AssessmentEntryDAO.java
@@ -289,11 +289,18 @@ public class AssessmentEntryDAO {
 	 * @return
 	 */
 	public int deleteEntryForRepositoryEntry(RepositoryEntryRef entry) {
-		StringBuilder sb = new StringBuilder();
-		sb.append("delete from assessmententry data where data.repositoryEntry.key=:entryKey");
+		String query = "delete from assessmententry data where data.repositoryEntry.key=:entryKey";
 		return dbInstance.getCurrentEntityManager()
-				.createQuery(sb.toString())
+				.createQuery(query)
 				.setParameter("entryKey", entry.getKey())
 				.executeUpdate();
 	}
+	
+	public int deleteEntryForIdentity(IdentityRef identity) {
+		String query = "delete from assessmententry data where data.identity.key=:identityKey";
+		return dbInstance.getCurrentEntityManager()
+				.createQuery(query)
+				.setParameter("identityKey", identity.getKey())
+				.executeUpdate();
+	}
 }
diff --git a/src/main/java/org/olat/modules/assessment/manager/AssessmentServiceImpl.java b/src/main/java/org/olat/modules/assessment/manager/AssessmentServiceImpl.java
index c2c654dd74ed85e34e60a366db1e574dce413cda..267ebcabe641b999e08b1155850e6a89f4209933 100644
--- a/src/main/java/org/olat/modules/assessment/manager/AssessmentServiceImpl.java
+++ b/src/main/java/org/olat/modules/assessment/manager/AssessmentServiceImpl.java
@@ -19,6 +19,7 @@
  */
 package org.olat.modules.assessment.manager;
 
+import java.io.File;
 import java.util.Collections;
 import java.util.List;
 
@@ -30,6 +31,7 @@ import org.olat.modules.assessment.AssessmentService;
 import org.olat.modules.assessment.model.AssessmentEntryStatus;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryRef;
+import org.olat.user.UserDataDeletable;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -40,7 +42,7 @@ import org.springframework.stereotype.Service;
  *
  */
 @Service
-public class AssessmentServiceImpl implements AssessmentService {
+public class AssessmentServiceImpl implements AssessmentService, UserDataDeletable {
 	
 	@Autowired
 	private DB dbInstance;
@@ -110,4 +112,9 @@ public class AssessmentServiceImpl implements AssessmentService {
 			RepositoryEntry referenceEntry, AssessmentEntryStatus status) {
 		return Collections.emptyList();
 	}
+
+	@Override
+	public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) {
+		assessmentEntryDao.deleteEntryForIdentity(identity);
+	}
 }
diff --git a/src/main/java/org/olat/modules/iq/IQManager.java b/src/main/java/org/olat/modules/iq/IQManager.java
index b4929e0231e63448aba0ed29edf66fd68adaa94e..e3da8f052c85c50b219e0cbcd8c5402c386e52e0 100644
--- a/src/main/java/org/olat/modules/iq/IQManager.java
+++ b/src/main/java/org/olat/modules/iq/IQManager.java
@@ -438,7 +438,8 @@ public class IQManager implements UserDataDeletable {
 	 * Delete all qti.ser and qti-resreporting files.
 	 * @see org.olat.user.UserDataDeletable#deleteUserData(org.olat.core.id.Identity)
 	 */
-	public void deleteUserData(Identity identity, String newDeletedUserName) {
+	@Override
+	public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) {
 		FilePersister.deleteUserData(identity);
 		if(log.isDebug())
 			log.debug("Delete all qti.ser data and qti-resreporting data for identity=" + identity);
diff --git a/src/main/java/org/olat/modules/openmeetings/manager/OpenMeetingsManagerImpl.java b/src/main/java/org/olat/modules/openmeetings/manager/OpenMeetingsManagerImpl.java
index a2a105f058571ad1136c65a8aa0b59d6f6a4c875..5ce16dd722c63046c8d2ac2ff0d09123fc45c9d8 100644
--- a/src/main/java/org/olat/modules/openmeetings/manager/OpenMeetingsManagerImpl.java
+++ b/src/main/java/org/olat/modules/openmeetings/manager/OpenMeetingsManagerImpl.java
@@ -707,7 +707,7 @@ public class OpenMeetingsManagerImpl implements OpenMeetingsManager, UserDataDel
 	}
 	
 	@Override
-	public void deleteUserData(Identity identity, String newDeletedUserName) {
+	public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) {
 		//
 	}
 
diff --git a/src/main/java/org/olat/modules/vitero/manager/ViteroManager.java b/src/main/java/org/olat/modules/vitero/manager/ViteroManager.java
index 1a5450b6ba63d0ac94f1deb3835398524090be44..645998abda0e1d024c760f66baeded1e1bd76587 100644
--- a/src/main/java/org/olat/modules/vitero/manager/ViteroManager.java
+++ b/src/main/java/org/olat/modules/vitero/manager/ViteroManager.java
@@ -719,7 +719,7 @@ public class ViteroManager implements UserDataDeletable {
 	}
 	
 	@Override
-	public void deleteUserData(Identity identity, String newDeletedUserName) {
+	public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) {
 		if(!viteroModule.isDeleteVmsUserOnUserDelete()) return;
 		
 		try {
diff --git a/src/main/java/org/olat/note/NoteManager.java b/src/main/java/org/olat/note/NoteManager.java
index 34034bd2f7a415070a094b401637f8791816c0eb..fe39d28a3fa8dc9beae64617bf55edbc0d897e0f 100644
--- a/src/main/java/org/olat/note/NoteManager.java
+++ b/src/main/java/org/olat/note/NoteManager.java
@@ -25,6 +25,7 @@
 
 package org.olat.note;
 
+import java.io.File;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
@@ -155,7 +156,7 @@ public class NoteManager implements UserDataDeletable {
 	 * @param identity  Delete notes for this identity.
 	 */
 	@Override
-	public void deleteUserData(Identity identity,	String newDeletedUserName) {
+	public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) {
 		List<Note> userNotes = listUserNotes(identity);
 		for (Iterator<Note> iter = userNotes.iterator(); iter.hasNext();) {
 			deleteNote( iter.next() );			
diff --git a/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java b/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java
index 434744cd21d45f8ada89dd90e552ccf7a25e2d6f..846445fd0ccc2c1b6fb084c54bd9daadfeb448bb 100755
--- a/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java
+++ b/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java
@@ -19,6 +19,7 @@
  */
 package org.olat.portfolio.manager;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
@@ -171,7 +172,7 @@ public class EPFrontendManager implements UserDataDeletable, DeletableGroupData
 	}
 	
 	@Override
-	public void deleteUserData(Identity identity, String newDeletedUserName) {
+	public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) {
 		deleteUsersArtefacts(identity);
 
 		List<PortfolioStructure> userPersonalMaps = getStructureElementsForUser(identity, ElementType.DEFAULT_MAP, ElementType.STRUCTURED_MAP);
diff --git a/src/main/java/org/olat/properties/PropertyManager.java b/src/main/java/org/olat/properties/PropertyManager.java
index b2d5375e7fc3e1f93442feb747ae9e3a1db072fc..0952507d845263304ee1b719d8ab630b7815a1c8 100644
--- a/src/main/java/org/olat/properties/PropertyManager.java
+++ b/src/main/java/org/olat/properties/PropertyManager.java
@@ -25,6 +25,7 @@
 
 package org.olat.properties;
 
+import java.io.File;
 import java.util.Collections;
 import java.util.Date;
 import java.util.Iterator;
@@ -726,7 +727,7 @@ public class PropertyManager extends BasicManager implements UserDataDeletable {
 	 * @see org.olat.user.UserDataDeletable#deleteUserData(org.olat.core.id.Identity)
 	 */
 	@Override
-	public void deleteUserData(Identity identity, String newDeletedUserName) {
+	public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) {
 		List<Property> userProperterties = listProperties(identity, null, null, null, null, null);
 		for (Iterator<Property> iter = userProperterties.iterator(); iter.hasNext(); ) {
 			deleteProperty( iter.next());
diff --git a/src/main/java/org/olat/repository/manager/CatalogManager.java b/src/main/java/org/olat/repository/manager/CatalogManager.java
index 57764236435bb2a2204a229aee3205acf0708280..0559f906c21b19e22766c8dd3311ccd85cacba12 100644
--- a/src/main/java/org/olat/repository/manager/CatalogManager.java
+++ b/src/main/java/org/olat/repository/manager/CatalogManager.java
@@ -650,7 +650,7 @@ public class CatalogManager implements UserDataDeletable, InitializingBean {
 	 * @see org.olat.user.UserDataDeletable#deleteUserData(org.olat.core.id.Identity)
 	 */
 	@Override
-	public void deleteUserData(Identity identity, String newDeletedUserName) {
+	public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) {
 		// Remove as owner
 		List<CatalogEntry> catalogEntries = getCatalogEntriesOwnedBy(identity);
 		for (CatalogEntry catalogEntry:catalogEntries) {
diff --git a/src/main/java/org/olat/repository/manager/RepositoryDeletionManager.java b/src/main/java/org/olat/repository/manager/RepositoryDeletionManager.java
index bef0547530d2a008a7c8373186c1ab7212a8801e..c6d0fd2f86f3cd6eda205934ba40beac687f2cce 100644
--- a/src/main/java/org/olat/repository/manager/RepositoryDeletionManager.java
+++ b/src/main/java/org/olat/repository/manager/RepositoryDeletionManager.java
@@ -25,6 +25,7 @@
 
 package org.olat.repository.manager;
 
+import java.io.File;
 import java.util.Iterator;
 import java.util.List;
 
@@ -73,7 +74,7 @@ public class RepositoryDeletionManager implements UserDataDeletable {
 	 * @see org.olat.user.UserDataDeletable#deleteUserData(org.olat.core.id.Identity)
 	 */
 	@Override
-	public void deleteUserData(Identity identity, String newDeletedUserName) {
+	public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) {
 		// Remove as owner
 		List<RepositoryEntry> repoEntries = RepositoryManager.getInstance().queryByOwner(identity, new String[] {}/*no type limit*/);
 		for (Iterator<RepositoryEntry> iter = repoEntries.iterator(); iter.hasNext();) {
diff --git a/src/main/java/org/olat/user/DisplayPortraitManager.java b/src/main/java/org/olat/user/DisplayPortraitManager.java
index c49ec2e8778002d885ff32cc469efc6e3597823d..eb01ca3cf823f893e8e879e71093c0c1e47c89f9 100644
--- a/src/main/java/org/olat/user/DisplayPortraitManager.java
+++ b/src/main/java/org/olat/user/DisplayPortraitManager.java
@@ -275,7 +275,7 @@ public class DisplayPortraitManager extends BasicManager implements UserDataDele
 	 * @see org.olat.user.UserDataDeletable#deleteUserData(org.olat.core.id.Identity)
 	 */
 	@Override
-	public void deleteUserData(Identity identity, String newDeletedUserName) {
+	public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) {
 		String userHomePage = FolderConfig.getCanonicalRoot() + FolderConfig.getUserHomePage(identity.getName()); 
 		File portraitDir = new File(userHomePage, "portrait");
 		if(portraitDir.exists()) {
diff --git a/src/main/java/org/olat/user/HomePageConfigManagerImpl.java b/src/main/java/org/olat/user/HomePageConfigManagerImpl.java
index 906954d48635f7962448afaab4b09ef36be074e7..f187cc3af65b98f022991d524e2154c72013f442 100644
--- a/src/main/java/org/olat/user/HomePageConfigManagerImpl.java
+++ b/src/main/java/org/olat/user/HomePageConfigManagerImpl.java
@@ -151,7 +151,7 @@ public class HomePageConfigManagerImpl extends BasicManager implements HomePageC
 	 * @see org.olat.user.UserDataDeletable#deleteUserData(org.olat.core.id.Identity)
 	 */
 	@Override
-	public void deleteUserData(Identity identity, String newDeletedUserName) {
+	public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) {
 		String pathHomePage = FolderConfig.getCanonicalRoot() + FolderConfig.getUserHomePage(identity.getName());
 		File userHomePage = new File(pathHomePage);
 		if(userHomePage.exists()) {
diff --git a/src/main/java/org/olat/user/PersonalFolderManager.java b/src/main/java/org/olat/user/PersonalFolderManager.java
index 5d794074d60f5054db9ac9065572e7f4615ee303..0fff17749cd8d129b0d24380e50cc079104badf1 100644
--- a/src/main/java/org/olat/user/PersonalFolderManager.java
+++ b/src/main/java/org/olat/user/PersonalFolderManager.java
@@ -25,6 +25,8 @@
 
 package org.olat.user;
 
+import java.io.File;
+
 import org.olat.core.commons.modules.bc.BriefcaseWebDAVProvider;
 import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
 import org.olat.core.id.Identity;
@@ -34,7 +36,7 @@ import org.olat.core.logging.Tracing;
 /**
  * Manager for the personal-folder of a user.
  */
-public class PersonalFolderManager extends BriefcaseWebDAVProvider implements  UserDataDeletable {
+public class PersonalFolderManager extends BriefcaseWebDAVProvider implements UserDataDeletable {
 	
 	private static final OLog log = Tracing.createLoggerFor(PersonalFolderManager.class);
 
@@ -59,7 +61,7 @@ public class PersonalFolderManager extends BriefcaseWebDAVProvider implements  U
 	 * Delete personal-folder homes/<username> (private & public) of an user.
 	 */
 	@Override
-	public void deleteUserData(Identity identity, String newDeletedUserName) {
+	public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) {
 		new OlatRootFolderImpl(getRootPathFor(identity), null).deleteSilently();
 		log.debug("Personal-folder deleted for identity=" + identity);
 	}
diff --git a/src/main/java/org/olat/user/UserDataDeletable.java b/src/main/java/org/olat/user/UserDataDeletable.java
index 672780ae328a6da026c34f2162c1be35a9f23605..2ae5711aaf2008b4ea596a30064816d91d5533be 100644
--- a/src/main/java/org/olat/user/UserDataDeletable.java
+++ b/src/main/java/org/olat/user/UserDataDeletable.java
@@ -25,6 +25,8 @@
 
 package org.olat.user;
 
+import java.io.File;
+
 import org.olat.core.id.Identity;
 
 
@@ -35,9 +37,14 @@ import org.olat.core.id.Identity;
  * @author Christian Guretzki
  */
 public interface UserDataDeletable {
+	
+	default public int deleteUserDataPriority() {
+		return 0;
+	}
+	
 	/**
 	 * Delete user data for certain user
 	 * @param identity  Data for this identity will be deleted 
 	 */
-	public void deleteUserData(Identity identity, String newDeletedUserName);
+	public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath);
 }
\ No newline at end of file
diff --git a/src/test/java/org/olat/core/util/mail/manager/MailManagerTest.java b/src/test/java/org/olat/core/util/mail/manager/MailManagerTest.java
index 3ec0bd08079d91bfd65e723d7b09761d7e4867ab..152bcb9941ba24ca13462339c23b89bfb6629833 100644
--- a/src/test/java/org/olat/core/util/mail/manager/MailManagerTest.java
+++ b/src/test/java/org/olat/core/util/mail/manager/MailManagerTest.java
@@ -258,10 +258,10 @@ public class MailManagerTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 
 		//delete the 4 users datas
-		mailBoxExtension.deleteUserData(toId_1, "lalala");
-		mailBoxExtension.deleteUserData(toId_2, "lalala");
-		mailBoxExtension.deleteUserData(toId_3, "lalala");
-		mailBoxExtension.deleteUserData(fromId, "lalala");
+		mailBoxExtension.deleteUserData(toId_1, "lalala", null);
+		mailBoxExtension.deleteUserData(toId_2, "lalala", null);
+		mailBoxExtension.deleteUserData(toId_3, "lalala", null);
+		mailBoxExtension.deleteUserData(fromId, "lalala", null);
 		dbInstance.commitAndCloseSession();
 		
 		//check inbox / outbox
@@ -324,10 +324,10 @@ public class MailManagerTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 
 		//delete the 4 users datas
-		mailBoxExtension.deleteUserData(fromId, "lalala");
-		mailBoxExtension.deleteUserData(toId_1, "lalala");
-		mailBoxExtension.deleteUserData(toId_2, "lalala");
-		mailBoxExtension.deleteUserData(toId_3, "lalala");
+		mailBoxExtension.deleteUserData(fromId, "lalala", null);
+		mailBoxExtension.deleteUserData(toId_1, "lalala", null);
+		mailBoxExtension.deleteUserData(toId_2, "lalala", null);
+		mailBoxExtension.deleteUserData(toId_3, "lalala", null);
 		dbInstance.commitAndCloseSession();
 
 		//check mail by meta id
diff --git a/src/test/java/org/olat/course/assessment/AssessmentManagerTest.java b/src/test/java/org/olat/course/assessment/AssessmentManagerTest.java
index 1589a007a7c05162d70ccd1c3300d3b5b16c8205..851ca4ae359d0800e3be9ef14bb26872a61e904d 100644
--- a/src/test/java/org/olat/course/assessment/AssessmentManagerTest.java
+++ b/src/test/java/org/olat/course/assessment/AssessmentManagerTest.java
@@ -251,7 +251,7 @@ public class AssessmentManagerTest extends OlatTestCase  {
 		efficiencyStatement = checkEfficiencyStatement(courseRepositoryEntry);
 		
 		//delete the efficiencyStatement of the student
-		efficiencyStatementManager.deleteUserData(student, "deleted_" + student.getName());
+		efficiencyStatementManager.deleteEfficientyStatement(student);
 		DBFactory.getInstance().closeSession();
 		efficiencyStatement = efficiencyStatementManager.getUserEfficiencyStatementByCourseRepositoryEntry(courseRepositoryEntry, student);
 		DBFactory.getInstance().closeSession();
diff --git a/src/test/java/org/olat/course/assessment/manager/EfficiencyStatementManagerTest.java b/src/test/java/org/olat/course/assessment/manager/EfficiencyStatementManagerTest.java
index 755988604593586953e5d3e1d1f8b7e8dfb6fff6..9f411c6ea30991fa8c90d6639543e3b0dc8ea940 100644
--- a/src/test/java/org/olat/course/assessment/manager/EfficiencyStatementManagerTest.java
+++ b/src/test/java/org/olat/course/assessment/manager/EfficiencyStatementManagerTest.java
@@ -122,7 +122,7 @@ public class EfficiencyStatementManagerTest extends OlatTestCase {
 		Assert.assertEquals(2, statementsLight1.size());
 		
 		//delete user 1
-		effManager.deleteUserData(participant1, "deleted");
+		effManager.deleteEfficientyStatement(participant1);
 		dbInstance.commitAndCloseSession();
 		
 		//check the efficiency statements
diff --git a/src/test/java/org/olat/properties/PropertyTest.java b/src/test/java/org/olat/properties/PropertyTest.java
index e03e754e8876ea8c31a0023a19e96a10f37efceb..aef24041b8ecf430d10653b678313ee084c63960 100644
--- a/src/test/java/org/olat/properties/PropertyTest.java
+++ b/src/test/java/org/olat/properties/PropertyTest.java
@@ -237,7 +237,7 @@ public class PropertyTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		//delete user 1 datas
-		pm.deleteUserData(id1, "del-" + id1.getName());
+		pm.deleteUserData(id1, "del-" + id1.getName(), null);
 		dbInstance.commitAndCloseSession();
 		
 		//check if really deleted