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/07/10 12:03:58 UTC

[openmeetings] 02/02: [OPENMEETINGS-2637] More work on migration

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

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

commit 45be7abc59cc7da8947329bcde473bf055b5ae0b
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Sat Jul 10 19:03:41 2021 +0700

    [OPENMEETINGS-2637] More work on migration
---
 openmeetings-web/src/main/front/chat/src/chat.js   |   2 +-
 .../openmeetings/web/admin/AdminActionsPanel.java  |   2 +-
 .../web/admin/configurations/ConfigsPanel.html     |   2 +-
 .../web/admin/connection/ConnectionsPanel.html     |   2 +-
 .../web/admin/connection/ConnectionsPanel.java     |   2 +-
 .../openmeetings/web/admin/email/EmailForm.java    |   2 +-
 .../openmeetings/web/admin/email/EmailPanel.html   |   2 +-
 .../openmeetings/web/admin/extra/ExtraPanel.html   |   2 +-
 .../web/admin/groups/GroupUsersPanel.html          |   2 +-
 .../web/admin/groups/GroupUsersPanel.java          |   2 +-
 .../openmeetings/web/admin/groups/GroupsPanel.html |   2 +-
 .../openmeetings/web/admin/labels/LangPanel.html   |   2 +-
 .../openmeetings/web/admin/labels/LangPanel.java   |   2 +-
 .../openmeetings/web/admin/ldaps/LdapsPanel.html   |   2 +-
 .../openmeetings/web/admin/oauth/OAuthForm.java    |   2 +-
 .../openmeetings/web/admin/oauth/OAuthPanel.html   |   4 +-
 .../openmeetings/web/admin/rooms/RoomForm.java     |   2 +-
 .../openmeetings/web/admin/rooms/RoomsPanel.html   |   8 +-
 .../openmeetings/web/admin/users/UsersPanel.html   |   2 +-
 .../openmeetings/web/common/FormActionsPanel.java  |   2 +-
 .../apache/openmeetings/web/common/MainPanel.java  |   2 +-
 .../web/common/UploadableImagePanel.java           |   2 +-
 .../common/confirmation/ConfirmationBehavior.java  | 112 ----
 .../common/confirmation/ConfirmationConfig.java    | 114 ----
 .../common/confirmation/ConfirmationHelper.java    |  44 ++
 .../common/confirmation/bootstrap-confirmation.js  | 596 ---------------------
 .../apache/openmeetings/web/room/NetTestPanel.html |  32 +-
 .../apache/openmeetings/web/room/RoomPanel.html    |   8 +-
 .../openmeetings/web/room/VideoSettings.html       |   2 +-
 .../web/room/activities/ActivitiesPanel.html       |   2 +-
 .../web/room/poll/PollResultsDialog.java           |   2 +-
 .../apache/openmeetings/web/room/raw-nettest.js    |   2 +-
 .../openmeetings/web/room/sidebar/RoomSidebar.html |   8 +-
 .../apache/openmeetings/web/room/wb/WbPanel.html   |  14 +-
 .../openmeetings/web/user/OmWysiwygToolbar.html    |   4 +-
 .../web/user/calendar/AppointmentDialog.html       |   6 +-
 .../web/user/calendar/AppointmentDialog.java       |   2 +-
 .../web/user/calendar/CalendarDialog.java          |   2 +-
 .../openmeetings/web/user/chat/ChatToolbar.html    |  12 +-
 .../openmeetings/web/user/chat/ChatToolbar.java    |   4 +-
 .../web/user/dashboard/RssWidgetView.html          |   4 +-
 .../web/user/dashboard/StartWidgetView.html        |   8 +-
 .../dashboard/admin/AdminCleanupInfoDialog.java    |   2 +-
 .../apache/openmeetings/web/user/dashboard/rss.js  |   2 +-
 .../web/user/profile/InvitationDetails.java        |   2 +-
 .../web/user/profile/InvitationsPanel.html         |   2 +-
 .../web/user/profile/MessagesContactsPanel.java    |   2 +-
 .../web/user/profile/UserSearchPanel.html          |   2 +-
 .../web/user/profile/WidgetsPanel.html             |   2 +-
 .../WEB-INF/classes/META-INF/mysql_persistence.xml |   2 +-
 .../webapp/WEB-INF/classes/openmeetings.properties |   4 +-
 .../src/main/webapp/css/raw-activities.css         |   2 +-
 openmeetings-web/src/main/webapp/css/raw-admin.css |   4 +-
 openmeetings-web/src/main/webapp/css/raw-chat.css  |   2 +-
 .../src/main/webapp/css/raw-general.css            |  11 +-
 openmeetings-web/src/main/webapp/css/raw-menu.css  |   4 +-
 .../src/main/webapp/css/raw-nettest.css            |  20 +-
 openmeetings-web/src/main/webapp/css/raw-room.css  |  58 +-
 openmeetings-web/src/main/webapp/css/raw-tree.css  |  18 +-
 openmeetings-web/src/main/webapp/css/raw-wb.css    |   2 +-
 60 files changed, 205 insertions(+), 966 deletions(-)

