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 2021/06/17 00:32:56 UTC

[openmeetings] branch master updated (9b36005 -> 55dd5c1)

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

solomax pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git.


    from 9b36005  [OPENMEETINGS-2593] spring, cxf, jetty, bcprov
     new 80e769a  [OPENMEETINGS-2604] customized extra menu in room
     new 55dd5c1  [OPENMEETINGS-2604] label is renamed

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../openmeetings/db/dao/room/ExtraMenuDao.java     | 129 +++++++++++++++++++++
 .../apache/openmeetings/db/dao/user/UserDao.java   |   2 +-
 .../openmeetings/db/entity/room/ExtraMenu.java     | 122 +++++++++++++++++++
 .../org/apache/openmeetings/db/util/DaoHelper.java |   5 +-
 .../web/admin/configurations/ConfigForm.java       |  10 +-
 .../web/admin/configurations/ConfigsPanel.java     |  15 +--
 .../web/admin/connection/ConnectionsPanel.java     |  51 ++++----
 .../openmeetings/web/admin/email/EmailPanel.java   |  13 +--
 .../openmeetings/web/admin/extra/ExtraForm.java    | 113 ++++++++++++++++++
 .../openmeetings/web/admin/extra/ExtraPanel.html   |  70 +++++++++++
 .../EmailPanel.java => extra/ExtraPanel.java}      |  66 +++++------
 .../openmeetings/web/admin/groups/GroupForm.java   |  44 ++++---
 .../openmeetings/web/admin/groups/GroupsPanel.java |  17 +--
 .../openmeetings/web/admin/labels/LangPanel.java   |  15 +--
 .../openmeetings/web/admin/ldaps/LdapsPanel.java   |  15 +--
 .../openmeetings/web/admin/oauth/OAuthPanel.java   |  15 +--
 .../openmeetings/web/admin/rooms/RoomForm.java     |  48 ++++----
 .../openmeetings/web/admin/rooms/RoomsPanel.java   |  17 +--
 .../openmeetings/web/admin/users/UsersPanel.java   |  15 +--
 .../web/app/Application.properties.xml             |   7 +-
 .../web/app/Application_ar.properties.xml          |   7 +-
 .../web/app/Application_bg.properties.xml          |   7 +-
 .../web/app/Application_bn.properties.xml          |   7 +-
 .../web/app/Application_ca.properties.xml          |   7 +-
 .../web/app/Application_cs.properties.xml          |   7 +-
 .../web/app/Application_da.properties.xml          |   7 +-
 .../web/app/Application_de.properties.xml          |   9 +-
 .../web/app/Application_el.properties.xml          |   7 +-
 .../web/app/Application_es.properties.xml          |   7 +-
 .../web/app/Application_fa.properties.xml          |   7 +-
 .../web/app/Application_fi.properties.xml          |   7 +-
 .../web/app/Application_fr.properties.xml          |   7 +-
 .../web/app/Application_gl.properties.xml          |   7 +-
 .../web/app/Application_hi.properties.xml          |   7 +-
 .../web/app/Application_hu.properties.xml          |   7 +-
 .../web/app/Application_in.properties.xml          |   7 +-
 .../web/app/Application_it.properties.xml          |   7 +-
 .../web/app/Application_iw.properties.xml          |   7 +-
 .../web/app/Application_ja.properties.xml          |   7 +-
 .../web/app/Application_ko.properties.xml          |   7 +-
 .../web/app/Application_ku.properties.xml          |   7 +-
 .../web/app/Application_lo.properties.xml          |   7 +-
 .../web/app/Application_nl.properties.xml          |   7 +-
 .../web/app/Application_pl.properties.xml          |   7 +-
 .../web/app/Application_pt.properties.xml          |   7 +-
 .../web/app/Application_pt_BR.properties.xml       |   7 +-
 .../web/app/Application_ru.properties.xml          |   7 +-
 .../web/app/Application_sk.properties.xml          |   7 +-
 .../web/app/Application_sv.properties.xml          |   7 +-
 .../web/app/Application_ta.properties.xml          |   7 +-
 .../web/app/Application_th.properties.xml          |   7 +-
 .../web/app/Application_tk.properties.xml          |   7 +-
 .../web/app/Application_tr.properties.xml          |   7 +-
 .../web/app/Application_uk.properties.xml          |   7 +-
 .../web/app/Application_ur.properties.xml          |   7 +-
 .../web/app/Application_zh_CN.properties.xml       |   7 +-
 .../web/app/Application_zh_TW.properties.xml       |   7 +-
 .../apache/openmeetings/web/app/WebSession.java    |  13 +--
 .../apache/openmeetings/web/common/BasePanel.java  |   1 +
 .../openmeetings/web/common/InvitationForm.java    |  25 ++--
 .../apache/openmeetings/web/common/MainPanel.java  |   3 +
 .../web/common/PagingNavigatorPanel.java           |  21 ++--
 .../openmeetings/web/room/menu/ExtrasSubMenu.java  |  76 ++++++++++++
 .../web/room/menu/RoomInvitationForm.java          |  14 +--
 .../openmeetings/web/room/menu/RoomMenuPanel.java  |   5 +
 .../web/room/poll/PollResultsDialog.java           |  23 ++--
 .../web/room/sidebar/RoomFilePanel.java            |   9 +-
 .../web/user/calendar/AppointmentDialog.java       |  23 ++--
 .../web/user/calendar/CalendarPanel.java           |  13 +--
 .../openmeetings/web/user/chat/ChatToolbar.java    |   9 +-
 .../web/user/profile/InvitationsPanel.java         |  21 ++--
 .../web/user/profile/MessagesContactsPanel.java    |  60 +++-------
 .../openmeetings/web/util/OmUrlFragment.java       |   9 ++
 .../WEB-INF/classes/META-INF/db2_persistence.xml   |   1 +
 .../WEB-INF/classes/META-INF/h2_persistence.xml    |   1 +
 .../WEB-INF/classes/META-INF/mssql_persistence.xml |   1 +
 .../WEB-INF/classes/META-INF/mysql_persistence.xml |   1 +
 .../classes/META-INF/oracle_persistence.xml        |   1 +
 .../classes/META-INF/postgresql_persistence.xml    |   1 +
 .../org/apache/openmeetings/web/TestMainAreas.java |  12 ++
 80 files changed, 991 insertions(+), 402 deletions(-)
 create mode 100644 openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/ExtraMenuDao.java
 create mode 100644 openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/ExtraMenu.java
 create mode 100644 openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraForm.java
 create mode 100644 openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraPanel.html
 copy openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/{email/EmailPanel.java => extra/ExtraPanel.java} (58%)
 create mode 100644 openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/ExtrasSubMenu.java

[openmeetings] 01/02: [OPENMEETINGS-2604] customized extra menu in room

Posted by so...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 80e769aaee9708d3054cf84520d816d20b4ed652
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Thu Jun 17 00:06:23 2021 +0700

    [OPENMEETINGS-2604] customized extra menu in room
---
 .../openmeetings/db/dao/room/ExtraMenuDao.java     | 129 +++++++++++++++++++++
 .../apache/openmeetings/db/dao/user/UserDao.java   |   2 +-
 .../openmeetings/db/entity/room/ExtraMenu.java     | 122 +++++++++++++++++++
 .../org/apache/openmeetings/db/util/DaoHelper.java |   5 +-
 .../web/admin/configurations/ConfigForm.java       |  10 +-
 .../web/admin/configurations/ConfigsPanel.java     |  15 +--
 .../web/admin/connection/ConnectionsPanel.java     |  51 ++++----
 .../openmeetings/web/admin/email/EmailPanel.java   |  13 +--
 .../openmeetings/web/admin/extra/ExtraForm.java    | 113 ++++++++++++++++++
 .../openmeetings/web/admin/extra/ExtraPanel.html   |  70 +++++++++++
 .../EmailPanel.java => extra/ExtraPanel.java}      |  66 +++++------
 .../openmeetings/web/admin/groups/GroupForm.java   |  44 ++++---
 .../openmeetings/web/admin/groups/GroupsPanel.java |  17 +--
 .../openmeetings/web/admin/labels/LangPanel.java   |  15 +--
 .../openmeetings/web/admin/ldaps/LdapsPanel.java   |  15 +--
 .../openmeetings/web/admin/oauth/OAuthPanel.java   |  15 +--
 .../openmeetings/web/admin/rooms/RoomForm.java     |  48 ++++----
 .../openmeetings/web/admin/rooms/RoomsPanel.java   |  17 +--
 .../openmeetings/web/admin/users/UsersPanel.java   |  15 +--
 .../web/app/Application.properties.xml             |   7 +-
 .../web/app/Application_ar.properties.xml          |   7 +-
 .../web/app/Application_bg.properties.xml          |   7 +-
 .../web/app/Application_bn.properties.xml          |   7 +-
 .../web/app/Application_ca.properties.xml          |   7 +-
 .../web/app/Application_cs.properties.xml          |   7 +-
 .../web/app/Application_da.properties.xml          |   7 +-
 .../web/app/Application_de.properties.xml          |   9 +-
 .../web/app/Application_el.properties.xml          |   7 +-
 .../web/app/Application_es.properties.xml          |   7 +-
 .../web/app/Application_fa.properties.xml          |   7 +-
 .../web/app/Application_fi.properties.xml          |   7 +-
 .../web/app/Application_fr.properties.xml          |   7 +-
 .../web/app/Application_gl.properties.xml          |   7 +-
 .../web/app/Application_hi.properties.xml          |   7 +-
 .../web/app/Application_hu.properties.xml          |   7 +-
 .../web/app/Application_in.properties.xml          |   7 +-
 .../web/app/Application_it.properties.xml          |   7 +-
 .../web/app/Application_iw.properties.xml          |   7 +-
 .../web/app/Application_ja.properties.xml          |   7 +-
 .../web/app/Application_ko.properties.xml          |   7 +-
 .../web/app/Application_ku.properties.xml          |   7 +-
 .../web/app/Application_lo.properties.xml          |   7 +-
 .../web/app/Application_nl.properties.xml          |   7 +-
 .../web/app/Application_pl.properties.xml          |   7 +-
 .../web/app/Application_pt.properties.xml          |   7 +-
 .../web/app/Application_pt_BR.properties.xml       |   7 +-
 .../web/app/Application_ru.properties.xml          |   7 +-
 .../web/app/Application_sk.properties.xml          |   7 +-
 .../web/app/Application_sv.properties.xml          |   7 +-
 .../web/app/Application_ta.properties.xml          |   7 +-
 .../web/app/Application_th.properties.xml          |   7 +-
 .../web/app/Application_tk.properties.xml          |   7 +-
 .../web/app/Application_tr.properties.xml          |   7 +-
 .../web/app/Application_uk.properties.xml          |   7 +-
 .../web/app/Application_ur.properties.xml          |   7 +-
 .../web/app/Application_zh_CN.properties.xml       |   7 +-
 .../web/app/Application_zh_TW.properties.xml       |   7 +-
 .../apache/openmeetings/web/app/WebSession.java    |  13 +--
 .../apache/openmeetings/web/common/BasePanel.java  |   1 +
 .../openmeetings/web/common/InvitationForm.java    |  25 ++--
 .../apache/openmeetings/web/common/MainPanel.java  |   3 +
 .../web/common/PagingNavigatorPanel.java           |  21 ++--
 .../openmeetings/web/room/menu/ExtrasSubMenu.java  |  76 ++++++++++++
 .../web/room/menu/RoomInvitationForm.java          |  14 +--
 .../openmeetings/web/room/menu/RoomMenuPanel.java  |   5 +
 .../web/room/poll/PollResultsDialog.java           |  23 ++--
 .../web/room/sidebar/RoomFilePanel.java            |   9 +-
 .../web/user/calendar/AppointmentDialog.java       |  23 ++--
 .../web/user/calendar/CalendarPanel.java           |  13 +--
 .../openmeetings/web/user/chat/ChatToolbar.java    |   9 +-
 .../web/user/profile/InvitationsPanel.java         |  21 ++--
 .../web/user/profile/MessagesContactsPanel.java    |  60 +++-------
 .../openmeetings/web/util/OmUrlFragment.java       |   9 ++
 .../WEB-INF/classes/META-INF/db2_persistence.xml   |   1 +
 .../WEB-INF/classes/META-INF/h2_persistence.xml    |   1 +
 .../WEB-INF/classes/META-INF/mssql_persistence.xml |   1 +
 .../WEB-INF/classes/META-INF/mysql_persistence.xml |   1 +
 .../classes/META-INF/oracle_persistence.xml        |   1 +
 .../classes/META-INF/postgresql_persistence.xml    |   1 +
 .../org/apache/openmeetings/web/TestMainAreas.java |  12 ++
 80 files changed, 991 insertions(+), 402 deletions(-)

diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/ExtraMenuDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/ExtraMenuDao.java
new file mode 100644
index 0000000..911a3ef
--- /dev/null
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/ExtraMenuDao.java
@@ -0,0 +1,129 @@
+/*
+ * 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.dao.room;
+
+import static org.apache.openmeetings.db.util.DaoHelper.getSearchQuery;
+import static org.apache.openmeetings.db.util.DaoHelper.setLimits;
+import static org.apache.openmeetings.db.util.DaoHelper.single;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import org.apache.openmeetings.db.dao.IGroupAdminDataProviderDao;
+import org.apache.openmeetings.db.dao.user.UserDao;
+import org.apache.openmeetings.db.entity.room.ExtraMenu;
+import org.apache.openmeetings.db.entity.user.Group;
+import org.apache.openmeetings.db.entity.user.GroupUser;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+@Repository
+@Transactional
+public class ExtraMenuDao implements IGroupAdminDataProviderDao<ExtraMenu> {
+	public final static String[] searchFields = {"name", "link", "description"};
+
+	@PersistenceContext
+	private EntityManager em;
+
+	@Autowired
+	private UserDao userDao;
+
+	@Override
+	public ExtraMenu get(Long id) {
+		return single(em.createNamedQuery("getExtraMenuById", ExtraMenu.class)
+				.getResultList());
+	}
+
+	@Override
+	public ExtraMenu get(long id) {
+		return get(Long.valueOf(id));
+	}
+
+	@Override
+	public List<ExtraMenu> get(long start, long count) {
+		return setLimits(em.createNamedQuery("getExtraMenus", ExtraMenu.class), start, count).getResultList();
+	}
+
+	@Override
+	public List<ExtraMenu> get(String search, long start, long count, String order) {
+		return setLimits(
+				em.createQuery(getSearchQuery("ExtraMenu", "m", search, false, false, order, searchFields)
+						, ExtraMenu.class)
+				, start, count).getResultList();
+	}
+
+	public List<ExtraMenu> getByGroups(List<Long> groups) {
+		return em.createNamedQuery("getExtraMenuByGroups", ExtraMenu.class)
+				.setParameter("ids", groups)
+				.getResultList();
+	}
+
+	@Override
+	public long count() {
+		return em.createNamedQuery("countExtraMenus", Long.class).getSingleResult();
+	}
+
+	@Override
+	public long count(String search) {
+		return em.createQuery(getSearchQuery("ExtraMenu", "m", search, false, true, null, searchFields), Long.class)
+				.getSingleResult();
+	}
+
+	@Override
+	public ExtraMenu update(ExtraMenu entity, Long userId) {
+		if (entity.getId() == null) {
+			em.persist(entity);
+		} else {
+			entity = em.merge(entity);
+		}
+		return entity;
+	}
+
+	@Override
+	public void delete(ExtraMenu entity, Long userId) {
+		em.remove(entity);
+	}
+
+	@Override
+	public List<ExtraMenu> adminGet(String search, Long adminId, long start, long count, String order) {
+		final String additionalWhere = getGroupFilter(adminId);
+		return setLimits(em.createQuery(getSearchQuery("ExtraMenu", "m", null, search, false, false, additionalWhere, order, searchFields), ExtraMenu.class)
+				, start, count).getResultList();
+	}
+
+	@Override
+	public long adminCount(String search, Long adminId) {
+		final String additionalWhere = getGroupFilter(adminId);
+		return em.createQuery(getSearchQuery("ExtraMenu", "m", null, search, false, true, additionalWhere, null, searchFields), Long.class)
+				.getSingleResult();
+	}
+
+	private String getGroupFilter(Long adminId) {
+		return userDao.get(adminId).getGroupUsers().stream()
+				.filter(GroupUser::isModerator)
+				.map(GroupUser::getGroup)
+				.map(Group::getId)
+				.map(String::valueOf)
+				.collect(Collectors.joining(", ", "m.groups IN (", ")"));
+	}
+}
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
index bae79dc..b8dc754 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
@@ -435,7 +435,7 @@ public class UserDao implements IGroupAdminDataProviderDao<User> {
 		try {
 			// get all users
 			TypedQuery<Long> query = em.createNamedQuery("selectMaxFromUsersWithSearch", Long.class);
-			query.setParameter("search", StringUtils.lowerCase(search));
+			query.setParameter("search", StringUtils.lowerCase(search, Locale.ROOT));
 			List<Long> ll = query.getResultList();
 			log.info("selectMaxFromUsers {}", ll.get(0));
 			return ll.get(0);
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/ExtraMenu.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/ExtraMenu.java
new file mode 100644
index 0000000..609b0b2
--- /dev/null
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/ExtraMenu.java
@@ -0,0 +1,122 @@
+/*
+ * 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.room;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.CollectionTable;
+import javax.persistence.Column;
+import javax.persistence.ElementCollection;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+import org.apache.openmeetings.db.bind.adapter.LongAdapter;
+import org.apache.openmeetings.db.entity.IDataProviderEntity;
+
+@Entity
+@NamedQueries({
+	@NamedQuery(name = "getExtraMenuById", query = "SELECT m FROM ExtraMenu m WHERE m.id = :id")
+	, @NamedQuery(name = "getExtraMenus", query = "SELECT m FROM ExtraMenu m")
+	, @NamedQuery(name = "getExtraMenuByGroups", query = "SELECT m FROM ExtraMenu m WHERE m.groups IS NULL OR m.groups IN (:ids)")
+	, @NamedQuery(name = "countExtraMenus", query = "SELECT COUNT(m) FROM ExtraMenu m")
+})
+@Table(name = "extra_menu")
+public class ExtraMenu implements IDataProviderEntity {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	@Column(name = "id")
+	@XmlElement(name = "id")
+	@XmlJavaTypeAdapter(LongAdapter.class)
+	private Long id;
+
+	@Column(name = "name")
+	@XmlElement(name = "name")
+	private String name;
+
+	@Column(name = "link")
+	@XmlElement(name = "link")
+	private String link;
+
+	@Column(name = "description")
+	@XmlElement(name = "description")
+	private String description;
+
+	@ElementCollection(fetch = FetchType.EAGER)
+	@Column(name = "group_id", nullable = false)
+	@CollectionTable(name = "menu_group", joinColumns = @JoinColumn(name = "menu_id"))
+	@XmlElementWrapper(name = "groups", required = false)
+	@XmlElement(name = "group", required = false)
+	@XmlJavaTypeAdapter(LongAdapter.class)
+	private List<Long> groups = new ArrayList<>();
+
+	@Override
+	public Long getId() {
+		return id;
+	}
+
+	@Override
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getLink() {
+		return link;
+	}
+
+	public void setLink(String link) {
+		this.link = link;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public List<Long> getGroups() {
+		return groups;
+	}
+
+	public void setGroups(List<Long> groups) {
+		this.groups = groups;
+	}
+}
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/DaoHelper.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/DaoHelper.java
index c0b44f6..6bca782 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/DaoHelper.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/DaoHelper.java
@@ -19,6 +19,7 @@
 package org.apache.openmeetings.db.util;
 
 import java.util.List;
+import java.util.Locale;
 import java.util.function.Function;
 
 import javax.persistence.EntityManager;
@@ -90,7 +91,7 @@ public class DaoHelper {
 					inSb.append(" OR ");
 				}
 				StringBuilder placeholder = new StringBuilder();
-				placeholder.append("%").append(StringUtils.lowerCase(searchItems[i])).append("%");
+				placeholder.append("%").append(StringUtils.lowerCase(searchItems[i], Locale.ROOT)).append("%");
 
 				inSb.append("(");
 				for (int j = 0; j < fields.length; ++j) {
@@ -117,7 +118,7 @@ public class DaoHelper {
 	}
 
 	public static String getStringParam(String param) {
-		return param == null ? "%" : "%" + StringUtils.lowerCase(param) + "%";
+		return param == null ? "%" : "%" + StringUtils.lowerCase(param, Locale.ROOT) + "%";
 	}
 
 	public static <T> TypedQuery<T> setLimits(TypedQuery<T> q, Long first, Long max) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java
index 5148ae0..1e24eee 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java
@@ -18,6 +18,7 @@
  */
 package org.apache.openmeetings.web.admin.configurations;
 
+import static org.apache.openmeetings.web.common.BasePanel.EVT_CHANGE;
 import static org.apache.wicket.validation.validator.StringValidator.maximumLength;
 
 import java.util.List;
@@ -137,14 +138,7 @@ public class ConfigForm extends AdminBaseForm<Configuration> {
 				}
 				return null;
 			}
-		}).setLabel(new ResourceModel("45")).add(new AjaxFormComponentUpdatingBehavior("change") {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void onUpdate(AjaxRequestTarget target) {
-				update(target);
-			}
-		}));
+		}).setLabel(new ResourceModel("45")).add(AjaxFormComponentUpdatingBehavior.onUpdate(EVT_CHANGE, this::update)));
 		add(new RequiredTextField<String>("key").setLabel(new ResourceModel("265")).add(new IValidator<String>(){
 			private static final long serialVersionUID = 1L;
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigsPanel.java
index 1c50a1e..afb2e0a 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigsPanel.java
@@ -68,16 +68,11 @@ public class ConfigsPanel extends AdminBasePanel {
 				item.add(new Label("id"));
 				item.add(new Label("key"));
 				item.add(new Label("value"));
-				item.add(new AjaxEventBehavior(EVT_CLICK) {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onEvent(AjaxRequestTarget target) {
-						form.setNewRecordVisible(false);
-						form.setModelObject(cfgDao.get(c.getId())); // force fetch lazy user
-						target.add(form, listContainer);
-					}
-				});
+				item.add(AjaxEventBehavior.onEvent(EVT_CLICK, target -> {
+					form.setNewRecordVisible(false);
+					form.setModelObject(cfgDao.get(c.getId())); // force fetch lazy user
+					target.add(form, listContainer);
+				}));
 				item.add(AttributeModifier.replace(ATTR_CLASS, getRowClass(c.getId(), form.getModelObject().getId())));
 			}
 		};
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
index 0c933c2..9132b84 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
@@ -132,36 +132,31 @@ public class ConnectionsPanel extends AdminBasePanel {
 					}.add(newOkCancelConfirm(this, getString("605"))));
 				}
 
