diff --git a/src/main/java/de/bps/course/nodes/den/_i18n/LocalStrings_fr.properties b/src/main/java/de/bps/course/nodes/den/_i18n/LocalStrings_fr.properties
index 590ae5563d823e6dd2b2e9f52969533a79230e45..8f39bfe365456936dbdf0e813b795c0058a802b4 100644
--- a/src/main/java/de/bps/course/nodes/den/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/de/bps/course/nodes/den/_i18n/LocalStrings_fr.properties
@@ -1,85 +1,60 @@
 #Sat Jan 08 13:09:53 CET 2011
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-config.create.dates=cr\u00E9er rendez-vous
+config.create.dates=Cr\u00E9er rendez-vous
 config.dates=G\u00E9rer les rendez-vous
-config.dates.begin=d\u00E9but de rendez-vous
+config.dates.begin=D\u00E9but de rendez-vous
 config.dates.begin.example=(dd.MM.yyyy HH\:mm)
-config.dates.comment=remarque
-config.dates.duration=dur\u00E9e d'un rendez-vous
+config.dates.comment=Remarque
+config.dates.duration=Dur\u00E9e d'un rendez-vous
 config.dates.duration.example=(hh\:mm)
-config.dates.duration.single=dur\u00E9e du rendez-vous
-config.dates.location=lieu
-config.dates.move=diff\u00E9rer rendez-vous
+config.dates.duration.single=Dur\u00E9e du rendez-vous
+config.dates.location=Lieu
+config.dates.move=Diff\u00E9rer rendez-vous
 config.dates.move.example=(+/-hh\:mm)
 config.dates.participants=Nombre de participants par rendez-vous
 config.dates.pause=Pause
 config.dates.pause.example=(hh\:mm)
-config.dates.retakes=nombre rendez-vous
+config.dates.retakes=Nombre rendez-vous
 config.dates.save=Enregistrer et fermer
-config.dates.subject=titre de rendez-vous
-config.default.values=valeurs par d\u00E9faut
-config.header=distribution de rendez-vous
+config.dates.subject=Titre du rendez-vous
+config.default.values=Valeurs par d\u00E9faut
+config.header=Distribution de rendez-vous
 config.nodates.long=Vous n'avez pas encore cr\u00E9\u00E9 des rendez-vous pour lesquels les participants peuvent s'inscrire.
 config.nodates.short=Pas de rendez-vous disponible
-config.tasks=devoirs
-config.type.date=distribution de rendez-vous
-config.type.group=inscription de groupe
+config.tasks=Devoirs
+config.type.date=Distribution de rendez-vous
+config.type.group=Inscription de groupe
 dates.edit=Editer rendez-vous
-dates.table.begin=d\u00E9but
-dates.table.comment=remarque
-dates.table.date=rendez-vous
+dates.table.begin=D\u00E9but
+dates.table.comment=Remarque
+dates.table.date=Rendez-vous
 dates.table.duration=Dur\u00E9e
 dates.table.edit.change=Editer
 dates.table.edit.delete=Effacer
-dates.table.edit.save=enregistrer
+dates.table.edit.save=Enregistrer
 dates.table.empty=Aucune date ne peut \u00EAtre affich\u00E9es
-dates.table.end=fin
-dates.table.list=liste des participants pour la distribution de rendez-vous
+dates.table.end=Fin
+dates.table.list=Liste des participants pour la distribution de rendez-vous
 dates.table.list.delete=Enlever des participants
-dates.table.list.email=Envoyer e-mail
-dates.table.location=lieu
+dates.table.list.email=Envoyer courriel
+dates.table.location=Lieu
 dates.table.participant.email=E-mail
-dates.table.participant.email.send=\u00C9crire e-mail
+dates.table.participant.email.send=\u00C9crire courriel
 dates.table.participant.firstname=Pr\u00E9nom
 dates.table.participant.lastname=Nom
-dates.table.participant.manage=administrer
+dates.table.participant.manage=Administrer
 dates.table.participant.name=Nom
 dates.table.participant.username=Nom d'utilisateur
 dates.table.participants.num=Anz. participants
 dates.table.reserved=Places
-dates.table.run.enrolled=inscrit(e)
+dates.table.run.enrolled=Inscrit(e)
 dates.table.run.full=Occup\u00E9
 dates.table.run.no_action=-
 dates.table.run.notenrolled=Non inscrit(e)
 dates.table.sign.in=Inscription
 dates.table.sign.out=Se d\u00E9sinscrire
 dates.table.status=Statut