diff --git a/openmeetings-web/src/main/front/chat/src/chat.js b/openmeetings-web/src/main/front/chat/src/chat.js
index e5a5086..a9cba60 100644
--- a/openmeetings-web/src/main/front/chat/src/chat.js
+++ b/openmeetings-web/src/main/front/chat/src/chat.js
@@ -214,7 +214,7 @@ function _addTab(id, label) {
 	if (!label) {
 		label = id === "chatTab-all" ? allPrefix : roomPrefix + id.substr(9);
 	}
-	const link = $('<a class="nav-link" data-toggle="tab" role="tab">')
+	const link = $('<a class="nav-link" data-bs-toggle="tab" role="tab">')
 		.attr('aria-controls', id)
 		.attr('href', '#' + id).text(label)
 		, li = $('<li class="nav-item">').append(link);
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminActionsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminActionsPanel.java
index 68f2cd9..2a1ddad 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminActionsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminActionsPanel.java
@@ -18,7 +18,7 @@
  */
 package org.apache.openmeetings.web.admin;
 
-import static org.apache.openmeetings.web.common.confirmation.ConfirmationBehavior.newOkCancelDangerConfirm;
+import static org.apache.openmeetings.web.common.confirmation.ConfirmationHelper.newOkCancelDangerConfirm;
 
 import org.apache.openmeetings.web.common.FormActionsPanel;
 import org.apache.wicket.ajax.AjaxRequestTarget;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigsPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigsPanel.html
index 8f29abd..0e09781 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigsPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigsPanel.html
@@ -23,7 +23,7 @@
 <wicket:extend>
 	<div class="adminPanelColumnTable col-6">
 		<div class="adminNav" wicket:id="navigator">[dataview navigator]</div>
-		<table class="list-table table-striped table-hover">
+		<table class="list-table table table-striped table-hover">
 			<thead>
 				<tr>
 					<th class="col-1"><span wicket:id="orderById"></span><wicket:message key="188" /></th>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.html
index 56fd80e..b42d4c1 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.html
@@ -23,7 +23,7 @@
 <wicket:extend>
 	<div class="adminPanelColumnTable col-6">
 		<div class="adminNav" wicket:id="navigator">[dataview navigator]</div>
-		<table class="list-table table-striped table-hover">
+		<table class="list-table table table-striped table-hover">
 			<thead>
 				<tr>
 					<th class="col-2"><wicket:message key="45" /></th>
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 9132b84..39160b7 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
@@ -20,7 +20,7 @@ package org.apache.openmeetings.web.admin.connection;
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
 import static org.apache.openmeetings.web.app.WebSession.getDateFormat;
-import static org.apache.openmeetings.web.common.confirmation.ConfirmationBehavior.newOkCancelConfirm;
+import static org.apache.openmeetings.web.common.confirmation.ConfirmationHelper.newOkCancelConfirm;
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailForm.java
index 4ea2256..d0c530b 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailForm.java
@@ -18,7 +18,7 @@
  */
 package org.apache.openmeetings.web.admin.email;
 
-import static org.apache.openmeetings.web.common.confirmation.ConfirmationBehavior.newOkCancelDangerConfirm;
+import static org.apache.openmeetings.web.common.confirmation.ConfirmationHelper.newOkCancelDangerConfirm;
 
 import org.apache.openmeetings.db.dao.basic.MailMessageDao;
 import org.apache.openmeetings.db.entity.basic.MailMessage;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailPanel.html
index 18215f0..0e50931 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailPanel.html
@@ -23,7 +23,7 @@
 <wicket:extend>
 	<div class="adminPanelColumnTable col-6">
 		<div class="adminNav" wicket:id="navigator">[dataview navigator]</div>
-		<table class="list-table table-striped table-hover">
+		<table class="list-table table table-striped table-hover">
 			<thead>
 				<tr>
 					<th class="col-1"><span wicket:id="orderById"></span><wicket:message key="188" /></th>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraPanel.html
index ede1f9d..0129cd6 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraPanel.html
@@ -23,7 +23,7 @@
 <wicket:extend>
 	<div class="adminPanelColumnTable col-6">
 		<div class="adminNav" wicket:id="navigator">[dataview navigator]</div>
-		<table class="list-table table-striped table-hover">
+		<table class="list-table table table-striped table-hover">
 			<thead>
 				<tr>
 					<th class="col-1"><span wicket:id="orderById"></span><wicket:message key="188" /></th>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.html
index b6c8dc6..3532dcc 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.html
@@ -22,7 +22,7 @@
 <wicket:panel>
 	<div class="usergroupspanel">
 		<div class="adminNav" wicket:id="navigator">[dataview navigator]</div>
-		<table class="list-table small table-striped table-hover">
+		<table class="list-table small table table-striped table-hover">
 			<thead>
 				<tr>
 					<th class="col-1" wicket:message="title:98"><wicket:message key="98" /></th>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.java
index 10a7605..9c5e899 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.java
@@ -18,7 +18,7 @@
  */
 package org.apache.openmeetings.web.admin.groups;
 
-import static org.apache.openmeetings.web.common.confirmation.ConfirmationBehavior.newOkCancelDangerConfirm;
+import static org.apache.openmeetings.web.common.confirmation.ConfirmationHelper.newOkCancelDangerConfirm;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.html
index 12a5218..8ba3630 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.html
@@ -23,7 +23,7 @@
 <wicket:extend>
 	<div class="adminPanelColumnTable col-6">
 		<div class="adminNav" wicket:id="navigator">[dataview navigator]</div>
-		<table class="list-table table-striped table-hover">
+		<table class="list-table table table-striped table-hover">
 			<thead>
 				<tr>
 					<th class="col-1"><span wicket:id="orderById"></span><wicket:message key="188" /></th>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.html
index f833b68..263b1c8 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.html
@@ -38,7 +38,7 @@
 			</div>
 		</form>
 		<div class="adminNav" wicket:id="navigator">[dataview navigator]</div>
-		<table class="list-table table-striped table-hover">
+		<table class="list-table table table-striped table-hover">
 			<thead>
 				<tr>
 					<th class="col-6"><span wicket:id="orderByName"></span><wicket:message key="165" /></th>
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 93cde50..2219359 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
@@ -20,7 +20,7 @@ package org.apache.openmeetings.web.admin.labels;
 
 import static java.time.Duration.ZERO;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
-import static org.apache.openmeetings.web.common.confirmation.ConfirmationBehavior.newOkCancelDangerConfirm;
+import static org.apache.openmeetings.web.common.confirmation.ConfirmationHelper.newOkCancelDangerConfirm;
 import static org.apache.wicket.request.resource.ContentDisposition.ATTACHMENT;
 
 import java.io.IOException;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapsPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapsPanel.html
index 479f70c..6b0baed 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapsPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapsPanel.html
@@ -23,7 +23,7 @@
 <wicket:extend>
 	<div class="adminPanelColumnTable col-6">
 		<div class="adminNav" wicket:id="navigator">[dataview navigator]</div>
-		<table class="list-table table-striped table-hover">
+		<table class="list-table table table-striped table-hover">
 			<thead>
 				<tr>
 					<th class="col-1"><span wicket:id="orderById"></span><wicket:message key="188" /></th>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthForm.java
index 63a724a..a04da13 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthForm.java
@@ -20,7 +20,7 @@ package org.apache.openmeetings.web.admin.oauth;
 
 import static org.apache.openmeetings.web.app.UserManager.getRedirectUri;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
-import static org.apache.openmeetings.web.common.confirmation.ConfirmationBehavior.newOkCancelDangerConfirm;
+import static org.apache.openmeetings.web.common.confirmation.ConfirmationHelper.newOkCancelDangerConfirm;
 
 import java.util.AbstractMap.SimpleEntry;
 import java.util.ArrayList;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthPanel.html
index 60c008e..fa67bc3 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthPanel.html
@@ -23,7 +23,7 @@
 <wicket:extend>
 	<div class="adminPanelColumnTable col-6">
 		<div class="adminNav" wicket:id="navigator">[dataview navigator]</div>
-		<table class="list-table table-striped table-hover">
+		<table class="list-table table table-striped table-hover">
 			<thead>
 				<tr>
 					<th class="col-1"><span wicket:id="orderById"></span><wicket:message key="188" /></th>
@@ -110,7 +110,7 @@
 							<button type="button" wicket:id="addMapping"></button>
 						</div>
 					</div>
-					<table class="list-table small table-striped table-hover">
+					<table class="list-table small table table-striped table-hover">
 						<thead>
 							<tr>
 								<th class="col-7"><wicket:message key="admin.oauth.attr.om" /></th>
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 b93776d..6048d49 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
@@ -25,7 +25,7 @@ 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.openmeetings.web.common.confirmation.ConfirmationHelper.newOkCancelDangerConfirm;
 import static org.apache.wicket.validation.validator.StringValidator.maximumLength;
 
 import java.util.ArrayList;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.html
index 11b87f2..2972a75 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.html
@@ -23,7 +23,7 @@
 <wicket:extend>
 	<div class="adminPanelColumnTable rooms col-6">
 		<div class="adminNav" wicket:id="navigator">[dataview navigator]</div>
-		<table class="list-table table-striped table-hover">
+		<table class="list-table table table-striped table-hover">
 			<thead>
 				<tr>
 					<th class="col-1"><span wicket:id="orderById"></span><wicket:message key="188" /></th>
@@ -191,7 +191,7 @@
 							<button type="button" wicket:id="addFiles"></button>
 						</div>
 					</div>
-					<table class="list-table small table-striped table-hover">
+					<table class="list-table small table table-striped table-hover">
 						<thead>
 							<tr>
 								<th class="col-9"><wicket:message key="165" /></th>
@@ -214,7 +214,7 @@
 				<!-- Users in this Room -->
 				<fieldset>
 					<legend><wicket:message key="407" /></legend>
-					<table class="list-table small table-striped table-hover">
+					<table class="list-table small table table-striped table-hover">
 						<thead>
 							<tr>
 								<th class="col-1"><wicket:message key="188" /></th>
@@ -258,7 +258,7 @@
 						<div class="om-select2 p-0 d-inline-block col-8"><select wicket:id="moderator2add" class="input w-100"></select></div>
 					</div>
 					<div class="formelement" wicket:id="moderatorContainer">
-						<table class="list-table small table-striped table-hover">
+						<table class="list-table small table table-striped table-hover">
 							<thead>
 								<tr>
 									<th class="col-1 overflow-hidden" wicket:message="title:817"><wicket:message key="817" /></th>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.html
index ef56e1b..1e55600 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.html
@@ -23,7 +23,7 @@
 <wicket:extend>
 	<div class="adminPanelColumnTable col-6">
 		<div class="adminNav" wicket:id="navigator">[dataview navigator]</div>
-		<table class="list-table table-striped table-hover">
+		<table class="list-table table table-striped table-hover">
 			<thead>
 				<tr>
 					<th class="col-1"><span wicket:id="orderById"></span> <wicket:message key="188" /></th>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/FormActionsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/FormActionsPanel.java
index abd9863..d78f22a 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/FormActionsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/FormActionsPanel.java
@@ -18,7 +18,7 @@
  */
 package org.apache.openmeetings.web.common;
 
-import static org.apache.openmeetings.web.common.confirmation.ConfirmationBehavior.newOkCancelDangerConfirm;
+import static org.apache.openmeetings.web.common.confirmation.ConfirmationHelper.newOkCancelDangerConfirm;
 
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
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 76e636c..de66cf5 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
@@ -23,7 +23,7 @@ import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.PARAM_USER_ID;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.isMyRoomsEnabled;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
-import static org.apache.openmeetings.web.common.confirmation.ConfirmationBehavior.newOkCancelConfirm;
+import static org.apache.openmeetings.web.common.confirmation.ConfirmationHelper.newOkCancelConfirm;
 import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
 import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getParam;
 import static org.apache.openmeetings.web.util.OmUrlFragment.CHILD_ID;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/UploadableImagePanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/UploadableImagePanel.java
index 26aab2e..0ec1d92 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/UploadableImagePanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/UploadableImagePanel.java
@@ -19,7 +19,7 @@
 package org.apache.openmeetings.web.common;
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getMaxUploadSize;
-import static org.apache.openmeetings.web.common.confirmation.ConfirmationBehavior.newOkCancelConfirm;
+import static org.apache.openmeetings.web.common.confirmation.ConfirmationHelper.newOkCancelConfirm;
 
 import java.io.File;
 import java.util.Optional;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/confirmation/ConfirmationBehavior.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/confirmation/ConfirmationBehavior.java
deleted file mode 100644
index 5b0864f..0000000
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/confirmation/ConfirmationBehavior.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * 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.common.confirmation;
-
-import static de.agilecoders.wicket.jquery.JQuery.$;
-
-import org.apache.wicket.Component;
-import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.head.JavaScriptHeaderItem;
-import org.apache.wicket.resource.JQueryPluginResourceReference;
-import org.apache.wicket.util.lang.Args;
-
-import de.agilecoders.wicket.core.markup.html.bootstrap.behavior.BootstrapJavascriptBehavior;
-import de.agilecoders.wicket.core.util.References;
-
-/**
- * A behavior that shows a popover with OK/Cancel buttons to confirm an action.
- *
- * @since 0.9.12
- */
-public class ConfirmationBehavior extends BootstrapJavascriptBehavior {
-	/** serialVersionUID. */
-	private static final long serialVersionUID = 1L;
-	/** Configuration. */
-	private final ConfirmationConfig config;
-	/**
-	 * Jquery Selector (if you don't want to use the one of the component for
-	 * singleton for example).
-	 */
-	private final String selector;
-
-	/**
-	 * Constructor that uses the default configuration
-	 */
-	public ConfirmationBehavior() {
-		this(null, new ConfirmationConfig());
-	}
-
-	/**
-	 * Constructor that uses a custom configuration
-	 *
-	 * @param config
-	 *            configuration to use
-	 */
-	public ConfirmationBehavior(ConfirmationConfig config) {
-		this(null, config);
-	}
-
-	/**
-	 * Constructor that uses a custom configuration
-	 *
-	 * @param config
-	 *            configuration to use
-	 * @param selector
-	 *            Jquery selector to use instead of the one of the component
-	 *            (for singleton's option)
-	 */
-	public ConfirmationBehavior(String selector, ConfirmationConfig config) {
-		this.config = Args.notNull(config, "config");
-		this.selector = selector;
-	}
-
-	@Override
-	public void renderHead(Component component, IHeaderResponse response) {
-		super.renderHead(component, response);
-
-		References.renderWithFilter(response, JavaScriptHeaderItem
-				.forReference(new JQueryPluginResourceReference(ConfirmationBehavior.class, "bootstrap-confirmation.js")));
-
-		if (selector == null) {
-			config.withRootSelector(component.getMarkupId());
-			response.render($(component).chain("confirmation", config).asDomReadyScript());
-		} else {
-			config.withRootSelector(selector);
-			response.render($(selector).chain("confirmation", config).asDomReadyScript());
-		}
-	}
-
-	public static ConfirmationBehavior newOkCancelConfirm(Component c, String title) {
-		return new ConfirmationBehavior(newOkCancelConfirmCfg(c, title));
-	}
-
-	public static ConfirmationConfig newOkCancelConfirmCfg(Component c, String title) {
-		return new ConfirmationConfig()
-				.withBtnCancelLabel(c.getString("lbl.cancel"))
-				.withBtnOkLabel(c.getString("54"))
-				.withTitle(title);
-	}
-
-	public static ConfirmationBehavior newOkCancelDangerConfirm(Component c, String title) {
-		return new ConfirmationBehavior(newOkCancelConfirmCfg(c, title)
-				.withBtnOkClass("btn btn-sm btn-danger")
-				.withBtnOkIconClass("fas fa-exclamation-triangle")
-				);
-	}
-}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/confirmation/ConfirmationConfig.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/confirmation/ConfirmationConfig.java
deleted file mode 100644
index ddffd8a..0000000
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/confirmation/ConfirmationConfig.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * 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.common.confirmation;
-
-import org.apache.wicket.util.lang.Args;
-
-import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipConfig;
-import de.agilecoders.wicket.jquery.AbstractConfig;
-import de.agilecoders.wicket.jquery.IKey;
-import de.agilecoders.wicket.jquery.Key;
-
-/**
- * The configuration of {@link ConfirmationBehavior}. <br/>
- * See
- * <a href="http://mistic100.github.io/Bootstrap-Confirmation/#usage">Bootstrap
- * Confirmation usage</a> for all possible options and their meaning.
- */
-public class ConfirmationConfig extends AbstractConfig {
-	private static final long serialVersionUID = 1L;
-	private static final IKey<String> Title = new Key<>("title", "Are you sure?");
-	private static final IKey<Boolean> Singleton = new Key<>("singleton", Boolean.FALSE);
-	private static final IKey<Boolean> Popout = new Key<>("popout", Boolean.FALSE);
-	private static final IKey<String> BtnOkClass = new Key<>("btnOkClass", "btn-xs btn-primary");
-	private static final IKey<String> BtnOkIconClass = new Key<>("btnOkIconClass", "glyphicon glyphicon-ok");
-	private static final IKey<String> BtnOkIconContent = new Key<>("btnOkIconContent");
-	private static final IKey<String> BtnOkLabel = new Key<>("btnOkLabel", "Yes");
-	private static final IKey<String> BtnCancelClass = new Key<>("btnCancelClass", "btn-xs btn-default");
-	private static final IKey<String> BtnCancelIconClass = new Key<>("btnCancelIconClass", "glyphicon glyphicon-remove");
-	private static final IKey<String> BtnCancelIconContent = new Key<>("btnCancelIconContent");
-	private static final IKey<String> BtnCancelLabel = new Key<>("btnCancelLabel", "No");
-	private static final IKey<TooltipConfig.Placement> Placement = new Key<>("placement", TooltipConfig.Placement.top);
-	private static final IKey<String> RootSelector = new Key<>("rootSelector");
-
-	public ConfirmationConfig withTitle(String title) {
-		put(Title, title);
-		return this;
-	}
-
-	ConfirmationConfig withRootSelector(String rootSelector) {
-		put(RootSelector, rootSelector);
-		return this;
-	}
-
-	public ConfirmationConfig withBtnOkClass(String btnOkClass) {
-		put(BtnOkClass, btnOkClass);
-		return this;
-	}
-
-	public ConfirmationConfig withBtnOkIconClass(String btnOkIconClass) {
-		put(BtnOkIconClass, btnOkIconClass);
-		return this;
-	}
-
-	public ConfirmationConfig withBtnOkIconContent(String btnOkIconContent) {
-		put(BtnOkIconContent, btnOkIconContent);
-		return this;
-	}
-
-	public ConfirmationConfig withBtnOkLabel(String btnOkLabel) {
-		put(BtnOkLabel, btnOkLabel);
-		return this;
-	}
-
-	public ConfirmationConfig withBtnCancelClass(String btnCancelClass) {
-		put(BtnCancelClass, btnCancelClass);
-		return this;
-	}
-
-	public ConfirmationConfig withBtnCancelIconClass(String btnCancelIconClass) {
-		put(BtnCancelIconClass, btnCancelIconClass);
-		return this;
-	}
-
-	public ConfirmationConfig withBtnCancelIconContent(String btnCancelIconContent) {
-		put(BtnCancelIconContent, btnCancelIconContent);
-		return this;
-	}
-
-	public ConfirmationConfig withBtnCancelLabel(String btnCancelLabel) {
-		put(BtnCancelLabel, btnCancelLabel);
-		return this;
-	}
-
-	public ConfirmationConfig withSingleton(boolean singleton) {
-		put(Singleton, singleton);
-		return this;
-	}
-
-	public ConfirmationConfig withPopout(boolean popout) {
-		put(Popout, popout);
-		return this;
-	}
-
-	public ConfirmationConfig withPlacement(TooltipConfig.Placement placement) {
-		put(Placement, Args.notNull(placement, "placement"));
-		return this;
-	}
-}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/confirmation/ConfirmationHelper.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/confirmation/ConfirmationHelper.java
new file mode 100644
index 0000000..b3a06cc
--- /dev/null
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/confirmation/ConfirmationHelper.java
@@ -0,0 +1,44 @@
+/*
+ * 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.common.confirmation;
+
+import org.apache.wicket.Component;
+
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.confirmation.ConfirmationBehavior;
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.confirmation.ConfirmationConfig;
+
+public class ConfirmationHelper {
+	public static ConfirmationBehavior newOkCancelConfirm(Component c, String title) {
+		return new ConfirmationBehavior(newOkCancelConfirmCfg(c, title));
+	}
+
+	public static ConfirmationConfig newOkCancelConfirmCfg(Component c, String title) {
+		return new ConfirmationConfig()
+				.withBtnCancelLabel(c.getString("lbl.cancel"))
+				.withBtnOkLabel(c.getString("54"))
+				.withTitle(title);
+	}
+
+	public static ConfirmationBehavior newOkCancelDangerConfirm(Component c, String title) {
+		return new ConfirmationBehavior(newOkCancelConfirmCfg(c, title)
+				.withBtnOkClass("btn btn-sm btn-danger")
+				.withBtnOkIconClass("fas fa-exclamation-triangle")
+				);
+	}
+}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/confirmation/bootstrap-confirmation.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/confirmation/bootstrap-confirmation.js
deleted file mode 100644
index 72fd81a..0000000
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/confirmation/bootstrap-confirmation.js
+++ /dev/null
@@ -1,596 +0,0 @@
-/*!
- * Bootstrap Confirmation (v4.1.0)
- * @copyright 2013 Nimit Suwannagate <et...@hotmail.com>
- * @copyright 2014-2018 Damien "Mistic" Sorel <co...@git.strangeplanet.fr>
- * @licence Apache License, Version 2.0
- */
-/* Licensed under the Apache License, Version 2.0 (the "License") http://www.apache.org/licenses/LICENSE-2.0 */
-(function (global, factory) {
-  typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('jquery'), require('bootstrap')) :
-  typeof define === 'function' && define.amd ? define(['jquery', 'bootstrap'], factory) :
-  (global = global || self, factory(global.jQuery));
-}(this, function ($) { 'use strict';
-
-  $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
-
-  function _defineProperties(target, props) {
-    for (var i = 0; i < props.length; i++) {
-      var descriptor = props[i];
-      descriptor.enumerable = descriptor.enumerable || false;
-      descriptor.configurable = true;
-      if ("value" in descriptor) descriptor.writable = true;
-      Object.defineProperty(target, descriptor.key, descriptor);
-    }
-  }
-
-  function _createClass(Constructor, protoProps, staticProps) {
-    if (protoProps) _defineProperties(Constructor.prototype, protoProps);
-    if (staticProps) _defineProperties(Constructor, staticProps);
-    return Constructor;
-  }
-
-  function _defineProperty(obj, key, value) {
-    if (key in obj) {
-      Object.defineProperty(obj, key, {
-        value: value,
-        enumerable: true,
-        configurable: true,
-        writable: true
-      });
-    } else {
-      obj[key] = value;
-    }
-
-    return obj;
-  }
-
-  function _objectSpread(target) {
-    for (var i = 1; i < arguments.length; i++) {
-      var source = arguments[i] != null ? arguments[i] : {};
-      var ownKeys = Object.keys(source);
-
-      if (typeof Object.getOwnPropertySymbols === 'function') {
-        ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
-          return Object.getOwnPropertyDescriptor(source, sym).enumerable;
-        }));
-      }
-
-      ownKeys.forEach(function (key) {
-        _defineProperty(target, key, source[key]);
-      });
-    }
-
-    return target;
-  }
-
-  function _inheritsLoose(subClass, superClass) {
-    subClass.prototype = Object.create(superClass.prototype);
-    subClass.prototype.constructor = subClass;
-    subClass.__proto__ = superClass;
-  }
-
-  if (typeof $.fn.popover === 'undefined' || $.fn.popover.Constructor.VERSION.split('.').shift() !== '4') {
-    throw new Error('Bootstrap Confirmation 4 requires Bootstrap Popover 4');
-  }
-
-  var Popover = $.fn.popover.Constructor;
-
-  /**
-   * ------------------------------------------------------------------------
-   * Constants
-   * ------------------------------------------------------------------------
-   */
-
-  var NAME = 'confirmation';
-  var VERSION = '4.1.0';
-  var DATA_KEY = "bs." + NAME;
-  var EVENT_KEY = "." + DATA_KEY;
-  var JQUERY_NO_CONFLICT = $.fn[NAME];
-  var BTN_CLASS_BASE = 'h-100 d-flex align-items-center';
-  var BTN_CLASS_DEFAULT = 'btn btn-sm';
-
-  var DefaultType = _objectSpread({}, Popover.DefaultType, {
-    singleton: 'boolean',
-    popout: 'boolean',
-    copyAttributes: '(string|array)',
-    onConfirm: 'function',
-    onCancel: 'function',
-    btnOkClass: 'string',
-    btnOkLabel: 'string',
-    btnOkIconClass: 'string',
-    btnOkIconContent: 'string',
-    btnCancelClass: 'string',
-    btnCancelLabel: 'string',
-    btnCancelIconClass: 'string',
-    btnCancelIconContent: 'string',
-    buttons: 'array'
-  });
-
-  var Default = _objectSpread({}, Popover.Default, {
-    _attributes: {},
-    _selector: null,
-    placement: 'top',
-    title: 'Are you sure?',
-    trigger: 'click',
-    confirmationEvent: undefined,
-    content: '',
-    singleton: false,
-    popout: false,
-    copyAttributes: 'href target',
-    onConfirm: $.noop,
-    onCancel: $.noop,
-    btnOkClass: BTN_CLASS_DEFAULT + " btn-primary",
-    btnOkLabel: 'Yes',
-    btnOkIconClass: '',
-    btnOkIconContent: '',
-    btnCancelClass: BTN_CLASS_DEFAULT + " btn-secondary",
-    btnCancelLabel: 'No',
-    btnCancelIconClass: '',
-    btnCancelIconContent: '',
-    buttons: [],
-    // @formatter:off
-    template: "\n<div class=\"popover confirmation\">\n  <div class=\"arrow\"></div>\n  <h3 class=\"popover-header\"></h3>\n  <div class=\"popover-body\">\n    <p class=\"confirmation-content\"></p>\n    <div class=\"confirmation-buttons text-center\">\n      <div class=\"btn-group\"></div>\n    </div>\n  </div>\n</div>" // @formatter:on
-
-  });
-
-  if (Default.whiteList) {
-    Default.whiteList['*'].push('data-apply', 'data-dismiss');
-  }
-
-  var ClassName = {
-    FADE: 'fade',
-    SHOW: 'show'
-  };
-  var Selector = {
-    TITLE: '.popover-header',
-    CONTENT: '.confirmation-content',
-    BUTTONS: '.confirmation-buttons .btn-group'
-  };
-  var Keymap = {
-    13: 'Enter',
-    27: 'Escape',
-    39: 'ArrowRight',
-    40: 'ArrowDown'
-  };
-  var Event = {
-    HIDE: "hide" + EVENT_KEY,
-    HIDDEN: "hidden" + EVENT_KEY,
-    SHOW: "show" + EVENT_KEY,
-    SHOWN: "shown" + EVENT_KEY,
-    INSERTED: "inserted" + EVENT_KEY,
-    CLICK: "click" + EVENT_KEY,
-    FOCUSIN: "focusin" + EVENT_KEY,
-    FOCUSOUT: "focusout" + EVENT_KEY,
-    MOUSEENTER: "mouseenter" + EVENT_KEY,
-    MOUSELEAVE: "mouseleave" + EVENT_KEY,
-    CONFIRMED: "confirmed" + EVENT_KEY,
-    CANCELED: "canceled" + EVENT_KEY,
-    KEYUP: "keyup" + EVENT_KEY
-  };
-  /**
-   * ------------------------------------------------------------------------
-   * Class Definition
-   * ------------------------------------------------------------------------
-   */
-  // keep track of the last openned confirmation for keyboard navigation
-
-  var activeConfirmation;
-
-  var Confirmation =
-  /*#__PURE__*/
-  function (_Popover) {
-    _inheritsLoose(Confirmation, _Popover);
-
-    _createClass(Confirmation, null, [{
-      key: "VERSION",
-      // Getters
-      get: function get() {
-        return VERSION;
-      }
-    }, {
-      key: "Default",
-      get: function get() {
-        return Default;
-      }
-    }, {
-      key: "NAME",
-      get: function get() {
-        return NAME;
-      }
-    }, {
-      key: "DATA_KEY",
-      get: function get() {
-        return DATA_KEY;
-      }
-    }, {
-      key: "Event",
-      get: function get() {
-        return Event;
-      }
-    }, {
-      key: "EVENT_KEY",
-      get: function get() {
-        return EVENT_KEY;
-      }
-    }, {
-      key: "DefaultType",
-      get: function get() {
-        return DefaultType;
-      } // Constructor
-
-    }]);
-
-    function Confirmation(element, config) {
-      var _this;
-
-      _this = _Popover.call(this, element, config) || this;
-      element.setAttribute('title', element.getAttribute('data-original-title'));
-      element.setAttribute('data-original-title', '');
-
-      if ((_this.config.popout || _this.config.singleton) && !_this.config.rootSelector) {
-        throw new Error('The rootSelector option is required to use popout and singleton features since jQuery 3.');
-      } // keep trace of selectors
-
-
-      _this._isDelegate = false;
-
-      if (config.selector) {
-        // container of buttons
-        config._selector = config.rootSelector + " " + config.selector;
-        _this.config._selector = config._selector;
-      } else if (config._selector) {
-        // children of container
-        _this.config._selector = config._selector;
-        _this._isDelegate = true;
-      } else {
-        // standalone
-        _this.config._selector = config.rootSelector;
-      }
-
-      if (_this.config.confirmationEvent === undefined) {
-        _this.config.confirmationEvent = _this.config.trigger;
-      }
-
-      if (!_this.config.selector) {
-        _this._copyAttributes();
-      }
-
-      _this._setConfirmationListeners();
-
-      return _this;
-    } // Overrides
-
-
-    var _proto = Confirmation.prototype;
-
-    _proto.isWithContent = function isWithContent() {
-      return true;
-    };
-
-    _proto.setContent = function setContent() {
-      var $tip = $(this.getTipElement());
-
-      var content = this._getContent();
-
-      if (typeof content === 'function') {
-        content = content.call(this.element);
-      }
-
-      this.setElementContent($tip.find(Selector.TITLE), this.getTitle());
-      $tip.find(Selector.CONTENT).toggle(!!content);
-
-      if (content) {
-        this.setElementContent($tip.find(Selector.CONTENT), content);
-      }
-
-      if (this.config.buttons.length > 0) {
-        this._setButtons($tip, this.config.buttons);
-      } else {
-        this._setStandardButtons($tip);
-      }
-
-      $tip.removeClass(ClassName.FADE + " " + ClassName.SHOW);
-
-      this._setupKeyupEvent();
-    };
-
-    _proto.dispose = function dispose() {
-      $('body').off(Event.CLICK + "." + this.uid);
-      this.eventBody = false;
-
-      this._cleanKeyupEvent();
-
-      _Popover.prototype.dispose.call(this);
-    };
-
-    _proto.hide = function hide(callback) {
-      this._cleanKeyupEvent();
-
-      _Popover.prototype.hide.call(this, callback);
-    } // Private
-
-    /**
-     * Copy the value of `copyAttributes` on the config object
-     * @private
-     */
-    ;
-
-    _proto._copyAttributes = function _copyAttributes() {
-      var _this2 = this;
-
-      this.config._attributes = {};
-
-      if (this.config.copyAttributes) {
-        if (typeof this.config.copyAttributes === 'string') {
-          this.config.copyAttributes = this.config.copyAttributes.split(' ');
-        }
-      } else {
-        this.config.copyAttributes = [];
-      }
-
-      this.config.copyAttributes.forEach(function (attr) {
-        _this2.config._attributes[attr] = $(_this2.element).attr(attr);
-      });
-    }
-    /**
-     * Custom event listeners for popouts and singletons
-     * @private
-     */
-    ;
-
-    _proto._setConfirmationListeners = function _setConfirmationListeners() {
-      var self = this;
-
-      if (!this.config.selector) {
-        // cancel original event
-        $(this.element).on(this.config.trigger, function (e, ack) {
-          if (!ack) {
-            e.preventDefault();
-            e.stopPropagation();
-            e.stopImmediatePropagation();
-          }
-        }); // manage singleton
-
-        $(this.element).on(Event.SHOWN, function () {
-          if (self.config.singleton) {
-            // close all other popover already initialized
-            $(self.config._selector).not($(this)).filter(function () {
-              return $(this).data(DATA_KEY) !== undefined;
-            }).confirmation('hide');
-          }
-        });
-      } else {
-        // cancel original event
-        $(this.element).on(this.config.trigger, this.config.selector, function (e, ack) {
-          if (!ack) {
-            e.preventDefault();
-            e.stopPropagation();
-            e.stopImmediatePropagation();
-          }
-        });
-      }
-
-      if (!this._isDelegate) {
-        // manage popout
-        this.eventBody = false;
-        this.uid = this.element.id || Confirmation.getUID(NAME + "_group");
-        $(this.element).on(Event.SHOWN, function () {
-          if (self.config.popout && !self.eventBody) {
-            self.eventBody = $('body').on(Event.CLICK + "." + self.uid, function (e) {
-              if ($(self.config._selector).is(e.target) || $(self.config._selector).has(e.target).length > 0) {
-                return;
-              } // close all popover already initialized
-
-
-              $(self.config._selector).filter(function () {
-                return $(this).data(DATA_KEY) !== undefined;
-              }).confirmation('hide');
-              $('body').off(Event.CLICK + "." + self.uid);
-              self.eventBody = false;
-            });
-          }
-        });
-      }
-    }
-    /**
-     * Init the standard ok/cancel buttons
-     * @param $tip
-     * @private
-     */
-    ;
-
-    _proto._setStandardButtons = function _setStandardButtons($tip) {
-      var buttons = [{
-        class: this.config.btnOkClass,
-        label: this.config.btnOkLabel,
-        iconClass: this.config.btnOkIconClass,
-        iconContent: this.config.btnOkIconContent,
-        attr: this.config._attributes
-      }, {
-        class: this.config.btnCancelClass,
-        label: this.config.btnCancelLabel,
-        iconClass: this.config.btnCancelIconClass,
-        iconContent: this.config.btnCancelIconContent,
-        cancel: true
-      }];
-
-      this._setButtons($tip, buttons);
-    }
-    /**
-     * Init the buttons
-     * @param $tip
-     * @param buttons
-     * @private
-     */
-    ;
-
-    _proto._setButtons = function _setButtons($tip, buttons) {
-      var self = this;
-      var $group = $tip.find(Selector.BUTTONS).empty();
-      buttons.forEach(function (button) {
-        var btn = $('<a href="#"></a>').addClass(BTN_CLASS_BASE).addClass(button.class || BTN_CLASS_DEFAULT + " btn-secondary").html(button.label || '').attr(button.attr || {});
-
-        if (button.iconClass || button.iconContent) {
-          btn.prepend($('<i></i>').addClass(button.iconClass || '').text(button.iconContent || ''));
-        }
-
-        btn.one('click', function (e) {
-          if ($(this).attr('href') === '#') {
-            e.preventDefault();
-          }
-
-          if (button.onClick) {
-            button.onClick.call($(self.element));
-          }
-
-          if (button.cancel) {
-            self.config.onCancel.call(self.element, button.value);
-            $(self.element).trigger(Event.CANCELED, [button.value]);
-          } else {
-            self.config.onConfirm.call(self.element, button.value);
-            $(self.element).trigger(Event.CONFIRMED, [button.value]);
-            $(self.element).trigger(self.config.confirmationEvent, [true]);
-          }
-
-          self.hide();
-        });
-        $group.append(btn);
-      });
-    }
-    /**
-     * Install the keyboatd event handler
-     * @private
-     */
-    ;
-
-    _proto._setupKeyupEvent = function _setupKeyupEvent() {
-      activeConfirmation = this;
-      $(window).off(Event.KEYUP).on(Event.KEYUP, this._onKeyup.bind(this));
-    }
-    /**
-     * Remove the keyboard event handler
-     * @private
-     */
-    ;
-
-    _proto._cleanKeyupEvent = function _cleanKeyupEvent() {
-      if (activeConfirmation === this) {
-        activeConfirmation = undefined;
-        $(window).off(Event.KEYUP);
-      }
-    }
-    /**
-     * Event handler for keyboard navigation
-     * @param event
-     * @private
-     */
-    ;
-
-    _proto._onKeyup = function _onKeyup(event) {
-      if (!this.tip) {
-        this._cleanKeyupEvent();
-
-        return;
-      }
-
-      var $tip = $(this.getTipElement());
-      var key = event.key || Keymap[event.keyCode || event.which];
-      var $group = $tip.find(Selector.BUTTONS);
-      var $active = $group.find('.active');
-      var $next;
-
-      switch (key) {
-        case 'Escape':
-          this.hide();
-          break;
-
-        case 'ArrowRight':
-          if ($active.length && $active.next().length) {
-            $next = $active.next();
-          } else {
-            $next = $group.children().first();
-          }
-
-          $active.removeClass('active');
-          $next.addClass('active').focus();
-          break;
-
-        case 'ArrowLeft':
-          if ($active.length && $active.prev().length) {
-            $next = $active.prev();
-          } else {
-            $next = $group.children().last();
-          }
-
-          $active.removeClass('active');
-          $next.addClass('active').focus();
-          break;
-
-        default:
-          break;
-      }
-    } // Static
-
-    /**
-     * Generates an uui, copied from Bootrap's utils
-     * @param {string} prefix
-     * @returns {string}
-     */
-    ;
-
-    Confirmation.getUID = function getUID(prefix) {
-      var uid = prefix;
-
-      do {
-        // eslint-disable-next-line no-bitwise
-        uid += ~~(Math.random() * 1000000); // "~~" acts like a faster Math.floor() here
-      } while (document.getElementById(uid));
-
-      return uid;
-    };
-
-    Confirmation._jQueryInterface = function _jQueryInterface(config) {
-      return this.each(function () {
-        var data = $(this).data(DATA_KEY);
-
-        var _config = typeof config === 'object' ? config : {};
-
-        _config.rootSelector = $(this).selector || _config.rootSelector; // this.selector removed in jQuery > 3
-
-        if (!data && /destroy|hide/.test(config)) {
-          return;
-        }
-
-        if (!data) {
-          data = new Confirmation(this, _config);
-          $(this).data(DATA_KEY, data);
-        }
-
-        if (typeof config === 'string') {
-          if (typeof data[config] === 'undefined') {
-            throw new TypeError("No method named \"" + config + "\"");
-          }
-
-          data[config]();
-        }
-      });
-    };
-
-    return Confirmation;
-  }(Popover);
-  /**
-   * ------------------------------------------------------------------------
-   * jQuery
-   * ------------------------------------------------------------------------
-   */
-
-
-  $.fn[NAME] = Confirmation._jQueryInterface;
-  $.fn[NAME].Constructor = Confirmation;
-
-  $.fn[NAME].noConflict = function () {
-    $.fn[NAME] = JQUERY_NO_CONFLICT;
-    return Confirmation._jQueryInterface;
-  };
-
-}));
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/NetTestPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/NetTestPanel.html
index 196bfc31..b1b6a03 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/NetTestPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/NetTestPanel.html
@@ -31,36 +31,44 @@
 			<div class="card-body">
 				<h5 class="card-title"><i class="far fa-clock"></i>&nbsp;<wicket:message key="network.test.ping"/></h5>
 				<p class="card-text value"></p>
