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 2020/02/06 06:28:08 UTC

[openmeetings] branch csp updated: [OPENMEETINGS-2165] some additional dialogs are moved to bootstrap

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

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


The following commit(s) were added to refs/heads/csp by this push:
     new b2cbe39  [OPENMEETINGS-2165] some additional dialogs are moved to bootstrap
     new 75091e6  Merge branch 'csp' of github.com:apache/openmeetings into csp
b2cbe39 is described below

commit b2cbe39bf3622a168c8115cf27ffc4568eb63f70
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Thu Feb 6 13:27:38 2020 +0700

    [OPENMEETINGS-2165] some additional dialogs are moved to bootstrap
---
 .../openmeetings/web/admin/backup/BackupPanel.java |   6 +-
 .../web/admin/labels/AddLanguageDialog.java        |   6 +-
 .../openmeetings/web/admin/labels/LangPanel.java   |   6 +-
 .../web/admin/users/PasswordDialog.java            |   6 +-
 .../apache/openmeetings/web/common/Captcha.java    |   8 -
 .../openmeetings/web/common/FormActionsPanel.java  |   5 +-
 .../openmeetings/web/common/GeneralUserForm.java   |  13 +-
 .../openmeetings/web/common/InvitationForm.java    |   6 +-
 .../apache/openmeetings/web/common/MainPanel.java  |  11 +-
 .../apache/openmeetings/web/common/NameDialog.java |   6 +-
 .../openmeetings/web/common/OmDateTimePicker.java  |  29 +--
 .../apache/openmeetings/web/pages/BasePage.java    |   6 +-
 .../web/pages/InvitationPasswordDialog.java        |   6 +-
 .../web/pages/install/InstallWizard.java           |   5 +-
 .../openmeetings/web/room/NicknameDialog.java      |   6 +-
 .../openmeetings/web/room/menu/RoomMenuPanel.java  |   3 -
 .../web/room/menu/SipDialerDialog.java             |   6 +-
 .../web/room/poll/CreatePollDialog.java            |   6 +-
 .../openmeetings/web/room/poll/VoteDialog.java     |  21 +-
 .../web/room/sidebar/UploadDialog.java             |   6 +-
 .../apache/openmeetings/web/user/AboutDialog.html  |  38 ++--
 .../apache/openmeetings/web/user/AboutDialog.java  |  35 +--
 .../openmeetings/web/user/MessageDialog.html       |   4 +-
 .../openmeetings/web/user/MessageDialog.java       | 246 ++++++++++-----------
 .../openmeetings/web/user/UserInfoDialog.html      |   4 +-
 .../openmeetings/web/user/UserInfoDialog.java      |  79 +++----
 .../web/user/calendar/AppointmentDialog.java       |  11 +-
 .../web/user/calendar/CalendarDialog.java          |   6 +-
 .../openmeetings/web/user/chat/ChatToolbar.html    |  22 +-
 .../apache/openmeetings/web/user/chat/raw-chat.js  |   3 +-
 .../dashboard/admin/AdminCleanupInfoDialog.java    |   6 +-
 .../web/user/profile/ChangePasswordDialog.java     |   6 +-
 .../web/user/profile/MessagesContactsPanel.java    |  35 +--
 openmeetings-web/src/main/webapp/css/raw-chat.css  |  16 --
 .../src/main/webapp/css/raw-general-rtl.css        |   6 -
 35 files changed, 304 insertions(+), 380 deletions(-)

diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java
index 1920cff..bf0951c 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java
@@ -52,10 +52,10 @@ import org.apache.wicket.util.lang.Bytes;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.form.button.AjaxButton;
 import com.googlecode.wicket.jquery.ui.widget.progressbar.ProgressBar;