-				item.add(new AjaxEventBehavior(EVT_CLICK) {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onEvent(AjaxRequestTarget target) {
-						Field[] ff = (item.getModelObject() instanceof KStreamDto ? KStreamDto.class : Client.class).getDeclaredFields();
-						RepeatingView lines = new RepeatingView("line");
-						Object c = item.getModelObject();
-
-						for (Field f : ff) {
-							int mod = f.getModifiers();
-							if (Modifier.isStatic(mod) || Modifier.isTransient(mod)) {
-								continue;
-							}
-							WebMarkupContainer line = new WebMarkupContainer(lines.newChildId());
-							line.add(new Label("name", f.getName()));
-							String val = "";
-							try {
-								f.setAccessible(true);
-								val = "" + f.get(c);
-							} catch (Exception e) {
-								//noop
-							}
-							line.add(new Label("value", val));
-							lines.add(line);
+				item.add(AjaxEventBehavior.onEvent(EVT_CLICK, target -> {
+					Field[] ff = (item.getModelObject() instanceof KStreamDto ? KStreamDto.class : Client.class).getDeclaredFields();
+					RepeatingView lines = new RepeatingView("line");
+					Object c = item.getModelObject();
+
+					for (Field f : ff) {
+						int mod = f.getModifiers();
+						if (Modifier.isStatic(mod) || Modifier.isTransient(mod)) {
+							continue;
 						}
-						details.addOrReplace(lines);
-						target.add(details.setVisible(true));
+						WebMarkupContainer line = new WebMarkupContainer(lines.newChildId());
+						line.add(new Label("name", f.getName()));
+						String val = "";
+						try {
+							f.setAccessible(true);
+							val = "" + f.get(c);
+						} catch (Exception e) {
+							//noop
+						}
+						line.add(new Label("value", val));
+						lines.add(line);
 					}
-				});
+					details.addOrReplace(lines);
+					target.add(details.setVisible(true));
+				}));
 
 				item.add(AttributeModifier.append(ATTR_CLASS, ROW_CLASS));
 			}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailPanel.java
index 0d825fc..4a820bb 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailPanel.java
@@ -53,15 +53,10 @@ public class EmailPanel extends AdminBasePanel {
 				item.add(new Label("id"));
 				item.add(new Label("status", getString("admin.email.status." + m.getStatus().name())));
 				item.add(new Label("subject"));
-				item.add(new AjaxEventBehavior(EVT_CLICK) {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onEvent(AjaxRequestTarget target) {
-						form.setModelObject(m);
-						target.add(form, list);
-					}
-				});
+				item.add(AjaxEventBehavior.onEvent(EVT_CLICK, target -> {
+					form.setModelObject(m);
+					target.add(form, list);
+				}));
 				item.add(AttributeModifier.replace(ATTR_CLASS, getRowClass(m)));
 			}
 		};
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraForm.java
new file mode 100644
index 0000000..21384a0
--- /dev/null
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraForm.java
@@ -0,0 +1,113 @@
+/*
+ * 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.web.admin.extra;
+
+import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
+import static org.apache.openmeetings.web.app.WebSession.getRights;
+
+import java.util.ArrayList;
+
+import org.apache.openmeetings.db.dao.room.ExtraMenuDao;
+import org.apache.openmeetings.db.dao.user.GroupDao;
+import org.apache.openmeetings.db.entity.room.ExtraMenu;
+import org.apache.openmeetings.db.entity.user.Group;
+import org.apache.openmeetings.web.admin.AdminBaseForm;
+import org.apache.openmeetings.web.app.WebSession;
+import org.apache.openmeetings.web.common.GroupChoiceProvider;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.RequiredTextField;
+import org.apache.wicket.markup.html.form.TextArea;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.model.util.CollectionModel;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.wicketstuff.select2.Select2MultiChoice;
+
+public class ExtraForm extends AdminBaseForm<ExtraMenu> {
+	private static final long serialVersionUID = 1L;
+	private final WebMarkupContainer list;
+	final Select2MultiChoice<Group> groups = new Select2MultiChoice<>("groups"
+			, new CollectionModel<>(new ArrayList<Group>())
+			, new GroupChoiceProvider());
+
+	@SpringBean
+	private ExtraMenuDao menuDao;
+	@SpringBean
+	private GroupDao groupDao;
+
+	public ExtraForm(String id, final WebMarkupContainer list, ExtraMenu m) {
+		super(id, new CompoundPropertyModel<>(m));
+		this.list = list;
+	}
+
+	@Override
+	protected void onInitialize() {
+		super.onInitialize();
+		add(new RequiredTextField<String>("name").setLabel(new ResourceModel("165")));
+		add(new RequiredTextField<String>("link").setLabel(new ResourceModel("admin.extra.link")));
+		add(groups.setLabel(new ResourceModel("126")).setRequired(hasGroupAdminLevel(getRights())));
+		add(new TextArea<String>("description").setLabel(new ResourceModel("lbl.description")));
+	}
+
+	@Override
+	protected void onSaveSubmit(AjaxRequestTarget target, Form<?> form) {
+		ExtraMenu m = getModelObject();
+		m.getGroups().clear();
+		for (Group g : groups.getModelObject()) {
+			m.getGroups().add(g.getId());
+		}
+		setModelObject(menuDao.update(m, WebSession.getUserId()));
+		setNewVisible(false);
+		target.add(this, list);
+	}
+
+	@Override
+	protected void onModelChanged() {
+		super.onModelChanged();
+		ExtraMenu m = getModelObject();
+		groups.setModelObject(m == null || m.getGroups() == null || m.getGroups().isEmpty() ? new ArrayList<>() : groupDao.get(m.getGroups()));
+	}
+
+	@Override
+	protected void onNewSubmit(AjaxRequestTarget target, Form<?> form) {
+		this.setModelObject(new ExtraMenu());
+		target.add(this);
+	}
+
+	@Override
+	protected void onRefreshSubmit(AjaxRequestTarget target, Form<?> form) {
+		ExtraMenu m = getModelObject();
+		if (m.getId() != null) {
+			m = menuDao.get(m.getId());
+		} else {
+			m = new ExtraMenu();
+		}
+		this.setModelObject(m);
+		target.add(this);
+	}
+
+	@Override
+	protected void onDeleteSubmit(AjaxRequestTarget target, Form<?> form) {
+		menuDao.delete(getModelObject(), WebSession.getUserId());
+		this.setModelObject(new ExtraMenu());
+		target.add(list, this);
+	}
+}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraPanel.html
new file mode 100644
index 0000000..05fa6a6
--- /dev/null
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraPanel.html
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+
+-->
+<!DOCTYPE html>
+<html xmlns:wicket="http://wicket.apache.org">
+<wicket:extend>
+	<div class="adminPanelColumnTable col-6">
+		<div class="adminNav" wicket:id="navigator">[dataview navigator]</div>
+		<table class="list-table table-striped table-hover">
+			<thead>
+				<tr>
+					<th class="col-1"><span wicket:id="orderById"></span><wicket:message key="188" /></th>
+					<th class="col-5"><span wicket:id="orderByName"></span><wicket:message key="165" /></th>
+					<th class="col-6"><span wicket:id="orderByLink"></span><wicket:message key="admin.extra.link" /></th>
+				</tr>
+			</thead>
+			<tbody wicket:id="list">
+				<tr wicket:id="menu">
+					<td class="col-1"><div class="col-wrapper"><span wicket:id="id"></span></div></td>
+					<td class="col-5"><div class="col-wrapper"><span wicket:id="name"></span></div></td>
+					<td class="col-6"><div class="col-wrapper"><span wicket:id="link"></span></div></td>
+				</tr>
+			</tbody>
+		</table>
+	</div>
+	<div class="adminPanelColumnForm col-6">
+		<form wicket:id="form" class="adminForm">
+			<div wicket:id="buttons"></div>
+			<div class="scrollcontent" id="adminForm">
+				<fieldset>
+					<legend><wicket:message key="admin.extra.group.label" /></legend>
+					<div class="formelement">
+						<label wicket:for="name" class="col-3 text-right"><wicket:message key="165" /></label>
+						<input type="text" wicket:id="name" class="col-8"/>
+					</div>
+					<div class="formelement">
+						<label wicket:for="link" class="col-3 text-right"><wicket:message key="admin.extra.link" /></label>
+						<input type="text" wicket:id="link" class="col-8"/>
+					</div>
+					<div class="formelement">
+						<label wicket:for="description" class="col-3 text-right"><wicket:message key="admin.extra.desc" /></label>
+						<textarea wicket:id="description" class="col-8"></textarea>
+					</div>
+					<div class="formelement">
+						<label wicket:for="groups" class="col-3 text-right"><wicket:message key="126" /></label>
+						<div class="om-select2 p-0 d-inline-block col-8"><select class="input w-100" wicket:id="groups"></select></div>
+					</div>
+				</fieldset>
+			</div>
+		</form>
+	</div>
+</wicket:extend>
+</html>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraPanel.java
similarity index 58%
copy from openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailPanel.java
copy to openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraPanel.java
index 0d825fc..4d0b215 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraPanel.java
@@ -16,80 +16,74 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.web.admin.email;
+package org.apache.openmeetings.web.admin.extra;
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
 
-import org.apache.openmeetings.db.dao.basic.MailMessageDao;
-import org.apache.openmeetings.db.entity.basic.MailMessage;
+import org.apache.openmeetings.db.dao.room.ExtraMenuDao;
+import org.apache.openmeetings.db.entity.room.ExtraMenu;
 import org.apache.openmeetings.web.admin.AdminBasePanel;
 import org.apache.openmeetings.web.admin.SearchableDataView;
 import org.apache.openmeetings.web.common.PagedEntityListPanel;
 import org.apache.openmeetings.web.data.DataViewContainer;
 import org.apache.openmeetings.web.data.OmOrderByBorder;
-import org.apache.openmeetings.web.data.SearchableDataProvider;
+import org.apache.openmeetings.web.data.SearchableGroupAdminDataProvider;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.repeater.Item;
 
-public class EmailPanel extends AdminBasePanel {
+@AuthorizeInstantiation({"ADMIN", "GROUP_ADMIN"})
+public class ExtraPanel extends AdminBasePanel {
 	private static final long serialVersionUID = 1L;
 	private final WebMarkupContainer list = new WebMarkupContainer("list");
-	private final EmailForm form;
+	private ExtraForm form;
 
-	public EmailPanel(String id) {
+	public ExtraPanel(String id) {
 		super(id);
-		SearchableDataView<MailMessage> dataView = new SearchableDataView<>("email",
-				new SearchableDataProvider<>(MailMessageDao.class))
+	}
+
+	@Override
+	protected void onInitialize() {
+		SearchableDataView<ExtraMenu> dataView = new SearchableDataView<>("menu",
+				new SearchableGroupAdminDataProvider<>(ExtraMenuDao.class))
 		{
 			private static final long serialVersionUID = 1L;
 
 			@Override
-			protected void populateItem(Item<MailMessage> item) {
-				final MailMessage m = item.getModelObject();
+			protected void populateItem(Item<ExtraMenu> item) {
+				final ExtraMenu m = item.getModelObject();
 				item.add(new Label("id"));
-				item.add(new Label("status", getString("admin.email.status." + m.getStatus().name())));
-				item.add(new Label("subject"));
-				item.add(new AjaxEventBehavior(EVT_CLICK) {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onEvent(AjaxRequestTarget target) {
-						form.setModelObject(m);
-						target.add(form, list);
-					}
-				});
-				item.add(AttributeModifier.replace(ATTR_CLASS, getRowClass(m)));
+				item.add(new Label("name"));
+				item.add(new Label("link"));
+				item.add(AjaxEventBehavior.onEvent(EVT_CLICK, target -> {
+					form.setModelObject(m);
+					target.add(form, list);
+				}));
+				item.add(AttributeModifier.replace(ATTR_CLASS, getRowClass(m.getId(), form.getModelObject().getId())));
 			}
 		};
 		add(list.add(dataView).setOutputMarkupId(true));
 		final PagedEntityListPanel navigator = new PagedEntityListPanel("navigator", dataView) {
-			private static final long serialVersionUID = 1L;
+			private static final long serialVersionUID = -1L;
 
 			@Override
 			protected void onEvent(AjaxRequestTarget target) {
 				target.add(list);
 			}
 		};
-		DataViewContainer<MailMessage> container = new DataViewContainer<>(list, dataView, navigator);
+		DataViewContainer<ExtraMenu> container = new DataViewContainer<>(list, dataView, navigator);
 		container.addLink(new OmOrderByBorder<>("orderById", "id", container))
-				.addLink(new OmOrderByBorder<>("orderBySubject", "subject", container))
-				.addLink(new OmOrderByBorder<>("orderByStatus", "status", container));
+				.addLink(new OmOrderByBorder<>("orderByName", "name", container))
+				.addLink(new OmOrderByBorder<>("orderByLink", "link", container));
 		add(container.getLinks());
 		add(navigator);
 
-		form = new EmailForm("form", list, new MailMessage());
+		form = new ExtraForm("form", list, new ExtraMenu());
 		add(form);
-	}
-
-	private StringBuilder getRowClass(final MailMessage m) {
-		StringBuilder sb = getRowClass(m.getId(), form.getModelObject().getId());
-		if (MailMessage.Status.ERROR == m.getStatus()) {
-			sb.append(" bg-warning");
-		}
-		return sb;
+		super.onInitialize();
 	}
 }
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java
index f0d002a..79a0b28 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java
@@ -23,6 +23,7 @@ import static org.apache.openmeetings.util.OmFileHelper.getGroupLogo;
 import static org.apache.openmeetings.util.OmFileHelper.getGroupLogoDir;
 import static org.apache.openmeetings.web.app.WebSession.getRights;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
+import static org.apache.openmeetings.web.common.BasePanel.EVT_CHANGE;
 import static org.apache.openmeetings.web.util.GroupLogoResourceReference.getUrl;
 
 import java.io.File;
@@ -115,34 +116,29 @@ public class GroupForm extends AdminBaseForm<Group> {
 				return formatUser(choice);
 			}
 		}));
-		userToadd.add(new AjaxFormComponentUpdatingBehavior("change") {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void onUpdate(AjaxRequestTarget target) {
-				Group o = GroupForm.this.getModelObject();
-				User u = userToadd.getModelObject();
-				boolean found = false;
-				if (o.getId() != null) {
-					found = null != groupUserDao.getByGroupAndUser(o.getId(), u.getId());
-				}
-				if (!found && u != null) {
-					for (GroupUser ou : usersPanel.getUsers2add()) {
-						if (ou.getUser().getId().equals(u.getId())) {
-							found = true;
-							break;
-						}
+		userToadd.add(AjaxFormComponentUpdatingBehavior.onUpdate(EVT_CHANGE, target -> {
+			Group o = GroupForm.this.getModelObject();
+			User u = userToadd.getModelObject();
+			boolean found = false;
+			if (o.getId() != null) {
+				found = null != groupUserDao.getByGroupAndUser(o.getId(), u.getId());
+			}
+			if (!found && u != null) {
+				for (GroupUser ou : usersPanel.getUsers2add()) {
+					if (ou.getUser().getId().equals(u.getId())) {
+						found = true;
+						break;
 					}
-					if (!found) {
-						GroupUser ou = new GroupUser(o, u);
-						usersPanel.getUsers2add().add(ou);
+				}
+				if (!found) {
+					GroupUser ou = new GroupUser(o, u);
+					usersPanel.getUsers2add().add(ou);
 
-						userToadd.setModelObject(null);
-						target.add(usersPanel, userToadd);
-					}
+					userToadd.setModelObject(null);
+					target.add(usersPanel, userToadd);
 				}
 			}
-		});
+		}));
 	}
 
 	static String formatUser(User choice) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java
index 2aa075d..56ed420 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java
@@ -75,17 +75,12 @@ public class GroupsPanel extends AdminBasePanel {
 					name.add(AttributeModifier.append("class", "external"));
 				}
 				item.add(name);
-				item.add(new AjaxEventBehavior(EVT_CLICK) {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onEvent(AjaxRequestTarget target) {
-						form.setNewRecordVisible(false);
-						form.setModelObject(g);
-						form.updateView(target);
-						target.add(listContainer);
-					}
-				});
+				item.add(AjaxEventBehavior.onEvent(EVT_CLICK, target -> {
+					form.setNewRecordVisible(false);
+					form.setModelObject(g);
+					form.updateView(target);
+					target.add(listContainer);
+				}));
 				item.add(AttributeModifier.append(ATTR_CLASS, getRowClass(g.getId(), form.getModelObject().getId())));
 			}
 		};
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.java
index 05219d3..93cde50 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.java
@@ -119,16 +119,11 @@ public class LangPanel extends AdminBasePanel {
 				final StringLabel fv = item.getModelObject();
 				item.add(new Label("key"));
 				item.add(new Label("value"));
-				item.add(new AjaxEventBehavior(EVT_CLICK) {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onEvent(AjaxRequestTarget target) {
-						form.setModelObject(fv);
-						form.setNewRecordVisible(false);
-						target.add(form, listContainer);
-					}
-				});
+				item.add(AjaxEventBehavior.onEvent(EVT_CLICK, target -> {
+					form.setModelObject(fv);
+					form.setNewRecordVisible(false);
+					target.add(form, listContainer);
+				}));
 				item.add(AttributeModifier.append(ATTR_CLASS, getRowClass(fv.getId(), form.getModelObject().getId())));
 			}
 		};
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapsPanel.java
index f9e2c5e..a045b0f 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapsPanel.java
@@ -62,16 +62,11 @@ public class LdapsPanel extends AdminBasePanel {
 				item.add(new Label("id"));
 				item.add(new Label("name"));
 				item.add(new Label("configFileName"));
-				item.add(new AjaxEventBehavior(EVT_CLICK) {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onEvent(AjaxRequestTarget target) {
-						form.setModelObject(lc);
-						form.setNewRecordVisible(false);
-						target.add(form, listContainer);
-					}
-				});
+				item.add(AjaxEventBehavior.onEvent(EVT_CLICK, target -> {
+					form.setModelObject(lc);
+					form.setNewRecordVisible(false);
+					target.add(form, listContainer);
+				}));
 				item.add(AttributeModifier.replace(ATTR_CLASS, getRowClass(lc.getId(), form.getModelObject().getId())));
 			}
 		};
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthPanel.java
index a14fe8b..555a262 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthPanel.java
@@ -57,16 +57,11 @@ public class OAuthPanel extends AdminBasePanel {
 				final OAuthServer server = item.getModelObject();
 				item.add(new Label("id"));
 				item.add(new Label("name"));
-				item.add(new AjaxEventBehavior(EVT_CLICK) {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onEvent(AjaxRequestTarget target) {
-						form.setModelObject(server);
-						form.setNewRecordVisible(false);
-						target.add(form, listContainer);
-					}
-				});
+				item.add(AjaxEventBehavior.onEvent(EVT_CLICK, target -> {
+					form.setModelObject(server);
+					form.setNewRecordVisible(false);
+					target.add(form, listContainer);
+				}));
 				item.add(AttributeModifier.replace(ATTR_CLASS, getRowClass(server.getId(), form.getModelObject().getId())));
 			}
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
index afde3de..b93776d 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
@@ -24,6 +24,7 @@ import static org.apache.openmeetings.web.admin.AdminUserChoiceProvider.PAGE_SIZ
 import static org.apache.openmeetings.web.app.Application.kickUser;
 import static org.apache.openmeetings.web.app.WebSession.getRights;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
+import static org.apache.openmeetings.web.common.BasePanel.EVT_CHANGE;
 import static org.apache.openmeetings.web.common.confirmation.ConfirmationBehavior.newOkCancelDangerConfirm;
 import static org.apache.wicket.validation.validator.StringValidator.maximumLength;
 
@@ -277,35 +278,30 @@ public class RoomForm extends AdminBaseForm<Room> {
 			}
 		});
 		moderatorChoice.getSettings().setCloseOnSelect(true);
-		add(moderatorChoice.add(new AjaxFormComponentUpdatingBehavior("change") {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void onUpdate(AjaxRequestTarget target) {
-				Room r = RoomForm.this.getModelObject();
-				User u = moderator2add.getObject();
-				boolean found = false;
-				if (u != null) {
-					if (r.getModerators() == null) {
-						r.setModerators(new ArrayList<>());
-					}
-					for (RoomModerator rm : r.getModerators()) {
-						if (rm.getUser().getId().equals(u.getId())) {
-							found = true;
-							break;
-						}
-					}
-					if (!found) {
-						RoomModerator rm = new RoomModerator();
-						rm.setRoomId(r.getId());
-						rm.setUser(u);
-						r.getModerators().add(0, rm);
-						moderator2add.setObject(null);
-						target.add(moderatorContainer, moderatorChoice);
+		add(moderatorChoice.add(AjaxFormComponentUpdatingBehavior.onUpdate(EVT_CHANGE, target -> {
+			Room r = RoomForm.this.getModelObject();
+			User u = moderator2add.getObject();
+			boolean found = false;
+			if (u != null) {
+				if (r.getModerators() == null) {
+					r.setModerators(new ArrayList<>());
+				}
+				for (RoomModerator rm : r.getModerators()) {
+					if (rm.getUser().getId().equals(u.getId())) {
+						found = true;
+						break;
 					}
 				}
+				if (!found) {
+					RoomModerator rm = new RoomModerator();
+					rm.setRoomId(r.getId());
+					rm.setUser(u);
+					r.getModerators().add(0, rm);
+					moderator2add.setObject(null);
+					target.add(moderatorContainer, moderatorChoice);
+				}
 			}
-		}).setOutputMarkupId(true));
+		})).setOutputMarkupId(true));
 		add(moderatorContainer.add(new ListView<RoomModerator>("moderators") {
 			private static final long serialVersionUID = 1L;
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java
index c713faa..898be32 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java
@@ -57,17 +57,12 @@ public class RoomsPanel extends AdminBasePanel {
 				item.add(new Label("id"));
 				item.add(new Label("name"));
 				item.add(new Label("ispublic"));
-				item.add(new AjaxEventBehavior(EVT_CLICK) {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onEvent(AjaxRequestTarget target) {
-						form.setNewRecordVisible(false);
-						form.setModelObject(roomDao.get(roomId));
-						form.updateView(target);
-						target.add(form, listContainer);
-					}
-				});
+				item.add(AjaxEventBehavior.onEvent(EVT_CLICK, target -> {
+					form.setNewRecordVisible(false);
+					form.setModelObject(roomDao.get(roomId));
+					form.updateView(target);
+					target.add(form, listContainer);
+				}));
 				item.add(AttributeModifier.replace(ATTR_CLASS, getRowClass(room.getId(), form.getModelObject().getId())));
 			}
 		};
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
index cf261ef..6dba04d 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
@@ -71,16 +71,11 @@ public class UsersPanel extends AdminBasePanel {
 				item.add(new Label("login"));
 				item.add(new Label("firstname"));
 				item.add(new Label("lastname"));
-				item.add(new AjaxEventBehavior(EVT_CLICK) {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onEvent(AjaxRequestTarget target) {
-						form.setModelObject(userDao.get(userId));
-						form.setNewRecordVisible(false);
-						form.update(target);
-					}
-				});
+				item.add(AjaxEventBehavior.onEvent(EVT_CLICK, target -> {
+					form.setModelObject(userDao.get(userId));
+					form.setNewRecordVisible(false);
+					form.update(target);
+				}));
 				StringBuilder cl = getRowClass(u.getId(), form.getModelObject().getId());
 				if (u.isDeleted()) {
 					cl.append(" deleted");
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 f8d7f08..f64b4a1 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Start]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Cancel]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[Email]]></entry>
 	<entry key="lbl.enter"><![CDATA[Enter]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
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 bab690b..d2c6d08 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[يود دعوتك إلى غرفة الاجتماعات:]]></entry>
 	<entry key="1138"><![CDATA[رسالة دعوة]]></entry>
 	<entry key="1143"><![CDATA[المنطقه الزمنيه]]></entry>
-	<entry key="1146"><![CDATA[الوصف]]></entry>
 	<entry key="1147"><![CDATA[انشأ من قبل]]></entry>
 	<entry key="1151"><![CDATA[مؤتمر {0} جديد:]]></entry>
 	<entry key="1152"><![CDATA[التفاصيل:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[خطأ]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[لا شيء]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[إرسال]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[ايام]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[تمكين الحدود]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[شعار]]></entry>
@@ -828,6 +829,7 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="label.start"><![CDATA[بداية]]></entry>
 	<entry key="label.undock.panel"><![CDATA[انقر لإلغاء قفل اللوحة]]></entry>
 	<entry key="lbl.cancel"><![CDATA[الغاء]]></entry>
+	<entry key="lbl.description"><![CDATA[الوصف]]></entry>
 	<entry key="lbl.email"><![CDATA[البريد الإلكتروني]]></entry>
 	<entry key="lbl.enter"><![CDATA[أدخل]]></entry>
 	<entry key="lbl.general"><![CDATA[عام]]></entry>
@@ -839,6 +841,9 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="lbl.video"><![CDATA[فيديو]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[إدارة البريد الإلكتروني]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[تحقق من معالجة رسائل البريد الإلكتروني بواسطة النظام]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[استطلاعات الرأي]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[جمع الملاحظات دون إنشاء استطلاع]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[إنشاء استطلاع سريع]]></entry>
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 c857352..9e2563d 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Начало]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Отказ]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[E-mail:]]></entry>
 	<entry key="lbl.enter"><![CDATA[Вход]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Анкети]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
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 9b4c42d..531ec4d 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[শুরু]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Cancel]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[ইমেইল]]></entry>
 	<entry key="lbl.enter"><![CDATA[প্রবেশ করুন]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
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 633dfda..15bc331 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Inici]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Cancelar]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[Correu:]]></entry>
 	<entry key="lbl.enter"><![CDATA[Entrar]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
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 4bccd69..9320649 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Začátek]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[zruš]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[EMail:]]></entry>
 	<entry key="lbl.enter"><![CDATA[vstup]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
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 c7fe6f5..afc6e54 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Start]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Afbryd]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[Email:]]></entry>
 	<entry key="lbl.enter"><![CDATA[Log ind]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
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 f8cba91..c99cd27 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[möchte Sie in den Konferenzraum einladen:]]></entry>
 	<entry key="1138"><![CDATA[Einladung]]></entry>
 	<entry key="1143"><![CDATA[Zeitzone]]></entry>
-	<entry key="1146"><![CDATA[Beschreibung]]></entry>
 	<entry key="1147"><![CDATA[Erstellt von]]></entry>
 	<entry key="1151"><![CDATA[Neue {0} Konferenz:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Fehler]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[keine]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[senden]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[Tage]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Begrenzungen aktiv]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -631,7 +632,7 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="error.contact.approved"><![CDATA[Der Nutzer wurde bereits bestätigt.]]></entry>
 	<entry key="error.contact.denied"><![CDATA[Der Nutzer wurde bereits abgelehnt.]]></entry>
 	<entry key="error.email.inuse"><![CDATA[Die E-Mail ist bereits registriert.]]></entry>
-	<entry key="error.hash.invalid"><![CDATA[Die Einladung ist nicht mehr gültig.]]></entry>
+	<entry key="error.hash.invalid"><![CDATA[Die Einladung ist nicht gültig]]></entry>
 	<entry key="error.hash.period"><![CDATA[Ihr Einladungscode ist ungültig. Er kann nur im angegebenen Zeitraum genutzt werden:]]></entry>
 	<entry key="error.hash.used"><![CDATA[Die Einladung ist nicht mehr gültig.]]></entry>
 	<entry key="error.login.inuse"><![CDATA[Der Nutzername ist bereits vergeben]]></entry>
@@ -834,6 +835,7 @@ Bitte <tt>openmeetings.log</tt> prüfen und die OpenMeetings-Entwickeler kontakt
 	<entry key="label.start"><![CDATA[Start]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Klicken, um das Panel abzudocken]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Abbrechen]]></entry>
+	<entry key="lbl.description"><![CDATA[Beschreibung]]></entry>
 	<entry key="lbl.email"><![CDATA[E-Mail:]]></entry>
 	<entry key="lbl.enter"><![CDATA[Betreten]]></entry>
 	<entry key="lbl.general"><![CDATA[Generell]]></entry>
@@ -845,6 +847,9 @@ Bitte <tt>openmeetings.log</tt> prüfen und die OpenMeetings-Entwickeler kontakt
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[E-Mail Management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[E-Mail-Prozess im System überprüfen]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Umfragen]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Feedback ohne Umfage anzulegegen ]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Schnelle Abstimmung erzeugen]]></entry>
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 cf1815e..69025b3 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Έναρξη]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Ακύρωση]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[Email:]]></entry>
 	<entry key="lbl.enter"><![CDATA[Είσοδος]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
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 d61276a..30d835e 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
@@ -355,7 +355,6 @@ Las salas creadas via Calendario están listadas solamente en esta sección, dur
 	<entry key="1137"><![CDATA[me gustaría invitarle a sala de conferencia:]]></entry>
 	<entry key="1138"><![CDATA[Mensaje de invitación]]></entry>
 	<entry key="1143"><![CDATA[Zona Horaria]]></entry>
-	<entry key="1146"><![CDATA[Descripción]]></entry>
 	<entry key="1147"><![CDATA[Creado por]]></entry>
 	<entry key="1151"><![CDATA[Nueva {0} conferencia:]]></entry>
 	<entry key="1152"><![CDATA[Detalles:]]></entry>
@@ -556,6 +555,8 @@ Las salas creadas via Calendario están listadas solamente en esta sección, dur
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[Ninguno]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Enviando]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[días]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Límites permitidos]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -830,6 +831,7 @@ por favor revise <tt> openmeetings.log </tt> y contacte a los desarrolladores de
 	<entry key="label.start"><![CDATA[Inicio]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Haga clic para desacoplar el panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Cancelar]]></entry>
+	<entry key="lbl.description"><![CDATA[Descripción]]></entry>
 	<entry key="lbl.email"><![CDATA[Correo]]></entry>
 	<entry key="lbl.enter"><![CDATA[Entrar]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -841,6 +843,9 @@ por favor revise <tt> openmeetings.log </tt> y contacte a los desarrolladores de
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Gestión de correo]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Verifique el procesamiento de correos electrónicos por parte del sistema]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Encuestas]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Recopilar comentarios sin crear una encuesta]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Crear Encuesta Rápida]]></entry>
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 ef65f2d..fc6903e 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[آیا مایلید شما را به اتاق کنفرانس دعوت کنم؟]]></entry>
 	<entry key="1138"><![CDATA[پیام دعوت]]></entry>
 	<entry key="1143"><![CDATA[منطقه زمانی]]></entry>
-	<entry key="1146"><![CDATA[توضیح]]></entry>
 	<entry key="1147"><![CDATA[ایجاد شده توسط]]></entry>
 	<entry key="1151"><![CDATA[کنفرانس جدید: {0}]]></entry>
 	<entry key="1152"><![CDATA[جزییات:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[خطا]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[هیچ کدام]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[ارسال]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[روزها]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[فعال کردن محدودیت ها]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[لوگو]]></entry>
@@ -825,6 +826,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[شروع]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[انصراف]]></entry>
+	<entry key="lbl.description"><![CDATA[توضیح]]></entry>
 	<entry key="lbl.email"><![CDATA[ایمیل:]]></entry>
 	<entry key="lbl.enter"><![CDATA[ورود]]></entry>
 	<entry key="lbl.general"><![CDATA[کلی]]></entry>
@@ -836,6 +838,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[مدیریت پست الکترونیک]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[اجرای ایمیل ها را توسط سیستم بررسی کنید]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[نظرسنجی ها]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
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 2932f7e..413ac0a 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Alku]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[peruuta]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[Sähköposti:]]></entry>
 	<entry key="lbl.enter"><![CDATA[astu sisään]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
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 0fc781b..286ced2 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[souhaite vous inviter dans la salle de conférence :]]></entry>
 	<entry key="1138"><![CDATA[Message d'invitation]]></entry>
 	<entry key="1143"><![CDATA[Fus. horaire]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Créé par]]></entry>
 	<entry key="1151"><![CDATA[Nouvelle conférence {0} :]]></entry>
 	<entry key="1152"><![CDATA[Détails :]]></entry>
@@ -554,6 +553,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Erreur]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[Aucun]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Envoi]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[jours]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[LImites activées.]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -830,6 +831,7 @@ allez sur <tt>openmeetings.log</tt> et contactez les développeurs d'OpenMeeting
 	<entry key="label.start"><![CDATA[Début]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Cliquez pour détacher le panneau]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Annuler]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[Courriel :]]></entry>
 	<entry key="lbl.enter"><![CDATA[Entrer]]></entry>
 	<entry key="lbl.general"><![CDATA[Général]]></entry>
@@ -841,6 +843,9 @@ allez sur <tt>openmeetings.log</tt> et contactez les développeurs d'OpenMeeting
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Gestion courriels]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Verifier courriels traités par le système]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Sondages]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Rassembler les retours sans créer de sondages.]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Créer un sondage rapide]]></entry>
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 a56d2a8..e0ac9f7 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Comeza]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Cancelar]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[Correo-e:]]></entry>
 	<entry key="lbl.enter"><![CDATA[Entrar]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hi.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hi.properties.xml
index f4063ea..c6f6ba4 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hi.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hi.properties.xml
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Start]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Cancel]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[Email]]></entry>
 	<entry key="lbl.enter"><![CDATA[Enter]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[मतदान]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
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 ca26cfb..8891929 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[szeretne meghívni a konferencia szobába:]]></entry>
 	<entry key="1138"><![CDATA[Meghívó üzenet]]></entry>
 	<entry key="1143"><![CDATA[Időzóna]]></entry>
-	<entry key="1146"><![CDATA[Leírás]]></entry>
 	<entry key="1147"><![CDATA[Létrehozta]]></entry>
 	<entry key="1151"><![CDATA[új {0} konferencia:]]></entry>
 	<entry key="1152"><![CDATA[Részletek:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -817,6 +818,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Indul]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Mégse]]></entry>
+	<entry key="lbl.description"><![CDATA[Leírás]]></entry>
 	<entry key="lbl.email"><![CDATA[EMail:]]></entry>
 	<entry key="lbl.enter"><![CDATA[belépés]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -828,6 +830,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
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 b969009..9bb7d65 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Start]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[batal]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[Email:]]></entry>
 	<entry key="lbl.enter"><![CDATA[masuk]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
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 424caf3..d023c09 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[vuole invitarti alla stanza delle conferenze:]]></entry>
 	<entry key="1138"><![CDATA[Messaggio di invito]]></entry>
 	<entry key="1143"><![CDATA[Fuso orario]]></entry>
-	<entry key="1146"><![CDATA[Descrizione]]></entry>
 	<entry key="1147"><![CDATA[Creato da]]></entry>
 	<entry key="1151"><![CDATA[{0} nuove conferenze:]]></entry>
 	<entry key="1152"><![CDATA[Dettagli:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Errore]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[Nessuno]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Spedizione]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[giorni]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -830,6 +831,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Inizio]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[annulla]]></entry>
+	<entry key="lbl.description"><![CDATA[Descrizione]]></entry>
 	<entry key="lbl.email"><![CDATA[EMail:]]></entry>
 	<entry key="lbl.enter"><![CDATA[Entra]]></entry>
 	<entry key="lbl.general"><![CDATA[Generale]]></entry>
@@ -841,6 +843,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Gestione Email]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Verifica elaborazione e-mails del sistema]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Sondaggi]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Crea un sondaggio rapido]]></entry>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_iw.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_iw.properties.xml
index 11102d5..f2c325f 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_iw.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_iw.properties.xml
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Start]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Cancel]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[Email]]></entry>
 	<entry key="lbl.enter"><![CDATA[Enter]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
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 3bd0d47..95dfef6 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[会議への参加を依頼されています。依頼者=]]></entry>
 	<entry key="1138"><![CDATA[参加依頼メッセージ]]></entry>
 	<entry key="1143"><![CDATA[タイムゾーン]]></entry>
-	<entry key="1146"><![CDATA[概要]]></entry>
 	<entry key="1147"><![CDATA[作成者]]></entry>
 	<entry key="1151"><![CDATA[{0}会議が設定されました:]]></entry>
 	<entry key="1152"><![CDATA[詳細:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[エラー]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[無し]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[送信中]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[日]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[制限を有効化]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[ロゴ]]></entry>
@@ -829,6 +830,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[開始]]></entry>
 	<entry key="label.undock.panel"><![CDATA[クリックしてパネルを切り離す]]></entry>
 	<entry key="lbl.cancel"><![CDATA[キャンセル]]></entry>
+	<entry key="lbl.description"><![CDATA[概要]]></entry>
 	<entry key="lbl.email"><![CDATA[メールアドレス:]]></entry>
 	<entry key="lbl.enter"><![CDATA[入室]]></entry>
 	<entry key="lbl.general"><![CDATA[一般]]></entry>
@@ -840,6 +842,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[電子メール管理]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[システムで使用する電子メールのチェックを実行]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[投票]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[投票を作成せずにフィードバックを収集]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[クイック投票を作成]]></entry>
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 6f1aba4..d542c70 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Start]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[무효]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[EMail:]]></entry>
 	<entry key="lbl.enter"><![CDATA[들어가다]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ku.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ku.properties.xml
index 95c775a..729ecd5 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ku.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ku.properties.xml
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Start]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Cancel]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[Email]]></entry>
 	<entry key="lbl.enter"><![CDATA[Enter]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_lo.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_lo.properties.xml
index 008c141..3423fcc 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_lo.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_lo.properties.xml
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Start]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Cancel]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[Email]]></entry>
 	<entry key="lbl.enter"><![CDATA[Enter]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
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 b1672e2..14d1726 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Begin]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Annuleren]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[E-mail:]]></entry>
 	<entry key="lbl.enter"><![CDATA[Deelnemen]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
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 47c6164..404f951 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[chciałbym zaprosić Cię do sali konferencyjnej:]]></entry>
 	<entry key="1138"><![CDATA[Zaproś wiadomość]]></entry>
 	<entry key="1143"><![CDATA[Strefa czasowa]]></entry>
-	<entry key="1146"><![CDATA[Opis]]></entry>
 	<entry key="1147"><![CDATA[Utworzony przez]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Start]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Kliknij, aby oddokować panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[anuluj]]></entry>
+	<entry key="lbl.description"><![CDATA[Opis]]></entry>
 	<entry key="lbl.email"><![CDATA[e-mail:]]></entry>
 	<entry key="lbl.enter"><![CDATA[Wejdź]]></entry>
 	<entry key="lbl.general"><![CDATA[Ogólne]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Ankiety]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Stworz szybką ankietę]]></entry>
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 e8be8aa..b8076ac 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Start]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[cancelar]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[EMail:]]></entry>
 	<entry key="lbl.enter"><![CDATA[entrar]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
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 ec3d94a..139add4 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Mensagem convite]]></entry>
 	<entry key="1143"><![CDATA[Fuso horário]]></entry>
-	<entry key="1146"><![CDATA[Descrição]]></entry>
 	<entry key="1147"><![CDATA[Criado por]]></entry>
 	<entry key="1151"><![CDATA[Nova conferência {0}]]></entry>
 	<entry key="1152"><![CDATA[Detalhes:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[dias]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Inicio]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Cancelar]]></entry>
+	<entry key="lbl.description"><![CDATA[Descrição]]></entry>
 	<entry key="lbl.email"><![CDATA[Email:]]></entry>
 	<entry key="lbl.enter"><![CDATA[entrar]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Votação]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Criar Pesquisa Rápida]]></entry>
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 6fc1090..6b6c138 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[хотелось бы пригласить вас в комнату для конференций:]]></entry>
 	<entry key="1138"><![CDATA[Приглашение]]></entry>
 	<entry key="1143"><![CDATA[Временная зона]]></entry>
-	<entry key="1146"><![CDATA[Описание]]></entry>
 	<entry key="1147"><![CDATA[Создано]]></entry>
 	<entry key="1151"><![CDATA[Новая конференция {0}:]]></entry>
 	<entry key="1152"><![CDATA[Детали:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Ошибка]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[Нет]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Посылается]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[Параметры ссылки]]></entry>
+	<entry key="admin.extra.link"><![CDATA[Ссылка]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[дней]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Разрешить ограничения]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Лого]]></entry>
@@ -829,6 +830,7 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="label.start"><![CDATA[Начало]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Кликните чтобы "отлепить" панель]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Отменить]]></entry>
+	<entry key="lbl.description"><![CDATA[Описание]]></entry>
 	<entry key="lbl.email"><![CDATA[e-mail:]]></entry>
 	<entry key="lbl.enter"><![CDATA[Вход]]></entry>
 	<entry key="lbl.general"><![CDATA[Общие]]></entry>
@@ -840,6 +842,9 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="lbl.video"><![CDATA[Видео]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Управление письмами]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Проверка статуса отосланных писем]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Доп. меню]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Дополнительные ссылки для комнат]]></entry>
+	<entry key="menu.extras"><![CDATA[Ссылки]]></entry>
 	<entry key="menu.polls"><![CDATA[Голосования]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Собрать отзывы без создания голосования]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Создать быстрый опрос]]></entry>
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 8716737..15663b0 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Začiatok]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Zrušiť]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[Email]]></entry>
 	<entry key="lbl.enter"><![CDATA[Vstup]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
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 efad215..60d4c49 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
@@ -353,7 +353,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[vill bjuda in dig till detta konferensrum:]]></entry>
 	<entry key="1138"><![CDATA[Inbjudningsmeddelande]]></entry>
 	<entry key="1143"><![CDATA[Tidszon]]></entry>
-	<entry key="1146"><![CDATA[Beskrivning]]></entry>
 	<entry key="1147"><![CDATA[Skapad av]]></entry>
 	<entry key="1151"><![CDATA[Ny {0} konferens:]]></entry>
 	<entry key="1152"><![CDATA[Detaljer:]]></entry>
@@ -554,6 +553,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Fel]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sänder]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[dagar]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Begränsningar aktiverade]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logga]]></entry>
@@ -826,6 +827,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Början]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Avbryt]]></entry>
+	<entry key="lbl.description"><![CDATA[Beskrivning]]></entry>
 	<entry key="lbl.email"><![CDATA[E-postadress]]></entry>
 	<entry key="lbl.enter"><![CDATA[Anslut]]></entry>
 	<entry key="lbl.general"><![CDATA[Allmänt]]></entry>
@@ -837,6 +839,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[E-posthantering]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Enkäter]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Skaffa feedback utan att skapa en enkät]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Skapa snabbenkät]]></entry>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ta.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ta.properties.xml
index 0cd1d93..6a5e248 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ta.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ta.properties.xml
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -554,6 +553,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -830,6 +831,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Start]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Cancel]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[Email]]></entry>
 	<entry key="lbl.enter"><![CDATA[Enter]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -841,6 +843,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
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 5c666c7..281e418 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[เริ่ม]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[ยกเลิก]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[อีเมล์:]]></entry>
 	<entry key="lbl.enter"><![CDATA[เข้าห้อง]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tk.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tk.properties.xml
index c513535..b273337 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tk.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tk.properties.xml
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Start]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Cancel]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[Email]]></entry>
 	<entry key="lbl.enter"><![CDATA[Enter]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
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 2fbe1e2..169e6cb 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Baş]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[iptal]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[E-posta:]]></entry>
 	<entry key="lbl.enter"><![CDATA[giriş]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
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 3d052f2..59f4190 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[хотілося б запросити вас у кімнату для нарад:]]></entry>
 	<entry key="1138"><![CDATA[Запрошення]]></entry>
 	<entry key="1143"><![CDATA[Таймзона]]></entry>
-	<entry key="1146"><![CDATA[Опис]]></entry>
 	<entry key="1147"><![CDATA[Створено]]></entry>
 	<entry key="1151"><![CDATA[Нова конференція {0}:]]></entry>
 	<entry key="1152"><![CDATA[Деталі:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Помилка]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[Немає]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Надсилається]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[днів]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Початок]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Натисніть щоб відокремити панель]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Скасувати]]></entry>
+	<entry key="lbl.description"><![CDATA[Опис]]></entry>
 	<entry key="lbl.email"><![CDATA[E-mail:]]></entry>
 	<entry key="lbl.enter"><![CDATA[Вхід]]></entry>
 	<entry key="lbl.general"><![CDATA[Загальне]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Управління листами]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Перевірка статусу надісланих листів]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Опитування]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Створити швидке опитування]]></entry>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ur.properties.xml b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ur.properties.xml
index f8d7f08..f64b4a1 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ur.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ur.properties.xml
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Start]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[Cancel]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[Email]]></entry>
 	<entry key="lbl.enter"><![CDATA[Enter]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
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 0db9bab..b63c4a8 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[想请您加入会议室:]]></entry>
 	<entry key="1138"><![CDATA[邀请信]]></entry>
 	<entry key="1143"><![CDATA[时区]]></entry>
-	<entry key="1146"><![CDATA[详细描述]]></entry>
 	<entry key="1147"><![CDATA[创建者]]></entry>
 	<entry key="1151"><![CDATA[新会议: {0}]]></entry>
 	<entry key="1152"><![CDATA[详细情况]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -829,6 +830,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[开始]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[取消]]></entry>
+	<entry key="lbl.description"><![CDATA[详细描述]]></entry>
 	<entry key="lbl.email"><![CDATA[邮件:]]></entry>
 	<entry key="lbl.enter"><![CDATA[进入]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -840,6 +842,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
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 786c46f..01db3e1 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
@@ -352,7 +352,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="1137"><![CDATA[would like to invite you to the conference room:]]></entry>
 	<entry key="1138"><![CDATA[Invite message]]></entry>
 	<entry key="1143"><![CDATA[Timezone]]></entry>
-	<entry key="1146"><![CDATA[Description]]></entry>
 	<entry key="1147"><![CDATA[Created by]]></entry>
 	<entry key="1151"><![CDATA[New {0} conference:]]></entry>
 	<entry key="1152"><![CDATA[Details:]]></entry>
@@ -553,6 +552,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for Details
 	<entry key="admin.email.status.ERROR"><![CDATA[Error]]></entry>
 	<entry key="admin.email.status.NONE"><![CDATA[None]]></entry>
 	<entry key="admin.email.status.SENDING"><![CDATA[Sending]]></entry>
+	<entry key="admin.extra.group.label"><![CDATA[URL details]]></entry>
+	<entry key="admin.extra.link"><![CDATA[URL]]></entry>
 	<entry key="admin.group.form.days"><![CDATA[days]]></entry>
 	<entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
 	<entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
@@ -828,6 +829,7 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="label.start"><![CDATA[Start]]></entry>
 	<entry key="label.undock.panel"><![CDATA[Click to undock panel]]></entry>
 	<entry key="lbl.cancel"><![CDATA[取消]]></entry>
+	<entry key="lbl.description"><![CDATA[Description]]></entry>
 	<entry key="lbl.email"><![CDATA[郵箱:]]></entry>
 	<entry key="lbl.enter"><![CDATA[進入]]></entry>
 	<entry key="lbl.general"><![CDATA[General]]></entry>
@@ -839,6 +841,9 @@ please check <tt>openmeetings.log</tt> and contact OpenMeetings developers]]></e
 	<entry key="lbl.video"><![CDATA[Video]]></entry>
 	<entry key="main.menu.admin.email"><![CDATA[Email management]]></entry>
 	<entry key="main.menu.admin.email.desc"><![CDATA[Check e-mails processing by the system]]></entry>
+	<entry key="main.menu.admin.extra"><![CDATA[Extra Menu]]></entry>
+	<entry key="main.menu.admin.extra.desc"><![CDATA[Custom links to room menu]]></entry>
+	<entry key="menu.extras"><![CDATA[Extras]]></entry>
 	<entry key="menu.polls"><![CDATA[Polls]]></entry>
 	<entry key="menu.polls.quick.descr"><![CDATA[Gather feedback without creating a poll]]></entry>
 	<entry key="menu.polls.quick.title"><![CDATA[Create Quick Poll]]></entry>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
index 0228a2a..a4df318 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
@@ -37,7 +37,6 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
-import java.util.Optional;
 import java.util.Set;
 import java.util.TimeZone;
 
@@ -65,7 +64,6 @@ import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.openmeetings.db.util.FormatHelper;
 import org.apache.openmeetings.db.util.LocaleHelper;
 import org.apache.openmeetings.util.OmException;
-import org.apache.openmeetings.web.app.ClientManager.InstantToken;
 import org.apache.openmeetings.web.pages.HashPage;
 import org.apache.openmeetings.web.user.dashboard.MyRoomsWidget;
 import org.apache.openmeetings.web.user.dashboard.MyRoomsWidgetDescriptor;
@@ -267,13 +265,12 @@ public class WebSession extends AbstractAuthenticatedWebSession implements IWebS
 	}
 
 	public void checkToken(StringValue intoken) {
-		Optional<InstantToken> token = cm.getToken(intoken);
-		if (token.isPresent()) {
+		cm.getToken(intoken).ifPresent(token -> {
 			invalidateNow();
-			signIn(userDao.get(token.get().getUserId()));
-			log.debug("Cluster:: Token for room {} is found, signedIn ? {}", token.get().getRoomId(), userId != null);
-			area = RoomEnterBehavior.getRoomUrlFragment(token.get().getRoomId());
-		}
+			signIn(userDao.get(token.getUserId()));
+			log.debug("Cluster:: Token for room {} is found, signedIn ? {}", token.getRoomId(), userId != null);
+			area = RoomEnterBehavior.getRoomUrlFragment(token.getRoomId());
+		});
 	}
 
 	public boolean signIn(String secureHash, boolean markUsed) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/BasePanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/BasePanel.java
index abfe714..f9cd354 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/BasePanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/BasePanel.java
@@ -33,6 +33,7 @@ import com.github.openjson.JSONObject;
 public abstract class BasePanel extends Panel {
 	private static final long serialVersionUID = 1L;
 	public static final String EVT_CLICK = "click";
+	public static final String EVT_CHANGE = "change";
 	protected static final String ROW_CLASS = "clickable";
 
 	protected BasePanel(String id) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
index fd8bd00..ba87710 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
@@ -23,6 +23,7 @@ import static org.apache.openmeetings.util.CalendarHelper.getDate;
 import static org.apache.openmeetings.web.app.Application.getInvitationLink;
 import static org.apache.openmeetings.web.app.WebSession.AVAILABLE_TIMEZONES;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
+import static org.apache.openmeetings.web.common.BasePanel.EVT_CHANGE;
 import static org.apache.openmeetings.web.util.CalendarWebHelper.getZoneId;
 
 import java.time.LocalDateTime;
@@ -99,15 +100,10 @@ public abstract class InvitationForm extends Form<Invitation> {
 	@Override
 	protected void onInitialize() {
 		add(subject, message);
-		recipients.setLabel(new ResourceModel("216")).setRequired(true).add(new AjaxFormComponentUpdatingBehavior("change") {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void onUpdate(AjaxRequestTarget target) {
-				url.setModelObject(null);
-				updateButtons(target);
-			}
-		}).setOutputMarkupId(true);
+		recipients.setLabel(new ResourceModel("216")).setRequired(true).add(AjaxFormComponentUpdatingBehavior.onUpdate(EVT_CHANGE, target -> {
+			url.setModelObject(null);
+			updateButtons(target);
+		})).setOutputMarkupId(true);
 		add(new AjaxCheckBox("passwordProtected") {
 			private static final long serialVersionUID = 1L;
 
@@ -137,14 +133,9 @@ public abstract class InvitationForm extends Form<Invitation> {
 		add(from.setLabel(new ResourceModel("530")).setOutputMarkupId(true)
 				, to.setLabel(new ResourceModel("531")).setOutputMarkupId(true)
 				, timeZoneId.setOutputMarkupId(true));
-		timeZoneId.add(new AjaxFormComponentUpdatingBehavior("change") {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void onUpdate(AjaxRequestTarget target) {
-				//no-op added to preserve selection
-			}
-		});
+		timeZoneId.add(AjaxFormComponentUpdatingBehavior.onUpdate(EVT_CHANGE, target -> {
+			//no-op added to preserve selection
+		}));
 		add(url.setOutputMarkupId(true));
 		add(lang, feedback.setOutputMarkupId(true));
 		super.onInitialize();
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
index f1382fe..76e636c 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
@@ -350,6 +350,9 @@ public class MainPanel extends Panel {
 			if (isAdmin) {
 				l.add(getSubItem("main.menu.admin.email", "main.menu.admin.email.desc", MenuActions.ADMIN_EMAIL));
 			}
+			if (isAdmin || isGrpAdmin) {
+				l.add(getSubItem("main.menu.admin.extra", "main.menu.admin.extra.desc", MenuActions.ADMIN_EXTRA));
+			}
 			mmenu.add(new OmMenuItem(getString("6"), l));
 		}
 		return mmenu;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/PagingNavigatorPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/PagingNavigatorPanel.java
index 5e37061..a51929a 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/PagingNavigatorPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/PagingNavigatorPanel.java
@@ -18,6 +18,8 @@
  */
 package org.apache.openmeetings.web.common;
 