-				<button class="test-btn btn btn-block btn-outline not-started" data-measure="ping" data-start="true" data-next="jitter" wicket:message="data-lbl:network.test.ping">
-					<i class="fas"></i>
-				</button>
+				<div class="d-grid gap-2">
+					<button class="test-btn btn btn-outline not-started" data-measure="ping" data-start="true" data-next="jitter" wicket:message="data-lbl:network.test.ping">
+						<i class="fas"></i>
+					</button>
+				</div>
 			</div>
 		</div>
 		<div class="test-container card" id="test-jitter">
 			<div class="card-body">
 				<h5 class="card-title"><i class="far fa-clock"></i>&nbsp;<wicket:message key="network.test.jitter"/></h5>
 				<p class="card-text value"></p>
-				<button class="test-btn btn btn-block btn-outline not-started" data-measure="jitter" data-next="upload" wicket:message="data-lbl:network.test.jitter">
-					<i class="fas"></i>
-				</button>
+				<div class="d-grid gap-2">
+					<button class="test-btn btn btn-outline not-started" data-measure="jitter" data-next="upload" wicket:message="data-lbl:network.test.jitter">
+						<i class="fas"></i>
+					</button>
+				</div>
 			</div>
 		</div>
 		<div class="test-container card" id="test-upload">
 			<div class="card-body">
 				<h5 class="card-title"><i class="fas fa-file-upload"></i>&nbsp;<wicket:message key="network.test.upl"/></h5>
 				<p class="card-text value"></p>
