diff --git a/.hgtags b/.hgtags
index 9fe36b57134d43d876a2cb395cacf339c2430077..aef786998adcc15d175e5be8608739f42f9569e4 100644
--- a/.hgtags
+++ b/.hgtags
@@ -219,3 +219,4 @@ e4c7003b290148810092848bc73bcec4e61da7be OpenOLAT 12.4.0
 f55676080d2436df8078a8a0f1f6fb1afbdbe58c OpenOLAT 12.4.1
 0810e24414f8cbb68dd6914297d883faf9527469 OpenOLAT 12.4.2
 8454f5e2b65117860a18899639a406c07e9b70e2 OpenOLAT 12.4.3a
+0f6842244daa90737563b7ebb287117c02138b0a OpenOLAT 12.5.0
diff --git a/src/main/java/org/olat/admin/security/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/admin/security/_i18n/LocalStrings_fr.properties
index 761ebe5d1cd7c61a040edf84a5e15a404ddf0c0b..b9cec41b9435b92b67f57c689d7125c798c6fcab 100644
--- a/src/main/java/org/olat/admin/security/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/admin/security/_i18n/LocalStrings_fr.properties
@@ -1,7 +1,8 @@
-#Mon Apr 16 21:44:19 CEST 2018
+#Thu May 31 16:24:13 CEST 2018
 admin.menu.title=S\u00E9curit\u00E9
 admin.menu.title.alt=Modifier les param\u00E8tres de s\u00E9curit\u00E9
 sec.content.security.policy=Content Security Policy (CSP)
+sec.content.security.policy.report.only=Rapport seulement
 sec.content.type.options=Emp\u00E9cher le butineur de deviner les scripts et styles par en-t\u00EAte HTTP
 sec.csp.connect.src=connect-src
 sec.csp.default.src=default-src
@@ -24,3 +25,5 @@ sec.top.frame.explanation=En raison d'incompatibilit\u00E9s avec certains compos
 sec.topframe=Emp\u00EAcher l'int\u00E9gration dans les cadres/frames
 sec.wiki=Bloquer la resource de type wiki
 sec.xframe.sameorigin=Interdire l'encadrant dans une frame avec l'en-t\u00EAte "X-FRAME-OPTIONS\=SAMEDOMAIN"
+security.configuration=Configuration
+security.csp.log=Log "content security policy"
diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_en.properties
index 6ec5bfaecbe0c24fd247f4088dd272228b808f9b..02d8a42efb2cc31ebae5546a27601115b948c524 100644
--- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_en.properties
@@ -152,10 +152,10 @@ table.header.action=Action
 table.header.vcard=Visiting card
 table.identity.action=Action
 table.identity.creationdate=Created
+table.identity.deleted.name=Del_User name
 table.identity.deletedby=Deleted by
 table.identity.deleteddate=Deleted
 table.identity.deletedroles=Roles
-table.identity.deleted.name=Del_User names
 table.identity.id=ID
 table.identity.lastlogin=Last login
 table.identity.name=User name
diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_fr.properties
index 6932227457477f4ad16148bc73aa8f60e162fdcd..be8026b6451c3b7ccbedb6af45c52576e017e4f9 100644
--- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_fr.properties
@@ -3,10 +3,13 @@ action.bulkedit=Changer les attributs de cet utilisateur
 action.choose=S\u00E9lectionner
 action.choose.finish=S\u00E9lectionner et terminer
 action.select=S\u00E9lectionner
+admins=Administrateur
 authedit.delete.confirm=Etes-vous s\u00FBr de vouloir effacer le fournisseur d'authentification {0} pour l'utilisateur {1}?
 authedit.delete.success=Le fournisseur d'authentification {0} pour l'utilisateur {1} a \u00E9t\u00E9 effac\u00E9.
+authors=Auteur
 autocomplete.noresults=$org.olat.core.gui.control.generic.ajax.autocompletion\:autocomplete.noresults
 autocompletion.info=Indiquez un nom d'utilisateur OLAT, un pr\u00E9nom ou un nom.
+bgroupcoach=Coach de groupes
 btn.back=Retour
 bulkChange.failed=Aucune modification n'a \u00E9t\u00E9 effectu\u00E9e
 bulkChange.partialsuccess={0} de {1} modification r\u00E9ussie. Les attributs d'utilisateur suivants n'ont pas pu \u00EAtre modifi\u00E9s\: {2}
@@ -15,10 +18,13 @@ bulkChange.title=Modification des attributs d'utilisateurs
 changeuserpwd.cancel=L'action a \u00E9t\u00E9 interrompue. Le mot de passe reste inchang\u00E9. 
 changeuserpwd.failed=Votre nouveau mot de passe n'a pas \u00E9t\u00E9 enregistr\u00E9. Une erreur inconnue est apparue.
 changeuserpwd.successful=Le nouveau mot de passe a \u00E9t\u00E9 enregistr\u00E9. Il est valable d\u00E8s \u00E0 pr\u00E9sent. 
+clear=Enlever
 command.mail=E-mail \u00E0 ces utilisateurs
+confirm.clear.identity=Voulez-vous effacer les nom et pr\u00E9nom de l'utilisateur "{0}"?
 content.usermgmt.text1=Ici vous pouvez changer et g\u00E9rer les donn\u00E9es des utilisateurs OLAT. Commencez par la recherche d'utilisateurs SVP. 
 content.usermgmt.title=Gestion des utilisateurs
 content.usermgmt.userfound=G\u00E9rer les r\u00E9glages des utilisateurs 
