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 e80af84102a80eb60b7c1f7564833a197d1b2562..bb286bd9be4fc04df37d6191c5c32110e2f1faec 100644
--- a/src/main/java/org/olat/core/util/mail/MailBoxExtension.java
+++ b/src/main/java/org/olat/core/util/mail/MailBoxExtension.java
@@ -19,16 +19,13 @@
  */
 package org.olat.core.util.mail;
 
-import java.util.Collection;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 
 import org.olat.NewControllerFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.WindowControl;
-import org.olat.core.id.Identity;
 import org.olat.core.id.context.BusinessControl;
 import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.id.context.ContextEntry;
@@ -37,13 +34,11 @@ import org.olat.core.id.context.DefaultContextEntryControllerCreator;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.StringHelper;
-import org.olat.core.util.mail.model.DBMailLight;
 import org.olat.core.util.mail.ui.MailContextResolver;
 import org.olat.group.BusinessGroupService;
 import org.olat.group.BusinessGroupShort;
 import org.olat.home.HomeSite;
 import org.olat.repository.RepositoryManager;
-import org.olat.user.UserDataDeletable;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -58,12 +53,10 @@ import org.springframework.stereotype.Service;
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  */
 @Service("mailBoxExtension")
-public class MailBoxExtension implements MailContextResolver, UserDataDeletable, InitializingBean {
+public class MailBoxExtension implements MailContextResolver, InitializingBean {
 	
 	private static final OLog log = Tracing.createLoggerFor(MailBoxExtension.class);
 
-	@Autowired
-	private MailManager mailManager;
 	@Autowired
 	private RepositoryManager repositoryManager;
 	@Autowired
@@ -74,24 +67,6 @@ public class MailBoxExtension implements MailContextResolver, UserDataDeletable,
 		NewControllerFactory.getInstance().addContextEntryControllerCreator("Inbox", new InboxContextEntry());	
 	}
 
-	@Override
-	public void deleteUserData(Identity identity, String newDeletedUserName) {
-		//set as deleted all recipients
-		log.info("Delete intern messages");
-		
-		Collection<DBMailLight> inbox = new HashSet<>(mailManager.getInbox(identity, null, Boolean.FALSE, null, 0, 0));
-		for(DBMailLight inMail:inbox) {
-			mailManager.delete(inMail, identity, true);
-		}
-
-		Collection<DBMailLight> outbox = new HashSet<>(mailManager.getOutbox(identity, 0, 0, false));
-		for(DBMailLight outMail:outbox) {
-			mailManager.delete(outMail, identity, true);
-		}
-		
-		log.info("Delete " + inbox.size() + " messages in INBOX and " + outbox.size() + " in OUTBOX");
-	}
-
 	@Override
 	public String getName(String businessPath, Locale locale) {
 		if(!StringHelper.containsNonWhitespace(businessPath)) return null;
diff --git a/src/main/java/org/olat/core/util/mail/manager/MailManagerImpl.java b/src/main/java/org/olat/core/util/mail/manager/MailManagerImpl.java
index 20db18a34778026f22e3d667b5f587e79f045564..e5274f4c048d1c7f3f1669bf8863b1e636b9d042 100644
--- a/src/main/java/org/olat/core/util/mail/manager/MailManagerImpl.java
+++ b/src/main/java/org/olat/core/util/mail/manager/MailManagerImpl.java
@@ -533,8 +533,7 @@ public class MailManagerImpl implements MailManager, InitializingBean  {
 		if(firstResult > 0) {
 			query.setFirstResult(firstResult);
 		}
-		List<DBMailLight> mails = query.getResultList();
-		return mails;
+		return query.getResultList();
 	}
 
 	@Override
@@ -593,8 +592,7 @@ public class MailManagerImpl implements MailManager, InitializingBean  {
 			query.setParameter("from", from, TemporalType.TIMESTAMP);
 		}
 
-		List<DBMailLight> mails = query.getResultList();
-		return mails;
+		return query.getResultList();
 	}
 
 	@Override
@@ -617,16 +615,13 @@ public class MailManagerImpl implements MailManager, InitializingBean  {
 		if(!baseFolder.exists()) {
 			baseFolder.mkdirs();
 		}
-		OutputStream out = null;
-		try {
-			File templateFile = new File(baseFolder, "mail_template.html");
+		
+		File templateFile = new File(baseFolder, "mail_template.html");
+		try(OutputStream out = new FileOutputStream(templateFile);) {
 			StringReader reader = new StringReader(template);
-			out = new FileOutputStream(templateFile);
 			IOUtils.copy(reader, out, "UTF-8");
 		} catch (IOException e) {
 			log.error("", e);
-		} finally {
-			IOUtils.closeQuietly(out);
 		}
 	}
 
@@ -643,7 +638,7 @@ public class MailManagerImpl implements MailManager, InitializingBean  {
 	@Override
 	public MailBundle[] makeMailBundles(MailContext ctxt, List<Identity> recipientsTO,
 			MailTemplate template, Identity sender, String metaId, MailerResult result) {
-		List<MailBundle> bundles = new ArrayList<MailBundle>();
+		List<MailBundle> bundles = new ArrayList<>();
 		if(recipientsTO != null) {
 			for(Identity recipient: recipientsTO) {
 				MailBundle bundle =  makeMailBundle(ctxt, recipient, template, sender, metaId, result);
@@ -1012,18 +1007,15 @@ public class MailManagerImpl implements MailManager, InitializingBean  {
 			List<File> attachments = content.getAttachments();
 			if(attachments != null && !attachments.isEmpty()) {
 				for(File attachment:attachments) {
-
-					FileInputStream in = null;
-					try {
+					try(FileInputStream in = new FileInputStream(attachment)) {
 						DBMailAttachment data = new DBMailAttachment();
 						data.setSize(attachment.length());
 						data.setName(attachment.getName());
 						
 						long checksum = FileUtils.checksum(attachment, new Adler32()).getValue();
-						data.setChecksum(new Long(checksum));
+						data.setChecksum(Long.valueOf(checksum));
 						data.setMimetype(WebappHelper.getMimeType(attachment.getName()));
-						
-						in = new FileInputStream(attachment);
+	
 						String path = saveAttachmentToStorage(data.getName(), data.getMimetype(), checksum, attachment.length(), in);
 						data.setPath(path);
 						data.setMail(mail);
@@ -1033,8 +1025,6 @@ public class MailManagerImpl implements MailManager, InitializingBean  {
 						log.error("File attachment not found: " + attachment, e);
 					} catch (IOException e) {
 						log.error("Error with file attachment: " + attachment, e);
-					} finally {
-						IOUtils.closeQuietly(in);
 					}
 				}
 			}
diff --git a/src/main/java/org/olat/core/util/mail/manager/MailUserDataManager.java b/src/main/java/org/olat/core/util/mail/manager/MailUserDataManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..edfc6b15ee4d2cd8a02b1af3c3ffca4be1f3ee04
--- /dev/null
+++ b/src/main/java/org/olat/core/util/mail/manager/MailUserDataManager.java
@@ -0,0 +1,184 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.core.util.mail.manager;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import org.olat.core.commons.persistence.DB;
+import org.olat.core.id.Identity;
+import org.olat.core.logging.OLog;
+import org.olat.core.logging.Tracing;
+import org.olat.core.util.Formatter;
+import org.olat.core.util.StringHelper;
+import org.olat.core.util.mail.MailManager;
+import org.olat.core.util.mail.model.DBMail;
+import org.olat.core.util.mail.model.DBMailLight;
+import org.olat.core.util.mail.model.DBMailRecipient;
+import org.olat.core.util.mail.ui.MailContextResolver;
+import org.olat.core.util.openxml.OpenXMLWorkbook;
+import org.olat.core.util.openxml.OpenXMLWorksheet;
+import org.olat.core.util.openxml.OpenXMLWorksheet.Row;
+import org.olat.user.UserDataDeletable;
+import org.olat.user.UserDataExportable;
+import org.olat.user.UserManager;
+import org.olat.user.manager.ManifestBuilder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 
+ * Initial date: 25 mai 2018<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+@Service
+public class MailUserDataManager implements UserDataDeletable, UserDataExportable {
+	
+	private static final OLog log = Tracing.createLoggerFor(MailUserDataManager.class);
+	
+	@Autowired
+	private DB dbInstance;
+	@Autowired
+	private UserManager userManager;
+	@Autowired
+	private MailManager mailManager;
+	@Autowired
+	private MailContextResolver contextResolver;
+	
+
+	@Override
+	public void deleteUserData(Identity identity, String newDeletedUserName) {
+		//set as deleted all recipients
+		log.info("Delete intern messages");
+		
+		Collection<DBMailLight> inbox = new HashSet<>(mailManager.getInbox(identity, null, Boolean.FALSE, null, 0, 0));
+		for(DBMailLight inMail:inbox) {
+			mailManager.delete(inMail, identity, true);
+		}
+
+		Collection<DBMailLight> outbox = new HashSet<>(mailManager.getOutbox(identity, 0, 0, false));
+		for(DBMailLight outMail:outbox) {
+			mailManager.delete(outMail, identity, true);
+		}
+		
+		log.info("Delete " + inbox.size() + " messages in INBOX and " + outbox.size() + " in OUTBOX");
+	}
+
+	@Override
+	public String getExporterID() {
+		return "mail";
+	}
+
+	@Override
+	public void export(Identity identity, ManifestBuilder manifest, File archiveDirectory, Locale locale) {
+		Map<String,String> bpToContexts = new HashMap<>();
+		exportInbox(identity, bpToContexts, manifest, archiveDirectory, locale);
+		exportOutbox(identity, bpToContexts, manifest, archiveDirectory, locale);
+	}
+	
+	private void exportInbox(Identity identity, Map<String,String> bpToContexts, ManifestBuilder manifest, File archiveDirectory, Locale locale) {
+		File inbox = new File(archiveDirectory, "MailInbox.xlsx");
+
+		try(OutputStream out = new FileOutputStream(inbox);
+			OpenXMLWorkbook workbook = new OpenXMLWorkbook(out, 1)) {
+			OpenXMLWorksheet sheet = workbook.nextWorksheet();
+			sheet.setHeaderRows(1);
+			
+			Row header = sheet.newRow();
+			header.addCell(0, "Created");
+			header.addCell(1, "Context");
+			header.addCell(2, "Subject");
+			header.addCell(3, "From");
+			
+			List<DBMailLight> mails = mailManager.getInbox(identity, null, null, null, 0, -1);
+			dbInstance.commitAndCloseSession();
+			for(DBMailLight mail:mails) {
+				Row row = sheet.newRow();
+				row.addCell(0, mail.getCreationDate(), workbook.getStyles().getDateTimeStyle());
+				String businessPath = mail.getContext().getBusinessPath();
+				if(StringHelper.containsNonWhitespace(businessPath)) {
+					String contextName = bpToContexts.computeIfAbsent(businessPath, bp -> contextResolver.getName(businessPath, locale));
+					row.addCell(1, contextName);	
+				}
+				row.addCell(2, mail.getSubject());
+				
+				DBMailRecipient from = mail.getFrom();
+				if(from != null) {
+					if(from.getRecipient() != null) {
+						row.addCell(3, userManager.getUserDisplayName(from.getRecipient()));
+					} else if(from.getEmailAddress() != null) {
+						row.addCell(3, from.getEmailAddress());
+					}
+				}
+			}
+		} catch (IOException e) {
+			log.error("Unable to export xlsx", e);
+		}
+		manifest.appendFile(inbox.getName());
+	}
+	
+	private void exportOutbox(Identity identity, Map<String,String> bpToContexts, ManifestBuilder manifest, File archiveDirectory, Locale locale) {
+		File outbox = new File(archiveDirectory, "MailOutbox.xlsx");
+
+		try(OutputStream out = new FileOutputStream(outbox);
+			OpenXMLWorkbook workbook = new OpenXMLWorkbook(out, 1)) {
+			OpenXMLWorksheet sheet = workbook.nextWorksheet();
+			sheet.setHeaderRows(1);
+			
+			Row header = sheet.newRow();
+			header.addCell(0, "Created");
+			header.addCell(1, "Context");
+			header.addCell(2, "Subject");
+			header.addCell(3, "Content");
+			
+			int count = 0;
+			List<DBMailLight> mails = mailManager.getOutbox(identity, 0, -1, false);
+			for(DBMailLight mail:mails) {
+				Row row = sheet.newRow();
+				DBMail mailWithContent = mailManager.getMessageByKey(mail.getKey());
+				row.addCell(0, mailWithContent.getCreationDate(), workbook.getStyles().getDateTimeStyle());
+				String businessPath = mail.getContext().getBusinessPath();
+				if(StringHelper.containsNonWhitespace(businessPath)) {
+					String contextName = bpToContexts.computeIfAbsent(businessPath, bp -> contextResolver.getName(businessPath, locale));
+					row.addCell(1, contextName);	
+				}
+				row.addCell(2, mailWithContent.getSubject());
+				row.addCell(3, Formatter.truncate(mailWithContent.getBody(), 32000));
+				
+				if(count++ % 25 == 0) {
+					dbInstance.commitAndCloseSession();
+				}
+			}
+		} catch (IOException e) {
+			log.error("Unable to export xlsx", e);
+		}
+		manifest.appendFile(outbox.getName());
+	}
+
+}
diff --git a/src/main/java/org/olat/user/manager/UserDataExportTask.java b/src/main/java/org/olat/user/manager/UserDataExportTask.java
index e72860883080806ca778beff7c017a323b62ea83..0bdc9e8e4490b9042fdf6614baebf9ca56e668e4 100644
--- a/src/main/java/org/olat/user/manager/UserDataExportTask.java
+++ b/src/main/java/org/olat/user/manager/UserDataExportTask.java
@@ -20,7 +20,6 @@
 package org.olat.user.manager;
 
 import org.olat.core.CoreSpringFactory;
-import org.olat.core.commons.services.taskexecutor.LongRunnable;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.user.UserDataExportService;
@@ -31,7 +30,7 @@ import org.olat.user.UserDataExportService;
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
-public class UserDataExportTask implements LongRunnable {
+public class UserDataExportTask implements /* Long */ Runnable {
 
 	private static final long serialVersionUID = 6931074116105090545L;
 
diff --git a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_de.properties
index 2936a07633b699b519dd3fb2667c802d635cc0a2..b85fd678f932475ac566bbc23362f174cefca252 100644
--- a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_de.properties
@@ -22,7 +22,7 @@ group.memberships=Zugeh
 export.user.data.processing=Der Export ist gerade bearbeitet.
 export.user.data.ready=Der Benutzer kann den Export mit dem folgenden Link herunterladen. Sie können auch ein en neuen Export erfordern.
 export.user.data.notReady=Der Benutzer kann den Export mit dem folgenden Link herunterladen.
-
+mail=Mail
 export.user.data.ready.subject=Export von "{0}" ist fertig
 export.user.data.ready.text=<p>Export von "{0}" ist fertig. Es konnte unter <a href="{1}">{1}</a> heruntergeladen werden</p>
 
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..4d5b8eae9ff192e008872619b46acd93208b5b41 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
@@ -38,7 +38,6 @@ import org.olat.core.id.Identity;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.mail.ContactList;
-import org.olat.core.util.mail.MailBoxExtension;
 import org.olat.core.util.mail.MailBundle;
 import org.olat.core.util.mail.MailManager;
 import org.olat.core.util.mail.MailModule;
@@ -60,8 +59,6 @@ public class MailManagerTest extends OlatTestCase {
 	@Autowired
 	private MailManager mailManager;
 	@Autowired
-	private MailBoxExtension mailBoxExtension;
-	@Autowired
 	private MailModule mailModule;
 	@Autowired
 	private DB dbInstance;
@@ -231,110 +228,6 @@ public class MailManagerTest extends OlatTestCase {
 		Assert.assertEquals(incomingMail, incomingsMails_3.get(0));
 	}
 	
-	@Test
-	public void testDeleteUserData_groupedMail() {
-		//send a mail to three ids
-		String metaId = UUID.randomUUID().toString();
-		Identity fromId = JunitTestHelper.createAndPersistIdentityAsUser("mail-7-" + UUID.randomUUID().toString());
-		Identity toId_1 = JunitTestHelper.createAndPersistIdentityAsUser("mail-8-" + UUID.randomUUID().toString());
-		Identity toId_2 = JunitTestHelper.createAndPersistIdentityAsUser("mail-9-" + UUID.randomUUID().toString());
-		Identity toId_3 = JunitTestHelper.createAndPersistIdentityAsUser("mail-10-" + UUID.randomUUID().toString());
-		
-		ContactList ccs = new ContactList("unit-test-cc");
-		ccs.add(toId_1);
-		ccs.add(toId_2);
-		ccs.add(toId_3);
-		ccs.add(fromId);
-		
-		MailBundle bundle = new MailBundle();
-		bundle.setFromId(fromId);
-		bundle.setContactList(ccs);
-		bundle.setMetaId(metaId);
-		bundle.setContent("Hello delList", "Content of delList");
-		
-		MailerResult result = mailManager.sendMessage(bundle);
-		Assert.assertNotNull(result);
-		Assert.assertEquals(MailerResult.OK, result.getReturnCode());
-		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");
-		dbInstance.commitAndCloseSession();
-		
-		//check inbox / outbox
-		List<DBMailLight> deletedMails_1 = mailManager.getInbox(toId_1, null, null, null, 0, -1);
-		Assert.assertNotNull(deletedMails_1);
-		Assert.assertTrue(deletedMails_1.isEmpty());
-		List<DBMailLight> deletedMails_2 = mailManager.getInbox(toId_2, null, null, null, 0, -1);
-		Assert.assertNotNull(deletedMails_2);
-		Assert.assertTrue(deletedMails_2.isEmpty());
-		List<DBMailLight> deletedMails_3 = mailManager.getInbox(toId_3, null, null, null, 0, -1);
-		Assert.assertNotNull(deletedMails_3);
-		Assert.assertTrue(deletedMails_3.isEmpty());
-		List<DBMailLight> deletedMails_4 = mailManager.getOutbox(fromId, 0, -1, true);
-		Assert.assertNotNull(deletedMails_4);
-		Assert.assertTrue(deletedMails_4.isEmpty());
-		//check mail by meta id
-		List<DBMailLight> deletedMails = mailManager.getEmailsByMetaId(metaId);
-		Assert.assertNotNull(deletedMails);
-		Assert.assertTrue(deletedMails.isEmpty());
-	}
-	
-	@Test
-	public void testDeleteUserData_separatedMail() {
-		//send a mail as separated e-mails to three ids
-		String metaId = UUID.randomUUID().toString();
-		Identity fromId = JunitTestHelper.createAndPersistIdentityAsUser("mail-7-" + UUID.randomUUID().toString());
-		Identity toId_1 = JunitTestHelper.createAndPersistIdentityAsUser("mail-8-" + UUID.randomUUID().toString());
-		Identity toId_2 = JunitTestHelper.createAndPersistIdentityAsUser("mail-9-" + UUID.randomUUID().toString());
-		Identity toId_3 = JunitTestHelper.createAndPersistIdentityAsUser("mail-10-" + UUID.randomUUID().toString());
-		
-		MailBundle bundle_1 = new MailBundle();
-		bundle_1.setFromId(fromId);
-		bundle_1.setToId(toId_1);
-		bundle_1.setMetaId(metaId);
-		bundle_1.setContent("Hello ccList", "Content of ccList");
-		
-		MailerResult result1 = mailManager.sendMessage(bundle_1);
-		Assert.assertNotNull(result1);
-		Assert.assertEquals(MailerResult.OK, result1.getReturnCode());
-		
-		MailBundle bundle_2 = new MailBundle();
-		bundle_2.setFromId(fromId);
-		bundle_2.setToId(toId_2);
-		bundle_2.setMetaId(metaId);
-		bundle_2.setContent("Hello ccList", "Content of ccList");
-		
-		MailerResult result2 = mailManager.sendMessage(bundle_2);
-		Assert.assertNotNull(result2);
-		Assert.assertEquals(MailerResult.OK, result2.getReturnCode());
-		
-		MailBundle bundle_3 = new MailBundle();
-		bundle_3.setFromId(fromId);
-		bundle_3.setToId(toId_3);
-		bundle_3.setMetaId(metaId);
-		bundle_3.setContent("Hello ccList", "Content of ccList");
-		
-		MailerResult result3 = mailManager.sendMessage(bundle_3);
-		Assert.assertNotNull(result3);
-		Assert.assertEquals(MailerResult.OK, result3.getReturnCode());
-		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");
-		dbInstance.commitAndCloseSession();
-
-		//check mail by meta id
-		List<DBMailLight> deletedMails = mailManager.getEmailsByMetaId(metaId);
-		Assert.assertNotNull(deletedMails);
-		Assert.assertTrue(deletedMails.isEmpty());
-	}
 	
 	@Test
 	public void testParalellSubscribers() {
diff --git a/src/test/java/org/olat/core/util/mail/manager/MailUserDataManagerTest.java b/src/test/java/org/olat/core/util/mail/manager/MailUserDataManagerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..b1d6b2d6ca6cb87c1bd713023116194bff5b35d7
--- /dev/null
+++ b/src/test/java/org/olat/core/util/mail/manager/MailUserDataManagerTest.java
@@ -0,0 +1,158 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.core.util.mail.manager;
+
+import java.util.List;
+import java.util.UUID;
+
+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.util.mail.ContactList;
+import org.olat.core.util.mail.MailBundle;
+import org.olat.core.util.mail.MailManager;
+import org.olat.core.util.mail.MailerResult;
+import org.olat.core.util.mail.model.DBMailLight;
+import org.olat.test.JunitTestHelper;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * 
+ * Initial date: 25 mai 2018<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class MailUserDataManagerTest {
+	
+	@Autowired
+	private DB dbInstance;
+	@Autowired
+	private MailManager mailManager;
+	@Autowired
+	private MailUserDataManager mailBoxExtension;
+	
+
+	@Test
+	public void testDeleteUserData_groupedMail() {
+		//send a mail to three ids
+		String metaId = UUID.randomUUID().toString();
+		Identity fromId = JunitTestHelper.createAndPersistIdentityAsUser("mail-7-" + UUID.randomUUID().toString());
+		Identity toId_1 = JunitTestHelper.createAndPersistIdentityAsUser("mail-8-" + UUID.randomUUID().toString());
+		Identity toId_2 = JunitTestHelper.createAndPersistIdentityAsUser("mail-9-" + UUID.randomUUID().toString());
+		Identity toId_3 = JunitTestHelper.createAndPersistIdentityAsUser("mail-10-" + UUID.randomUUID().toString());
+		
+		ContactList ccs = new ContactList("unit-test-cc");
+		ccs.add(toId_1);
+		ccs.add(toId_2);
+		ccs.add(toId_3);
+		ccs.add(fromId);
+		
+		MailBundle bundle = new MailBundle();
+		bundle.setFromId(fromId);
+		bundle.setContactList(ccs);
+		bundle.setMetaId(metaId);
+		bundle.setContent("Hello delList", "Content of delList");
+		
+		MailerResult result = mailManager.sendMessage(bundle);
+		Assert.assertNotNull(result);
+		Assert.assertEquals(MailerResult.OK, result.getReturnCode());
+		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");
+		dbInstance.commitAndCloseSession();
+		
+		//check inbox / outbox
+		List<DBMailLight> deletedMails_1 = mailManager.getInbox(toId_1, null, null, null, 0, -1);
+		Assert.assertNotNull(deletedMails_1);
+		Assert.assertTrue(deletedMails_1.isEmpty());
+		List<DBMailLight> deletedMails_2 = mailManager.getInbox(toId_2, null, null, null, 0, -1);
+		Assert.assertNotNull(deletedMails_2);
+		Assert.assertTrue(deletedMails_2.isEmpty());
+		List<DBMailLight> deletedMails_3 = mailManager.getInbox(toId_3, null, null, null, 0, -1);
+		Assert.assertNotNull(deletedMails_3);
+		Assert.assertTrue(deletedMails_3.isEmpty());
+		List<DBMailLight> deletedMails_4 = mailManager.getOutbox(fromId, 0, -1, true);
+		Assert.assertNotNull(deletedMails_4);
+		Assert.assertTrue(deletedMails_4.isEmpty());
+		//check mail by meta id
+		List<DBMailLight> deletedMails = mailManager.getEmailsByMetaId(metaId);
+		Assert.assertNotNull(deletedMails);
+		Assert.assertTrue(deletedMails.isEmpty());
+	}
+	
+	@Test
+	public void testDeleteUserData_separatedMail() {
+		//send a mail as separated e-mails to three ids
+		String metaId = UUID.randomUUID().toString();
+		Identity fromId = JunitTestHelper.createAndPersistIdentityAsUser("mail-7-" + UUID.randomUUID().toString());
+		Identity toId_1 = JunitTestHelper.createAndPersistIdentityAsUser("mail-8-" + UUID.randomUUID().toString());
+		Identity toId_2 = JunitTestHelper.createAndPersistIdentityAsUser("mail-9-" + UUID.randomUUID().toString());
+		Identity toId_3 = JunitTestHelper.createAndPersistIdentityAsUser("mail-10-" + UUID.randomUUID().toString());
+		
+		MailBundle bundle_1 = new MailBundle();
+		bundle_1.setFromId(fromId);
+		bundle_1.setToId(toId_1);
+		bundle_1.setMetaId(metaId);
+		bundle_1.setContent("Hello ccList", "Content of ccList");
+		
+		MailerResult result1 = mailManager.sendMessage(bundle_1);
+		Assert.assertNotNull(result1);
+		Assert.assertEquals(MailerResult.OK, result1.getReturnCode());
+		
+		MailBundle bundle_2 = new MailBundle();
+		bundle_2.setFromId(fromId);
+		bundle_2.setToId(toId_2);
+		bundle_2.setMetaId(metaId);
+		bundle_2.setContent("Hello ccList", "Content of ccList");
+		
+		MailerResult result2 = mailManager.sendMessage(bundle_2);
+		Assert.assertNotNull(result2);
+		Assert.assertEquals(MailerResult.OK, result2.getReturnCode());
+		
+		MailBundle bundle_3 = new MailBundle();
+		bundle_3.setFromId(fromId);
+		bundle_3.setToId(toId_3);
+		bundle_3.setMetaId(metaId);
+		bundle_3.setContent("Hello ccList", "Content of ccList");
+		
+		MailerResult result3 = mailManager.sendMessage(bundle_3);
+		Assert.assertNotNull(result3);
+		Assert.assertEquals(MailerResult.OK, result3.getReturnCode());
+		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");
+		dbInstance.commitAndCloseSession();
+
+		//check mail by meta id
+		List<DBMailLight> deletedMails = mailManager.getEmailsByMetaId(metaId);
+		Assert.assertNotNull(deletedMails);
+		Assert.assertTrue(deletedMails.isEmpty());
+	}
+
+}
diff --git a/src/test/java/org/olat/test/AllTestsJunit4.java b/src/test/java/org/olat/test/AllTestsJunit4.java
index 57abead6cd860458f62c2862188e54ba9f20ea42..8e0e2d27417b2a7facbefd8bdb4adc4ba129085f 100644
--- a/src/test/java/org/olat/test/AllTestsJunit4.java
+++ b/src/test/java/org/olat/test/AllTestsJunit4.java
@@ -73,6 +73,7 @@ import org.junit.runners.Suite;
 	org.olat.core.util.IPUtilsValidRangeTest.class,
 	org.olat.core.util.mail.EmailAddressValidatorTest.class,
 	org.olat.core.util.mail.manager.MailManagerTest.class,
+	org.olat.core.util.mail.manager.MailUserDataManagerTest.class,
 	org.olat.core.util.openxml.OpenXmlWorkbookTest.class,
 	org.olat.core.util.openxml.OpenXMLDocumentTest.class,
 	org.olat.core.util.xml.XMLDigitalSignatureUtilTest.class,