-import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 /**
  * Panel component to manage Backup Import/Export
  *
@@ -66,7 +66,7 @@ public class BackupPanel extends AdminBasePanel {
 	private static final Logger log = LoggerFactory.getLogger(BackupPanel.class);
 	private static final long serialVersionUID = 1L;
 
-	private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
+	private final NotificationPanel feedback = new NotificationPanel("feedback");
 	@SpringBean
 	private BackupExport backupExport;
 	@SpringBean
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/AddLanguageDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/AddLanguageDialog.java
index 7afd892..87a2466 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/AddLanguageDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/AddLanguageDialog.java
@@ -34,14 +34,14 @@ import org.apache.wicket.validation.IValidatable;
 import org.apache.wicket.validation.IValidator;
 import org.apache.wicket.validation.ValidationError;
 
-import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
-import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 
 public class AddLanguageDialog extends AbstractFormDialog<String> {
 	private static final long serialVersionUID = 1L;
-	private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
+	private final NotificationPanel feedback = new NotificationPanel("feedback");
 	private DialogButton add;
 	private final Form<Void> form = new Form<>("addLangForm");
 	private final RequiredTextField<String> iso = new RequiredTextField<>("iso", Model.of(""));
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 3e1f0db..1ed3931 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
@@ -62,9 +62,9 @@ import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.form.button.AjaxButton;
-import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 
 /**
  * Language Editor, add/insert/update Label and add/delete language contains several Forms and one list
@@ -75,7 +75,7 @@ import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
 public class LangPanel extends AdminBasePanel {
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = LoggerFactory.getLogger(LangPanel.class);
-	private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
+	private final NotificationPanel feedback = new NotificationPanel("feedback");
 	private LangForm langForm;
 	private final FileUploadField fileUploadField = new FileUploadField("fileInput");
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.java
index 3c36082..a044c13 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.java
@@ -33,16 +33,16 @@ import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.danekja.java.util.function.serializable.SerializableConsumer;
 
-import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
-import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 
 public class PasswordDialog extends AbstractFormDialog<String> {
 	private static final long serialVersionUID = 1L;
 	private DialogButton btnOk;
 	private DialogButton btnCancel;
-	protected final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
+	private final NotificationPanel feedback = new NotificationPanel("feedback");
 	private final Form<String> form = new Form<>("form");
 	private final PasswordTextField pass = new PasswordTextField("password", Model.of(""));
 	private SerializableConsumer<AjaxRequestTarget> action = null;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/Captcha.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/Captcha.java
index 7e6b3b5..48297c1 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/Captcha.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/Captcha.java
@@ -25,8 +25,6 @@ import java.security.SecureRandom;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.extensions.markup.html.captcha.CaptchaImageResource;
-import org.apache.wicket.markup.head.CssHeaderItem;
-import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.html.form.RequiredTextField;
 import org.apache.wicket.markup.html.image.Image;
 import org.apache.wicket.markup.html.panel.Panel;
@@ -39,7 +37,6 @@ import org.apache.wicket.validation.ValidationError;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.image.Icon;
-import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome5CssReference;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome5IconType;
 
 public class Captcha extends Panel {
@@ -95,11 +92,6 @@ public class Captcha extends Panel {
 			private static final long serialVersionUID = 1L;
 
 			@Override
-			public void renderHead(IHeaderResponse response) {
-				response.render(CssHeaderItem.forReference(FontAwesome5CssReference.instance()));
-			}
-
-			@Override
 			public void onClick(AjaxRequestTarget target) {
 				captchaImageResource.invalidate();
 				target.add(captcha);
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 e6c9aa2..2209faa 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
@@ -23,13 +23,12 @@ import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.panel.Panel;
 
-import com.googlecode.wicket.jquery.core.Options;
-import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 
 public abstract class FormActionsPanel<T> extends Panel {
 	private static final long serialVersionUID = 1L;
 	private final Form<T> form;
-	protected final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
+	protected final NotificationPanel feedback = new NotificationPanel("feedback");
 	private AjaxButton saveBtn;
 	private ConfirmableAjaxBorder purgeBtn;
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
index 3b4e1ed..77c7322 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
@@ -36,12 +36,10 @@ import org.apache.openmeetings.db.entity.user.GroupUser;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Salutation;
 import org.apache.openmeetings.util.CalendarHelper;
-import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.util.CountryDropDown;
 import org.apache.openmeetings.web.util.RestrictiveChoiceProvider;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.extensions.validation.validator.RfcCompliantEmailAddressValidator;
-import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.html.form.ChoiceRenderer;
 import org.apache.wicket.markup.html.form.DropDownChoice;
 import org.apache.wicket.markup.html.form.Form;
@@ -58,9 +56,6 @@ import org.apache.wicket.util.string.Strings;
 import org.wicketstuff.select2.Response;
 import org.wicketstuff.select2.Select2MultiChoice;
 
-import com.googlecode.wicket.kendo.ui.KendoCultureHeaderItem;
-import com.googlecode.wicket.kendo.ui.form.datetime.local.AjaxDatePicker;
-
 public class GeneralUserForm extends Form<User> {
 	private static final long serialVersionUID = 1L;
 	private final RequiredTextField<String> email = new RequiredTextField<>("address.email");
@@ -105,7 +100,7 @@ public class GeneralUserForm extends Form<User> {
 		add(new DropDownChoice<>("timeZoneId", AVAILABLE_TIMEZONES));
 		add(new LanguageDropDown("languageId"));
 		add(new TextField<String>("address.phone"));
-		add(new AjaxDatePicker("age", new PropertyModel<LocalDate>(this, "age"), WebSession.get().getLocale()) {
+		add(new AjaxOmDatePicker("age", new PropertyModel<LocalDate>(this, "age")) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -186,10 +181,4 @@ public class GeneralUserForm extends Form<User> {
 	protected IMarkupSourcingStrategy newMarkupSourcingStrategy() {
 		return new PanelMarkupSourcingStrategy(false);
 	}
-
-	@Override
-	public void renderHead(IHeaderResponse response) {
-		super.renderHead(response);
-		response.render(KendoCultureHeaderItem.of(WebSession.get().getLocale()));
-	}
 }
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
index fa2a480..60b5391 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
@@ -61,14 +61,14 @@ import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
-import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 
 public abstract class InvitationForm extends Form<Invitation> {
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = LoggerFactory.getLogger(InvitationForm.class);
-	private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
+	private final NotificationPanel feedback = new NotificationPanel("feedback");
 	private final PasswordTextField passwd = new PasswordTextField("password");
 	private final DropDownChoice<String> timeZoneId = new DropDownChoice<>("timeZoneId", Model.of((String)null), AVAILABLE_TIMEZONES);
 	private final OmDateTimePicker from = new OmDateTimePicker("from", Model.of(LocalDateTime.now()));
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 df72525..840eb9a 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
@@ -89,7 +89,6 @@ import org.slf4j.LoggerFactory;
 import org.wicketstuff.urlfragment.UrlFragment;
 
 import com.github.openjson.JSONObject;
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.navbar.INavbarComponent;
 
@@ -216,7 +215,7 @@ public class MainPanel extends Panel {
 
 			@Override
 			public void onClick(AjaxRequestTarget target) {
-				about.open(target);
+				about.show(target);
 			}
 		});
 		if (getApplication().getDebugSettings().isDevelopmentUtilitiesEnabled()) {
@@ -230,9 +229,9 @@ public class MainPanel extends Panel {
 			private static final long serialVersionUID = 1L;
 
 			@Override
-			public void onClose(IPartialPageRequestHandler handler, DialogButton button) {
+			public void onSend(IPartialPageRequestHandler handler) {
 				BasePanel bp = getCurrentPanel();
-				if (send.equals(button) && bp != null) {
+				if (bp != null) {
 					bp.onNewMessageClose(handler);
 				}
 			}
@@ -243,7 +242,7 @@ public class MainPanel extends Panel {
 
 			@Override
 			protected void respond(AjaxRequestTarget target) {
-				userInfo.open(target, getParam(getComponent(), PARAM_USER_ID).toLong());
+				userInfo.show(target, getParam(getComponent(), PARAM_USER_ID).toLong());
 			}
 
 			@Override
@@ -271,7 +270,7 @@ public class MainPanel extends Panel {
 
 			@Override
 			protected void respond(AjaxRequestTarget target) {
-				newMessage.reset(true).open(target, getParam(getComponent(), PARAM_USER_ID).toOptionalLong());
+				newMessage.reset(true).show(target, getParam(getComponent(), PARAM_USER_ID).toOptionalLong());
 			}
 
 			@Override
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java
index c85e29a..aa11fce 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java
@@ -29,17 +29,17 @@ import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.RequiredTextField;
 import org.apache.wicket.model.Model;
 
-import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
-import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 
 public abstract class NameDialog extends AbstractFormDialog<String> {
 	private static final long serialVersionUID = 1L;
 	private DialogButton add;
 	private DialogButton cancel;
 	private final Form<String> form;
-	protected final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
+	protected final NotificationPanel feedback = new NotificationPanel("feedback");
 	private final String name;
 	private RequiredTextField<String> title;
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmDateTimePicker.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmDateTimePicker.java
index b7a90e0..0787b42 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmDateTimePicker.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmDateTimePicker.java
@@ -18,38 +18,21 @@
  */
 package org.apache.openmeetings.web.common;
 
-import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.util.Locale;
 
-import org.apache.openmeetings.web.app.WebSession;
+import org.apache.wicket.Component;
+import org.apache.wicket.extensions.markup.html.form.datetime.LocalDateTimeTextField;
 import org.apache.wicket.model.IModel;
 