-				<button class="test-btn btn btn-block btn-outline not-started" data-measure="upload" data-next="download" wicket:message="data-lbl:network.test.upl">
-					<i class="fas"></i>
-				</button>
+				<div class="d-grid gap-2">
+					<button class="test-btn btn btn-outline not-started" data-measure="upload" data-next="download" wicket:message="data-lbl:network.test.upl">
+						<i class="fas"></i>
+					</button>
+				</div>
 			</div>
 		</div>
 		<div class="test-container card" id="test-download">
 			<div class="card-body">
 				<h5 class="card-title"><i class="fas fa-file-download"></i>&nbsp;<wicket:message key="network.test.dwn"/></h5>
 				<p class="card-text value"></p>
-				<button class="test-btn btn btn-block btn-outline not-started" data-measure="download" wicket:message="data-lbl:network.test.dwn">
-					<i class="fas"></i>
-				</button>
+				<div class="d-grid gap-2">
+					<button class="test-btn btn btn-outline not-started" data-measure="download" wicket:message="data-lbl:network.test.dwn">
+						<i class="fas"></i>
+					</button>
+				</div>
 			</div>
 		</div>
 		<div class="output">
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
index f0698d8..8847544 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
@@ -81,7 +81,7 @@
 			<div class="modal-content">
 				<div class="modal-header">
 					<h5 class="modal-title"><wicket:message key="204"/></h5>