+import static org.apache.openmeetings.web.common.BasePanel.EVT_CHANGE;
+
 import java.util.List;
 
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -53,18 +55,13 @@ public abstract class PagingNavigatorPanel extends Panel {
 		final Form<Void> f = new Form<>("pagingForm");
 		f.add(new OmPagingNavigator("navigator", dataView).setOutputMarkupId(true))
 			.add(new DropDownChoice<>("entitiesPerPage", new PropertyModel<>(this, "entitiesPerPage"), numbers)
-				.add(new AjaxFormComponentUpdatingBehavior("change") {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onUpdate(AjaxRequestTarget target) {
-						long newPage = dataView.getCurrentPage() * dataView.getItemsPerPage() / entitiesPerPage;
-						dataView.setItemsPerPage(entitiesPerPage);
-						dataView.setCurrentPage(newPage);
-						target.add(f);
-						PagingNavigatorPanel.this.onEvent(target);
-					}
-				}));
+				.add(AjaxFormComponentUpdatingBehavior.onUpdate(EVT_CHANGE, target -> {
+					long newPage = dataView.getCurrentPage() * dataView.getItemsPerPage() / entitiesPerPage;
+					dataView.setItemsPerPage(entitiesPerPage);
+					dataView.setCurrentPage(newPage);
+					target.add(f);
+					PagingNavigatorPanel.this.onEvent(target);
+				})));
 		add(f.setOutputMarkupId(true));
 	}
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/ExtrasSubMenu.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/ExtrasSubMenu.java
new file mode 100644
index 0000000..818d19f
--- /dev/null
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/ExtrasSubMenu.java
@@ -0,0 +1,76 @@
+/*
+ * 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.web.room.menu;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.openmeetings.db.dao.room.ExtraMenuDao;
+import org.apache.openmeetings.db.dao.room.RoomDao;
+import org.apache.openmeetings.db.entity.room.ExtraMenu;
+import org.apache.openmeetings.db.entity.room.RoomGroup;
+import org.apache.openmeetings.db.entity.user.Group;
+import org.apache.openmeetings.web.common.menu.OmMenuItem;
+import org.apache.openmeetings.web.room.RoomPanel;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.injection.Injector;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+
+public class ExtrasSubMenu implements Serializable {
+	private static final long serialVersionUID = 1L;
+	private final RoomPanel room;
+	private OmMenuItem extraMenu;
+
+	@SpringBean
+	private RoomDao roomDao;
+	@SpringBean
+	private ExtraMenuDao menuDao;
+
+	public ExtrasSubMenu(final RoomPanel room) {
+		this.room = room;
+	}
+
+	public void init() {
+		Injector.get().inject(this);
+		extraMenu = new OmMenuItem(room.getString("menu.extras"), null, false);
+		List<Long> groups = roomDao.get(room.getRoom().getId()).getGroups().stream()
+				.map(RoomGroup::getGroup)
+				.map(Group::getId)
+				.collect(Collectors.toList());
+		for (ExtraMenu em : menuDao.getByGroups(groups)) {
+			extraMenu.add(new OmMenuItem(em.getName(), em.getDescription()) {
+				private static final long serialVersionUID = 1L;
+
+				@Override
+				public void onClick(AjaxRequestTarget target) {
+					target.appendJavaScript(String.format("window.open('%s', '_blank');", em.getLink()));
+				}
+			});
+		}
+	}
+
+	OmMenuItem getMenu() {
+		return extraMenu;
+	}
+
+	public void update(final boolean moder) {
+		extraMenu.setVisible(moder);
+	}
+}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomInvitationForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomInvitationForm.java
index f59cba3..34b9456 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomInvitationForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomInvitationForm.java
@@ -19,6 +19,7 @@
 package org.apache.openmeetings.web.room.menu;
 
 import static org.apache.openmeetings.web.app.WebSession.getRights;
+import static org.apache.openmeetings.web.common.BasePanel.EVT_CHANGE;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -87,15 +88,10 @@ public class RoomInvitationForm extends InvitationForm {
 			}
 		}));
 		groupContainer.add(
-			groups.setRequired(true).add(new AjaxFormComponentUpdatingBehavior("change") {
-				private static final long serialVersionUID = 1L;
-
-				@Override
-				protected void onUpdate(AjaxRequestTarget target) {
-					url.setModelObject(null);
-					updateButtons(target);
-				}
-			}).setOutputMarkupId(true)
+			groups.setRequired(true).add(AjaxFormComponentUpdatingBehavior.onUpdate(EVT_CHANGE, target -> {
+				url.setModelObject(null);
+				updateButtons(target);
+			})).setOutputMarkupId(true)
 			, new Radio<>("group", Model.of(InviteeType.group))
 		);
 		rdi.add(recipients, groupContainer.setVisible(showGroups));
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
index fced8f3..39e0b4f 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
@@ -105,6 +105,7 @@ public class RoomMenuPanel extends Panel {
 	};
 	private final PollsSubMenu pollsSubMenu;
 	private final ActionsSubMenu actionsSubMenu;
+	private final ExtrasSubMenu extrasSubMenu;
 	@SpringBean
 	private ClientManager cm;
 	@SpringBean
@@ -129,6 +130,7 @@ public class RoomMenuPanel extends Panel {
 		shareBtn.setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true);
 		pollsSubMenu = new PollsSubMenu(room, this);
 		actionsSubMenu = new ActionsSubMenu(room, this);
+		extrasSubMenu = new ExtrasSubMenu(room);
 	}
 
 	private Group getGroup() {
@@ -151,6 +153,7 @@ public class RoomMenuPanel extends Panel {
 		};
 		actionsSubMenu.init();
 		pollsSubMenu.init();
+		extrasSubMenu.init();
 		add((menuPanel = new MenuPanel("menu", getMenu())).setVisible(isVisible()));
 
 		add(askBtn.add(AttributeModifier.replace(ATTR_TITLE, getString("84"))));
@@ -191,6 +194,7 @@ public class RoomMenuPanel extends Panel {
 		if (pollsSubMenu.isVisible()) {
 			menu.add(pollsSubMenu.getMenu());
 		}
+		menu.add(extrasSubMenu.getMenu());
 		return menu;
 	}
 
@@ -204,6 +208,7 @@ public class RoomMenuPanel extends Panel {
 		boolean moder = room.getClient().hasRight(Room.Right.MODERATOR);
 		actionsSubMenu.update(moder, notExternalUser);
 		pollsSubMenu.update(moder, notExternalUser, r);
+		extrasSubMenu.update(moder);
 		menuPanel.update(handler);
 		StringBuilder roomClass = new StringBuilder("room name");
 		String roomTitle = "";
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/PollResultsDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/PollResultsDialog.java
index ac98e41..3522b44 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/PollResultsDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/PollResultsDialog.java
@@ -20,6 +20,7 @@ package org.apache.openmeetings.web.room.poll;
 
 import static org.apache.openmeetings.core.util.WebSocketHelper.sendRoom;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
+import static org.apache.openmeetings.web.common.BasePanel.EVT_CHANGE;
 import static org.apache.openmeetings.web.common.confirmation.ConfirmationBehavior.newOkCancelDangerConfirm;
 
 import java.util.ArrayList;
@@ -334,14 +335,9 @@ public class PollResultsDialog extends Modal<RoomPoll> {
 				public String getIdValue(RoomPoll object, int index) {
 					return object == null ? "" : "" + object.getId();
 				}
-			})).add(new AjaxFormComponentUpdatingBehavior("change") {
-				private static final long serialVersionUID = 1L;
-
-				@Override
-				protected void onUpdate(AjaxRequestTarget target) {
-					dispForm.updateModel(select.getModelObject(), true, target);
-				}
-			}));
+			})).add(AjaxFormComponentUpdatingBehavior.onUpdate(EVT_CHANGE, target -> {
+				dispForm.updateModel(select.getModelObject(), true, target);
+			})));
 			updateModel(null);
 		}
 
@@ -375,14 +371,9 @@ public class PollResultsDialog extends Modal<RoomPoll> {
 		protected void onInitialize() {
 			add(name, question, count);
 			chartType = new DropDownChoice<>("chartType", Model.of(chartSimple), List.of(chartSimple, chartPie));
-			add(chartType.add(new AjaxFormComponentUpdatingBehavior("change") {
-				private static final long serialVersionUID = 1L;
-
-				@Override
-				protected void onUpdate(AjaxRequestTarget target) {
-					redraw(target, false);
-				}
-			}));
+			add(chartType.add(AjaxFormComponentUpdatingBehavior.onUpdate(EVT_CHANGE, target -> {
+				redraw(target, false);
+			})));
 			super.onInitialize();
 		}
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java
index a2e4b50..5eb979d 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java
@@ -74,13 +74,6 @@ public class RoomFilePanel extends FileTreePanel {
 	protected Component getUpload() {
 		return super.getUpload()
 				.setVisible(true)
-				.add(new AjaxEventBehavior(EVT_CLICK) {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onEvent(AjaxRequestTarget target) {
-						room.getSidebar().showUpload(target);
-					}
-				});
+				.add(AjaxEventBehavior.onEvent(EVT_CLICK, target -> room.getSidebar().showUpload(target)));
 	}
 }
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
index faea5c5..6c913dc 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
@@ -21,6 +21,7 @@ package org.apache.openmeetings.web.user.calendar;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.isMyRoomsEnabled;
 import static org.apache.openmeetings.web.app.WebSession.getRights;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
+import static org.apache.openmeetings.web.common.BasePanel.EVT_CHANGE;
 import static org.apache.openmeetings.web.common.confirmation.ConfirmationBehavior.newOkCancelDangerConfirm;
 import static org.apache.openmeetings.web.util.CalendarWebHelper.getDate;
 import static org.apache.openmeetings.web.util.CalendarWebHelper.getDateTime;
@@ -383,23 +384,13 @@ public class AppointmentDialog extends Modal<Appointment> {
 				, new Radio<>("group", Model.of(InviteeType.group))
 			);
 			if (showGroups) {
-				groups.add(new AjaxFormComponentUpdatingBehavior("change") {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onUpdate(AjaxRequestTarget target) {
-						// added to update model
-					}
-				}).setEnabled(false);
+				groups.add(AjaxFormComponentUpdatingBehavior.onUpdate(EVT_CHANGE, target -> {
+					// added to update model
+				})).setEnabled(false);
 			}
-			rdi.add(attendees.add(new AjaxFormComponentUpdatingBehavior("change") {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onUpdate(AjaxRequestTarget target) {
-						// added to update model
-					}
-				})
+			rdi.add(attendees.add(AjaxFormComponentUpdatingBehavior.onUpdate(EVT_CHANGE, target -> {
+					// added to update model
+				}))
 				, groupContainer.setVisible(showGroups)
 			);
 			rdi.add(new Radio<>("user", Model.of(InviteeType.user)));
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java
index bdc5b0f..d6bd651 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java
@@ -282,15 +282,10 @@ public class CalendarPanel extends UserBasePanel {
 				final OmCalendar cal = item.getModelObject();
 				item.add(new WebMarkupContainer("item")
 						.add(new Label("name", cal.getTitle())));
-				item.add(new AjaxEventBehavior(EVT_CLICK) {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onEvent(AjaxRequestTarget target) {
-						calendarDialog.show(target, CalendarDialog.DIALOG_TYPE.UPDATE_CALENDAR, cal);
-						target.add(calendarDialog);
-					}
-				});
+				item.add(AjaxEventBehavior.onEvent(EVT_CLICK, target -> {
+					calendarDialog.show(target, CalendarDialog.DIALOG_TYPE.UPDATE_CALENDAR, cal);
+					target.add(calendarDialog);
+				}));
 			}
 		});
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
index 76c5098..635866c 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
@@ -213,14 +213,7 @@ public class ChatToolbar extends Panel implements IWysiwygToolbar {
 		toolbar.add(delBtn.setVisible(hasAdminLevel(getRights())).setOutputMarkupId(true)
 				.setOutputMarkupPlaceholderTag(true));
 		toolbar.add(save.setVisible(hasAdminLevel(getRights())).setOutputMarkupId(true)
-				.setOutputMarkupPlaceholderTag(true).add(new AjaxEventBehavior(EVT_CLICK) {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onEvent(AjaxRequestTarget target) {
-						download.initiate(target);
-					}
-				}));
+				.setOutputMarkupPlaceholderTag(true).add(AjaxEventBehavior.onEvent(EVT_CLICK, download::initiate)));
 	}
 
 	private static JSONObject cleanMsg(String scope) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/InvitationsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/InvitationsPanel.java
index 4d3aa78..3be2347 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/InvitationsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/InvitationsPanel.java
@@ -63,20 +63,15 @@ public class InvitationsPanel extends UserBasePanel {
 				item.add(new Label("id"));
 				item.add(new Label("valid"/*, getString("admin.email.status." + m.getStatus().name())*/));
 				item.add(new Label("invitee", formatUser(i.getInvitee())));