-import com.googlecode.wicket.jquery.core.Options;
-import com.googlecode.wicket.kendo.ui.form.datetime.local.DatePicker;
-import com.googlecode.wicket.kendo.ui.form.datetime.local.DateTimePicker;
-import com.googlecode.wicket.kendo.ui.form.datetime.local.TimePicker;
-
-public class OmDateTimePicker extends DateTimePicker {
+public class OmDateTimePicker extends AbstractOmDateTimePicker<LocalDateTime> {
 	private static final long serialVersionUID = 1L;
 
 	public OmDateTimePicker(String id, IModel<LocalDateTime> model) {
-		super(id, model, WebSession.get().getLocale());
-	}
-
-	@Override
-	protected DatePicker newDatePicker(String id, IModel<LocalDate> model, Locale locale, String datePattern, Options options) {
-		DatePicker dp = super.newDatePicker(id, model, locale, datePattern, options);
-		dp.setLabel(getLabel());
-		return dp;
+		super(id, model, getDateTimeFormat());
 	}
 
 	@Override
-	protected TimePicker newTimePicker(String id, IModel<LocalTime> model, Locale locale, String timePattern, Options options) {
-		TimePicker tp = super.newTimePicker(id, model, locale, timePattern, options);
-		tp.setLabel(getLabel());
-		return tp;
+	protected Component newInput(String wicketId, String dateFormat) {
+		return new LocalDateTimeTextField(wicketId, getModel(), dateFormat);
 	}
-	//TODO render KendoCultureHeaderItem as soon as localized AM/PM will be correctly handled
 }
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java
index ed8384f..6c2656a 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java
@@ -22,7 +22,6 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.getApplicationN
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getGaCode;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.isInitComplete;
 import static org.apache.openmeetings.web.app.Application.isInstalled;
-import static org.apache.wicket.RuntimeConfigurationType.DEVELOPMENT;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -51,6 +50,8 @@ import org.apache.wicket.util.string.StringValue;
 import org.apache.wicket.util.string.Strings;
 import org.wicketstuff.urlfragment.AsyncUrlFragmentAwarePage;
 
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome5CssReference;
+
 public abstract class BasePage extends AsyncUrlFragmentAwarePage {
 	private static final long serialVersionUID = 1L;
 	public static final String ALIGN_LEFT = "align-left ";
@@ -124,8 +125,6 @@ public abstract class BasePage extends AsyncUrlFragmentAwarePage {
 	protected void internalRenderHead(IHeaderResponse response) {
 		response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forReference(Application.get().getJavaScriptLibrarySettings().getJQueryReference())));
 		super.renderHead(response);
-		final String suffix = DEVELOPMENT == getApplication().getConfigurationType() ? "" : ".min";
-		response.render(CssHeaderItem.forUrl(String.format("css/theme_om/jquery-ui%s.css", suffix)));
 		response.render(CssHeaderItem.forUrl("css/theme.css"));
 		if (!Strings.isEmpty(getGaCode())) {
 			response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forReference(new JavaScriptResourceReference(BasePage.class, "om-ga.js"))));
@@ -133,6 +132,7 @@ public abstract class BasePage extends AsyncUrlFragmentAwarePage {
 			script.append(getGaCode()).append("');").append(isMainPage() ? "initHash()" : "init()").append(';');
 			response.render(OnDomReadyHeaderItem.forScript(script));
 		}
+		response.render(CssHeaderItem.forReference(FontAwesome5CssReference.instance()));
 		response.render(new FilteredHeaderItem(CssHeaderItem.forUrl("css/custom.css"), CUSTOM_CSS_FILTER));
 	}
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.java
index e3ccc19..b0112fd 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.java
@@ -38,13 +38,13 @@ import org.apache.wicket.validation.IValidator;
 import org.apache.wicket.validation.ValidationError;
 
 import com.googlecode.wicket.jquery.core.JQueryBehavior;
-import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
-import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 
 public class InvitationPasswordDialog extends NonClosableDialog<Invitation> {
 	private static final long serialVersionUID = 1L;
-	private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
+	private final NotificationPanel feedback = new NotificationPanel("feedback");
 	private DialogButton check;
 	private final Form<Void> form = new Form<>("form");
 	private final PasswordTextField password = new PasswordTextField("password", Model.of((String)null));
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java
index ad544eb..c0e512d 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java
@@ -92,7 +92,8 @@ import com.googlecode.wicket.jquery.ui.widget.progressbar.ProgressBar;
 import com.googlecode.wicket.jquery.ui.widget.tooltip.TooltipBehavior;
 import com.googlecode.wicket.jquery.ui.widget.wizard.AbstractWizard;
 import com.googlecode.wicket.kendo.ui.form.button.IndicatingAjaxButton;
-import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 
 public class InstallWizard extends AbstractWizard<InstallationConfig> {
 	private static final long serialVersionUID = 1L;
@@ -146,7 +147,7 @@ public class InstallWizard extends AbstractWizard<InstallationConfig> {
 
 	@Override
 	protected WebMarkupContainer newFeedbackPanel(String id) {
-		KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
+		NotificationPanel feedback = new NotificationPanel("feedback");
 		feedback.setEscapeModelStrings(false);
 		return feedback;
 	}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/NicknameDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/NicknameDialog.java
index 8029183..9c2e1ba 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/NicknameDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/NicknameDialog.java
@@ -41,14 +41,14 @@ import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.string.Strings;
 
 import com.googlecode.wicket.jquery.core.JQueryBehavior;
-import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
-import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 
 public class NicknameDialog extends NonClosableDialog<User> {
 	private static final long serialVersionUID = 1L;
 	private static final FastDateFormat TIME_DF = FastDateFormat.getInstance("HH:mm:ss");
-	private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
+	private final NotificationPanel feedback = new NotificationPanel("feedback");
 	private DialogButton ok;
 	private final RoomPanel room;
 	private final Form<User> form;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
index 1a3e1e6..e6408a9 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
@@ -54,7 +54,6 @@ import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
-import org.apache.wicket.markup.head.CssHeaderItem;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.panel.Panel;
@@ -67,7 +66,6 @@ import com.github.openjson.JSONObject;
 import com.googlecode.wicket.jquery.ui.form.button.Button;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.navbar.INavbarComponent;
-import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome5CssReference;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome5IconType;
 
 public class RoomMenuPanel extends Panel {
@@ -179,7 +177,6 @@ public class RoomMenuPanel extends Panel {
 	@Override
 	public void renderHead(IHeaderResponse response) {
 		super.renderHead(response);
-		response.render(CssHeaderItem.forReference(FontAwesome5CssReference.instance()));
 		pollsSubMenu.renderHead(response);
 	}
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.java
index e7675ab..ae8f65d 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.java
@@ -31,14 +31,14 @@ import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
-import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
-import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 
 public class SipDialerDialog extends AbstractFormDialog<String> {
 	private static final long serialVersionUID = 1L;
-	private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
+	private final NotificationPanel feedback = new NotificationPanel("feedback");
 	private DialogButton call;
 	private DialogButton close;
 	private final Form<String> form = new Form<>("form", Model.of(""));
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/CreatePollDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/CreatePollDialog.java
index fa4ac95..8af14d7 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/CreatePollDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/CreatePollDialog.java
@@ -42,10 +42,10 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
-import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
-import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 
 public class CreatePollDialog extends AbstractFormDialog<RoomPoll> {
 	private static final long serialVersionUID = 1L;
@@ -53,7 +53,7 @@ public class CreatePollDialog extends AbstractFormDialog<RoomPoll> {
 	private DialogButton cancel;
 	private final Long roomId;
 	private final PollForm form;
-	private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
+	private final NotificationPanel feedback = new NotificationPanel("feedback");
 	@SpringBean
 	private RoomDao roomDao;
 	@SpringBean
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/VoteDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/VoteDialog.java
index 8d3ab3a..34711aa 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/VoteDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/VoteDialog.java
@@ -18,10 +18,13 @@
  */
 package org.apache.openmeetings.web.room.poll;
 
-import com.googlecode.wicket.jquery.core.Options;
-import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
-import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
+import static org.apache.openmeetings.core.util.WebSocketHelper.sendRoom;
+import static org.apache.openmeetings.web.app.WebSession.getUserId;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
 import org.apache.openmeetings.db.dao.room.PollDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.room.RoomPoll;
@@ -43,12 +46,10 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
+import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
+import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
 
-import static org.apache.openmeetings.core.util.WebSocketHelper.sendRoom;
-import static org.apache.openmeetings.web.app.WebSession.getUserId;
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 
 /**
  * @author solomax
@@ -60,7 +61,7 @@ public class VoteDialog extends AbstractFormDialog<RoomPollAnswer> {
 	private PollAnswerForm form;
 	private DialogButton vote;
 	private DialogButton cancel;
-	private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
+	private final NotificationPanel feedback = new NotificationPanel("feedback");
 	private final IModel<String> user = Model.of((String)null);
 	@SpringBean
 	private UserDao userDao;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
index a6750fd..eecc5b4 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
@@ -64,16 +64,16 @@ import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
 import com.googlecode.wicket.jquery.ui.widget.progressbar.ProgressBar;
-import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 
 public class UploadDialog extends AbstractFormDialog<String> {
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = LoggerFactory.getLogger(UploadDialog.class);
-	private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
+	private final NotificationPanel feedback = new NotificationPanel("feedback");
 	private final Form<String> form = new Form<>("form") {
 		private static final long serialVersionUID = 1L;
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/AboutDialog.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/AboutDialog.html
index 256c641..93eb6ec 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/AboutDialog.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/AboutDialog.html
@@ -20,24 +20,22 @@
 -->
 <!DOCTYPE html>
 <html xmlns:wicket="http://wicket.apache.org">
-<wicket:panel>
-	<table>
-		<tr>
-			<td><wicket:message key="165" /></td>
-			<td wicket:id="name">[name]</td>
-		</tr>
-		<tr>
-			<td><wicket:message key="1551" /></td>
-			<td wicket:id="version">[version]</td>
-		</tr>
-		<tr>
-			<td><wicket:message key="1552" /></td>
-			<td wicket:id="revision">[revision]</td>
-		</tr>
-		<tr>
-			<td><wicket:message key="1553" /></td>
-			<td wicket:id="buildDate">[buildDate]</td>
-		</tr>
-	</table>
-</wicket:panel>
+<wicket:extend>
+	<div class="row no-gutters">
+		<div class="col-6"><wicket:message key="165"/></div>
+		<div class="col-6" wicket:id="name"></div>
+	</div>
+	<div class="row no-gutters">
+		<div class="col-6"><wicket:message key="1551"/></div>
+		<div class="col-6" wicket:id="version"></div>
+	</div>
+	<div class="row no-gutters">
+		<div class="col-6"><wicket:message key="1552"/></div>
+		<div class="col-6" wicket:id="revision"></div>
+	</div>
+	<div class="row no-gutters">
+		<div class="col-6"><wicket:message key="1553"/></div>
+		<div class="col-6" wicket:id="buildDate"></div>
+	</div>
+</wicket:extend>
 </html>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/AboutDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/AboutDialog.java
index d45e55d..d4642a6 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/AboutDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/AboutDialog.java
@@ -23,40 +23,27 @@ import static org.apache.openmeetings.util.Version.getBuildDate;
 import static org.apache.openmeetings.util.Version.getRevision;
 import static org.apache.openmeetings.util.Version.getVersion;
 
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.model.ResourceModel;
 
-import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractDialog;
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 
-public class AboutDialog extends AbstractDialog<String> {
+public class AboutDialog extends Modal<String> {
 	private static final long serialVersionUID = 1L;
 
 	public AboutDialog(String id) {
-		super(id, "");
-
-		add(new Label("name", getApplicationName()));
-		add(new Label("version", getVersion()));
-		add(new Label("revision", getRevision()));
-		add(new Label("buildDate", getBuildDate()));
+		super(id);
 	}
 
 	@Override
 	protected void onInitialize() {
-		getTitle().setObject(getString("1549"));
+		header(new ResourceModel("1549"));
+		setCloseOnEscapeKey(true);
+		setBackdrop(Backdrop.STATIC);
 		super.onInitialize();
-	}
-
-	@Override
-	protected List<DialogButton> getButtons() {
-		return new ArrayList<>();
-	}
-
-	@Override
-	public void onClose(IPartialPageRequestHandler handler, DialogButton arg1) {
-		//no-op
+		add(new Label("name", getApplicationName()));
+		add(new Label("version", getVersion()));
+		add(new Label("revision", getRevision()));
+		add(new Label("buildDate", getBuildDate()));
 	}
 }
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.html
index 6ccd8e5..1a530e4 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.html
@@ -20,7 +20,7 @@
 -->
 <!DOCTYPE html>
 <html xmlns:wicket="http://wicket.apache.org">
-<wicket:panel>
+<wicket:extend>
 	<form wicket:id="form">
 		<table class="w-100 private-message">
 			<tr>
@@ -70,5 +70,5 @@
 			</tr>
 		</table>
 	</form>
-</wicket:panel>
+</wicket:extend>
 </html>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
index a760f32..f719017 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
@@ -31,7 +31,6 @@ import java.time.LocalDateTime;
 import java.time.ZonedDateTime;
 import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Date;
 import java.util.List;
@@ -69,27 +68,27 @@ import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
+import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.model.util.CollectionModel;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
-import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.plugins.wysiwyg.WysiwygEditor;
 import com.googlecode.wicket.jquery.ui.plugins.wysiwyg.toolbar.DefaultWysiwygToolbar;
-import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
-import com.googlecode.wicket.kendo.ui.form.datetime.local.DateTimePicker;
-import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
 
-public class MessageDialog extends AbstractFormDialog<PrivateMessage> {
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxButton;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+
+public class MessageDialog extends Modal<PrivateMessage> {
 	private static final long serialVersionUID = 1L;
 	private final Form<PrivateMessage> form;
-	private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
-	protected DialogButton send;
-	private DialogButton cancel;
+	private final NotificationPanel feedback = new NotificationPanel("feedback");
 	private final WebMarkupContainer roomParamsBlock = new WebMarkupContainer("roomParamsBlock");
 	private final WebMarkupContainer roomParams = new WebMarkupContainer("roomParams");
-	private final DateTimePicker start = new OmDateTimePicker("start", Model.of(LocalDateTime.now()));
-	private final DateTimePicker end = new OmDateTimePicker("end", Model.of(LocalDateTime.now()));
+	private final OmDateTimePicker start = new OmDateTimePicker("start", Model.of(LocalDateTime.now()));
+	private final OmDateTimePicker end = new OmDateTimePicker("end", Model.of(LocalDateTime.now()));
 	private boolean isPrivate = false;
 	private final IModel<Collection<User>> modelTo = new CollectionModel<>(new ArrayList<User>());
 	@SpringBean
@@ -108,15 +107,116 @@ public class MessageDialog extends AbstractFormDialog<PrivateMessage> {
 	private MailHandler handler;
 
 	public MessageDialog(String id, CompoundPropertyModel<PrivateMessage> model) {
-		super(id, "", model);
+		super(id, model);
 		form = new Form<>("form", getModel());
 	}
 
 	@Override
 	protected void onInitialize() {
-		getTitle().setObject(getString("1209"));
-		send = new DialogButton("send", getString("218"));
-		cancel = new DialogButton("cancel", getString("lbl.cancel"));
+		header(new ResourceModel("1209"));
+		setCloseOnEscapeKey(true);
+		setUseCloseHandler(true);
+		setBackdrop(Backdrop.STATIC);
+		size(Modal.Size.Large);
+
+		addButton(new BootstrapAjaxButton("button", new ResourceModel("218"), form, Buttons.Type.Primary) {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onError(AjaxRequestTarget target) {
+				target.add(feedback);
+			}
+
+			@Override
+			protected void onSubmit(AjaxRequestTarget target) {
+				PrivateMessage m = MessageDialog.this.getModelObject();
+				m.setInserted(new Date());
+				User owner = userDao.get(getUserId());
+				if (m.isBookedRoom()) {
+					Room r = m.getRoom();
+					r.setName(m.getSubject());
+					r.setComment("");
+					r.setCapacity(100L);
+					r.setAppointment(true);
+					r.setAllowUserQuestions(true);
+					r = roomDao.update(r, getUserId());
+					Appointment a = new Appointment();
+					a.setTitle(m.getSubject());
+					a.setDescription(m.getMessage());
+					a.setRoom(r);
+					a.setStart(CalendarWebHelper.getDate(start.getModelObject()));
+					a.setEnd(CalendarWebHelper.getDate(end.getModelObject()));
+					List<MeetingMember> attendees = new ArrayList<>();
+					for (User to : modelTo.getObject()) {
+						MeetingMember mm = new MeetingMember();
+						mm.setUser(to);
+						mm.setDeleted(false);
+						mm.setInserted(a.getInserted());
+						mm.setUpdated(a.getUpdated());
+						mm.setAppointment(a);
+						attendees.add(mm);
+					}
+					a.setOwner(owner);
+					a.setMeetingMembers(attendees);
+					apptDao.update(a, getUserId(), false);
+					m.setRoom(r);
+				} else {
+					m.setRoom(null);
+				}
+				for (User to : modelTo.getObject()) {
+					if (to.getId() == null) {
+						userDao.update(to, getUserId());
+					}
+					//to send
+					PrivateMessage p = new PrivateMessage(m);
+					p.setTo(to);
+					p.setFolderId(SENT_FOLDER_ID);
+					msgDao.update(p, getUserId());
+					//to inbox
+					p = new PrivateMessage(m);
+					p.setOwner(to);
+					p.setFolderId(INBOX_FOLDER_ID);
+					msgDao.update(p, getUserId());
+					if (to.getAddress() != null) {
+						String aLinkHTML = 	(isPrivate && to.getType() == Type.user) ? "<br/><br/>" + "<a href='" + getContactsLink() + "'>"
+									+ Application.getString("1302", to.getLanguageId()) + "</a><br/>" : "";
+						String invitationLink = "";
+						if (p.isBookedRoom()) {
+							Invitation i = inviteManager.getInvitation(to, p.getRoom(),
+									false, null, Valid.Period, owner, to.getLanguageId()
+									, CalendarHelper.getDate(start.getModelObject(), to.getTimeZoneId())
+									, CalendarHelper.getDate(end.getModelObject(), to.getTimeZoneId()), null);
+
+							invitationLink = getInvitationLink(i, WebSession.get().getExtendedProperties().getBaseUrl());
+
+							if (invitationLink == null) {
+								invitationLink = "";
+							} else {
+								invitationLink = "<br/>" //
+										+ Application.getString("503", to.getLanguageId())
+										+ "<br/><a href='" + invitationLink
+										+ "'>"
+										+ Application.getString("504", to.getLanguageId()) + "</a><br/>";
+							}
+						}
+
+						String subj = p.getSubject() == null ? "" : p.getSubject();
+						handler.send(to.getAddress().getEmail(),
+								Application.getString("1301", to.getLanguageId()) + subj,
+								(p.getMessage() == null ? "" : p.getMessage().replaceAll("\\<.*?>", "")) + aLinkHTML + invitationLink);
+					}
+				}
+				MessageDialog.this.close(target);
+				onSend(target);
+			}
+		}); // send
+		addButton(new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Secondary, new ResourceModel("lbl.cancel")) {
+			private static final long serialVersionUID = 1L;
+
+			public void onClick(AjaxRequestTarget target) {
+				MessageDialog.this.close(target);
+			}
+		});
 
 		form.add(feedback.setOutputMarkupId(true));
 		form.add(new UserMultiChoice("to", modelTo).setRequired(true));
@@ -165,124 +265,22 @@ public class MessageDialog extends AbstractFormDialog<PrivateMessage> {
 		return this;
 	}
 
-	@Override
-	public int getWidth() {
-		return 650;
-	}
-
-	public void open(IPartialPageRequestHandler handler, Long userId) {
+	public void show(IPartialPageRequestHandler handler, Long userId) {
 		getModelObject().setTo(userDao.get(userId));
-		open(handler);
+		show(handler);
 	}
 
 	@Override
-	protected void onOpen(IPartialPageRequestHandler handler) {
+	public Modal<PrivateMessage> show(IPartialPageRequestHandler handler) {
 		if (getModel().getObject().getTo() != null) {
 			modelTo.getObject().add(getModel().getObject().getTo());
 		}
 		handler.add(form);
-		super.onOpen(handler);
+		return super.show(handler);
 	}
 
-	@Override
-	protected List<DialogButton> getButtons() {
-		return Arrays.asList(send, cancel);
-	}
-
-	@Override
-	public DialogButton getSubmitButton() {
-		return send;
-	}
-
-	@Override
-	public Form<PrivateMessage> getForm() {
-		return form;
-	}
-
-	@Override
-	protected void onError(AjaxRequestTarget target, DialogButton btn) {
-		target.add(feedback);
-	}
-
-	@Override
-	protected void onSubmit(AjaxRequestTarget target, DialogButton btn) {
-		PrivateMessage m = getModelObject();
-		m.setInserted(new Date());
-		User owner = userDao.get(getUserId());
-		if (m.isBookedRoom()) {
-			Room r = m.getRoom();
-			r.setName(m.getSubject());
-			r.setComment("");
-			r.setCapacity(100L);
-			r.setAppointment(true);
-			r.setAllowUserQuestions(true);
-			r = roomDao.update(r, getUserId());
-			Appointment a = new Appointment();
-			a.setTitle(m.getSubject());
-			a.setDescription(m.getMessage());
-			a.setRoom(r);
-			a.setStart(CalendarWebHelper.getDate(start.getModelObject()));
-			a.setEnd(CalendarWebHelper.getDate(end.getModelObject()));
-			List<MeetingMember> attendees = new ArrayList<>();
-			for (User to : modelTo.getObject()) {
-				MeetingMember mm = new MeetingMember();
-				mm.setUser(to);
-				mm.setDeleted(false);
-				mm.setInserted(a.getInserted());
-				mm.setUpdated(a.getUpdated());
-				mm.setAppointment(a);
-				attendees.add(mm);
-			}
-			a.setOwner(owner);
-			a.setMeetingMembers(attendees);
-			apptDao.update(a, getUserId(), false);
-			m.setRoom(r);
-		} else {
-			m.setRoom(null);
-		}
-		for (User to : modelTo.getObject()) {
-			if (to.getId() == null) {
-				userDao.update(to, getUserId());
-			}
-			//to send
-			PrivateMessage p = new PrivateMessage(m);
-			p.setTo(to);
-			p.setFolderId(SENT_FOLDER_ID);
-			msgDao.update(p, getUserId());
-			//to inbox
-			p = new PrivateMessage(m);
-			p.setOwner(to);
-			p.setFolderId(INBOX_FOLDER_ID);
-			msgDao.update(p, getUserId());
-			if (to.getAddress() != null) {
-				String aLinkHTML = 	(isPrivate && to.getType() == Type.user) ? "<br/><br/>" + "<a href='" + getContactsLink() + "'>"
-							+ Application.getString("1302", to.getLanguageId()) + "</a><br/>" : "";
-				String invitationLink = "";
-				if (p.isBookedRoom()) {
-					Invitation i = inviteManager.getInvitation(to, p.getRoom(),
-							false, null, Valid.Period, owner, to.getLanguageId()
-							, CalendarHelper.getDate(start.getModelObject(), to.getTimeZoneId())
-							, CalendarHelper.getDate(end.getModelObject(), to.getTimeZoneId()), null);
-
-					invitationLink = getInvitationLink(i, WebSession.get().getExtendedProperties().getBaseUrl());
-
-					if (invitationLink == null) {
-						invitationLink = "";
-					} else {
-						invitationLink = "<br/>" //
-								+ Application.getString("503", to.getLanguageId())
-								+ "<br/><a href='" + invitationLink
-								+ "'>"
-								+ Application.getString("504", to.getLanguageId()) + "</a><br/>";
-					}
-				}
-
-				String subj = p.getSubject() == null ? "" : p.getSubject();
-				handler.send(to.getAddress().getEmail(),
-						Application.getString("1301", to.getLanguageId()) + subj,
-						(p.getMessage() == null ? "" : p.getMessage().replaceAll("\\<.*?>", "")) + aLinkHTML + invitationLink);
-			}
-		}
+	protected void onSend(IPartialPageRequestHandler handler) {
+		// can be overriden
 	}
 
 	@Override
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.html
index 1670e4e..b7d748f 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.html
@@ -20,9 +20,9 @@
 -->
 <!DOCTYPE html>
 <html xmlns:wicket="http://wicket.apache.org">
-<wicket:panel>
+<wicket:extend>
 	<div wicket:id="container">
 		<div wicket:id="body"></div>
 	</div>
-</wicket:panel>
+</wicket:extend>
 </html>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.java
index 38b3a53..0f9e050 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.java
@@ -20,74 +20,77 @@ package org.apache.openmeetings.web.user;
 
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
-import java.util.Arrays;
-import java.util.List;
-
 import org.apache.openmeetings.db.dao.user.UserContactDao;
 import org.apache.openmeetings.web.user.profile.UserProfilePanel;
 import org.apache.openmeetings.web.util.ContactsHelper;
+import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
-import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractDialog;
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 
-public class UserInfoDialog extends AbstractDialog<String> {
+public class UserInfoDialog extends Modal<String> {
 	private static final long serialVersionUID = 1L;
 	private WebMarkupContainer container = new WebMarkupContainer("container");
-	private DialogButton cancel;
-	private DialogButton message;
-	private DialogButton contacts;
 	private MessageDialog newMessage;
 	private long userId;
 	@SpringBean
 	private UserContactDao contactDao;
+	private BootstrapAjaxLink<String> message;
+	private BootstrapAjaxLink<String> contacts;
 
 	public UserInfoDialog(String id, MessageDialog newMessage) {
-		super(id, "");
+		super(id);
 		this.newMessage = newMessage;
 	}
 
 	@Override
 	protected void onInitialize() {
-		getTitle().setObject(getString("1235"));
-		cancel = new DialogButton("cancel", getString("lbl.cancel"));
-		message = new DialogButton("message", getString("1253"));
-		contacts = new DialogButton("contacts", getString("1186"));
+		header(new ResourceModel("1235"));
+		setCloseOnEscapeKey(true);
+		setBackdrop(Backdrop.STATIC);
+		addButton(contacts = new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Info, new ResourceModel("1186")) {
+			private static final long serialVersionUID = 1L;
+
+			public void onClick(AjaxRequestTarget target) {
+				ContactsHelper.addUserToContactList(userId);
+				UserInfoDialog.this.close(target);
+			}
+		});
+		addButton(message = new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Primary, new ResourceModel("1253")) {
+			private static final long serialVersionUID = 1L;
+
+			public void onClick(AjaxRequestTarget target) {
+				newMessage.reset(false).show(target, userId);
+				UserInfoDialog.this.close(target);
+			}
+		});
+		addButton(new BootstrapAjaxLink<>("button", Model.of(""), Buttons.Type.Secondary, new ResourceModel("lbl.cancel")) {
+			private static final long serialVersionUID = 1L;
+
+			public void onClick(AjaxRequestTarget target) {
+				UserInfoDialog.this.close(target);
+			}
+		});
 		add(container.add(new WebMarkupContainer("body")).setOutputMarkupId(true));
 		super.onInitialize();
 	}
 
-	public void open(IPartialPageRequestHandler handler, long userId) {
+	public void show(IPartialPageRequestHandler handler, long userId) {
 		this.userId = userId;
-		contacts.setVisible(userId != getUserId() && contactDao.get(userId, getUserId()) == null, handler);
-		message.setVisible(userId != getUserId(), handler);
+		contacts.setVisible(userId != getUserId() && contactDao.get(userId, getUserId()) == null);
+		message.setVisible(userId != getUserId());
 		container.replace(new UserProfilePanel("body", userId));
-		handler.add(container);
-		open(handler);
+		handler.add(container, contacts, contacts);
+		show(handler);
 	}
 
 	public WebMarkupContainer getContainer() {
 		return container;
 	}
-
-	@Override
-	public int getWidth() {
-		return 600;
-	}
-
-	@Override
-	protected List<DialogButton> getButtons() {
-		return Arrays.asList(contacts, message, cancel);
-	}
-
-	@Override
-	public void onClose(IPartialPageRequestHandler handler, DialogButton button) {
-		if (message.equals(button)) {
-			newMessage.reset(false).open(handler, userId);
-		} else if (contacts.equals(button)) {
-			ContactsHelper.addUserToContactList(userId);
-		}
-	}
 }
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 ff58d25..75d0979 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
@@ -86,7 +86,6 @@ import org.slf4j.LoggerFactory;
 import org.wicketstuff.select2.Select2MultiChoice;
 
 import com.googlecode.wicket.jquery.core.JQueryBehavior;
-import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.JQueryUIBehavior;
 import com.googlecode.wicket.jquery.ui.plugins.wysiwyg.WysiwygEditor;
 import com.googlecode.wicket.jquery.ui.plugins.wysiwyg.toolbar.DefaultWysiwygToolbar;
@@ -96,8 +95,8 @@ import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButtons;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogIcon;
 import com.googlecode.wicket.jquery.ui.widget.dialog.MessageDialog;
-import com.googlecode.wicket.kendo.ui.form.datetime.local.DateTimePicker;
-import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 
 public class AppointmentDialog extends AbstractFormDialog<Appointment> {
 	private static final long serialVersionUID = 1L;
@@ -109,7 +108,7 @@ public class AppointmentDialog extends AbstractFormDialog<Appointment> {
 	private DialogButton delete;
 	private DialogButton enterRoom;
 	private final CalendarPanel calendarPanel;
-	private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
+	private final NotificationPanel feedback = new NotificationPanel("feedback");
 	MessageDialog confirmDelete;
 	private final WebMarkupContainer sipContainer = new WebMarkupContainer("sip-container");
 	private final RadioGroup<InviteeType> rdi = new RadioGroup<>("inviteeType", Model.of(InviteeType.user));
@@ -310,8 +309,8 @@ public class AppointmentDialog extends AbstractFormDialog<Appointment> {
 		private final boolean myRoomsAllowed;
 		private boolean createRoom = true;
 		private Room appRoom = new Room();
-		private final DateTimePicker start = new OmDateTimePicker("start", Model.of(LocalDateTime.now()));
-		private final DateTimePicker end = new OmDateTimePicker("end", Model.of(LocalDateTime.now()));
+		private final OmDateTimePicker start = new OmDateTimePicker("start", Model.of(LocalDateTime.now()));
+		private final OmDateTimePicker end = new OmDateTimePicker("end", Model.of(LocalDateTime.now()));
 		private final PasswordTextField pwd = new PasswordTextField("password");
 		private final Label owner = new Label("aowner", Model.of(""));
 		private final WebMarkupContainer ownerPanel = new WebMarkupContainer("owner-row");
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 ced74b3..330e465 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
@@ -48,14 +48,14 @@ import org.apache.wicket.validation.validator.UrlValidator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractDialog;
 import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButtons;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogIcon;
 import com.googlecode.wicket.jquery.ui.widget.dialog.MessageDialog;
-import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 
 /**
  * Multipurpose Calendar Dialog form. This provides the ability to ask for a user prompt,
@@ -67,7 +67,7 @@ public class CalendarDialog extends AbstractFormDialog<OmCalendar> {
 	private static final Logger log = LoggerFactory.getLogger(CalendarDialog.class);
 	private CalendarPanel calendarPanel;
 
-	private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
+	private final NotificationPanel feedback = new NotificationPanel("feedback");
 	private DialogButton save;
 	private DialogButton cancel;
 	private DialogButton delete;
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 f088fbd..553d912 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,7 +22,7 @@
 <html xmlns:wicket="http://wicket.apache.org">
 <wicket:panel>
 	<div wicket:id="toolbar" class="btn-toolbar chat-toolbar" data-role="editor-toolbar">
-		<div class="btn-group dropup">
+		<div class="dropdown">
 			<a id="emoticons" class="chat btn btn-default emt dropdown-toggle" data-toggle="dropdown" title="Emoticons"></a>
 			<ul class="chat dropdown-menu" >
 				<li>
@@ -31,18 +31,17 @@
 				</li>
 			</ul>
 		</div>
-		<div class="btn-group dropup">
-			<a id="fontSize" class="chat btn btn-default dropdown-toggle" data-toggle="dropdown" title="Font Size"> A <strong class="caret"></strong></a>
+		<div class="dropdown">
+			<a id="fontSize" class="chat btn btn-default dropdown-toggle" data-toggle="dropdown" role="button" title="Font Size"> A </a>
 			<ul class="dropdown-menu">
 				<li><a data-edit="fontSize 5"><span class="font-huge">Huge</span></a></li>
 				<li><a data-edit="fontSize 3"><span class="font-small">Normal</span></a></li>
 				<li><a data-edit="fontSize 1"><span class="font-tiny">Small</span></a></li>
 			</ul>
 		</div>
-		<div class="btn-group dropup">
+		<div class="dropdown">
 			<a id="fontStyle" class="chat btn btn-default dropdown-toggle" data-toggle="dropdown" title="Font Style">
-				<span class="chat-tool-icon">&nbsp;</span>
-				<strong class="caret"></strong>
+				<i class="fas fa-cog"></i>
 			</a>
 			<ul class="dropdown-menu btns-only">
 				<li><a class="chat-btn chat-tool-icon btn btn-default bold" id="bold" data-edit="bold" title="Bold (Ctrl/Cmd+B)"> B </a></li>
@@ -51,17 +50,18 @@
 				<li><a class="chat-btn chat-tool-icon btn btn-default under" id="underline" data-edit="underline" title="Underline (Ctrl/Cmd+U)"> U </a></li>
 			</ul>
 		</div>
-		<div class="btn-group dropup">
-			<a id="hyperlink" class="chat btn chat-tool-icon btn-default dropdown-toggle" data-toggle="dropdown" title="Hyperlink">&nbsp;</a>
+		<div class="dropdown">
+			<a id="hyperlink" class="chat btn btn-default dropdown-toggle" data-toggle="dropdown" title="Hyperlink">
+				<i class="fas fa-link"></i>
+			</a>
 			<div wicket:id="hyperlink" class="dropdown-menu input-append">
 				<input class="span2" placeholder="URL" type="text" onkeypress="if (event.keyCode === 13) {$(this).parent().find('button').trigger('click');}; return event.keyCode !== 13;"/>
 				<button class="btn btn-default" type="button"><wicket:message key="1261"/></button>
 			</div>
 		</div>
-		<div class="btn-group dropup">
+		<div class="dropdown">
 			<a id="actions" class="chat btn btn-default dropdown-toggle" data-toggle="dropdown" wicket:message="title:635">
-				<span class="list chat-tool-icon">&nbsp;</span>
-				<strong class="caret"></strong>
+				<i class="fas fa-bars"></i>
 			</a>
 			<ul class="dropdown-menu btns-only">
 				<li><a class="chat-btn chat-tool-icon btn btn-default save" wicket:message="title:197" wicket:id="save"></a></li>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/raw-chat.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/raw-chat.js
index 9c9ed73..2d44a72 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/raw-chat.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/raw-chat.js
@@ -97,7 +97,7 @@ var Chat = function() {
 		}
 		const emtBtn = $('#emoticons');
 		emtBtn.html('');
-		emtBtn.append(' ' + emoticon.emoticonize(':)') + ' <b class="caret"></b>');
+		emtBtn.append(' ' + emoticon.emoticonize(':)'));
 		const a = $('#chat .audio');
 		const sbtn = $('#chat .send-btn');
 		{ //scope
@@ -105,7 +105,6 @@ var Chat = function() {
 			_updateAudioBtn(a);
 			_updateSendBtn(sbtn)
 		}
-		$('#chat .chat-btn').hover(function(){ $(this).addClass('ui-state-hover') }, function(){ $(this).removeClass('ui-state-hover') });
 		a.off().click(function() {
 			const s = _load();
 			muted = s.chat.muted = !s.chat.muted;
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 9ade356..8987974 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
@@ -40,11 +40,11 @@ import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
-import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.form.button.ConfirmAjaxButton;
 import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractDialog;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
-import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 
 public class AdminCleanupInfoDialog extends AbstractDialog<String> {
 	private static final long serialVersionUID = 1L;
@@ -56,7 +56,7 @@ public class AdminCleanupInfoDialog extends AbstractDialog<String> {
 	private final Label streamsSize;
 	private final CleanupEntityUnitPanel fin;
 	private final WebMarkupContainer container = new WebMarkupContainer("container");
-	private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
+	private final NotificationPanel feedback = new NotificationPanel("feedback");
 	@SpringBean
 	private UserDao userDao;
 	@SpringBean
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/ChangePasswordDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/ChangePasswordDialog.java
index 6c100f5..73a0f28 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/ChangePasswordDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/ChangePasswordDialog.java
@@ -35,10 +35,10 @@ import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
-import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 
 public class ChangePasswordDialog extends AbstractFormDialog<String> {
 	private static final long serialVersionUID = 1L;
@@ -71,7 +71,7 @@ public class ChangePasswordDialog extends AbstractFormDialog<String> {
 			super.onValidate();
 		}
 	};
-	private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
+	private final NotificationPanel feedback = new NotificationPanel("feedback");
 	@SpringBean
 	private UserDao userDao;
 
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 e8f8815..00e739c 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
@@ -18,8 +18,21 @@
  */
 package org.apache.openmeetings.web.user.profile;
 
-import com.googlecode.wicket.jquery.core.JQueryBehavior;
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
+import static org.apache.openmeetings.db.entity.user.PrivateMessage.INBOX_FOLDER_ID;
+import static org.apache.openmeetings.db.entity.user.PrivateMessage.SENT_FOLDER_ID;
+import static org.apache.openmeetings.db.entity.user.PrivateMessage.TRASH_FOLDER_ID;
+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.util.CallbackFunctionHelper.addOnClick;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
 import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
 import org.apache.openmeetings.db.dao.user.PrivateMessageDao;
 import org.apache.openmeetings.db.dao.user.PrivateMessageFolderDao;
@@ -68,20 +81,8 @@ import org.apache.wicket.model.Model;
 import org.apache.wicket.model.util.ListModel;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import static org.apache.openmeetings.db.entity.user.PrivateMessage.INBOX_FOLDER_ID;
-import static org.apache.openmeetings.db.entity.user.PrivateMessage.SENT_FOLDER_ID;
-import static org.apache.openmeetings.db.entity.user.PrivateMessage.TRASH_FOLDER_ID;
-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.util.CallbackFunctionHelper.addOnClick;
+import com.googlecode.wicket.jquery.core.JQueryBehavior;
+import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
 
 public class MessagesContactsPanel extends UserBasePanel {
 	private static final long serialVersionUID = 1L;
@@ -353,7 +354,7 @@ public class MessagesContactsPanel extends UserBasePanel {
 						pm.setTo(opm.getFrom());
 						pm.setSubject(String.format("%s %s", getString("messages.subject.re"), opm.getSubject()));
 						pm.setMessage(String.format("<br/><blockquote class=\"quote\">%s</blockquote>", opm.getMessage()));
-						newDlg.open(target);
+						newDlg.show(target);
 					}
 				}
 			}));
diff --git a/openmeetings-web/src/main/webapp/css/raw-chat.css b/openmeetings-web/src/main/webapp/css/raw-chat.css
index 84c6b51..4f11a04 100644
--- a/openmeetings-web/src/main/webapp/css/raw-chat.css
+++ b/openmeetings-web/src/main/webapp/css/raw-chat.css
@@ -112,12 +112,6 @@ html[dir="rtl"] #chat .messageArea .icons {
 .save.chat-tool-icon {
 	background-image: url(images/file_save_as.png);
 }
-#chat #hyperlink {
-	background-image: url(images/link.png);
-}
-#chat #fontStyle span {
-	background-image: url(images/settings.png);
-}
 .send-ctrl.chat-tool-icon {
 	background-image: url(images/key_ctrl.png);
 	background-position: 0px 0px;
@@ -175,22 +169,12 @@ html[dir="rtl"] .main.room #chatPanel {
 .main.room #chatPanel.closed #chatPopup #chat {
 	display: none;
 }
-ul.dropdown-menu.btns-only, ul.dropdown-menu.btns-only li {
-	max-width: 62px;
-	min-width: 62px;
-}
-ul.dropdown-menu.btns-only li .chat-btn {
-	float: none !important;
-}
 .emt {
 	font-size: 10pt;
 }
 .chat.btn{
 	font-weight: bold;
 }
-.chat.dropdown-menu {
-	left: -50px;
-}
 .chat-msg-container {
 	position: relative;
 }
diff --git a/openmeetings-web/src/main/webapp/css/raw-general-rtl.css b/openmeetings-web/src/main/webapp/css/raw-general-rtl.css
index a9791b0..f2dbedf 100644
--- a/openmeetings-web/src/main/webapp/css/raw-general-rtl.css
+++ b/openmeetings-web/src/main/webapp/css/raw-general-rtl.css
@@ -146,12 +146,6 @@ html[dir="rtl"] span.css-emoticon.un-transformed-emoticon
 html[dir="rtl"] span.css-emoticon {
 	transform: rotate(-90deg) !important;
 }
-html[dir="rtl"] .chat.dropdown-menu {
-	left: auto !important; /* IE */
-	left: initial !important;
-	right: -50px !important;
-	float: right !important;
-}
 html[dir="rtl"] .adminForm label
 , html[dir="rtl"] .adminForm input
 , html[dir="rtl"] .adminForm select