You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2018/11/28 16:59:21 UTC

[openmeetings] branch 4.0.x updated: [OPENMEETINGS-1851] display name is added and made editable by end user

This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch 4.0.x
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/4.0.x by this push:
     new ffdc21b  [OPENMEETINGS-1851] display name is added and made editable by end user
ffdc21b is described below

commit ffdc21ba763621d19ac4e320d0a5faa8ac5ea539
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Wed Nov 28 23:53:43 2018 +0700

    [OPENMEETINGS-1851] display name is added and made editable by end user
---
 .../openmeetings/core/util/WebSocketHelper.java    |  5 +--
 .../db/dao/basic/ConfigurationDao.java             | 10 +++++
 .../apache/openmeetings/db/dao/label/LabelDao.java | 47 +++++++++++++---------
 .../openmeetings/db/entity/label/OmLanguage.java   | 43 ++++++++++++++++++++
 .../apache/openmeetings/db/entity/user/User.java   | 35 ++++++++++++++++
 .../apache/openmeetings/db/util/FormatHelper.java  | 16 --------
 .../installation/ImportInitvalues.java             |  2 +
 .../openmeetings/util/OpenmeetingsVariables.java   | 10 +++++
 .../web/app/Application.properties.xml             |  1 +
 .../web/app/Application_ar.properties.xml          |  1 +
 .../web/app/Application_bg.properties.xml          |  1 +
 .../web/app/Application_bn.properties.xml          |  1 +
 .../web/app/Application_ca.properties.xml          |  1 +
 .../web/app/Application_cs.properties.xml          |  1 +
 .../web/app/Application_da.properties.xml          |  1 +
 .../web/app/Application_de.properties.xml          |  1 +
 .../web/app/Application_el.properties.xml          |  1 +
 .../web/app/Application_es.properties.xml          |  1 +
 .../web/app/Application_fa.properties.xml          |  1 +
 .../web/app/Application_fi.properties.xml          |  1 +
 .../web/app/Application_fr.properties.xml          |  1 +
 .../web/app/Application_gl.properties.xml          |  1 +
 .../web/app/Application_he.properties.xml          |  1 +
 .../web/app/Application_hu.properties.xml          |  1 +
 .../web/app/Application_in.properties.xml          |  1 +
 .../web/app/Application_it.properties.xml          |  1 +
 .../web/app/Application_ja.properties.xml          |  1 +
 .../web/app/Application_ko.properties.xml          |  1 +
 .../web/app/Application_nl.properties.xml          |  1 +
 .../web/app/Application_pl.properties.xml          |  1 +
 .../web/app/Application_pt.properties.xml          |  1 +
 .../web/app/Application_pt_BR.properties.xml       |  1 +
 .../web/app/Application_ru.properties.xml          |  1 +
 .../web/app/Application_sk.properties.xml          |  1 +
 .../web/app/Application_sv.properties.xml          |  1 +
 .../web/app/Application_th.properties.xml          |  1 +
 .../web/app/Application_tr.properties.xml          |  1 +
 .../web/app/Application_uk.properties.xml          |  1 +
 .../web/app/Application_zh_CN.properties.xml       |  1 +
 .../web/app/Application_zh_TW.properties.xml       |  1 +
 .../openmeetings/web/common/GeneralUserForm.html   |  3 ++
 .../openmeetings/web/common/GeneralUserForm.java   |  2 +
 .../openmeetings/web/user/chat/ChatForm.java       |  3 +-
 43 files changed, 168 insertions(+), 40 deletions(-)

diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/WebSocketHelper.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/WebSocketHelper.java
index 851ae99..59c2a56 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/WebSocketHelper.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/WebSocketHelper.java
@@ -19,7 +19,6 @@
 package org.apache.openmeetings.core.util;
 
 import static org.apache.openmeetings.core.remote.ScopeApplicationAdapter.getApp;
-import static org.apache.openmeetings.db.util.FormatHelper.getDisplayName;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getWebAppRootKey;
 
 import java.io.IOException;