-dates.table.subject=titre de rendez-vous
-dates.table.timeframe=d\u00E9but - fin
+dates.table.subject=Titre de rendez-vous
+dates.table.timeframe=D\u00E9but - fin
 enrollment.error.enrolled=Inscription impossible. Un seul participant ne peut \u00EAtre inscrit que dans un seul rendez-vous.
 enrollment.error.full=Votre inscription n'a pas pu \u00EAtre compl\u00E9t\u00E9e. Cette date est d\u00E9j\u00E0 r\u00E9serv\u00E9e.
 enrollment.error.general=Une erreur inattendue s'est produite.
@@ -87,24 +62,23 @@ enrollment.error.notenrolled=Le participant ne peut pas \u00EAtre d\u00E9sinscri
 enrollment.error.persisting=Une erreur s'est produite lors de l'enregistrement. Veuillez v\u00E9rifier votre derni\u00E8re activit\u00E9.
 enrollment.warning.manual=Au moins un participant n'a pas pu \u00EAtre inscrit. Probablement le participant est d\u00E9j\u00E0 inscrit dans un autre rendez-vous.
 form.enableCancelEnroll=d\u00E9sinscription autoris\u00E9e
-form.error.format=mauvaise entr\u00E9e
+form.error.format=Mauvaise entr\u00E9e
 form.error.notempty=Veuillez remplir
 guestnoaccess.message=Cette partie du cours n'est pas accessible pour les invit\u00E9s. <p> Pour aqu\u00E9rir un acc\u00E8s vers cette partie, vous devez vous identifier via une universit\u00E9 ou vous enregistrer dans OLAT.
 guestnoaccess.title=Pas d'acc\u00E8s pour les invit\u00E9s
-
 mail.participants.add.body=*** Ceci est un message g\u00E9n\u00E9r\u00E9 automatiquement. Veuillez ne pas y r\u00E9pondre. *** \n\nVous avez \u00E9t\u00E9 inscrit par {0} {1} ({2}) \u00E0 un rendez-vous \: \n\nNomDuRendezVous\: {4}
 mail.participants.add.subject=distribution de rendez-vous\: {4}. vous avez \u00E9t\u00E9 inscrit(e).
 mail.participants.remove.body=*** Ceci est un message g\u00E9n\u00E9r\u00E9 automatiquement. Veuillez ne pas y r\u00E9pondre. *** \n\nVous avez \u00E9t\u00E9 d\u00E9sinscrit par {0} {1} ({2}) \u00E0 un rendez-vous \: \n\nNomDuRendezVous\: {4}\n\nEn cas de questions, veuillez contacter s.v.p. {0} {1} ({2}).
 mail.participants.remove.subject=distribution de rendez-vous\: {4}. vous avez \u00E9t\u00E9 d\u00E9sinscrit(e).
 notifications.entry=Modification d'utilisateur le {0}
 notifications.header=Attribution de la date dans le cours "{0}"
-pane.tab.denconfig=configuration
-participants=participants
-participants.add=ajouter participants
-participants.manage=g\u00E9rer participants
-participants.message=E-mail \u00E0 tous les participants
+pane.tab.denconfig=Configuration
+participants=Participants
+participants.add=Ajouter des participants
+participants.manage=G\u00E9rer les participants
+participants.message=Courriel \u00E0 tous les participants
 participants.message.empty=Veuillez faire un choix, s.v.p..
-participants.message.to=participants choisis
+participants.message.to=Participants choisis
 run.dates.enrollment=Inscription au rendez-vous
 run.enrollment.list=G\u00E9rer participants 
 table.model.duration.day=Jour