+deleted.user.list=Liste des utilisateurs effac\u00E9s
 deselectall=$org.olat.core.gui.components.table\:uncheckall
 edit.uauth=Authentifications
 edit.uhomepage=Cartes de visite
@@ -38,6 +44,8 @@ error.search.form.no.wildcard.dublicates=Les termes de recherche incluant `**` n
 error.search.form.notempty=Veuillez remplir au minimum un champ du formulaire SVP. 
 error.search.form.to.short=Terme de recherche trop court.
 error.search.maxResults=Trop de r\u00E9sultats ont \u00E9t\u00E9 trouv\u00E9s. Seul les {0} premiers seront affich\u00E9s.
+export.user.data=Exporter les donn\u00E9es
+export.user.data.title=Exporter les donn\u00E9es utilisateurs de "{0}"
 form.password.new1=Nouveau mot de passe
 form.password.new2=Confirmer mot de passe 
 form.please.enter.new=Veuillez ins\u00E9rer le nouveaux mot de passe pour cet utilisateur s.v.p. 
@@ -46,8 +54,10 @@ form.token.new.text=Message
 form.token.new.title=Envoyer lien mot de passe
 form.username=Nom d'utilisateur
 found.property=Propri\u00E9t\u00E9 s\u00E9lectionn\u00E9e {0}
+groupmanagers=Gestionnaire de groupes
 header.autocompletion=Recherche avec fonction compl\u00E9ter automatiquement
 header.normal=Recherche avec attributs d'utilisateur
+instoresmanager=Administrateur de ressources didactiques
 mailtemplate.login.denied.body=Cher(\u00E8re) {6} {4},\n\nVotre compte OpenOLAT {0} avec l'adresse e-mail {1} sur le syst\u00E8me {5} a \u00E9t\u00E9 d\u00E9sactiv\u00E9.\nSi vous souhaitez que le compte soit \u00E0 r\u00E9activ\u00E9, contactez s'il vous pla\u00EEt le support imm\u00E9diatement \u00E0 {3}.\n\n\nAvec nos meilleures salutations\nL'elearning Team
 mailtemplate.login.denied.subject=Compte OpenOLAT d\u00E9sactiv\u00E9
 mailto.userlist=Liste des utilisateurs
@@ -71,6 +81,9 @@ new.user.cancel=L'action a \u00E9t\u00E9 annul\u00E9e. Aucun nouveau compte util
 new.user.successful=Le nouveau compte utilisateur a \u00E9t\u00E9 cr\u00E9\u00E9.
 notification.noNews=Aucun nouvel utilisateur ne s'est connect\u00E9 depuis cette date.
 notification.noSubscription=Vous n'\u00EAtes pas abonn\u00E9 sur les nouveaux utilisateurs.
+owner=Propri\u00E9taire de cours
+poolsmanager=Gestionnaire banque de questions
+repocoach=Coach de cours
 rightForm.error.anonymous.no.roles=Les invit\u00E9(e)s anonymes ne peuvent pas exercer des r\u00F4les de syst\u00E8me.
 rightsForm.isAdmin=Administrateur syst\u00E8me
 rightsForm.isAnonymous=Type d'utilisateur
@@ -129,6 +142,10 @@ table.header.action=Action
 table.header.vcard=Carte de visite
 table.identity.action=Action
 table.identity.creationdate=Cr\u00E9\u00E9 
+table.identity.deleted.name=Del_Nom d'utilisateur
+table.identity.deletedby=Effac\u00E9 par
+table.identity.deleteddate=Effac\u00E9 le
+table.identity.deletedroles=R\u00F4les
 table.identity.lastlogin=dernier login 
 table.identity.name=Nom d'utilisateur
 table.identity.vcard=<i class\='o_icon o_icon-lg o_icon_home'> </i>
@@ -149,6 +166,7 @@ title.user.search=Chercher utilisateur OLAT
 title.userlist=Liste des utilisateurs
 title.usersearch=Recherche d'utilisateur
 user.found=L'utilisateur a \u00E9t\u00E9 trouv\u00E9
+usermanagers=Gestionnaire utilisateurs
 view.access=M\u00E9thodes de r\u00E9servations
 view.competences=Comp\u00E9tences
 view.courses=Objects didactiques
diff --git a/src/main/java/org/olat/collaboration/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/collaboration/_i18n/LocalStrings_fr.properties
index b8b68d29cf8dfd73ce20e5f0c8e9f20713226520..1f3995af6d5bdfe4ca4d9af7fc12547e5ee578fa 100644
--- a/src/main/java/org/olat/collaboration/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/collaboration/_i18n/LocalStrings_fr.properties
@@ -1,4 +1,4 @@
-#Tue Apr 04 18:45:08 CEST 2017
+#Thu May 31 16:23:21 CEST 2018
 calendar.access=Droit d'\u00E9criture calendrier
 calendar.access.all=Tous les membres
 calendar.access.owners=Propri\u00E9taire resp. tuteur
@@ -12,6 +12,7 @@ collabtools.named.hasNews=Information aux membres
 collabtools.named.hasOpenMeetings=OpenMeetings
 collabtools.named.hasPortfolio=ePortfolio
 collabtools.named.hasWiki=Wiki
+error.missing.map=Le classeur a \u00E9t\u00E9 effac\u00E9.
 folder=Dossier
 folder.access=Permission d'\u00E9criture du dossier
 folder.access.all=Tous les membres
