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/12/22 14:12:15 UTC

[openmeetings] 01/01: Merge branch 'master' into java11-modules Some errors are fixed

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

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

commit c824bb40d2c1d06a6853ecd24fae844428867d17
Merge: 6c00af6 299425e
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Wed Dec 22 21:11:22 2021 +0700

    Merge branch 'master' into java11-modules
    Some errors are fixed

 .gitignore                                         |   3 +
 CHANGELOG.md                                       |  45 +-
 README.md                                          |  23 +-
 openmeetings-core/pom.xml                          |  18 -
 openmeetings-core/src/main/java/module-info.java   |  24 +-
 .../apache/openmeetings/core/mail/MailHandler.java |  30 +-
 .../org/apache/openmeetings/core/remote/KRoom.java |   2 +-
 .../core/util/ChatWebSocketHelper.java             |   2 +-
 .../openmeetings/core/util/WebSocketHelper.java    |   2 +-
 .../openmeetings/core/mail/TestMailSending.java    |  10 +-
 .../openmeetings/core/remote/BaseMockedTest.java   |  12 +-
 .../core/remote/TestNotConnectedMocked.java        |   2 +-
 .../core/remote/TestRecordingFlowMocked.java       |  10 +-
 .../core/remote/TestRoomFlowMocked.java            |  14 +-
 .../core/remote/TestSetupFlowMocked.java           |  20 +-
 openmeetings-db/pom.xml                            |  32 +-
 openmeetings-db/src/main/java/module-info.java     |  14 +-
 .../apache/openmeetings/{ => db}/IApplication.java |   2 +-
 .../apache/openmeetings/{ => db}/IWebSession.java  |   2 +-
 .../db/dao/basic/ConfigurationDao.java             |   2 +-
 .../openmeetings/db/dao/room/InvitationDao.java    |   8 +
 .../db/entity/calendar/Appointment.java            |   4 +
 .../openmeetings/db/entity/room/Invitation.java    |   4 +
 .../apache/openmeetings/db/entity/room/Room.java   |   4 +
 .../openmeetings/db/util/ApplicationHelper.java    |   4 +-
 .../openmeetings/db/util/ws/RoomMessage.java       |   1 +
 openmeetings-install/pom.xml                       |   5 +-
 .../src/main/java/module-info.java                 |  16 +-
 .../apache/openmeetings/backup/BackupExport.java   |  58 +-
 .../apache/openmeetings/backup/BackupImport.java   | 201 ++++---
 .../java/org/apache/openmeetings/cli/Admin.java    |  11 +-
 .../installation/ImportInitvalues.java             |   2 +-
 openmeetings-server/pom.xml                        |   6 +-
 .../src/site/markdown/LogoAndIcons.md              |  28 +
 .../Features_Screen_Conference_Room_Thumb.png      | Bin 230947 -> 0 bytes
 .../images/cut_administration_configuration.png    | Bin 203669 -> 0 bytes
 .../resources/images/cut_conference_room_om5.png   | Bin 209105 -> 0 bytes
 .../site/resources/images/cut_file_explorer.png    | Bin 390104 -> 0 bytes
 .../resources/images/cut_integrated_calendar.png   | Bin 55245 -> 0 bytes
 .../site/resources/images/cut_integration_api.png  | Bin 152877 -> 0 bytes
 .../site/resources/images/cut_private_messages.png | Bin 75489 -> 0 bytes
 .../resources/images/cut_recordings_playback.png   | Bin 311981 -> 0 bytes
 .../src/site/resources/images/desktopsharing.png   | Bin 35736 -> 0 bytes
 .../site/resources/images/recordings_timeleine.png | Bin 231190 -> 0 bytes
 .../screenshots/administration-configuration.png   | Bin 0 -> 434836 bytes
 .../images/screenshots/calendar-screenshot.png     | Bin 0 -> 234263 bytes
 .../screenshots/conference-room-av-settings.jpg    | Bin 0 -> 157090 bytes
 .../resources/images/screenshots/file-explorer.png | Bin 0 -> 646616 bytes
 .../images/screenshots/integration-api.png         | Bin 0 -> 251807 bytes
 .../images/screenshots/private-messages.png        | Bin 0 -> 312453 bytes
 .../images/screenshots/recordings-playback.png     | Bin 0 -> 527528 bytes
 .../images/screenshots/screenshot_OM6-2.jpg        | Bin 0 -> 136688 bytes
 .../resources/images/screenshots/share-screen.jpg  | Bin 0 -> 143210 bytes
 openmeetings-server/src/site/resources/js/site.js  |   2 +-
 openmeetings-server/src/site/site.xml              |   4 +-
 .../src/site/xdoc/BuildInstructions.xml            |  23 +-
 .../src/site/xdoc/ConfluencePlugin.xml             |   2 +-
 openmeetings-server/src/site/xdoc/JiraPlugin.xml   |   2 +-
 openmeetings-server/src/site/xdoc/NewsArchive.xml  |  32 +
 .../src/site/xdoc/RestAPISample.xml                | 121 +++-
 .../src/site/xdoc/WebappNamePath.xml               |   7 -
 openmeetings-server/src/site/xdoc/WebsiteGuide.xml |   2 +-
 openmeetings-server/src/site/xdoc/downloads.xml    |  30 +-
 openmeetings-server/src/site/xdoc/index.xml        | 107 ++--
 openmeetings-service/pom.xml                       |  10 -
 .../src/main/java/module-info.java                 |  35 +-
 .../service/calendar/caldav/IcalUtils.java         | 254 ++++----
 .../openmeetings/service/mail/EmailManager.java    |   2 +-
 .../mail/template/AbstractTemplatePanel.html       |   2 +-
 .../mail/template/AbstractTemplatePanel.java       |   4 +-
 .../service/mail/template/FeedbackTemplate.html    |   2 +-
 .../service/mail/template/InvitationTemplate.html  |   2 +-
 .../mail/template/RegisterUserTemplate.html        |   2 +-
 .../template/RequestContactConfirmTemplate.html    |   2 +-
 .../mail/template/RequestContactTemplate.html      |   2 +-
 .../mail/template/ResetPasswordTemplate.html       |   2 +-
 .../subject/AppointmentReminderTemplate.java       |   2 +-
 .../mail/template/subject/AppointmentTemplate.html |   2 +-
 .../mail/template/subject/AppointmentTemplate.java |   2 +-
 .../subject/CanceledAppointmentTemplate.java       |   2 +-
 .../subject/CreatedAppointmentTemplate.java        |   2 +-
 .../subject/InvitedAppointmentTemplate.html        |   2 +-
 .../subject/InvitedAppointmentTemplate.java        |   2 +-
 .../subject/NewGroupUsersNotificationTemplate.html |   2 +-
 .../subject/RecordingExpiringTemplate.html         |   2 +-
 .../subject/UpdatedAppointmentTemplate.java        |   2 +-
 .../service/room/InvitationManager.java            |  10 +-
 openmeetings-util/pom.xml                          |  40 +-
 openmeetings-util/src/main/java/module-info.java   |  30 +-
 .../openmeetings/util/OpenmeetingsVariables.java   |  19 +
 .../org/apache/openmeetings/util/StoredFile.java   |   2 +-
 .../openmeetings/util/crypt/CryptProvider.java     |   3 -
 .../util/mail/ByteArrayDataSource.java             |   2 +-
 .../apache/openmeetings/util/mail/IcalHandler.java |  25 +-
 .../{NonJenkinsTests.java => NonJenkinsTest.java}  |  13 +-
 openmeetings-web/pom.xml                           | 119 +---
 openmeetings-web/src/main/front/chat/src/chat.js   |   2 +-
 openmeetings-web/src/main/front/main/src/index.js  |   7 +
 .../src/main/front/main/src/omutils.js             |  25 +-
 .../src/main/front/room/src/quick-poll.js          |   4 +-
 .../src/main/front/room/src/user-list.js           |   3 +-
 openmeetings-web/src/main/front/room/src/video.js  |   5 -
 .../src/main/front/settings/src/video-util.js      |  16 +-
 openmeetings-web/src/main/front/wb/src/wb-tools.js |  16 +-
 openmeetings-web/src/main/java/module-info.java    |  50 ++
 .../openmeetings/web/admin/AdminActionsPanel.html  |   2 +-
 .../openmeetings/web/admin/AdminActionsPanel.java  |   2 +-
 .../openmeetings/web/admin/AdminBasePanel.html     |   4 +-
 .../openmeetings/web/admin/backup/BackupPanel.html |  67 ++-
 .../openmeetings/web/admin/backup/BackupPanel.java | 170 ++----
 .../backup/BackupUploadResourceReference.java      |  99 +++
 .../web/admin/configurations/ConfigsPanel.html     |   4 +-
 .../web/admin/connection/ConnectionsPanel.html     |   6 +-
 .../web/admin/connection/ConnectionsPanel.java     |   4 +-
 .../openmeetings/web/admin/email/EmailForm.java    |   2 +-
 .../openmeetings/web/admin/email/EmailPanel.html   |   6 +-
 .../openmeetings/web/admin/extra/ExtraPanel.html   |   4 +-
 .../web/admin/groups/GroupUsersPanel.html          |   6 +-
 .../web/admin/groups/GroupUsersPanel.java          |   6 +-
 .../openmeetings/web/admin/groups/GroupsPanel.html |   4 +-
 .../openmeetings/web/admin/groups/GroupsPanel.java |   2 +-
 .../web/admin/labels/AddLanguageDialog.html        |   2 +-
 .../openmeetings/web/admin/labels/LangPanel.html   |  26 +-
 .../openmeetings/web/admin/labels/LangPanel.java   |   2 +-
 .../openmeetings/web/admin/ldaps/LdapsPanel.html   |   4 +-
 .../openmeetings/web/admin/oauth/OAuthForm.java    |   2 +-
 .../openmeetings/web/admin/oauth/OAuthPanel.html   |   8 +-
 .../openmeetings/web/admin/rooms/RoomForm.java     |   8 +-
 .../openmeetings/web/admin/rooms/RoomsPanel.html   |  16 +-
 .../web/admin/users/PasswordDialog.html            |   4 +-
 .../openmeetings/web/admin/users/UserForm.html     |   2 +-
 .../openmeetings/web/admin/users/UserForm.java     |   4 +-
 .../openmeetings/web/admin/users/UsersPanel.html   |   4 +-
 .../openmeetings/web/admin/users/UsersPanel.java   |   2 +-
 .../apache/openmeetings/web/app/Application.java   |  71 +--
 .../web/app/Application.properties.xml             |  23 +-
 .../web/app/Application_ar.properties.xml          |  16 +-
 .../web/app/Application_bg.properties.xml          |  23 +-
 .../web/app/Application_bn.properties.xml          |  23 +-
 .../web/app/Application_ca.properties.xml          |  23 +-
 .../web/app/Application_cs.properties.xml          |  23 +-
 .../web/app/Application_da.properties.xml          |  23 +-
 .../web/app/Application_de.properties.xml          |  12 +-
 .../web/app/Application_el.properties.xml          |  23 +-
 .../web/app/Application_es.properties.xml          |  12 +-
 .../web/app/Application_fa.properties.xml          |  12 +-
 .../web/app/Application_fi.properties.xml          |  23 +-
 .../web/app/Application_fr.properties.xml          |  12 +-
 .../web/app/Application_gl.properties.xml          |  23 +-
 .../web/app/Application_hi.properties.xml          |  23 +-
 .../web/app/Application_hu.properties.xml          |  12 +-
 .../web/app/Application_in.properties.xml          |  23 +-
 .../web/app/Application_it.properties.xml          |  12 +-
 .../web/app/Application_iw.properties.xml          |  23 +-
 .../web/app/Application_ja.properties.xml          |  12 +-
 .../web/app/Application_ko.properties.xml          |  23 +-
 .../web/app/Application_ku.properties.xml          |  23 +-
 .../web/app/Application_lo.properties.xml          |  14 +-
 .../web/app/Application_nl.properties.xml          |  23 +-
 .../web/app/Application_pl.properties.xml          |  14 +-
 .../web/app/Application_pt.properties.xml          |  23 +-
 .../web/app/Application_pt_BR.properties.xml       |  14 +-
 .../web/app/Application_ru.properties.xml          |  12 +-
 .../web/app/Application_sk.properties.xml          |  23 +-
 .../web/app/Application_sv.properties.xml          |  21 +-
 .../web/app/Application_ta.properties.xml          |  23 +-
 .../web/app/Application_th.properties.xml          |  23 +-
 .../web/app/Application_tk.properties.xml          |  23 +-
 .../web/app/Application_tr.properties.xml          |  23 +-
 .../web/app/Application_uk.properties.xml          |  12 +-
 .../web/app/Application_ur.properties.xml          |  23 +-
 .../web/app/Application_zh_CN.properties.xml       |  12 +-
 .../web/app/Application_zh_TW.properties.xml       |  23 +-
 .../apache/openmeetings/web/app/WebSession.java    |   2 +-
 .../openmeetings/web/app/WhiteboardManager.java    |   2 +-
 .../apache/openmeetings/web/common/Captcha.html    |   2 +-
 .../openmeetings/web/common/ComunityUserForm.html  |   2 +-
 .../openmeetings/web/common/ErrorMessagePanel.html |   2 +-
 .../openmeetings/web/common/FormActionsPanel.html  |   2 +-
 .../openmeetings/web/common/FormActionsPanel.java  |   2 +-
 .../openmeetings/web/common/GeneralUserForm.html   |   2 +-
 .../openmeetings/web/common/GeneralUserForm.java   |   2 +-
 .../openmeetings/web/common/HeaderPanel.html       |   2 +-
 .../apache/openmeetings/web/common/ImagePanel.html |   2 +-
 .../openmeetings/web/common/InvitationDialog.html  |   2 +-
 .../openmeetings/web/common/InvitationDialog.java  |   1 +
 .../openmeetings/web/common/InvitationForm.html    |   2 +-
 .../openmeetings/web/common/InvitationForm.java    |   8 +-
 .../apache/openmeetings/web/common/MainPanel.html  |   2 +-
 .../apache/openmeetings/web/common/MainPanel.java  |   2 +-
 .../apache/openmeetings/web/common/NameDialog.html |   4 +-
 .../openmeetings/web/common/OmPagingNavigator.html |   2 +-
 .../web/common/PagedEntityListPanel.html           |   6 +-
 .../web/common/PagingNavigatorPanel.html           |   6 +-
 .../web/common/UploadableImagePanel.html           |   2 +-
 .../web/common/UploadableImagePanel.java           |   2 +-
 .../common/confirmation/ConfirmableAjaxBorder.html |  26 -
 .../common/confirmation/ConfirmableAjaxBorder.java |  74 ---
 .../common/confirmation/ConfirmationBehavior.java  | 112 ----
 .../common/confirmation/ConfirmationConfig.java    | 114 ----
 .../common/confirmation/ConfirmationDialog.java    |  77 ---
 .../common/confirmation/ConfirmationHelper.java    |  47 ++
 .../common/confirmation/bootstrap-confirmation.js  | 596 ------------------
 .../common/datetime/AbstractOmDateTimePicker.html  |   2 +-
 .../openmeetings/web/common/menu/MenuPanel.html    |   2 +-
 .../web/common/tree/ConvertingErrorsDialog.html    |   2 +-
 .../web/common/tree/FileItemPanel.html             |   2 +-
 .../web/common/tree/FileTreePanel.html             |  25 +-
 .../web/common/tree/FileTreePanel.java             |  67 +--
 .../openmeetings/web/common/tree/FolderPanel.html  |   2 +-
 .../web/common/tree/OmTreeProvider.java            |   2 +-
 .../openmeetings/web/common/tree/filetree.js       |  13 +-
 .../upload/UploadForm.html}                        |  38 +-
 .../openmeetings/web/common/upload/UploadForm.java | 120 ++++
 .../web/common/upload/UploadResourceReference.java | 148 +++++
 .../openmeetings/web/common/upload/upload.js       | 126 ++++
 .../openmeetings/web/pages/AccessDeniedPage.html   |   2 +-
 .../apache/openmeetings/web/pages/BasePage.html    |  34 +-
 .../apache/openmeetings/web/pages/BasePage.java    |   2 +-
 .../apache/openmeetings/web/pages/HashPage.html    |   2 +-
 .../openmeetings/web/pages/InternalErrorPage.html  |   2 +-
 .../web/pages/InvitationPasswordDialog.html        |   2 +-
 .../apache/openmeetings/web/pages/MainPage.html    |   2 +-
 .../openmeetings/web/pages/NotInitedPage.html      |   2 +-
 .../apache/openmeetings/web/pages/PrivacyPage.html |   2 +-
 .../apache/openmeetings/web/pages/ResetPage.html   |   2 +-
 .../web/pages/auth/ForgetPasswordDialog.html       |  16 +-
 .../web/pages/auth/ForgetPasswordDialog.java       |   2 +-
 .../web/pages/auth/RegisterDialog.html             |  34 +-
 .../web/pages/auth/ResetPasswordDialog.html        |   8 +-
 .../openmeetings/web/pages/auth/SignInDialog.html  |  36 +-
 .../openmeetings/web/pages/auth/SignInPage.html    |   2 +-
 .../web/pages/install/CongratulationsPanel.html    |   2 +-
 .../web/pages/install/InstallWizard$DbStep.html    |   2 +-
 .../pages/install/InstallWizard$InstallStep.html   |   2 +-
 .../pages/install/InstallWizard$ParamsStep1.html   |   2 +-
 .../pages/install/InstallWizard$ParamsStep2.html   |   2 +-
 .../pages/install/InstallWizard$ParamsStep3.html   |   2 +-
 .../pages/install/InstallWizard$ParamsStep4.html   |   2 +-
 .../pages/install/InstallWizard$WelcomeStep.html   |   2 +-
 .../web/pages/install/InstallWizard.java           |   8 +-
 .../web/pages/install/InstallWizardPage.html       |   2 +-
 .../openmeetings/web/room/EventDetailDialog.html   |   2 +-
 .../openmeetings/web/room/IconTextModal.html       |   2 +-
 .../apache/openmeetings/web/room/NetTestPanel.html |  34 +-
 .../openmeetings/web/room/NicknameDialog.html      |   2 +-
 .../apache/openmeetings/web/room/RoomPanel.html    |  30 +-
 .../apache/openmeetings/web/room/RoomPanel.java    |  61 +-
 .../web/room/RoomResourceReference.java            |   2 +-
 .../openmeetings/web/room/VideoSettings.html       |  12 +-
 .../web/room/activities/ActivitiesPanel.html       |   6 +-
 .../openmeetings/web/room/menu/ActionsSubMenu.java |   7 +-
 .../web/room/menu/RoomInvitationForm.html          |   2 +-
 .../web/room/menu/RoomInvitationForm.java          |  19 +-
 .../openmeetings/web/room/menu/RoomMenuPanel.html  |   4 +-
 .../openmeetings/web/room/menu/RoomMenuPanel.java  |  10 +-
 .../web/room/menu/SipDialerDialog.html             |   2 +-
 .../web/room/poll/CreatePollDialog.html            |  10 +-
 .../web/room/poll/PollResultsDialog.html           |   2 +-
 .../web/room/poll/PollResultsDialog.java           |   2 +-
 .../openmeetings/web/room/poll/VoteDialog.html     |   6 +-
 .../apache/openmeetings/web/room/raw-nettest.js    |   2 +-
 .../web/room/sidebar/RoomFilePanel.java            |   2 +-
 .../sidebar/RoomFileUploadResourceReference.java   | 143 ++---
 .../openmeetings/web/room/sidebar/RoomSidebar.html |  12 +-
 .../openmeetings/web/room/sidebar/RoomSidebar.java |   2 +-
 .../RoomUploadForm.html}                           |  32 +-
 .../web/room/sidebar/RoomUploadForm.java           |  93 +++
 .../web/room/sidebar/UploadDialog.html             |  26 +-
 .../web/room/sidebar/UploadDialog.java             |  53 +-
 .../openmeetings/web/room/sidebar/room-upload.js   |  14 +
 .../apache/openmeetings/web/room/sidebar/upload.js | 112 ----
 .../openmeetings/web/room/wb/InterviewWbPanel.html |   2 +-
 .../apache/openmeetings/web/room/wb/WbPanel.html   |  70 +--
 .../web/room/wb/WbWebSocketHelper.java             |   2 +-
 .../openmeetings/web/room/wb/WsMessageWb.java      |   2 +-
 .../openmeetings/web/room/wb/WsMessageWbFile.java  |   2 +-
 .../apache/openmeetings/web/user/AboutDialog.html  |  10 +-
 .../web/user/InviteUserMessageDialog.html          |   2 +-
 .../web/user/InviteUserToRoomDialog.html           |   2 +-
 .../openmeetings/web/user/MessageDialog.html       |   2 +-
 .../openmeetings/web/user/MessageDialog.java       |   5 +-
 .../openmeetings/web/user/OmWysiwygToolbar.html    |   6 +-
 .../openmeetings/web/user/UserInfoDialog.html      |   2 +-
 .../web/user/calendar/AppointmentDialog.html       |   8 +-
 .../web/user/calendar/AppointmentDialog.java       |   9 +-
 .../web/user/calendar/CalendarDialog.html          |   2 +-
 .../web/user/calendar/CalendarDialog.java          |   2 +-
 .../web/user/calendar/CalendarPanel.html           |   4 +-
 .../web/user/calendar/CalendarPanel.java           |   2 +-
 .../apache/openmeetings/web/user/chat/Chat.html    |   6 +-
 .../apache/openmeetings/web/user/chat/Chat.java    |   4 +-
 .../openmeetings/web/user/chat/ChatPanel.html      |   4 +-
 .../openmeetings/web/user/chat/ChatToolbar.html    |  16 +-
 .../openmeetings/web/user/chat/ChatToolbar.java    |   8 +-
 .../web/user/dashboard/MyRoomsWidgetView.html      |   2 +-
 .../web/user/dashboard/OmDashboardPanel.html       |   2 +-
 .../web/user/dashboard/RecentRoomsWidgetView.html  |   2 +-
 .../web/user/dashboard/RssWidgetView.html          |   6 +-
 .../web/user/dashboard/StartWidgetView.html        |  10 +-
 .../web/user/dashboard/WelcomeWidgetView.html      |   2 +-
 .../dashboard/admin/AdminCleanupInfoDialog.html    |   2 +-
 .../dashboard/admin/AdminCleanupInfoDialog.java    |   2 +-
 .../web/user/dashboard/admin/AdminWidgetView.html  |   2 +-
 .../dashboard/admin/CleanupEntityUnitPanel.html    |   2 +-
 .../web/user/dashboard/admin/CleanupUnitPanel.html |   2 +-
 .../apache/openmeetings/web/user/dashboard/rss.js  |   2 +-
 .../web/user/profile/ChangePasswordDialog.html     |   2 +-
 .../web/user/profile/EditProfileForm.html          |   2 +-
 .../web/user/profile/EditProfilePanel.html         |   2 +-
 .../web/user/profile/InvitationDetails.java        |   2 +-
 .../web/user/profile/InvitationsPanel.html         |  14 +-
 .../web/user/profile/InvitationsPanel.java         |   2 +-
 .../web/user/profile/MessagesContactsPanel.html    |   8 +-
 .../web/user/profile/MessagesContactsPanel.java    |   4 +-
 .../web/user/profile/UserProfilePanel.html         |   2 +-
 .../web/user/profile/UserSearchPanel.html          |   6 +-
 .../web/user/profile/UserSearchPanel.java          |   2 +-
 .../web/user/profile/WidgetsPanel.html             |   4 +-
 .../web/user/profile/WidgetsPanel.java             |   4 +-
 .../web/user/record/RecordingInvitationForm.html   |   2 +-
 .../web/user/record/RecordingInvitationForm.java   |   9 +-
 .../web/user/record/RecordingsPanel.html           |   4 +-
 .../web/user/record/RecordingsPanel.java           |   7 +-
 .../openmeetings/web/user/record/VideoInfo.html    |   2 +-
 .../openmeetings/web/user/record/VideoPlayer.html  |   2 +-
 .../openmeetings/web/user/rooms/RoomListPanel.html |   6 +-
 .../openmeetings/web/user/rooms/RoomListPanel.java |   2 +-
 .../openmeetings/web/user/rooms/RoomsPanel.html    |   4 +-
 .../openmeetings/web/user/rooms/RoomsPanel.java    |   2 +-
 .../web/user/rooms/RoomsSelectorPanel.html         |   4 +-
 .../web/user/rooms/RoomsSelectorPanel.java         |  11 +-
 .../web/user/rooms/RoomsTabbedPanel.html           |   2 +-
 .../web/util/GroupLogoResourceReference.java       |   4 +-
 .../web/util/ProfileImageResourceReference.java    |   9 +-
 .../apache/openmeetings/web/util/ThreadHelper.java |  13 +-
 .../web/util/UserDashboardPersister.java           |   2 +-
 .../util/logging/OpenMeetingsMetricsServlet.java   |   3 +-
 .../web/util/logging/TomcatGenericExports.java     |  13 +-
 .../classes/META-INF/oracle_persistence.xml        |   2 +-
 .../main/webapp/WEB-INF/classes/cxf-servlet.xml    |   1 +
 .../src/main/webapp/WEB-INF/classes/hazelcast.xml  |   2 +-
 .../src/main/webapp/css/raw-activities.css         |   2 +-
 openmeetings-web/src/main/webapp/css/raw-admin.css |   4 +-
 .../src/main/webapp/css/raw-calendar.css           |   7 +
 openmeetings-web/src/main/webapp/css/raw-chat.css  |   7 +-
 .../src/main/webapp/css/raw-general.css            |  22 +-
 openmeetings-web/src/main/webapp/css/raw-menu.css  |   6 +-
 .../src/main/webapp/css/raw-nettest.css            |  20 +-
 openmeetings-web/src/main/webapp/css/raw-room.css  | 111 ++--
 openmeetings-web/src/main/webapp/css/raw-tree.css  |  18 +-
 .../src/main/webapp/css/raw-variables.css          |   3 +-
 openmeetings-web/src/main/webapp/css/raw-wb.css    |   4 +-
 .../main/webapp/images/icons/apple-icon-180.png    | Bin 0 -> 10696 bytes
 .../webapp/images/icons/apple-splash-1125-2436.jpg | Bin 0 -> 66463 bytes
 .../webapp/images/icons/apple-splash-1136-640.jpg  | Bin 0 -> 24945 bytes
 .../webapp/images/icons/apple-splash-1170-2532.jpg | Bin 0 -> 69906 bytes
 .../webapp/images/icons/apple-splash-1242-2208.jpg | Bin 0 -> 72120 bytes
 .../webapp/images/icons/apple-splash-1242-2688.jpg | Bin 0 -> 75659 bytes
 .../webapp/images/icons/apple-splash-1284-2778.jpg | Bin 0 -> 78823 bytes
 .../webapp/images/icons/apple-splash-1334-750.jpg  | Bin 0 -> 31010 bytes
 .../webapp/images/icons/apple-splash-1536-2048.jpg | Bin 0 -> 88952 bytes
 .../webapp/images/icons/apple-splash-1620-2160.jpg | Bin 0 -> 95661 bytes
 .../webapp/images/icons/apple-splash-1668-2224.jpg | Bin 0 -> 99240 bytes
 .../webapp/images/icons/apple-splash-1668-2388.jpg | Bin 0 -> 101273 bytes
 .../webapp/images/icons/apple-splash-1792-828.jpg  | Bin 0 -> 32864 bytes
 .../webapp/images/icons/apple-splash-2048-1536.jpg | Bin 0 -> 83104 bytes
 .../webapp/images/icons/apple-splash-2048-2732.jpg | Bin 0 -> 130068 bytes
 .../webapp/images/icons/apple-splash-2160-1620.jpg | Bin 0 -> 89441 bytes
 .../webapp/images/icons/apple-splash-2208-1242.jpg | Bin 0 -> 60178 bytes
 .../webapp/images/icons/apple-splash-2224-1668.jpg | Bin 0 -> 92538 bytes
 .../webapp/images/icons/apple-splash-2388-1668.jpg | Bin 0 -> 92578 bytes
 .../webapp/images/icons/apple-splash-2436-1125.jpg | Bin 0 -> 50367 bytes
 .../webapp/images/icons/apple-splash-2532-1170.jpg | Bin 0 -> 53274 bytes
 .../webapp/images/icons/apple-splash-2688-1242.jpg | Bin 0 -> 57573 bytes
 .../webapp/images/icons/apple-splash-2732-2048.jpg | Bin 0 -> 121595 bytes
 .../webapp/images/icons/apple-splash-2778-1284.jpg | Bin 0 -> 60820 bytes
 .../webapp/images/icons/apple-splash-640-1136.jpg  | Bin 0 -> 30165 bytes
 .../webapp/images/icons/apple-splash-750-1334.jpg  | Bin 0 -> 37214 bytes
 .../webapp/images/icons/apple-splash-828-1792.jpg  | Bin 0 -> 44404 bytes
 .../images/icons/manifest-icon-192.maskable.png    | Bin 0 -> 11489 bytes
 .../images/icons/manifest-icon-512.maskable.png    | Bin 0 -> 40763 bytes
 .../webapp/images/icons/openmeetings-logo-icon.svg | 110 ++++
 .../apache/openmeetings/AbstractSpringTest.java    |  48 --
 .../calendar/TestAppointmentAddAppointment.java    |   4 +-
 .../calendar/TestAppointmentSchedulerTask.java     |   4 +-
 .../calendar/TestDatabaseStructureAppointment.java |   4 +-
 ...TestDatabaseStructureGetAppointmentByRange.java |   4 +-
 .../TestDatabaseStructureGetUserStart.java         |   4 +-
 .../TestDatabaseStructureMeetingMember.java        |   4 +-
 .../openmeetings/calendar/TestGetAppointment.java  |   4 +-
 .../openmeetings/calendar/TestOmCalendar.java      |   4 +-
 .../openmeetings/calendar/TestSendIcalMessage.java |  33 +-
 .../openmeetings/{cli => cmdline}/TestAdmin.java   |  16 +-
 .../openmeetings/{cli => cmdline}/TestPatcher.java |   9 +-
 .../org/apache/openmeetings/config/TestConfig.java |   4 +-
 .../openmeetings/core/file/TestFileProcessor.java  |   4 +-
 .../apache/openmeetings/domain/TestAddGroup.java   |   4 +-
 .../domain/TestUserGroupAggregation.java           |   4 +-
 .../openmeetings/invitiation/TestInvitation.java   |   6 +-
 .../org/apache/openmeetings/ldap/TestLdap.java     |   6 +-
 .../apache/openmeetings/smoke/TestSmokeBasic.java  |   4 +-
 .../apache/openmeetings/user/TestUserContact.java  |   6 +-
 .../apache/openmeetings/user/TestUserCount.java    |   4 +-
 .../apache/openmeetings/user/TestUserGroup.java    |   6 +-
 .../org/apache/openmeetings/userdata/TestAuth.java |   4 +-
 .../apache/openmeetings/userdata/TestLogin.java    |   4 +-
 .../org/apache/openmeetings/web/TestCalendar.java  |   8 +-
 .../org/apache/openmeetings/web/TestMainAreas.java |   6 +-
 .../org/apache/openmeetings/web/TestMainMenu.java  |   6 +-
 .../openmeetings/web/app/TestApplication.java      |   4 +-
 .../web/app/TestApplicationMocked.java             |   6 +-
 .../web/app/TestOmAuthenticationStrategy.java      |   4 +-
 .../web/app/TestUserManagerMocked.java             |   2 +
 .../openmeetings/web/app/TestWebSession.java       |   4 +-
 .../openmeetings/web/pages/TestHashPage.java       |   8 +-
 .../openmeetings/web/pages/auth/TestLoginUI.java   |   4 +-
 .../web/pages/install/TestInstall.java             |  26 +-
 .../service/mail}/TestEmailTemplate.java           |  12 +-
 .../service/mail}/TestSubjTemplate.java            |  14 +-
 .../test/AbstractOmServerTest.java}                |  34 +-
 .../test/AbstractWicketTesterTest.java}            |  10 +-
 .../test/IsolatedTest.java}                        |  18 +-
 .../apache/openmeetings/web/test/RegularTest.java  |  23 +-
 .../{ => web/test}/backup/AbstractTestImport.java  |  10 +-
 .../{ => web/test}/backup/TestExport.java          |  11 +-
 .../{ => web/test}/backup/TestImport.java          |   5 +-
 .../{ => web/test}/backup/TestImportCalendar.java  |   4 +-
 .../{ => web/test}/backup/TestImportConfig.java    |   4 +-
 .../{ => web/test}/backup/TestImportOld.java       |   8 +-
 .../{ => web/test}/backup/TestImportRoom.java      |   4 +-
 .../{ => web/test}/backup/TestImportUser.java      |   5 +-
 .../{db/dao => web/test/db}/TestFileDao.java       |   6 +-
 .../{db/dao => web/test/db}/TestRoomDao.java       |   6 +-
 .../scheduler => web/test/job}/TestJob.java        |  10 +-
 .../openmeetings/{ => web}/util/TestDateTime.java  |   6 +-
 .../{ => web}/util/TestStoredFile.java             |   7 +-
 .../webservice/AbstractWebServiceTest.java         |  50 +-
 .../webservice/CreateTomcatExtension.java          |  82 +++
 .../webservice/TestCalendarService.java            |  14 +-
 .../openmeetings/webservice/TestErrorService.java  |   2 +-
 .../openmeetings/webservice/TestFileService.java   |  13 +-
 .../openmeetings/webservice/TestGroupService.java  |   4 +-
 .../openmeetings/webservice/TestInfoService.java   |  31 +-
 .../webservice/TestRecordingService.java           |   2 +-
 .../openmeetings/webservice/TestUserService.java   |  24 +-
 openmeetings-web/src/test/jetty/web.xml            |   2 +-
 .../src/test/resources/logback-test.xml            |   1 +
 .../apache/openmeetings/backup/config/configs.xml  |   4 +-
 .../openmeetings/backup/config/skip/configs.xml    |   4 +-
 openmeetings-webservice/pom.xml                    | 107 +++-
 .../src/main/java/module-info.java                 |  13 +-
 .../webservice/CalendarWebService.java             | 128 +++-
 .../openmeetings/webservice/ErrorWebService.java   |  41 +-
 .../openmeetings/webservice/FileWebService.java    | 136 ++++-
 .../openmeetings/webservice/GroupWebService.java   | 113 +++-
 .../openmeetings/webservice/InfoWebService.java    |  67 ++-
 .../openmeetings/webservice/NetTestWebService.java |  50 +-
 .../webservice/RecordingWebService.java            |  68 ++-
 .../openmeetings/webservice/RoomWebService.java    | 202 ++++++-
 .../openmeetings/webservice/UserWebService.java    |  97 ++-
 .../openmeetings/webservice/WbWebService.java      |  72 ++-
 .../schema/AppointmentDTOListWrapper.java          | 157 +++++
 .../webservice/schema/AppointmentDTOWrapper.java   | 153 +++++
 .../schema/FileExplorerObjectWrapper.java          |  79 +++
 .../webservice/schema/FileItemDTOListWrapper.java  |  60 ++
 .../webservice/schema/FileItemDTOWrapper.java      |  56 ++
 .../webservice/schema/GroupDTOListWrapper.java     |  58 ++
 .../webservice/schema/HealthWrapper.java           |  34 +-
 .../webservice/schema/InfoWrapper.java             |  38 +-
 .../webservice/schema/RecordingDTOListWrapper.java |  63 ++
 .../webservice/schema/RoomDTOListWrapper.java      | 124 ++++
 .../webservice/schema/RoomDTOWrapper.java          |  64 ++
 .../webservice/schema/ServiceResultWrapper.java    |  44 +-
 .../webservice/schema/UserDTOListWrapper.java      | 111 ++++
 .../webservice/schema/UserDTOWrapper.java          |  68 +++
 .../webservice/schema/UserSearchResultWrapper.java |  94 +++
 .../webservice/util/OmExceptionHandler.java        |  20 +-
 pom.xml                                            | 666 +++++++++++++++++----
 .../license/THIRD-PARTY.properties                 |   3 +-
 src/license/license-template.ftl                   |  93 +++
 481 files changed, 6195 insertions(+), 3760 deletions(-)