diff --git a/src/main/java/org/olat/admin/user/UserSearchFlexiController.java b/src/main/java/org/olat/admin/user/UserSearchFlexiController.java
index 3abdc12164234d998a6798710ae717660940d654..b1a69164a77d8ceddb8c243e67731ed1028e85ac 100644
--- a/src/main/java/org/olat/admin/user/UserSearchFlexiController.java
+++ b/src/main/java/org/olat/admin/user/UserSearchFlexiController.java
@@ -26,6 +26,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.BaseSecurityModule;
@@ -139,7 +140,14 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController {
 		this.multiSelection = multiSelection;
 		Roles roles = ureq.getUserSession().getRoles();
 		isAdministrativeUser = securityModule.isUserAllowedAdminProps(roles);
-		userSearchFormPropertyHandlers = userManager.getUserPropertyHandlersFor(UserSearchForm.class.getCanonicalName(), isAdministrativeUser);
+		List<UserPropertyHandler> allSearchFormPropertyHandlers = userManager.getUserPropertyHandlersFor(UserSearchForm.class.getCanonicalName(), isAdministrativeUser);
+		if(isAdministrativeUser) {
+			userSearchFormPropertyHandlers = allSearchFormPropertyHandlers.stream()
+					.filter(prop -> !UserConstants.NICKNAME.equals(prop.getName()))
+					.collect(Collectors.toList());
+		} else {
+			userSearchFormPropertyHandlers = allSearchFormPropertyHandlers;
+		}
 		
 		searchableOrganisations = organisationService.getOrganisations(getIdentity(), roles,
 				OrganisationRoles.valuesWithoutGuestAndInvitee());
@@ -185,7 +193,6 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController {
 			loginEl = uifactory.addTextElement("login", "search.form.login", 128, "", searchFormContainer);
 			loginEl.setVisible(isAdministrativeUser);
 
-			
 			propFormItems = new HashMap<>();
 			for (UserPropertyHandler userPropertyHandler : userSearchFormPropertyHandlers) {
 				if (userPropertyHandler == null) continue;
diff --git a/src/main/java/org/olat/admin/user/UserSearchListProvider.java b/src/main/java/org/olat/admin/user/UserSearchListProvider.java
index 86a2685af0b6d27ae09766cfe321ffda0dfcd5d0..04e024030ee76626c8d0eaba3fa887bbea4e0b7a 100644
--- a/src/main/java/org/olat/admin/user/UserSearchListProvider.java
+++ b/src/main/java/org/olat/admin/user/UserSearchListProvider.java
@@ -30,6 +30,7 @@ import org.olat.basesecurity.IdentityShort;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.control.generic.ajax.autocompletion.ListProvider;
 import org.olat.core.gui.control.generic.ajax.autocompletion.ListReceiver;
+import org.olat.core.gui.util.CSSHelper;
 import org.olat.core.id.Organisation;
 import org.olat.core.id.UserConstants;
 import org.olat.user.UserManager;
@@ -81,9 +82,9 @@ public class UserSearchListProvider implements ListProvider {
 			maxEntries--;
 			IdentityShort ident = it_res.next();
 			String key = ident.getKey().toString();
-			String displayKey = ident.getName();
+			String displayKey = ident.getNickName();
 			String displayText = userManager.getUserDisplayName(ident);
-			receiver.addEntry(key, displayKey, displayText, null);
+			receiver.addEntry(key, displayKey, displayText, CSSHelper.CSS_CLASS_USER);
 		}
 		if(hasMore){
 			receiver.addEntry(".....",".....");
diff --git a/src/main/java/org/olat/basesecurity/IdentityShort.java b/src/main/java/org/olat/basesecurity/IdentityShort.java
index 4dbbea366133dc920b96da068a6e80d378f3ae80..80fcfbe102431aaaf30f20826f797ccc04cbd187 100644
--- a/src/main/java/org/olat/basesecurity/IdentityShort.java
+++ b/src/main/java/org/olat/basesecurity/IdentityShort.java
@@ -71,10 +71,14 @@ public class IdentityShort implements Persistable, IdentityNames {
 	private Date lastLogin;
 	@Column(name="id_status", nullable=true, unique=false, insertable=false, updatable=false)
 	private int status;
+	@Column(name="id_external", nullable=true, unique=false, insertable=false, updatable=false)
+	private String externalId;
 	@Column(name="first_name", nullable=true, unique=false, insertable=false, updatable=false)
 	private String firstName;
 	@Column(name="last_name", nullable=true, unique=false, insertable=false, updatable=false)
 	private String lastName;
+	@Column(name="nick_name", nullable=true, unique=false, insertable=false, updatable=false)
+	private String nickName;
 	@Column(name="email", nullable=true, unique=false, insertable=false, updatable=false)
 	private String email;
 
@@ -92,6 +96,10 @@ public class IdentityShort implements Persistable, IdentityNames {
 		return name;
 	}
 
+	public String getExternalId() {
+		return externalId;
+	}
+
 	public Date getLastLogin() {
 		return lastLogin;
 	}
@@ -110,6 +118,10 @@ public class IdentityShort implements Persistable, IdentityNames {
 		return lastName;
 	}
 
+	public String getNickName() {
+		return nickName;
+	}
+
 	public String getEmail() {
 		return email;
 	}
diff --git a/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java b/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java
index 15fd5fd2a535eca16aedafc4031fa65420cf907c..d4d1493d79b2e89f6a6b2095cf6958c9399e7f74 100644
--- a/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java
+++ b/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java
@@ -370,28 +370,14 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie
 		}
 		// append query for login
 		if (params.getLogin() != null) {
-			if (params.getLogin().contains("_") && dbInstance.isOracle()) {
-				//oracle needs special ESCAPE sequence to search for escaped strings
-				sb.append(" lower(ident.name) like :login ESCAPE '\\'");
-			} else if (dbInstance.isMySQL()) {
-				sb.append(" ident.name like :login");
-			} else {
-				sb.append(" lower(ident.name) like :login");
-			}
-			
+			sb.append("(");
+			PersistenceHelper.appendFuzzyLike(sb, "ident.name", "login", dbInstance.getDbVendor());
+			sb.append(" or ");
+			PersistenceHelper.appendFuzzyLike(sb, "user.nickName", "login", dbInstance.getDbVendor());
 			sb.append(" or exists (select auth from ").append(AuthenticationImpl.class.getName()).append(" as auth")
 			  .append("  where ident.key=auth.identity.key and");
-			
-			if (params.getLogin().contains("_") && dbInstance.isOracle()) {
-				//oracle needs special ESCAPE sequence to search for escaped strings
-				sb.append(" lower(auth.authusername) like :login ESCAPE '\\'");
-			} else if (dbInstance.isMySQL()) {
-				sb.append(" auth.authusername like :login");
-			} else {
-				sb.append(" lower(auth.authusername) like :login");
-			}
-			
-			sb.append(")");
+			PersistenceHelper.appendFuzzyLike(sb, "auth.authusername", "login", dbInstance.getDbVendor());
+			sb.append("))");
 			
 			// if user fields follow a join element is needed
 			needsUserPropertiesJoin = true;
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/AutoCompleterRenderer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/AutoCompleterRenderer.java
index cba7f1a74f3a0b5b7732cab6f899f6cc43e84d52..6404937b90cbf9dcc8f7dfb6fda50b02db8ba376 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/AutoCompleterRenderer.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/AutoCompleterRenderer.java
@@ -54,7 +54,6 @@ public class AutoCompleterRenderer extends DefaultComponentRenderer {
 		final int inputSize = 72;
 		String id = autoCompleter.getFormDispatchId();
 		if(autoCompleter.isEnabled()) {
-			boolean showDisplayKey = false;
 			String mapperUri = autoCompleter.getMapperUri();
 			int minLength = autoCompleter.getMinLength();
 			StringOutput command = new StringOutput(64);
@@ -80,13 +79,9 @@ public class AutoCompleterRenderer extends DefaultComponentRenderer {
 			  .append("     filter: function ( response ) {\n")
 			  .append("      return jQuery.map(response, function (object) {\n")
 			  .append("		  return {\n")
-			  .append("			value: '' + object.key,\n");
-			if(showDisplayKey) {
-				sb.append("       fullName: object.displayKey + ': ' + object.value\n");
-			} else {
-				sb.append("       fullName: object.value\n");
-			}
-			sb.append("         };\n")
+			  .append("			value: '' + object.key,\n")
+			  .append("         fullName: object.value\n")
+			  .append("         };\n")
 			  .append("       });\n")
 			  .append("     }\n")
 			  .append("   }\n")
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableCustomRenderer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableCustomRenderer.java
index 7ce7eb7722a9c8034e91c3c58b8725a2e001e4d0..f3f8ee400eb67e9dccebedcf939c41e866d67676 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableCustomRenderer.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableCustomRenderer.java
@@ -21,7 +21,6 @@ package org.olat.core.gui.components.form.flexible.impl.elements.table;
 
 
 import org.olat.core.gui.components.Component;
-import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.impl.FormDecorator;
 import org.olat.core.gui.components.form.flexible.impl.FormJSHelper;
@@ -39,7 +38,7 @@ import org.olat.core.util.StringHelper;
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
-class FlexiTableCustomRenderer extends AbstractFlexiTableRenderer implements ComponentRenderer {
+class FlexiTableCustomRenderer extends AbstractFlexiTableRenderer {
 
 	@Override
 	public void render(Renderer renderer, StringOutput sb, Component source, URLBuilder ubu, Translator translator,
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java
index f91f0ee33198d0f37dd438f5dfe08b048e5f093f..3c9c8d470c27c0d752d81a109a6f9ced6a3f3087 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java
@@ -40,7 +40,6 @@ import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.ComponentEventListener;
 import org.olat.core.gui.components.choice.Choice;
 import org.olat.core.gui.components.form.flexible.FormItem;
-import org.olat.core.gui.components.form.flexible.FormItemCollection;
 import org.olat.core.gui.components.form.flexible.elements.AutoCompleter;
 import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement;
 import org.olat.core.gui.components.form.flexible.elements.FlexiTableFilter;
@@ -80,7 +79,7 @@ import org.olat.core.util.prefs.Preferences;
  * @author Christian Guretzki
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  */
-public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableElement, FormItemCollection,
+public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableElement,
 	ControllerEventListener, ComponentEventListener, Disposable {
 	
 	//settings
diff --git a/src/main/java/org/olat/course/assessment/ui/tool/AssessedIdentityListProvider.java b/src/main/java/org/olat/course/assessment/ui/tool/AssessedIdentityListProvider.java
index 2d65f8cd4a8a717744afa016ab187a77484057ba..ff34e922b2b3f423159db23a69bc037e786ba1c6 100644
--- a/src/main/java/org/olat/course/assessment/ui/tool/AssessedIdentityListProvider.java
+++ b/src/main/java/org/olat/course/assessment/ui/tool/AssessedIdentityListProvider.java
@@ -84,7 +84,7 @@ public class AssessedIdentityListProvider implements ListProvider {
 			maxEntries--;
 			IdentityShort ident = it_res.next();
 			String key = ident.getKey().toString();
-			String displayKey = ident.getName();//TODO username
+			String displayKey = ident.getNickName();
 			String displayText = userManager.getUserDisplayName(ident);
 			receiver.addEntry(key, displayKey, displayText, CSSHelper.CSS_CLASS_USER);
 		}					
diff --git a/src/main/java/org/olat/modules/coach/ui/StudentListProvider.java b/src/main/java/org/olat/modules/coach/ui/StudentListProvider.java
index bfc7f5f448fe5f62c19f31212e62f1a74fae4da5..b4c6c9c40aa2360f4015c78711db9703bdd6bea8 100644
--- a/src/main/java/org/olat/modules/coach/ui/StudentListProvider.java
+++ b/src/main/java/org/olat/modules/coach/ui/StudentListProvider.java
@@ -60,7 +60,6 @@ public class StudentListProvider implements ListProvider {
 			if(contains(searchValue, entry)) {
 				maxEntries--;
 				String key = entry.getIdentityKey().toString();
-				String displayKey = null;//TODO username was name
 				String displayText = userManager.getUserDisplayName(entry.getIdentityKey());
 				receiver.addEntry(key, null, displayText, CSSHelper.CSS_CLASS_USER);
 			}
diff --git a/src/main/java/org/olat/modules/coach/ui/StudentsTableDataModel.java b/src/main/java/org/olat/modules/coach/ui/StudentsTableDataModel.java
index aef29ab595f5e6ba7d7333b4cdbbf42308281efa..d0872c6a0fbe7efbd0907da9f2fd5660f9227cba 100644
--- a/src/main/java/org/olat/modules/coach/ui/StudentsTableDataModel.java
+++ b/src/main/java/org/olat/modules/coach/ui/StudentsTableDataModel.java
@@ -47,6 +47,7 @@ public class StudentsTableDataModel extends DefaultFlexiTableDataModel<StudentSt
 	implements SortableFlexiTableDataModel<StudentStatEntry> {
 	
 	private static final Logger log = Tracing.createLoggerFor(StudentsTableDataModel.class);
+	private static final Columns[] COLS = Columns.values();
 
 	private List<StudentStatEntry> backupList;
 	
@@ -92,9 +93,9 @@ public class StudentsTableDataModel extends DefaultFlexiTableDataModel<StudentSt
 	
 	@Override
 	public Object getValueAt(StudentStatEntry student, int col) {
-		if(col >= 0 && col < Columns.values().length) {
+		if(col >= 0 && col < COLS.length) {
 			int countRepo = student.getCountRepo();
-			switch(Columns.getValueAt(col)) {
+			switch(COLS[col]) {
 				case countCourse: return Integer.valueOf(countRepo);
 				case initialLaunch: {
 					if(countRepo == 0) {
@@ -134,6 +135,7 @@ public class StudentsTableDataModel extends DefaultFlexiTableDataModel<StudentSt
 					}
 					return new LightedValue(passed, light);
 				}
+				default: return "ERROR";
 			}
 		}
 
diff --git a/src/main/java/org/olat/modules/lecture/manager/LectureBlockRollCallDAO.java b/src/main/java/org/olat/modules/lecture/manager/LectureBlockRollCallDAO.java
index e50a7b4205d78af19621472654ef31431fc2f764..0d1da581f97d0217eb227520e52a80f5c9145403 100644
--- a/src/main/java/org/olat/modules/lecture/manager/LectureBlockRollCallDAO.java
+++ b/src/main/java/org/olat/modules/lecture/manager/LectureBlockRollCallDAO.java
@@ -852,28 +852,13 @@ public class LectureBlockRollCallDAO {
 		if(StringHelper.containsNonWhitespace(params.getLogin())) {
 			String login = PersistenceHelper.makeFuzzyQueryString(params.getLogin());
 			
-			sb.append(" and (");
-			if (login.contains("_") && dbInstance.isOracle()) {
-				//oracle needs special ESCAPE sequence to search for escaped strings
-				sb.append("lower(ident.name) like :login ESCAPE '\\'");
-			} else if (dbInstance.isMySQL()) {
-				sb.append("ident.name like :login");
-			} else {
-				sb.append("lower(ident.name) like :login");
-			}
-			
+			sb.append(" and (");	
+			PersistenceHelper.appendFuzzyLike(sb, "ident.name", "login", dbInstance.getDbVendor());
+			sb.append(" or ");
+			PersistenceHelper.appendFuzzyLike(sb, "user.nickName", "login", dbInstance.getDbVendor());
 			sb.append(" or exists (select auth from ").append(AuthenticationImpl.class.getName()).append(" as auth")
 			  .append("  where ident.key=auth.identity.key and");
-			
-			if (params.getLogin().contains("_") && dbInstance.isOracle()) {
-				//oracle needs special ESCAPE sequence to search for escaped strings
-				sb.append(" lower(auth.authusername) like :login ESCAPE '\\'");
-			} else if (dbInstance.isMySQL()) {
-				sb.append(" auth.authusername like :login");
-			} else {
-				sb.append(" lower(auth.authusername) like :login");
-			}
-			
+			PersistenceHelper.appendFuzzyLike(sb, "auth.authusername", "login", dbInstance.getDbVendor());
 			sb.append("))");
 			
 			queryParams.put("login", login);
@@ -897,14 +882,8 @@ public class LectureBlockRollCallDAO {
 					}
 				}
 				
-				if(dbInstance.isMySQL()) {
-					sb.append(" and user.").append(handler.getName()).append(" like :").append(qName);
-				} else {
-					sb.append(" and lower(user.").append(handler.getName()).append(") like :").append(qName);
-					if(dbInstance.isOracle()) {
-						sb.append(" escape '\\'");
-					}
-				}
+				sb.append(" and ");
+				PersistenceHelper.appendFuzzyLike(sb, "user.".concat(handler.getName()), qName, dbInstance.getDbVendor());
 				queryParams.put(qName, PersistenceHelper.makeFuzzyQueryString(propValue));
 			}
 		}
diff --git a/src/main/java/org/olat/modules/lecture/ui/coach/LecturesSearchFormController.java b/src/main/java/org/olat/modules/lecture/ui/coach/LecturesSearchFormController.java
index ee7bec4197b65c0b5a35a4c57c699224b6dcc9a2..d10fef867e3a65716931d6e36117f78956bb369e 100644
--- a/src/main/java/org/olat/modules/lecture/ui/coach/LecturesSearchFormController.java
+++ b/src/main/java/org/olat/modules/lecture/ui/coach/LecturesSearchFormController.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import org.olat.basesecurity.BaseSecurityModule;
 import org.olat.basesecurity.OrganisationModule;
@@ -42,6 +43,7 @@ import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.id.OrganisationRef;
 import org.olat.core.id.Roles;
+import org.olat.core.id.UserConstants;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.modules.lecture.model.LectureStatisticsSearchParameters;
@@ -67,9 +69,11 @@ public class LecturesSearchFormController extends FormBasicController {
 	private TextElement login;
 	private TextElement bulkEl;
 	private FormLink searchButton;
-	private DateChooser startDateEl, endDateEl;
+	private DateChooser startDateEl;
+	private DateChooser endDateEl;
 	private FormLayoutContainer privateDatesCont;
-	private SingleSelection dateTypesEl, publicDatesEl;
+	private SingleSelection dateTypesEl;
+	private SingleSelection publicDatesEl;
 
 	private final boolean admin;
 	private final boolean adminProps;
@@ -110,7 +114,14 @@ public class LecturesSearchFormController extends FormBasicController {
 		login = uifactory.addTextElement("login", "search.form.login", 128, "", formLayout);
 		login.setVisible(adminProps);
 		
-		userPropertyHandlers = userManager.getUserPropertyHandlersFor(PROPS_IDENTIFIER, adminProps);
+		List<UserPropertyHandler> allPropertyHandlers = userManager.getUserPropertyHandlersFor(PROPS_IDENTIFIER, adminProps);
+		if(adminProps) {
+			userPropertyHandlers = allPropertyHandlers.stream()
+					.filter(prop -> !UserConstants.NICKNAME.equals(prop.getName()))
+					.collect(Collectors.toList());
+		} else {
+			userPropertyHandlers = allPropertyHandlers;
+		}
 
 		for (UserPropertyHandler userPropertyHandler : userPropertyHandlers) {
 			if (userPropertyHandler != null) {
diff --git a/src/main/java/org/olat/user/PreferencesFormController.java b/src/main/java/org/olat/user/PreferencesFormController.java
index 5da21938aeeed848f89b954d96da91fcbc5d3adc..a7758c48e2484b6549bcacb51a3621d3060ad965 100644
--- a/src/main/java/org/olat/user/PreferencesFormController.java
+++ b/src/main/java/org/olat/user/PreferencesFormController.java
@@ -27,6 +27,7 @@ import java.util.Set;
 
 import org.olat.admin.user.SystemRolesAndRightsController;
 import org.olat.basesecurity.BaseSecurity;
+import org.olat.basesecurity.BaseSecurityModule;
 import org.olat.core.commons.services.notifications.NotificationsManager;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
@@ -63,7 +64,12 @@ import org.springframework.beans.factory.annotation.Autowired;
  */
 public class PreferencesFormController extends FormBasicController {
 	private Identity tobeChangedIdentity;
-	private SingleSelection language, charset, notificationInterval, mailSystem;
+	
+	private SingleSelection charset;
+	private SingleSelection language;
+	private SingleSelection mailSystem;
+	private SingleSelection notificationInterval;
+	
 	private static final String[] mailIntern = new String[]{"intern.only","send.copy"};
 	
 	@Autowired
@@ -77,6 +83,8 @@ public class PreferencesFormController extends FormBasicController {
 	@Autowired
 	private BaseSecurity securityManager;
 	@Autowired
+	private BaseSecurityModule securityModule;
+	@Autowired
 	private NotificationsManager notificiationMgr;
 
 	/**
@@ -132,9 +140,13 @@ public class PreferencesFormController extends FormBasicController {
 		
 		// load preferences
 		Preferences prefs = tobeChangedIdentity.getUser().getPreferences();
-
+		
 		// Username
-		StaticTextElement username = uifactory.addStaticTextElement("form.username", tobeChangedIdentity.getName(), formLayout);
+		String name = securityManager.findAuthenticationName(tobeChangedIdentity);
+		if(!StringHelper.containsNonWhitespace(name) && !securityModule.isIdentityNameAutoGenerated()) {
+			name = tobeChangedIdentity.getName();
+		}
+		StaticTextElement username = uifactory.addStaticTextElement("form.username", name, formLayout);
 		username.setElementCssClass("o_sel_home_settings_username");
 		username.setEnabled(false);
 		
@@ -227,8 +239,8 @@ public class PreferencesFormController extends FormBasicController {
 		final FormLayoutContainer buttonLayout = FormLayoutContainer.createButtonLayout("button_layout", getTranslator());
 		formLayout.add(buttonLayout);
 		buttonLayout.setElementCssClass("o_sel_home_settings_prefs_buttons");
-		uifactory.addFormSubmitButton("submit", buttonLayout);
 		uifactory.addFormCancelButton("cancel", buttonLayout, ureq, getWindowControl());
+		uifactory.addFormSubmitButton("submit", buttonLayout);
 	}
 
 	@Override
diff --git a/src/main/resources/database/mysql/alter_15_1_x_to_15_2_0.sql b/src/main/resources/database/mysql/alter_15_1_x_to_15_2_0.sql
index fb3b2fa6aa6a5245e6d19c8f2361588339bfdcad..fdd3b6f7beb8fb27ef489ad1e6c76e2367ef4af8 100644
--- a/src/main/resources/database/mysql/alter_15_1_x_to_15_2_0.sql
+++ b/src/main/resources/database/mysql/alter_15_1_x_to_15_2_0.sql
@@ -1,5 +1,21 @@
 alter table o_user add column u_nickname varchar(255);
 
+drop view o_bs_identity_short_v;
+create view o_bs_identity_short_v as (
+   select
+      ident.id as id_id,
+      ident.name as id_name,
+      ident.external_id as id_external,
+      ident.lastlogin as id_lastlogin,
+      ident.status as id_status,
+      us.user_id as us_id,
+      us.u_firstname as first_name,
+      us.u_lastname as last_name,
+      us.u_nickname as nick_name,
+      us.u_email as email
+   from o_bs_identity as ident
+   inner join o_user as us on (ident.id = us.fk_identity)
+);
 
 -- BigBlueButton
 create table o_bbb_attendee (
diff --git a/src/main/resources/database/mysql/setupDatabase.sql b/src/main/resources/database/mysql/setupDatabase.sql
index 8aa1db8c8d391d475781d5d049efd0764ef6e649..5e4256bc4fad84cc81aee400509986a46da24a4a 100644
--- a/src/main/resources/database/mysql/setupDatabase.sql
+++ b/src/main/resources/database/mysql/setupDatabase.sql
@@ -3130,11 +3130,13 @@ create view o_bs_identity_short_v as (
    select
       ident.id as id_id,
       ident.name as id_name,
+      ident.external_id as id_external,
       ident.lastlogin as id_lastlogin,
       ident.status as id_status,
       us.user_id as us_id,
       us.u_firstname as first_name,
       us.u_lastname as last_name,
+      us.u_nickname as nick_name,
       us.u_email as email
    from o_bs_identity as ident
    inner join o_user as us on (ident.id = us.fk_identity)
diff --git a/src/main/resources/database/oracle/alter_15_1_x_to_15_2_0.sql b/src/main/resources/database/oracle/alter_15_1_x_to_15_2_0.sql
index c828293c1782b4d894b6c40c00f0e571a36ae0b1..84c2a3397ff6015e9f3920c0a5233e851283eff3 100644
--- a/src/main/resources/database/oracle/alter_15_1_x_to_15_2_0.sql
+++ b/src/main/resources/database/oracle/alter_15_1_x_to_15_2_0.sql
@@ -1,5 +1,22 @@
 alter table o_user add u_nickname varchar2(255 char);
 
+drop view o_bs_identity_short_v;
+create view o_bs_identity_short_v as (
+   select
+      ident.id as id_id,
+      ident.name as id_name,
+      ident.external_id as id_external,
+      ident.lastlogin as id_lastlogin,
+      ident.status as id_status,
+      us.user_id as us_id,
+      us.u_firstname as first_name,
+      us.u_lastname as last_name,
+      us.u_nickname as nick_name,
+      us.u_email as email
+   from o_bs_identity ident
+   inner join o_user us on (ident.id = us.fk_identity)
+);
+
 
 -- BigBlueButton
 create table o_bbb_attendee (
diff --git a/src/main/resources/database/oracle/setupDatabase.sql b/src/main/resources/database/oracle/setupDatabase.sql
index 2fca15fa30c20c5607e9503c1faf11c3dcd1d672..30d2e6129cbfed22381c847b50403d0dc366fb38 100644
--- a/src/main/resources/database/oracle/setupDatabase.sql
+++ b/src/main/resources/database/oracle/setupDatabase.sql
@@ -3211,11 +3211,13 @@ create view o_bs_identity_short_v as (
    select
       ident.id as id_id,
       ident.name as id_name,
+      ident.external_id as id_external,
       ident.lastlogin as id_lastlogin,
       ident.status as id_status,
       us.user_id as us_id,
       us.u_firstname as first_name,
       us.u_lastname as last_name,
+      us.u_nickname as nick_name,
       us.u_email as email
    from o_bs_identity ident
    inner join o_user us on (ident.id = us.fk_identity)
diff --git a/src/main/resources/database/postgresql/alter_15_1_x_to_15_2_0.sql b/src/main/resources/database/postgresql/alter_15_1_x_to_15_2_0.sql
index ef307a74c64d598fa18d6d84f1d6bd1eb4348928..c5842cbe3b40e4f882339e8ace94c54069ac8d67 100644
--- a/src/main/resources/database/postgresql/alter_15_1_x_to_15_2_0.sql
+++ b/src/main/resources/database/postgresql/alter_15_1_x_to_15_2_0.sql
@@ -1,5 +1,21 @@
 alter table o_user add column u_nickname varchar(255);
 
+drop view o_bs_identity_short_v;
+create view o_bs_identity_short_v as (
+   select
+      ident.id as id_id,
+      ident.name as id_name,
+      ident.external_id as id_external,
+      ident.lastlogin as id_lastlogin,
+      ident.status as id_status,
+      us.user_id as us_id,
+      us.u_firstname as first_name,
+      us.u_lastname as last_name,
+      us.u_nickname as nick_name,
+      us.u_email as email
+   from o_bs_identity as ident
+   inner join o_user as us on (ident.id = us.fk_identity)
+);
 
 -- BigBlueButton
 create table o_bbb_attendee (
diff --git a/src/main/resources/database/postgresql/setupDatabase.sql b/src/main/resources/database/postgresql/setupDatabase.sql
index 151cc376f0f1576bddfdcc27eadb7dc748425a45..3fa447c61e9be7c15f9a68d9b225c0aa60b8228f 100644
--- a/src/main/resources/database/postgresql/setupDatabase.sql
+++ b/src/main/resources/database/postgresql/setupDatabase.sql
@@ -3152,11 +3152,13 @@ create view o_bs_identity_short_v as (
    select
       ident.id as id_id,
       ident.name as id_name,
+      ident.external_id as id_external,
       ident.lastlogin as id_lastlogin,
       ident.status as id_status,
       us.user_id as us_id,
       us.u_firstname as first_name,
       us.u_lastname as last_name,
+      us.u_nickname as nick_name,
       us.u_email as email
    from o_bs_identity as ident
    inner join o_user as us on (ident.id = us.fk_identity)