-				item.add(new AjaxEventBehavior(EVT_CLICK) {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onEvent(AjaxRequestTarget target) {
-						if (i.getId().equals(selected)) {
-							selected = null;
-						} else {
-							selected = i.getId();
-						}
-						form.setModelObject(i);
-						target.add(form, list);
+				item.add(AjaxEventBehavior.onEvent(EVT_CLICK, target -> {
+					if (i.getId().equals(selected)) {
+						selected = null;
+					} else {
+						selected = i.getId();
 					}
-				});
+					form.setModelObject(i);
+					target.add(form, list);
+				}));
 				item.add(AttributeModifier.replace(ATTR_CLASS, getRowClass(i)));
 			}
 		};
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessagesContactsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessagesContactsPanel.java
index d1622d9..83d6b73 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessagesContactsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessagesContactsPanel.java
@@ -229,14 +229,7 @@ public class MessagesContactsPanel extends UserBasePanel {
 				del.setIconType(FontAwesome5IconType.times_s)
 						.add(newOkCancelDangerConfirm(this, getString("833")));
 				item.add(del);
-				item.add(new AjaxEventBehavior(EVT_CLICK) {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onEvent(AjaxRequestTarget target) {
-						selectFolder(item, item.getModelObject().getId(), target);
-					}
-				});
+				item.add(AjaxEventBehavior.onEvent(EVT_CLICK, target -> selectFolder(item, item.getModelObject().getId(), target)));
 				setFolderClass(item);
 			}
 		}).setOutputMarkupId(true));