-					<button type="button" class="close" data-bs-dismiss="modal" wicket:message="aria-label:85"></button>
+					<button type="button" class="btn-close" data-bs-dismiss="modal" wicket:message="aria-label:85"></button>
 				</div>
 				<div class="modal-body">
 					<wicket:message key="556"/>
@@ -128,18 +128,18 @@
 		</div>
 		<div id="quick-vote-template">
 			<div class="close-btn btn btn-outline-secondary btn-sm"
-				 wicket:message="title:85,data-btn-ok-label:54,data-btn-cancel-label:lbl.cancel,data-title:832,data-content:1419"
+				 wicket:message="title:85,data-btn-ok-label:54,data-btn-cancel-label:lbl.cancel,data-title:832,data-bs-content:1419"
 				 data-btn-ok-class="btn btn-sm btn-danger"
 				 data-btn-ok-icon-class="fas fa-exclamation-triangle">
 				<i class="fas fa-times"></i>
 			</div>
 			<div class="control pro clickable">
 				<i class="fas fa-plus-circle"></i>
-				<span class="badge badge-primary">0</span>
+				<span class="badge bg-primary">0</span>
 			</div>
 			<div class="control con">
 				<i class="fas fa-times-circle"></i>
-				<span class="badge badge-primary">0</span>
+				<span class="badge bg-primary">0</span>
 			</div>
 		</div>
 		<div id="sharer" wicket:message="title:730">
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.html
index b6a2363..2d98bc3 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.html
@@ -78,7 +78,7 @@
 							</div>
 							<canvas class="level-meter" data-orientation="horizontal" wicket:message="title:767" width="250" height="16"></canvas>
 							<div class="sett-row right">
-								<div class="timer badge badge-primary"><span class="time"></span>&nbsp;<wicket:message key="network.test.sec"/></div>
+								<div class="timer badge bg-primary"><span class="time"></span>&nbsp;<wicket:message key="network.test.sec"/></div>
 								<div><button class="play btn btn-outline-primary"><i class="fas fa-play"></i>&nbsp;<wicket:message key="764"/></button></div>
 								<div class="clear"></div>
 							</div>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.html
index b18e23a..2674f50 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.html
@@ -23,7 +23,7 @@
 <wicket:panel>
 	<div class="clickable control block bg-secondary" wicket:message="data-new-aa:notification.room.activity">
 		<i class="fas me-1 fa-angle-up"></i>