diff --git a/src/main/java/org/olat/core/commons/services/csp/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/core/commons/services/csp/ui/_i18n/LocalStrings_fr.properties
new file mode 100644
index 0000000000000000000000000000000000000000..6ca1cad036b6290b95956eb5e5249759b980d193
--- /dev/null
+++ b/src/main/java/org/olat/core/commons/services/csp/ui/_i18n/LocalStrings_fr.properties
@@ -0,0 +1,23 @@
+#Thu May 31 16:07:02 CEST 2018
+blocked.uri=URI bloqu\u00E9e
+column.number=Colonne
+date=Date
+document.uri=URI document
+effective.directive=Directive
+line.number=N\u00B0 ligne
+original.policy=Police originale
+referrer=Referrer
+script.sample=Example de script
+source.file=Fichier
+table.header.blocked.uri=URI bloqu\u00E9e
+table.header.column.number=Colonne
+table.header.date=Date
+table.header.document.uri=Document
+table.header.effective.directive=Directive
+table.header.key=ID
+table.header.line.number=Ligne
+table.header.original.policy=Police
+table.header.referrer=Referrer
+table.header.source.file=Fichier
+user=Utilisateur
+violated.directive=Violation de r\u00E8gle
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 003938a7c8271d6a00974ce3995976b3c9572346..546241703bcae89c8b98cdda262d9d6b0171fa1c 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
@@ -1309,8 +1309,8 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us
 
 	@Override
 	public void export(Identity identity, ManifestBuilder manifest, File archiveDirectory, Locale locale) {
-		File noteArchive = new File(archiveDirectory, "Notifications.xlsx");
-		try(OutputStream out = new FileOutputStream(noteArchive);
+		File subscriptionsArchive = new File(archiveDirectory, "Subscriptions.xlsx");
+		try(OutputStream out = new FileOutputStream(subscriptionsArchive);
 			OpenXMLWorkbook workbook = new OpenXMLWorkbook(out, 1)) {
 			OpenXMLWorksheet sheet = workbook.nextWorksheet();
 			sheet.setHeaderRows(1);
@@ -1329,7 +1329,7 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us
 			log.error("Unable to export xlsx", e);
 		}
 
-		manifest.appendFile("Notifications.xlsx");
+		manifest.appendFile(subscriptionsArchive.getName());
 	}
 
 	private void exportSubscriberData(Subscriber subscriber, OpenXMLWorksheet sheet, OpenXMLWorkbook workbook, Locale locale) {
diff --git a/src/main/java/org/olat/core/util/mail/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/core/util/mail/_i18n/LocalStrings_fr.properties
index 16133e4503f5b8896d0d2632d8539a136021751f..b7a8c982773277ce9e6b6766a05e1d0237fa5c5c 100644
--- a/src/main/java/org/olat/core/util/mail/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/core/util/mail/_i18n/LocalStrings_fr.properties
@@ -1,5 +1,6 @@
-#Thu Feb 01 18:31:51 CET 2018
+#Thu May 31 16:14:31 CEST 2018
 add.email=Ajouter
+at.least.one.recipient=You delves choisi au moins un destinataire.
 contact.cp.from=Copie \u00E0 l'exp\u00E9diteur
 error.too.long=Le mod\u00E8le est trop grand. La taille maximale est {0}\!
 footer.no.userdata=<p>Ce message a \u00E9t\u00E9 envoy\u00E9 automatiquement via la plateforme d'apprentissage OpenOLAT\: {0}</p>
diff --git a/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementArchiver.java b/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementArchiver.java
index 9bc7e71cc14971d638e7e271ca2c10eabb45c730..bbc54d0d1e15986e66f815cc68b2463ff6ce68e7 100644
--- a/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementArchiver.java
+++ b/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementArchiver.java
@@ -152,6 +152,10 @@ public class EfficiencyStatementArchiver {
 		Object value = nodeData.get(key);
 		if(value instanceof String) {
 			row.addCell(col, (String)value);
+		} else if(value instanceof Number) {
+			row.addCell(col, (Number)value, null);
+		} else if(value instanceof Boolean) {
+			row.addCell(col, ((Boolean)value).toString(), null);
 		}
 	}
 
diff --git a/src/main/java/org/olat/course/config/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/course/config/ui/_i18n/LocalStrings_fr.properties
index 0c499492c70c2c940c02b2bb15c81ccc96727969..187c5888b76d99be7607dbe4eec0bdf8081cbff7 100644
--- a/src/main/java/org/olat/course/config/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/course/config/ui/_i18n/LocalStrings_fr.properties
@@ -1,4 +1,5 @@
-#Wed Mar 08 11:25:33 CET 2017
+#Fri Jun 01 10:18:11 CEST 2018
+chkbx.breadcrumb.onoff=Navigation fil d'Ariane
 chkbx.calendar.onoff=Afficher calendrier via la bo\u00EEte \u00E0 outils
 chkbx.chat.onoff=Utiliser le chat du cours
 chkbx.efficency.onoff=Utiliser l'attestation de performance
diff --git a/src/main/java/org/olat/course/nodes/bc/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/course/nodes/bc/_i18n/LocalStrings_fr.properties
index 6497efcd255c450776846d2f7afb9c5c5774c895..e663c9658979635d4a83930ef0095f8006ba1bed 100644
--- a/src/main/java/org/olat/course/nodes/bc/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/course/nodes/bc/_i18n/LocalStrings_fr.properties
@@ -1,4 +1,4 @@
-#Wed Feb 17 16:54:36 CET 2016
+#Thu May 31 16:15:44 CEST 2018
 chooseFolder=Choisir le dossier
 condition.accessDownloaders.title=Lecture seule (download)
 condition.accessUploaders.title=Ecriture (upload)
@@ -30,4 +30,5 @@ subPathLab.dummy=Aucun dossier de stockage n'est configur\u00E9 pour l'instant.
 subPathLab.label=Chemin du fichier
 title_bc=Dossier
 warn.folderdelete=Attention\: Tous les fichiers dans le dossier vont \u00EAtre effac\u00E9s.
+warning.no.linkedfolder=Le dossier configur\u00E9 n'existe pas dans le dossier de stockage.
 warning.no.sharedfolder=Le dossier de ressource configur\u00E9 n'est plus disponible.
diff --git a/src/main/java/org/olat/ims/qti21/questionimport/CSVToAssessmentItemConverter.java b/src/main/java/org/olat/ims/qti21/questionimport/CSVToAssessmentItemConverter.java
index 6c85414970833aa3f646b17454860755d793a160..947cf955e6ae1dc318f2023e9912848c1e57bc2e 100644
--- a/src/main/java/org/olat/ims/qti21/questionimport/CSVToAssessmentItemConverter.java
+++ b/src/main/java/org/olat/ims/qti21/questionimport/CSVToAssessmentItemConverter.java
@@ -120,6 +120,7 @@ public class CSVToAssessmentItemConverter {
 			case "type": processType(parts); break;
 			case "titel":
 			case "title": processTitle(parts); break;
+			case "topic": processTopic(parts); break;
 			case "beschreibung":
 			case "description": processDescription(parts); break;
 			case "frage":
@@ -272,7 +273,7 @@ public class CSVToAssessmentItemConverter {
 		String discriminationIndex = parts[1];
 		if(StringHelper.containsNonWhitespace(discriminationIndex)) {
 			try {
-				currentItem.setDifferentiation(new BigDecimal(discriminationIndex.trim()));
+				currentItem.setDifferentiation(new BigDecimal(discriminationIndex.replace(",", ".").trim()));
 			} catch (Exception e) {
 				log.warn("", e);
 			}
@@ -285,7 +286,7 @@ public class CSVToAssessmentItemConverter {
 		String difficulty = parts[1];
 		if(StringHelper.containsNonWhitespace(difficulty)) {
 			try {
-				BigDecimal dif = new BigDecimal(difficulty.trim());
+				BigDecimal dif = new BigDecimal(difficulty.replace(",", ".").trim());
 				if(dif.doubleValue() >= 0.0d && dif.doubleValue() <= 1.0d) {
 					currentItem.setDifficulty(dif);
 				} else {
@@ -303,7 +304,7 @@ public class CSVToAssessmentItemConverter {
 		String stddev = parts[1];
 		if(StringHelper.containsNonWhitespace(stddev)) {
 			try {
-				BigDecimal dev = new BigDecimal(stddev.trim());
+				BigDecimal dev = new BigDecimal(stddev.replace(",", ".").trim());
 				if(dev.doubleValue() >= 0.0d && dev.doubleValue() <= 1.0d) {
 					currentItem.setStdevDifficulty(dev);
 				} else {
@@ -515,6 +516,15 @@ public class CSVToAssessmentItemConverter {
 		}
 	}
 	
+	private void processTopic(String[] parts) {
+		if(currentItem == null || parts.length < 2) return;
+		
+		String topic = parts[1];
+		if(StringHelper.containsNonWhitespace(topic)) {
+			currentItem.setTopic(topic);
+		}
+	}
+	
 	private void processQuestion(String[] parts) {
 		if(currentItem == null) return;
 		
diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_fr.properties
index 120cb466c6fefe78357bfe9f269e2e80e8c0bc18..f680884d49ea1ea15ee7d28b8e891fa2575d802d 100644
--- a/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_fr.properties
@@ -1,5 +1,6 @@
-#Mon Apr 16 20:59:33 CEST 2018
+#Thu May 31 16:11:18 CEST 2018
 assessed.identity=Utilisateur
+back.overview=Retourner \u00E0 l'aper\u00E7u
 comment=Commentaire
 comment.help=Ce commentaire est visible pour l'utilisateur dans le r\u00E9sum\u00E9 du test ainsi que pour les coaches.
 comment.test=Commentaire du test
@@ -21,6 +22,7 @@ override.score=Remplacer les points
 overview.tests=Aper\u00E7u and cl\u00F4ture
 previous.item=Question pr\u00E9c\u00E9dente
 previous.user=Utilisateur pr\u00E9c\u00E9dent
+save.back=Sauver et retourner \u00E0 l'aper\u00E7u
 save.next=Sauver et question suivante
 save.tests=Sauver les r\u00E9sultats d\u00E9finitifs
 score=R\u00E9sultats
@@ -42,6 +44,7 @@ table.header.username=Nom d'utilisateur
 to.review=Marquer pour v\u00E9rification
 tool.review.all=Tout marquer pour v\u00E9rification
 tool.unreview.all=Enlever les marques
+view.correct.solution=Voir la solution correcte
 view.solution=Voir la solution
 waring.atleast.one=Vous devez choisir au moins une question.
 warning.assessment.item.locked=La r\u00E9ponse est momentan\u00E9ment verrouill\u00E9e par un autre utilisateur\: {0}
diff --git a/src/main/java/org/olat/login/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/login/_i18n/LocalStrings_fr.properties
index 86857ece73128768d35b43ae4db17242a04f7494..db0b15681ba38f5c56b7739f37f8818775eb4526 100644
--- a/src/main/java/org/olat/login/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/login/_i18n/LocalStrings_fr.properties
@@ -1,4 +1,4 @@
-#Thu Feb 01 18:37:13 CET 2018
+#Fri Jun 01 10:19:57 CEST 2018
 about.copyright=Copyright et participations
 about.custom=
 about.custom.title=
@@ -40,6 +40,8 @@ accesskey.top=$org.olat.core.commons.fullWebApp\:accesskey.top
 accesskey.topnav=$org.olat.core.commons.fullWebApp\:accesskey.topnav
 admin.menu.title=Invit\u00E9s et invitations
 admin.menu.title.alt=$\:admin.menu.title
+admin.password.menu.title=R\u00E8gles concernant les mots de passes
+admin.password.menu.title.alt=R\u00E8gles concernant les changements de mots de passes
 authentication.provider.description=N'appertenez-vous pas \u00E0 l'une des institutions mentionn\u00E9es ci-dessus ou n'avez-vous pas un compte utilisateur local?
 authentication.provider.linkText=Connectez-vous avec un compte OpenOLAT
 browsercheck.bestresults.newerversion=ou nouvelle version
@@ -72,7 +74,9 @@ browsercheck.yourbrowser.name=Navigateur\:
 browsercheck.yourbrowser.os=Syst\u00E8me d'exploitation\:
 browsercheck.yourbrowser.title=Vous utilisez le navigateur suivant\:
 browsercheck.yourbrowser.usragent=Agent utilisateur\:
+change.once=Changement de mot de passe apr\u00E8s la premi\u00E8re visite
 default.shib.intro=Vous \u00EAtes redirig\u00E9 vers la connexion
+disable.history=d\u00E9sactiv\u00E9
 enabled=on
 guest.login=Connexion invit\u00E9 sur la page de login
 guest.login.links=Liens pour invit\u00E9s
@@ -98,6 +102,15 @@ login.intro=Veuillez vous connecter avec votre nom d'utilisateur et mot de passe
 login.notavailable=Le serveur est momentan\u00E9ment congestionn\u00E9. Veuillez r\u00E9essayer ult\u00E9rieurement.
 mail.pwd.body=Le mot de passe de votre compte OpenOLAT {0} avec l'adresse e-mail {1} a \u00E9t\u00E9 modifi\u00E9 par {2}.\r\n\r\n\r\nSi vous n'\u00EAtes pas d'accord avec ce changement ou si vous pensez que votre compte a \u00E9t\u00E9 compromis par des tiers, veuillez s'il vous pla\u00EEt contactez le support technique \u00E0 {3} dans les plus brefs d\u00E9lais ou utilisez le lien {4} pour changer \u00E0 nouveau le mot de passe.
 mail.pwd.subject=Mot de passe chang\u00E9
+max.age=Exiger un nouveau mot de passe
+max.age.administrator=... pour les administrateurs
+max.age.author=... pour les auteurs
+max.age.description=Vous pouvez configurer ici la fr\u00E9quence \u00E0 laquelle un utilisateur doit changer son mot de passe et si un mot de passe peut \u00EAtre r\u00E9utilis\u00E9. La dur\u00E9e de vie des mots de passe peut \u00EAtre sp\u00E9cifi\u00E9 pour chaque role s\u00E9par\u00E9ment.
+max.age.groupmanager=... pour gestionnaires de groupes
+max.age.hint=en jours
+max.age.learnresourcemanager=... pour les administrateurs de ressources didactiques
+max.age.poolmanager=... pour les gestionnaires de la banque de questions
+max.age.usermanager=... pour les gestionnaires des utilisateurs
 menu.about=A propos d'OpenOLAT
 menu.about.alt=Informations sur OpenOLAT
 menu.guest=Acc\u00E8s invit\u00E9(e)
@@ -109,6 +122,9 @@ menu.register=Enregistrement
 menu.register.alt=Veuillez cr\u00E9er votre compte personnel OpenOLAT
 menu.root=OpenOLAT
 menu.root.alt=infinite learning
+password.after=pour {0} changements
+password.history=Pr\u00E9venir la r\u00E9utilisation des mots de passes pr\u00E9c\u00E9dants
+password.policy.title=R\u00E8gles concernant les mots de passes
 runonce.forced=Veuillez compl\u00E9ter toutes les indications et enregistrez le formulaire, s.v.p. .
 runonce.title=Modifications r\u00E9currentes / r\u00E9glages \u00E0 la premi\u00E8re connexion
 shib.redirect=Shibboleth Login
diff --git a/src/main/java/org/olat/modules/edubase/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/edubase/ui/_i18n/LocalStrings_fr.properties
index db02c5363318558810f2f63d95b5d19eeea48d7c..03e3df1b8a941bab3f469f16864e7a95825d53d6 100644
--- a/src/main/java/org/olat/modules/edubase/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/modules/edubase/ui/_i18n/LocalStrings_fr.properties
@@ -1,4 +1,4 @@
-#Thu Nov 30 09:53:14 CET 2017
+#Thu May 31 16:12:53 CEST 2018
 admin.edubase.coverver.url=URL du service "coverver"
 admin.edubase.description=Edubase est une solution compl\u00E8te pour les publications digitales et imprim\u00E9es. Avec le module OpenOLAT Edubase, l0Edubase Reader peut \u00EAtre int\u00E9gr\u00E9 \u00E0 un cours. Vous trouverez de plus amples informations sur le site Edubase <a href\="http\://www.edubase.ch" target\=_blank>http\://www.edubase.ch</a>.
 admin.edubase.enabled=El\u00E9ment de cours "Edubase"
@@ -7,6 +7,8 @@ admin.edubase.lti.launch.url=URL de d\u00E9marrage LTI
 admin.edubase.oauth.key=Cl\u00E9
 admin.edubase.oauth.secret=Secret
 admin.edubase.reader.url=URL Edubase Reader
+admin.edubase.reader.url.unique=URL unique Edubase Reader
+admin.edubase.reader.url.unique.help=L'URL Edubase Reader est form\u00E9e d'un param\u00E8tre sp\u00E9cifique \u00E0 l'utilisateur pour \u00E9viter les probl\u00E8mes li\u00E9s au nombres d'appareils.
 admin.edubase.title=Edubase
 admin.expert.settings=Configuration avanc\u00E9e
 admin.menu.title=Edubase/Edubook
diff --git a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_fr.properties
index fa984330dd80840bb6e97be752f3bd2fd188f789..e457a661e9fa4d1e99c0048ee52d2a78ca93d28c 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_fr.properties
@@ -1,4 +1,4 @@
-#Mon Apr 16 21:15:31 CEST 2018
+#Thu May 31 16:13:16 CEST 2018
 access=Acc\u00E8s
 access.binder=Les personnes suivantes ont acc\u00E8s au classeur\:
 access.rights=Ajouter un droit d'acc\u00E8s
@@ -58,6 +58,7 @@ assignment.type=Type
 assignment.type.document=Document
 assignment.type.essay=Texte libre
 assignment.type.form=Questionnaire
+attachments=Documents
 attachments.error.file.exists=Ce fichier existe d\u00E9j\u00E0 et ne peut plus \u00EAtre ajout\u00E9 encore une fois.
 attachments.upload.successful=Le fichier {0} a \u00E9t\u00E9 ajout\u00E9 avec succ\u00E8s. Si besoin, d'autres fichiers peuvent \u00EAtre ajout\u00E9s.
 author=Auteur
@@ -95,6 +96,7 @@ compare.evaluations=Evaluation
 confirm.close.page=Voulez-vous clore cette contribution? Cette contribution sera clos pour l'apprenant.
 confirm.close.page.other.coaches=Les personnes suivantes ont acc\u00E8s \u00E0 la contribution\:
 confirmation=Confirmation
+content.title=Contenu
 create.binder=Cr\u00E9er un classeur
 create.empty.binder=Nouveau classeur vide
 create.empty.binder.from.course=Nouveau classeur d'un devoir de cours
@@ -222,6 +224,7 @@ meta.page.assignment=Ceci est un devoir
 meta.page.assignment.type=Type
 meta.section.assignments=<strong>Devoir</strong> dans cette section
 meta.section.categories=<strong>Cat\u00E9gories</strong> dans cette section
+metadata.title=M\u00E9ta-donn\u00E9es
 mf.creator=Auteur
 mf.edition=Edition
 mf.editor=Editeur
diff --git a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_fr.properties
index 2e2d5b8f26848c6c383848dffba087a9f4b3d404..753c82788cdc1992e4aa2b090ce5291ad6b99fcf 100644
--- a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_fr.properties
@@ -1,4 +1,4 @@
-#Mon Apr 16 21:16:26 CEST 2018
+#Thu May 31 16:13:49 CEST 2018
 add=+
 add.to.list=Ajouter \u00E0 la liste
 admin.menu.title=Banque de questions
@@ -179,6 +179,8 @@ menu.pools.main=Catalogue
 menu.pools.main.alt=Catalogue
 menu.queries=Questions
 menu.queries.all=Toutes les questions
+menu.queries.whithout.author=Sans auteur
+menu.queries.whithout.taxonomy.level=Sans sujet
 menu.queries.without.author=Sans auteur
 menu.queries.without.taxonomy.level=Sans sujet
 menu.ratings=Evaluations
diff --git a/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java b/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java
index d49ff8f2865db9bb82c0d14bccfebcd2ae72e633..e2de12b33a944c45458348746d3e61047e72b556 100644
--- a/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java
+++ b/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java
@@ -693,7 +693,7 @@ public class RepositoryEntryRelationDAO {
 	
 	public List<MembershipInfos> getMembership(IdentityRef identity) {
 		StringBuilder sb = new StringBuilder(512);
-		sb.append("select v.key, v.displayname, reMember.role, reMember.creationDate,")
+		sb.append("select v.key, v.displayname, reMember.key, reMember.role, reMember.creationDate,")
 		  .append(" userinfos.initialLaunch, userinfos.recentLaunch, userinfos.visit")
 		  .append(" from repositoryentry as v")
 		  .append(" inner join v.groups as rel")
@@ -706,11 +706,18 @@ public class RepositoryEntryRelationDAO {
 				.setParameter("identityKey", identity.getKey())
 				.getResultList();
 		
+		Set<Long> memberKeys = new HashSet<>();
 		List<MembershipInfos> memberhips = new ArrayList<>(rawObjects.size());
 		for(Object[] rawObject:rawObjects) {
 			int col = 0;
 			Long entryKey = (Long)rawObject[col++];
 			String displayName = (String)rawObject[col++];
+			Long memberKey = (Long)rawObject[col++];
+			if(memberKeys.contains(memberKey)) {
+				continue;//duplicate
+			}
+			memberKeys.add(memberKey);
+			
 			String role = (String)rawObject[col++];
 			Date creationDate = (Date)rawObject[col++];
 			Date initialLaunch = (Date)rawObject[col++];
diff --git a/src/main/java/org/olat/user/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/user/_i18n/LocalStrings_fr.properties
index 4a834e4f7b2c28948a9b17ec3492c9f59e5d7a9d..5a243085a29733e14ab1f95583a3d99b5d80666a 100644
--- a/src/main/java/org/olat/user/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/user/_i18n/LocalStrings_fr.properties
@@ -1,4 +1,4 @@
-#Thu Nov 16 20:25:36 CET 2017
+#Thu May 31 16:22:59 CEST 2018
 Failed=La transmission du fichier a \u00E9chou\u00E9.
 NoImage=L'image ne peut pas \u00EAtre transmise sous ce format de fichier.
 ULLimitExceeded=L'image ne doit pas d\u00E9passer {0} KB.
@@ -30,6 +30,7 @@ extlink=Lien externe vers la carte de visite
 form.address=Adresse
 form.charset=Jeu de caract\u00E8res pour t\u00E9l\u00E9chargement
 form.checkPassword=Le mot de passe doit contenir au moins quatre caract\u00E8res. Utilisez des lettres ET des chiffres.
+form.checkPassword.history=Vous ne pouvez pas r\u00E9utiliser un mot de passe que vous avez d\u00E9j\u00E0 utilis\u00E9 par le pass\u00E9.
 form.checkUsername=Le nom d'utilisateur doit \u00EAtre compos\u00E9 d'au moins 4 caract\u00E8res et ne doit contenir que des lettres de A \u00E0 Z (sans accents) et des chiffres de 0 \u00E0 9. En plus les caract\u00E8res sp\u00E9ciaux . _ et - sont permis.
 form.description=Indiquez vos donn\u00E9es personnelles dans le formulaire ci-dessous. Vous pouvez d\u00E9cider laquelle des entr\u00E9es sera visible sur votre carte de visite gr\u00E2ce au bo\u00EEtes \u00E0 cocher. 
 form.email=E-mail
@@ -127,6 +128,7 @@ tab.pwd=Mot de passe
 tab.pwdav=WebDAV
 tab.roles=R\u00F4les
 tab.settings=Configuration
+tab.user.data=Donn\u00E9es utilisateur
 table.header.action=Action
 table.prop.category=Cat\u00E9gorie
 table.prop.creatdat=Cr\u00E9\u00E9
@@ -146,6 +148,7 @@ ul.header=Image publi\u00E9e (.jpg .jpeg .png .gif)
 ul.select=S\u00E9lectionner fichier
 ul.select.fhelp=L'image est recadr\u00E9e automatiquement \u00E0 une largeur de 100 pixels.
 ul.upload=T\u00E9l\u00E9charger
+user.data.download.explain=T\u00E9l\u00E9charger les donn\u00E9es utilisateurs
 user.deleted=Cet utilisateur a \u00E9t\u00E9 supprim\u00E9 dans OLAT
 user.email.admin.description=Configuration de l'adresse courriel des utilisateurs. Si l'adresse courriel est optionnel ou n'est pas unique, certaines fonctions d'OpenOLAT ne sont plus disponibles comme auto-enregistrement, vitero, WebDAV...
 user.email.admin.title=Adresse courriel
diff --git a/src/main/java/org/olat/user/ui/data/UserDataExportController.java b/src/main/java/org/olat/user/ui/data/UserDataExportController.java
index 8c2fd6021a93d1903175290e43006adbe16e2f5c..0d5f5a36d2d17143f4c784b0a278d1b622eed165 100644
--- a/src/main/java/org/olat/user/ui/data/UserDataExportController.java
+++ b/src/main/java/org/olat/user/ui/data/UserDataExportController.java
@@ -19,7 +19,9 @@
  */
 package org.olat.user.ui.data;
 
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 import org.olat.core.gui.UserRequest;
@@ -75,13 +77,13 @@ public class UserDataExportController extends FormBasicController {
 			((FormLayoutContainer)formLayout).contextPut("dataBusinessPath", url);
 			
 			if(!processing) {
-				List<String> exportIds = exportService.getExporterIds();
-				String[] keys = new String[exportIds.size()];
-				String[] values = new String[exportIds.size()];
-				for(int i=exportIds.size(); i-->0; ) {
-					String exportId = exportIds.get(i);
-					keys[i] = exportId;
-					values[i] = translate(exportId);
+				List<ExportLabel> exports = getAvailableExports();
+				String[] keys = new String[exports.size()];
+				String[] values = new String[exports.size()];
+				for(int i=exports.size(); i-->0; ) {
+					ExportLabel export = exports.get(i);
+					keys[i] = export.getId();
+					values[i] = export.getLabel();
 				}
 				exportEl = uifactory.addCheckboxesVertical("export.options", formLayout, keys, values, 1);
 				exportEl.setMandatory(true);
@@ -119,4 +121,38 @@ public class UserDataExportController extends FormBasicController {
 	protected void formCancelled(UserRequest ureq) {
 		fireEvent(ureq, Event.CANCELLED_EVENT);
 	}
+	
+	private List<ExportLabel> getAvailableExports() {
+		List<String> exportIds = exportService.getExporterIds();
+		List<ExportLabel> labels = new ArrayList<>(exportIds.size());
+		for(String exportId:exportIds) {
+			labels.add(new ExportLabel(exportId, translate(exportId)));
+		}
+		Collections.sort(labels);
+		return labels;
+	}
+	
+	private static final class ExportLabel implements Comparable<ExportLabel> {
+		
+		private final String id;
+		private final String label;
+		
+		public ExportLabel(String id, String label) {
+			this.id = id;
+			this.label = label;
+		}
+
+		public String getId() {
+			return id;
+		}
+
+		public String getLabel() {
+			return label;
+		}
+
+		@Override
+		public int compareTo(ExportLabel o) {
+			return label.compareToIgnoreCase(o.label);
+		}	
+	}
 }
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 7065728eccdfb5dd85d3b57a4313e957d6b3bcdf..18cb2724578efe5cc9167c77426c4e251c93b19b 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
@@ -13,7 +13,7 @@ efficiency.statements=Leistungnachweise
 export.options=Export Elemente
 export.start=Start export
 export.url=Link zu Daten
-export.user.data.explain=W\u00E4hlen Sie die Elemente, welche f\u00FCr diesen Benutzer exportiert werden sollen. Der Export kann mehrere Stunde in Anspruch nehmen. Sobald der Export beendet ist werden Sie per Email informiert.
+export.user.data.explain=W\u00E4hlen Sie die Elemente, welche f\u00FCr diesen Benutzer exportiert werden sollen. Der Export kann mehrere Stunden in Anspruch nehmen. Sobald der Export beendet ist, werden Sie per Email informiert.
 export.user.data.none=Datenschutz Erkl\u00E4rung
 export.user.data.notReady=Der Benutzer kann den Export mit dem folgenden Link herunterladen.
 export.user.data.processing=Der Export ist gerade bearbeitet.
diff --git a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_en.properties
index 9dbe7aa2068d9cb711d26c1c435a95569dacbcb9..7a5d6ff5a97098f025173405d238baee6d3e4e28 100644
--- a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_en.properties
@@ -1,4 +1,4 @@
-#Fri May 25 16:23:30 CEST 2018
+#Fri Jun 01 10:16:59 CEST 2018
 binders=ePortfolio binders
 bookings=Bookings
 calendars=Calendars
@@ -13,6 +13,13 @@ efficiency.statements=Evidences of achievement
 export.options=Export elements
 export.start=Start export
 export.url=Link to the data
+export.user.data.explain=Select the elements to be exported for this user. The export can take several hours. You will receive an email once the export has been completed.
+export.user.data.none=Privacy statement
+export.user.data.notReady=The user can download the export using the following link.
+export.user.data.processing=The export is currently processed
+export.user.data.ready=The user can download the export with the following link. You can ask for a new export too.
+export.user.data.ready.subject=The export for "{0}" is ready
+export.user.data.ready.text=<p>The export for "{0}" is ready. The user can use the following link to download it <a href\="{1}">{1}</a>.</p>
 feeds=Blogs and podcasts
 forums=Forums
 group.memberships=Membership to groups
@@ -23,5 +30,5 @@ notes=Notes
 notifications=Subscriptions
 personal.folders=All documents in private and public folders
 pf=Participant folders
+profile=all profile data, including invisible ones
 repository.memberships=Membership to courses
-
diff --git a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_fr.properties
new file mode 100644
index 0000000000000000000000000000000000000000..5a33753ab713027f3af04455791a5a6bf948aa13
--- /dev/null
+++ b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_fr.properties
@@ -0,0 +1,34 @@
+#Fri Jun 01 10:34:11 CEST 2018
+binders=Classeurs portfolio
+bookings=R\u00E9servations
+calendars=Calendriers
+certificates=Certificats
+chat=Messages de la messagerie instantan\u00E9e
+comments.ratings=Commentaires et \u00E9valuations
+dialog=Fichiers discut\u00E9s
+disclaimer=Conditions d'utilisation
+display.portrait=Image publi\u00E9e du profil
+download.data=T\u00E9l\u00E9charger les donn\u00E9es
+efficiency.statements=Attestations de performance
+export.options=Elements \u00E0 exporter
+export.start=D\u00E9marrer l'exportation
+export.url=Lien vers les donn\u00E9es
+export.user.data.explain=S\u00E9lectionner les \u00E9l\u00E9ments \u00E0 exporter pour cette utilisateur. L'exportation peut dur\u00E9e plusieurs heures, vous recevrez un courriel lorsqu'il sera termin\u00E9.
+export.user.data.none=D\u00E9claration de protection des donn\u00E9es
+export.user.data.notReady=L'utilisateur peut t\u00E9l\u00E9charger les donn\u00E9es export\u00E9es avec le lien suivant.
+export.user.data.processing=L'exportation est en cours.
+export.user.data.ready=L'utilisateur peut t\u00E9l\u00E9charger les donn\u00E9es avec le lien suivant. Vous pouvez \u00E9galement d\u00E9marrer une nouvelle exportation.
+export.user.data.ready.subject=Les donn\u00E9es pour "{0}" sont pr\u00EAtes.
+export.user.data.ready.text=<p>Les donn\u00E9es pour l'utilisateur "{0}" sont pr\u00EAtes. L'utilisateur peut les t\u00E9l\u00E9charger en suivant le lien <a href\="{1}">{1}</a>.</p>
+feeds=Blogues et podcasts
+forums=Forums
+group.memberships=Participations aux groupes
+gta=Devoirs
+logs=Logs
+mail=Courriels
+notes=Notes personnelles
+notifications=Abonnements
+personal.folders=Tous les documents des dossiers priv\u00E9 et public
+pf=Dossiers participants
+profile=toutes les donn\u00E9es du profil, inclus celles invisibles
+repository.memberships=Participations aux cours
diff --git a/src/main/resources/org/olat/ims/qti21/questionimport/qti-import-metadata.xlsx b/src/main/resources/org/olat/ims/qti21/questionimport/qti-import-metadata.xlsx
index 337788a2369fb178b73ae6c206045fc0536fe2a8..1eb189381d65d10d72ff858e70e93da106e30688 100644
Binary files a/src/main/resources/org/olat/ims/qti21/questionimport/qti-import-metadata.xlsx and b/src/main/resources/org/olat/ims/qti21/questionimport/qti-import-metadata.xlsx differ