@@ -281,22 +274,17 @@ public class MessagesContactsPanel extends UserBasePanel {
 				item.add(new Label("from", getDisplayName(m.getFrom())));
 				item.add(new Label("subject", m.getSubject()));
 				item.add(new Label("send", getDateFormat().format(m.getInserted())));
-				item.add(new AjaxEventBehavior(EVT_CLICK) {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onEvent(AjaxRequestTarget target) {
-						long selected = id;
-						if (selectedMessages.contains(id)) {
-							selectedMessages.remove(id);
-							selected = selectedMessages.isEmpty() ? -1 : selectedMessages.iterator().next();
-						} else {
-							selectedMessages.add(id);
-						}
-						selectMessage(selected, target);
-						target.add(container);
+				item.add(AjaxEventBehavior.onEvent(EVT_CLICK, target -> {
+					long selected = id;
+					if (selectedMessages.contains(id)) {
+						selectedMessages.remove(id);
+						selected = selectedMessages.isEmpty() ? -1 : selectedMessages.iterator().next();
+					} else {
+						selectedMessages.add(id);
 					}
-				});
+					selectMessage(selected, target);
+					target.add(container);
+				}));
 				StringBuilder cssClass = new StringBuilder(m.getIsRead() ? "" : CSS_UNREAD);
 				if (selectedMessages.contains(id)) {
 					cssClass.append(" selected");
@@ -461,24 +449,14 @@ public class MessagesContactsPanel extends UserBasePanel {
 					item.add(AttributeModifier.append(ATTR_CLASS, CSS_UNREAD));
 				}
 				item.add(new Label("name", getName(uc)));
-				item.add(new WebMarkupContainer("accept").add(new AjaxEventBehavior(EVT_CLICK) {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onEvent(AjaxRequestTarget target) {
-						ContactsHelper.acceptUserContact(contactId);
-						updateContacts(target);
-					}
-				}).setVisible(uc.isPending()));
-				item.add(new WebMarkupContainer("decline").add(new AjaxEventBehavior(EVT_CLICK) {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					protected void onEvent(AjaxRequestTarget target) {
-						contactDao.delete(contactId);
-						updateContacts(target);
-					}
-				}).setVisible(uc.isPending()));
+				item.add(new WebMarkupContainer("accept").add(AjaxEventBehavior.onEvent(EVT_CLICK, target -> {
+					ContactsHelper.acceptUserContact(contactId);
+					updateContacts(target);
+				})).setVisible(uc.isPending()));
+				item.add(new WebMarkupContainer("decline").add(AjaxEventBehavior.onEvent(EVT_CLICK, target -> {
+					contactDao.delete(contactId);
+					updateContacts(target);
+				})).setVisible(uc.isPending()));
 				item.add(new WebMarkupContainer("view").add(AttributeModifier.append("data-user-id", userId)));
 				item.add(new WebMarkupContainer("message").add(AttributeModifier.append("data-user-id", userId)).setVisible(!uc.isPending()));
 				BootstrapAjaxLink<String> del = new BootstrapAjaxLink<>("delete", Buttons.Type.Outline_Danger) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java
index 3e54e8b..91b7588 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java
@@ -30,6 +30,7 @@ import org.apache.openmeetings.web.admin.backup.BackupPanel;
 import org.apache.openmeetings.web.admin.configurations.ConfigsPanel;
 import org.apache.openmeetings.web.admin.connection.ConnectionsPanel;
 import org.apache.openmeetings.web.admin.email.EmailPanel;
+import org.apache.openmeetings.web.admin.extra.ExtraPanel;
 import org.apache.openmeetings.web.admin.groups.GroupsPanel;
 import org.apache.openmeetings.web.admin.labels.LangPanel;
 import org.apache.openmeetings.web.admin.ldaps.LdapsPanel;
@@ -73,6 +74,7 @@ public class OmUrlFragment implements Serializable {
 	public static final String TYPE_BACKUP = "backup";
 	public static final String TYPE_OAUTH2 = "oauth2";
 	public static final String TYPE_EMAIL = "email";
+	public static final String TYPE_EXTRA = "extra";
 	public static final String TYPE_SEARCH = "search";
 	public static final String TYPE_INVITATION = "invitation";
 	public static final String TYPE_WIDGET = "widget";
@@ -109,6 +111,7 @@ public class OmUrlFragment implements Serializable {
 		, ADMIN_BACKUP
 		, ADMIN_OAUTH
 		, ADMIN_EMAIL
+		, ADMIN_EXTRA
 		, PROFILE_MESSAGE
 		, PROFILE_EDIT
 		, PROFILE_SEARCH
@@ -187,6 +190,10 @@ public class OmUrlFragment implements Serializable {
 				setArea(AreaKeys.admin);
 				setType(TYPE_EMAIL);
 				break;
+			case ADMIN_EXTRA:
+				setArea(AreaKeys.admin);
+				setType(TYPE_EXTRA);
+				break;
 			case PROFILE_MESSAGE:
 				setArea(AreaKeys.profile);
 				setType(TYPE_MESSAGES);
@@ -262,6 +269,8 @@ public class OmUrlFragment implements Serializable {
 					basePanel = new OAuthPanel(CHILD_ID);
 				} else if (TYPE_EMAIL.equals(type)) {
 					basePanel = new EmailPanel(CHILD_ID);
+				} else if (TYPE_EXTRA.equals(type)) {
+					basePanel = new ExtraPanel(CHILD_ID);
 				}
 				break;
 			case profile:
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/db2_persistence.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/db2_persistence.xml
index 4381c72..71197e8 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/db2_persistence.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/db2_persistence.xml
@@ -44,6 +44,7 @@
 		<class>org.apache.openmeetings.db.entity.room.RoomModerator</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPoll</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPollAnswer</class>
+		<class>org.apache.openmeetings.db.entity.room.ExtraMenu</class>
 		<class>org.apache.openmeetings.db.entity.server.LdapConfig</class>
 		<class>org.apache.openmeetings.db.entity.server.OAuthServer</class>
 		<class>org.apache.openmeetings.db.entity.server.Sessiondata</class>
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/h2_persistence.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/h2_persistence.xml
index 27eb624..abac226 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/h2_persistence.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/h2_persistence.xml
@@ -44,6 +44,7 @@
 		<class>org.apache.openmeetings.db.entity.room.RoomModerator</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPoll</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPollAnswer</class>
+		<class>org.apache.openmeetings.db.entity.room.ExtraMenu</class>
 		<class>org.apache.openmeetings.db.entity.server.LdapConfig</class>
 		<class>org.apache.openmeetings.db.entity.server.OAuthServer</class>
 		<class>org.apache.openmeetings.db.entity.server.Sessiondata</class>
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mssql_persistence.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mssql_persistence.xml
index 4ea39f0..1da1012 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mssql_persistence.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mssql_persistence.xml
@@ -44,6 +44,7 @@
 		<class>org.apache.openmeetings.db.entity.room.RoomModerator</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPoll</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPollAnswer</class>
+		<class>org.apache.openmeetings.db.entity.room.ExtraMenu</class>
 		<class>org.apache.openmeetings.db.entity.server.LdapConfig</class>
 		<class>org.apache.openmeetings.db.entity.server.OAuthServer</class>
 		<class>org.apache.openmeetings.db.entity.server.Sessiondata</class>
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mysql_persistence.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mysql_persistence.xml
index d1127c0..76879b3 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mysql_persistence.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/mysql_persistence.xml
@@ -44,6 +44,7 @@
 		<class>org.apache.openmeetings.db.entity.room.RoomModerator</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPoll</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPollAnswer</class>
+		<class>org.apache.openmeetings.db.entity.room.ExtraMenu</class>
 		<class>org.apache.openmeetings.db.entity.server.LdapConfig</class>
 		<class>org.apache.openmeetings.db.entity.server.OAuthServer</class>
 		<class>org.apache.openmeetings.db.entity.server.Sessiondata</class>
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/oracle_persistence.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/oracle_persistence.xml
index 8a183ae..ef3326d 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/oracle_persistence.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/oracle_persistence.xml
@@ -44,6 +44,7 @@
 		<class>org.apache.openmeetings.db.entity.room.RoomModerator</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPoll</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPollAnswer</class>
+		<class>org.apache.openmeetings.db.entity.room.ExtraMenu</class>
 		<class>org.apache.openmeetings.db.entity.server.LdapConfig</class>
 		<class>org.apache.openmeetings.db.entity.server.OAuthServer</class>
 		<class>org.apache.openmeetings.db.entity.server.Sessiondata</class>
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/postgresql_persistence.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/postgresql_persistence.xml
index d8ff368..264eb47 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/postgresql_persistence.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/postgresql_persistence.xml
@@ -44,6 +44,7 @@
 		<class>org.apache.openmeetings.db.entity.room.RoomModerator</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPoll</class>
 		<class>org.apache.openmeetings.db.entity.room.RoomPollAnswer</class>
+		<class>org.apache.openmeetings.db.entity.room.ExtraMenu</class>
 		<class>org.apache.openmeetings.db.entity.server.LdapConfig</class>
 		<class>org.apache.openmeetings.db.entity.server.OAuthServer</class>
 		<class>org.apache.openmeetings.db.entity.server.Sessiondata</class>
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestMainAreas.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestMainAreas.java
index 81905a8..a24b3e2 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestMainAreas.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestMainAreas.java
@@ -24,6 +24,7 @@ import static org.apache.openmeetings.web.util.OmUrlFragment.TYPE_CONFIG;
 import static org.apache.openmeetings.web.util.OmUrlFragment.TYPE_CONNECTION;
 import static org.apache.openmeetings.web.util.OmUrlFragment.TYPE_EDIT;
 import static org.apache.openmeetings.web.util.OmUrlFragment.TYPE_EMAIL;
+import static org.apache.openmeetings.web.util.OmUrlFragment.TYPE_EXTRA;
 import static org.apache.openmeetings.web.util.OmUrlFragment.TYPE_GROUP;
 import static org.apache.openmeetings.web.util.OmUrlFragment.TYPE_LANG;
 import static org.apache.openmeetings.web.util.OmUrlFragment.TYPE_LDAP;
@@ -45,6 +46,7 @@ import org.apache.openmeetings.web.admin.backup.BackupPanel;
 import org.apache.openmeetings.web.admin.configurations.ConfigsPanel;
 import org.apache.openmeetings.web.admin.connection.ConnectionsPanel;
 import org.apache.openmeetings.web.admin.email.EmailPanel;
+import org.apache.openmeetings.web.admin.extra.ExtraPanel;
 import org.apache.openmeetings.web.admin.groups.GroupsPanel;
 import org.apache.openmeetings.web.admin.labels.LangPanel;
 import org.apache.openmeetings.web.admin.ldaps.LdapsPanel;
@@ -255,6 +257,16 @@ class TestMainAreas extends AbstractWicketTester {
 	}
 
 	@Test
+	void testAdminExtras() throws OmException {
+		checkArea(AreaKeys.admin, TYPE_EXTRA, ExtraPanel.class, adminUsername, groupAdminUsername);
+	}
+
+	@Test
+	void testAdminExtras1() throws OmException {
+		checkUnauthArea(AreaKeys.admin, TYPE_EXTRA, regularUsername);
+	}
+
+	@Test
 	void testAdminBad() throws OmException {
 		checkArea(AreaKeys.admin, "BAD", OmDashboardPanel.class, adminUsername);
 	}

[openmeetings] 02/02: [OPENMEETINGS-2604] label is renamed

Posted by so...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 55dd5c1dcdebd584f38f375f7557595a98b09b2c
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Thu Jun 17 07:32:42 2021 +0700

    [OPENMEETINGS-2604] label is renamed
---
 .../main/java/org/apache/openmeetings/web/admin/extra/ExtraPanel.html   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraPanel.html
index 05fa6a6..ede1f9d 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraPanel.html
@@ -55,7 +55,7 @@
 						<input type="text" wicket:id="link" class="col-8"/>
 					</div>
 					<div class="formelement">
-						<label wicket:for="description" class="col-3 text-right"><wicket:message key="admin.extra.desc" /></label>
+						<label wicket:for="description" class="col-3 text-right"><wicket:message key="lbl.description" /></label>
 						<textarea wicket:id="description" class="col-8"></textarea>
 					</div>
 					<div class="formelement">