diff --cc openmeetings-core/pom.xml
index 01d7b75,145b416..3cabb9d
--- a/openmeetings-core/pom.xml
+++ b/openmeetings-core/pom.xml
@@@ -84,20 -80,12 +80,8 @@@
  		<dependency>
  			<groupId>org.apache.directory.api</groupId>
  			<artifactId>api-all</artifactId>
- 			<version>${api-all.version}</version>
- 			<exclusions>
- 				<exclusion>
- 					<groupId>xml-apis</groupId>
- 					<artifactId>xml-apis</artifactId>
- 				</exclusion>
- 			</exclusions>
- 		</dependency>
- 		<dependency>
- 			<groupId>com.sun.mail</groupId>
- 			<artifactId>javax.mail</artifactId>
- 			<version>${javax.mail.version}</version>
  		</dependency>
  		<dependency>
 -			<groupId>com.sun.mail</groupId>
 -			<artifactId>javax.mail</artifactId>
 -		</dependency>
 -		<dependency>
  			<groupId>org.jodconverter</groupId>
  			<artifactId>jodconverter-local</artifactId>
  		</dependency>
diff --cc openmeetings-core/src/main/java/module-info.java
index 696b002,0000000..0a2eb16
mode 100644,000000..100644
--- a/openmeetings-core/src/main/java/module-info.java
+++ b/openmeetings-core/src/main/java/module-info.java
@@@ -1,44 -1,0 +1,52 @@@
 +/*
 + * 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.
 + */
- module apache.openmeetings.core {
- 	requires transitive apache.openmeetings.db;
++module org.apache.openmeetings.core {
++	exports org.apache.openmeetings.core.converter;
++	exports org.apache.openmeetings.core.data.file;
++	exports org.apache.openmeetings.core.ldap;
++	exports org.apache.openmeetings.core.mail;
++	exports org.apache.openmeetings.core.notifier;
++	exports org.apache.openmeetings.core.remote;
++	exports org.apache.openmeetings.core.rss;
++	exports org.apache.openmeetings.core.sip;
++	exports org.apache.openmeetings.core.util;
++
++	requires transitive org.apache.openmeetings.db;
++
++	requires transitive org.apache.wicket.ioc;
 +
 +	requires transitive org.apache.commons.io;
 +
 +	requires kurento.client;
 +	requires kurento.commons;
 +	requires kurento.jsonrpc.client;
- 	requires java.activation;
 +	requires com.google.gson;
- 	requires java.mail;
 +	requires java.xml;
 +	requires xstream;
 +
 +	requires jodconverter.core;
 +	requires jodconverter.local;
 +	requires org.apache.directory.ldap.api.all;
- 	requires tika.parsers;
 +	requires javax.inject;
- 	requires wicket.ioc;
 +	requires java.annotation;
- 	requires apache.openmeetings.util;
 +	requires asterisk.java;
 +	requires jain.sip.ri;
++	requires org.apache.tika.parser.image;
++	requires transitive jakarta.mail;
 +}
- 
diff --cc openmeetings-core/src/main/java/org/apache/openmeetings/core/mail/MailHandler.java
index 5e42772,5e42772..445d1a6
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/mail/MailHandler.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/mail/MailHandler.java
@@@ -40,24 -40,24 +40,10 @@@ import java.util.Date
  import java.util.List;
  import java.util.Properties;
  
--import javax.activation.DataHandler;
--import javax.mail.Authenticator;
--import javax.mail.BodyPart;
--import javax.mail.Message;
--import javax.mail.MessagingException;
--import javax.mail.Multipart;
--import javax.mail.PasswordAuthentication;
--import javax.mail.Session;
--import javax.mail.Transport;
--import javax.mail.internet.InternetAddress;
--import javax.mail.internet.MimeBodyPart;
--import javax.mail.internet.MimeMessage;
--import javax.mail.internet.MimeMultipart;
--import javax.mail.util.ByteArrayDataSource;
--
  import org.apache.openmeetings.db.dao.basic.MailMessageDao;
  import org.apache.openmeetings.db.entity.basic.MailMessage;
  import org.apache.openmeetings.db.entity.basic.MailMessage.Status;
++import org.apache.openmeetings.util.mail.ByteArrayDataSource;
  import org.apache.openmeetings.util.mail.MailUtil;
  import org.apache.wicket.util.string.Strings;
  import org.slf4j.Logger;
@@@ -66,6 -66,6 +52,20 @@@ import org.springframework.beans.factor
  import org.springframework.core.task.TaskExecutor;
  import org.springframework.stereotype.Component;
  
++import jakarta.activation.DataHandler;
++import jakarta.mail.Authenticator;
++import jakarta.mail.BodyPart;
++import jakarta.mail.Message;
++import jakarta.mail.MessagingException;
++import jakarta.mail.Multipart;
++import jakarta.mail.PasswordAuthentication;
++import jakarta.mail.Session;
++import jakarta.mail.Transport;
++import jakarta.mail.internet.InternetAddress;
++import jakarta.mail.internet.MimeBodyPart;
++import jakarta.mail.internet.MimeMessage;
++import jakarta.mail.internet.MimeMultipart;
++
  /**
   *
   * @author swagner
diff --cc openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
index 04c9a08,04c9a08..7408229
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
@@@ -30,8 -30,8 +30,8 @@@ import java.util.concurrent.atomic.Atom
  import javax.inject.Inject;
  
  import org.apache.commons.lang3.time.FastDateFormat;
--import org.apache.openmeetings.IApplication;
  import org.apache.openmeetings.core.util.WebSocketHelper;
++import org.apache.openmeetings.db.IApplication;
  import org.apache.openmeetings.db.dao.record.RecordingDao;
  import org.apache.openmeetings.db.entity.basic.Client;
  import org.apache.openmeetings.db.entity.basic.Client.Activity;
diff --cc openmeetings-core/src/main/java/org/apache/openmeetings/core/util/ChatWebSocketHelper.java
index 33d3a8e,33d3a8e..b92ab6d
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/ChatWebSocketHelper.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/ChatWebSocketHelper.java
@@@ -26,10 -26,10 +26,10 @@@ import java.util.List
  import java.util.function.BiConsumer;
  
  import org.apache.commons.lang3.time.FastDateFormat;
--import org.apache.openmeetings.IApplication;
  import org.apache.openmeetings.core.util.ws.WsMessageChat;
  import org.apache.openmeetings.core.util.ws.WsMessageChat2All;
  import org.apache.openmeetings.core.util.ws.WsMessageChat2User;
++import org.apache.openmeetings.db.IApplication;
  import org.apache.openmeetings.db.entity.basic.ChatMessage;
  import org.apache.openmeetings.db.entity.room.Room.Right;
  import org.apache.openmeetings.db.entity.user.User;
diff --cc openmeetings-core/src/main/java/org/apache/openmeetings/core/util/WebSocketHelper.java
index 16c3698,16c3698..3ef9357
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/WebSocketHelper.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/WebSocketHelper.java
@@@ -28,12 -28,12 +28,12 @@@ import java.util.function.Function
  import java.util.function.Predicate;
  import java.util.stream.Stream;
  
--import org.apache.openmeetings.IApplication;
  import org.apache.openmeetings.core.util.ws.WsMessageAll;
  import org.apache.openmeetings.core.util.ws.WsMessageRoom;
  import org.apache.openmeetings.core.util.ws.WsMessageRoomMsg;
  import org.apache.openmeetings.core.util.ws.WsMessageRoomOthers;
  import org.apache.openmeetings.core.util.ws.WsMessageUser;
++import org.apache.openmeetings.db.IApplication;
  import org.apache.openmeetings.db.entity.basic.Client;
  import org.apache.openmeetings.db.entity.basic.IWsClient;
  import org.apache.openmeetings.db.manager.IClientManager;
diff --cc openmeetings-core/src/test/java/org/apache/openmeetings/core/mail/TestMailSending.java
index e2572e9,e2572e9..3533970
--- a/openmeetings-core/src/test/java/org/apache/openmeetings/core/mail/TestMailSending.java
+++ b/openmeetings-core/src/test/java/org/apache/openmeetings/core/mail/TestMailSending.java
@@@ -26,15 -26,15 +26,15 @@@ import static org.apache.openmeetings.u
  import static org.apache.openmeetings.util.OpenmeetingsVariables.setSmtpUser;
  import static org.junit.jupiter.api.Assertions.assertTrue;
  
--import javax.mail.Message;
--import javax.mail.Transport;
--import javax.mail.internet.InternetAddress;
--import javax.mail.internet.MimeMessage;
--
  import org.junit.jupiter.api.Test;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
++import jakarta.mail.Message;
++import jakarta.mail.Transport;
++import jakarta.mail.internet.InternetAddress;
++import jakarta.mail.internet.MimeMessage;
++
  /**
   *
   * @author swagner
diff --cc openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/BaseMockedTest.java
index e405d55,ff8549d..a27d3b5
--- a/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/BaseMockedTest.java
+++ b/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/BaseMockedTest.java
@@@ -35,8 -35,8 +35,8 @@@ import java.util.Set
  
  import javax.inject.Inject;
  
--import org.apache.openmeetings.IApplication;
  import org.apache.openmeetings.core.util.WebSocketHelper;
++import org.apache.openmeetings.db.IApplication;
  import org.apache.openmeetings.db.dao.label.LabelDao;
  import org.apache.openmeetings.db.entity.basic.IWsClient;
  import org.apache.openmeetings.db.entity.label.OmLanguage;
diff --cc openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestRecordingFlowMocked.java
index 377d48b,b8ddf50..9391a8e
--- a/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestRecordingFlowMocked.java
+++ b/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestRecordingFlowMocked.java
@@@ -28,7 -28,7 +28,7 @@@ import static org.mockito.Mockito.doRet
  import static org.mockito.Mockito.verify;
  import static org.mockito.Mockito.when;
  
--import org.apache.openmeetings.IApplication;
++import org.apache.openmeetings.db.IApplication;
  import org.apache.openmeetings.db.dao.record.RecordingDao;
  import org.apache.openmeetings.db.dao.room.RoomDao;
  import org.apache.openmeetings.db.dao.user.UserDao;
diff --cc openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestRoomFlowMocked.java
index d120f9b,005bbe4..9d06f7f
--- a/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestRoomFlowMocked.java
+++ b/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestRoomFlowMocked.java
@@@ -26,7 -26,7 +26,7 @@@ import static org.mockito.Mockito.doRet
  import static org.mockito.Mockito.lenient;
  import static org.mockito.Mockito.mock;
  
--import org.apache.openmeetings.IApplication;
++import org.apache.openmeetings.db.IApplication;
  import org.apache.openmeetings.db.dao.record.RecordingDao;
  import org.apache.openmeetings.db.dao.room.RoomDao;
  import org.apache.openmeetings.db.dao.user.UserDao;
diff --cc openmeetings-db/src/main/java/module-info.java
index aa1690d,0000000..62479df
mode 100644,000000..100644
--- a/openmeetings-db/src/main/java/module-info.java
+++ b/openmeetings-db/src/main/java/module-info.java
@@@ -1,63 -1,0 +1,67 @@@
 +/*
 + * 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.
 + */
- module apache.openmeetings.db {
- 	exports org.apache.openmeetings;
++module org.apache.openmeetings.db {
++	exports org.apache.openmeetings.db;
++	exports org.apache.openmeetings.db.bind;
++	exports org.apache.openmeetings.db.bind.adapter;
 +	exports org.apache.openmeetings.db.dao;
 +	exports org.apache.openmeetings.db.dao.basic;
 +	exports org.apache.openmeetings.db.dao.calendar;
 +	exports org.apache.openmeetings.db.dao.file;
 +	exports org.apache.openmeetings.db.dao.label;
 +	exports org.apache.openmeetings.db.dao.log;
 +	exports org.apache.openmeetings.db.dao.record;
 +	exports org.apache.openmeetings.db.dao.room;
 +	exports org.apache.openmeetings.db.dao.server;
 +	exports org.apache.openmeetings.db.dao.user;
 +	exports org.apache.openmeetings.db.dto.basic;
 +	exports org.apache.openmeetings.db.dto.calendar;
 +	exports org.apache.openmeetings.db.dto.file;
 +	exports org.apache.openmeetings.db.dto.record;
 +	exports org.apache.openmeetings.db.dto.room;
 +	exports org.apache.openmeetings.db.dto.user;
 +	exports org.apache.openmeetings.db.entity;
 +	exports org.apache.openmeetings.db.entity.basic;
 +	exports org.apache.openmeetings.db.entity.calendar;
 +	exports org.apache.openmeetings.db.entity.file;
 +	exports org.apache.openmeetings.db.entity.label;
 +	exports org.apache.openmeetings.db.entity.log;
 +	exports org.apache.openmeetings.db.entity.record;
 +	exports org.apache.openmeetings.db.entity.room;
 +	exports org.apache.openmeetings.db.entity.server;
 +	exports org.apache.openmeetings.db.entity.user;
 +	exports org.apache.openmeetings.db.manager;
++	exports org.apache.openmeetings.db.mapper;
 +	exports org.apache.openmeetings.db.util;
 +	exports org.apache.openmeetings.db.util.ws;
 +
- 	requires transitive apache.openmeetings.util;
++	requires transitive org.apache.openmeetings.util;
 +	requires transitive org.apache.wicket.request;
 +	requires transitive org.apache.wicket.websocket.core;
++	requires transitive org.apache.commons.text;
++
 +	requires transitive spring.beans;
 +	requires transitive spring.web;
 +	requires transitive spring.core;
++	requires transitive org.apache.openjpa;
 +
 +	requires spring.tx;
 +	requires javax.persistence;
- 	requires openjpa;
 +	requires java.xml.bind;
- 	requires org.apache.commons.text;
 +}
diff --cc openmeetings-db/src/main/java/org/apache/openmeetings/db/IApplication.java
index 45f9f91,45f9f91..5da9209
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/IApplication.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/IApplication.java
@@@ -16,7 -16,7 +16,7 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
--package org.apache.openmeetings;
++package org.apache.openmeetings.db;
  
  import java.util.Locale;
  import java.util.Set;
diff --cc openmeetings-db/src/main/java/org/apache/openmeetings/db/IWebSession.java
index 6f20e00,6f20e00..eccfb7f
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/IWebSession.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/IWebSession.java
@@@ -16,7 -16,7 +16,7 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
--package org.apache.openmeetings;
++package org.apache.openmeetings.db;
  
  import java.util.Locale;
  
diff --cc openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
index 71b8a8d,71b8a8d..be53b79
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
@@@ -41,7 -41,7 +41,7 @@@ import org.apache.openjpa.event.RemoteC
  import org.apache.openjpa.event.TCPRemoteCommitProvider;
  import org.apache.openjpa.persistence.OpenJPAEntityManagerSPI;
  import org.apache.openjpa.persistence.OpenJPAPersistence;
--import org.apache.openmeetings.IApplication;
++import org.apache.openmeetings.db.IApplication;
  import org.apache.openmeetings.db.dao.IDataProviderDao;
  import org.apache.openmeetings.db.dao.server.OAuth2Dao;
  import org.apache.openmeetings.db.dao.user.UserDao;
diff --cc openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ApplicationHelper.java
index 06d68b4,06d68b4..22f3510
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ApplicationHelper.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ApplicationHelper.java
@@@ -34,8 -34,8 +34,8 @@@ import javax.servlet.FilterConfig
  import javax.servlet.ServletContext;
  import javax.servlet.ServletContextEvent;
  
--import org.apache.openmeetings.IApplication;
--import org.apache.openmeetings.IWebSession;
++import org.apache.openmeetings.db.IApplication;
++import org.apache.openmeetings.db.IWebSession;
  import org.apache.openmeetings.db.dao.label.LabelDao;
  import org.apache.openmeetings.util.OMContextListener;
  import org.apache.wicket.Application;
diff --cc openmeetings-install/src/main/java/module-info.java
index 5987c83,b3174f1..85b0322
--- a/openmeetings-install/src/main/java/module-info.java
+++ b/openmeetings-install/src/main/java/module-info.java
@@@ -16,10 -16,14 +16,16 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
- module org.apache.openmeetings.util.test {
- 	requires transitive org.apache.openmeetings.util;
 -package org.apache.openmeetings;
++module org.apache.openmeetings.install {
++	exports org.apache.openmeetings.cli;
++	exports org.apache.openmeetings.backup;
++	exports org.apache.openmeetings.installation;
  
- 	//tests
- 	requires org.junit.jupiter.engine;
- 	requires org.junit.jupiter.api;
 -import org.junit.jupiter.api.Test;
 -
 -class TestConnection {
 -
 -	@Test
 -	void testNoop() {
 -		//no-op
 -	}
++	requires transitive org.apache.openmeetings.core;
++	requires java.xml.bind;
++	requires org.apache.commons.io;
++	requires java.desktop;
++	requires spring.context.support;
++	requires commons.cli;
++	requires quartz;
  }
diff --cc openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java
index 6990b12,33942d8..57a5d0b
--- a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java
+++ b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java
@@@ -381,10 -382,10 +382,7 @@@ public class BackupExport 
  		writeList(zos, "extraMenus.xml", EXTRA_MENU_LIST_NODE, list);
  	}
  
--	/*
--	 * Package private for tests
--	 */
--	static <T> ByteArrayOutputStream stream(String listElement, List<T> list) throws Exception {
++	public static <T> ByteArrayOutputStream stream(String listElement, List<T> list) throws Exception {
  		ByteArrayOutputStream baos = new ByteArrayOutputStream(10 * 1024); //10K
  		writeList(baos, listElement, list);
  		return baos;
diff --cc openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
index 8a66ea9,ec17fa0..58e2609f
--- a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
+++ b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
@@@ -480,15 -483,23 +483,23 @@@ public class BackupImport 
  					}
  				}
  			}
+ 			log.info("File explorer item import complete");
+ 			success = true;
+ 		} catch (Exception e) {
+ 			throw e;
+ 		} finally {
+ 			if (f != null) {
+ 				log.info("Clearing temp files ...");
+ 				FileUtils.deleteDirectory(f);
+ 			}
+ 			cleanup();
+ 			if (success) {
+ 				progress.set(100);
+ 			}
  		}
- 		log.info("File explorer item import complete, clearing temp files");
- 
- 		FileUtils.deleteDirectory(f);
- 		cleanup();
- 		progressHolder.setProgress(100);
  	}
  