-		<span class="badge badge-secondary">42</span>
+		<span class="badge bg-secondary">42</span>
 		<div class="label"><wicket:message key="1363"/></div>
 	</div>
 	<div class="ctrl bg-white">
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 3522b44..bfa2ef8 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
@@ -21,7 +21,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 static org.apache.openmeetings.web.common.confirmation.ConfirmationHelper.newOkCancelDangerConfirm;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-nettest.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-nettest.js
index d2d111d..26bab6e 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-nettest.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-nettest.js
@@ -214,7 +214,7 @@ var NetTest = (function() {
 	function _setResult(val) {
 		const btn = _btn();
 		btn.addClass('complete').removeClass('started');
-		btn.parent().find('.value').html(val);
+		btn.parent().parent().find('.value').html(val);
 		testNext = btn.data('next');
 		if (!testNext) {
 			bulk = false;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html
index 14123fe..ac671e8 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html
@@ -24,13 +24,13 @@
 	<div class="tabs" id="room-sidebar-tabs">
 		<ul class="nav nav-tabs" role="tablist">
 			<li class="nav-item">
-				<a href="#room-sidebar-tab-users" class="nav-link active om-icon big tab user" id="room-sidebar-users-tab" data-toggle="tab" role="tab" aria-controls="room-sidebar-tab-users" wicket:message="title:398">
+				<a href="#room-sidebar-tab-users" class="nav-link active om-icon big tab user" id="room-sidebar-users-tab" data-bs-toggle="tab" role="tab" aria-controls="room-sidebar-tab-users" wicket:message="title:398">
 					<i class="fas fa-users"></i>
-					<span class="label"><wicket:message key="398"/>&nbsp;</span><span class="badge badge-info user-count"></span>
+					<span class="label"><wicket:message key="398"/>&nbsp;</span><span class="badge bg-info user-count"></span>
 				</a>
 			</li>
 			<li class="nav-item" wicket:enclosure="file-tab">
-				<a href="#room-sidebar-tab-files" class="nav-link om-icon big tab file" id="room-sidebar-files-tab" data-toggle="tab" role="tab" aria-controls="room-sidebar-tab-files" wicket:message="title:245" wicket:id="file-tab">
+				<a href="#room-sidebar-tab-files" class="nav-link om-icon big tab file" id="room-sidebar-files-tab" data-bs-toggle="tab" role="tab" aria-controls="room-sidebar-tab-files" wicket:message="title:245" wicket:id="file-tab">
 					<i class="fas fa-folder"></i>
 					<span class="label"><wicket:message key="245"/></span>
 				</a>
@@ -106,7 +106,7 @@
 				<i class="fas"></i>
 			</span>
 			<span class="om-icon align-left kick bumper clickable"
-					wicket:message="title:603,data-btn-ok-label:54,data-btn-cancel-label:lbl.cancel,data-title:603,data-content:605"
+					wicket:message="title:603,data-btn-ok-label:54,data-btn-cancel-label:lbl.cancel,data-title:603,data-bs-content:605"
 					data-btn-ok-class="btn btn-sm btn-danger"
 					data-btn-ok-icon-class="fas fa-exclamation-triangle">
 				<i class="fas fa-ban text-danger"></i>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html
index c442b36..4c09f6f 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html
@@ -41,13 +41,13 @@
 		</div>
 		<ul>
 			<li id="wb-area-tab" class="nav-item">
-				<a class="nav-link" data-toggle="tab" role="tab">
+				<a class="nav-link" data-bs-toggle="tab" role="tab">
 					<span class="wb-nav-tab-text"></span>
 				</a>
 			</li>
 		</ul>
 		<button id="wb-tab-close" class="btn btn-sm btn-outline-secondary btn-no-border wb-tab-close"
-				wicket:message="title:85,data-btn-ok-label:54,data-btn-cancel-label:lbl.cancel,data-title:832,data-content:1313"
+				wicket:message="title:85,data-btn-ok-label:54,data-btn-cancel-label:lbl.cancel,data-title:832,data-bs-content:1313"
 				data-btn-ok-class="btn btn-sm btn-danger"
 				data-btn-ok-icon-class="fas fa-exclamation-triangle"
 				>
@@ -55,14 +55,14 @@
 			<span class="sr-only"><wicket:message key="85"/></span>
 		</button>
 		<div id="wb-area-texts" class="btn-group texts dropleft">
-			<a class="dropdown-toggle" data-toggle="dropdown"></a>
+			<a class="dropdown-toggle" data-bs-toggle="dropdown"></a>
 			<div class="dropdown-menu">
 				<div wicket:message="title:73" class="clickable om-icon big text"></div>
 				<div wicket:message="title:82" class="clickable om-icon big textbox"></div>
 			</div>
 		</div>
 		<div id="wb-area-drawings" class="btn-group drawings dropleft">
-			<a class="dropdown-toggle" data-toggle="dropdown"></a>
+			<a class="dropdown-toggle" data-bs-toggle="dropdown"></a>
 			<div class="dropdown-menu">
 				<div wicket:message="title:74" class="clickable om-icon big paint"></div>
 				<div wicket:message="title:75" class="clickable om-icon big line"></div>
@@ -74,7 +74,7 @@
 			</div>
 		</div>
 		<div id="wb-area-cliparts" class="btn-group cliparts dropleft">
-			<a class="dropdown-toggle" data-toggle="dropdown" wicket:message="title:1323"></a>
+			<a class="dropdown-toggle" data-bs-toggle="dropdown" wicket:message="title:1323"></a>
 			<div class="dropdown-menu">
 				<div wicket:id="clipart" class="clickable om-icon big clipart" data-image="./public/cliparts/"></div>
 			</div>
@@ -130,11 +130,11 @@
 		</div>
 		<div id="wb-tools">
 			<div class="clickable om-icon big clear-all"
-				wicket:message="title:62,data-btn-ok-label:54,data-btn-cancel-label:lbl.cancel,data-title:80,data-content:1340"
+				wicket:message="title:62,data-btn-ok-label:54,data-btn-cancel-label:lbl.cancel,data-title:80,data-bs-content:1340"
 				data-btn-ok-class="btn btn-sm btn-danger"
 				data-btn-ok-icon-class="fas fa-exclamation-triangle"></div>
 			<div class="clickable om-icon big clear-slide"
-				wicket:message="title:1005,data-btn-ok-label:54,data-btn-cancel-label:lbl.cancel,data-title:80,data-content:1359"
+				wicket:message="title:1005,data-btn-ok-label:54,data-btn-cancel-label:lbl.cancel,data-title:80,data-bs-content:1359"
 				data-btn-ok-class="btn btn-sm btn-danger"
 				data-btn-ok-icon-class="fas fa-exclamation-triangle"></div>
 			<div wicket:message="title:199" class="clickable om-icon big save"></div>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/OmWysiwygToolbar.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/OmWysiwygToolbar.html
index 0ebca7b..48c1e2e 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/OmWysiwygToolbar.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/OmWysiwygToolbar.html
@@ -20,7 +20,7 @@
 <wicket:panel>
 	<div wicket:id="toolbar" class="btn-toolbar wysiwyg-toolbar" data-role="editor-toolbar">
 		<div class="btn-group">
-			<a wicket:id="fontSize" id="fontSize" class="btn btn-outline-secondary dropdown-toggle" data-toggle="dropdown" role="button" title="Font Size"> A </a>
+			<a wicket:id="fontSize" id="fontSize" class="btn btn-outline-secondary dropdown-toggle" data-bs-toggle="dropdown" role="button" title="Font Size"> A </a>
 			<ul class="dropdown-menu">
 				<li><a wicket:id="huge" class="font-huge text-center clickable" data-edit="fontSize 5"></a></li>
 				<li><a wicket:id="medium" class="font-small text-center clickable" data-edit="fontSize 3"></a></li>
@@ -62,7 +62,7 @@
 			</a>
 		</div>
 		<div class="btn-group">
-			<a wicket:id="hyperlink" class="btn btn-outline-secondary dropdown-toggle" data-toggle="dropdown" title="">
+			<a wicket:id="hyperlink" class="btn btn-outline-secondary dropdown-toggle" data-bs-toggle="dropdown" title="">
 				<i class="fas fa-link"></i>
 			</a>
 			<div class="dropdown-menu input-append">
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.html
index 21b61a6..bcf293e 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.html
@@ -25,9 +25,9 @@
 		<span wicket:id="feedback"></span>
 		<div class="tabs">
 			<ul class="nav nav-tabs" role="tablist">
-				<li class="nav-item"><a class="nav-link active" id="tab1-tab" data-toggle="tab" role="tab" aria-controls="tab1" href="#tab1"><wicket:message key="lbl.general"/></a></li>
-				<li class="nav-item"><a class="nav-link" id="tab2-tab" data-toggle="tab" role="tab" aria-controls="tab2" href="#tab2"><wicket:message key="406"/></a></li>
-				<li class="nav-item"><a class="nav-link" id="tab3-tab" data-toggle="tab" role="tab" aria-controls="tab3" href="#tab3"><wicket:message key="appointment.tab.advanced"/></a></li>
+				<li class="nav-item"><a class="nav-link active" id="tab1-tab" data-bs-toggle="tab" role="tab" aria-controls="tab1" href="#tab1"><wicket:message key="lbl.general"/></a></li>
+				<li class="nav-item"><a class="nav-link" id="tab2-tab" data-bs-toggle="tab" role="tab" aria-controls="tab2" href="#tab2"><wicket:message key="406"/></a></li>
+				<li class="nav-item"><a class="nav-link" id="tab3-tab" data-bs-toggle="tab" role="tab" aria-controls="tab3" href="#tab3"><wicket:message key="appointment.tab.advanced"/></a></li>
 			</ul>
 			<div class="tab-content">
 				<div id="tab1" class="tab-pane fade show active pt-1" role="tabpanel" aria-labelledby="tab1-tab">
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 9100e9b..757d0b3 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
@@ -22,7 +22,7 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.isMyRoomsEnable
 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.common.confirmation.ConfirmationHelper.newOkCancelDangerConfirm;
 import static org.apache.openmeetings.web.util.CalendarWebHelper.getDate;
 import static org.apache.openmeetings.web.util.CalendarWebHelper.getDateTime;
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarDialog.java
index 2ab4c66..68156a6 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarDialog.java
@@ -19,7 +19,7 @@
 package org.apache.openmeetings.web.user.calendar;
 
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
-import static org.apache.openmeetings.web.common.confirmation.ConfirmationBehavior.newOkCancelDangerConfirm;
+import static org.apache.openmeetings.web.common.confirmation.ConfirmationHelper.newOkCancelDangerConfirm;
 
 import java.util.List;
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.html
index 3edfb5c..6e4f265 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.html
@@ -22,13 +22,13 @@
 <html xmlns:wicket="http://wicket.apache.org">
 <wicket:panel>
 	<div wicket:id="toolbar" class="btn-toolbar chat-toolbar navbar navbar-expand navbar-light bg-light p-0" data-role="editor-toolbar">
-		<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarChatContent" aria-controls="navbarChatContent" aria-expanded="false">
+		<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarChatContent" aria-controls="navbarChatContent" aria-expanded="false">
 			<span class="navbar-toggler-icon"></span>
 		</button>
 		<div class="collapse navbar-collapse" id="navbarChatContent">
 			<ul class="navbar-nav ms-auto">
 				<li class="nav-item dropup">
-					<a id="emoticons" class="chat btn btn-outline-secondary emt dropdown-toggle nav-link" data-toggle="dropdown" title="Emoticons"></a>
+					<a id="emoticons" class="chat btn btn-outline-secondary emt dropdown-toggle nav-link" data-bs-toggle="dropdown" title="Emoticons"></a>
 					<ul class="chat dropdown-menu" >
 						<li>
 							<table id="emotMenuList">
@@ -37,7 +37,7 @@
 					</ul>
 				</li>
 				<li class="nav-item dropup">
-					<a id="fontSize" class="chat btn btn-outline-secondary dropdown-toggle nav-link" data-toggle="dropdown" role="button" title="Font Size"> A </a>
+					<a id="fontSize" class="chat btn btn-outline-secondary dropdown-toggle nav-link" data-bs-toggle="dropdown" role="button" title="Font Size"> A </a>
 					<div class="dropdown-menu">
 						<a class="dropdown-item" data-edit="fontSize 5"><span class="font-huge text-center clickable">Huge</span></a>
 						<a class="dropdown-item" data-edit="fontSize 3"><span class="font-small text-center clickable">Normal</span></a>
@@ -45,7 +45,7 @@
 					</div>
 				</li>
 				<li class="nav-item dropup">
-					<a id="fontStyle" class="chat btn btn-outline-secondary dropdown-toggle nav-link" data-toggle="dropdown" title="Font Style">
+					<a id="fontStyle" class="chat btn btn-outline-secondary dropdown-toggle nav-link" data-bs-toggle="dropdown" title="Font Style">
 						<i class="fas fa-cog"></i>
 					</a>
 					<ul class="dropdown-menu btns-only">
@@ -56,7 +56,7 @@
 					</ul>
 				</li>
 				<li class="nav-item dropup">
-					<a id="hyperlink" class="chat btn btn-outline-secondary dropdown-toggle nav-link" data-toggle="dropdown" title="Hyperlink">
+					<a id="hyperlink" class="chat btn btn-outline-secondary dropdown-toggle nav-link" data-bs-toggle="dropdown" title="Hyperlink">
 						<i class="fas fa-link"></i>
 					</a>
 					<div class="dropdown-menu input-append">
@@ -65,7 +65,7 @@
 					</div>
 				</li>
 				<li class="nav-item dropup">
-					<a id="actions" class="chat btn btn-outline-secondary dropdown-toggle nav-link" data-toggle="dropdown" wicket:message="title:635">
+					<a id="actions" class="chat btn btn-outline-secondary dropdown-toggle nav-link" data-bs-toggle="dropdown" wicket:message="title:635">
 						<i class="fas fa-bars"></i>
 					</a>
 					<ul class="dropdown-menu btns-only">
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 635866c..eb4394a 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
@@ -26,7 +26,7 @@ import static org.apache.openmeetings.web.app.WebSession.getDateFormat;
 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_CLICK;
-import static org.apache.openmeetings.web.common.confirmation.ConfirmationBehavior.newOkCancelDangerConfirm;
+import static org.apache.openmeetings.web.common.confirmation.ConfirmationHelper.newOkCancelDangerConfirm;
 import static org.apache.openmeetings.web.room.RoomPanel.isModerator;
 
 import java.util.List;
@@ -173,7 +173,7 @@ public class ChatToolbar extends Panel implements IWysiwygToolbar {
 
 	@Override
 	public void attachToEditor(Component editor) {
-		toolbar.add(AttributeModifier.replace("data-target", JQueryWidget.getSelector(editor)));
+		toolbar.add(AttributeModifier.replace("data-bs-target", JQueryWidget.getSelector(editor)));
 	}
 
 	@Override
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/RssWidgetView.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/RssWidgetView.html
index e1cfaca..34d1e4c 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/RssWidgetView.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/RssWidgetView.html
@@ -24,8 +24,8 @@
 	<div id="feedcontainer"></div>
 	<div class="d-none">
 		<div class="card" id="rss-item-template">
-			<div class="card-header p-0">
-				<button class="btn btn-outline-info btn-block" type="button" data-toggle="collapse"></button>
+			<div class="card-header p-0 d-grid gap-2">
+				<button class="btn btn-outline-info" type="button" data-bs-toggle="collapse"></button>
 			</div>
 			<div class="collapse">
 				<div class="card-body"></div>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/StartWidgetView.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/StartWidgetView.html
index 5228ede..f6b7324 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/StartWidgetView.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/StartWidgetView.html
@@ -23,21 +23,21 @@
 <wicket:panel>
 	<h3><wicket:message key="widget.start.header"/></h3>
 	<div wicket:id="step1" class="clickable start_step1">
-		<span class="badge badge-pill badge-secondary">1</span>
+		<span class="badge rounded-pill bg-secondary">1</span>
 		<wicket:message key="768"/>
 	</div>
 	<div wicket:id="step2" class="clickable start_step2">
-		<span class="badge badge-pill badge-secondary">2</span>
+		<span class="badge rounded-pill bg-secondary">2</span>
 		<wicket:message key="771"/>
 	</div>
 	<div wicket:id="step3" class="start_step3">
 		<a wicket:id="avTest" target="_blank" rel="noopener noreferrer">
-			<span class="badge badge-pill badge-secondary">3</span>
+			<span class="badge rounded-pill bg-secondary">3</span>
 			<wicket:message key="772"/>
 		</a>
 	</div>
 	<div wicket:id="step4" class="clickable start_step4">
-		<span class="badge badge-pill badge-secondary">4</span>
+		<span class="badge rounded-pill bg-secondary">4</span>
 		<wicket:message key="773"/>
 	</div>
 	<table>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/admin/AdminCleanupInfoDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/admin/AdminCleanupInfoDialog.java
index 5d76376..44509eb 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/admin/AdminCleanupInfoDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/admin/AdminCleanupInfoDialog.java
@@ -26,7 +26,7 @@ import static org.apache.openmeetings.cli.CleanupHelper.getRecUnit;
 import static org.apache.openmeetings.util.OmFileHelper.getHumanSize;
 import static org.apache.openmeetings.util.OmFileHelper.getStreamsDir;
 import static org.apache.openmeetings.util.OmFileHelper.getUploadDir;
-import static org.apache.openmeetings.web.common.confirmation.ConfirmationBehavior.newOkCancelDangerConfirm;
+import static org.apache.openmeetings.web.common.confirmation.ConfirmationHelper.newOkCancelDangerConfirm;
 
 import org.apache.openmeetings.cli.CleanupEntityUnit;
 import org.apache.openmeetings.cli.CleanupUnit;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/rss.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/rss.js
index 9ef9f64..5704a31 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/rss.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/rss.js
@@ -12,7 +12,7 @@ function displayRss(entries) {
 			, bodyId = `om-rss-content${i}`
 			, markup = OmUtil.tmpl('#rss-item-template');
 		markup.find('.card-header').attr('id', headId);
-		markup.find('button').attr('data-target', `#${bodyId}`).attr('aria-controls', bodyId)
+		markup.find('button').attr('data-bs-target', `#${bodyId}`).attr('aria-controls', bodyId)
 			.append(entries[i].title);
 		markup.find('.collapse').attr('id', bodyId).attr('aria-labelledby', headId);
 		markup.find('.card-body').html(entries[i].content);
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/InvitationDetails.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/InvitationDetails.java
index f8df56a..8e968e4 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/InvitationDetails.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/InvitationDetails.java
@@ -20,7 +20,7 @@ package org.apache.openmeetings.web.user.profile;
 
 import static org.apache.openmeetings.db.util.FormatHelper.formatUser;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
-import static org.apache.openmeetings.web.common.confirmation.ConfirmationBehavior.newOkCancelDangerConfirm;
+import static org.apache.openmeetings.web.common.confirmation.ConfirmationHelper.newOkCancelDangerConfirm;
 
 import java.util.Date;
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/InvitationsPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/InvitationsPanel.html
index 36d5a89..fe5549a 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/InvitationsPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/InvitationsPanel.html
@@ -24,7 +24,7 @@
 	<div class="adminPanel profile-panel">
 	<div class="adminPanelColumnTable">
 		<div class="adminNav" wicket:id="navigator">[dataview navigator]</div>
-		<table class="list-table table-striped table-hover">
+		<table class="list-table table table-striped table-hover">
 			<thead>
 				<tr>
 					<th class="col-1"><span wicket:id="orderById"></span><wicket:message key="188" /></th>
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 83d6b73..f5f6819 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
@@ -24,7 +24,7 @@ import static org.apache.openmeetings.db.entity.user.PrivateMessage.TRASH_FOLDER
 import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
 import static org.apache.openmeetings.web.app.WebSession.getDateFormat;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
-import static org.apache.openmeetings.web.common.confirmation.ConfirmationBehavior.newOkCancelDangerConfirm;
+import static org.apache.openmeetings.web.common.confirmation.ConfirmationHelper.newOkCancelDangerConfirm;
 
 import java.util.ArrayList;
 import java.util.HashSet;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserSearchPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserSearchPanel.html
index 5313e19..da9e44f 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserSearchPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserSearchPanel.html
@@ -37,7 +37,7 @@
 		</div>
 		<div wicket:id="container" class="pe-3 h-100">
 			<div><strong><wicket:message key="1184"/></strong>&nbsp;&nbsp;&nbsp;<div class="adminNav"  wicket:id="navigator"></div></div>
-			<table id="searchUsersTable" class="list-table table-striped table-hover">
+			<table id="searchUsersTable" class="list-table table table-striped table-hover">
 				<thead>
 					<tr>
 						<th class="col-3"><wicket:message key="165"/></th>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/WidgetsPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/WidgetsPanel.html
index d693306..b3ead92 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/WidgetsPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/WidgetsPanel.html
@@ -21,7 +21,7 @@
 <!DOCTYPE html>
 <html xmlns:wicket="http://wicket.apache.org">
 <wicket:panel>
-	<table class="widget table-striped table-hover">
+	<table class="widget table table-striped table-hover">
 		<tr>
 			<th><wicket:message key="165"/></th>
 			<th><wicket:message key="lbl.description"/></th>
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 76879b3..e4a09ba 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
@@ -63,7 +63,7 @@
 			<property name="openjpa.ConnectionDriverName" value="org.apache.commons.dbcp2.BasicDataSource" />
 			<property name="openjpa.ConnectionProperties"
 				value="DriverClassName=com.mysql.cj.jdbc.Driver
-					, Url=jdbc:mysql://localhost:3306/openmeetings?autoReconnect=true&amp;useUnicode=true&amp;createDatabaseIfNotExist=true&amp;characterEncoding=utf-8&amp;connectionCollation=utf8_general_ci&amp;cachePrepStmts=true&amp;cacheCallableStatements=true&amp;cacheServerConfiguration=true&amp;useLocalSessionState=true&amp;elideSetAutoCommits=true&amp;alwaysSendSetIsolation=false&amp;enableQueryTimeouts=false&amp;prepStmtCacheSize=3000&amp;prepStmtCacheSqlLimit=1000&amp;useSSL=false&amp;nullNam [...]
+					, Url=jdbc:mysql://192.168.1.102:3306/openmeetings?autoReconnect=true&amp;useUnicode=true&amp;createDatabaseIfNotExist=true&amp;characterEncoding=utf-8&amp;connectionCollation=utf8_general_ci&amp;cachePrepStmts=true&amp;cacheCallableStatements=true&amp;cacheServerConfiguration=true&amp;useLocalSessionState=true&amp;elideSetAutoCommits=true&amp;alwaysSendSetIsolation=false&amp;enableQueryTimeouts=false&amp;prepStmtCacheSize=3000&amp;prepStmtCacheSqlLimit=1000&amp;useSSL=false&amp;nul [...]
 					, maxTotal=100
 					, maxIdle=100
 					, minIdle=0
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings.properties b/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings.properties
index 54796a3..3c60aa4 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings.properties
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings.properties
@@ -65,7 +65,7 @@ nettest.max.clients=50
 
 ################## SIP ##################
 ### Should be updated with real values for Asterisk ###
-sip.hostname=
+sip.hostname=192.168.1.102
 sip.manager.port=5038
 sip.manager.user=openmeetings
 sip.manager.password=12345
@@ -74,7 +74,7 @@ sip.manager.timeout=10000
 sip.ws.local.port.min=6666
 sip.ws.local.port.max=7666
 ## 127.0.0.1 is NOT working here
-sip.ws.local.host=
+sip.ws.local.host=192.168.1.211
 sip.ws.remote.port=8088
 sip.ws.remote.user=omsip_user
 sip.ws.remote.password=12345
diff --git a/openmeetings-web/src/main/webapp/css/raw-activities.css b/openmeetings-web/src/main/webapp/css/raw-activities.css
index 681a59d..8198104 100644
--- a/openmeetings-web/src/main/webapp/css/raw-activities.css
+++ b/openmeetings-web/src/main/webapp/css/raw-activities.css
@@ -26,7 +26,7 @@
 	position: relative;
 	padding: 5px;
 	margin-bottom: 3px;
-	border-bottom: 1px solid var(--secondary);
+	border-bottom: 1px solid var(--bs-secondary);
 }
 .activity.item button {
 	padding: 0 5px;
diff --git a/openmeetings-web/src/main/webapp/css/raw-admin.css b/openmeetings-web/src/main/webapp/css/raw-admin.css
index b3918be..2691a26 100644
--- a/openmeetings-web/src/main/webapp/css/raw-admin.css
+++ b/openmeetings-web/src/main/webapp/css/raw-admin.css
@@ -88,11 +88,11 @@
 }
 .onoff-checkbox + .onoff-label::before {
 	content: '\f204';
-	color: var(--danger);
+	color: var(--bs-danger);
 }
 .onoff-checkbox:checked + .onoff-label::before {
 	content: '\f205';
-	color: var(--success);
+	color: var(--bs-success);
 }
 .addLanguagePanel select {
 	padding: 0px 0px;
diff --git a/openmeetings-web/src/main/webapp/css/raw-chat.css b/openmeetings-web/src/main/webapp/css/raw-chat.css
index a2f3c9e..bfaf9c2 100644
--- a/openmeetings-web/src/main/webapp/css/raw-chat.css
+++ b/openmeetings-web/src/main/webapp/css/raw-chat.css
@@ -53,7 +53,7 @@
 	content: "\f104";
 }
 #chat .messageArea .msg-row.need-moderation {
-	background-color: var(--warning);
+	background-color: var(--bs-warning);
 }
 #chat .messageArea .time {
 	margin-right: 5px;
diff --git a/openmeetings-web/src/main/webapp/css/raw-general.css b/openmeetings-web/src/main/webapp/css/raw-general.css
index e05380f..35d38d8 100644
--- a/openmeetings-web/src/main/webapp/css/raw-general.css
+++ b/openmeetings-web/src/main/webapp/css/raw-general.css
@@ -215,7 +215,7 @@ html, body {
 .om-icon::before {
 	font-family: 'Font Awesome 5 Free';
 	font-weight: 900;
-	color: var(--secondary);
+	color: var(--bs-secondary);
 	font-size: 1.2em;
 	vertical-align: text-bottom;
 	line-height: 1em;
@@ -228,11 +228,11 @@ html, body {
 	content: '\f055';
 }
 .online.om-icon::before {
-	color: var(--success);
+	color: var(--bs-success);
 	content: '\f111';
 }
 .offline.om-icon::before {
-	color: var(--danger);
+	color: var(--bs-danger);
 	content: '\f111';
 }
 .message {
@@ -294,7 +294,7 @@ table.messages td.from, table.messages td.subject {
 }
 .email.selected {
 	border: 1px solid #cccccc;
-	background-color:var(--light);
+	background-color:var(--bs-light);
 }
 .email.folder {
 	font-weight: normal;
@@ -608,7 +608,7 @@ select.messages.selector {
 }
 .dragbox .dragbox-header .dragbox-actions .icon.delete::before {
 	content: "\f00d";
-	color: var(--danger);
+	color: var(--bs-danger);
 }
 .dragbox-content .tableWrapper {
 	/* room users on dashboard */
@@ -620,6 +620,7 @@ select.messages.selector {
 }
 .sort-icon a {
 	vertical-align: middle;
+	text-decoration: none;
 }
 .sort-icon.none a::before {
 	content: '\f0dc';
diff --git a/openmeetings-web/src/main/webapp/css/raw-menu.css b/openmeetings-web/src/main/webapp/css/raw-menu.css
index 42b6459..70c4a6b 100644
--- a/openmeetings-web/src/main/webapp/css/raw-menu.css
+++ b/openmeetings-web/src/main/webapp/css/raw-menu.css
@@ -23,7 +23,7 @@
 	font-weight: bold;
 }
 .room-block .menu .details .room.name.screen {
-	color: var(--danger);
+	color: var(--bs-danger);
 }
 .room-block .menu .details .icon {
 	width: 30px;
@@ -49,7 +49,7 @@
 .room-block .menu .details .detail-btn i.add-on {
 	position: absolute;
 	left: 5px;
-	color: var(--warning);
+	color: var(--bs-warning);
 	bottom:  0;
 }
 .room-block .menu .details .icon .profile {
diff --git a/openmeetings-web/src/main/webapp/css/raw-nettest.css b/openmeetings-web/src/main/webapp/css/raw-nettest.css
index 3360489..ee11cba 100644
--- a/openmeetings-web/src/main/webapp/css/raw-nettest.css
+++ b/openmeetings-web/src/main/webapp/css/raw-nettest.css
@@ -15,24 +15,24 @@
 .nettest .test-container button.not-started
 , .nettest .test-container button.started
 {
-	color: var(--secondary);
-	border-color: var(--secondary);
+	color: var(--bs-secondary);
+	border-color: var(--bs-secondary);
 }
 .nettest .test-container button:hover {
-	color: var(--white);
+	color: var(--bs-white);
 	border-color: transparent;
 }
 .nettest .test-container button.not-started:hover
 , .nettest .test-container button.started:hover
 {
-	background-color: var(--secondary);
+	background-color: var(--bs-secondary);
 }
 .nettest .test-container button.complete {
-	color: var(--success);
-	border-color: var(--success);
+	color: var(--bs-success);
+	border-color: var(--bs-success);
 }
 .nettest .test-container button.complete:hover {
-	background-color: var(--success);
+	background-color: var(--bs-success);
 }
 .nettest .test-container button.not-started i::before {
 	content: '\f04b';
@@ -46,6 +46,12 @@
 .nettest .test-container button.complete i::before {
 	content: '\f00c';
 }
+.nettest .test-container .value {
+	min-height: 3em;
+}
+.nettest .test-container .card-title {
+	white-space: nowrap;
+}
 .nettest .output {
 	border-radius: 10px;
 	border: 1px solid #cccccc;
diff --git a/openmeetings-web/src/main/webapp/css/raw-room.css b/openmeetings-web/src/main/webapp/css/raw-room.css
index 110aa8c..44a5398 100644
--- a/openmeetings-web/src/main/webapp/css/raw-room.css
+++ b/openmeetings-web/src/main/webapp/css/raw-room.css
@@ -108,13 +108,13 @@ html[dir="rtl"] .room-block .sb-wb .sidebar {
 	border-radius: 50%;
 }
 .room-block .sb-wb .sidebar .user-list .user.entry .om-icon.user-status.user {
-	background-color: var(--success);
+	background-color: var(--bs-success);
 }
 .room-block .sb-wb .sidebar .user-list .user.entry .om-icon.user-status.wb {
-	background-color: var(--warning);
+	background-color: var(--bs-warning);
 }
 .room-block .sb-wb .sidebar .user-list .user.entry .om-icon.user-status.mod {
-	background-color: var(--danger);
+	background-color: var(--bs-danger);
 }
 .room-block .sb-wb .sidebar .user-list .user.entry .om-icon.audio-activity {
 	position: absolute;
@@ -170,8 +170,8 @@ html[dir="rtl"] .room-block .sb-wb .sidebar {
 .audio-activity.om-icon {
 	opacity: 0.2;
 	border-radius: 50%;
-	background-color: var(--success);
-	border: 1px solid var(--gray-dark);
+	background-color: var(--bs-success);
+	border: 1px solid var(--bs-gray-dark);
 }
 .typing-activity {
 	display: none;
@@ -182,7 +182,7 @@ html[dir="rtl"] .room-block .sb-wb .sidebar {
 	position: absolute;
 	left: 0;
 	animation: typing-ani 2s infinite;
-	color: var(--primary);
+	color: var(--bs-primary);
 }
 @keyframes typing-ani {
 	0% {
@@ -207,12 +207,12 @@ html[dir="rtl"] .room-block .sb-wb .sidebar {
 .om-icon.volume-control a.volume-on::before {
 	content: "\f027";
 	font-size: 1.2em;
-	color: var(--secondary);
+	color: var(--bs-secondary);
 }
 .om-icon.volume-control a.volume-off::before {
 	content: "\f6a9";
 	font-size: 1.2em;
-	color: var(--danger);
+	color: var(--bs-danger);
 }
 .om-icon.volume-control .dropdown-menu {
 	width: 20px;
@@ -225,17 +225,17 @@ html[dir="rtl"] .room-block .sb-wb .sidebar {
 .om-icon.volume-control .dropdown-menu .slider {
 	border-radius: 0;
 	background-color: white;
-	border-color: var(--secondary);
+	border-color: var(--bs-secondary);
 }
 .om-icon.volume-control .dropdown-menu .slider .ui-slider-range {
 	border-radius: 0;
-	background-color: var(--light);
+	background-color: var(--bs-light);
 }
 .om-icon.volume-control .dropdown-menu .slider .handle {
 	border-radius: 0;
-	background-color: var(--light);
-	border-color: var(--secondary);
-	color: var(--secondary);
+	background-color: var(--bs-light);
+	border-color: var(--bs-secondary);
+	color: var(--bs-secondary);
 }
 .user-video .om-icon.volume-control
 , .user-video .btn.btn-refresh
@@ -247,7 +247,7 @@ html[dir="rtl"] .room-block .sb-wb .sidebar {
 }
 .user-video .om-icon.volume-control {
 	border-radius: 0.2rem;
-	border: 1px solid var(--secondary);
+	border: 1px solid var(--bs-secondary);
 	margin-top: 3px;
 	padding: 1px;
 }
@@ -273,11 +273,11 @@ html[dir="rtl"] .room-block .sb-wb .sidebar {
 	font-size: .6em;
 }
 .right.om-icon i::before {
-	color: var(--success);
+	color: var(--bs-success);
 	content: "\f055";
 }
 .right.om-icon.granted i::before {
-	color: var(--danger);
+	color: var(--bs-danger);
 	content: "\f056";
 }
 .right.moderator.om-icon::before {
@@ -312,18 +312,18 @@ html[dir="rtl"] .room-block .sb-wb .sidebar {
 }
 .activity.cam.enabled.om-icon::before {
 	content: '\f03d';
-	color: var(--success);
+	color: var(--bs-success);
 }
 .activity.cam.om-icon, .activity.mic.om-icon {
 	display: none;
 }
 .activity.cam.om-icon::before {
 	content: '\f4e2';
-	color: var(--warning);
+	color: var(--bs-warning);
 }
 .activity.mic.enabled.om-icon::before {
 	content: '\f130';
-	color: var(--success);
+	color: var(--bs-success);
 }
 .om-icon.disabled {
 	filter: grayscale(100%);
@@ -332,11 +332,11 @@ html[dir="rtl"] .room-block .sb-wb .sidebar {
 }
 .activity.mic.om-icon::before {
 	content: '\f131';
-	color: var(--warning);
+	color: var(--bs-warning);
 }
 .room-block .sb-wb .sidebar .user-list .user.entry.current {
 	font-weight: bold;
-	background-color: var(--light);
+	background-color: var(--bs-light);
 }
 .dropdown-menu.video.volume, .dropdown-menu.video.volume li {
 	width: 20px;
@@ -404,7 +404,7 @@ html[dir="rtl"] .room-block .sb-wb .sidebar {
 
 /************ VIDEO **************/
 .mic-on {
-	background-color: var(--warning);
+	background-color: var(--bs-warning);
 }
 .ui-dialog.video
 , .ui-dialog.sharer
@@ -417,14 +417,14 @@ html[dir="rtl"] .room-block .sb-wb .sidebar {
 , .sharer .ui-dialog-titlebar
 , .wb-tool-settings .ui-dialog-titlebar
 {
-	background-color: var(--white);
+	background-color: var(--bs-white);
 }
 .sharer .ui-dialog-titlebar-close {
 	position: absolute;
 	top: 20px
 }
 .user-video .buttonpane {
-	background-color: var(--white);
+	background-color: var(--bs-white);
 	position: absolute;
 	right: 2px;
 	top: 2px
@@ -524,7 +524,7 @@ html[dir="rtl"] .room-block .sb-wb .sidebar {
 	right: -21px;
 	bottom: -16px;
 	background: repeating-linear-gradient(
-		var(--dark), var(--dark) 3px, transparent 3px, transparent 5px
+		var(--bs-dark), var(--bs-dark) 3px, transparent 3px, transparent 5px
 	);
 }
 .room-block .room-container .user-video .header {
@@ -664,7 +664,7 @@ html[dir="rtl"] .room-block .sb-wb .sidebar {
 	right: 40px;
 	bottom: 40px;
 	padding: 5px;
-	background-color: var(--info);
+	background-color: var(--bs-info);
 }
 #quick-vote .control {
 	display: inline-block;
@@ -685,10 +685,10 @@ html[dir="rtl"] .room-block .sb-wb .sidebar {
 	line-height: 1.2em;
 }
 #quick-vote .control.pro i::before {
-	color: var(--success);
+	color: var(--bs-success);
 }
 #quick-vote .control.con i::before {
-	color: var(--danger);
+	color: var(--bs-danger);
 }
 #quick-vote .close-btn {
 	float: right;
@@ -744,7 +744,7 @@ html[dir="rtl"] .room-block .sb-wb .sidebar {
 }
 .video .mute-others::before {
 	content: '\f3c9';
-	color: var(--warning);
+	color: var(--bs-warning);
 	line-height: 1em;
 	font-size: 2.5em;
 }
diff --git a/openmeetings-web/src/main/webapp/css/raw-tree.css b/openmeetings-web/src/main/webapp/css/raw-tree.css
index 8d61614..d30cdae 100644
--- a/openmeetings-web/src/main/webapp/css/raw-tree.css
+++ b/openmeetings-web/src/main/webapp/css/raw-tree.css
@@ -53,18 +53,17 @@
 	line-height: 20px;
 	color: transparent;
 	height: var(--tree-header-height);
-	padding-top: 3px;
 	overflow: hidden;
 }
 .trash-toolbar .om-confirm-dialog {
-	color: var(--danger);
+	color: var(--bs-danger);
 }
 .trash-toolbar .om-icon.fileitem, .trash-toolbar .om-icon.recorditem {
 	display: none !important;
 }
 .trash-toolbar-hover {
 	color: inherit;
-	background-color: var(--light);
+	background-color: var(--bs-light);
 }
 .file-tree .info .details {
 	width: 100%;
@@ -99,8 +98,11 @@
 .trees .tree-node {
 	white-space: nowrap;
 }
+.trees .tree-node .tree-junction {
+	text-decoration: none;
+}
 .file-tree .trees .om-icon.active {
-	background-color: var(--info);
+	background-color: var(--bs-info);
 }
 .file-tree .trees .om-icon i {
 	display: none;
@@ -125,7 +127,7 @@
 	content: '\f008';
 }
 .broken.om-icon::before {
-	color: var(--danger);
+	color: var(--bs-danger);
 }
 .file-tree .trees .processing.om-icon i {
 	display: block;
@@ -192,7 +194,7 @@
 	padding: 0px;
 }
 .file.item .errors::before {
-	color: var(--warning);
+	color: var(--bs-warning);
 	content: '\f071';
 }
 .dialog.errors {
@@ -204,10 +206,10 @@
 	height: calc(100% - 50px);
 }
 .dialog.errors .alert {
-	color: var(--danger);
+	color: var(--bs-danger);
 }
 .dialog.errors .warn {
-	color: var(--warning);
+	color: var(--bs-warning);
 }
 .dialog.errors .message {
 	display: block;
diff --git a/openmeetings-web/src/main/webapp/css/raw-wb.css b/openmeetings-web/src/main/webapp/css/raw-wb.css
index 4dafebb..cbc49fd 100644
--- a/openmeetings-web/src/main/webapp/css/raw-wb.css
+++ b/openmeetings-web/src/main/webapp/css/raw-wb.css
@@ -36,7 +36,7 @@ html[dir="rtl"] .room-block .sb-wb .wb-block {
 	display: inline-block;
 	width: 100%;
 	text-align: center;
-	color: var(--success);
+	color: var(--bs-success);
 }
 .room-block .sb-wb .wb-block .tabs {
 	height: calc(100% - var(--buffer-size));