@@ -71,7 +70,7 @@ public class WebSocketHelper {
 		if (m.getToUser() != null) {
 			User u = curUserId == m.getToUser().getId() ? m.getFromUser() : m.getToUser();
 			scope = ID_USER_PREFIX + u.getId();
-			scopeName = getDisplayName(u);
+			scopeName = u.getDisplayName();
 		} else if (m.getToRoom() != null) {
 			scope = ID_ROOM_PREFIX + m.getToRoom().getId();
 			o.put("needModeration", m.isNeedModeration());
@@ -92,7 +91,7 @@ public class WebSocketHelper {
 			JSONObject from = new JSONObject()
 					.put("id", m.getFromUser().getId())
 					.put("displayName", m.getFromName())
-					.put("name", getDisplayName(m.getFromUser()));
+					.put("name", m.getFromUser().getDisplayName());
 			if (uFmt != null) {
 				uFmt.accept(from, m.getFromUser());
 			}
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
index d070934..c24d186 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
@@ -27,6 +27,7 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_CRYPT;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_GROUP_ID;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_LANG;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_TIMEZONE;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DISPLAY_NAME_EDITABLE;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_EMAIL_AT_REGISTER;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_EMAIL_VERIFICATION;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_EXT_PROCESS_TTL;
@@ -88,6 +89,7 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.setChatSenndOnE
 import static org.apache.openmeetings.util.OpenmeetingsVariables.setCryptClassName;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.setDefaultGroup;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.setDefaultLang;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.setDisplayNameEditable;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.setExtProcessTtl;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.setGaCode;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.setMaxUploadSize;
@@ -413,6 +415,9 @@ public class ConfigurationDao implements IDataProviderDao<Configuration> {
 			case CONFIG_EMAIL_AT_REGISTER:
 				reloadSendRegisterEmail();
 				break;
+			case CONFIG_DISPLAY_NAME_EDITABLE:
+				reloadDisplayNameEditable();
+				break;
 		}
 		return entity;
 	}
@@ -536,6 +541,10 @@ public class ConfigurationDao implements IDataProviderDao<Configuration> {
 		setSendRegisterEmail(getBool(CONFIG_EMAIL_AT_REGISTER, false));
 	}
 
+	private void reloadDisplayNameEditable() {
+		setDisplayNameEditable(getBool(CONFIG_DISPLAY_NAME_EDITABLE, false));
+	}
+
 	public void reinit() {
 		reloadMaxUpload();
 		reloadCrypt();
@@ -562,6 +571,7 @@ public class ConfigurationDao implements IDataProviderDao<Configuration> {
 		reloadAllowRegisterOauth();
 		reloadSendVerificationEmail();
 		reloadSendRegisterEmail();
+		reloadDisplayNameEditable();
 	}
 
 	private JSONObject reloadRoomSettings() {
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/label/LabelDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/label/LabelDao.java
index eda257c..e2a9ea7 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/label/LabelDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/label/LabelDao.java
@@ -18,6 +18,10 @@
  */
 package org.apache.openmeetings.db.dao.label;
 
+import static java.util.Locale.ENGLISH;
+import static java.util.Locale.ROOT;
+import static java.util.ResourceBundle.Control.FORMAT_PROPERTIES;
+import static java.util.ResourceBundle.Control.getControl;
 import static org.apache.openmeetings.db.util.ApplicationHelper._ensureApplication;
 import static org.apache.openmeetings.db.util.DaoHelper.UNSUPPORTED;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getWebAppRootKey;
@@ -39,9 +43,11 @@ import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
 
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.openmeetings.db.dao.IDataProviderDao;
+import org.apache.openmeetings.db.entity.label.OmLanguage;
 import org.apache.openmeetings.db.entity.label.StringLabel;
 import org.apache.openmeetings.util.OmFileHelper;
 import org.apache.openmeetings.util.XmlExport;
@@ -64,9 +70,9 @@ public class LabelDao implements IDataProviderDao<StringLabel>{
 	private static final Logger log = Red5LoggerFactory.getLogger(LabelDao.class, getWebAppRootKey());
 	private static final String ENTRY_ELEMENT = "entry";
 	private static final String KEY_ATTR = "key";
-	public static final String APP_RESOURCES_EN = "Application.properties.xml";
-	public static final String APP_RESOURCES = "Application_%s.properties.xml";
-	private static final LinkedHashMap<Long, Locale> languages = new LinkedHashMap<>();
+	public static final String APP_RESOURCES_PREFIX = "Application";
+	public static final String APP_RESOURCES_SUFFIX = ".properties.xml";
+	private static final LinkedHashMap<Long, OmLanguage> languages = new LinkedHashMap<>();
 	private static final ConcurrentHashMap<Locale, List<StringLabel>> labelCache = new ConcurrentHashMap<>();
 	private static final Set<String> keys = new HashSet<>();
 	private static Class<?> appClass = null;
@@ -74,18 +80,18 @@ public class LabelDao implements IDataProviderDao<StringLabel>{
 	private static void storeLanguages() throws Exception {
 		Document d = XmlExport.createDocument();
 		Element r = XmlExport.createRoot(d, "language");
-		for (Map.Entry<Long, Locale> e : languages.entrySet()) {
-			r.addElement("lang").addAttribute("id", "" + e.getKey()).addAttribute("code", e.getValue().toLanguageTag());
+		for (Map.Entry<Long, OmLanguage> e : languages.entrySet()) {
+			r.addElement("lang").addAttribute("id", "" + e.getKey()).addAttribute("code", e.getValue().getLocale().toLanguageTag());
 		}
 		XmlExport.toXml(getLangFile(), d);
 	}
 
 	public static void add(Locale l) throws Exception {
 		long id = 0L;
-		for (Map.Entry<Long, Locale> e : languages.entrySet()) {
+		for (Map.Entry<Long, OmLanguage> e : languages.entrySet()) {
 			id = e.getKey();
 		}
-		languages.put(id + 1, l);
+		languages.put(id + 1, new OmLanguage(l));
 		storeLanguages();
 		labelCache.put(l, new ArrayList<StringLabel>());
 	}
@@ -120,7 +126,7 @@ public class LabelDao implements IDataProviderDao<StringLabel>{
 				if (id == 3L) {
 					continue;
 				}
-				languages.put(id, Locale.forLanguageTag(code));
+				languages.put(id, new OmLanguage(Locale.forLanguageTag(code)));
 			}
 		} catch (Exception e) {
 			log.error("Error while building language map");
@@ -128,11 +134,8 @@ public class LabelDao implements IDataProviderDao<StringLabel>{
 	}
 
 	public static String getLabelFileName(Locale l) {
-		String name = APP_RESOURCES_EN;
-		if (!Locale.ENGLISH.equals(l)) {
-			name = String.format(APP_RESOURCES, l.toLanguageTag().replace('-', '_'));
-		}
-		return name;
+		String name = getControl(FORMAT_PROPERTIES).toBundleName(APP_RESOURCES_PREFIX, ENGLISH.equals(l) ? ROOT : l);
+		return String.format("%s%s", name, APP_RESOURCES_SUFFIX);
 	}
 
 	private static void storeLabels(Locale l) throws Exception {
@@ -209,14 +212,19 @@ public class LabelDao implements IDataProviderDao<StringLabel>{
 		throw UNSUPPORTED;
 	}
 
+	public static OmLanguage getLanguage(Long id) {
+		OmLanguage l = id == null ? null : languages.get(id);
+		return l == null ? languages.get(1L) : l;
+	}
+
 	public static Locale getLocale(Long id) {
-		return languages.get(id);
+		return getLanguage(id).getLocale();
 	}
 
 	public static Long getLanguage(Locale loc, Long def) {
 		if (loc != null) {
-			for (Map.Entry<Long, Locale> e : languages.entrySet()) {
-				if (loc.equals(e.getValue())) {
+			for (Map.Entry<Long, OmLanguage> e : languages.entrySet()) {
+				if (loc.equals(e.getValue().getLocale())) {
 					return e.getKey();
 				}
 			}
@@ -225,7 +233,8 @@ public class LabelDao implements IDataProviderDao<StringLabel>{
 	}
 
 	public static Set<Map.Entry<Long, Locale>> getLanguages() {
-		return languages.entrySet();
+		return languages.entrySet().stream()
+				.collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue().getLocale())).entrySet();
 	}
 
 	public static List<StringLabel> get(Locale l, final String search, long start, long count, final SortParam<String> sort) {
@@ -280,8 +289,8 @@ public class LabelDao implements IDataProviderDao<StringLabel>{
 	}
 
 	public static void delete(Locale l) {
-		for (Map.Entry<Long, Locale> e : languages.entrySet()) {
-			if (e.getValue().equals(l)) {
+		for (Map.Entry<Long, OmLanguage> e : languages.entrySet()) {
+			if (e.getValue().getLocale().equals(l)) {
 				languages.remove(e.getKey());
 				break;
 			}
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/label/OmLanguage.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/label/OmLanguage.java
new file mode 100644
index 0000000..165e552
--- /dev/null
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/label/OmLanguage.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.db.entity.label;
+
+import java.io.Serializable;
+import java.util.Locale;
+
+import org.apache.openmeetings.db.util.FormatHelper;
+
+public class OmLanguage implements Serializable {
+	private static final long serialVersionUID = 1L;
+	private final Locale locale;
+	private final boolean rtl;
+
+	public OmLanguage(Locale locale) {
+		this.locale = locale;
+		this.rtl = FormatHelper.isRtlLanguage(locale.toLanguageTag());
+	}
+
+	public Locale getLocale() {
+		return locale;
+	}
+
+	public boolean isRtl() {
+		return rtl;
+	}
+}
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
index 5090e75..ec33095 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
@@ -20,6 +20,7 @@ package org.apache.openmeetings.db.entity.user;
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getSipContext;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.isSipEnabled;
+import static org.apache.wicket.util.string.Strings.escapeMarkup;
 
 import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
@@ -56,10 +57,13 @@ import org.apache.openjpa.persistence.FetchGroup;
 import org.apache.openjpa.persistence.FetchGroups;
 import org.apache.openjpa.persistence.LoadFetchGroup;
 import org.apache.openjpa.persistence.jdbc.ForeignKey;
+import org.apache.openmeetings.db.dao.label.LabelDao;
 import org.apache.openmeetings.db.entity.HistoricalEntity;
+import org.apache.openmeetings.db.entity.label.OmLanguage;
 import org.apache.openmeetings.db.entity.server.Sessiondata;
 import org.apache.openmeetings.util.crypt.CryptProvider;
 import org.apache.openmeetings.util.crypt.MD5;
+import org.apache.wicket.util.string.Strings;
 import org.simpleframework.xml.Element;
 import org.simpleframework.xml.ElementList;
 import org.simpleframework.xml.Root;
@@ -194,6 +198,10 @@ public class User extends HistoricalEntity {
 	@Element(data = true, required = false)
 	private String lastname;
 
+	@Column(name = "displayName")
+	@Element(data = true, required = false)
+	private String displayName;
+
 	@Column(name = "login")
 	@Element(data = true, required = false)
 	private String login;
@@ -361,6 +369,17 @@ public class User extends HistoricalEntity {
 		return this;
 	}
 
+	public String getDisplayName() {
+		return Strings.isEmpty(displayName) ? generateDisplayName() : displayName;
+	}
+
+	public User setDisplayName(String displayName) {
+		if (!Strings.isEmpty(displayName)) {
+			this.displayName = escapeMarkup(displayName).toString();
+		}
+		return this;
+	}
+
 	public String getLogin() {
 		return login;
 	}
@@ -587,4 +606,20 @@ public class User extends HistoricalEntity {
 				+ ", externalId=" + externalId + ", externalType=" + externalType
 				+ ", type=" + type + "]";
 	}
+
+	private String generateDisplayName() {
+		StringBuilder sb = new StringBuilder();
+		String delim = "";
+		OmLanguage l = LabelDao.getLanguage(languageId);
+		String first = l.isRtl() ? getLastname() : getFirstname();
+		String last = l.isRtl() ? getFirstname() : getLastname();
+		if (!Strings.isEmpty(first)) {
+			sb.append(first);
+			delim = " ";
+		}
+		if (!Strings.isEmpty(last)) {
+			sb.append(delim).append(last);
+		}
+		return escapeMarkup(sb).toString();
+	}
 }
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/FormatHelper.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/FormatHelper.java
index 4787c2b..59b58fd 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/FormatHelper.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/FormatHelper.java
@@ -21,7 +21,6 @@ package org.apache.openmeetings.db.util;
 import static java.text.DateFormat.SHORT;
 import static org.apache.commons.text.StringEscapeUtils.escapeHtml4;
 import static org.apache.openmeetings.db.util.TimezoneUtil.getTimeZone;
-import static org.apache.wicket.util.string.Strings.escapeMarkup;
 
 import java.util.regex.Pattern;
 
@@ -74,21 +73,6 @@ public class FormatHelper {
 		return formatUser(u, false);
 	}
 
-	public static String getDisplayName(User u) {
-		StringBuilder sb = new StringBuilder();
-		String delim = "";
-		if (u != null) {
-			if (!Strings.isEmpty(u.getFirstname())) {
-				sb.append(u.getFirstname());
-				delim = " ";
-			}
-			if (!Strings.isEmpty(u.getLastname())) {
-				sb.append(delim).append(u.getLastname());
-			}
-		}
-		return escapeMarkup(sb).toString();
-	}
-
 	public static String formatUser(User u, boolean isHTMLEscape) {
 		String user = "";
 		if (u != null) {
diff --git a/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java b/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
index 773ab3d..c770c4e 100644
--- a/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
+++ b/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
@@ -35,6 +35,7 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_LANG;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_LDAP_ID;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_TIMEZONE;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DISPLAY_NAME_EDITABLE;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DOCUMENT_DPI;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DOCUMENT_QUALITY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_EMAIL_AT_REGISTER;
@@ -352,6 +353,7 @@ public class ImportInitvalues {
 		addCfg(list, CONFIG_MP4_VIDEO_PRESET, "medium", Configuration.Type.bool,
 				"Preset (encoder optimization settings) to be used while performing mp4 conversion."
 				+ "Valid values are: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow", "4.0.5");
+		addCfg(list, CONFIG_DISPLAY_NAME_EDITABLE, String.valueOf(false), Configuration.Type.bool, "Is user will be able to edit his/her display name (default false).", "4.0.7");
 		return list;
 	}
 	public void loadConfiguration(InstallationConfig cfg) {
diff --git a/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java b/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
index fb77944..49b45de 100644
--- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
+++ b/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
@@ -98,6 +98,7 @@ public class OpenmeetingsVariables {
 	public static final String CONFIG_FNAME_MIN_LENGTH = "user.fname.minimum.length";
 	public static final String CONFIG_LNAME_MIN_LENGTH = "user.lname.minimum.length";
 	public static final String CONFIG_CHAT_SEND_ON_ENTER = "chat.send.on.enter";
+	public static final String CONFIG_DISPLAY_NAME_EDITABLE = "display.name.editable";
 
 	public static final String HEADER_XFRAME_SAMEORIGIN = "SAMEORIGIN";
 	public static final String HEADER_CSP_SELF = "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' data:;";
@@ -150,6 +151,7 @@ public class OpenmeetingsVariables {
 	private static boolean allowRegisterOauth = false;
 	private static boolean sendVerificationEmail = false;
 	private static boolean sendRegisterEmail = false;
+	private static boolean displayNameEditable = false;
 
 	private OpenmeetingsVariables() {}
 
@@ -388,4 +390,12 @@ public class OpenmeetingsVariables {
 	public static void setSendRegisterEmail(boolean send) {
 		sendRegisterEmail = send;
 	}
+
+	public static boolean isDisplayNameEditable() {
+		return displayNameEditable;
+	}
+
+	public static void setDisplayNameEditable(boolean editable) {
+		displayNameEditable = editable;
+	}
 }
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.properties.xml
index 84f8617..8d1fdb4 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ar.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ar.properties.xml
index 5daa03e..71e5652 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ar.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ar.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bg.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bg.properties.xml
index dd46801..6a29c47 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bg.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bg.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bn.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bn.properties.xml
index d11de08..66a0848 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bn.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bn.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ca.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ca.properties.xml
index aa43d13..61d243d 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ca.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ca.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_cs.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_cs.properties.xml
index d07be3d..654fc22 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_cs.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_cs.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_da.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_da.properties.xml
index 9143439..2e798cf 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_da.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_da.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_de.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_de.properties.xml
index 06f8e06..f072851 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_de.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_de.properties.xml
@@ -993,4 +993,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_el.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_el.properties.xml
index ff757b1..89a9c87 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_el.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_el.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_es.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_es.properties.xml
index 17a109f..690c0fd 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_es.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_es.properties.xml
@@ -986,4 +986,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fa.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fa.properties.xml
index 0e888d7..cab423b 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fa.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fa.properties.xml
@@ -980,4 +980,5 @@ target="_blank">Custom Crypt Mechanism</a>
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fi.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fi.properties.xml
index 493c549..c94adb7 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fi.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fi.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fr.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fr.properties.xml
index da38cf6..0069c57 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fr.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fr.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_gl.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_gl.properties.xml
index aad8d7d..f70cbb1 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_gl.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_gl.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_he.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_he.properties.xml
index 84f8617..8d1fdb4 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_he.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_he.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hu.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hu.properties.xml
index dd37d52..983a7cd 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hu.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hu.properties.xml
@@ -976,4 +976,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_in.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_in.properties.xml
index f81c755..5531d74 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_in.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_in.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_it.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_it.properties.xml
index f9b16f7..1aa252a 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_it.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_it.properties.xml
@@ -989,4 +989,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ja.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ja.properties.xml
index 26b7c32..95ed780 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ja.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ja.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ko.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ko.properties.xml
index bf2e2c3..fa8e30e 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ko.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ko.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_nl.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_nl.properties.xml
index 48cacd1..dc66c30 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_nl.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_nl.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pl.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pl.properties.xml
index 3946c6c..ff73638 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pl.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pl.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt.properties.xml
index ae19071..4fc8df9 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt_BR.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt_BR.properties.xml
index ccc7823..9bef3f2 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt_BR.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt_BR.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ru.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ru.properties.xml
index d8a57f6..e8ff8b7 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ru.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ru.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Клонировать]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Ответить]]></entry>
 	<entry key="messages.subject.re"><![CDATA[На:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Отображаемое имя]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sk.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sk.properties.xml
index 975822a..bb58795 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sk.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sk.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sv.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sv.properties.xml
index 7ea0dfa..4e575e3 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sv.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sv.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_th.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_th.properties.xml
index 313eeeb..7f1aa1e 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_th.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_th.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tr.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tr.properties.xml
index edaaa6b..62b2093 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tr.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tr.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_uk.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_uk.properties.xml
index 6e4be28..5e8618c 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_uk.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_uk.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_CN.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_CN.properties.xml
index f7755a5..76aceaf 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_CN.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_CN.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_TW.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_TW.properties.xml
index 2e605d7..c062614 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_TW.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_TW.properties.xml
@@ -988,4 +988,5 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="poll.clone"><![CDATA[Clone]]></entry>
 	<entry key="messages.btn.reply"><![CDATA[Reply]]></entry>
 	<entry key="messages.subject.re"><![CDATA[Re:]]></entry>
+	<entry key="user.label.displayName"><![CDATA[Display name]]></entry>
 </properties>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.html
index e01e6a3..59ae1b0 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.html
@@ -32,6 +32,9 @@
 		<label wicket:for="lastname"><wicket:message key="136" /></label><input type="text" wicket:id="lastname" />
 	</div>
 	<div class="formelement">
+		<label wicket:for="displayName"><wicket:message key="user.label.displayName" /></label><input type="text" wicket:id="displayName" />
+	</div>
+	<div class="formelement">
 		<label wicket:for="timeZoneId"><wicket:message key="1143" /></label><select wicket:id="timeZoneId" />
 	</div>
 	<div class="formelement">
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
index f402f53..b2739ff 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
@@ -19,6 +19,7 @@
 package org.apache.openmeetings.web.common;
 
 import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.isDisplayNameEditable;
 import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.WebSession.AVAILABLE_TIMEZONES;
 import static org.apache.openmeetings.web.app.WebSession.getRights;
@@ -96,6 +97,7 @@ public class GeneralUserForm extends Form<User> {
 				}));
 		add(new TextField<String>("firstname"));
 		add(new TextField<String>("lastname"));
+		add(new TextField<String>("displayName").setEnabled(isAdminForm || isDisplayNameEditable()));
 		add(new DropDownChoice<>("timeZoneId", AVAILABLE_TIMEZONES));
 		add(new LanguageDropDown("languageId"));
 		add(new TextField<String>("address.phone"));
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java
index 257c1bb..4396216 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java
@@ -21,7 +21,6 @@ package org.apache.openmeetings.web.user.chat;
 import static org.apache.openmeetings.core.util.WebSocketHelper.ID_ALL;
 import static org.apache.openmeetings.core.util.WebSocketHelper.ID_ROOM_PREFIX;
 import static org.apache.openmeetings.core.util.WebSocketHelper.ID_USER_PREFIX;
-import static org.apache.openmeetings.db.util.FormatHelper.getDisplayName;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getWebAppRootKey;
 import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.WebSession.getDateFormat;
@@ -108,7 +107,7 @@ public class ChatForm extends Form<Void> {
 					m.setMessage(txt);
 					m.setSent(new Date());
 					m.setFromUser(getBean(UserDao.class).get(getUserId()));
-					m.setFromName(getDisplayName(getClient().getUser()));
+					m.setFromName(getClient().getUser().getDisplayName());
 					if (!process(
 							() -> getChat().isShowDashboardChat()
 							, r -> {