--	void cleanup() {
++	public void cleanup() {
  		ldapMap.clear();
  		oauthMap.clear();
  		userMap.clear();
@@@ -505,7 -516,7 +516,7 @@@
  		messageFolderMap.put(TRASH_FOLDER_ID, TRASH_FOLDER_ID);
  	}
  
--	static BackupVersion getVersion(File base) {
++	public static BackupVersion getVersion(File base) {
  		List<BackupVersion> list = new ArrayList<>(1);
  		readList(base, "version.xml", VERSION_LIST_NODE, VERSION_NODE, BackupVersion.class, list::add, true);
  		return list.isEmpty() ? new BackupVersion() : list.get(0);
@@@ -514,7 -525,7 +525,7 @@@
  	/*
  	 * ##################### Import Configs
  	 */
--	void importConfigs(File base) throws Exception {
++	public void importConfigs(File base) throws Exception {
  		final Map<Integer, String> keyMap = new HashMap<>();
  		Arrays.stream(KeyEvent.class.getDeclaredFields())
  				.filter(fld -> fld.getName().startsWith("VK_"))
@@@ -577,7 -588,7 +588,7 @@@
  	/*
  	 * ##################### Import Groups
  	 */
--	void importGroups(File base) throws Exception {
++	public void importGroups(File base) throws Exception {
  		log.info("Configs import complete, starting group import");
  		readList(base, "organizations.xml", GROUP_LIST_NODE, GROUP_NODE, Group.class, g -> {
  			Long oldId = g.getId();
@@@ -590,7 -601,7 +601,7 @@@
  	/*
  	 * ##################### Import LDAP Configs
  	 */
--	Long importLdap(File base) {
++	public Long importLdap(File base) {
  		log.info("Groups import complete, starting LDAP config import");
  		Long[] defaultLdapId = {cfgDao.getLong(CONFIG_DEFAULT_LDAP_ID, null)};
  		readList(base, "ldapconfigs.xml", "ldapconfigs", "ldapconfig", LdapConfig.class, c -> {
@@@ -613,7 -624,7 +624,7 @@@
  	/*
  	 * ##################### OAuth2 servers
  	 */
--	void importOauth(File base) {
++	public void importOauth(File base) {
  		log.info("Ldap config import complete, starting OAuth2 server import");
  		readList(base, "oauth2servers.xml", OAUTH_LIST_NODE, OAUTH_NODE, OAuthServer.class
  				, s -> {
@@@ -629,7 -640,7 +640,7 @@@
  	/*
  	 * ##################### Import Users
  	 */
--	void importUsers(File base) throws Exception {
++	public void importUsers(File base) throws Exception {
  		log.info("OAuth2 servers import complete, starting user import");
  		String jNameTimeZone = getDefaultTimezone();
  		//add existent emails from database
@@@ -755,7 -766,7 +766,7 @@@
  	/*
  	 * ##################### Import Room Groups
  	 */
--	void importRoomGroups(File base) throws Exception {
++	public void importRoomGroups(File base) throws Exception {
  		log.info("Room import complete, starting room groups import");
  		Class<RoomGroup> eClazz = RoomGroup.class;
  		JAXBContext jc = JAXBContext.newInstance(eClazz);
@@@ -784,7 -795,7 +795,7 @@@
  	/*
  	 * ##################### Import Chat messages
  	 */
--	void importChat(File base) throws Exception {
++	public void importChat(File base) throws Exception {
  		log.info("Room groups import complete, starting chat messages import");
  		Class<ChatMessage> eClazz = ChatMessage.class;
  		JAXBContext jc = JAXBContext.newInstance(eClazz);
@@@ -807,7 -818,7 +818,7 @@@
  	/*
  	 * ##################### Import Calendars
  	 */
--	void importCalendars(File base) throws Exception {
++	public void importCalendars(File base) throws Exception {
  		log.info("Chat messages import complete, starting calendar import");
  		Class<OmCalendar> eClazz = OmCalendar.class;
  		JAXBContext jc = JAXBContext.newInstance(eClazz);
@@@ -825,7 -836,7 +836,7 @@@
  	/*
  	 * ##################### Import Appointments
  	 */
--	void importAppointments(File base) throws Exception {
++	public void importAppointments(File base) throws Exception {
  		log.info("Calendar import complete, starting appointement import");
  		Class<Appointment> eClazz = Appointment.class;
  		JAXBContext jc = JAXBContext.newInstance(eClazz);
@@@ -860,7 -871,7 +871,7 @@@
  	 *
  	 * Reminder Invitations will be NOT send!
  	 */
--	void importMeetingMembers(File base) throws Exception {
++	public void importMeetingMembers(File base) throws Exception {
  		log.info("Appointement import complete, starting meeting members import");
  		Class<MeetingMember> eClazz = MeetingMember.class;
  		JAXBContext jc = JAXBContext.newInstance(eClazz);
@@@ -953,7 -964,7 +964,7 @@@
  	/*
  	 * ##################### Import Recordings
  	 */
--	void importRecordings(File base) throws Exception {
++	public void importRecordings(File base) throws Exception {
  		log.info("Meeting members import complete, starting recordings server import");
  		final Map<Long, Long> folders = new HashMap<>();
  		saveTree(base, "flvRecordings.xml", RECORDING_LIST_NODE, RECORDING_NODE, Recording.class, folders, r -> {
@@@ -996,7 -1007,7 +1007,7 @@@
  	/*
  	 * ##################### Import Private Message Folders
  	 */
--	void importPrivateMsgFolders(File base) {
++	public void importPrivateMsgFolders(File base) {
  		log.info("Recording import complete, starting private message folder import");
  		readList(base, "privateMessageFolder.xml", MSG_FOLDER_LIST_NODE, MSG_FOLDER_NODE, PrivateMessageFolder.class, p -> {
  			Long folderId = p.getId();
@@@ -1141,7 -1152,7 +1152,7 @@@
  		}, true);
  	}
  
--	void importExtraMenus(File base) throws Exception {
++	public void importExtraMenus(File base) throws Exception {
  		log.info("Room files complete, starting extra menus import");
  		Class<ExtraMenu> eClazz = ExtraMenu.class;
  		JAXBContext jc = JAXBContext.newInstance(eClazz);
diff --cc openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java
index e653c2a,8a36fb8..297784b
--- a/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java
+++ b/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java
@@@ -105,7 -105,7 +105,7 @@@ public class Admin 
  	private File home;
  	private String step;
  
--	Admin() {
++	public Admin() {
  		cfg = new InstallationConfig();
  		opts = buildOptions();
  		step = "Initialization";
@@@ -227,8 -227,8 +227,7 @@@
  		return context;
  	}
  
--	//package private wrapper for testing
--	void process(String... args) throws Exception {
++	public void process(String... args) throws Exception {
  		CommandLineParser parser = new DefaultParser();
  		try {
  			cmdl = parser.parse(opts, args);
diff --cc openmeetings-service/src/main/java/module-info.java
index 696b002,68a8763..d39d422
--- a/openmeetings-service/src/main/java/module-info.java
+++ b/openmeetings-service/src/main/java/module-info.java
@@@ -16,29 -16,33 +16,22 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
- module apache.openmeetings.core {
- 	requires transitive apache.openmeetings.db;
 -package org.apache.openmeetings.rdc;
 -
 -import java.awt.event.KeyEvent;
 -
 -import org.junit.jupiter.api.Test;
 -import org.slf4j.Logger;
 -import org.slf4j.LoggerFactory;
 -
 -class TestKeyCodesNumber {
 -	private static final Logger log = LoggerFactory.getLogger(TestKeyCodesNumber.class);
 -
 -	@Test
 -	void testKeyCodes() {
 -		try {
 -
 -			for (int i = 1; i < 600; i++) {
 -
 -				String charText = KeyEvent.getKeyText(i);
 -
 -				log.debug("ERROR " + i + " " + charText);
 -
 -			}
 -
 -		} catch (Exception err) {
 -			log.error("[testKeyCodes]", err);
 -		}
 -
 -	}
 -
++module org.apache.openmeetings.service {
++	exports org.apache.openmeetings.service.calendar;
++	exports org.apache.openmeetings.service.calendar.caldav;
++	exports org.apache.openmeetings.service.mail;
++	exports org.apache.openmeetings.service.mail.template;
++	exports org.apache.openmeetings.service.mail.template.subject;
++	exports org.apache.openmeetings.service.room;
++	exports org.apache.openmeetings.service.scheduler;
 +
- 	requires transitive org.apache.commons.io;
++	requires transitive org.apache.openmeetings.core;
 +
- 	requires kurento.client;
- 	requires kurento.commons;
- 	requires kurento.jsonrpc.client;
- 	requires java.activation;
- 	requires com.google.gson;
- 	requires java.mail;
- 	requires java.xml;
- 	requires xstream;
++	requires transitive org.apache.wicket.spring;
 +
- 	requires jodconverter.core;
- 	requires jodconverter.local;
- 	requires org.apache.directory.ldap.api.all;
- 	requires tika.parsers;
- 	requires javax.inject;
- 	requires wicket.ioc;
++	requires org.apache.httpcomponents.httpcore;
++	requires org.apache.httpcomponents.httpclient;
++	requires caldav4j;
++	requires jackrabbit.webdav;
 +	requires java.annotation;
- 	requires apache.openmeetings.util;
- 	requires asterisk.java;
- 	requires jain.sip.ri;
  }
- 
diff --cc openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/IcalUtils.java
index 57a3ce2,57a3ce2..8250564
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/IcalUtils.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/IcalUtils.java
@@@ -20,20 -20,20 +20,26 @@@ package org.apache.openmeetings.service
  
  import static java.util.UUID.randomUUID;
  import static org.apache.openmeetings.db.util.TimezoneUtil.getTimeZone;
++import static org.apache.openmeetings.util.CalendarHelper.getZoneDateTime;
  import static org.apache.openmeetings.util.mail.MailUtil.MAILTO;
  import static org.apache.openmeetings.util.mail.MailUtil.SCHEME_MAILTO;
  
  import java.net.URI;
  import java.text.ParsePosition;
++import java.time.Instant;
++import java.time.ZonedDateTime;
++import java.time.temporal.Temporal;
  import java.util.ArrayList;
  import java.util.Date;
  import java.util.HashSet;
  import java.util.List;
  import java.util.Locale;
  import java.util.NoSuchElementException;
++import java.util.Optional;
  import java.util.Set;
  import java.util.TimeZone;
  import java.util.UUID;
++import java.util.concurrent.atomic.AtomicReference;
  
  import org.apache.commons.lang3.time.FastDateFormat;
  import org.apache.openmeetings.db.dao.user.UserDao;
@@@ -50,12 -50,12 +56,8 @@@ import org.springframework.beans.factor
  
  import net.fortuna.ical4j.model.Calendar;
  import net.fortuna.ical4j.model.Component;
--import net.fortuna.ical4j.model.ComponentList;
--import net.fortuna.ical4j.model.DateTime;
  import net.fortuna.ical4j.model.Parameter;
  import net.fortuna.ical4j.model.Property;
--import net.fortuna.ical4j.model.PropertyList;
--import net.fortuna.ical4j.model.Recur.Frequency;
  import net.fortuna.ical4j.model.TimeZoneRegistry;
  import net.fortuna.ical4j.model.TimeZoneRegistryFactory;
  import net.fortuna.ical4j.model.component.CalendarComponent;
@@@ -73,6 -73,6 +75,7 @@@ import net.fortuna.ical4j.model.propert
  import net.fortuna.ical4j.model.property.Transp;
  import net.fortuna.ical4j.model.property.Uid;
  import net.fortuna.ical4j.model.property.Version;
++import net.fortuna.ical4j.transform.recurrence.Frequency;
  
  /**
   * Class which provides iCalendar Utilities.
@@@ -81,6 -81,6 +84,8 @@@
  @org.springframework.stereotype.Component
  public class IcalUtils {
  	private static final Logger log = LoggerFactory.getLogger(IcalUtils.class);
++	private static final TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
++	private static final List<String> acceptedFormats = List.of("yyyyMMdd'T'HHmmss", "yyyyMMdd'T'HHmmss'Z'", "yyyyMMdd");
  	public static final String PROD_ID = "-//Events Calendar//Apache Openmeetings//EN";
  
  	@Autowired
@@@ -119,7 -119,7 +124,7 @@@
  	 */
  	public List<Appointment> parseCalendartoAppointments(Calendar calendar, Long ownerId) {
  		List<Appointment> appointments = new ArrayList<>();
--		ComponentList<CalendarComponent> events = calendar.getComponents(Component.VEVENT);
++		List<CalendarComponent> events = calendar.getComponents(Component.VEVENT);
  		User owner = userDao.get(ownerId);
  
  		for (CalendarComponent event : events) {
@@@ -148,14 -148,14 +153,22 @@@
  		if (calendar == null) {
  			return a;
  		}
--		CalendarComponent event = calendar.getComponent(Component.VEVENT);
--		if (event != null) {
++		calendar.getComponent(Component.VEVENT).ifPresent(event -> {
  			a.setEtag(etag);
--			a = addVEventPropertiestoAppointment(a, event);
--		}
++			addVEventPropertiestoAppointment(a, event);
++		});;
  		return a;
  	}
  
++	private Date getDate(CalendarComponent event, String prop) {
++		return getDate(event.getProperty(prop).get());
++	}
++
++	@SuppressWarnings("unchecked")
++	private Date getDate(Property prop) {
++		return Date.from(Instant.from(((DateProperty<? extends Temporal>)prop).getDate()));
++	}
++
  	/**
  	 * Add properties from the Given VEvent Component to the Appointment
  	 *
@@@ -164,51 -164,51 +177,21 @@@
  	 * @return Updated Appointment
  	 */
  	private Appointment addVEventPropertiestoAppointment(Appointment a, CalendarComponent event) {
--		DateProperty dtstart = (DateProperty)event.getProperty(Property.DTSTART)
--				, dtend = (DateProperty)event.getProperty(Property.DTEND)
--				, dtstamp = (DateProperty)event.getProperty(Property.DTSTAMP)
--				, lastmod = (DateProperty)event.getProperty(Property.LAST_MODIFIED);
--		Property uid = event.getProperty(Property.UID),
--				description = event.getProperty(Property.DESCRIPTION),
--				summary = event.getProperty(Property.SUMMARY),
--				location = event.getProperty(Property.LOCATION),
--				organizer = event.getProperty(Property.ORGANIZER),
--				recur = event.getProperty(Property.RRULE);
--		PropertyList<Attendee> attendees = event.getProperties(Property.ATTENDEE);
--
--		if (uid != null) {
--			a.setIcalId(uid.getValue());
--		}
--
--		Date d = dtstart.getDate();
--		a.setStart(d);
--		if (dtend == null) {
--			a.setEnd(addTimetoDate(d, java.util.Calendar.HOUR_OF_DAY, 1));
--		} else {
--			a.setEnd(dtend.getDate());
--		}
--
--		a.setInserted(dtstamp.getDate());
--
--		if (lastmod != null) {
--			a.setUpdated(lastmod.getDate());
--		}
++		event.getProperty(Property.UID).ifPresent(uid -> a.setIcalId(uid.getValue()));
  
--		if (description != null) {
--			a.setDescription(description.getValue());
--		}
--
--		if (summary != null) {
--			a.setTitle(summary.getValue());
--		}
++		Date d = getDate(event, Property.DTSTART);
++		a.setStart(getDate(event, Property.DTSTART));
++		event.getProperty(Property.DTEND).ifPresentOrElse(dtend -> a.setEnd(getDate(dtend))
++				, () -> a.setEnd(addTimetoDate(d, java.util.Calendar.HOUR_OF_DAY, 1)));
  
--		if (location != null) {
--			a.setLocation(location.getValue());
--		}
++		event.getProperty(Property.DTSTAMP).ifPresent(dtstamp -> a.setInserted(getDate(dtstamp)));
++		event.getProperty(Property.LAST_MODIFIED).ifPresent(lastmod -> a.setUpdated(getDate(lastmod)));
++		event.getProperty(Property.DESCRIPTION).ifPresent(description -> a.setDescription(description.getValue()));
++		event.getProperty(Property.SUMMARY).ifPresent(summary -> a.setTitle(summary.getValue()));
++		event.getProperty(Property.LOCATION).ifPresent(location -> a.setLocation(location.getValue()));
  
--		if (recur != null) {
--			Parameter freq = recur.getParameter("FREQ");
--			if (freq != null) {
++		event.getProperty(Property.RRULE).ifPresent(recur -> {
++			recur.getParameters().getFirst("FREQ").ifPresent(freq -> {
  				if (freq.getValue().equals(Frequency.DAILY.name())) {
  					a.setIsDaily(true);
  				} else if (freq.getValue().equals(Frequency.WEEKLY.name())) {
@@@ -218,22 -218,22 +201,22 @@@
  				} else if (freq.getValue().equals(Frequency.YEARLY.name())) {
  					a.setIsYearly(true);
  				}
--			}
--		}
++			});
++		});
  
  		Set<MeetingMember> attList = a.getMeetingMembers() == null ? new HashSet<>()
  				: new HashSet<>(a.getMeetingMembers());
--		String organizerEmail = null;
++		AtomicReference<String> organizerEmail = new AtomicReference<>();
  
  		//Note this value can be repeated in attendees as well.
--		if (organizer != null) {
++		event.getProperty(Property.ORGANIZER).ifPresent(organizer -> {
  			URI uri = URI.create(organizer.getValue());
  
  			//If the value of the organizer is an email
  			if (SCHEME_MAILTO.equals(uri.getScheme())) {
  				String email = uri.getSchemeSpecificPart();
  
--				organizerEmail = email;
++				organizerEmail.set(email);
  				if (!email.equals(a.getOwner().getAddress().getEmail())) {
  					//Contact or exist and owner
  					User org = userDao.getByEmail(email);
@@@ -245,29 -245,29 +228,26 @@@
  					}
  				}
  			}
--		}
++		});
  
--		if (attendees != null && !attendees.isEmpty()) {
--			for (Property attendee : attendees) {
--				URI uri = URI.create(attendee.getValue());
--				if (SCHEME_MAILTO.equals(uri.getScheme())) {
--					String email = uri.getSchemeSpecificPart();
--
--					Role role = attendee.getParameter(Role.CHAIR.getName());
--					if (role != null && role.getValue().equals(Role.CHAIR.getValue())
--							&& email.equals(organizerEmail)) {
--						continue;
--					}
++		event.getProperties(Property.ATTENDEE).forEach(attendee -> {
++			URI uri = URI.create(attendee.getValue());
++			if (SCHEME_MAILTO.equals(uri.getScheme())) {
++				String email = uri.getSchemeSpecificPart();
  
--					User u = userDao.getByEmail(email);
--					if (u == null) {
--						u = userDao.getContact(email, a.getOwner());
--					}
--					attList.add(createMeetingMember(a, u));
++				Optional<Role> role = attendee.getParameters().getFirst(Role.CHAIR.getName());
++				if (role.isPresent() && role.get().getValue().equals(Role.CHAIR.getValue()) && email.equals(organizerEmail.get())) {
++					return;
++				}
  
++				User u = userDao.getByEmail(email);
++				if (u == null) {
++					u = userDao.getContact(email, a.getOwner());
  				}
++				attList.add(createMeetingMember(a, u));
++
  			}
--		}
++		});
  
  		a.setMeetingMembers(attList.isEmpty() ? null : new ArrayList<>(attList));
  
@@@ -302,16 -302,16 +282,15 @@@
  	 * @return Parsed TimeZone
  	 */
  	public TimeZone parseTimeZone(Calendar calendar, User owner) {
--		if (calendar != null) {
--			Component timezone = calendar.getComponent(Component.VTIMEZONE);
--			if (timezone != null) {
--				Property tzid = timezone.getProperty(Property.TZID);
--				if (tzid != null) {
--					return getTimeZone(tzid.getValue());
--				}
--			}
--		}
--		return getTimeZone(owner);
++		return Optional.ofNullable(calendar)
++				.map(cal -> cal.getComponent(Component.VTIMEZONE))
++				.filter(Optional::isPresent)
++				.map(Optional::get)
++				.map(timezone -> timezone.getProperty(Property.TZID))
++				.filter(Optional::isPresent)
++				.map(Optional::get)
++				.map(tzid -> getTimeZone(tzid.getValue()))
++				.orElse(getTimeZone(owner));
  	}
  
  	/**
@@@ -327,13 -327,13 +306,9 @@@
  			return null;
  		}
  
--		String[] acceptedFormats = {"yyyyMMdd'T'HHmmss", "yyyyMMdd'T'HHmmss'Z'", "yyyyMMdd"};
--		Parameter tzid = dt.getParameter(Parameter.TZID);
--		if (tzid == null) {
--			return parseDate(dt.getValue(), acceptedFormats, timeZone);
--		} else {
--			return parseDate(dt.getValue(), acceptedFormats, getTimeZone(tzid.getValue()));
--		}
++		return dt.getParameters().getFirst(Parameter.TZID)
++				.map(tzid -> parseDate(dt.getValue(), getTimeZone(tzid.getValue())))
++				.orElse(parseDate(dt.getValue(), timeZone));
  	}
  
  	/**
@@@ -346,14 -346,14 +321,14 @@@
  	 * @return <code>java.util.Date</code> representation of string or
  	 * <code>null</code> if the Date could not be parsed.
  	 */
--	public Date parseDate(String str, String[] patterns, TimeZone inTimeZone) {
++	public Date parseDate(String str, TimeZone inTimeZone) {
  		FastDateFormat parser;
  		Locale locale = WebSession.get().getLocale();
  
  		TimeZone timeZone = str.endsWith("Z") ? TimeZone.getTimeZone("UTC") : inTimeZone;
  
  		ParsePosition pos = new ParsePosition(0);
--		for (String pattern : patterns) {
++		for (String pattern : acceptedFormats) {
  			parser = FastDateFormat.getInstance(pattern, timeZone, locale);
  			pos.setIndex(0);
  			Date date = parser.parse(str, pos);
@@@ -373,7 -373,7 +348,7 @@@
  	 * @param amount Amount to be Added
  	 * @return New Date
  	 */
--	public Date addTimetoDate(Date date, int field, int amount) {
++	public Date addTimetoDate(Date date, int field, int amount) { //FIXME TODO
  		java.util.Calendar c = java.util.Calendar.getInstance();
  		c.setTime(date);
  		c.add(field, amount);
@@@ -381,37 -381,37 +356,6 @@@
  	}
  
  	/**
--	 * Methods to parse Appointment to iCalendar according RFC 2445
--	 *
--	 * @param appointment to be converted to iCalendar
--	 * @return iCalendar representation of the Appointment
--	 */
--	public Calendar parseAppointmenttoCalendar(Appointment appointment) {
--		String tzid = parseTimeZone(null, appointment.getOwner()).getID();
--
--		TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
--
--		net.fortuna.ical4j.model.TimeZone timeZone = registry.getTimeZone(tzid);
--		if (timeZone == null) {
--			throw new NoSuchElementException("Unable to get time zone by id provided: " + tzid);
--		}
--
--		Calendar icsCalendar = new Calendar();
--		icsCalendar.getProperties().add(new ProdId(PROD_ID));
--		icsCalendar.getProperties().add(Version.VERSION_2_0);
--		icsCalendar.getProperties().add(CalScale.GREGORIAN);
--		icsCalendar.getComponents().add(timeZone.getVTimeZone());
--
--		DateTime start = new DateTime(appointment.getStart()), end = new DateTime(appointment.getEnd());
--
--		VEvent meeting = new VEvent(start, end, appointment.getTitle());
--		addVEventpropsfromAppointment(appointment, meeting);
--		icsCalendar.getComponents().add(meeting);
--
--		return icsCalendar;
--	}
--
--	/**
  	 * Adds the Appointment Properties to the given VEvent
  	 *
  	 * @param appointment Appointment whose properties are taken
@@@ -460,35 -460,35 +404,61 @@@
  		meeting.getProperties().add(organizer);
  	}
  
--	/**
--	 * Parses a List of Appointments into a VCALENDAR component.
--	 *
--	 * @param appointments List of Appointments for the Calendar
--	 * @param ownerId      Owner of the Appointments
--	 * @return VCALENDAR representation of the Appointments
--	 */
--	public Calendar parseAppointmentstoCalendar(List<Appointment> appointments, Long ownerId) {
--		String tzid = parseTimeZone(null, userDao.get(ownerId)).getID();
--
--		TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
--
++	private net.fortuna.ical4j.model.TimeZone getTimazone(String tzid) {
  		net.fortuna.ical4j.model.TimeZone timeZone = registry.getTimeZone(tzid);
  		if (timeZone == null) {
  			throw new NoSuchElementException("Unable to get time zone by id provided: " + tzid);
  		}
++		return timeZone;
++	}
  
++	private Calendar getCalendar(net.fortuna.ical4j.model.TimeZone timeZone) {
  		Calendar icsCalendar = new Calendar();
  		icsCalendar.getProperties().add(new ProdId(PROD_ID));
  		icsCalendar.getProperties().add(Version.VERSION_2_0);
  		icsCalendar.getProperties().add(CalScale.GREGORIAN);
  		icsCalendar.getComponents().add(timeZone.getVTimeZone());
++		return icsCalendar;
++	}
  
--		for (Appointment appointment : appointments) {
--			DateTime start = new DateTime(appointment.getStart()), end = new DateTime(appointment.getEnd());
++	private void parseAppointment(Appointment appointment, Calendar icsCalendar, net.fortuna.ical4j.model.TimeZone timeZone) {
++		ZonedDateTime start = getZoneDateTime(appointment.getStart(), timeZone.getID());
++		ZonedDateTime end = getZoneDateTime(appointment.getEnd(), timeZone.getID());
  
--			VEvent meeting = new VEvent(start, end, appointment.getTitle());
--			addVEventpropsfromAppointment(appointment, meeting);
--			icsCalendar.getComponents().add(meeting);
++		VEvent meeting = new VEvent(start, end, appointment.getTitle());
++		addVEventpropsfromAppointment(appointment, meeting);
++		icsCalendar.getComponents().add(meeting);
++	}
++
++	/**
++	 * Methods to parse Appointment to iCalendar according RFC 2445
++	 *
++	 * @param appointment to be converted to iCalendar
++	 * @return iCalendar representation of the Appointment
++	 */
++	public Calendar parseAppointmenttoCalendar(Appointment appointment) {
++		net.fortuna.ical4j.model.TimeZone timeZone = getTimazone(parseTimeZone(null, appointment.getOwner()).getID());
++
++		Calendar icsCalendar = getCalendar(timeZone);
++		parseAppointment(appointment, icsCalendar, timeZone);
++
++		return icsCalendar;
++	}
++
++	/**
++	 * Parses a List of Appointments into a VCALENDAR component.
++	 *
++	 * @param appointments List of Appointments for the Calendar
++	 * @param ownerId      Owner of the Appointments
++	 * @return VCALENDAR representation of the Appointments
++	 */
++	public Calendar parseAppointmentstoCalendar(List<Appointment> appointments, Long ownerId) {
++		net.fortuna.ical4j.model.TimeZone timeZone = getTimazone(parseTimeZone(null, userDao.get(ownerId)).getID());
++
++		Calendar icsCalendar = getCalendar(timeZone);
++
++		for (Appointment appointment : appointments) {
++			parseAppointment(appointment, icsCalendar, timeZone);
  		}
  		return icsCalendar;
  	}
diff --cc openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/EmailManager.java
index 593c7c7,593c7c7..ae91fa0
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/EmailManager.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/EmailManager.java
@@@ -23,8 -23,8 +23,8 @@@ import static org.apache.openmeetings.u
  import static org.apache.openmeetings.util.OpenmeetingsVariables.getWicketApplicationName;
  import static org.apache.openmeetings.util.OpenmeetingsVariables.isSendRegisterEmail;
  
--import org.apache.openmeetings.IApplication;
  import org.apache.openmeetings.core.mail.MailHandler;
++import org.apache.openmeetings.db.IApplication;
  import org.apache.openmeetings.service.mail.template.RegisterUserTemplate;
  import org.apache.wicket.Application;
  import org.apache.wicket.request.mapper.parameter.PageParameters;
diff --cc openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/AbstractTemplatePanel.java
index 39c0d5f,39c0d5f..ddd8113
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/AbstractTemplatePanel.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/AbstractTemplatePanel.java
@@@ -22,8 -22,8 +22,8 @@@ import static org.apache.openmeetings.d
  
  import java.util.Locale;
  
--import org.apache.openmeetings.IApplication;
--import org.apache.openmeetings.IWebSession;
++import org.apache.openmeetings.db.IApplication;
++import org.apache.openmeetings.db.IWebSession;
  import org.apache.wicket.AttributeModifier;
  import org.apache.wicket.markup.html.TransparentWebMarkupContainer;
  import org.apache.wicket.markup.html.panel.Panel;
diff --cc openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/AppointmentReminderTemplate.java
index 08149d8,08149d8..04dc2de
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/AppointmentReminderTemplate.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/AppointmentReminderTemplate.java
@@@ -47,7 -47,7 +47,7 @@@ public class AppointmentReminderTemplat
  	}
  
  	@Override
--	String getPrefix() {
++	public String getPrefix() {
  		return app.getOmString("1158", locale);
  	}
  }
diff --cc openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/AppointmentTemplate.java
index 8f40f5f,8f40f5f..d2ab5d8
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/AppointmentTemplate.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/AppointmentTemplate.java
@@@ -59,7 -59,7 +59,7 @@@ public abstract class AppointmentTempla
  		add(new Label("end", format(a.getEnd())));
  	}
  
--	abstract String getPrefix();
++	public abstract String getPrefix();
  
  	@Override
  	Fragment getSubjectFragment() {
diff --cc openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/CanceledAppointmentTemplate.java
index ebf807b,ebf807b..fd32229
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/CanceledAppointmentTemplate.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/CanceledAppointmentTemplate.java
@@@ -47,7 -47,7 +47,7 @@@ public class CanceledAppointmentTemplat
  	}
  
  	@Override
--	String getPrefix() {
++	public String getPrefix() {
  		return app.getOmString("1157", locale);
  	}
  }
diff --cc openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/CreatedAppointmentTemplate.java
index 161d10f,161d10f..627b34e
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/CreatedAppointmentTemplate.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/CreatedAppointmentTemplate.java
@@@ -47,7 -47,7 +47,7 @@@ public class CreatedAppointmentTemplat
  	}
  
  	@Override
--	String getPrefix() {
++	public String getPrefix() {
  		return app.getOmString("1151", locale);
  	}
  }
diff --cc openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/InvitedAppointmentTemplate.java
index 7f0b00d,7f0b00d..ac4823e
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/InvitedAppointmentTemplate.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/InvitedAppointmentTemplate.java
@@@ -28,7 -28,7 +28,7 @@@ public abstract class InvitedAppointmen
  	private static final long serialVersionUID = 1L;
  	protected final String invitorName;
  
--	InvitedAppointmentTemplate(Locale locale, Appointment a, TimeZone tz, String invitorName) {
++	public InvitedAppointmentTemplate(Locale locale, Appointment a, TimeZone tz, String invitorName) {
  		super(locale, a, tz);
  		this.invitorName = invitorName;
  	}
diff --cc openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/UpdatedAppointmentTemplate.java
index cb9b315,cb9b315..f6231d0
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/UpdatedAppointmentTemplate.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/UpdatedAppointmentTemplate.java
@@@ -47,7 -47,7 +47,7 @@@ public class UpdatedAppointmentTemplat
  	}
  
  	@Override
--	String getPrefix() {
++	public String getPrefix() {
  		return app.getOmString("1155", locale);
  	}
  }
diff --cc openmeetings-service/src/main/java/org/apache/openmeetings/service/room/InvitationManager.java
index 32822a2,32822a2..9397ce7
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/room/InvitationManager.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/room/InvitationManager.java
@@@ -22,12 -22,12 +22,13 @@@ import static java.util.UUID.randomUUID
  import static org.apache.openmeetings.db.entity.calendar.Appointment.allowedStart;
  import static org.apache.openmeetings.db.util.ApplicationHelper.ensureApplication;
  import static org.apache.openmeetings.db.util.TimezoneUtil.getTimeZone;
++import static org.apache.openmeetings.util.CalendarHelper.getZoneDateTime;
  
  import java.util.Date;
  import java.util.TimeZone;
  
--import org.apache.openmeetings.IApplication;
  import org.apache.openmeetings.core.mail.MailHandler;
++import org.apache.openmeetings.db.IApplication;
  import org.apache.openmeetings.db.dao.room.InvitationDao;
  import org.apache.openmeetings.db.entity.basic.MailMessage;
  import org.apache.openmeetings.db.entity.calendar.Appointment;
@@@ -117,14 -117,14 +118,15 @@@ public class InvitationManager implemen
  			if (invitationLink != null) {
  				desc += (desc.isEmpty() ? "" : "\n\n\n") + invitationLink;
  			}
++			String tzid = getTimeZone(owner).getID();
  			IcalHandler handler = new IcalHandler(MessageType.CANCEL == type ? IcalHandler.ICAL_METHOD_CANCEL : IcalHandler.ICAL_METHOD_REQUEST)
--					.createVEvent(getTimeZone(owner).getID(), a.getStart(), a.getEnd(), a.getTitle())
++					.createVEvent(getZoneDateTime(a.getStart(), tzid), getZoneDateTime(a.getEnd(), tzid), a.getTitle())
  					.addOrganizer(replyToEmail, owner.getDisplayName())
  					.setUid(a.getIcalId())
  					.addAttendee(email, i.getInvitee().getDisplayName(), isOwner)
--					.setCreated(a.getInserted())
++					.setCreated(getZoneDateTime(a.getInserted(), tzid))
  					.setDescription(desc)
--					.setModified(a.getUpdated())
++					.setModified(getZoneDateTime(a.getUpdated(), tzid))
  					.setLocation(a.getLocation())
  					.setSequence(0)
  					.build();
diff --cc openmeetings-util/pom.xml
index 5ac31ed,f066117..0dade93
--- a/openmeetings-util/pom.xml
+++ b/openmeetings-util/pom.xml
@@@ -146,8 -128,8 +128,18 @@@
  			<artifactId>aspectjtools</artifactId>
  		</dependency>
  		<dependency>
++			<groupId>com.sun.mail</groupId>
++			<artifactId>jakarta.mail</artifactId>
++		</dependency>
++		<dependency>
  			<groupId>io.prometheus</groupId>
--			<artifactId>simpleclient</artifactId>
++			<artifactId>simpleclient_servlet</artifactId>
++		</dependency>
++		<dependency>
++			<groupId>org.junit.jupiter</groupId>
++			<artifactId>junit-jupiter-engine</artifactId>
++			<scope>compile</scope>
++			<optional>true</optional>
  		</dependency>
  	</dependencies>
  </project>
diff --cc openmeetings-util/src/main/java/module-info.java
index ecd5250,0000000..2a5c013
mode 100644,000000..100644
--- a/openmeetings-util/src/main/java/module-info.java
+++ b/openmeetings-util/src/main/java/module-info.java
@@@ -1,48 -1,0 +1,48 @@@
 +/*
 + * 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.
 + */
 +module org.apache.openmeetings.util {
++	exports org.apache.openmeetings.util;
++	exports org.apache.openmeetings.util.crypt;
++	exports org.apache.openmeetings.util.mail;
++	exports org.apache.openmeetings.util.process;
++	exports org.apache.openmeetings.util.ws;
++	exports org.apache.openmeetings.util.logging;
++
 +	requires transitive org.apache.wicket.util;
 +	requires transitive org.apache.wicket.core;
 +	requires transitive org.apache.wicket.extensions;
 +
 +	requires transitive org.apache.commons.codec;
 +	requires transitive org.apache.commons.lang3;
++	requires transitive org.apache.tika.core;
++
++	requires transitive jakarta.activation;
 +
 +	requires transitive com.github.openjson;
 +	requires transitive org.slf4j;
 +	requires transitive org.bouncycastle.provider;
- 	requires transitive jakarta.activation;
 +	requires transitive org.mnode.ical4j.core;
- 	requires org.aspectj.tools;
- 	requires transitive javax.servlet.api;
- 	requires transitive tika.core;
 +	requires transitive spring.context;
- 	requires transitive logback.classic;
- 	requires transitive logback.core;
++	requires transitive ch.qos.logback.classic;
++	requires transitive ch.qos.logback.core;
 +	requires transitive dom4j;
- 	requires transitive jcip.annotations;
- 	requires simpleclient;
- 
- 	exports org.apache.openmeetings.util;
- 	exports org.apache.openmeetings.util.crypt;
- 	exports org.apache.openmeetings.util.mail;
- 	exports org.apache.openmeetings.util.process;
- 	exports org.apache.openmeetings.util.ws;
- 	exports org.apache.openmeetings.util.logging;
++	requires javax.servlet.api;
++	requires simpleclient.servlet;
++	requires org.aspectj.tools;
 +}
diff --cc openmeetings-util/src/main/java/org/apache/openmeetings/util/mail/ByteArrayDataSource.java
index 8910122,8910122..7ad0ff6
--- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/mail/ByteArrayDataSource.java
+++ b/openmeetings-util/src/main/java/org/apache/openmeetings/util/mail/ByteArrayDataSource.java
@@@ -26,7 -26,7 +26,7 @@@ import java.io.IOException
  import java.io.InputStream;
  import java.io.OutputStream;
  
--import javax.activation.DataSource;
++import jakarta.activation.DataSource;
  
  public class ByteArrayDataSource implements DataSource {
  	private byte[] data; // data
diff --cc openmeetings-util/src/main/java/org/apache/openmeetings/util/mail/IcalHandler.java
index 8314358,8314358..e4a498f
--- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/mail/IcalHandler.java
+++ b/openmeetings-util/src/main/java/org/apache/openmeetings/util/mail/IcalHandler.java
@@@ -24,7 -24,7 +24,7 @@@ import java.io.ByteArrayOutputStream
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.net.URI;
--import java.util.Date;
++import java.time.ZonedDateTime;
  import java.util.NoSuchElementException;
  
  import org.slf4j.Logger;
@@@ -32,7 -32,7 +32,6 @@@ import org.slf4j.LoggerFactory
  
  import net.fortuna.ical4j.data.CalendarOutputter;
  import net.fortuna.ical4j.model.Calendar;
--import net.fortuna.ical4j.model.DateTime;
  import net.fortuna.ical4j.model.TimeZone;
  import net.fortuna.ical4j.model.TimeZoneRegistry;
  import net.fortuna.ical4j.model.TimeZoneRegistryFactory;
@@@ -66,6 -66,6 +65,7 @@@ import net.fortuna.ical4j.validate.Vali
   */
  public class IcalHandler {
  	private static final Logger log = LoggerFactory.getLogger(IcalHandler.class);
++	private static final TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
  	static {
  		System.setProperty("net.fortuna.ical4j.timezone.update.enabled", "false");
  		System.setProperty("net.fortuna.ical4j.timezone.cache.impl", "net.fortuna.ical4j.util.MapTimeZoneCache");
@@@ -99,32 -99,32 +99,25 @@@
  		icsCalendar.getProperties().add(method);
  	}
  
--	public IcalHandler createVEvent(String tz, Date startDate, Date endDate, String name) {
--		TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
--
--		timeZone = registry.getTimeZone(tz);
++	public IcalHandler createVEvent(ZonedDateTime start, ZonedDateTime end, String name) {
++		timeZone = registry.getTimeZone(start.getZone().getId());
  		if (timeZone == null) {
--			throw new NoSuchElementException("Unable to get time zone by id provided: " + tz);
++			throw new NoSuchElementException("Unable to get time zone by id provided: " + start.getZone());
  		}
  
--		DateTime start = new DateTime(startDate);
--		start.setTimeZone(timeZone);
--		DateTime end = new DateTime(endDate);
--		end.setTimeZone(timeZone);
--
  		meeting = new VEvent(start, end, name);
  		meeting.getProperties().add(Transp.OPAQUE);
  		meeting.getProperties().add(Status.VEVENT_CONFIRMED);
  		return this;
  	}
  
--	public IcalHandler setCreated(Date date) {
--		meeting.getProperties().add(new Created(new DateTime(date)));
++	public IcalHandler setCreated(ZonedDateTime date) {
++		meeting.getProperties().add(new Created(date.toInstant()));
  		return this;
  	}
  
--	public IcalHandler setModified(Date date) {
--		meeting.getProperties().add(new LastModified(new DateTime(date == null ? new Date() : date)));
++	public IcalHandler setModified(ZonedDateTime date) {
++		meeting.getProperties().add(new LastModified((date == null ? ZonedDateTime.now() : date).toInstant()));
  		return this;
  	}
  
diff --cc openmeetings-web/pom.xml
index 1255216,02fe510..49fe8eb
--- a/openmeetings-web/pom.xml
+++ b/openmeetings-web/pom.xml
@@@ -622,17 -579,16 +579,8 @@@
  			<artifactId>commons-lang3</artifactId>
  		</dependency>
  		<dependency>
--			<groupId>io.prometheus</groupId>
--			<artifactId>simpleclient_servlet</artifactId>
--		</dependency>
--		<dependency>
--			<groupId>org.apache.tomcat</groupId>
--			<artifactId>tomcat-catalina</artifactId>
--		</dependency>
--		<dependency>
  			<groupId>org.webjars</groupId>
  			<artifactId>jquery-ui-touch-punch</artifactId>
- 			<version>0.2.3-2</version>
  		</dependency>
  		<!-- Test dependencies -->
  		<dependency>
diff --cc openmeetings-web/src/main/java/module-info.java
index 0000000,0000000..ad9ddf2
new file mode 100644
--- /dev/null
+++ b/openmeetings-web/src/main/java/module-info.java
@@@ -1,0 -1,0 +1,50 @@@
++/*
++ * 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.
++ */
++module org.apache.openmeetings.web {
++	requires org.apache.openmeetings.service;
++	requires org.apache.wicket.auth.roles;
++	requires org.apache.wicket.devutils;
++
++	requires wicketstuff.dashboard.core;
++	requires wicketstuff.datastore.hazelcast;
++	requires wicketstuff.select2;
++	requires wicketstuff.urlfragment;
++
++	requires wicket.bootstrap.extensions;
++	requires wicket.bootstrap.core;
++	requires wicket.bootstrap.themes;
++
++	requires org.danekja.jdk.serializable.functional;
++	requires wicket.jquery.ui;
++	requires wicket.jquery.ui.calendar;
++	requires wicket.jquery.ui.core;
++	requires wicket.jquery.ui.plugins;
++	requires javax.websocket.api;
++	requires com.hazelcast.core;
++	requires java.management;
++	requires simpleclient.servlet;
++	requires commons.fileupload;
++	requires org.apache.openmeetings.install;
++	requires spring.orm;
++	requires java.net.http;
++	requires wicket.webjars;
++	requires jqplot;
++	requires jqplot4java;
++	requires java.ws.rs;
++}
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
index 9132b84,39160b7..2da273b
--- 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
@@@ -18,9 -18,9 +18,9 @@@
   */
  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 static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
  
  import java.lang.reflect.Field;
  import java.lang.reflect.Modifier;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java
index a72f18f,a72f18f..53e64fe
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java
@@@ -19,9 -19,9 +19,9 @@@
  package org.apache.openmeetings.web.admin.groups;
  
  import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
++import static org.apache.openmeetings.web.app.WebSession.getRights;
  import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
  import static org.apache.openmeetings.util.OpenmeetingsVariables.getDefaultGroup;
--import static org.apache.openmeetings.web.app.WebSession.getRights;
  
  import java.util.Iterator;
  
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.java
index 93cde50,2219359..25217e1
--- 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
@@@ -19,8 -19,8 +19,8 @@@
  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.ConfirmationHelper.newOkCancelDangerConfirm;
 +import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
- import static org.apache.openmeetings.web.common.confirmation.ConfirmationBehavior.newOkCancelDangerConfirm;
  import static org.apache.wicket.request.resource.ContentDisposition.ATTACHMENT;
  
  import java.io.IOException;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
index b93776d,afcb9b9..6f688a1
--- 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
@@@ -19,13 -19,13 +19,13 @@@
  package org.apache.openmeetings.web.admin.rooms;
  
  import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
--import static org.apache.openmeetings.util.OpenmeetingsVariables.isRecordingsEnabled;
  import static org.apache.openmeetings.web.admin.AdminUserChoiceProvider.PAGE_SIZE;
  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.openmeetings.util.OpenmeetingsVariables.isRecordingsEnabled;
  import static org.apache.wicket.validation.validator.StringValidator.maximumLength;
  
  import java.util.ArrayList;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
index b60059c,b60059c..6b561cf
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
@@@ -23,10 -23,10 +23,10 @@@ import static org.apache.openmeetings.d
  import static org.apache.openmeetings.db.entity.user.User.DISPLAY_NAME_NA;
  import static org.apache.openmeetings.db.util.AuthLevelUtil.hasAdminLevel;
  import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
--import static org.apache.openmeetings.util.OpenmeetingsVariables.getMinLoginLength;
--import static org.apache.openmeetings.util.OpenmeetingsVariables.isSendRegisterEmail;
  import static org.apache.openmeetings.web.app.WebSession.getRights;
  import static org.apache.openmeetings.web.app.WebSession.getUserId;
++import static org.apache.openmeetings.util.OpenmeetingsVariables.getMinLoginLength;
++import static org.apache.openmeetings.util.OpenmeetingsVariables.isSendRegisterEmail;
  import static org.apache.wicket.validation.validator.StringValidator.minimumLength;
  
  import java.util.ArrayList;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
index 6dba04d,6dba04d..eb701b8
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
@@@ -19,8 -19,8 +19,8 @@@
  package org.apache.openmeetings.web.admin.users;
  
  import static org.apache.openmeetings.db.dao.user.UserDao.getNewUserInstance;
--import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
  import static org.apache.openmeetings.web.app.WebSession.getUserId;
++import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
  
  import org.apache.openmeetings.db.dao.user.UserDao;
  import org.apache.openmeetings.db.entity.user.User;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
index a173df2,4dbb3b8..c196086
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
@@@ -45,10 -46,10 +46,10 @@@ import java.util.stream.Stream
  
  import javax.websocket.WebSocketContainer;
  
--import org.apache.openmeetings.IApplication;
  import org.apache.openmeetings.core.sip.SipManager;
  import org.apache.openmeetings.core.util.ChatWebSocketHelper;
  import org.apache.openmeetings.core.util.WebSocketHelper;
++import org.apache.openmeetings.db.IApplication;
  import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
  import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
  import org.apache.openmeetings.db.dao.label.LabelDao;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.properties.xml
index f64b4a1,957ee1d..d6076f2
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.properties.xml
@@@ -763,7 -772,7 +772,7 @@@ To update your system
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ar.properties.xml
index 89cd296,cad7b48..4d60bfb
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ar.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ar.properties.xml
@@@ -763,7 -763,7 +763,7 @@@ see https://openmeetings.apache.org/Lan
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bg.properties.xml
index 9e2563d,160dc48..ab8effa
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bg.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bg.properties.xml
@@@ -763,7 -772,7 +772,7 @@@ To update your system
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bn.properties.xml
index 531ec4d,a4894e6..507b7e5
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bn.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bn.properties.xml
@@@ -763,7 -772,7 +772,7 @@@ To update your system
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ca.properties.xml
index 15bc331,7882279..c40b777
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ca.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ca.properties.xml
@@@ -763,7 -772,7 +772,7 @@@ To update your system
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_cs.properties.xml
index 9320649,3bb47dc..870fabb
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_cs.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_cs.properties.xml
@@@ -763,7 -772,7 +772,7 @@@ To update your system
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_da.properties.xml
index afc6e54,0d0afd6..4709e5e
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_da.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_da.properties.xml
@@@ -763,7 -772,7 +772,7 @@@ To update your system
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_el.properties.xml
index 69025b3,b5cf43e..be6c68b
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_el.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_el.properties.xml
@@@ -763,7 -772,7 +772,7 @@@ To update your system
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fi.properties.xml
index 413ac0a,db09cee..3bbf79d
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fi.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fi.properties.xml
@@@ -763,7 -772,7 +772,7 @@@ To update your system
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_gl.properties.xml
index e0ac9f7,b9f9087..7c91881
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_gl.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_gl.properties.xml
@@@ -763,7 -772,7 +772,7 @@@ To update your system
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hi.properties.xml
index c6f6ba4,491aaff..501f548
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hi.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hi.properties.xml
@@@ -763,7 -772,7 +772,7 @@@ To update your system
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_in.properties.xml
index 9bb7d65,e4378c8..47cb519
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_in.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_in.properties.xml
@@@ -763,7 -772,7 +772,7 @@@ To update your system
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_iw.properties.xml
index f2c325f,8fd939c..b69d03c
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_iw.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_iw.properties.xml
@@@ -763,7 -772,7 +772,7 @@@ To update your system
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ko.properties.xml
index d542c70,707be0e..d569f96
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ko.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ko.properties.xml
@@@ -763,7 -772,7 +772,7 @@@ To update your system
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ku.properties.xml
index 729ecd5,1386623..1d05a23
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ku.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ku.properties.xml
@@@ -763,7 -772,7 +772,7 @@@ To update your system
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_lo.properties.xml
index 3423fcc,33ff47e..6b75be1
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_lo.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_lo.properties.xml
@@@ -763,7 -763,7 +763,7 @@@ see https://openmeetings.apache.org/Lan
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_nl.properties.xml
index 14d1726,6f31705..10b5551
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_nl.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_nl.properties.xml
@@@ -763,7 -772,7 +772,7 @@@ To update your system
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pl.properties.xml
index 404f951,6d7df1b..2834dcd
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pl.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pl.properties.xml
@@@ -763,7 -763,7 +763,7 @@@ see https://openmeetings.apache.org/Lan
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt.properties.xml
index b8076ac,bfe087d..57d96f9
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt.properties.xml
@@@ -763,7 -772,7 +772,7 @@@ To update your system
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt_BR.properties.xml
index 1679a06,62eb69d..4c671d8
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt_BR.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt_BR.properties.xml
@@@ -763,7 -763,7 +763,7 @@@ see https://openmeetings.apache.org/Lan
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sk.properties.xml
index 15663b0,4912e6e..ef1cfa7
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sk.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sk.properties.xml
@@@ -763,7 -772,7 +772,7 @@@ To update your system
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ta.properties.xml
index 6a5e248,b6ca04e..140661a
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ta.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ta.properties.xml
@@@ -765,7 -774,7 +774,7 @@@ To update your system
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_th.properties.xml
index 281e418,891c8e7..59fdcaf
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_th.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_th.properties.xml
@@@ -763,7 -772,7 +772,7 @@@ To update your system
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tk.properties.xml
index b273337,06bd4cb..aa96294
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tk.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tk.properties.xml
@@@ -763,7 -772,7 +772,7 @@@ To update your system
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tr.properties.xml
index 169e6cb,8dd2585..d50261d
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tr.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tr.properties.xml
@@@ -763,7 -772,7 +772,7 @@@ To update your system
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ur.properties.xml
index f64b4a1,957ee1d..d6076f2
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ur.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ur.properties.xml
@@@ -763,7 -772,7 +772,7 @@@ To update your system
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_TW.properties.xml
index 01db3e1,5f3b4ba..5dabc7f
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_TW.properties.xml
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_TW.properties.xml
@@@ -763,7 -772,7 +772,7 @@@ To update your system
  	<entry key="install.wizard.params.step4.crypt"><![CDATA[Crypt Type]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName"><![CDATA[Crypt Class]]></entry>
  	<entry key="install.wizard.params.step4.cryptClassName.text"><![CDATA[You can use this default crypt type which is equal to
--	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.util.crypt.SCryptImplementation</b>
++	RFC 7914 - The scrypt Password-Based Key Derivation Function:<b>org.apache.openmeetings.web.util.crypt.SCryptImplementation</b>
  		for more information or to write your own Crypt-Style see: <a
  		href="https://openmeetings.apache.org/CustomCryptMechanism.html"
  		target="_blank">Custom Crypt Mechanism</a> You can edit this
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
index a4df318,a4df318..6621ed0
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
@@@ -41,8 -41,8 +41,8 @@@ import java.util.Set
  import java.util.TimeZone;
  
  import org.apache.commons.lang3.time.FastDateFormat;
--import org.apache.openmeetings.IWebSession;
  import org.apache.openmeetings.core.ldap.LdapLoginManager;
++import org.apache.openmeetings.db.IWebSession;
  import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
  import org.apache.openmeetings.db.dao.label.LabelDao;
  import org.apache.openmeetings.db.dao.room.InvitationDao;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WhiteboardManager.java
index 6d24e77,6d24e77..1be3d6a
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WhiteboardManager.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WhiteboardManager.java
@@@ -20,8 -20,8 +20,8 @@@ package org.apache.openmeetings.web.app
  
  import static org.apache.openmeetings.db.dto.room.Whiteboard.ATTR_SLIDE;
  import static org.apache.openmeetings.db.util.ApplicationHelper.ensureApplication;
--import static org.apache.openmeetings.util.OpenmeetingsVariables.getDefaultLang;
  import static org.apache.openmeetings.web.room.wb.WbWebSocketHelper.sendWbAll;
++import static org.apache.openmeetings.util.OpenmeetingsVariables.getDefaultLang;
  
  import java.util.ArrayList;
  import java.util.HashMap;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
index 75c1811,75c1811..9222ce8
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
@@@ -19,10 -19,10 +19,10 @@@
  package org.apache.openmeetings.web.common;
  
  import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
--import static org.apache.openmeetings.util.OpenmeetingsVariables.isDisplayNameEditable;
  import static org.apache.openmeetings.web.app.WebSession.AVAILABLE_TIMEZONES;
  import static org.apache.openmeetings.web.app.WebSession.getRights;
  import static org.apache.openmeetings.web.app.WebSession.getUserId;
++import static org.apache.openmeetings.util.OpenmeetingsVariables.isDisplayNameEditable;
  
  import java.util.ArrayList;
  import java.util.List;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
index 8ea79c8,21aea80..8ba2189
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
@@@ -21,15 -21,16 +21,16 @@@ package org.apache.openmeetings.web.com
  import static de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal.BUTTON_MARKUP_ID;
  import static java.time.Duration.ZERO;
  import static java.util.UUID.randomUUID;
 -import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_JPG;
 -import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_MP4;
 -import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_PDF;
 -import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
 -import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_TITLE;
+ 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.ConfirmationHelper.newOkCancelDangerConfirmCfg;
+ import static org.apache.openmeetings.web.pages.BasePage.ALIGN_LEFT;
+ import static org.apache.openmeetings.web.pages.BasePage.ALIGN_RIGHT;
 +import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_JPG;
 +import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_MP4;
 +import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_PDF;
 +import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
 +import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_TITLE;
- 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.pages.BasePage.ALIGN_LEFT;
- import static org.apache.openmeetings.web.pages.BasePage.ALIGN_RIGHT;
  
  import java.io.File;
  import java.nio.file.Path;
@@@ -44,10 -45,8 +45,8 @@@ import org.apache.openmeetings.db.entit
  import org.apache.openmeetings.db.entity.file.BaseFileItem.Type;
  import org.apache.openmeetings.db.entity.file.FileItem;
  import org.apache.openmeetings.db.entity.record.Recording;
--import org.apache.openmeetings.util.OmFileHelper;
  import org.apache.openmeetings.web.common.NameDialog;
- import org.apache.openmeetings.web.common.confirmation.ConfirmableAjaxBorder;
- import org.apache.openmeetings.web.common.confirmation.ConfirmationDialog;
++import org.apache.openmeetings.util.OmFileHelper;
  import org.apache.wicket.AttributeModifier;
  import org.apache.wicket.Component;
  import org.apache.wicket.ajax.AjaxEventBehavior;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java
index 1517e47,1517e47..f93c6b0
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java
@@@ -19,9 -19,9 +19,9 @@@
  package org.apache.openmeetings.web.common.tree;
  
  import static org.apache.openmeetings.db.util.AuthLevelUtil.hasAdminLevel;
--import static org.apache.openmeetings.util.OpenmeetingsVariables.isRecordingsEnabled;
  import static org.apache.openmeetings.web.app.WebSession.getRights;
  import static org.apache.openmeetings.web.app.WebSession.getUserId;
++import static org.apache.openmeetings.util.OpenmeetingsVariables.isRecordingsEnabled;
  
  import java.util.ArrayList;
  import java.util.Iterator;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java
index 92350d3,92350d3..66d9090
--- 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
@@@ -18,10 -18,10 +18,10 @@@
   */
  package org.apache.openmeetings.web.pages;
  
++import static org.apache.openmeetings.web.app.Application.isInstalled;
  import static org.apache.openmeetings.util.OpenmeetingsVariables.getApplicationName;
  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;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java
index ee2be61,ee2be61..9ed0701
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java
@@@ -19,9 -19,9 +19,9 @@@
  package org.apache.openmeetings.web.pages.auth;
  
  import static java.util.UUID.randomUUID;
++import static org.apache.openmeetings.web.app.Application.urlForPage;
  import static org.apache.openmeetings.util.OpenmeetingsVariables.getBaseUrl;
  import static org.apache.openmeetings.util.OpenmeetingsVariables.getMinLoginLength;
--import static org.apache.openmeetings.web.app.Application.urlForPage;
  
  import java.util.Date;
  
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java
index 865e228,865e228..e265115
--- 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
@@@ -19,9 -19,9 +19,9 @@@
  package org.apache.openmeetings.web.pages.install;
  
  import static org.apache.openmeetings.core.converter.BaseConverter.EXEC_EXT;
--import static org.apache.openmeetings.util.OpenmeetingsVariables.USER_LOGIN_MINIMUM_LENGTH;
  import static org.apache.openmeetings.web.app.WebSession.AVAILABLE_TIMEZONES;
  import static org.apache.openmeetings.web.app.WebSession.AVAILABLE_TIMEZONE_SET;
++import static org.apache.openmeetings.util.OpenmeetingsVariables.USER_LOGIN_MINIMUM_LENGTH;
  import static org.apache.wicket.validation.validator.RangeValidator.range;
  import static org.apache.wicket.validation.validator.StringValidator.minimumLength;
  import static org.springframework.web.context.support.WebApplicationContextUtils.getWebApplicationContext;
@@@ -45,17 -45,17 +45,17 @@@ import org.apache.openmeetings.db.dao.l
  import org.apache.openmeetings.db.entity.user.User;
  import org.apache.openmeetings.installation.ImportInitvalues;
  import org.apache.openmeetings.installation.InstallationConfig;
--import org.apache.openmeetings.util.ConnectionProperties;
--import org.apache.openmeetings.util.ConnectionProperties.DbType;
--import org.apache.openmeetings.util.OmFileHelper;
  import org.apache.openmeetings.util.process.ProcessHelper;
  import org.apache.openmeetings.util.process.ProcessResult;
  import org.apache.openmeetings.web.app.Application;
  import org.apache.openmeetings.web.app.WebSession;
  import org.apache.openmeetings.web.common.ErrorMessagePanel;
  import org.apache.openmeetings.web.common.OmLabel;
++import org.apache.openmeetings.util.ConnectionProperties;
++import org.apache.openmeetings.util.OmFileHelper;
  import org.apache.openmeetings.web.util.OmTooltipBehavior;
  import org.apache.openmeetings.web.util.ThreadHelper;
++import org.apache.openmeetings.util.ConnectionProperties.DbType;
  import org.apache.wicket.Component;
  import org.apache.wicket.ajax.AjaxRequestTarget;
  import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
index de66749,0e84051..c0c4461
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
@@@ -23,10 -23,10 +23,10 @@@ import static java.time.Duration.ZERO
  import static org.apache.openmeetings.core.remote.KurentoHandler.activityAllowed;
  import static org.apache.openmeetings.core.util.ChatWebSocketHelper.ID_USER_PREFIX;
  import static org.apache.openmeetings.db.entity.calendar.Appointment.allowedStart;
--import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_PDF;
  import static org.apache.openmeetings.web.app.WebSession.getDateFormat;
  import static org.apache.openmeetings.web.app.WebSession.getUserId;
  import static org.apache.openmeetings.web.room.wb.WbPanel.WB_JS_REFERENCE;
++import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_PDF;
  
  import java.io.IOException;
  import java.nio.file.Files;
@@@ -59,7 -56,8 +56,7 @@@ import org.apache.openmeetings.db.util.
  import org.apache.openmeetings.db.util.ws.RoomMessage;
  import org.apache.openmeetings.db.util.ws.RoomMessage.Type;
  import org.apache.openmeetings.db.util.ws.TextRoomMessage;
--import org.apache.openmeetings.util.NullStringer;
+ import org.apache.openmeetings.web.app.Application;
  import org.apache.openmeetings.web.app.ClientManager;
  import org.apache.openmeetings.web.app.QuickPollManager;
  import org.apache.openmeetings.web.app.TimerService;
@@@ -73,6 -71,6 +70,7 @@@ import org.apache.openmeetings.web.room
  import org.apache.openmeetings.web.room.wb.WbAction;
  import org.apache.openmeetings.web.room.wb.WbPanel;
  import org.apache.openmeetings.web.util.ExtendedClientProperties;
++import org.apache.openmeetings.util.NullStringer;
  import org.apache.openmeetings.web.util.TouchPunchResourceReference;
  import org.apache.wicket.AttributeModifier;
  import org.apache.wicket.Component;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomResourceReference.java
index 98636ed,98636ed..ae9cb40
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomResourceReference.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomResourceReference.java
@@@ -19,11 -19,11 +19,11 @@@
  package org.apache.openmeetings.web.room;
  
  import static org.apache.openmeetings.db.dto.room.Whiteboard.ATTR_SLIDE;
++import static org.apache.openmeetings.web.app.WebSession.getUserId;
  import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_PNG;
  import static org.apache.openmeetings.util.OmFileHelper.MP4_MIME_TYPE;
  import static org.apache.openmeetings.util.OmFileHelper.PNG_MIME_TYPE;
  import static org.apache.openmeetings.util.OmFileHelper.getImagesDir;
--import static org.apache.openmeetings.web.app.WebSession.getUserId;
  
  import java.io.File;
  
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/ActionsSubMenu.java
index 8ec7507,7655214..33e9f2c
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/ActionsSubMenu.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/ActionsSubMenu.java
@@@ -18,10 -18,10 +18,10 @@@
   */
  package org.apache.openmeetings.web.room.menu;
  
++import static org.apache.openmeetings.web.app.WebSession.getUserId;
  import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_PDF;
  import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_PNG;
  import static org.apache.openmeetings.util.OpenmeetingsVariables.isSipEnabled;
--import static org.apache.openmeetings.web.app.WebSession.getUserId;
  
  import java.io.Serializable;
  
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
index d96d16f,d96d16f..4fd172b
--- 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
@@@ -18,16 -18,16 +18,16 @@@
   */
  package org.apache.openmeetings.web.room.menu;
  
--import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
--import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_TITLE;
--import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REDIRECT_URL_FOR_EXTERNAL;
--import static org.apache.openmeetings.util.OpenmeetingsVariables.getBaseUrl;
--import static org.apache.openmeetings.util.OpenmeetingsVariables.isMyRoomsEnabled;
  import static org.apache.openmeetings.web.app.WebSession.getUserId;
  import static org.apache.openmeetings.web.util.GroupLogoResourceReference.getUrl;
  import static org.apache.openmeetings.web.util.OmUrlFragment.ROOMS_GROUP;
  import static org.apache.openmeetings.web.util.OmUrlFragment.ROOMS_MY;
  import static org.apache.openmeetings.web.util.OmUrlFragment.ROOMS_PUBLIC;
++import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
++import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_TITLE;
++import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REDIRECT_URL_FOR_EXTERNAL;
++import static org.apache.openmeetings.util.OpenmeetingsVariables.getBaseUrl;
++import static org.apache.openmeetings.util.OpenmeetingsVariables.isMyRoomsEnabled;
  
  import java.util.ArrayList;
  import java.util.Date;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java
index 5eb979d,5eb979d..1468cc6
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java
@@@ -18,9 -18,9 +18,9 @@@
   */
  package org.apache.openmeetings.web.room.sidebar;
  
--import static org.apache.openmeetings.util.OmFileHelper.getHumanSize;
  import static org.apache.openmeetings.web.app.WebSession.getUserId;
  import static org.apache.openmeetings.web.common.BasePanel.EVT_CLICK;
++import static org.apache.openmeetings.util.OmFileHelper.getHumanSize;
  
  import org.apache.openmeetings.db.dao.file.FileItemDao;
  import org.apache.openmeetings.db.dao.record.RecordingDao;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbWebSocketHelper.java
index 3894920,3894920..74bd097
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbWebSocketHelper.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbWebSocketHelper.java
@@@ -28,12 -28,12 +28,12 @@@ import java.util.function.Predicate
  
  import org.apache.openmeetings.db.entity.basic.Client;
  import org.apache.openmeetings.db.entity.file.BaseFileItem;
--import org.apache.openmeetings.util.NullStringer;
  import org.apache.openmeetings.util.ws.IClusterWsMessage;
  import org.apache.openmeetings.web.room.RoomPreviewResourceReference;
  import org.apache.openmeetings.web.room.RoomResourceReference;
  import org.apache.openmeetings.web.user.record.Mp4RecordingResourceReference;
  import org.apache.openmeetings.web.user.record.PngRecordingResourceReference;
++import org.apache.openmeetings.util.NullStringer;
  import org.apache.wicket.request.cycle.RequestCycle;
  import org.apache.wicket.request.handler.resource.ResourceReferenceRequestHandler;
  import org.apache.wicket.request.mapper.parameter.PageParameters;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WsMessageWb.java
index 6c8018e,6c8018e..6d226d2
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WsMessageWb.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WsMessageWb.java
@@@ -18,8 -18,8 +18,8 @@@
   */
  package org.apache.openmeetings.web.room.wb;
  
--import org.apache.openmeetings.util.NullStringer;
  import org.apache.openmeetings.util.ws.IClusterWsMessage;
++import org.apache.openmeetings.util.NullStringer;
  
  import com.github.openjson.JSONObject;
  
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WsMessageWbFile.java
index b3c7212,b3c7212..2051f48
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WsMessageWbFile.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WsMessageWbFile.java
@@@ -19,8 -19,8 +19,8 @@@
  package org.apache.openmeetings.web.room.wb;
  
  import org.apache.openmeetings.db.entity.file.BaseFileItem;
--import org.apache.openmeetings.util.NullStringer;
  import org.apache.openmeetings.util.ws.IClusterWsMessage;
++import org.apache.openmeetings.util.NullStringer;
  
  import com.github.openjson.JSONObject;
  
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
index 4c51295,0481bee..eacf2e6
--- 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
@@@ -18,13 -18,13 +18,13 @@@
   */
  package org.apache.openmeetings.web.user.calendar;
  
--import static org.apache.openmeetings.util.OpenmeetingsVariables.isMyRoomsEnabled;
  import static org.apache.openmeetings.web.app.WebSession.getRights;
  import static org.apache.openmeetings.web.app.WebSession.getUserId;
  import static org.apache.openmeetings.web.common.BasePanel.EVT_CHANGE;
- import static org.apache.openmeetings.web.common.confirmation.ConfirmationBehavior.newOkCancelDangerConfirm;
+ import static org.apache.openmeetings.web.common.confirmation.ConfirmationHelper.newOkCancelDangerConfirm;
  import static org.apache.openmeetings.web.util.CalendarWebHelper.getDate;
  import static org.apache.openmeetings.web.util.CalendarWebHelper.getDateTime;
++import static org.apache.openmeetings.util.OpenmeetingsVariables.isMyRoomsEnabled;
  
  import java.time.LocalDateTime;
  import java.util.ArrayList;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
index 3d91602,3d91602..0ce06b1
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
@@@ -20,11 -20,11 +20,11 @@@ package org.apache.openmeetings.web.use
  
  import static org.apache.openmeetings.core.util.ChatWebSocketHelper.ID_ALL;
  import static org.apache.openmeetings.core.util.ChatWebSocketHelper.ID_ROOM_PREFIX;
--import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_CHAT;
--import static org.apache.openmeetings.util.OpenmeetingsVariables.isChatSendOnEnter;
  import static org.apache.openmeetings.web.app.WebSession.getUserId;
  import static org.apache.openmeetings.web.room.RoomPanel.isModerator;
  import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
++import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_CHAT;
++import static org.apache.openmeetings.util.OpenmeetingsVariables.isChatSendOnEnter;
  import static org.apache.openmeetings.web.util.ProfileImageResourceReference.getUrl;
  import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
  
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/admin/AdminCleanupInfoDialog.java
index 5d76376,44509eb..6a03349
--- 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
@@@ -23,10 -23,10 +23,10 @@@ import static org.apache.openmeetings.c
  import static org.apache.openmeetings.cli.CleanupHelper.getImportUnit;
  import static org.apache.openmeetings.cli.CleanupHelper.getProfileUnit;
  import static org.apache.openmeetings.cli.CleanupHelper.getRecUnit;
++import static org.apache.openmeetings.web.common.confirmation.ConfirmationHelper.newOkCancelDangerConfirm;
  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 --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/InvitationsPanel.java
index 3be2347,3be2347..b51fc47
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/InvitationsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/InvitationsPanel.java
@@@ -19,9 -19,9 +19,9 @@@
  package org.apache.openmeetings.web.user.profile;
  
  import static org.apache.openmeetings.db.util.FormatHelper.formatUser;
--import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
  import static org.apache.openmeetings.web.app.WebSession.getRights;
  import static org.apache.openmeetings.web.app.WebSession.getUserId;
++import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
  
  import java.util.Iterator;
  import java.util.Set;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessagesContactsPanel.java
index 83d6b73,f5f6819..489f7c9
--- 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
@@@ -21,10 -21,10 +21,10 @@@ package org.apache.openmeetings.web.use
  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.common.confirmation.ConfirmationBehavior.newOkCancelDangerConfirm;
+ import static org.apache.openmeetings.web.common.confirmation.ConfirmationHelper.newOkCancelDangerConfirm;
++import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
  
  import java.util.ArrayList;
  import java.util.HashSet;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserSearchPanel.java
index 94afde3,94afde3..bf9a4c4
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserSearchPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserSearchPanel.java
@@@ -19,8 -19,8 +19,8 @@@
  package org.apache.openmeetings.web.user.profile;
  
  import static org.apache.openmeetings.db.util.TimezoneUtil.getTimeZone;
--import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
  import static org.apache.openmeetings.web.app.WebSession.getUserId;
++import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
  
  import java.util.ArrayList;
  import java.util.Iterator;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/WidgetsPanel.java
index 0e80f38,0e80f38..988e127
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/WidgetsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/WidgetsPanel.java
@@@ -19,11 -19,11 +19,11 @@@
  package org.apache.openmeetings.web.user.profile;
  
  import static org.apache.openmeetings.db.util.AuthLevelUtil.hasAdminLevel;
--import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_MYROOMS;
--import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_RSS;
  import static org.apache.openmeetings.web.app.Application.getDashboardContext;
  import static org.apache.openmeetings.web.app.WebSession.getDashboard;
  import static org.apache.openmeetings.web.app.WebSession.getRights;
++import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_MYROOMS;
++import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_RSS;
  
  import java.util.ArrayList;
  import java.util.Iterator;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java
index 1cd806e,5a14902..12b8361
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java
@@@ -18,9 -18,9 +18,9 @@@
   */
  package org.apache.openmeetings.web.user.record;
  
++import static org.apache.openmeetings.web.app.WebSession.getUserId;
  import static org.apache.openmeetings.util.OmFileHelper.getHumanSize;
  import static org.apache.openmeetings.util.OmFileHelper.getRecordingChunk;
--import static org.apache.openmeetings.web.app.WebSession.getUserId;
  
  import java.util.List;
  
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.java
index 3576fc8,3576fc8..76073fc
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.java
@@@ -18,8 -18,8 +18,8 @@@
   */
  package org.apache.openmeetings.web.user.rooms;
  
--import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_TITLE;
  import static org.apache.openmeetings.web.common.BasePanel.EVT_CLICK;
++import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_TITLE;
  
  import java.io.Serializable;
  import java.util.List;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsPanel.java
index 4760969,4760969..9ed7c0a
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsPanel.java
@@@ -28,9 -28,9 +28,9 @@@ import org.apache.openmeetings.db.dao.r
  import org.apache.openmeetings.db.dao.user.UserDao;
  import org.apache.openmeetings.db.entity.basic.Client;
  import org.apache.openmeetings.db.entity.room.Room;
--import org.apache.openmeetings.util.OmFileHelper;
  import org.apache.openmeetings.web.app.ClientManager;
  import org.apache.openmeetings.web.common.UserPanel;
++import org.apache.openmeetings.util.OmFileHelper;
  import org.apache.wicket.ajax.AjaxRequestTarget;
  import org.apache.wicket.markup.html.WebMarkupContainer;
  import org.apache.wicket.markup.html.basic.Label;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsSelectorPanel.java
index ffff1f7,f8c7716..1650b31
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsSelectorPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsSelectorPanel.java
@@@ -18,10 -18,11 +18,11 @@@
   */
  package org.apache.openmeetings.web.user.rooms;
  
 -import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_TITLE;
--import static org.apache.openmeetings.util.OpenmeetingsVariables.isMyRoomsEnabled;
  import static org.apache.openmeetings.web.app.WebSession.getUserId;
  import static org.apache.openmeetings.web.util.OmUrlFragment.TYPE_GROUP;
  import static org.apache.openmeetings.web.util.OmUrlFragment.TYPE_MY;
++import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_TITLE;
++import static org.apache.openmeetings.util.OpenmeetingsVariables.isMyRoomsEnabled;
  
  import org.apache.openmeetings.db.dao.room.RoomDao;
  import org.apache.openmeetings.web.app.Application;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/util/GroupLogoResourceReference.java
index 060c838,060c838..bf066c9
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/GroupLogoResourceReference.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/GroupLogoResourceReference.java
@@@ -19,10 -19,10 +19,10 @@@
  package org.apache.openmeetings.web.util;
  
  import static org.apache.openmeetings.db.util.AuthLevelUtil.hasAdminLevel;
--import static org.apache.openmeetings.util.OmFileHelper.PNG_MIME_TYPE;
--import static org.apache.openmeetings.util.OmFileHelper.getGroupLogo;
  import static org.apache.openmeetings.web.app.WebSession.getRights;
  import static org.apache.openmeetings.web.app.WebSession.getUserId;
++import static org.apache.openmeetings.util.OmFileHelper.PNG_MIME_TYPE;
++import static org.apache.openmeetings.util.OmFileHelper.getGroupLogo;
  
  import java.io.File;
  import java.io.IOException;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/util/ProfileImageResourceReference.java
index ce79595,ce79595..21bd5fb
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/ProfileImageResourceReference.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/ProfileImageResourceReference.java
@@@ -20,8 -20,8 +20,8 @@@ package org.apache.openmeetings.web.uti
  
  import org.apache.openmeetings.db.dao.user.UserDao;
  import org.apache.openmeetings.db.entity.user.User;
--import org.apache.openmeetings.util.OmFileHelper;
  import org.apache.openmeetings.web.app.WebSession;
++import org.apache.openmeetings.util.OmFileHelper;
  import org.apache.wicket.injection.Injector;
  import org.apache.wicket.request.cycle.RequestCycle;
  import org.apache.wicket.request.mapper.parameter.PageParameters;
@@@ -34,14 -34,14 +34,15 @@@ import org.slf4j.Logger
  import org.slf4j.LoggerFactory;
  
  import javax.servlet.http.HttpServletResponse;
++
++import static org.apache.openmeetings.util.OmFileHelper.PNG_MIME_TYPE;
++import static org.apache.openmeetings.util.OmFileHelper.SIP_USER_ID;
++
  import java.io.File;
  import java.io.FileInputStream;
  import java.io.InputStream;
  import java.net.URI;
  
--import static org.apache.openmeetings.util.OmFileHelper.PNG_MIME_TYPE;
--import static org.apache.openmeetings.util.OmFileHelper.SIP_USER_ID;
--
  public class ProfileImageResourceReference extends ResourceReference {
  	private static final long serialVersionUID = 1L;
  	private static final Logger log = LoggerFactory.getLogger(ProfileImageResourceReference.class);
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/util/UserDashboardPersister.java
index 5b468ed,5b468ed..71274b9
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/UserDashboardPersister.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/UserDashboardPersister.java
@@@ -19,8 -19,8 +19,8 @@@
  package org.apache.openmeetings.web.util;
  
  import static java.nio.charset.StandardCharsets.UTF_8;
--import static org.apache.openmeetings.util.OmFileHelper.getUserDashboard;
  import static org.apache.openmeetings.web.app.WebSession.getUserId;
++import static org.apache.openmeetings.util.OmFileHelper.getUserDashboard;
  
  import java.io.File;
  import java.io.FileInputStream;
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/util/logging/OpenMeetingsMetricsServlet.java
index 05c1555,05c1555..1b9bdd5
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/logging/OpenMeetingsMetricsServlet.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/logging/OpenMeetingsMetricsServlet.java
@@@ -21,8 -21,8 +21,7 @@@ package org.apache.openmeetings.web.uti
  import io.prometheus.client.exporter.MetricsServlet;
  
  public class OpenMeetingsMetricsServlet extends MetricsServlet {
--
--	private static final long serialVersionUID = -2488393857088858502L;
++	private static final long serialVersionUID = 1L;
  
  	public OpenMeetingsMetricsServlet() {
  		super();
diff --cc openmeetings-web/src/main/java/org/apache/openmeetings/web/util/logging/TomcatGenericExports.java
index 8865859,8865859..0383d14
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/logging/TomcatGenericExports.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/logging/TomcatGenericExports.java
@@@ -18,10 -18,10 +18,12 @@@
   */
  package org.apache.openmeetings.web.util.logging;
  
++import java.io.InputStream;
  import java.lang.management.ManagementFactory;
  import java.util.ArrayList;
  import java.util.Collections;
  import java.util.List;
++import java.util.Properties;
  import java.util.Set;
  
  import javax.management.Attribute;
@@@ -30,11 -30,11 +32,11 @@@ import javax.management.MBeanServer
  import javax.management.ObjectInstance;
  import javax.management.ObjectName;
  
--import org.apache.catalina.util.ServerInfo;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  import io.prometheus.client.Collector;
++import io.prometheus.client.Collector.MetricFamilySamples;
  import io.prometheus.client.CounterMetricFamily;
  import io.prometheus.client.GaugeMetricFamily;
  
@@@ -293,7 -293,7 +295,14 @@@ public class TomcatGenericExports exten
  	private void addVersionInfo(List<MetricFamilySamples> mfs) {
  		GaugeMetricFamily tomcatInfo = new GaugeMetricFamily("tomcat_info", "tomcat version info",
  				List.of("version", "build"));
--		tomcatInfo.addMetric(List.of(ServerInfo.getServerNumber(), ServerInfo.getServerBuilt()), 1);
++		try (InputStream is = getClass().getResourceAsStream("/org/apache/catalina/util/ServerInfo.properties")) {
++			Properties props = new Properties();
++			props.load(is);
++			//server info can be get as props.getProperty("server.info");
++			tomcatInfo.addMetric(List.of(props.getProperty("server.number"), props.getProperty("server.built")), 1);
++		} catch (Throwable t) {
++			log.warn("Unable to read Tomcat version: ", t);
++		}
  		mfs.add(tomcatInfo);
  	}
  
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestAppointmentAddAppointment.java
index 5819d14,65ba0b0..695051c
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestAppointmentAddAppointment.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestAppointmentAddAppointment.java
@@@ -29,7 -29,7 +29,6 @@@ import java.util.ArrayList
  import java.util.Calendar;
  import java.util.Date;
  
- import org.apache.openmeetings.AbstractWicketTester;
 -import org.apache.openmeetings.AbstractWicketTesterTest;
  import org.apache.openmeetings.db.dao.calendar.MeetingMemberDao;
  import org.apache.openmeetings.db.entity.calendar.Appointment;
  import org.apache.openmeetings.db.entity.calendar.Appointment.Reminder;
@@@ -38,6 -38,6 +37,7 @@@ import org.apache.openmeetings.db.entit
  import org.apache.openmeetings.db.entity.user.User;
  import org.apache.openmeetings.service.calendar.AppointmentLogic;
  import org.apache.openmeetings.web.app.WebSession;
++import org.apache.openmeetings.web.test.AbstractWicketTesterTest;
  import org.apache.wicket.util.string.StringValue;
  import org.apache.wicket.util.string.Strings;
  import org.junit.jupiter.api.Test;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestAppointmentSchedulerTask.java
index 642c15f,50996e8..c704dec
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestAppointmentSchedulerTask.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestAppointmentSchedulerTask.java
@@@ -23,9 -23,9 +23,9 @@@ import static org.apache.openmeetings.u
  import static org.apache.openmeetings.util.OpenmeetingsVariables.setBaseUrl;
  import static org.junit.jupiter.api.Assertions.assertTrue;
  
- import org.apache.openmeetings.AbstractJUnitDefaults;
 -import org.apache.openmeetings.AbstractOmServerTest;
  import org.apache.openmeetings.db.entity.basic.Configuration;
  import org.apache.openmeetings.service.calendar.AppointmentLogic;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
  import org.junit.jupiter.api.Test;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestDatabaseStructureAppointment.java
index a5993c2,21371c2..4d30e87
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestDatabaseStructureAppointment.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestDatabaseStructureAppointment.java
@@@ -24,8 -24,8 +24,8 @@@ import java.util.Date
  import java.util.Iterator;
  import java.util.List;
  
- import org.apache.openmeetings.AbstractJUnitDefaults;
 -import org.apache.openmeetings.AbstractOmServerTest;
  import org.apache.openmeetings.db.entity.calendar.Appointment;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
  import org.junit.jupiter.api.Test;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestDatabaseStructureGetAppointmentByRange.java
index cf58b10,33f9a57..6b532c9
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestDatabaseStructureGetAppointmentByRange.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestDatabaseStructureGetAppointmentByRange.java
@@@ -23,9 -23,9 +23,9 @@@ import static org.junit.jupiter.api.Ass
  import java.util.ArrayList;
  import java.util.Calendar;
  
- import org.apache.openmeetings.AbstractJUnitDefaults;
 -import org.apache.openmeetings.AbstractOmServerTest;
  import org.apache.openmeetings.db.entity.calendar.Appointment;
  import org.apache.openmeetings.db.entity.calendar.MeetingMember;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
  import org.junit.jupiter.api.Test;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestDatabaseStructureGetUserStart.java
index 9898299,a40d9a8..e948b0d
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestDatabaseStructureGetUserStart.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestDatabaseStructureGetUserStart.java
@@@ -18,7 -18,7 +18,7 @@@
   */
  package org.apache.openmeetings.calendar;
  
- import org.apache.openmeetings.AbstractJUnitDefaults;
 -import org.apache.openmeetings.AbstractOmServerTest;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
  import org.junit.jupiter.api.Test;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestDatabaseStructureMeetingMember.java
index 25e4d16,b29ffdb..c3d38c1
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestDatabaseStructureMeetingMember.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestDatabaseStructureMeetingMember.java
@@@ -18,10 -18,10 +18,10 @@@
   */
  package org.apache.openmeetings.calendar;
  
- import org.apache.openmeetings.AbstractJUnitDefaults;
 -import org.apache.openmeetings.AbstractOmServerTest;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
  import org.junit.jupiter.api.Test;
  
- class TestDatabaseStructureMeetingMember extends AbstractJUnitDefaults {
+ class TestDatabaseStructureMeetingMember extends AbstractOmServerTest {
  
  	@Test
  	void testUpdateMeetingMember(){
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestGetAppointment.java
index 511b803,bde1652..047cf0a
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestGetAppointment.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestGetAppointment.java
@@@ -24,9 -24,9 +24,9 @@@ import static org.junit.jupiter.api.Ass
  import java.util.Calendar;
  import java.util.Date;
  
- import org.apache.openmeetings.AbstractJUnitDefaults;
 -import org.apache.openmeetings.AbstractOmServerTest;
  import org.apache.openmeetings.db.dao.room.RoomDao;
  import org.apache.openmeetings.db.entity.calendar.Appointment;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
  import org.junit.jupiter.api.Test;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestOmCalendar.java
index 9b1483f,cf9e953..50f3d61
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestOmCalendar.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestOmCalendar.java
@@@ -21,10 -21,10 +21,10 @@@ package org.apache.openmeetings.calenda
  import static org.junit.jupiter.api.Assertions.assertNotNull;
  import static org.junit.jupiter.api.Assertions.assertTrue;
  
- import org.apache.openmeetings.AbstractJUnitDefaults;
 -import org.apache.openmeetings.AbstractOmServerTest;
  import org.apache.openmeetings.db.dao.calendar.OmCalendarDao;
  import org.apache.openmeetings.db.entity.calendar.OmCalendar;
  import org.apache.openmeetings.db.entity.user.User;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
  import org.junit.jupiter.api.Test;
  import org.springframework.beans.factory.annotation.Autowired;
  
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestSendIcalMessage.java
index 7da0ed6,2d3d2cf..d16c730
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestSendIcalMessage.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestSendIcalMessage.java
@@@ -19,6 -19,6 +19,7 @@@
  package org.apache.openmeetings.calendar;
  
  import static java.util.UUID.randomUUID;
++import static org.apache.openmeetings.util.CalendarHelper.getZoneDateTime;
  import static org.junit.jupiter.api.Assertions.assertNotNull;
  
  import java.io.ByteArrayInputStream;
@@@ -27,24 -27,24 +28,25 @@@ import java.util.Date
  import java.util.TimeZone;
  
  import javax.activation.DataHandler;
--import javax.mail.BodyPart;
--import javax.mail.Message;
--import javax.mail.Multipart;
--import javax.mail.internet.InternetAddress;
--import javax.mail.internet.MimeBodyPart;
--import javax.mail.internet.MimeMessage;
--import javax.mail.internet.MimeMultipart;
--
- import org.apache.openmeetings.AbstractJUnitDefaults;
 -import org.apache.openmeetings.AbstractOmServerTest;
++
  import org.apache.openmeetings.core.mail.MailHandler;
  import org.apache.openmeetings.util.mail.ByteArrayDataSource;
  import org.apache.openmeetings.util.mail.IcalHandler;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
  import org.junit.jupiter.api.Test;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  import org.springframework.beans.factory.annotation.Autowired;
  
- class TestSendIcalMessage extends AbstractJUnitDefaults {
++import jakarta.mail.BodyPart;
++import jakarta.mail.Message;
++import jakarta.mail.Multipart;
++import jakarta.mail.internet.InternetAddress;
++import jakarta.mail.internet.MimeBodyPart;
++import jakarta.mail.internet.MimeMessage;
++import jakarta.mail.internet.MimeMultipart;
++
+ class TestSendIcalMessage extends AbstractOmServerTest {
  	private static final Logger log = LoggerFactory.getLogger(TestSendIcalMessage.class);
  
  	@Autowired
@@@ -65,8 -65,8 +67,9 @@@
  		Calendar endCal = Calendar.getInstance();
  		endCal.add(Calendar.HOUR_OF_DAY, 1);
  		Date end = endCal.getTime();
++		String tzid = TimeZone.getDefault().getID();
  		IcalHandler handler = new IcalHandler(IcalHandler.ICAL_METHOD_REQUEST)
--				.createVEvent(TimeZone.getDefault().getID(), start, end, "test event")
++				.createVEvent(getZoneDateTime(start, tzid), getZoneDateTime(end, tzid), "test event")
  				.setLocation("")
  				.setDescription("localhost:5080/link_openmeetings")
  				.setUid(randomUUID().toString())
@@@ -91,16 -91,16 +94,12 @@@
  
  		// -- Create a new message --
  		BodyPart msg = new MimeBodyPart();
--		msg.setDataHandler(new DataHandler(new ByteArrayDataSource(htmlBody,
--				"text/html; charset=\"utf-8\"")));
++		msg.setDataHandler(new DataHandler(new ByteArrayDataSource(htmlBody, "text/html; charset=\"utf-8\"")));
  
  		Multipart multipart = new MimeMultipart();
  
  		BodyPart iCalAttachment = new MimeBodyPart();
--		iCalAttachment.setDataHandler(new DataHandler(
--				new javax.mail.util.ByteArrayDataSource(
--						new ByteArrayInputStream(iCalMimeBody),
--						"text/calendar;method=REQUEST;charset=\"UTF-8\"")));
++		iCalAttachment.setDataHandler(new DataHandler(new jakarta.mail.util.ByteArrayDataSource(new ByteArrayInputStream(iCalMimeBody), "text/calendar;method=REQUEST;charset=\"UTF-8\"")));
  		iCalAttachment.setFileName("invite.ics");
  
  		multipart.addBodyPart(iCalAttachment);
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/cmdline/TestAdmin.java
index 38bcf05,5ba13a8..cfe624b
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/cmdline/TestAdmin.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/cmdline/TestAdmin.java
@@@ -16,14 -16,14 +16,9 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
--package org.apache.openmeetings.cli;
++package org.apache.openmeetings.cmdline;
  
  import static org.apache.commons.io.FileUtils.deleteQuietly;
- import static org.apache.openmeetings.AbstractJUnitDefaults.adminUsername;
- import static org.apache.openmeetings.AbstractJUnitDefaults.email;
- import static org.apache.openmeetings.AbstractJUnitDefaults.group;
- import static org.apache.openmeetings.AbstractJUnitDefaults.userpass;
- import static org.apache.openmeetings.AbstractSpringTest.setOmHome;
 -import static org.apache.openmeetings.AbstractOmServerTest.adminUsername;
 -import static org.apache.openmeetings.AbstractOmServerTest.email;
 -import static org.apache.openmeetings.AbstractOmServerTest.group;
 -import static org.apache.openmeetings.AbstractOmServerTest.setOmHome;
 -import static org.apache.openmeetings.AbstractOmServerTest.userpass;
  import static org.apache.openmeetings.cli.Admin.OM_HOME;
  import static org.apache.openmeetings.db.util.ApplicationHelper.destroyApplication;
  import static org.apache.openmeetings.util.OmFileHelper.getOmHome;
@@@ -33,6 -33,6 +28,11 @@@ import static org.apache.openmeetings.u
  import static org.apache.openmeetings.util.OpenmeetingsVariables.setWicketApplicationName;
  import static org.apache.openmeetings.web.pages.install.TestInstall.resetH2Home;
  import static org.apache.openmeetings.web.pages.install.TestInstall.setH2Home;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.adminUsername;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.email;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.group;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.setOmHome;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.userpass;
  import static org.junit.jupiter.api.Assertions.assertTrue;
  import static org.junit.jupiter.api.Assertions.fail;
  
@@@ -42,6 -42,7 +42,9 @@@ import java.util.ArrayList
  import java.util.List;
  import java.util.UUID;
  
 -import org.apache.openmeetings.IsolatedTest;
++import org.apache.openmeetings.cli.Admin;
++import org.apache.openmeetings.cli.ExitException;
++import org.apache.openmeetings.web.test.IsolatedTest;
  import org.apache.wicket.Application;
  import org.apache.wicket.protocol.http.WebApplication;
  import org.junit.jupiter.api.AfterEach;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/cmdline/TestPatcher.java
index 149583f,194572c..34f787e
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/cmdline/TestPatcher.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/cmdline/TestPatcher.java
@@@ -16,18 -16,19 +16,20 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
--package org.apache.openmeetings.cli;
++package org.apache.openmeetings.cmdline;
  
- import static org.apache.openmeetings.AbstractSpringTest.setOmHome;
 -import static org.apache.openmeetings.AbstractOmServerTest.setOmHome;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.setOmHome;
  import static org.junit.jupiter.api.Assertions.assertEquals;
  
  import java.io.IOException;
  import java.util.TimeZone;
  
  import org.apache.openjpa.lib.util.Files;
 -import org.apache.openmeetings.IsolatedTest;
++import org.apache.openmeetings.cli.ConnectionPropertiesPatcher;
  import org.apache.openmeetings.util.ConnectionProperties;
--import org.apache.openmeetings.util.ConnectionProperties.DbType;
  import org.apache.openmeetings.util.OmFileHelper;
++import org.apache.openmeetings.util.ConnectionProperties.DbType;
++import org.apache.openmeetings.web.test.IsolatedTest;
  import org.apache.wicket.request.Url;
  import org.apache.wicket.request.mapper.parameter.PageParameters;
  import org.apache.wicket.request.mapper.parameter.PageParametersEncoder;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/config/TestConfig.java
index 9e45fbb,56bce75..9d29143
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/config/TestConfig.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/config/TestConfig.java
@@@ -24,8 -24,8 +24,8 @@@ import static org.junit.jupiter.api.Ass
  
  import java.util.List;
  
- import org.apache.openmeetings.AbstractJUnitDefaults;
 -import org.apache.openmeetings.AbstractOmServerTest;
  import org.apache.openmeetings.db.entity.basic.Configuration;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
  import org.junit.jupiter.api.Test;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/core/file/TestFileProcessor.java
index 5a0545f,e472b79..b056443
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/core/file/TestFileProcessor.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/core/file/TestFileProcessor.java
@@@ -28,12 -28,12 +28,12 @@@ import java.io.FileInputStream
  import java.io.InputStream;
  import java.util.Optional;
  
- import org.apache.openmeetings.AbstractJUnitDefaults;
 -import org.apache.openmeetings.AbstractOmServerTest;
  import org.apache.openmeetings.core.data.file.FileProcessor;
  import org.apache.openmeetings.db.dto.file.FileItemDTO;
  import org.apache.openmeetings.db.entity.file.BaseFileItem;
  import org.apache.openmeetings.db.entity.file.FileItem;
  import org.apache.openmeetings.util.process.ProcessResultList;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
  import org.junit.jupiter.api.Test;
  import org.springframework.beans.factory.annotation.Autowired;
  
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/domain/TestAddGroup.java
index 03d1726,18bc5c0..8ca2e08
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/domain/TestAddGroup.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/domain/TestAddGroup.java
@@@ -20,9 -20,9 +20,9 @@@ package org.apache.openmeetings.domain
  
  import static org.junit.jupiter.api.Assertions.assertNotNull;
  
- import org.apache.openmeetings.AbstractJUnitDefaults;
 -import org.apache.openmeetings.AbstractOmServerTest;
  import org.apache.openmeetings.db.entity.user.Group;
  import org.apache.openmeetings.db.entity.user.User;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
  import org.junit.jupiter.api.Test;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/domain/TestUserGroupAggregation.java
index 576757e,3aec7e8..57fd6ad
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/domain/TestUserGroupAggregation.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/domain/TestUserGroupAggregation.java
@@@ -21,9 -21,9 +21,9 @@@ package org.apache.openmeetings.domain
  import static org.junit.jupiter.api.Assertions.assertNotNull;
  import static org.junit.jupiter.api.Assertions.assertTrue;
  
- import org.apache.openmeetings.AbstractJUnitDefaults;
 -import org.apache.openmeetings.AbstractOmServerTest;
  import org.apache.openmeetings.db.entity.user.GroupUser;
  import org.apache.openmeetings.db.entity.user.User;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
  import org.junit.jupiter.api.Test;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/invitiation/TestInvitation.java
index ec508a2,bd5b349..a087402
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/invitiation/TestInvitation.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/invitiation/TestInvitation.java
@@@ -19,12 -19,12 +19,11 @@@
  package org.apache.openmeetings.invitiation;
  
  import static org.apache.openmeetings.util.CalendarHelper.getDate;
--import static org.junit.Assert.assertNotNull;
++import static org.junit.jupiter.api.Assertions.assertNotNull;
  
  import java.time.LocalDateTime;
  import java.util.Date;
  
- import org.apache.openmeetings.AbstractWicketTester;
 -import org.apache.openmeetings.AbstractWicketTesterTest;
  import org.apache.openmeetings.db.dao.room.RoomDao;
  import org.apache.openmeetings.db.entity.calendar.Appointment;
  import org.apache.openmeetings.db.entity.room.Invitation;
@@@ -33,6 -33,6 +32,7 @@@ import org.apache.openmeetings.db.entit
  import org.apache.openmeetings.db.entity.room.Room;
  import org.apache.openmeetings.db.entity.user.User;
  import org.apache.openmeetings.service.room.InvitationManager;
++import org.apache.openmeetings.web.test.AbstractWicketTesterTest;
  import org.junit.jupiter.api.Test;
  import org.springframework.beans.factory.annotation.Autowired;
  
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/ldap/TestLdap.java
index fe1296d,0f4e998..3cb675f
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/ldap/TestLdap.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/ldap/TestLdap.java
@@@ -52,13 -52,13 +52,13 @@@ import org.apache.directory.server.core
  import org.apache.directory.server.core.annotations.CreateDS;
  import org.apache.directory.server.core.annotations.CreatePartition;
  import org.apache.directory.server.protocol.shared.transport.Transport;
- import org.apache.openmeetings.AbstractWicketTester;
 -import org.apache.openmeetings.AbstractWicketTesterTest;
  import org.apache.openmeetings.core.ldap.LdapLoginManager;
  import org.apache.openmeetings.db.dao.server.LdapConfigDao;
  import org.apache.openmeetings.db.entity.server.LdapConfig;
  import org.apache.openmeetings.db.entity.user.User;
--import org.apache.openmeetings.util.OmException;
  import org.apache.openmeetings.web.app.WebSession;
++import org.apache.openmeetings.web.test.AbstractWicketTesterTest;
++import org.apache.openmeetings.util.OmException;
  import org.junit.jupiter.api.BeforeAll;
  import org.junit.jupiter.api.BeforeEach;
  import org.junit.jupiter.api.Test;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/smoke/TestSmokeBasic.java
index 361b090,073daec..953a4c9
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/smoke/TestSmokeBasic.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/smoke/TestSmokeBasic.java
@@@ -20,10 -20,10 +20,10 @@@ package org.apache.openmeetings.smoke
  
  import static org.junit.jupiter.api.Assertions.assertNotNull;
  
- import org.apache.openmeetings.AbstractJUnitDefaults;
 -import org.apache.openmeetings.AbstractOmServerTest;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
  import org.junit.jupiter.api.Test;
  
- class TestSmokeBasic extends AbstractJUnitDefaults {
+ class TestSmokeBasic extends AbstractOmServerTest {
  	@Test
  	void createErrorValueAndTest() {
  		assertNotNull(userDao.get(1L));
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserContact.java
index 6aeb394,2831699..e50ec6d
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserContact.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserContact.java
@@@ -19,9 -19,9 +19,9 @@@
  package org.apache.openmeetings.user;
  
  import static java.util.UUID.randomUUID;
++import static org.apache.openmeetings.web.app.WebSession.getUserId;
  import static org.apache.openmeetings.util.OpenmeetingsVariables.isSipEnabled;
  import static org.apache.openmeetings.util.OpenmeetingsVariables.setSipEnabled;
--import static org.apache.openmeetings.web.app.WebSession.getUserId;
  import static org.junit.jupiter.api.Assertions.assertFalse;
  import static org.junit.jupiter.api.Assertions.assertNotNull;
  import static org.junit.jupiter.api.Assertions.assertNull;
@@@ -29,11 -29,11 +29,11 @@@ import static org.junit.jupiter.api.Ass
  
  import java.util.List;
  
- import org.apache.openmeetings.AbstractWicketTester;
 -import org.apache.openmeetings.AbstractWicketTesterTest;
  import org.apache.openmeetings.db.entity.user.User;
++import org.apache.openmeetings.web.test.AbstractWicketTesterTest;
  import org.junit.jupiter.api.Test;
  
- class TestUserContact extends AbstractWicketTester {
+ class TestUserContact extends AbstractWicketTesterTest {
  
  	@Test
  	void testGetUser() {
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserCount.java
index f835642,73957e2..3a2fcb3
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserCount.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserCount.java
@@@ -23,12 -23,12 +23,12 @@@ import static org.apache.openmeetings.w
  import static org.junit.jupiter.api.Assertions.assertEquals;
  import static org.junit.jupiter.api.Assertions.assertTrue;
  
- import org.apache.openmeetings.AbstractWicketTester;
 -import org.apache.openmeetings.AbstractWicketTesterTest;
  import org.apache.openmeetings.db.entity.user.Group;
  import org.apache.openmeetings.db.entity.user.User;
++import org.apache.openmeetings.web.test.AbstractWicketTesterTest;
  import org.junit.jupiter.api.Test;
  
- class TestUserCount extends AbstractWicketTester {
+ class TestUserCount extends AbstractWicketTesterTest {
  	@Test
  	void testCountSearchUsers() throws Exception {
  		User u = createUser();
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserGroup.java
index d201a8b,f4c4683..ca7251f
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserGroup.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserGroup.java
@@@ -26,12 -26,12 +26,12 @@@ import static org.junit.jupiter.api.Ass
  
  import java.util.List;
  
- import org.apache.openmeetings.AbstractJUnitDefaults;
 -import org.apache.openmeetings.AbstractOmServerTest;
  import org.apache.openmeetings.db.dao.user.GroupUserDao;
  import org.apache.openmeetings.db.entity.user.Group;
  import org.apache.openmeetings.db.entity.user.GroupUser;
  import org.apache.openmeetings.db.entity.user.User;
  import org.apache.openmeetings.util.OmException;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
  import org.junit.jupiter.api.Tag;
  import org.junit.jupiter.api.Test;
  import org.springframework.beans.factory.annotation.Autowired;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/userdata/TestAuth.java
index 15a4808,b2a36aa..c69a094
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/userdata/TestAuth.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/userdata/TestAuth.java
@@@ -22,9 -22,9 +22,9 @@@ import static java.util.UUID.randomUUID
  import static org.junit.jupiter.api.Assertions.assertNotNull;
  import static org.junit.jupiter.api.Assertions.assertNull;
  
- import org.apache.openmeetings.AbstractJUnitDefaults;
 -import org.apache.openmeetings.AbstractOmServerTest;
  import org.apache.openmeetings.db.dao.server.SessiondataDao;
  import org.apache.openmeetings.db.entity.server.Sessiondata;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
  import org.junit.jupiter.api.Test;
  import org.springframework.beans.factory.annotation.Autowired;
  
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/userdata/TestLogin.java
index 7a6e834,43133d1..2f6f011
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/userdata/TestLogin.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/userdata/TestLogin.java
@@@ -20,12 -20,12 +20,12 @@@ package org.apache.openmeetings.userdat
  
  import static org.junit.jupiter.api.Assertions.assertNotNull;
  
- import org.apache.openmeetings.AbstractJUnitDefaults;
 -import org.apache.openmeetings.AbstractOmServerTest;
  import org.apache.openmeetings.db.entity.user.User;
  import org.apache.openmeetings.util.OmException;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
  import org.junit.jupiter.api.Test;
  
- class TestLogin extends AbstractJUnitDefaults {
+ class TestLogin extends AbstractOmServerTest {
  	@Test
  	void testTestLogin() throws OmException {
  		User us = userDao.login(adminUsername, userpass);
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/TestCalendar.java
index 80e4e33,16d5a97..3e8a71a
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestCalendar.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestCalendar.java
@@@ -25,11 -25,11 +25,11 @@@ import static org.junit.jupiter.api.Ass
  import java.time.LocalDateTime;
  import java.util.List;
  
- import org.apache.openmeetings.AbstractWicketTester;
 -import org.apache.openmeetings.AbstractWicketTesterTest;
  import org.apache.openmeetings.db.entity.calendar.Appointment;
  import org.apache.openmeetings.db.entity.user.User;
--import org.apache.openmeetings.util.OmException;
++import org.apache.openmeetings.web.test.AbstractWicketTesterTest;
  import org.apache.openmeetings.web.user.calendar.CalendarPanel;
++import org.apache.openmeetings.util.OmException;
  import org.apache.wicket.behavior.AbstractAjaxBehavior;
  import org.apache.wicket.util.tester.FormTester;
  import org.junit.jupiter.api.Test;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/TestMainAreas.java
index a24b3e2,e433169..222e95f
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestMainAreas.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestMainAreas.java
@@@ -40,8 -40,8 +40,6 @@@ import static org.junit.jupiter.api.Ass
  
  import java.util.function.Consumer;
  
- import org.apache.openmeetings.AbstractWicketTester;
 -import org.apache.openmeetings.AbstractWicketTesterTest;
--import org.apache.openmeetings.util.OmException;
  import org.apache.openmeetings.web.admin.backup.BackupPanel;
  import org.apache.openmeetings.web.admin.configurations.ConfigsPanel;
  import org.apache.openmeetings.web.admin.connection.ConnectionsPanel;
@@@ -60,12 -60,12 +58,14 @@@ import org.apache.openmeetings.web.page
  import org.apache.openmeetings.web.pages.install.InstallWizardPage;
  import org.apache.openmeetings.web.room.RoomPanel;
  import org.apache.openmeetings.web.room.wb.AbstractWbPanel;
++import org.apache.openmeetings.web.test.AbstractWicketTesterTest;
  import org.apache.openmeetings.web.user.calendar.CalendarPanel;
  import org.apache.openmeetings.web.user.dashboard.OmDashboardPanel;
  import org.apache.openmeetings.web.user.profile.EditProfilePanel;
  import org.apache.openmeetings.web.user.profile.MessagesContactsPanel;
  import org.apache.openmeetings.web.user.record.RecordingsPanel;
  import org.apache.openmeetings.web.user.rooms.RoomsSelectorPanel;
++import org.apache.openmeetings.util.OmException;
  import org.apache.openmeetings.web.util.OmUrlFragment.AreaKeys;
  import org.apache.wicket.authorization.UnauthorizedInstantiationException;
  import org.apache.wicket.behavior.AbstractAjaxBehavior;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/TestMainMenu.java
index adfd94c,344111d..33d60a9
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestMainMenu.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestMainMenu.java
@@@ -20,8 -20,8 +20,6 @@@ package org.apache.openmeetings.web
  
  import static org.junit.jupiter.api.Assertions.assertNotNull;
  
- import org.apache.openmeetings.AbstractWicketTester;
 -import org.apache.openmeetings.AbstractWicketTesterTest;
--import org.apache.openmeetings.util.OmException;
  import org.apache.openmeetings.web.admin.backup.BackupPanel;
  import org.apache.openmeetings.web.admin.configurations.ConfigsPanel;
  import org.apache.openmeetings.web.admin.connection.ConnectionsPanel;
@@@ -33,10 -33,10 +31,12 @@@ import org.apache.openmeetings.web.admi
  import org.apache.openmeetings.web.admin.rooms.RoomsPanel;
  import org.apache.openmeetings.web.admin.users.UsersPanel;
  import org.apache.openmeetings.web.common.BasePanel;
++import org.apache.openmeetings.web.test.AbstractWicketTesterTest;
  import org.apache.openmeetings.web.user.calendar.CalendarPanel;
  import org.apache.openmeetings.web.user.dashboard.OmDashboardPanel;
  import org.apache.openmeetings.web.user.record.RecordingsPanel;
  import org.apache.openmeetings.web.user.rooms.RoomsSelectorPanel;
++import org.apache.openmeetings.util.OmException;
  import org.apache.wicket.behavior.AbstractAjaxBehavior;
  import org.junit.jupiter.api.Test;
  
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/app/TestApplication.java
index 985d45b,0a305c0..5cefeb9
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/app/TestApplication.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/app/TestApplication.java
@@@ -29,11 -29,11 +29,11 @@@ import java.util.Locale
  import java.util.Map.Entry;
  import java.util.stream.Collectors;
  
- import org.apache.openmeetings.AbstractJUnitDefaults;
 -import org.apache.openmeetings.AbstractOmServerTest;
  import org.apache.openmeetings.db.dao.label.LabelDao;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
  import org.junit.jupiter.api.Test;
  
- class TestApplication extends AbstractJUnitDefaults {
+ class TestApplication extends AbstractOmServerTest {
  	@Test
  	void testMissing() {
  		assertEquals("[Missing]", app.getOmString("909", Locale.ENGLISH));
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/app/TestApplicationMocked.java
index 7d5fa53,fbeff05..554b0a9
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/app/TestApplicationMocked.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/app/TestApplicationMocked.java
@@@ -18,9 -18,10 +18,10 @@@
   */
  package org.apache.openmeetings.web.app;
  
--import static org.junit.Assert.assertEquals;
--import static org.junit.Assert.assertNull;
++import static org.junit.jupiter.api.Assertions.assertEquals;
++import static org.junit.jupiter.api.Assertions.assertNull;
  
 -import org.apache.openmeetings.RegularTest;
++import org.apache.openmeetings.web.test.RegularTest;
  import org.apache.wicket.request.Url;
  import org.junit.jupiter.api.Test;
  
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/app/TestOmAuthenticationStrategy.java
index a055f3c,8c0a7c1..d62c42b
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/app/TestOmAuthenticationStrategy.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/app/TestOmAuthenticationStrategy.java
@@@ -25,11 -25,11 +25,11 @@@ import static org.junit.jupiter.api.Ass
  
  import javax.servlet.http.Cookie;
  
- import org.apache.openmeetings.AbstractWicketTester;
 -import org.apache.openmeetings.AbstractWicketTesterTest;
  import org.apache.openmeetings.db.entity.user.User;
++import org.apache.openmeetings.web.test.AbstractWicketTesterTest;
  import org.junit.jupiter.api.Test;
  
- class TestOmAuthenticationStrategy extends AbstractWicketTester {
+ class TestOmAuthenticationStrategy extends AbstractWicketTesterTest {
  	@Test
  	void test() {
  		String encKey = randomUUID().toString();
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/app/TestUserManagerMocked.java
index b57c21e,6ac16bc..1e29e6d
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/app/TestUserManagerMocked.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/app/TestUserManagerMocked.java
@@@ -46,6 -47,6 +46,7 @@@ import org.apache.openmeetings.db.entit
  import org.apache.openmeetings.db.manager.IClientManager;
  import org.apache.openmeetings.service.mail.EmailManager;
  import org.apache.openmeetings.util.crypt.SCryptImplementation;
++import org.apache.openmeetings.web.test.RegularTest;
  import org.junit.jupiter.api.Test;
  import org.junit.jupiter.api.extension.ExtendWith;
  import org.mockito.InjectMocks;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/app/TestWebSession.java
index bfa1208,0c1ab7b..ef02f78
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/app/TestWebSession.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/app/TestWebSession.java
@@@ -22,12 -22,12 +22,12 @@@ import static org.junit.jupiter.api.Ass
  import static org.junit.jupiter.api.Assertions.assertTrue;
  import static org.junit.jupiter.api.Assertions.fail;
  
- import org.apache.openmeetings.AbstractWicketTester;
 -import org.apache.openmeetings.AbstractWicketTesterTest;
  import org.apache.openmeetings.db.entity.user.User;
  import org.apache.openmeetings.util.OmException;
++import org.apache.openmeetings.web.test.AbstractWicketTesterTest;
  import org.junit.jupiter.api.Test;
  
- class TestWebSession extends AbstractWicketTester {
+ class TestWebSession extends AbstractWicketTesterTest {
  	@Test
  	void testLogin() throws OmException {
  		WebSession ws = WebSession.get();
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/pages/TestHashPage.java
index 92e5195,fdab9aa..771b2cb
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/pages/TestHashPage.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/pages/TestHashPage.java
@@@ -25,12 -25,12 +25,11 @@@ import static org.apache.openmeetings.w
  import static org.apache.openmeetings.web.pages.HashPage.PANEL_MAIN;
  import static org.apache.openmeetings.web.pages.HashPage.PANEL_RECORDING;
  import static org.apache.openmeetings.web.util.OmUrlFragment.CHILD_ID;
- import static org.junit.Assert.assertTrue;
 -import static org.junit.Assert.assertEquals;
++import static org.junit.jupiter.api.Assertions.assertEquals;
  
  import java.util.Date;
  import java.util.UUID;
  
- import org.apache.openmeetings.AbstractWicketTester;
 -import org.apache.openmeetings.AbstractWicketTesterTest;
  import org.apache.openmeetings.db.dao.record.RecordingDao;
  import org.apache.openmeetings.db.dao.room.InvitationDao;
  import org.apache.openmeetings.db.dao.room.RoomDao;
@@@ -41,6 -41,6 +40,7 @@@ import org.apache.openmeetings.db.entit
  import org.apache.openmeetings.util.crypt.CryptProvider;
  import org.apache.openmeetings.web.common.MainPanel;
  import org.apache.openmeetings.web.room.RoomPanel;
++import org.apache.openmeetings.web.test.AbstractWicketTesterTest;
  import org.apache.openmeetings.web.user.record.VideoInfo;
  import org.apache.wicket.markup.html.WebMarkupContainer;
  import org.apache.wicket.markup.html.panel.Panel;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/pages/auth/TestLoginUI.java
index 1dfcd8e,7d943b1..add14c9
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/pages/auth/TestLoginUI.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/pages/auth/TestLoginUI.java
@@@ -32,13 -32,13 +32,13 @@@ import java.lang.reflect.Method
  import java.util.List;
  import java.util.Locale;
  
- import org.apache.openmeetings.AbstractWicketTester;
 -import org.apache.openmeetings.AbstractWicketTesterTest;
  import org.apache.openmeetings.db.entity.basic.Configuration;
  import org.apache.openmeetings.db.entity.user.User;
  import org.apache.openmeetings.web.app.WebSession;
  import org.apache.openmeetings.web.pages.ActivatePage;
  import org.apache.openmeetings.web.pages.MainPage;
  import org.apache.openmeetings.web.pages.ResetPage;
++import org.apache.openmeetings.web.test.AbstractWicketTesterTest;
  import org.apache.wicket.behavior.AbstractAjaxBehavior;
  import org.apache.wicket.extensions.markup.html.captcha.CaptchaImageResource;
  import org.apache.wicket.markup.html.image.Image;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/pages/install/TestInstall.java
index de2da84,a2f5d41..ce8fba3
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/pages/install/TestInstall.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/pages/install/TestInstall.java
@@@ -19,17 -19,18 +19,18 @@@
  package org.apache.openmeetings.web.pages.install;
  
  import static org.apache.commons.io.FileUtils.deleteQuietly;
- import static org.apache.openmeetings.AbstractJUnitDefaults.adminUsername;
- import static org.apache.openmeetings.AbstractJUnitDefaults.email;
- import static org.apache.openmeetings.AbstractJUnitDefaults.group;
- import static org.apache.openmeetings.AbstractJUnitDefaults.userpass;
- import static org.apache.openmeetings.AbstractWicketTester.checkErrors;
- import static org.apache.openmeetings.AbstractWicketTester.countErrors;
- import static org.apache.openmeetings.AbstractWicketTester.getWicketTester;
 -import static org.apache.openmeetings.AbstractOmServerTest.adminUsername;
 -import static org.apache.openmeetings.AbstractOmServerTest.email;
 -import static org.apache.openmeetings.AbstractOmServerTest.group;
 -import static org.apache.openmeetings.AbstractOmServerTest.setOmHome;
 -import static org.apache.openmeetings.AbstractOmServerTest.userpass;
 -import static org.apache.openmeetings.AbstractWicketTesterTest.checkErrors;
 -import static org.apache.openmeetings.AbstractWicketTesterTest.countErrors;
 -import static org.apache.openmeetings.AbstractWicketTesterTest.getWicketTester;
  import static org.apache.openmeetings.cli.ConnectionPropertiesPatcher.DEFAULT_DB_NAME;
  import static org.apache.openmeetings.db.util.ApplicationHelper.ensureApplication;
  import static org.apache.openmeetings.util.OpenmeetingsVariables.DEFAULT_APP_NAME;
  import static org.apache.openmeetings.util.OpenmeetingsVariables.setWicketApplicationName;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.adminUsername;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.email;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.group;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.setOmHome;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.userpass;
++import static org.apache.openmeetings.web.test.AbstractWicketTesterTest.checkErrors;
++import static org.apache.openmeetings.web.test.AbstractWicketTesterTest.countErrors;
++import static org.apache.openmeetings.web.test.AbstractWicketTesterTest.getWicketTester;
  import static org.junit.jupiter.api.Assertions.assertFalse;
  import static org.junit.jupiter.api.Assertions.assertNotNull;
  import static org.junit.jupiter.api.Assertions.assertTrue;
@@@ -41,13 -42,13 +42,13 @@@ import java.util.Locale
  import java.util.Random;
  import java.util.TimeZone;
  
- import org.apache.openmeetings.AbstractSpringTest;
- import org.apache.openmeetings.AbstractWicketTester;
 -import org.apache.openmeetings.AbstractWicketTesterTest;
 -import org.apache.openmeetings.IsolatedTest;
  import org.apache.openmeetings.cli.ConnectionPropertiesPatcher;
--import org.apache.openmeetings.util.ConnectionProperties.DbType;
  import org.apache.openmeetings.util.crypt.SCryptImplementation;
  import org.apache.openmeetings.web.app.Application;
  import org.apache.openmeetings.web.app.WebSession;
++import org.apache.openmeetings.web.test.AbstractWicketTesterTest;
++import org.apache.openmeetings.web.test.IsolatedTest;
++import org.apache.openmeetings.util.ConnectionProperties.DbType;
  import org.apache.wicket.ajax.AjaxClientInfoBehavior;
  import org.apache.wicket.behavior.AbstractAjaxBehavior;
  import org.apache.wicket.extensions.wizard.WizardButton;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/service/mail/TestEmailTemplate.java
index 9f0e26f,1476a8b..ec0259e
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/service/mail/TestEmailTemplate.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/service/mail/TestEmailTemplate.java
@@@ -16,13 -16,13 +16,19 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
--package org.apache.openmeetings.service.mail.template;
++package org.apache.openmeetings.web.service.mail;
  
  import static org.junit.jupiter.api.Assertions.assertFalse;
  
- import org.apache.openmeetings.AbstractWicketTester;
 -import org.apache.openmeetings.AbstractWicketTesterTest;
  import org.apache.openmeetings.db.entity.user.User;
  import org.apache.openmeetings.db.entity.user.UserContact;
++import org.apache.openmeetings.service.mail.template.FeedbackTemplate;
++import org.apache.openmeetings.service.mail.template.InvitationTemplate;
++import org.apache.openmeetings.service.mail.template.RegisterUserTemplate;
++import org.apache.openmeetings.service.mail.template.RequestContactConfirmTemplate;
++import org.apache.openmeetings.service.mail.template.RequestContactTemplate;
++import org.apache.openmeetings.service.mail.template.ResetPasswordTemplate;
++import org.apache.openmeetings.web.test.AbstractWicketTesterTest;
  import org.apache.wicket.util.string.Strings;
  import org.junit.jupiter.api.Test;
  import org.junit.jupiter.params.ParameterizedTest;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/service/mail/TestSubjTemplate.java
index 5d6e699,d579181..15f6d8d
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/service/mail/TestSubjTemplate.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/service/mail/TestSubjTemplate.java
@@@ -16,7 -16,7 +16,7 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
--package org.apache.openmeetings.service.mail.template.subject;
++package org.apache.openmeetings.web.service.mail;
  
  import static org.junit.jupiter.api.Assertions.assertFalse;
  import static org.junit.jupiter.api.Assertions.assertNotNull;
@@@ -29,11 -29,11 +29,19 @@@ import java.util.Locale
  import java.util.TimeZone;
  import java.util.function.Consumer;
  
- import org.apache.openmeetings.AbstractWicketTester;
 -import org.apache.openmeetings.AbstractWicketTesterTest;
  import org.apache.openmeetings.db.entity.calendar.Appointment;
  import org.apache.openmeetings.db.entity.record.Recording;
  import org.apache.openmeetings.db.entity.user.Group;
  import org.apache.openmeetings.db.entity.user.User;
++import org.apache.openmeetings.service.mail.template.subject.AppointmentReminderTemplate;
++import org.apache.openmeetings.service.mail.template.subject.CanceledAppointmentTemplate;
++import org.apache.openmeetings.service.mail.template.subject.CreatedAppointmentTemplate;
++import org.apache.openmeetings.service.mail.template.subject.InvitedAppointmentTemplate;
++import org.apache.openmeetings.service.mail.template.subject.NewGroupUsersNotificationTemplate;
++import org.apache.openmeetings.service.mail.template.subject.RecordingExpiringTemplate;
++import org.apache.openmeetings.service.mail.template.subject.SubjectEmailTemplate;
++import org.apache.openmeetings.service.mail.template.subject.UpdatedAppointmentTemplate;
++import org.apache.openmeetings.web.test.AbstractWicketTesterTest;
  import org.apache.wicket.util.string.Strings;
  import org.junit.jupiter.api.Test;
  
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/test/AbstractOmServerTest.java
index 3ac007f,b277a75..a8e6bb7
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/AbstractOmServerTest.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/AbstractOmServerTest.java
@@@ -16,7 -16,7 +16,7 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
--package org.apache.openmeetings;
++package org.apache.openmeetings.web.test;
  
  import static java.util.UUID.randomUUID;
  import static org.apache.openmeetings.db.util.ApplicationHelper.ensureApplication;
@@@ -39,7 -41,10 +41,10 @@@ import org.apache.openmeetings.db.entit
  import org.apache.openmeetings.db.entity.user.User;
  import org.apache.openmeetings.installation.ImportInitvalues;
  import org.apache.openmeetings.installation.InstallationConfig;
 -import org.apache.openmeetings.util.OmFileHelper;
  import org.apache.openmeetings.web.app.Application;
++import org.apache.openmeetings.util.OmFileHelper;
+ import org.apache.tomcat.util.scan.Constants;
+ import org.junit.jupiter.api.BeforeAll;
  import org.junit.jupiter.api.BeforeEach;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/test/AbstractWicketTesterTest.java
index 6285b75,773cbd1..519a9da
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/AbstractWicketTesterTest.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/AbstractWicketTesterTest.java
@@@ -16,7 -16,7 +16,7 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
--package org.apache.openmeetings;
++package org.apache.openmeetings.web.test;
  
  import static org.apache.openmeetings.db.util.ApplicationHelper.ensureApplication;
  import static org.apache.openmeetings.web.common.OmWebSocketPanel.CONNECTED_MSG;
@@@ -33,10 -33,10 +33,10 @@@ import java.util.function.Consumer
  
  import org.apache.openmeetings.db.entity.user.User;
  import org.apache.openmeetings.db.entity.user.User.Type;
--import org.apache.openmeetings.util.OmException;
  import org.apache.openmeetings.web.app.Application;
  import org.apache.openmeetings.web.app.WebSession;
  import org.apache.openmeetings.web.pages.MainPage;
++import org.apache.openmeetings.util.OmException;
  import org.apache.wicket.behavior.AbstractAjaxBehavior;
  import org.apache.wicket.feedback.ExactLevelFeedbackMessageFilter;
  import org.apache.wicket.feedback.FeedbackMessage;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/test/IsolatedTest.java
index 25e4d16,85a526a..c16a84f
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/IsolatedTest.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/IsolatedTest.java
@@@ -16,15 -16,17 +16,17 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
- package org.apache.openmeetings.calendar;
 -package org.apache.openmeetings;
++package org.apache.openmeetings.web.test;
  
- import org.apache.openmeetings.AbstractJUnitDefaults;
- import org.junit.jupiter.api.Test;
+ import java.lang.annotation.ElementType;
+ import java.lang.annotation.Retention;
+ import java.lang.annotation.RetentionPolicy;
+ import java.lang.annotation.Target;
  
- class TestDatabaseStructureMeetingMember extends AbstractJUnitDefaults {
+ import org.junit.jupiter.api.Tag;
  
- 	@Test
- 	void testUpdateMeetingMember(){
- 		//TODO add test
- 	}
+ @Target({ ElementType.TYPE, ElementType.METHOD })
+ @Retention(RetentionPolicy.RUNTIME)
+ @Tag("isolated")
+ public @interface IsolatedTest {
  }
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/test/RegularTest.java
index 7518278,73a8e94..a31d547
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/RegularTest.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/RegularTest.java
@@@ -16,20 -16,17 +16,17 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
- package org.apache.openmeetings.backup;
 -package org.apache.openmeetings;
++package org.apache.openmeetings.web.test;
  
- import java.io.Serializable;
+ import java.lang.annotation.ElementType;
+ import java.lang.annotation.Retention;
+ import java.lang.annotation.RetentionPolicy;
+ import java.lang.annotation.Target;
  
- public class ProgressHolder implements Serializable {
- 	private static final long serialVersionUID = 1L;
+ import org.junit.jupiter.api.Tag;
  
- 	private int progress;
- 
- 	public int getProgress() {
- 		return progress;
- 	}
- 
- 	public void setProgress(int progress) {
- 		this.progress = progress;
- 	}
+ @Target({ ElementType.TYPE, ElementType.METHOD })
+ @Retention(RetentionPolicy.RUNTIME)
+ @Tag("regular")
+ public @interface RegularTest {
  }
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/AbstractTestImport.java
index e0904e9,4f44062..8184803
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/AbstractTestImport.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/AbstractTestImport.java
@@@ -16,7 -16,7 +16,7 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
--package org.apache.openmeetings.backup;
++package org.apache.openmeetings.web.test.backup;
  
  import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_CRYPT;
  import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_PATH_FFMPEG;
@@@ -26,13 -26,13 +26,15 @@@ import static org.apache.openmeetings.u
  import static org.apache.openmeetings.util.OpenmeetingsVariables.getCryptClassName;
  import static org.junit.jupiter.api.Assertions.assertNotNull;
  
- import org.apache.openmeetings.AbstractJUnitDefaults;
 -import org.apache.openmeetings.AbstractOmServerTest;
++import org.apache.openmeetings.backup.BackupImport;
  import org.apache.openmeetings.db.entity.basic.Configuration;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
  import org.junit.jupiter.api.AfterEach;
  import org.junit.jupiter.api.BeforeEach;
  import org.springframework.beans.factory.annotation.Autowired;
  
- public class AbstractTestImport extends AbstractJUnitDefaults {
+ public class AbstractTestImport extends AbstractOmServerTest {
++	public static final String BACKUP_ROOT = "org/apache/openmeetings/backup/";
  	private String cryptClass = null;
  	@Autowired
  	protected BackupImport backupImport;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/TestExport.java
index 04bd0dc,8327cae..4c1c780
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/TestExport.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/TestExport.java
@@@ -16,12 -16,12 +16,12 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
--package org.apache.openmeetings.backup;
++package org.apache.openmeetings.web.test.backup;
  
  import static java.util.UUID.randomUUID;
  import static org.apache.openmeetings.db.bind.Constants.FILE_LIST_NODE;
  import static org.apache.openmeetings.db.bind.Constants.USER_LIST_NODE;
--import static org.junit.Assert.assertNotNull;
++import static org.junit.jupiter.api.Assertions.assertNotNull;
  
  import java.io.ByteArrayOutputStream;
  import java.io.File;
@@@ -33,19 -33,19 +33,18 @@@ import java.time.LocalDate
  import javax.xml.bind.JAXBContext;
  import javax.xml.bind.Marshaller;
  
- import org.apache.openmeetings.AbstractJUnitDefaults;
 -import org.apache.openmeetings.AbstractOmServerTest;
++import org.apache.openmeetings.backup.BackupExport;
  import org.apache.openmeetings.db.dao.file.FileItemDao;
  import org.apache.openmeetings.db.entity.file.BaseFileItem;
  import org.apache.openmeetings.db.entity.file.FileItem;
  import org.apache.openmeetings.db.entity.user.Group;
  import org.apache.openmeetings.db.entity.user.User;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
  import org.junit.jupiter.api.Assertions;
  import org.junit.jupiter.api.Test;
  import org.springframework.beans.factory.annotation.Autowired;
  
--import com.sun.xml.bind.marshaller.CharacterEscapeHandler;
--
- class TestExport extends AbstractJUnitDefaults {
+ class TestExport extends AbstractOmServerTest {
  	@Autowired
  	private FileItemDao fileItemDao;
  
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/TestImport.java
index 249e38b,249e38b..dccdbd3
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/TestImport.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/TestImport.java
@@@ -16,13 -16,13 +16,15 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
--package org.apache.openmeetings.backup;
++package org.apache.openmeetings.web.test.backup;
  
  import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_LDAP_ID;
  import static org.junit.jupiter.api.Assertions.assertEquals;
  
  import java.io.File;
  
++import org.apache.openmeetings.backup.BackupImport;
++import org.apache.openmeetings.backup.BackupVersion;
  import org.apache.openmeetings.db.dao.basic.ChatDao;
  import org.apache.openmeetings.db.dao.record.RecordingDao;
  import org.apache.openmeetings.db.dao.room.ExtraMenuDao;
@@@ -35,7 -35,7 +37,6 @@@ import org.junit.jupiter.api.Test
  import org.springframework.beans.factory.annotation.Autowired;
  
  class TestImport extends AbstractTestImport {
--	public static final String BACKUP_ROOT = "org/apache/openmeetings/backup/";
  	@Autowired
  	private LdapConfigDao ldapDao;
  	@Autowired
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/TestImportCalendar.java
index 46a759a,46a759a..f948c63
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/TestImportCalendar.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/TestImportCalendar.java
@@@ -16,9 -16,9 +16,9 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
--package org.apache.openmeetings.backup;
++package org.apache.openmeetings.web.test.backup;
  
--import static org.apache.openmeetings.backup.TestImport.BACKUP_ROOT;
++import static org.apache.openmeetings.web.test.backup.TestImport.BACKUP_ROOT;
  import static org.junit.jupiter.api.Assertions.assertEquals;
  
  import java.io.File;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/TestImportConfig.java
index de3c7b3,de3c7b3..527d3f4
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/TestImportConfig.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/TestImportConfig.java
@@@ -16,13 -16,13 +16,13 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
--package org.apache.openmeetings.backup;
++package org.apache.openmeetings.web.test.backup;
  
--import static org.apache.openmeetings.backup.TestImport.BACKUP_ROOT;
  import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REGISTER_FRONTEND;
  import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REGISTER_OAUTH;
  import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REGISTER_SOAP;
  import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REPLY_TO_ORGANIZER;
++import static org.apache.openmeetings.web.test.backup.TestImport.BACKUP_ROOT;
  import static org.junit.jupiter.api.Assertions.assertEquals;
  
  import java.io.File;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/TestImportOld.java
index 2d80d25,ce6aa5a..1f0d091
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/TestImportOld.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/TestImportOld.java
@@@ -16,9 -16,9 +16,8 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
--package org.apache.openmeetings.backup;
++package org.apache.openmeetings.web.test.backup;
  
--import static org.apache.openmeetings.backup.TestImport.BACKUP_ROOT;
  import static org.junit.jupiter.api.Assertions.assertEquals;
  import static org.junit.jupiter.api.Assertions.assertTrue;
  import static org.junit.jupiter.api.Assertions.fail;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/TestImportRoom.java
index e96f0f6,e96f0f6..2b2104d
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/TestImportRoom.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/TestImportRoom.java
@@@ -16,9 -16,9 +16,9 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
--package org.apache.openmeetings.backup;
++package org.apache.openmeetings.web.test.backup;
  
--import static org.apache.openmeetings.backup.TestImport.BACKUP_ROOT;
++import static org.apache.openmeetings.web.test.backup.TestImport.BACKUP_ROOT;
  import static org.junit.jupiter.api.Assertions.assertEquals;
  
  import java.io.File;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/TestImportUser.java
index 57b2023,57b2023..17f0a6d
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/TestImportUser.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/backup/TestImportUser.java
@@@ -16,15 -16,15 +16,16 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
--package org.apache.openmeetings.backup;
++package org.apache.openmeetings.web.test.backup;
  
--import static org.apache.openmeetings.backup.TestImport.BACKUP_ROOT;
++import static org.apache.openmeetings.web.test.backup.TestImport.BACKUP_ROOT;
  import static org.junit.jupiter.api.Assertions.assertEquals;
  import static org.junit.jupiter.api.Assertions.assertNotNull;
  
  import java.io.File;
  import java.util.List;
  
++import org.apache.openmeetings.backup.BackupException;
  import org.apache.openmeetings.db.dao.server.LdapConfigDao;
  import org.apache.openmeetings.db.entity.server.LdapConfig;
  import org.apache.openmeetings.db.entity.user.User;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/test/db/TestFileDao.java
index 058705d,6e9b0a4..dd40eb3
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/db/TestFileDao.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/db/TestFileDao.java
@@@ -16,20 -16,20 +16,20 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
--package org.apache.openmeetings.db.dao;
++package org.apache.openmeetings.web.test.db;
  
  import static org.junit.jupiter.api.Assertions.assertFalse;
  import static org.junit.jupiter.api.Assertions.assertNotNull;
  
  import java.util.List;
  
- import org.apache.openmeetings.AbstractJUnitDefaults;
 -import org.apache.openmeetings.AbstractOmServerTest;
  import org.apache.openmeetings.db.dao.file.FileItemDao;
  import org.apache.openmeetings.db.dao.user.GroupDao;
  import org.apache.openmeetings.db.entity.file.BaseFileItem;
  import org.apache.openmeetings.db.entity.file.FileItem;
  import org.apache.openmeetings.db.entity.user.Group;
  import org.apache.openmeetings.db.entity.user.User;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
  import org.junit.jupiter.api.Test;
  import org.springframework.beans.factory.annotation.Autowired;
  
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/test/db/TestRoomDao.java
index 30e02be,86ee4ca..7c18061
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/db/TestRoomDao.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/db/TestRoomDao.java
@@@ -16,7 -16,7 +16,7 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
--package org.apache.openmeetings.db.dao;
++package org.apache.openmeetings.web.test.db;
  
  import static org.junit.jupiter.api.Assertions.assertEquals;
  import static org.junit.jupiter.api.Assertions.assertFalse;
@@@ -26,11 -26,11 +26,11 @@@ import static org.junit.jupiter.api.Ass
  import java.util.HashSet;
  import java.util.Set;
  
- import org.apache.openmeetings.AbstractJUnitDefaults;
 -import org.apache.openmeetings.AbstractOmServerTest;
  import org.apache.openmeetings.db.dao.room.RoomDao;
  import org.apache.openmeetings.db.entity.room.Room;
  import org.apache.openmeetings.db.entity.room.Room.RoomElement;
  import org.apache.openmeetings.db.entity.user.User;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
  import org.junit.jupiter.api.Test;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/test/job/TestJob.java
index 89515a8,c2521fd..b4bb5d8
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/job/TestJob.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/test/job/TestJob.java
@@@ -16,11 -16,11 +16,11 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
--package org.apache.openmeetings.service.scheduler;
++package org.apache.openmeetings.web.test.job;
  
  import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_RSS;
  import static org.apache.openmeetings.util.OpenmeetingsVariables.setInitComplete;
--import static org.junit.Assert.assertNotNull;
++import static org.junit.jupiter.api.Assertions.assertNotNull;
  import static org.junit.jupiter.api.Assertions.assertTrue;
  import static org.mockito.ArgumentMatchers.anyString;
  import static org.mockito.Mockito.doAnswer;
@@@ -32,12 -32,12 +32,14 @@@ import java.time.ZoneId
  import java.util.Date;
  import java.util.List;
  
- import org.apache.openmeetings.AbstractWicketTester;
 -import org.apache.openmeetings.AbstractWicketTesterTest;
  import org.apache.openmeetings.core.mail.MailHandler;
  import org.apache.openmeetings.db.entity.basic.Configuration;
  import org.apache.openmeetings.db.entity.user.Group;
  import org.apache.openmeetings.db.entity.user.GroupUser;
  import org.apache.openmeetings.db.entity.user.User;
++import org.apache.openmeetings.service.scheduler.CleanupJob;
++import org.apache.openmeetings.service.scheduler.ReminderJob;
++import org.apache.openmeetings.web.test.AbstractWicketTesterTest;
  import org.junit.jupiter.api.Test;
  import org.junit.jupiter.api.extension.ExtendWith;
  import org.mockito.InjectMocks;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/util/TestDateTime.java
index 926c59a,b6500ca..5369890
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/util/TestDateTime.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/util/TestDateTime.java
@@@ -16,9 -16,9 +16,9 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
--package org.apache.openmeetings.util;
++package org.apache.openmeetings.web.util;
  
--import static org.junit.Assert.assertNotNull;
++import static org.junit.jupiter.api.Assertions.assertNotNull;
  import static org.junit.jupiter.api.Assertions.assertEquals;
  
  import java.text.SimpleDateFormat;
@@@ -29,9 -29,11 +29,11 @@@ import java.util.Calendar
  import java.util.Date;
  import java.util.Locale;
  
 -import org.apache.openmeetings.RegularTest;
  import org.apache.openmeetings.web.common.datetime.AbstractOmDateTimePicker;
++import org.apache.openmeetings.web.test.RegularTest;
  import org.junit.jupiter.api.Test;
  
+ @RegularTest
  class TestDateTime {
  
  	@Test
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/web/util/TestStoredFile.java
index ff343c3,4529a41..526c5f7
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/util/TestStoredFile.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/util/TestStoredFile.java
@@@ -16,7 -16,7 +16,7 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
--package org.apache.openmeetings.util;
++package org.apache.openmeetings.web.util;
  
  import static org.apache.openmeetings.util.OmFileHelper.getDefaultProfilePicture;
  import static org.junit.jupiter.api.Assertions.assertTrue;
@@@ -25,10 -25,10 +25,11 @@@ import java.io.File
  import java.io.FileNotFoundException;
  import java.io.IOException;
  
- import org.apache.openmeetings.AbstractJUnitDefaults;
 -import org.apache.openmeetings.AbstractOmServerTest;
++import org.apache.openmeetings.util.StoredFile;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
  import org.junit.jupiter.api.Test;
  
- class TestStoredFile extends AbstractJUnitDefaults {
+ class TestStoredFile extends AbstractOmServerTest {
  	@Test
  	void testPng() throws FileNotFoundException, IOException {
  		File f = getDefaultProfilePicture();
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/webservice/AbstractWebServiceTest.java
index 67cf812,e77fb4c..2e93793
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/AbstractWebServiceTest.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/AbstractWebServiceTest.java
@@@ -20,12 -20,11 +20,11 @@@ package org.apache.openmeetings.webserv
  
  import static java.util.UUID.randomUUID;
  import static javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED;
- import static org.apache.openmeetings.AbstractJUnitDefaults.createPass;
- import static org.apache.openmeetings.AbstractJUnitDefaults.ensureSchema;
- import static org.apache.openmeetings.AbstractJUnitDefaults.soapUsername;
- import static org.apache.openmeetings.AbstractJUnitDefaults.userpass;
 -import static org.apache.openmeetings.AbstractOmServerTest.createPass;
 -import static org.apache.openmeetings.AbstractOmServerTest.ensureSchema;
 -import static org.apache.openmeetings.AbstractOmServerTest.soapUsername;
 -import static org.apache.openmeetings.AbstractOmServerTest.userpass;
  import static org.apache.openmeetings.db.util.ApplicationHelper.ensureApplication;
- import static org.apache.openmeetings.util.OmFileHelper.getOmHome;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.createPass;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.ensureSchema;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.soapUsername;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.userpass;
  import static org.junit.jupiter.api.Assertions.assertEquals;
  import static org.junit.jupiter.api.Assertions.assertNotNull;
  
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/webservice/CreateTomcatExtension.java
index 0000000,b3bc927..d66fdbd
mode 000000,100644..100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/CreateTomcatExtension.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/CreateTomcatExtension.java
@@@ -1,0 -1,82 +1,82 @@@
+ /*
+  * 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.webservice;
+ 
+ import static java.util.UUID.randomUUID;
+ import static org.apache.openmeetings.util.OmFileHelper.getOmHome;
+ 
+ import java.io.File;
+ import java.net.InetAddress;
+ import java.nio.file.Files;
+ 
+ import org.apache.catalina.LifecycleState;
+ import org.apache.catalina.connector.Connector;
+ import org.apache.catalina.startup.Tomcat;
 -import org.apache.openmeetings.AbstractOmServerTest;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
+ import org.junit.jupiter.api.extension.BeforeAllCallback;
+ import org.junit.jupiter.api.extension.ExtensionContext;
+ 
+ public class CreateTomcatExtension implements BeforeAllCallback {
+ 	private String host;
+ 	private String context;
+ 	private int port = 8080;
+ 	private Tomcat tomcat;
+ 
+ 	public CreateTomcatExtension(String host, String context) {
+ 		this.host = host;
+ 		this.context = context;
+ 	}
+ 
+ 	@Override
+ 	public void beforeAll(ExtensionContext extContext) throws Exception {
+ 		if (tomcat == null) {
+ 			extContext.getRoot().getStore(ExtensionContext.Namespace.GLOBAL).put("my_report", new ExtensionContext.Store.CloseableResource() {
+ 				@Override
+ 				public void close() throws Throwable {
+ 					if (tomcat.getServer() != null && tomcat.getServer().getState() != LifecycleState.DESTROYED) {
+ 						if (tomcat.getServer().getState() != LifecycleState.STOPPED) {
+ 							tomcat.stop();
+ 						}
+ 						tomcat.destroy();
+ 					}
+ 				}
+ 			});
+ 			AbstractOmServerTest.init();
+ 			tomcat = new Tomcat();
+ 			Connector connector = new Connector("HTTP/1.1");
+ 			connector.setProperty("address", InetAddress.getByName(host).getHostAddress());
+ 			connector.setPort(0);
+ 			tomcat.getService().addConnector(connector);
+ 			tomcat.setConnector(connector);
+ 			File wd = Files.createTempDirectory("om" + randomUUID().toString()).toFile();
+ 			tomcat.setBaseDir(wd.getCanonicalPath());
+ 			tomcat.getHost().setAppBase(wd.getCanonicalPath());
+ 			tomcat.getHost().setAutoDeploy(false);
+ 			tomcat.getHost().setDeployOnStartup(false);
+ 			tomcat.addWebapp(context, getOmHome().getAbsolutePath());
+ 			tomcat.getConnector(); // to init the connector
+ 			tomcat.start();
+ 			port = tomcat.getConnector().getLocalPort();
+ 		}
+ 	}
+ 
+ 	public int getPort() {
+ 		return port;
+ 	}
+ }
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestCalendarService.java
index 18fdafa,ff962b0..7c984b6
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestCalendarService.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestCalendarService.java
@@@ -19,11 -19,11 +19,11 @@@
  package org.apache.openmeetings.webservice;
  
  import static java.util.UUID.randomUUID;
- import static org.apache.openmeetings.AbstractJUnitDefaults.ONE_HOUR;
- import static org.apache.openmeetings.AbstractJUnitDefaults.createPass;
- import static org.apache.openmeetings.AbstractJUnitDefaults.createUser;
- import static org.apache.openmeetings.AbstractJUnitDefaults.getAppointment;
- import static org.apache.openmeetings.AbstractJUnitDefaults.getUser;
 -import static org.apache.openmeetings.AbstractOmServerTest.ONE_HOUR;
 -import static org.apache.openmeetings.AbstractOmServerTest.createPass;
 -import static org.apache.openmeetings.AbstractOmServerTest.createUser;
 -import static org.apache.openmeetings.AbstractOmServerTest.getAppointment;
 -import static org.apache.openmeetings.AbstractOmServerTest.getUser;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.ONE_HOUR;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.createPass;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.createUser;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.getAppointment;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.getUser;
  import static org.junit.jupiter.api.Assertions.assertEquals;
  import static org.junit.jupiter.api.Assertions.assertFalse;
  import static org.junit.jupiter.api.Assertions.assertNotEquals;
@@@ -37,7 -37,7 +37,6 @@@ import java.util.List
  import javax.ws.rs.core.Form;
  import javax.ws.rs.core.Response;
  
- import org.apache.openmeetings.AbstractJUnitDefaults;
 -import org.apache.openmeetings.AbstractOmServerTest;
  import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
  import org.apache.openmeetings.db.dao.calendar.MeetingMemberDao;
  import org.apache.openmeetings.db.dao.room.InvitationDao;
@@@ -51,6 -51,6 +50,7 @@@ import org.apache.openmeetings.db.entit
  import org.apache.openmeetings.db.entity.calendar.MeetingMember;
  import org.apache.openmeetings.db.entity.room.Room;
  import org.apache.openmeetings.db.entity.user.User;
++import org.apache.openmeetings.web.test.AbstractOmServerTest;
  import org.apache.openmeetings.webservice.util.AppointmentParamConverter;
  import org.junit.jupiter.api.Test;
  
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestErrorService.java
index 2b4f875,42124d6..81233f5
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestErrorService.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestErrorService.java
@@@ -19,7 -19,7 +19,7 @@@
  package org.apache.openmeetings.webservice;
  
  import static java.util.UUID.randomUUID;
- import static org.apache.openmeetings.AbstractJUnitDefaults.rnd;
 -import static org.apache.openmeetings.AbstractOmServerTest.rnd;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.rnd;
  import static org.junit.jupiter.api.Assertions.assertEquals;
  import static org.junit.jupiter.api.Assertions.assertNotNull;
  
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestFileService.java
index 7a93bd5,4474b6f..d297299
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestFileService.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestFileService.java
@@@ -20,10 -20,10 +20,10 @@@ package org.apache.openmeetings.webserv
  
  import static java.nio.charset.StandardCharsets.UTF_8;
  import static java.util.UUID.randomUUID;
- import static org.apache.openmeetings.AbstractJUnitDefaults.UNIT_TEST_ARAB_EXT_TYPE;
- import static org.apache.openmeetings.AbstractJUnitDefaults.createUser;
- import static org.apache.openmeetings.AbstractJUnitDefaults.getUser;
 -import static org.apache.openmeetings.AbstractOmServerTest.UNIT_TEST_ARAB_EXT_TYPE;
 -import static org.apache.openmeetings.AbstractOmServerTest.createUser;
 -import static org.apache.openmeetings.AbstractOmServerTest.getUser;
--import static org.junit.Assert.assertFalse;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.UNIT_TEST_ARAB_EXT_TYPE;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.createUser;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.getUser;
++import static org.junit.jupiter.api.Assertions.assertFalse;
  import static org.junit.jupiter.api.Assertions.assertEquals;
  import static org.junit.jupiter.api.Assertions.assertNotNull;
  
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestGroupService.java
index 820c4a3,3b24400..8d79e4f
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestGroupService.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestGroupService.java
@@@ -18,8 -18,8 +18,8 @@@
   */
  package org.apache.openmeetings.webservice;
  
- import static org.apache.openmeetings.AbstractJUnitDefaults.adminUsername;
- import static org.apache.openmeetings.AbstractJUnitDefaults.userpass;
 -import static org.apache.openmeetings.AbstractOmServerTest.adminUsername;
 -import static org.apache.openmeetings.AbstractOmServerTest.userpass;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.adminUsername;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.userpass;
  import static org.junit.jupiter.api.Assertions.assertEquals;
  import static org.junit.jupiter.api.Assertions.assertFalse;
  import static org.junit.jupiter.api.Assertions.assertNotNull;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestRecordingService.java
index 142cd76,e237380..a7a4f46
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestRecordingService.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestRecordingService.java
@@@ -19,7 -19,7 +19,7 @@@
  package org.apache.openmeetings.webservice;
  
  import static java.util.UUID.randomUUID;
- import static org.apache.openmeetings.AbstractJUnitDefaults.getUser;
 -import static org.apache.openmeetings.AbstractOmServerTest.getUser;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.getUser;
  import static org.junit.jupiter.api.Assertions.assertFalse;
  import static org.junit.jupiter.api.Assertions.assertNotNull;
  import static org.junit.jupiter.api.Assertions.assertTrue;
diff --cc openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestUserService.java
index 104ab48,e3319ba..f2cf923
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestUserService.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestUserService.java
@@@ -20,11 -20,11 +20,11 @@@ package org.apache.openmeetings.webserv
  
  import static java.util.UUID.randomUUID;
  import static javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED;
- import static org.apache.openmeetings.AbstractJUnitDefaults.adminUsername;
- import static org.apache.openmeetings.AbstractJUnitDefaults.createPass;
- import static org.apache.openmeetings.AbstractJUnitDefaults.rnd;
- import static org.apache.openmeetings.AbstractJUnitDefaults.userpass;
 -import static org.apache.openmeetings.AbstractOmServerTest.adminUsername;
 -import static org.apache.openmeetings.AbstractOmServerTest.createPass;
 -import static org.apache.openmeetings.AbstractOmServerTest.rnd;
 -import static org.apache.openmeetings.AbstractOmServerTest.userpass;
  import static org.apache.openmeetings.db.util.ApplicationHelper.ensureApplication;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.adminUsername;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.createPass;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.rnd;
++import static org.apache.openmeetings.web.test.AbstractOmServerTest.userpass;
  import static org.junit.jupiter.api.Assertions.assertEquals;
  import static org.junit.jupiter.api.Assertions.assertFalse;
  import static org.junit.jupiter.api.Assertions.assertNotEquals;
@@@ -46,8 -46,8 +46,8 @@@ import org.apache.openmeetings.db.dto.u
  import org.apache.openmeetings.db.dto.user.UserDTO;
  import org.apache.openmeetings.db.entity.user.Address;
  import org.apache.openmeetings.db.entity.user.User;
--import org.apache.openmeetings.util.OmException;
  import org.apache.openmeetings.web.app.WebSession;
++import org.apache.openmeetings.util.OmException;
  import org.apache.wicket.util.string.StringValue;
  import org.apache.wicket.util.string.Strings;
  import org.junit.jupiter.api.Test;
diff --cc openmeetings-web/src/test/jetty/web.xml
index 1922c43,1922c43..2805d75
--- a/openmeetings-web/src/test/jetty/web.xml
+++ b/openmeetings-web/src/test/jetty/web.xml
@@@ -30,7 -30,7 +30,7 @@@
  		<param-value>1048576</param-value> <!-- 1MB by default -->
  	</context-param>
  	<listener>
--		<listener-class>org.apache.openmeetings.util.OMContextListener</listener-class>
++		<listener-class>org.apache.openmeetings.web.util.OMContextListener</listener-class>
  	</listener>
  
  	<filter>
diff --cc openmeetings-web/src/test/resources/org/apache/openmeetings/backup/config/configs.xml
index a1e5f24,a1e5f24..bf58577
--- a/openmeetings-web/src/test/resources/org/apache/openmeetings/backup/config/configs.xml
+++ b/openmeetings-web/src/test/resources/org/apache/openmeetings/backup/config/configs.xml
@@@ -28,7 -28,7 +28,7 @@@ see http://openmeetings.apache.org/Upgr
        <config>
           <id><![CDATA[1]]></id>
           <key><![CDATA[crypt_ClassName]]></key>
--         <value><![CDATA[org.apache.openmeetings.util.crypt.SHA256Implementation]]></value>
++         <value><![CDATA[org.apache.openmeetings.web.util.crypt.SHA256Implementation]]></value>
           <created class="java.util.Date"><![CDATA[1502426201301]]></created>
           <comment><![CDATA[This Class is used for Authentification-Crypting. Be carefull what you do here! If you change it while running previous Pass of users will not be workign anymore! for more Information see http://openmeetings.apache.org/CustomCryptMechanism.html]]></comment>
           <deleted><![CDATA[false]]></deleted>
@@@ -495,7 -495,7 +495,7 @@@
           <id><![CDATA[1]]></id>
           <type><![CDATA[string]]></type>
           <key><![CDATA[crypt.class.name]]></key>
--         <value><![CDATA[org.apache.openmeetings.util.crypt.SCryptImplementation]]></value>
++         <value><![CDATA[org.apache.openmeetings.web.util.crypt.SCryptImplementation]]></value>
           <comment><![CDATA[This Class is used for Authentification-Crypting. Be carefull what you do here! If you change it while running previous Pass of users will not be workign anymore! for more Information see http://openmeetings.apache.org/CustomCryptMechanism.html]]></comment>
        </config>
        <config>
diff --cc openmeetings-web/src/test/resources/org/apache/openmeetings/backup/config/skip/configs.xml
index 4534b62,4534b62..5a04fd1
--- a/openmeetings-web/src/test/resources/org/apache/openmeetings/backup/config/skip/configs.xml
+++ b/openmeetings-web/src/test/resources/org/apache/openmeetings/backup/config/skip/configs.xml
@@@ -27,7 -27,7 +27,7 @@@ see http://openmeetings.apache.org/Upgr
     <configs>
        <config>
           <id><![CDATA[1]]></id>
--         <value><![CDATA[org.apache.openmeetings.util.crypt.SHA256Implementation]]></value>
++         <value><![CDATA[org.apache.openmeetings.web.util.crypt.SHA256Implementation]]></value>
           <created class="java.util.Date"><![CDATA[1502426201301]]></created>
           <comment><![CDATA[This Class is used for Authentification-Crypting. Be carefull what you do here! If you change it while running previous Pass of users will not be workign anymore! for more Information see http://openmeetings.apache.org/CustomCryptMechanism.html]]></comment>
           <deleted><![CDATA[false]]></deleted>
@@@ -35,7 -35,7 +35,7 @@@
        <config>
           <id><![CDATA[1]]></id>
           <key><![CDATA[deleted_test]]></key>
--         <value><![CDATA[org.apache.openmeetings.util.crypt.SHA256Implementation]]></value>
++         <value><![CDATA[org.apache.openmeetings.web.util.crypt.SHA256Implementation]]></value>
           <created class="java.util.Date"><![CDATA[1502426201301]]></created>
           <comment><![CDATA[This Class is used for Authentification-Crypting. Be carefull what you do here! If you change it while running previous Pass of users will not be workign anymore! for more Information see http://openmeetings.apache.org/CustomCryptMechanism.html]]></comment>
           <deleted><![CDATA[true]]></deleted>
diff --cc openmeetings-webservice/src/main/java/module-info.java
index 350e96b,b3174f1..4953f4d
--- a/openmeetings-webservice/src/main/java/module-info.java
+++ b/openmeetings-webservice/src/main/java/module-info.java
@@@ -16,8 -16,14 +16,15 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
- package org.apache.openmeetings.test;
- 
- public @interface NonJenkinsTests {
 -package org.apache.openmeetings;
++module org.apache.openmeetings.webservice {
++	requires transitive org.apache.openmeetings.service;
  
 -import org.junit.jupiter.api.Test;
 -
 -class TestConnection {
 -
 -	@Test
 -	void testNoop() {
 -		//no-op
 -	}
++	requires java.jws;
++	requires java.ws.rs;
++	requires org.apache.cxf.core;
++	requires io.swagger.v3.oas.annotations;
++	requires org.apache.cxf.frontend.jaxrs;
++	requires java.desktop;
++	requires org.apache.pdfbox;
++	requires java.xml.ws;
  }
diff --cc pom.xml
index 90676e6,973f010..b1c4308
--- a/pom.xml
+++ b/pom.xml
@@@ -77,18 -77,19 +77,19 @@@
  		<forbiddenapis.version>3.1</forbiddenapis.version>
  		<maven-checkstyle-plugin.version>3.1.1</maven-checkstyle-plugin.version>
  		<frontend-maven-plugin.version>1.11.0</frontend-maven-plugin.version>
+ 		<swagger-plugin.version>2.1.6</swagger-plugin.version>
  		<!-- dependency versions -->
- 		<junit.version>5.8.0-M1</junit.version>
- 		<wicket.version>9.5.0-SNAPSHOT</wicket.version>
- 		<wicket-jquery-ui.version>9.3.2</wicket-jquery-ui.version>
- 		<wicketstuff.version>9.5.0-SNAPSHOT</wicketstuff.version>
- 		<wicket-bootstrap.version>5.0.5</wicket-bootstrap.version>
- 		<font-awesome.version>5.15.3</font-awesome.version>
- 		<spring.version>5.3.9</spring.version>
- 		<tomcat.version>9.0.50</tomcat.version>
- 		<ical4j.version>3.0.21</ical4j.version>
- 		<cxf.version>3.4.4</cxf.version>
- 		<io.prometheus.version>0.11.0</io.prometheus.version>
+ 		<junit.version>5.8.2</junit.version>
+ 		<wicket.version>9.7.0</wicket.version>
+ 		<wicket-jquery-ui.version>9.5.0</wicket-jquery-ui.version>
+ 		<wicketstuff.version>9.7.0</wicketstuff.version>
+ 		<wicket-bootstrap.version>6.0.0-M6-SNAPSHOT</wicket-bootstrap.version>
+ 		<font-awesome.version>5.15.4</font-awesome.version>
 -		<spring.version>5.3.13</spring.version>
++		<spring.version>5.3.14</spring.version>
+ 		<tomcat.version>9.0.56</tomcat.version>
 -		<ical4j.version>3.0.21</ical4j.version>
++		<ical4j.version>4.0.0-alpha10</ical4j.version>
+ 		<cxf.version>3.4.5</cxf.version>
 -		<io.prometheus.version>0.12.0</io.prometheus.version>
++		<io.prometheus.version>0.14.1</io.prometheus.version>
  		<aspectjtools.version>1.9.7</aspectjtools.version>
  		<simple-xml.version>2.7.1</simple-xml.version>
  		<jettison.version>1.4.1</jettison.version>
@@@ -96,37 -97,40 +97,41 @@@
  		<src.pack.skip>false</src.pack.skip>
  		<h2.version>1.4.200</h2.version>
  		<commons-lang3.version>3.12.0</commons-lang3.version>
--		<javax.mail.version>1.6.2</javax.mail.version>
- 		<openjpa.version>3.1.2</openjpa.version>
- 		<asterisk-java.version>3.12.0</asterisk-java.version>
- 		<commons-dbcp.version>2.8.0</commons-dbcp.version>
- 		<commons-pool2.version>2.10.0</commons-pool2.version>
- 		<commons-cli.version>1.4</commons-cli.version>
++		<jakarta.mail.version>2.0.1</jakarta.mail.version>
+ 		<openjpa.version>3.2.1-SNAPSHOT</openjpa.version>
 -		<asterisk-java.version>3.15.0</asterisk-java.version>
++		<asterisk-java.version>3.24.0</asterisk-java.version>
+ 		<commons-dbcp.version>2.9.0</commons-dbcp.version>
+ 		<commons-pool2.version>2.11.1</commons-pool2.version>
+ 		<commons-cli.version>1.5.0</commons-cli.version>
  		<dom4j.version>2.1.3</dom4j.version>
  		<commons-codec.version>1.15</commons-codec.version>
  		<commons-io.version>2.11.0</commons-io.version>
- 		<postgresql.version>42.2.23</postgresql.version>
- 		<mysql.version>8.0.25</mysql.version>
- 		<mssql.version>9.2.1.jre11</mssql.version>
- 		<ojdbc.version>19.11.0.0</ojdbc.version>
+ 		<postgresql.version>42.3.1</postgresql.version>
+ 		<mysql.version>8.0.27</mysql.version>
+ 		<mssql.version>9.4.0.jre11</mssql.version>
+ 		<ojdbc.version>19.12.0.0</ojdbc.version>
  		<commons-collections4.version>4.4</commons-collections4.version>
- 		<xstream.version>1.4.17</xstream.version>
+ 		<xstream.version>1.4.18</xstream.version>
  		<api-all.version>2.1.0</api-all.version>
--		<caldav4j.version>1.0.1</caldav4j.version>
- 		<tika-parsers.version>1.27</tika-parsers.version>
 -		<tika-parsers.version>2.1.0</tika-parsers.version>
++		<caldav4j.version>1.0.3</caldav4j.version>
++		<tika-parsers.version>2.2.0</tika-parsers.version>
  		<commons-text.version>1.9</commons-text.version>
- 		<slf4j.version>1.7.31</slf4j.version>
- 		<logback.version>1.2.3</logback.version>
- 		<jetty.version>9.4.43.v20210629</jetty.version>
+ 		<slf4j.version>1.7.32</slf4j.version>
 -		<logback.version>1.2.4</logback.version>
++		<logback.version>1.3.0-alpha10</logback.version>
+ 		<jetty.version>9.4.44.v20210927</jetty.version>
  		<license.excludedScopes>test</license.excludedScopes>
- 		<bcprov-jdk15on.version>1.69</bcprov-jdk15on.version>
- 		<mockito.version>3.11.2</mockito.version>
+ 		<bcprov-jdk15on.version>1.70</bcprov-jdk15on.version>
 -		<mockito.version>4.1.0</mockito.version>
++		<mockito.version>4.2.0</mockito.version>
  		<quartz.version>2.3.2</quartz.version>
- 		<kurento.version>6.16.1</kurento.version>
+ 		<kurento.version>6.16.2</kurento.version>
  		<jain-sip.version>1.2.307</jain-sip.version><!-- other versions are broken! -->
  		<jasny-bootstrap.version>3.1.3-2</jasny-bootstrap.version>
  		<jodconverter.version>4.4.2</jodconverter.version>
+ 		<jaxb-runtime.version>2.3.3</jaxb-runtime.version>
 +		<javax.servlet-api.version>3.1.0</javax.servlet-api.version>
+ 		<jquery-ui-touch-punch.version>0.2.3-2</jquery-ui-touch-punch.version>
+ 		<apacheds-test-framework.version>2.0.0.AM26</apacheds-test-framework.version>
+ 		<swagger.version>2.1.11</swagger.version>
  		<!--  Exclude all generated code  -->
  		<sonar.exclusions>file:**/generated-sources/**, file:**/jquery-ui.css, file:**/cssemoticons.js, file:**/bootstrap-confirmation.js</sonar.exclusions>
  		<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
@@@ -576,11 -596,11 +597,6 @@@
  			</dependency>
  			<dependency>
  				<groupId>io.prometheus</groupId>
--				<artifactId>simpleclient</artifactId>
--				<version>${io.prometheus.version}</version>
--			</dependency>
--			<dependency>
--				<groupId>io.prometheus</groupId>
  				<artifactId>simpleclient_servlet</artifactId>
  				<version>${io.prometheus.version}</version>
  			</dependency>
@@@ -590,11 -610,11 +606,6 @@@
  				<version>${aspectjtools.version}</version>
  			</dependency>
  			<dependency>
--				<groupId>org.apache.tomcat</groupId>
--				<artifactId>tomcat-catalina</artifactId>
--				<version>${tomcat.version}</version>
--			</dependency>
--			<dependency>
  				<groupId>org.codehaus.jettison</groupId>
  				<artifactId>jettison</artifactId>
  				<version>${jettison.version}</version>
@@@ -712,6 -771,204 +762,204 @@@
  				<version>${jain-sip.version}</version>
  			</dependency>
  			<dependency>
+ 				<!-- required for JAXB/CXF -->
+ 				<groupId>org.glassfish.jaxb</groupId>
+ 				<artifactId>jaxb-runtime</artifactId>
+ 				<version>${jaxb-runtime.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>org.webjars</groupId>
+ 				<artifactId>jquery-ui-touch-punch</artifactId>
+ 				<version>${jquery-ui-touch-punch.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>org.apache.commons</groupId>
+ 				<artifactId>commons-collections4</artifactId>
+ 				<version>${commons-collections4.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>com.thoughtworks.xstream</groupId>
+ 				<artifactId>xstream</artifactId>
+ 				<version>${xstream.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>org.apache.directory.api</groupId>
+ 				<artifactId>api-all</artifactId>
+ 				<version>${api-all.version}</version>
+ 				<exclusions>
+ 					<exclusion>
+ 						<groupId>xml-apis</groupId>
+ 						<artifactId>xml-apis</artifactId>
+ 					</exclusion>
+ 				</exclusions>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>com.sun.mail</groupId>
 -				<artifactId>javax.mail</artifactId>
 -				<version>${javax.mail.version}</version>
++				<artifactId>jakarta.mail</artifactId>
++				<version>${jakarta.mail.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>org.dom4j</groupId>
+ 				<artifactId>dom4j</artifactId>
+ 				<version>${dom4j.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>commons-codec</groupId>
+ 				<artifactId>commons-codec</artifactId>
+ 				<version>${commons-codec.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>commons-io</groupId>
+ 				<artifactId>commons-io</artifactId>
+ 				<version>${commons-io.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>org.wicketstuff</groupId>
+ 				<artifactId>wicketstuff-datastore-hazelcast</artifactId>
+ 				<version>${wicketstuff.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>org.apache.openjpa</groupId>
+ 				<artifactId>openjpa</artifactId>
+ 				<version>${openjpa.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>org.apache.commons</groupId>
+ 				<artifactId>commons-dbcp2</artifactId>
+ 				<version>${commons-dbcp.version}</version>
+ 				<exclusions>
+ 					<exclusion>
+ 						<groupId>commons-logging</groupId>
+ 						<artifactId>commons-logging</artifactId>
+ 					</exclusion>
+ 				</exclusions>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>org.apache.commons</groupId>
+ 				<artifactId>commons-pool2</artifactId>
+ 				<version>${commons-pool2.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>com.h2database</groupId>
+ 				<artifactId>h2</artifactId>
+ 				<version>${h2.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>org.postgresql</groupId>
+ 				<artifactId>postgresql</artifactId>
+ 				<version>${postgresql.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>com.microsoft.sqlserver</groupId>
+ 				<artifactId>mssql-jdbc</artifactId>
+ 				<version>${mssql.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>com.oracle.database.jdbc</groupId>
+ 				<artifactId>ojdbc10</artifactId>
+ 				<version>${ojdbc.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>commons-cli</groupId>
+ 				<artifactId>commons-cli</artifactId>
+ 				<version>${commons-cli.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>com.github.caldav4j</groupId>
+ 				<artifactId>caldav4j</artifactId>
+ 				<version>${caldav4j.version}</version>
+ 				<exclusions>
+ 					<exclusion>
+ 						<!-- Remove the need for ehcache, since we use the Methods directly -->
+ 						<groupId>net.sf.ehcache</groupId>
+ 						<artifactId>ehcache</artifactId>
+ 					</exclusion>
+ 				</exclusions>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>mysql</groupId>
+ 				<artifactId>mysql-connector-java</artifactId>
+ 				<version>${mysql.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>org.webjars</groupId>
+ 				<artifactId>jasny-bootstrap</artifactId>
+ 				<version>${jasny-bootstrap.version}</version>
+ 				<exclusions>
+ 					<exclusion>
+ 						<groupId>org.webjars</groupId>
+ 						<artifactId>bootstrap</artifactId>
+ 					</exclusion>
+ 				</exclusions>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>org.wicketstuff</groupId>
+ 				<artifactId>wicketstuff-dashboard-core</artifactId>
+ 				<version>${wicketstuff.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>com.googlecode.wicket-jquery-ui</groupId>
+ 				<artifactId>wicket-jquery-ui-core</artifactId>
+ 				<version>${wicket-jquery-ui.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>com.googlecode.wicket-jquery-ui</groupId>
+ 				<artifactId>wicket-jquery-ui</artifactId>
+ 				<version>${wicket-jquery-ui.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>com.googlecode.wicket-jquery-ui</groupId>
+ 				<artifactId>wicket-jquery-ui-calendar</artifactId>
+ 				<version>${wicket-jquery-ui.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>com.googlecode.wicket-jquery-ui</groupId>
+ 				<artifactId>wicket-jquery-ui-plugins</artifactId>
+ 				<version>${wicket-jquery-ui.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>org.wicketstuff</groupId>
+ 				<artifactId>wicketstuff-urlfragment</artifactId>
+ 				<version>${wicketstuff.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>org.wicketstuff</groupId>
+ 				<artifactId>wicketstuff-select2</artifactId>
+ 				<version>${wicketstuff.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>org.wicketstuff</groupId>
+ 				<artifactId>jqplot</artifactId>
+ 				<version>${wicketstuff.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>de.agilecoders.wicket</groupId>
+ 				<artifactId>wicket-bootstrap-extensions</artifactId>
+ 				<version>${wicket-bootstrap.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>de.agilecoders.wicket</groupId>
+ 				<artifactId>wicket-bootstrap-themes</artifactId>
+ 				<version>${wicket-bootstrap.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>org.webjars</groupId>
+ 				<artifactId>font-awesome</artifactId>
+ 				<version>${font-awesome.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>org.quartz-scheduler</groupId>
+ 				<artifactId>quartz</artifactId>
+ 				<version>${quartz.version}</version>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>io.swagger.core.v3</groupId>
+ 				<artifactId>swagger-annotations</artifactId>
+ 				<version>${swagger.version}</version>
+ 			</dependency>
+ 
+ 			<!-- TESTS -->
+ 			<dependency>
  				<groupId>org.mockito</groupId>
  				<artifactId>mockito-inline</artifactId>
  				<version>${mockito.version}</version>
@@@ -729,19 -986,37 +977,40 @@@
  				<version>${junit.version}</version>
  				<scope>test</scope>
  			</dependency>
+ 			<dependency>
++				<groupId>org.junit.jupiter</groupId>
++				<artifactId>junit-jupiter-engine</artifactId>
++				<version>${junit.version}</version>
++				<scope>test</scope>
++			</dependency>
++			<dependency>
+ 				<groupId>org.apache.directory.server</groupId>
+ 				<artifactId>apacheds-test-framework</artifactId>
+ 				<version>${apacheds-test-framework.version}</version>
+ 				<exclusions>
+ 					<exclusion>
+ 						<groupId>org.apache.directory.api</groupId>
+ 						<artifactId>api-ldap-schema-data</artifactId>
+ 					</exclusion>
++					<exclusion>
++						<groupId>junit</groupId>
++						<artifactId>junit</artifactId>
++					</exclusion>
+ 				</exclusions>
+ 				<scope>test</scope>
+ 			</dependency>
+ 			<dependency>
+ 				<groupId>org.apache.tomcat.embed</groupId>
+ 				<artifactId>tomcat-embed-websocket</artifactId>
+ 				<version>${tomcat.version}</version>
+ 				<scope>test</scope>
+ 			</dependency>
  		</dependencies>
  	</dependencyManagement>
  	<dependencies>
  		<dependency>
  			<groupId>org.junit.jupiter</groupId>
--			<artifactId>junit-jupiter-api</artifactId>
--			<version>${junit.version}</version>
--			<scope>test</scope>
--		</dependency>
--		<dependency>
--			<groupId>org.junit.jupiter</groupId>
  			<artifactId>junit-jupiter-engine</artifactId>
--			<version>${junit.version}</version>
  			<scope>test</scope>
  		</dependency>
  		<dependency>
@@@ -954,6 -1194,37 +1188,38 @@@
  				</plugin>
  				<plugin>
  					<groupId>org.apache.maven.plugins</groupId>
+ 					<artifactId>maven-checkstyle-plugin</artifactId>
+ 					<version>${maven-checkstyle-plugin.version}</version>
+ 					<configuration>
+ 						<checkstyleRules>
+ 							<module name = "Checker">
+ 								<property name="fileExtensions" value="java,js,css,xml"/>
+ 								<module name="NewlineAtEndOfFile">
+ 									<property name="fileExtensions" value="java"/>
+ 								</module>
+ 								<module name="TreeWalker">
+ 									<module name="UnusedImports"></module>
+ 									<module name="RegexpSinglelineJava">
+ 										<property name="format" value="^\t* "/>
+ 										<property name="message" value="Indent must use tab characters"/>
+ 										<property name="ignoreComments" value="true"/>
+ 									</module>
+ 								</module>
+ 								<module name="RegexpSingleline">
+ 									<property name="format" value="\s+$"/>
+ 									<property name="message" value="Line has trailing spaces."/>
+ 								</module>
+ 							</module>
+ 						</checkstyleRules>
+ 						<includeTestSourceDirectory>true</includeTestSourceDirectory>
+ 						<encoding>UTF-8</encoding>
+ 						<consoleOutput>true</consoleOutput>
+ 						<failsOnError>true</failsOnError>
++						<excludes>**/module-info.java,**/module-info.test</excludes>
+ 					</configuration>
+ 				</plugin>
+ 				<plugin>
+ 					<groupId>org.apache.maven.plugins</groupId>
  					<artifactId>maven-assembly-plugin</artifactId>
  					<version>${maven-assembly-plugin.version}</version>
  				</plugin>
@@@ -973,7 -1251,8 +1246,9 @@@
  					<version>${maven-surefire-plugin.version}</version>
  					<configuration>
  						<forkCount>1</forkCount>
- 						<reuseForks>false</reuseForks>
+ 						<reuseForks>true</reuseForks>
++						<useModulePath>false</useModulePath>
+ 						<excludedGroups>${excluded.test.groups}</excludedGroups>
  						<includes>
  							<include>**/Test*.java</include>
  						</includes>