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:57 UTC

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

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);
 	}