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 2023/12/21 05:05:36 UTC

(openmeetings) branch jakarta-spring-6 updated (61929e70c -> b7d01a1ed)

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

solomax pushed a change to branch jakarta-spring-6
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


 discard 61929e70c [OPENMEETINGS-2756] dependencies are aligned to wicket-M2
 discard c3b1883d3 [OPENMEETINGS-2756] module-info is corrected
 discard 03101ec91 [OPENMEETINGS-2756] javadocs are fixed
 discard 0d5e36186 [OPENMEETINGS-2756] modules are restructured to remove 'test-jar'; Prometheus is updated to 1.0.0
 discard 338ccb401 [OPENMEETINGS-2756] custom-mimetypes.xml is moved to be searchable by Tika-3
 discard c73e65662 Build is green
 discard b30fb2c2d [OPENMEETINGS-2756] audio/video is fixed; version is bumped
 discard af089f598 [OPENMEETINGS-2756] property name is updated
 discard d5a7321f8 [OPENMEETINGS-2756] spring, tomcat, cxf and jetty are updated
 discard 85fa59141 [OPENMEETINGS-2756] JPMS branch is merged into this one
 discard 6626e0888 [OPENMEETINGS-2756] build is fixed; code clean-up some dependencies are updated
 discard fa02e741b [OPENMEETINGS-2756] jackrabbit-webdav maven coordinates are updated, bcprov is updated
 discard 60885b3c5 [OPENMEETINGS-2756] prometheus is back, code clean-up
 discard a65ee70ac [OPENMEETINGS-2756] build is green for me; trublemakers so far: wicket-ioc, prometheus, jackrabbit-webdav
 discard 2785317ac javax.annotation -> jakarta.annotation
 discard 254b4abc5 Project is compilable, tests are RED
 discard ebf2f8247 [OPENMEETINGS-2756] spring, cxf, tomcat, wicket
 discard e6314ade0 Some minor (incomplete) JPMS changes
 discard d9b7d015d no jira: unmerged file is fixed
 discard d85aae974 More work on JPMS
 discard 2be6300ed Build fixed
 discard ba1002dc4 Code clean-up
 discard cdbf02c4d The build is green
 discard 747de4dfb Some more work on modules
 discard b0871e4ec Another attempt to fix the build
 discard d17a6ab17 some compilation errors are resolved
 discard b7df4d43b OpenJpa modules were changed
 discard 7c6fba8c4 Simple-xml is dropped
 discard d95ae0a86 no jira: project is partially converted to use java11 modules
     add d22c4db7e [OPENMEETINGS-2770] jacoco, tomcat, tika, jaxb-runtime, apacheds-test and swagger
     add fddcade0a [OPENMEETINGS-2770] maven plugins
     add 996a092f8 [OPENMEETINGS-2770] junit, spring, tomcat, ical4j, commons-dbcp, commons-cli, commons-io, commons-text, bcprov, swagger; MySql, MSSQL, Oracle DB drivers; maven plugins
     add e7dd5ce79 [OPENMEETINGS-2770] wicket, wicketstuff, tomcat, aspectjtools, commons-lang3, commons-io, postgresql, logback, jodconverter, bytebuddy and plugins
     add 00cda58e9 [OPENMEETINGS-2770] compiler plugin
     add 7aff862c5 [OPENMEETINGS-2772] translations are updated
     add d2e858e02 no jira: Documentation is updated due to release
     new 172fff987 no jira: project is partially converted to use java11 modules
     new 6c43bbac4 Simple-xml is dropped
     new 456f9e030 OpenJpa modules were changed
     new 3260409c3 some compilation errors are resolved
     new f3245bbc1 Another attempt to fix the build
     new 9447020ea Some more work on modules
     new 6c8577f9d The build is green
     new 27ff8555c Code clean-up
     new c54542709 Build fixed
     new 3c75e266b More work on JPMS
     new 9369f86c3 no jira: unmerged file is fixed
     new efbfea517 Some minor (incomplete) JPMS changes
     new 513af2513 [OPENMEETINGS-2756] spring, cxf, tomcat, wicket
     new 5c116dfa8 Project is compilable, tests are RED
     new d07833f7e javax.annotation -> jakarta.annotation
     new 14bc429f1 [OPENMEETINGS-2756] build is green for me; trublemakers so far: wicket-ioc, prometheus, jackrabbit-webdav
     new ac55b5f90 [OPENMEETINGS-2756] prometheus is back, code clean-up
     new 8b1255332 [OPENMEETINGS-2756] jackrabbit-webdav maven coordinates are updated, bcprov is updated
     new f2d21b036 [OPENMEETINGS-2756] build is fixed; code clean-up some dependencies are updated
     new 42208b77d [OPENMEETINGS-2756] JPMS branch is merged into this one
     new 8b260daeb [OPENMEETINGS-2756] property name is updated
     new 4f282e02c [OPENMEETINGS-2756] audio/video is fixed; version is bumped
     new 8ed585358 Build is green
     new 11987636f [OPENMEETINGS-2756] custom-mimetypes.xml is moved to be searchable by Tika-3
     new d49cf591b [OPENMEETINGS-2756] modules are restructured to remove 'test-jar'; Prometheus is updated to 1.0.0
     new bbf0377e8 [OPENMEETINGS-2756] javadocs are fixed
     new d9e694f7f [OPENMEETINGS-2756] module-info is corrected
     new 5aac0901c [OPENMEETINGS-2756] dependencies are aligned to wicket-M2
     new b7d01a1ed [OPENMEETINGS-2756] the build seems to be fixed

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (61929e70c)
            \
             N -- N -- N   refs/heads/jakarta-spring-6 (b7d01a1ed)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

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


Summary of changes:
 CHANGELOG.md                                       |   20 +
 README.md                                          |   21 +-
 .../src/main/java/module-info.java                 |    3 +-
 openmeetings-server/src/site/xdoc/NewsArchive.xml  |   37 +
 openmeetings-server/src/site/xdoc/downloads.xml    |   30 +-
 openmeetings-server/src/site/xdoc/index.xml        |   24 +-
 openmeetings-service/pom.xml                       |    8 +-
 .../src/main/java/module-info.java                 |    9 +-
 .../jackrabbit/webdav/AbstractLocatorFactory.java  |  403 +++++
 .../webdav/ContentCodingAwareRequest.java          |   39 +
 .../apache/jackrabbit/webdav/DavCompliance.java    |   72 +
 .../org/apache/jackrabbit/webdav/DavConstants.java |  154 ++
 .../org/apache/jackrabbit/webdav/DavException.java |  175 +++
 .../jackrabbit/webdav/DavLocatorFactory.java       |   72 +
 .../org/apache/jackrabbit/webdav/DavMethods.java   |  410 ++++++
 .../org/apache/jackrabbit/webdav/DavResource.java  |  334 +++++
 .../jackrabbit/webdav/DavResourceFactory.java      |   46 +
 .../jackrabbit/webdav/DavResourceIterator.java     |   39 +
 .../jackrabbit/webdav/DavResourceIteratorImpl.java |   85 ++
 .../jackrabbit/webdav/DavResourceLocator.java      |  115 ++
 .../jackrabbit/webdav/DavServletRequest.java       |  199 +++
 .../jackrabbit/webdav/DavServletResponse.java      |  149 ++
 .../org/apache/jackrabbit/webdav/DavSession.java   |   62 +
 .../jackrabbit/webdav/DavSessionProvider.java      |   48 +
 .../org/apache/jackrabbit/webdav/MultiStatus.java  |  193 +++
 .../jackrabbit/webdav/MultiStatusResponse.java     |  486 ++++++
 .../java/org/apache/jackrabbit/webdav/Status.java  |  125 ++
 .../apache/jackrabbit/webdav/WebdavRequest.java    |   36 +
 .../jackrabbit/webdav/WebdavRequestContext.java    |   30 +
 .../jackrabbit/webdav/WebdavRequestImpl.java       | 1324 +++++++++++++++++
 .../apache/jackrabbit/webdav/WebdavResponse.java   |   42 +
 .../jackrabbit/webdav/WebdavResponseImpl.java      |  392 +++++
 .../jackrabbit/webdav/bind/BindConstants.java      |   52 +
 .../apache/jackrabbit/webdav/bind/BindInfo.java    |  108 ++
 .../jackrabbit/webdav/bind/BindServletRequest.java |   65 +
 .../jackrabbit/webdav/bind/BindableResource.java   |   50 +
 .../jackrabbit/webdav/bind/ParentElement.java      |  111 ++
 .../apache/jackrabbit/webdav/bind/ParentSet.java   |   45 +
 .../apache/jackrabbit/webdav/bind/RebindInfo.java  |  108 ++
 .../apache/jackrabbit/webdav/bind/UnbindInfo.java  |   90 ++
 .../jackrabbit/webdav/bind/package-info.java       |   18 +
 .../webdav/client/methods/BaseDavRequest.java      |  219 +++
 .../jackrabbit/webdav/client/methods/HttpBind.java |   54 +
 .../webdav/client/methods/HttpCheckin.java         |   51 +
 .../webdav/client/methods/HttpCheckout.java        |   51 +
 .../jackrabbit/webdav/client/methods/HttpCopy.java |   59 +
 .../webdav/client/methods/HttpDelete.java          |   43 +
 .../webdav/client/methods/HttpLabel.java           |   57 +
 .../jackrabbit/webdav/client/methods/HttpLock.java |  107 ++
 .../webdav/client/methods/HttpMerge.java           |   55 +
 .../webdav/client/methods/HttpMkcol.java           |   51 +
 .../webdav/client/methods/HttpMkworkspace.java     |   51 +
 .../jackrabbit/webdav/client/methods/HttpMove.java |   56 +
 .../webdav/client/methods/HttpOptions.java         |   79 +
 .../webdav/client/methods/HttpOrderpatch.java      |   53 +
 .../jackrabbit/webdav/client/methods/HttpPoll.java |   58 +
 .../webdav/client/methods/HttpPropfind.java        |   77 +
 .../webdav/client/methods/HttpProppatch.java       |  104 ++
 .../webdav/client/methods/HttpRebind.java          |   54 +
 .../webdav/client/methods/HttpReport.java          |   66 +
 .../webdav/client/methods/HttpSearch.java          |   54 +
 .../webdav/client/methods/HttpSubscribe.java       |   88 ++
 .../webdav/client/methods/HttpUnbind.java          |   54 +
 .../webdav/client/methods/HttpUnlock.java          |   55 +
 .../webdav/client/methods/HttpUnsubscribe.java     |   53 +
 .../webdav/client/methods/HttpUpdate.java          |   54 +
 .../webdav/client/methods/HttpVersionControl.java  |   51 +
 .../webdav/client/methods/XmlEntity.java           |   68 +
 .../webdav/client/methods/package-info.java        |   31 +
 .../jackrabbit/webdav/header/CodedUrlHeader.java   |  113 ++
 .../jackrabbit/webdav/header/DepthHeader.java      |  128 ++
 .../jackrabbit/webdav/header/FieldValueParser.java |   55 +
 .../apache/jackrabbit/webdav/header/Header.java    |   27 +
 .../apache/jackrabbit/webdav/header/IfHeader.java  |  905 ++++++++++++
 .../jackrabbit/webdav/header/LabelHeader.java      |   61 +
 .../jackrabbit/webdav/header/OverwriteHeader.java  |   75 +
 .../webdav/header/PollTimeoutHeader.java           |   52 +
 .../jackrabbit/webdav/header/TimeoutHeader.java    |  104 ++
 .../jackrabbit/webdav/header/package-info.java     |   18 +
 .../apache/jackrabbit/webdav/io/InputContext.java  |   78 +
 .../jackrabbit/webdav/io/InputContextImpl.java     |   98 ++
 .../apache/jackrabbit/webdav/io/OutputContext.java |   82 ++
 .../jackrabbit/webdav/io/OutputContextImpl.java    |   88 ++
 .../apache/jackrabbit/webdav/io/package-info.java  |   18 +
 .../jackrabbit/webdav/lock/AbstractActiveLock.java |   86 ++
 .../jackrabbit/webdav/lock/AbstractLockEntry.java  |   47 +
 .../apache/jackrabbit/webdav/lock/ActiveLock.java  |  124 ++
 .../jackrabbit/webdav/lock/DefaultActiveLock.java  |  147 ++
 .../jackrabbit/webdav/lock/LockDiscovery.java      |  233 +++
 .../apache/jackrabbit/webdav/lock/LockEntry.java   |   39 +
 .../apache/jackrabbit/webdav/lock/LockInfo.java    |  237 +++
 .../apache/jackrabbit/webdav/lock/LockManager.java |   87 ++
 .../org/apache/jackrabbit/webdav/lock/Scope.java   |  122 ++
 .../jackrabbit/webdav/lock/SimpleLockManager.java  |  233 +++
 .../jackrabbit/webdav/lock/SupportedLock.java      |  166 +++
 .../org/apache/jackrabbit/webdav/lock/Type.java    |  129 ++
 .../jackrabbit/webdav/lock/package-info.java       |   18 +
 .../webdav/observation/DefaultEventType.java       |  148 ++
 .../jackrabbit/webdav/observation/EventBundle.java |   29 +
 .../webdav/observation/EventDiscovery.java         |  121 ++
 .../jackrabbit/webdav/observation/EventType.java   |   30 +
 .../jackrabbit/webdav/observation/Filter.java      |   74 +
 .../webdav/observation/ObservationConstants.java   |  101 ++
 .../observation/ObservationDavServletRequest.java  |   54 +
 .../observation/ObservationDavServletResponse.java |   45 +
 .../webdav/observation/ObservationResource.java    |   72 +
 .../webdav/observation/Subscription.java           |   49 +
 .../webdav/observation/SubscriptionDiscovery.java  |  139 ++
 .../webdav/observation/SubscriptionInfo.java       |  242 +++
 .../webdav/observation/SubscriptionManager.java    |   69 +
 .../webdav/observation/package-info.java           |   18 +
 .../jackrabbit/webdav/ordering/OrderPatch.java     |  212 +++
 .../webdav/ordering/OrderingConstants.java         |  106 ++
 .../webdav/ordering/OrderingDavServletRequest.java |   55 +
 .../webdav/ordering/OrderingResource.java          |   47 +
 .../jackrabbit/webdav/ordering/OrderingType.java   |   52 +
 .../jackrabbit/webdav/ordering/Position.java       |  164 +++
 .../jackrabbit/webdav/ordering/package-info.java   |   18 +
 .../org/apache/jackrabbit/webdav/package-info.java |   18 +
 .../webdav/property/AbstractDavProperty.java       |  163 ++
 .../jackrabbit/webdav/property/DavProperty.java    |   71 +
 .../webdav/property/DavPropertyIterator.java       |   34 +
 .../webdav/property/DavPropertyName.java           |  206 +++
 .../webdav/property/DavPropertyNameIterator.java   |   28 +
 .../webdav/property/DavPropertyNameSet.java        |  203 +++
 .../jackrabbit/webdav/property/DavPropertySet.java |  300 ++++
 .../webdav/property/DefaultDavProperty.java        |  144 ++
 .../jackrabbit/webdav/property/HrefProperty.java   |  159 ++
 .../jackrabbit/webdav/property/PropContainer.java  |  120 ++
 .../jackrabbit/webdav/property/PropEntry.java      |   25 +
 .../jackrabbit/webdav/property/PropfindInfo.java   |   84 ++
 .../jackrabbit/webdav/property/ProppatchInfo.java  |  128 ++
 .../jackrabbit/webdav/property/ResourceType.java   |  205 +++
 .../jackrabbit/webdav/property/package-info.java   |   18 +
 .../jackrabbit/webdav/search/QueryGrammerSet.java  |  144 ++
 .../jackrabbit/webdav/search/SearchConstants.java  |   91 ++
 .../jackrabbit/webdav/search/SearchInfo.java       |  271 ++++
 .../jackrabbit/webdav/search/SearchResource.java   |   55 +
 .../jackrabbit/webdav/search/package-info.java     |   18 +
 .../jackrabbit/webdav/security/AclProperty.java    |  262 ++++
 .../jackrabbit/webdav/security/AclResource.java    |   70 +
 .../webdav/security/AclRestrictionsProperty.java   |  107 ++
 .../security/CurrentUserPrivilegeSetProperty.java  |   90 ++
 .../jackrabbit/webdav/security/Principal.java      |  189 +++
 .../jackrabbit/webdav/security/Privilege.java      |  204 +++
 .../webdav/security/SecurityConstants.java         |  110 ++
 .../webdav/security/SupportedPrivilege.java        |  139 ++
 .../security/SupportedPrivilegeSetProperty.java    |   95 ++
 .../jackrabbit/webdav/security/package-info.java   |   18 +
 .../security/report/AbstractSecurityReport.java    |   82 ++
 .../webdav/security/report/AclPrincipalReport.java |   96 ++
 .../security/report/PrincipalMatchReport.java      |  115 ++
 .../security/report/PrincipalSearchReport.java     |  184 +++
 .../security/report/SearchablePropertyReport.java  |  204 +++
 .../webdav/security/report/package-info.java       |   18 +
 .../webdav/server/AbstractWebdavServlet.java       | 1557 ++++++++++++++++++++
 .../webdav/server/WebdavRequestContextHolder.java  |   46 +
 .../webdav/server/WebdavRequestContextImpl.java    |   35 +
 .../jackrabbit/webdav/server/package-info.java     |   18 +
 .../webdav/transaction/TransactionConstants.java   |  125 ++
 .../transaction/TransactionDavServletRequest.java  |   51 +
 .../webdav/transaction/TransactionInfo.java        |  105 ++
 .../webdav/transaction/TransactionResource.java    |   59 +
 .../webdav/transaction/TxActiveLock.java           |   93 ++
 .../jackrabbit/webdav/transaction/TxLockEntry.java |   72 +
 .../webdav/transaction/TxLockManager.java          |   65 +
 .../webdav/transaction/package-info.java           |   18 +
 .../apache/jackrabbit/webdav/util/CSRFUtil.java    |  168 +++
 .../apache/jackrabbit/webdav/util/EncodeUtil.java  |  220 +++
 .../jackrabbit/webdav/util/HttpDateFormat.java     |   64 +
 .../webdav/util/HttpDateTimeFormatter.java         |  152 ++
 .../webdav/util/LinkHeaderFieldParser.java         |  197 +++
 .../jackrabbit/webdav/util/package-info.java       |   18 +
 .../webdav/version/ActivityResource.java           |   98 ++
 .../webdav/version/BaselineResource.java           |   81 +
 .../jackrabbit/webdav/version/DeltaVConstants.java |  374 +++++
 .../jackrabbit/webdav/version/DeltaVResource.java  |  111 ++
 .../webdav/version/DeltaVServletRequest.java       |   84 ++
 .../jackrabbit/webdav/version/LabelInfo.java       |  188 +++
 .../webdav/version/LabelSetProperty.java           |   63 +
 .../jackrabbit/webdav/version/MergeInfo.java       |  182 +++
 .../jackrabbit/webdav/version/OptionsInfo.java     |  126 ++
 .../jackrabbit/webdav/version/OptionsResponse.java |  144 ++
 .../webdav/version/SupportedMethodSetProperty.java |   63 +
 .../jackrabbit/webdav/version/UpdateInfo.java      |  243 +++
 .../webdav/version/VersionControlledResource.java  |  363 +++++
 .../webdav/version/VersionHistoryResource.java     |   73 +
 .../jackrabbit/webdav/version/VersionResource.java |  213 +++
 .../webdav/version/VersionableResource.java        |   64 +
 .../webdav/version/WorkspaceResource.java          |   94 ++
 .../jackrabbit/webdav/version/package-info.java    |   18 +
 .../webdav/version/report/AbstractReport.java      |   59 +
 .../version/report/CompareBaselineReport.java      |  188 +++
 .../version/report/ExpandPropertyReport.java       |  266 ++++
 .../report/LatestActivityVersionReport.java        |  151 ++
 .../version/report/LocateByHistoryReport.java      |  175 +++
 .../jackrabbit/webdav/version/report/Report.java   |   62 +
 .../webdav/version/report/ReportInfo.java          |  263 ++++
 .../webdav/version/report/ReportType.java          |  190 +++
 .../version/report/SupportedReportSetProperty.java |  119 ++
 .../webdav/version/report/VersionTreeReport.java   |  187 +++
 .../webdav/version/report/package-info.java        |   18 +
 .../webdav/xml/DavDocumentBuilderFactory.java      |   87 ++
 .../org/apache/jackrabbit/webdav/xml/DomUtil.java  |  839 +++++++++++
 .../jackrabbit/webdav/xml/ElementIterator.java     |  170 +++
 .../apache/jackrabbit/webdav/xml/Namespace.java    |   97 ++
 .../apache/jackrabbit/webdav/xml/ResultHelper.java |  458 ++++++
 .../jackrabbit/webdav/xml/XmlSerializable.java     |   38 +
 .../apache/jackrabbit/webdav/xml/package-info.java |   18 +
 .../apache/jackrabbit/webdav/statuscode.properties |   62 +
 openmeetings-util/src/main/java/module-info.java   |    4 +-
 openmeetings-web/src/main/java/module-info.java    |    9 +-
 .../web/app/Application.properties.xml             |    2 +-
 .../web/app/Application_ar.properties.xml          |    2 +-
 .../web/app/Application_bg.properties.xml          |    2 +-
 .../web/app/Application_bn.properties.xml          |    2 +-
 .../web/app/Application_ca.properties.xml          |    2 +-
 .../web/app/Application_cs.properties.xml          |    2 +-
 .../web/app/Application_da.properties.xml          |    2 +-
 .../web/app/Application_de.properties.xml          |    2 +-
 .../web/app/Application_el.properties.xml          |    2 +-
 .../web/app/Application_es.properties.xml          |    2 +-
 .../web/app/Application_fa.properties.xml          |    2 +-
 .../web/app/Application_fi.properties.xml          |    2 +-
 .../web/app/Application_fr.properties.xml          |    2 +-
 .../web/app/Application_gl.properties.xml          |    2 +-
 .../web/app/Application_he.properties.xml          |    2 +-
 .../web/app/Application_hi.properties.xml          |    2 +-
 .../web/app/Application_hu.properties.xml          |    2 +-
 .../web/app/Application_id.properties.xml          |    2 +-
 .../web/app/Application_it.properties.xml          |    2 +-
 .../web/app/Application_ja.properties.xml          |    2 +-
 .../web/app/Application_ko.properties.xml          |    2 +-
 .../web/app/Application_ku.properties.xml          |    2 +-
 .../web/app/Application_lo.properties.xml          |    2 +-
 .../web/app/Application_nl.properties.xml          |    2 +-
 .../web/app/Application_pl.properties.xml          |    2 +-
 .../web/app/Application_pt.properties.xml          |    2 +-
 .../web/app/Application_pt_BR.properties.xml       |    2 +-
 .../web/app/Application_ru.properties.xml          |    2 +-
 .../web/app/Application_sk.properties.xml          |    2 +-
 .../web/app/Application_sv.properties.xml          |    2 +-
 .../web/app/Application_ta.properties.xml          |    2 +-
 .../web/app/Application_th.properties.xml          |    2 +-
 .../web/app/Application_tk.properties.xml          |    2 +-
 .../web/app/Application_tr.properties.xml          |    2 +-
 .../web/app/Application_uk.properties.xml          |    2 +-
 .../web/app/Application_ur.properties.xml          |    2 +-
 .../web/app/Application_zh_CN.properties.xml       |    2 +-
 .../web/app/Application_zh_TW.properties.xml       |    2 +-
 .../ldap/CreateLdapServerExtension.java            |   67 -
 .../org/apache/openmeetings/ldap/TestLdap.java     |   29 +-
 .../openmeetings/web/db/dao/TestMessageDao.java    |    6 +-
 pom.xml                                            |   92 +-
 254 files changed, 26739 insertions(+), 201 deletions(-)
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/AbstractLocatorFactory.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/ContentCodingAwareRequest.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavCompliance.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavConstants.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavException.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavLocatorFactory.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavMethods.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavResource.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavResourceFactory.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavResourceIterator.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavResourceIteratorImpl.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavResourceLocator.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavServletRequest.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavServletResponse.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavSession.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavSessionProvider.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/MultiStatus.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/MultiStatusResponse.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/Status.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/WebdavRequest.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/WebdavRequestContext.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/WebdavRequestImpl.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/WebdavResponse.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/WebdavResponseImpl.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/BindConstants.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/BindInfo.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/BindServletRequest.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/BindableResource.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/ParentElement.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/ParentSet.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/RebindInfo.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/UnbindInfo.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/package-info.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/BaseDavRequest.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpBind.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCheckin.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCheckout.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCopy.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpDelete.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpLabel.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpLock.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMerge.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMkcol.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMkworkspace.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMove.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpOptions.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpOrderpatch.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpPoll.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpPropfind.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpProppatch.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpRebind.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpReport.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpSearch.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpSubscribe.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnbind.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnlock.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnsubscribe.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUpdate.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpVersionControl.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/XmlEntity.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/package-info.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/CodedUrlHeader.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/DepthHeader.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/FieldValueParser.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/Header.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/IfHeader.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/LabelHeader.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/OverwriteHeader.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/PollTimeoutHeader.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/TimeoutHeader.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/package-info.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/io/InputContext.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/io/InputContextImpl.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/io/OutputContext.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/io/OutputContextImpl.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/io/package-info.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/lock/AbstractActiveLock.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/lock/AbstractLockEntry.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/lock/ActiveLock.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/lock/DefaultActiveLock.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/lock/LockDiscovery.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/lock/LockEntry.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/lock/LockInfo.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/lock/LockManager.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/lock/Scope.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/lock/SimpleLockManager.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/lock/SupportedLock.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/lock/Type.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/lock/package-info.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/observation/DefaultEventType.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/observation/EventBundle.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/observation/EventDiscovery.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/observation/EventType.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/observation/Filter.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/observation/ObservationConstants.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/observation/ObservationDavServletRequest.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/observation/ObservationDavServletResponse.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/observation/ObservationResource.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/observation/Subscription.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/observation/SubscriptionDiscovery.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/observation/SubscriptionInfo.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/observation/SubscriptionManager.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/observation/package-info.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/ordering/OrderPatch.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/ordering/OrderingConstants.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/ordering/OrderingDavServletRequest.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/ordering/OrderingResource.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/ordering/OrderingType.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/ordering/Position.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/ordering/package-info.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/package-info.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/property/AbstractDavProperty.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/property/DavProperty.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/property/DavPropertyIterator.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/property/DavPropertyName.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/property/DavPropertyNameIterator.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/property/DavPropertyNameSet.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/property/DavPropertySet.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/property/DefaultDavProperty.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/property/HrefProperty.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/property/PropContainer.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/property/PropEntry.java
 create mode 100755 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/property/PropfindInfo.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/property/ProppatchInfo.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/property/ResourceType.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/property/package-info.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/search/QueryGrammerSet.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/search/SearchConstants.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/search/SearchInfo.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/search/SearchResource.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/search/package-info.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/security/AclProperty.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/security/AclResource.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/security/AclRestrictionsProperty.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/security/CurrentUserPrivilegeSetProperty.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/security/Principal.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/security/Privilege.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/security/SecurityConstants.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/security/SupportedPrivilege.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/security/SupportedPrivilegeSetProperty.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/security/package-info.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/security/report/AbstractSecurityReport.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/security/report/AclPrincipalReport.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/security/report/PrincipalMatchReport.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/security/report/PrincipalSearchReport.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/security/report/SearchablePropertyReport.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/security/report/package-info.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/server/AbstractWebdavServlet.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/server/WebdavRequestContextHolder.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/server/WebdavRequestContextImpl.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/server/package-info.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/transaction/TransactionConstants.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/transaction/TransactionDavServletRequest.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/transaction/TransactionInfo.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/transaction/TransactionResource.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/transaction/TxActiveLock.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/transaction/TxLockEntry.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/transaction/TxLockManager.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/transaction/package-info.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/util/CSRFUtil.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/util/EncodeUtil.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/util/HttpDateFormat.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/util/HttpDateTimeFormatter.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/util/LinkHeaderFieldParser.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/util/package-info.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/ActivityResource.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/BaselineResource.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/DeltaVConstants.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/DeltaVResource.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/DeltaVServletRequest.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/LabelInfo.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/LabelSetProperty.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/MergeInfo.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/OptionsInfo.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/OptionsResponse.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/SupportedMethodSetProperty.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/UpdateInfo.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/VersionControlledResource.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/VersionHistoryResource.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/VersionResource.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/VersionableResource.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/WorkspaceResource.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/package-info.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/report/AbstractReport.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/report/CompareBaselineReport.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/report/ExpandPropertyReport.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/report/LatestActivityVersionReport.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/report/LocateByHistoryReport.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/report/Report.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/report/ReportInfo.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/report/ReportType.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/report/SupportedReportSetProperty.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/report/VersionTreeReport.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/version/report/package-info.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/xml/DavDocumentBuilderFactory.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/xml/DomUtil.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/xml/ElementIterator.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/xml/Namespace.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/xml/ResultHelper.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/xml/XmlSerializable.java
 create mode 100644 openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/xml/package-info.java
 create mode 100644 openmeetings-service/src/main/resources/org/apache/jackrabbit/webdav/statuscode.properties
 delete mode 100644 openmeetings-web/src/test/java/org/apache/openmeetings/ldap/CreateLdapServerExtension.java


(openmeetings) 26/29: [OPENMEETINGS-2756] javadocs are fixed

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

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

commit bbf0377e836283d048432e0c0e7c15cc5371de70
Author: Maxim Solodovnik <so...@apache.org>
AuthorDate: Sun Oct 8 21:53:18 2023 +0700

    [OPENMEETINGS-2756] javadocs are fixed
---
 openmeetings-db/pom.xml | 4 ++--
 pom.xml                 | 4 ++++
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/openmeetings-db/pom.xml b/openmeetings-db/pom.xml
index ed2df7a38..dc4227624 100644
--- a/openmeetings-db/pom.xml
+++ b/openmeetings-db/pom.xml
@@ -115,7 +115,7 @@
 	</dependencies>
 	<build>
 		<plugins>
-			<!--plugin>
+			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-javadoc-plugin</artifactId>
 				<executions>
@@ -134,7 +134,7 @@
 						</goals>
 					</execution>
 				</executions>
-			</plugin-->
+			</plugin>
 			<plugin>
 				<groupId>org.apache.openjpa</groupId>
 				<artifactId>openjpa-maven-plugin</artifactId>
diff --git a/pom.xml b/pom.xml
index cb2a51203..88ebeee40 100644
--- a/pom.xml
+++ b/pom.xml
@@ -816,6 +816,10 @@
 						<groupId>org.apache.geronimo.specs</groupId>
 						<artifactId>geronimo-jta_1.1_spec</artifactId>
 					</exclusion>
+					<exclusion>
+						<groupId>org.apache.geronimo.specs</groupId>
+						<artifactId>geronimo-jms_1.1_spec</artifactId>
+					</exclusion>
 				</exclusions>
 			</dependency>
 			<dependency>


(openmeetings) 09/29: Build fixed

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

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

commit c5454270951991354f0a9796490478653a4d31af
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Tue May 17 10:51:32 2022 +0700

    Build fixed
---
 .../src/main/java/org/apache/openmeetings/backup/BackupImport.java      | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
index 0ac284644..8eeb5ab19 100644
--- a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
+++ b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
@@ -506,7 +506,7 @@ public class BackupImport {
 		}
 	}
 
-	void cleanup() {
+	public void cleanup() {
 		ldapMap.clear();
 		oauthMap.clear();
 		userMap.clear();


(openmeetings) 19/29: [OPENMEETINGS-2756] build is fixed; code clean-up some dependencies are updated

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

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

commit f2d21b03661841035bfe030804b389dea7fe82e5
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Thu Jul 27 19:03:39 2023 +0700

    [OPENMEETINGS-2756] build is fixed; code clean-up some dependencies are updated
---
 .../java/org/apache/openmeetings/db/dao/user/UserDao.java    |  1 -
 .../web/admin/backup/BackupUploadResourceReference.java      | 11 +++++++++--
 .../openmeetings/web/admin/connection/ConnectionsPanel.java  |  5 -----
 .../java/org/apache/openmeetings/web/common/MainPanel.java   |  2 --
 .../web/common/upload/UploadResourceReference.java           |  2 +-
 .../org/apache/openmeetings/web/pages/auth/SignInPage.java   |  2 --
 .../web/room/sidebar/RoomFileUploadResourceReference.java    |  9 +++++++--
 .../java/org/apache/openmeetings/web/user/MessageDialog.java |  2 --
 pom.xml                                                      | 12 ++++++++++++
 9 files changed, 29 insertions(+), 17 deletions(-)

diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
index aff76369c..9b2a51cc8 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
@@ -46,7 +46,6 @@ import java.util.Set;
 
 import jakarta.persistence.EntityManager;
 import jakarta.persistence.PersistenceContext;
-import jakarta.persistence.TypedQuery;
 import jakarta.persistence.criteria.CriteriaBuilder;
 import jakarta.persistence.criteria.CriteriaQuery;
 import jakarta.persistence.criteria.JoinType;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupUploadResourceReference.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupUploadResourceReference.java
index 12a579554..0c7f86973 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupUploadResourceReference.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupUploadResourceReference.java
@@ -21,13 +21,14 @@ package org.apache.openmeetings.web.admin.backup;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getApplicationName;
 import static org.apache.openmeetings.web.util.ThreadHelper.startRunnable;
 
+import java.io.IOException;
 import java.util.List;
 import java.util.Optional;
 import java.util.Timer;
 import java.util.TimerTask;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import org.apache.commons.fileupload2.FileItem;
+import org.apache.commons.fileupload2.core.FileItem;
 import org.apache.openmeetings.backup.BackupImport;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.user.User;
@@ -88,7 +89,13 @@ public class BackupUploadResourceReference extends UploadResourceReference {
 				log.error("Exception on panel backup download ", e);
 				sendError(c, uuid, e.getMessage() == null ? "Unexpected error" : e.getMessage());
 			} finally {
-				fileItems.forEach(FileItem::delete);
+				fileItems.forEach(fi -> {
+					try {
+						fi.delete();
+					} catch (IOException e) {
+						log.error("IOException while deleting FileItem ", e);
+					}
+				});
 				timer.cancel();
 			}
 			sendProgress(c, uuid, lastProgress, 100);
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
index a48306326..6c313514c 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
@@ -44,7 +44,6 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.markup.repeater.RepeatingView;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.openmeetings.mediaserver.KurentoHandler;
 import org.apache.openmeetings.mediaserver.StreamProcessor;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink;
@@ -58,11 +57,7 @@ public class ConnectionsPanel extends AdminBasePanel {
 	@Inject
 	private ClientManager cm;
 	@Inject
-	private KurentoHandler kHandler;
-	@Inject
 	private StreamProcessor streamProcessor;
-	@Inject
-	private IUserManager userManager;
 
 	public ConnectionsPanel(String id) {
 		super(id);
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
index f7b0a06ee..7e1e88fab 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
@@ -109,8 +109,6 @@ public class MainPanel extends Panel {
 	@Inject
 	private ClientManager cm;
 	@Inject
-	private ConfigurationDao cfgDao;
-	@Inject
 	private UserDao userDao;
 	@Inject
 	private RoomDao roomDao;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/upload/UploadResourceReference.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/upload/UploadResourceReference.java
index a669b6212..0d03e4a5a 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/upload/UploadResourceReference.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/upload/UploadResourceReference.java
@@ -29,7 +29,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 import jakarta.inject.Inject;
 import jakarta.ws.rs.core.MediaType;
 
-import org.apache.commons.fileupload2.FileItem;
+import org.apache.commons.fileupload2.core.FileItem;
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.web.app.Application;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
index 90d958acf..14644728e 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
@@ -109,8 +109,6 @@ public class SignInPage extends BaseInitedPage {
 	RegisterDialog r = new RegisterDialog("register");
 	private final OtpDialog otpDialog = new OtpDialog("otpDialog", Model.of());
 
-	@Inject
-	private ConfigurationDao cfgDao;
 	@Inject
 	private UserManager userManager;
 	@Inject
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFileUploadResourceReference.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFileUploadResourceReference.java
index 5fb346aaf..a77192847 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFileUploadResourceReference.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFileUploadResourceReference.java
@@ -21,12 +21,13 @@ package org.apache.openmeetings.web.room.sidebar;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.apache.openmeetings.web.util.ThreadHelper.startRunnable;
 
+import java.io.IOException;
 import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.DoubleConsumer;
 
-import org.apache.commons.fileupload2.FileItem;
+import org.apache.commons.fileupload2.core.FileItem;
 import org.apache.openmeetings.core.data.file.FileProcessor;
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.dao.file.FileItemDao;
@@ -149,7 +150,11 @@ public class RoomFileUploadResourceReference extends UploadResourceReference {
 				log.error("Unexpected error while processing uploaded file", e);
 				sendError(c, uuid, e.getMessage() == null ? "Unexpected error" : e.getMessage());
 			} finally {
-				curItem.delete();
+				try {
+					curItem.delete();
+				} catch (IOException e) {
+					log.error("IOException while deleting FileItem ", e);
+				}
 			}
 			currentSize += size;
 			sendProgress(c, uuid, progress, (int)(100 * currentSize / totalSize));
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
index 11a70d2db..750fc5a0f 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
@@ -96,8 +96,6 @@ public class MessageDialog extends Modal<PrivateMessage> {
 	@Inject
 	private UserDao userDao;
 	@Inject
-	private ConfigurationDao cfgDao;
-	@Inject
 	private AppointmentDao apptDao;
 	@Inject
 	private PrivateMessageDao msgDao;
diff --git a/pom.xml b/pom.xml
index 76519e36d..7b5a179e2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -82,6 +82,7 @@
 		<plexus-utils.version>3.5.1</plexus-utils.version>
 
 		<!-- dependency versions -->
+<<<<<<< HEAD
 		<junit.version>5.10.1</junit.version>
 		<wicket.version>10.0.0-M2</wicket.version>
 		<wicket-jquery-ui.version>10.0.0-M1</wicket-jquery-ui.version>
@@ -91,6 +92,17 @@
 		<tomcat.version>10.1.17</tomcat.version>
 		<ical4j.version>4.0.0-rc1</ical4j.version>
 		<cxf.version>4.0.3</cxf.version>
+=======
+		<junit.version>5.10.0</junit.version>
+		<wicket.version>10.0.0-M2-SNAPSHOT</wicket.version>
+		<wicket-jquery-ui.version>10.0.0-M1</wicket-jquery-ui.version>
+		<wicketstuff.version>10.0.0-M1</wicketstuff.version>
+		<wicket-bootstrap.version>7.0.0-SNAPSHOT</wicket-bootstrap.version>
+		<spring.version>6.0.11</spring.version>
+		<tomcat.version>10.1.11</tomcat.version>
+		<ical4j.version>4.0.0-beta9</ical4j.version>
+		<cxf.version>4.0.2</cxf.version>
+>>>>>>> 6626e0888 ([OPENMEETINGS-2756] build is fixed; code clean-up some dependencies are updated)
 		<io.prometheus.version>0.16.0</io.prometheus.version>
 		<aspectjtools.version>1.9.21</aspectjtools.version>
 		<simple-xml.version>2.7.1</simple-xml.version>


(openmeetings) 10/29: More work on JPMS

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

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

commit 3c75e266b10e7c27f439e49a6b0ee5b888e52e9c
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Thu Jul 14 15:48:18 2022 +0700

    More work on JPMS
---
 openmeetings-core/pom.xml                          |  1 -
 openmeetings-core/src/main/java/module-info.java   | 28 ++++++------
 openmeetings-db/pom.xml                            |  1 -
 openmeetings-db/src/main/java/module-info.java     | 13 +++---
 openmeetings-install/pom.xml                       |  1 -
 .../src/main/java/module-info.java                 | 15 ++++---
 openmeetings-mediaserver/pom.xml                   |  1 -
 .../src/main/java/module-info.java                 | 16 ++++---
 openmeetings-screenshare/pom.xml                   |  1 -
 openmeetings-server/pom.xml                        |  1 -
 openmeetings-service/pom.xml                       |  1 -
 .../src/main/java/module-info.java                 | 20 +++++----
 openmeetings-util/pom.xml                          |  1 -
 openmeetings-util/src/main/java/module-info.java   | 36 ++++++++--------
 openmeetings-util/src/test/java/module-info.test   | 30 ++++++++++++-
 openmeetings-web/pom.xml                           |  1 -
 openmeetings-web/src/main/java/module-info.java    | 50 ++++++++++++++++++++++
 .../openmeetings/web/admin/extra/ExtraPanel.java   |  2 +-
 .../util/logging/OpenMeetingsMetricsServlet.java   |  3 +-
 openmeetings-webservice/pom.xml                    |  1 -
 .../src/main/java/module-info.java                 | 20 ++++-----
 pom.xml                                            | 12 ------
 22 files changed, 162 insertions(+), 93 deletions(-)

diff --git a/openmeetings-core/pom.xml b/openmeetings-core/pom.xml
index ee4621d5a..4e7650dab 100644
--- a/openmeetings-core/pom.xml
+++ b/openmeetings-core/pom.xml
@@ -31,7 +31,6 @@
 	<description>Module for OpenMeetings core classes and services</description>
 	<properties>
 		<site.basedir>${project.parent.basedir}</site.basedir>
-		<autoModuleName>apache.openmeetings.core</autoModuleName>
 	</properties>
 	<build>
 		<plugins>
diff --git a/openmeetings-core/src/main/java/module-info.java b/openmeetings-core/src/main/java/module-info.java
index 6495df2b8..ec9973b40 100644
--- a/openmeetings-core/src/main/java/module-info.java
+++ b/openmeetings-core/src/main/java/module-info.java
@@ -17,28 +17,30 @@
  * 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.rss;
+	exports org.apache.openmeetings.core.sip;
+	exports org.apache.openmeetings.core.util;
+
+	requires transitive org.apache.openmeetings.db;
 
 	requires transitive org.apache.commons.io;
+	requires transitive java.annotation;
+	requires transitive java.xml;
 
-	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.parsers;
+	requires jakarta.mail;
 }
diff --git a/openmeetings-db/pom.xml b/openmeetings-db/pom.xml
index 5a6d49460..f037a424d 100644
--- a/openmeetings-db/pom.xml
+++ b/openmeetings-db/pom.xml
@@ -31,7 +31,6 @@
 	<description>OpenMeetings module for all Database/DTO related classes</description>
 	<properties>
 		<site.basedir>${project.parent.basedir}</site.basedir>
-		<autoModuleName>apache.openmeetings.db</autoModuleName>
 	</properties>
 	<dependencies>
 		<dependency>
diff --git a/openmeetings-db/src/main/java/module-info.java b/openmeetings-db/src/main/java/module-info.java
index aa1690d87..f65ad04b8 100644
--- a/openmeetings-db/src/main/java/module-info.java
+++ b/openmeetings-db/src/main/java/module-info.java
@@ -16,8 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-module apache.openmeetings.db {
+module org.apache.openmeetings.db {
 	exports org.apache.openmeetings;
+	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;
@@ -45,19 +47,20 @@ module apache.openmeetings.db {
 	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 java.xml.bind;
+	requires transitive org.apache.openjpa;
 	requires transitive spring.beans;
 	requires transitive spring.web;
 	requires transitive spring.core;
 
 	requires spring.tx;
 	requires javax.persistence;
-	requires openjpa;
-	requires java.xml.bind;
-	requires org.apache.commons.text;
 }
diff --git a/openmeetings-install/pom.xml b/openmeetings-install/pom.xml
index fd53d4ad0..963bf8cd4 100644
--- a/openmeetings-install/pom.xml
+++ b/openmeetings-install/pom.xml
@@ -31,7 +31,6 @@
 	<description>Module for OpenMeetings command line admin and classes necessary for installer.</description>
 	<properties>
 		<site.basedir>${project.parent.basedir}</site.basedir>
-		<autoModuleName>apache.openmeetings.install</autoModuleName>
 	</properties>
 	<dependencies>
 		<dependency>
diff --git a/openmeetings-util/src/test/java/module-info.test b/openmeetings-install/src/main/java/module-info.java
similarity index 71%
copy from openmeetings-util/src/test/java/module-info.test
copy to openmeetings-install/src/main/java/module-info.java
index 5987c837c..cb5c126f9 100644
--- a/openmeetings-util/src/test/java/module-info.test
+++ b/openmeetings-install/src/main/java/module-info.java
@@ -16,10 +16,15 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-module org.apache.openmeetings.util.test {
-	requires transitive org.apache.openmeetings.util;
 
-	//tests
-	requires org.junit.jupiter.engine;
-	requires org.junit.jupiter.api;
+module org.apache.openmeetings.install {
+	exports org.apache.openmeetings.backup;
+	exports org.apache.openmeetings.cli;
+	exports org.apache.openmeetings.installation;
+
+	requires transitive org.apache.openmeetings.core;
+	requires java.desktop;
+	requires commons.cli;
+	requires spring.context.support;
+	requires quartz;
 }
diff --git a/openmeetings-mediaserver/pom.xml b/openmeetings-mediaserver/pom.xml
index aeebd7592..dfe2c22fd 100644
--- a/openmeetings-mediaserver/pom.xml
+++ b/openmeetings-mediaserver/pom.xml
@@ -31,7 +31,6 @@
 	<description>Module for OpenMeetings MediaServer classes and services</description>
 	<properties>
 		<site.basedir>${project.parent.basedir}</site.basedir>
-		<autoModuleName>apache.openmeetings.mediaserver</autoModuleName>
 	</properties>
 	<dependencies>
 		<dependency>
diff --git a/openmeetings-util/src/test/java/module-info.test b/openmeetings-mediaserver/src/main/java/module-info.java
similarity index 71%
copy from openmeetings-util/src/test/java/module-info.test
copy to openmeetings-mediaserver/src/main/java/module-info.java
index 5987c837c..47ee94e67 100644
--- a/openmeetings-util/src/test/java/module-info.test
+++ b/openmeetings-mediaserver/src/main/java/module-info.java
@@ -16,10 +16,16 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-module org.apache.openmeetings.util.test {
-	requires transitive org.apache.openmeetings.util;
 
-	//tests
-	requires org.junit.jupiter.engine;
-	requires org.junit.jupiter.api;
+module org.apache.openmeetings.mediaserver {
+	exports org.apache.openmeetings.mediaserver;
+
+	requires transitive org.apache.openmeetings.core;
+	requires transitive org.apache.wicket.ioc;
+
+	requires kurento.client;
+	requires kurento.jsonrpc.client;
+	requires kurento.commons;
+	requires javax.inject;
+	requires com.google.gson;
 }
diff --git a/openmeetings-screenshare/pom.xml b/openmeetings-screenshare/pom.xml
index 31589b853..c7c819935 100644
--- a/openmeetings-screenshare/pom.xml
+++ b/openmeetings-screenshare/pom.xml
@@ -37,7 +37,6 @@
 		<key.alias>screen</key.alias>
 		<site.basedir>${project.parent.basedir}</site.basedir>
 		<jnlp.out.dir>${project.build.directory}/jnlp</jnlp.out.dir>
-		<autoModuleName>apache.openmeetings.screenshare</autoModuleName>
 	</properties>
 	<dependencies>
 		<dependency>
diff --git a/openmeetings-server/pom.xml b/openmeetings-server/pom.xml
index 6308dc322..e51a40415 100644
--- a/openmeetings-server/pom.xml
+++ b/openmeetings-server/pom.xml
@@ -40,7 +40,6 @@
 		<om.webapp>webapps/openmeetings</om.webapp>
 		<root.webapp>webapps/ROOT</root.webapp>
 		<server-file.dir>web-server</server-file.dir>
-		<autoModuleName>apache.openmeetings.server</autoModuleName>
 	</properties>
 	<url>https://openmeetings.apache.org</url>
 	<scm>
diff --git a/openmeetings-service/pom.xml b/openmeetings-service/pom.xml
index 9484861b8..f168b59d2 100644
--- a/openmeetings-service/pom.xml
+++ b/openmeetings-service/pom.xml
@@ -31,7 +31,6 @@
 	<description>Module for OpenMeetings schedulers, mail templates and managers.</description>
 	<properties>
 		<site.basedir>${project.parent.basedir}</site.basedir>
-		<autoModuleName>apache.openmeetings.service</autoModuleName>
 	</properties>
 	<dependencies>
 		<dependency>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/logging/OpenMeetingsMetricsServlet.java b/openmeetings-service/src/main/java/module-info.java
similarity index 62%
copy from openmeetings-web/src/main/java/org/apache/openmeetings/web/util/logging/OpenMeetingsMetricsServlet.java
copy to openmeetings-service/src/main/java/module-info.java
index 05c1555a6..2969affec 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/logging/OpenMeetingsMetricsServlet.java
+++ b/openmeetings-service/src/main/java/module-info.java
@@ -16,17 +16,19 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.web.util.logging;
 
-import io.prometheus.client.exporter.MetricsServlet;
+module org.apache.openmeetings.service {
+	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.room;
 
-public class OpenMeetingsMetricsServlet extends MetricsServlet {
+	requires transitive org.apache.openmeetings.core;
 
-	private static final long serialVersionUID = -2488393857088858502L;
-
-	public OpenMeetingsMetricsServlet() {
-		super();
-		new TomcatGenericExports(false).register();
-	}
+	requires transitive org.apache.wicket.spring;
 
+	requires org.apache.httpcomponents.httpcore;
+	requires org.apache.httpcomponents.httpclient;
+	requires jackrabbit.webdav;
+	requires caldav4j;
 }
diff --git a/openmeetings-util/pom.xml b/openmeetings-util/pom.xml
index dd5f0ea14..98ba695de 100644
--- a/openmeetings-util/pom.xml
+++ b/openmeetings-util/pom.xml
@@ -31,7 +31,6 @@
 	<description>Module for utility classes being used by all OpenMeetings modules</description>
 	<properties>
 		<site.basedir>${project.parent.basedir}</site.basedir>
-		<autoModuleName>apache.openmeetings.util</autoModuleName>
 	</properties>
 	<build>
 		<plugins>
diff --git a/openmeetings-util/src/main/java/module-info.java b/openmeetings-util/src/main/java/module-info.java
index ecd52506e..fdb492512 100644
--- a/openmeetings-util/src/main/java/module-info.java
+++ b/openmeetings-util/src/main/java/module-info.java
@@ -17,32 +17,30 @@
  * 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 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 org.apache.tika.core;
 	requires transitive spring.context;
-	requires transitive logback.classic;
-	requires transitive logback.core;
-	requires transitive dom4j;
-	requires transitive jcip.annotations;
-	requires simpleclient;
+	requires transitive org.apache.commons.codec;
 
-	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 org.bouncycastle.provider;
+	requires jakarta.activation;
+	requires org.mnode.ical4j.core;
+	requires org.aspectj.tools;
+	requires dom4j;
+	requires simpleclient;
+	requires ch.qos.logback.classic;
+	requires ch.qos.logback.core;
 }
diff --git a/openmeetings-util/src/test/java/module-info.test b/openmeetings-util/src/test/java/module-info.test
index 5987c837c..b65dab769 100644
--- a/openmeetings-util/src/test/java/module-info.test
+++ b/openmeetings-util/src/test/java/module-info.test
@@ -16,8 +16,34 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-module org.apache.openmeetings.util.test {
-	requires transitive org.apache.openmeetings.util;
+open module org.apache.openmeetings.util {
+	// This one should be in-sync with module-info.java
+	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.lang3;
+	requires transitive com.github.openjson;
+	requires transitive org.slf4j;
+	requires transitive javax.servlet.api;
+	requires transitive org.apache.tika.core;
+	requires transitive spring.context;
+	requires transitive org.apache.commons.codec;
+
+	requires org.bouncycastle.provider;
+	requires jakarta.activation;
+	requires org.mnode.ical4j.core;
+	requires org.aspectj.tools;
+	requires dom4j;
+	requires simpleclient;
+	requires ch.qos.logback.classic;
+	requires ch.qos.logback.core;
 
 	//tests
 	requires org.junit.jupiter.engine;
diff --git a/openmeetings-web/pom.xml b/openmeetings-web/pom.xml
index 2934a0201..74a95744c 100644
--- a/openmeetings-web/pom.xml
+++ b/openmeetings-web/pom.xml
@@ -32,7 +32,6 @@
 	<properties>
 		<old-backups.dir>${project.build.directory}/test-data</old-backups.dir>
 		<site.basedir>${project.parent.basedir}</site.basedir>
-		<autoModuleName>apache.openmeetings.web</autoModuleName>
 	</properties>
 	<profiles>
 		<profile>
diff --git a/openmeetings-web/src/main/java/module-info.java b/openmeetings-web/src/main/java/module-info.java
new file mode 100644
index 000000000..346ccc2c1
--- /dev/null
+++ b/openmeetings-web/src/main/java/module-info.java
@@ -0,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.install;
+	requires org.apache.openmeetings.mediaserver;
+	requires org.apache.openmeetings.webservice;
+
+	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 jqplot;
+	requires jqplot4java;
+	requires wicket.bootstrap.extensions;
+	requires wicket.bootstrap.core;
+	requires wicket.bootstrap.themes;
+	requires wicket.webjars;
+	requires wicket.jquery.ui;
+	requires wicket.jquery.ui.calendar;
+	requires wicket.jquery.ui.core;
+	requires wicket.jquery.ui.plugins;
+
+	requires java.net.http;
+	requires java.sql;
+	requires javax.websocket.api;
+	requires com.hazelcast.core;
+	requires org.danekja.jdk.serializable.functional;
+	requires spring.orm;
+	requires java.management;
+	requires simpleclient.servlet;
+}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraPanel.java
index 4d0b215e1..0152a6429 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraPanel.java
@@ -68,7 +68,7 @@ public class ExtraPanel extends AdminBasePanel {
 		};
 		add(list.add(dataView).setOutputMarkupId(true));
 		final PagedEntityListPanel navigator = new PagedEntityListPanel("navigator", dataView) {
-			private static final long serialVersionUID = -1L;
+			private static final long serialVersionUID = 1L;
 
 			@Override
 			protected void onEvent(AjaxRequestTarget target) {
diff --git 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
index 05c1555a6..1b9bdd531 100644
--- 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,7 @@ package org.apache.openmeetings.web.util.logging;
 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 --git a/openmeetings-webservice/pom.xml b/openmeetings-webservice/pom.xml
index d381c388d..cc357571b 100644
--- a/openmeetings-webservice/pom.xml
+++ b/openmeetings-webservice/pom.xml
@@ -31,7 +31,6 @@
 	<description>Module for OpenMeetings CXF based web services.</description>
 	<properties>
 		<site.basedir>${project.parent.basedir}</site.basedir>
-		<autoModuleName>apache.openmeetings.webservice</autoModuleName>
 	</properties>
 	<build>
 		<plugins>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/logging/OpenMeetingsMetricsServlet.java b/openmeetings-webservice/src/main/java/module-info.java
similarity index 70%
copy from openmeetings-web/src/main/java/org/apache/openmeetings/web/util/logging/OpenMeetingsMetricsServlet.java
copy to openmeetings-webservice/src/main/java/module-info.java
index 05c1555a6..9fa9d844d 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/logging/OpenMeetingsMetricsServlet.java
+++ b/openmeetings-webservice/src/main/java/module-info.java
@@ -16,17 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.web.util.logging;
 
-import io.prometheus.client.exporter.MetricsServlet;
+module org.apache.openmeetings.webservice {
+	requires transitive org.apache.openmeetings.service;
 
-public class OpenMeetingsMetricsServlet extends MetricsServlet {
-
-	private static final long serialVersionUID = -2488393857088858502L;
-
-	public OpenMeetingsMetricsServlet() {
-		super();
-		new TomcatGenericExports(false).register();
-	}
+	requires transitive java.ws.rs;
 
+	requires java.jws;
+	requires org.apache.cxf.core;
+	requires io.swagger.v3.oas.annotations;
+	requires org.apache.cxf.frontend.jaxrs;
+	requires org.apache.pdfbox;
+	requires java.desktop;
+	requires java.xml.ws;
 }
diff --git a/pom.xml b/pom.xml
index c6a051818..d5700cfa3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -38,7 +38,6 @@
 		<om.notquick.build>true</om.notquick.build>
 		<logback.console></logback.console>
 		<db>h2</db>
-		<autoModuleName>apache.openmeetings.parent</autoModuleName>
 		<jdk.version>17</jdk.version>
 		<minimalMavenBuildVersion>3.8.7</minimalMavenBuildVersion>
 		<minimalJavaBuildVersion>${jdk.version}</minimalJavaBuildVersion>
@@ -655,11 +654,6 @@
 				<artifactId>wicketstuff-datastore-hazelcast</artifactId>
 				<version>${wicketstuff.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>javax.servlet</groupId>
 				<artifactId>javax.servlet-api</artifactId>
@@ -812,11 +806,6 @@
 				<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>
@@ -1202,7 +1191,6 @@
 								<Built-On>${maven.build.timestamp}</Built-On>
 								<Git-Revision>${buildNumber}</Git-Revision>
 								<Product-Version>${project.version}</Product-Version>
-								<Automatic-Module-Name>${autoModuleName}</Automatic-Module-Name>
 							</manifestEntries>
 						</archive>
 					</configuration>


(openmeetings) 21/29: [OPENMEETINGS-2756] property name is updated

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

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

commit 8b260daeb493a2bd539bdeac668a1d53f3da8d03
Author: Maxim Solodovnik <so...@apache.org>
AuthorDate: Mon Sep 25 17:06:13 2023 +0700

    [OPENMEETINGS-2756] property name is updated
---
 .../src/main/java/org/apache/openmeetings/web/app/Application.java      | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git 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
index 9b90e162e..34c850eb7 100644
--- 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
@@ -167,7 +167,7 @@ public class Application extends AuthenticatedWebApplication implements IApplica
 	private static final Logger log = LoggerFactory.getLogger(Application.class);
 	private static boolean isInstalled;
 	private static final String INVALID_SESSIONS_KEY = "INVALID_SESSIONS_KEY";
-	private static final String SERVER_CONTAINER_SERVLET_CONTEXT_ATTRIBUTE = "javax.websocket.server.ServerContainer";
+	private static final String SERVER_CONTAINER_SERVLET_CONTEXT_ATTRIBUTE = "jakarta.websocket.server.ServerContainer";
 	public static final String NAME_ATTR_KEY = "name";
 	public static final String SERVER_URL_ATTR_KEY = "server.url";
 	//additional maps for faster searching should be created


(openmeetings) 18/29: [OPENMEETINGS-2756] jackrabbit-webdav maven coordinates are updated, bcprov is updated

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

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

commit 8b1255332fbb84cf9fcc960f5141e02aef842307
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Thu Apr 13 15:07:55 2023 +0700

    [OPENMEETINGS-2756] jackrabbit-webdav maven coordinates are updated, bcprov is updated
---
 openmeetings-service/pom.xml | 3 +--
 pom.xml                      | 8 ++++----
 2 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/openmeetings-service/pom.xml b/openmeetings-service/pom.xml
index 2a42181fe..9d7bece7a 100644
--- a/openmeetings-service/pom.xml
+++ b/openmeetings-service/pom.xml
@@ -55,8 +55,7 @@
 		</dependency>
 		<dependency>
 			<groupId>org.apache.jackrabbit</groupId>
-			<artifactId>jackrabbit-webdav</artifactId>
-			<classifier>jakarta</classifier>
+			<artifactId>jackrabbit-webdav-jakarta</artifactId>
 		</dependency>
 </dependencies>
 </project>
diff --git a/pom.xml b/pom.xml
index a52cfe531..76519e36d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -121,7 +121,8 @@
 		<xstream.version>1.4.20</xstream.version>
 		<api-all.version>2.1.5</api-all.version>
 		<caldav4j.version>1.0.5</caldav4j.version>
-		<tika-parsers.version>2.9.1</tika-parsers.version>
+		<jackrabbit-webdav.version>2.21.16-SNAPSHOT</jackrabbit-webdav.version>
+		<tika-parsers.version>3.0.0-BETA</tika-parsers.version>
 		<slf4j.version>2.0.9</slf4j.version>
 		<logback.version>1.4.14</logback.version>
 		<jetty.version>12.0.4</jetty.version>
@@ -897,9 +898,8 @@
 			</dependency>
 			<dependency>
 				<groupId>org.apache.jackrabbit</groupId>
-				<artifactId>jackrabbit-webdav</artifactId>
-				<version>2.21.15-SNAPSHOT</version>
-				<classifier>jakarta</classifier>
+				<artifactId>jackrabbit-webdav-jakarta</artifactId>
+				<version>${jackrabbit-webdav.version}</version>
 			</dependency>
 			<dependency>
 				<groupId>com.mysql</groupId>


(openmeetings) 16/29: [OPENMEETINGS-2756] build is green for me; trublemakers so far: wicket-ioc, prometheus, jackrabbit-webdav

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

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

commit 14bc429f153a1b3bdc77df24e5c760459b8fe9f4
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Tue Jan 17 20:55:46 2023 +0700

    [OPENMEETINGS-2756] build is green for me; trublemakers so far: wicket-ioc, prometheus, jackrabbit-webdav
---
 LICENSE                                            | 124 ---------------------
 openmeetings-core/pom.xml                          |   4 -
 openmeetings-install/pom.xml                       |   6 -
 .../src/site/xdoc/BuildInstructions.xml            |   6 +-
 openmeetings-web/pom.xml                           |   4 -
 pom.xml                                            |  12 --
 6 files changed, 3 insertions(+), 153 deletions(-)

diff --git a/LICENSE b/LICENSE
index 036575ded..3fd7d6e20 100644
--- a/LICENSE
+++ b/LICENSE
@@ -299,130 +299,6 @@ conditions of the following licenses.
 
 ======================================================================================================================
 
-For GlassFish components
-
-webapps/openmeetings/WEB-INF/lib/activation-*.jar
-webapps/openmeetings/WEB-INF/lib/javax.mail-1.6.0.jar
-
-
-COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
-
-1. Definitions.
-
-1.1. Contributor means each individual or entity that creates or contributes to the creation of Modifications.
-
-1.2. Contributor Version means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor.
-
-1.3. Covered Software means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof.
-
-1.4. Executable means the Covered Software in any form other than Source Code.
-
-1.5. Initial Developer means the individual or entity that first makes Original Software available under this License.
-
-1.6. Larger Work means a work which combines Covered Software or portions thereof with code not governed by the terms of this License.
-
-1.7. License means this document.
-
-1.8. Licensable means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein.
-
-1.9. Modifications means the Source Code and Executable form of any of the following:
-
-A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications;
-
-B. Any new file that contains any part of the Original Software or previous Modification; or
-
-C. Any new file that is contributed or otherwise made available under the terms of this License.
-
-1.10. Original Software means the Source Code and Executable form of computer software code that is originally released under this License.
-
-1.11. Patent Claims means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor.
-
-1.12. Source Code means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code.
-
-1.13. You (or Your) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, You includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, control means (a)�the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b)�ownership of more than fifty percent (50%) of the outstanding sh [...]
-
-2. License Grants.
-
-2.1. The Initial Developer Grant.
-Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license:
-(a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and
-(b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof).
-(c) The licenses granted in Sections�2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License.
-(d) Notwithstanding Section�2.1(b) above, no patent license is granted: (1)�for code that You delete from the Original Software, or (2)�for infringements caused by: (i)�the modification of the Original Software, or (ii)�the combination of the Original Software with other software or devices.
-
-2.2. Contributor Grant.
-Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license:
-(a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and
-(b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1)�Modifications made by that Contributor (or portions thereof); and (2)�the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination).
-(c) The licenses granted in Sections�2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party.
-(d) Notwithstanding Section�2.2(b) above, no patent license is granted: (1)�for any code that Contributor has deleted from the Contributor Version; (2)�for infringements caused by: (i)�third party modifications of Contributor Version, or (ii)�the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3)�under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor.
-
-3. Distribution Obligations.
-
-3.1. Availability of Source Code.
-
-Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software i [...]
-
-3.2. Modifications.
-
-The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License.
-
-3.3. Required Notices.
-You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer.
-
-3.4. Application of Additional Terms.
-You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such  [...]
-
-3.5. Distribution of Executable Versions.
-You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipients rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form un [...]
-
-3.6. Larger Works.
-You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software.
-
-4. Versions of the License.
-
-4.1. New Versions.
-Sun Microsystems, Inc. is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License.
-
-4.2. Effect of New Versions.
-
-You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which [...]
-4.3. Modified Versions.
-
-When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a)�rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b)�otherwise make it clear that the license contains terms which differ from this License.
-
-5. DISCLAIMER OF WARRANTY.
-
-COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN AS IS BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE C [...]
-
-6. TERMINATION.
-
-6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.
-
-6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as Participant) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights gran [...]
-
-6.3. In the event of termination under Sections�6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination.
-
-7. LIMITATION OF LIABILITY.
-
-UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL O [...]
-
-8. U.S. GOVERNMENT END USERS.
-
-The Covered Software is a commercial item, as that term is defined in 48�C.F.R.�2.101 (Oct. 1995), consisting of commercial computer software (as that term is defined at 48 C.F.R. �252.227-7014(a)(1)) and commercial computer software documentation as such terms are used in 48�C.F.R.�12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. T [...]
-
-9. MISCELLANEOUS.
-
-This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdictions conflict-of-law provisions. Any litigation r [...]
-
-10. RESPONSIBILITY FOR CLAIMS.
-
-As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.
-
-NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)
-The GlassFish code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California.
-
-======================================================================================================================
 
 For SLF4J:
 
diff --git a/openmeetings-core/pom.xml b/openmeetings-core/pom.xml
index 5c3f80689..7ad0bbb78 100644
--- a/openmeetings-core/pom.xml
+++ b/openmeetings-core/pom.xml
@@ -119,10 +119,6 @@
 			<artifactId>jakarta.activation</artifactId> <!-- required for jakarta.mail -->
 			<version>2.0.1</version>
 		</dependency>
-		<dependency>
-			<groupId>javax.annotation</groupId>
-			<artifactId>javax.annotation-api</artifactId>
-		</dependency>
 		<!-- Test dependencies -->
 		<dependency>
 			<groupId>org.junit.jupiter</groupId>
diff --git a/openmeetings-install/pom.xml b/openmeetings-install/pom.xml
index 963bf8cd4..f01dd5faa 100644
--- a/openmeetings-install/pom.xml
+++ b/openmeetings-install/pom.xml
@@ -53,12 +53,6 @@
 			<groupId>commons-cli</groupId>
 			<artifactId>commons-cli</artifactId>
 		</dependency>
-		<!-- FIXME TODO -->
-		<dependency>
-			<groupId>javax.activation</groupId>
-			<artifactId>activation</artifactId> <!-- required for CXF and for backup import/export (jaxb 2)-->
-			<version>1.1.1</version>
-		</dependency>
 		<dependency>
 			<groupId>org.apache.openmeetings</groupId>
 			<artifactId>openmeetings-util</artifactId>
diff --git a/openmeetings-server/src/site/xdoc/BuildInstructions.xml b/openmeetings-server/src/site/xdoc/BuildInstructions.xml
index c02c972e0..ed29ab634 100644
--- a/openmeetings-server/src/site/xdoc/BuildInstructions.xml
+++ b/openmeetings-server/src/site/xdoc/BuildInstructions.xml
@@ -63,10 +63,10 @@
 		<section name="Tips and Gotchas">
 			<p>Eclipse ANSI colors plugin for colors in console</p>
 			<source><![CDATA[
-MAVEN_OPTS='-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n' mvn clean -P allModules,quick,mysql jetty:run-exploded -Dwicket.configuration=DEVELOPMENT -Dwicket.ioc.useByteBuddy=true
+MAVEN_OPTS='-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n' mvn clean -P allModules,quick,mysql jetty:run-exploded -Dwicket.configuration=DEVELOPMENT
 
 #Quick rebuild and run
-cd ..; mvn clean install -PallModules,quick,mysql -pl openmeetings-util,openmeetings-core; cd openmeetings-web; MAVEN_OPTS='-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n' mvn clean -P allModules,quick,mysql jetty:run-exploded -Dwicket.configuration=DEVELOPMENT -Dwicket.ioc.useByteBuddy=true
+cd ..; mvn clean install -PallModules,quick,mysql -pl openmeetings-util,openmeetings-core; cd openmeetings-web; MAVEN_OPTS='-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n' mvn clean -P allModules,quick,mysql jetty:run-exploded -Dwicket.configuration=DEVELOPMENT
 
 			]]></source>
 			<p>Run OpenMeetings with Embedded Jetty for Development purpose in JDK17</p>
@@ -77,7 +77,7 @@ export MAVEN_OPTS='-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,s
 
 # Just run Webapp, requires other modules to be compiled separated if changed
 cd openmeetings-webapp
-mvn install -P allModules,quick,mysql jetty:run-exploded -Dwicket.configuration=DEVELOPMENT -Dwicket.ioc.useByteBuddy=true
+mvn install -P allModules,quick,mysql jetty:run-exploded -Dwicket.configuration=DEVELOPMENT
 
 # OpenMeetings logs for embedded jetty are in
 cd openmeetings-webapp
diff --git a/openmeetings-web/pom.xml b/openmeetings-web/pom.xml
index 74a95744c..85fcd5966 100644
--- a/openmeetings-web/pom.xml
+++ b/openmeetings-web/pom.xml
@@ -46,10 +46,6 @@
 					<groupId>com.mysql</groupId>
 					<artifactId>mysql-connector-j</artifactId>
 				</dependency>
-				<dependency>
-					<groupId>net.bytebuddy</groupId>
-					<artifactId>byte-buddy</artifactId>
-				</dependency>
 			</dependencies>
 		</profile>
 		<profile>
diff --git a/pom.xml b/pom.xml
index 0d85ced06..803e3fe22 100644
--- a/pom.xml
+++ b/pom.xml
@@ -138,8 +138,6 @@
 		<jquery-ui-touch-punch.version>0.2.3-2</jquery-ui-touch-punch.version>
 		<apacheds-test-framework.version>2.0.0.AM27</apacheds-test-framework.version>
 		<swagger.version>2.2.19</swagger.version>
-		<bytebuddy.version>1.14.10</bytebuddy.version>
-		<annotation-api.version>1.3.2</annotation-api.version>
 		<jsr305.version>3.0.2</jsr305.version>
 		<totp.version>1.7.1</totp.version>
 		<!--  Exclude all generated code  -->
@@ -908,11 +906,6 @@
 				<artifactId>mysql-connector-j</artifactId>
 				<version>${mysql.version}</version>
 			</dependency>
-			<dependency>
-				<groupId>net.bytebuddy</groupId>
-				<artifactId>byte-buddy</artifactId>
-				<version>${bytebuddy.version}</version>
-			</dependency>
 			<dependency>
 				<groupId>org.webjars</groupId>
 				<artifactId>jasny-bootstrap</artifactId>
@@ -984,11 +977,6 @@
 				<artifactId>swagger-annotations</artifactId>
 				<version>${swagger.version}</version>
 			</dependency>
-			<dependency>
-				<groupId>javax.annotation</groupId>
-				<artifactId>javax.annotation-api</artifactId>
-				<version>${annotation-api.version}</version>
-			</dependency>
 			<dependency>
 				<!-- required for @NonNull, temporary -->
 				<groupId>com.google.code.findbugs</groupId>


(openmeetings) 08/29: Code clean-up

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

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

commit 27ff8555c444f3a0e91aec2fd2083cf02916be17
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Thu Apr 21 16:52:42 2022 +0700

    Code clean-up
---
 .../src/test/java/org/apache/openmeetings/backup/TestExport.java  | 8 --------
 1 file changed, 8 deletions(-)

diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestExport.java b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestExport.java
index 5e51cb8de..6325193a4 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestExport.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestExport.java
@@ -64,14 +64,6 @@ class TestExport extends AbstractOmServerTest {
 		JAXBContext jc = JAXBContext.newInstance(eClazz);
 		Marshaller marshaller = jc.createMarshaller();
 		marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-		/* FIXME TODO
-		marshaller.setProperty(CharacterEscapeHandler.class.getName(), new CharacterEscapeHandler() {
-			@Override
-			public void escape(char[] ac, int i, int j, boolean flag, Writer writer) throws IOException {
-				writer.write(ac, i, j);
-			}
-		});
-		*/
 		StringWriter writer = new StringWriter();
 		marshaller.marshal(u, writer);
 		Assertions.assertNotNull(writer.getBuffer());


(openmeetings) 17/29: [OPENMEETINGS-2756] prometheus is back, code clean-up

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

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

commit ac55b5f90688f426844b2ab3ea66d156111ef504
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Wed Jan 18 12:32:23 2023 +0700

    [OPENMEETINGS-2756] prometheus is back, code clean-up
---
 openmeetings-core/pom.xml                                           | 6 ------
 openmeetings-util/pom.xml                                           | 2 +-
 .../openmeetings/web/util/logging/OpenMeetingsMetricsServlet.java   | 4 ++--
 openmeetings-web/src/main/webapp/WEB-INF/web.xml                    | 2 +-
 pom.xml                                                             | 2 +-
 5 files changed, 5 insertions(+), 11 deletions(-)

diff --git a/openmeetings-core/pom.xml b/openmeetings-core/pom.xml
index 7ad0bbb78..c7d997381 100644
--- a/openmeetings-core/pom.xml
+++ b/openmeetings-core/pom.xml
@@ -113,12 +113,6 @@
 			<groupId>javax.sip</groupId>
 			<artifactId>jain-sip-ri</artifactId>
 		</dependency>
-		<!-- FIXME TODO -->
-		<dependency>
-			<groupId>com.sun.activation</groupId>
-			<artifactId>jakarta.activation</artifactId> <!-- required for jakarta.mail -->
-			<version>2.0.1</version>
-		</dependency>
 		<!-- Test dependencies -->
 		<dependency>
 			<groupId>org.junit.jupiter</groupId>
diff --git a/openmeetings-util/pom.xml b/openmeetings-util/pom.xml
index 98ba695de..9989d3894 100644
--- a/openmeetings-util/pom.xml
+++ b/openmeetings-util/pom.xml
@@ -132,7 +132,7 @@
 		</dependency>
 		<dependency>
 			<groupId>io.prometheus</groupId>
-			<artifactId>simpleclient_servlet</artifactId>
+			<artifactId>simpleclient_servlet_jakarta</artifactId>
 		</dependency>
 	</dependencies>
 </project>
diff --git 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
index ed6375beb..f068ddbbc 100644
--- 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
@@ -18,9 +18,9 @@
  */
 package org.apache.openmeetings.web.util.logging;
 
-//INCOMPATIBLE with Jackarta! import io.prometheus.client.exporter.MetricsServlet;
+import io.prometheus.client.servlet.jakarta.exporter.MetricsServlet;
 
-public class OpenMeetingsMetricsServlet /*extends MetricsServlet*/ {
+public class OpenMeetingsMetricsServlet extends MetricsServlet {
 	private static final long serialVersionUID = 1L;
 
 	public OpenMeetingsMetricsServlet() {
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/web.xml b/openmeetings-web/src/main/webapp/WEB-INF/web.xml
index 6877a51da..7dbe3091b 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/web.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/web.xml
@@ -60,7 +60,7 @@
 	<!-- Start Prometheus Filter HTTP Servlet metrics
 	<filter>
 		<filter-name>prometheusFilter</filter-name>
-		<filter-class>io.prometheus.client.filter.MetricsFilter</filter-class>
+		<filter-class>io.prometheus.client.servlet.jakarta.filter.MetricsFilter</filter-class>
 		<init-param>
 			<param-name>metric-name</param-name>
 			<param-value>webapp_metrics_filter</param-value>
diff --git a/pom.xml b/pom.xml
index 803e3fe22..a52cfe531 100644
--- a/pom.xml
+++ b/pom.xml
@@ -586,7 +586,7 @@
 			</dependency>
 			<dependency>
 				<groupId>io.prometheus</groupId>
-				<artifactId>simpleclient_servlet</artifactId>
+				<artifactId>simpleclient_servlet_jakarta</artifactId>
 				<version>${io.prometheus.version}</version>
 			</dependency>
 			<dependency>


(openmeetings) 11/29: no jira: unmerged file is fixed

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

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

commit 9369f86c36494cfcb25a6d0fb1399c6e49bc58df
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Thu Dec 29 13:52:15 2022 +0700

    no jira: unmerged file is fixed
---
 .../src/main/java/org/apache/openmeetings/backup/BackupImport.java  | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
index 8eeb5ab19..5f1d85126 100644
--- a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
+++ b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
@@ -986,12 +986,8 @@ public class BackupImport {
 	/*
 	 * ##################### Import Recordings
 	 */
-<<<<<<< HEAD
-	void importRecordings(File base) {
-=======
 	// public for testing
-	public void importRecordings(File base) throws Exception {
->>>>>>> 2590e5123 (The build is green)
+	public void importRecordings(File base) {
 		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 -> {


(openmeetings) 25/29: [OPENMEETINGS-2756] modules are restructured to remove 'test-jar'; Prometheus is updated to 1.0.0

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

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

commit d49cf591b54ec93669573d576ed40be8679f5cc3
Author: Maxim Solodovnik <so...@apache.org>
AuthorDate: Sun Oct 8 20:08:13 2023 +0700

    [OPENMEETINGS-2756] modules are restructured to remove 'test-jar'; Prometheus is updated to 1.0.0
---
 openmeetings-core/pom.xml                          |  21 +-
 openmeetings-core/src/test/java/module-info.test   |  66 -----
 openmeetings-db/pom.xml                            |   8 -
 openmeetings-db/src/test/java/module-info.test     |  87 ------
 openmeetings-install/pom.xml                       |   7 -
 .../src/test/java/module-info.test                 |  57 ----
 openmeetings-mediaserver/pom.xml                   |  12 +-
 .../src/test/java/module-info.test                 |  51 ----
 openmeetings-screenshare/pom.xml                   |   1 -
 openmeetings-server/pom.xml                        |   1 +
 .../pom.xml                                        |  34 +--
 .../src/main/java/module-info.java                 |  14 +-
 .../apache/openmeetings/test/NonJenkinsTest.java   |   0
 openmeetings-util/pom.xml                          |  18 +-
 openmeetings-util/src/main/java/module-info.java   |   4 +-
 .../util/logging/PrometheusAspect.java             |  14 +-
 .../openmeetings/util/logging/PrometheusUtil.java  |  37 ---
 .../util/logging/TimedApplication.java             |   1 -
 .../openmeetings/util/logging/TimedDatabase.java   |   1 -
 openmeetings-util/src/test/java/module-info.test   |  56 ----
 openmeetings-web/pom.xml                           |  16 +-
 openmeetings-web/src/main/java/module-info.java    |   5 +-
 .../util/logging/OpenMeetingsMetricsServlet.java   |  19 +-
 .../web/util/logging/TomcatGenericExports.java     | 324 ---------------------
 .../openmeetings/web/util/logging/TomcatStats.java | 314 ++++++++++++++++++++
 .../webapp/WEB-INF/classes/applicationContext.xml  |   2 +-
 openmeetings-web/src/main/webapp/WEB-INF/web.xml   |  50 +---
 openmeetings-web/src/test/java/module-info.test    |  92 ------
 openmeetings-webservice/pom.xml                    |  12 +-
 .../src/test/java/module-info.test                 |  58 ----
 pom.xml                                            |  82 ++++--
 31 files changed, 435 insertions(+), 1029 deletions(-)

diff --git a/openmeetings-core/pom.xml b/openmeetings-core/pom.xml
index 54a96621f..2339024c3 100644
--- a/openmeetings-core/pom.xml
+++ b/openmeetings-core/pom.xml
@@ -34,7 +34,7 @@
 	</properties>
 	<build>
 		<plugins>
-			<!--plugin>
+			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-javadoc-plugin</artifactId>
 				<executions>
@@ -51,18 +51,6 @@
 						<goals>
 							<goal>javadoc-no-fork</goal>
 						</goals>
-						<phase>generate-resources</phase>
-					</execution>
-				</executions>
-			</plugin-->
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-jar-plugin</artifactId>
-				<executions>
-					<execution>
-						<goals>
-							<goal>test-jar</goal>
-						</goals>
 					</execution>
 				</executions>
 			</plugin>
@@ -118,12 +106,5 @@
 			<groupId>org.junit.jupiter</groupId>
 			<artifactId>junit-jupiter-params</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>org.apache.openmeetings</groupId>
-			<artifactId>openmeetings-util</artifactId>
-			<version>${project.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
 	</dependencies>
 </project>
diff --git a/openmeetings-core/src/test/java/module-info.test b/openmeetings-core/src/test/java/module-info.test
deleted file mode 100644
index fb0ceeb30..000000000
--- a/openmeetings-core/src/test/java/module-info.test
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-open module org.apache.openmeetings.core {
-	// This one should be in-sync with module-info.java
-	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.rss;
-	exports org.apache.openmeetings.core.sip;
-	exports org.apache.openmeetings.core.util;
-
-	requires com.github.openjson;
-
-	requires jakarta.annotation;
-	requires jakarta.inject;
-	requires jakarta.mail;
-
-	requires org.apache.commons.io;
-	requires org.apache.commons.lang3;
-
-	requires org.apache.tika.core;
-	requires org.apache.tika.parser.image;
-
-	requires org.apache.openmeetings.db;
-	requires org.apache.openmeetings.util;
-
-	requires org.apache.wicket.core;
-	requires org.apache.wicket.websocket.core;
-	requires org.apache.wicket.util;
-
-	requires java.xml;
-
-	requires xstream;
-
-	requires jodconverter.core;
-	requires jodconverter.local;
-	requires org.apache.directory.ldap.api.all;
-	requires asterisk.java;
-	requires jain.sip.ri;
-
-	requires spring.context;
-
-	requires org.slf4j;
-
-	//tests
-	requires org.junit.jupiter.api;
-}
diff --git a/openmeetings-db/pom.xml b/openmeetings-db/pom.xml
index 3ba12399c..ed2df7a38 100644
--- a/openmeetings-db/pom.xml
+++ b/openmeetings-db/pom.xml
@@ -112,13 +112,6 @@
 			<groupId>com.google.code.findbugs</groupId>
 			<artifactId>jsr305</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>org.apache.openmeetings</groupId>
-			<artifactId>openmeetings-util</artifactId>
-			<version>${project.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
 	</dependencies>
 	<build>
 		<plugins>
@@ -139,7 +132,6 @@
 						<goals>
 							<goal>javadoc-no-fork</goal>
 						</goals>
-						<phase>generate-resources</phase>
 					</execution>
 				</executions>
 			</plugin-->
diff --git a/openmeetings-db/src/test/java/module-info.test b/openmeetings-db/src/test/java/module-info.test
deleted file mode 100644
index fd9ed1196..000000000
--- a/openmeetings-db/src/test/java/module-info.test
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-open module org.apache.openmeetings.db {
-	// This one should be in-sync with module-info.java
-	exports org.apache.openmeetings;
-	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 com.github.openjson;
-
-	requires org.apache.commons.lang3;
-	requires org.apache.commons.text;
-
-	requires org.apache.openjpa;
-
-	requires org.apache.openmeetings.util;
-
-	requires org.apache.wicket.core;
-	requires org.apache.wicket.extensions;
-	requires org.apache.wicket.request;
-	requires org.apache.wicket.util;
-	requires org.apache.wicket.websocket.core;
-
-	requires spring.beans;
-	requires spring.web;
-	requires spring.core;
-	requires spring.tx;
-	requires spring.context;
-
-	requires jakarta.annotation;
-	requires jakarta.inject;
-	requires jakarta.persistence;
-	requires jakarta.servlet;
-	requires jakarta.xml.bind;
-
-	requires org.dom4j;
-	requires org.slf4j;
-
-	//tests
-	requires org.junit.jupiter.api;
-}
diff --git a/openmeetings-install/pom.xml b/openmeetings-install/pom.xml
index 3e37d0ed7..4b563bab0 100644
--- a/openmeetings-install/pom.xml
+++ b/openmeetings-install/pom.xml
@@ -53,12 +53,5 @@
 			<groupId>commons-cli</groupId>
 			<artifactId>commons-cli</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>org.apache.openmeetings</groupId>
-			<artifactId>openmeetings-util</artifactId>
-			<version>${project.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
 	</dependencies>
 </project>
diff --git a/openmeetings-install/src/test/java/module-info.test b/openmeetings-install/src/test/java/module-info.test
deleted file mode 100644
index 7841b5f3c..000000000
--- a/openmeetings-install/src/test/java/module-info.test
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-open module org.apache.openmeetings.install {
-	// This one should be in-sync with module-info.java
-	exports org.apache.openmeetings.backup;
-	exports org.apache.openmeetings.cli;
-	exports org.apache.openmeetings.installation;
-
-	requires com.github.openjson;
-
-	requires org.apache.commons.io;
-	requires org.apache.commons.lang3;
-
-	requires org.apache.openjpa;
-
-	requires org.apache.openmeetings.core;
-	requires org.apache.openmeetings.db;
-	requires org.apache.openmeetings.util;
-
-	requires org.apache.wicket.core;
-	requires org.apache.wicket.request;
-	requires org.apache.wicket.util;
-
-	requires jakarta.inject;
-	requires jakarta.xml.bind;
-
-	requires spring.context;
-	requires spring.context.support;
-	requires spring.web;
-
-	requires java.desktop;
-	requires commons.cli;
-	requires quartz;
-	requires xstream;
-
-	requires org.slf4j;
-
-	//tests
-	requires org.junit.jupiter.api;
-}
diff --git a/openmeetings-mediaserver/pom.xml b/openmeetings-mediaserver/pom.xml
index a38173417..1a2758a1d 100644
--- a/openmeetings-mediaserver/pom.xml
+++ b/openmeetings-mediaserver/pom.xml
@@ -49,17 +49,10 @@
 			<groupId>org.kurento</groupId>
 			<artifactId>kurento-client</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>org.apache.openmeetings</groupId>
-			<artifactId>openmeetings-util</artifactId>
-			<version>${project.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
 	</dependencies>
 	<build>
 		<plugins>
-			<!--plugin>
+			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-javadoc-plugin</artifactId>
 				<executions>
@@ -76,10 +69,9 @@
 						<goals>
 							<goal>javadoc-no-fork</goal>
 						</goals>
-						<phase>generate-resources</phase>
 					</execution>
 				</executions>
-			</plugin-->
+			</plugin>
 		</plugins>
 	</build>
 </project>
diff --git a/openmeetings-mediaserver/src/test/java/module-info.test b/openmeetings-mediaserver/src/test/java/module-info.test
deleted file mode 100644
index 3234ebb9b..000000000
--- a/openmeetings-mediaserver/src/test/java/module-info.test
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-open module org.apache.openmeetings.mediaserver {
-	// This one should be in-sync with module-info.java
-	exports org.apache.openmeetings.mediaserver;
-
-	requires com.github.openjson;
-
-	requires org.apache.commons.lang3;
-
-	requires org.apache.openmeetings.core;
-	requires org.apache.openmeetings.db;
-	requires org.apache.openmeetings.util;
-
-	requires org.apache.wicket.ioc;
-	requires org.apache.wicket.util;
-
-	requires jakarta.annotation;
-	requires jakarta.inject;
-
-	requires spring.beans;
-	requires spring.context;
-	requires spring.core;
-
-	requires kurento.client;
-	requires kurento.jsonrpc.client;
-	requires kurento.commons;
-	requires com.google.gson;
-
-	requires org.slf4j;
-
-	//tests
-	requires org.junit.jupiter.api;
-}
diff --git a/openmeetings-screenshare/pom.xml b/openmeetings-screenshare/pom.xml
index 05b9e9035..a36ccdac5 100644
--- a/openmeetings-screenshare/pom.xml
+++ b/openmeetings-screenshare/pom.xml
@@ -214,4 +214,3 @@
 		</plugins>
 	</build>
 </project>
-
diff --git a/openmeetings-server/pom.xml b/openmeetings-server/pom.xml
index 696978a04..e56f3c043 100644
--- a/openmeetings-server/pom.xml
+++ b/openmeetings-server/pom.xml
@@ -40,6 +40,7 @@
 		<om.webapp>webapps/openmeetings</om.webapp>
 		<root.webapp>webapps/ROOT</root.webapp>
 		<server-file.dir>web-server</server-file.dir>
+		<automatic-module-name>org.apache.openmeetings.server</automatic-module-name>
 	</properties>
 	<url>https://openmeetings.apache.org</url>
 	<scm>
diff --git a/openmeetings-install/pom.xml b/openmeetings-tests/pom.xml
similarity index 60%
copy from openmeetings-install/pom.xml
copy to openmeetings-tests/pom.xml
index 3e37d0ed7..0deadc56a 100644
--- a/openmeetings-install/pom.xml
+++ b/openmeetings-tests/pom.xml
@@ -25,40 +25,18 @@
 		<version>8.0.0-SNAPSHOT</version>
 		<relativePath>..</relativePath>
 	</parent>
-	<artifactId>openmeetings-install</artifactId>
+	<artifactId>openmeetings-tests</artifactId>
 	<packaging>jar</packaging>
-	<name>Openmeetings Install</name>
-	<description>Module for OpenMeetings command line admin and classes necessary for installer.</description>
+	<name>Openmeetings Tests</name>
+	<description>Module for common test classes</description>
 	<properties>
 		<site.basedir>${project.parent.basedir}</site.basedir>
 	</properties>
 	<dependencies>
 		<dependency>
-			<groupId>org.springframework</groupId>
-			<artifactId>spring-context-support</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework</groupId>
-			<artifactId>spring-core</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.quartz-scheduler</groupId>
-			<artifactId>quartz</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.openmeetings</groupId>
-			<artifactId>openmeetings-core</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>commons-cli</groupId>
-			<artifactId>commons-cli</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.openmeetings</groupId>
-			<artifactId>openmeetings-util</artifactId>
-			<version>${project.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
+			<groupId>org.junit.jupiter</groupId>
+			<artifactId>junit-jupiter-api</artifactId>
+			<scope>compile</scope>
 		</dependency>
 	</dependencies>
 </project>
diff --git a/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/TimedDatabase.java b/openmeetings-tests/src/main/java/module-info.java
similarity index 72%
copy from openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/TimedDatabase.java
copy to openmeetings-tests/src/main/java/module-info.java
index 028029551..60d0547a5 100644
--- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/TimedDatabase.java
+++ b/openmeetings-tests/src/main/java/module-info.java
@@ -1,5 +1,4 @@
 /*
-
  * 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
@@ -17,15 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.util.logging;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.METHOD)
-public @interface TimedDatabase {
+module org.apache.openmeetings.tests {
+	exports org.apache.openmeetings.test;
 
+	requires org.junit.jupiter.api;
 }
diff --git a/openmeetings-util/src/test/java/org/apache/openmeetings/test/NonJenkinsTest.java b/openmeetings-tests/src/main/java/org/apache/openmeetings/test/NonJenkinsTest.java
similarity index 100%
rename from openmeetings-util/src/test/java/org/apache/openmeetings/test/NonJenkinsTest.java
rename to openmeetings-tests/src/main/java/org/apache/openmeetings/test/NonJenkinsTest.java
diff --git a/openmeetings-util/pom.xml b/openmeetings-util/pom.xml
index b4388d9a5..8f99a8388 100644
--- a/openmeetings-util/pom.xml
+++ b/openmeetings-util/pom.xml
@@ -38,17 +38,6 @@
 				<groupId>org.apache.felix</groupId>
 				<artifactId>maven-bundle-plugin</artifactId>
 			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-jar-plugin</artifactId>
-				<executions>
-					<execution>
-						<goals>
-							<goal>test-jar</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
 		</plugins>
 		<resources>
 			<resource>
@@ -132,7 +121,12 @@
 		</dependency>
 		<dependency>
 			<groupId>io.prometheus</groupId>
-			<artifactId>simpleclient_servlet_jakarta</artifactId>
+			<artifactId>prometheus-metrics-core</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.openmeetings</groupId>
+			<artifactId>openmeetings-tests</artifactId>
 		</dependency>
 	</dependencies>
 </project>
diff --git a/openmeetings-util/src/main/java/module-info.java b/openmeetings-util/src/main/java/module-info.java
index 72e073b16..12b8d3ca4 100644
--- a/openmeetings-util/src/main/java/module-info.java
+++ b/openmeetings-util/src/main/java/module-info.java
@@ -45,7 +45,9 @@ module org.apache.openmeetings.util {
 	requires org.mnode.ical4j.core;
 	requires org.aspectj.tools;
 	requires org.dom4j;
-	requires simpleclient;
 	requires ch.qos.logback.classic;
 	requires ch.qos.logback.core;
+
+	requires prometheus.metrics.core;
+	requires prometheus.metrics.model;
 }
diff --git a/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/PrometheusAspect.java b/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/PrometheusAspect.java
index 396f5ae50..258f0e3e1 100644
--- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/PrometheusAspect.java
+++ b/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/PrometheusAspect.java
@@ -24,21 +24,27 @@ import org.aspectj.lang.annotation.Around;
 import org.aspectj.lang.annotation.Aspect;
 import org.springframework.stereotype.Component;
 
-import io.prometheus.client.Histogram;
+import io.prometheus.metrics.core.metrics.Histogram;
+import io.prometheus.metrics.model.snapshots.Unit;
 
 @Aspect
 @Component
 public class PrometheusAspect {
+	private static final Histogram histogram = Histogram.builder()
+			.help("OpenMeetings Application Metrics")
+			.name("org_openmeetings_metrics")
+			.labelNames("class", "method", "type", "message")
+			.register();
 
 	private Object logExecutionTime(ProceedingJoinPoint joinPoint, String logType) throws Throwable {
 		String className = joinPoint.getSignature().getDeclaringType().getSimpleName();
 		String methodName = joinPoint.getSignature().getName();
-		Histogram.Timer timer = PrometheusUtil.getHistogram() //
-				.labels(className, methodName, logType, "default").startTimer();
+		long start = System.nanoTime();
 		try {
 			return joinPoint.proceed();
 		} finally {
-			timer.observeDuration();
+			histogram.labelValues(className, methodName, logType, "default")
+					.observe(Unit.nanosToSeconds(System.nanoTime() - start));
 		}
 	}
 
diff --git a/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/PrometheusUtil.java b/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/PrometheusUtil.java
deleted file mode 100644
index 0f1cfd3f0..000000000
--- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/PrometheusUtil.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
-
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.openmeetings.util.logging;
-
-import io.prometheus.client.Histogram;
-
-public class PrometheusUtil {
-	private static final Histogram histogram = Histogram.build()
-			.help("OpenMeetings Application Metrics")
-			.name("org_openmeetings_metrics")
-			.labelNames("class", "method", "type", "message")
-			.register();
-
-	private PrometheusUtil() {
-	}
-
-	public static Histogram getHistogram() {
-		return histogram;
-	}
-}
diff --git a/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/TimedApplication.java b/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/TimedApplication.java
index 09c25ea7a..b5d23fae2 100644
--- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/TimedApplication.java
+++ b/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/TimedApplication.java
@@ -27,5 +27,4 @@ import java.lang.annotation.Target;
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.METHOD)
 public @interface TimedApplication {
-
 }
diff --git a/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/TimedDatabase.java b/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/TimedDatabase.java
index 028029551..cdbe750b8 100644
--- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/TimedDatabase.java
+++ b/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/TimedDatabase.java
@@ -27,5 +27,4 @@ import java.lang.annotation.Target;
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.METHOD)
 public @interface TimedDatabase {
-
 }
diff --git a/openmeetings-util/src/test/java/module-info.test b/openmeetings-util/src/test/java/module-info.test
deleted file mode 100644
index 3ea1b258b..000000000
--- a/openmeetings-util/src/test/java/module-info.test
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-open module org.apache.openmeetings.util {
-	// This one should be in-sync with module-info.java
-	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 jakarta.activation;
-	requires jakarta.servlet;
-
-	requires com.github.openjson;
-
-	requires org.apache.commons.codec;
-	requires org.apache.commons.lang3;
-
-	requires org.apache.tika.core;
-
-	requires org.apache.wicket.util;
-	requires org.apache.wicket.core;
-	requires org.apache.wicket.extensions;
-
-	requires org.slf4j;
-	requires spring.context;
-
-	requires org.bouncycastle.provider;
-	requires org.mnode.ical4j.core;
-	requires org.aspectj.tools;
-	requires org.dom4j;
-	requires simpleclient;
-	requires ch.qos.logback.classic;
-	requires ch.qos.logback.core;
-
-	//tests
-	requires transitive org.junit.jupiter.engine;
-	requires transitive org.junit.jupiter.api;
-}
diff --git a/openmeetings-web/pom.xml b/openmeetings-web/pom.xml
index 5cc6c4d42..48dceb1ab 100644
--- a/openmeetings-web/pom.xml
+++ b/openmeetings-web/pom.xml
@@ -476,17 +476,7 @@
 		<!-- Test dependencies -->
 		<dependency>
 			<groupId>org.apache.openmeetings</groupId>
-			<artifactId>openmeetings-util</artifactId>
-			<version>${project.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.openmeetings</groupId>
-			<artifactId>openmeetings-core</artifactId>
-			<version>${project.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
+			<artifactId>openmeetings-tests</artifactId>
 		</dependency>
 		<dependency>
 			<groupId>org.apache.cxf</groupId>
@@ -521,5 +511,9 @@
 			<groupId>org.junit.jupiter</groupId>
 			<artifactId>junit-jupiter-params</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>io.prometheus</groupId>
+			<artifactId>prometheus-metrics-exporter-servlet-jakarta</artifactId>
+		</dependency>
 	</dependencies>
 </project>
diff --git a/openmeetings-web/src/main/java/module-info.java b/openmeetings-web/src/main/java/module-info.java
index e793d828e..78eefd4db 100644
--- a/openmeetings-web/src/main/java/module-info.java
+++ b/openmeetings-web/src/main/java/module-info.java
@@ -74,7 +74,6 @@ module org.apache.openmeetings.web {
 
 	requires com.hazelcast.core;
 	requires org.danekja.jdk.serializable.functional;
-	requires simpleclient.servlet.jakarta;
 	requires xstream;
 
 	requires spring.beans;
@@ -83,4 +82,8 @@ module org.apache.openmeetings.web {
 	requires spring.web;
 
 	requires org.slf4j;
+
+	requires prometheus.metrics.core;
+	requires prometheus.metrics.model;
+	requires prometheus.metrics.exporter.servlet.jakarta;
 }
diff --git 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
index f068ddbbc..f45e2040a 100644
--- 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
@@ -18,14 +18,27 @@
  */
 package org.apache.openmeetings.web.util.logging;
 
-import io.prometheus.client.servlet.jakarta.exporter.MetricsServlet;
+import java.io.IOException;
 
-public class OpenMeetingsMetricsServlet extends MetricsServlet {
+import org.springframework.stereotype.Service;
+
+import io.prometheus.metrics.exporter.servlet.jakarta.PrometheusMetricsServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
+@Service
+public class OpenMeetingsMetricsServlet extends PrometheusMetricsServlet {
 	private static final long serialVersionUID = 1L;
+	private final TomcatStats stats;
 
 	public OpenMeetingsMetricsServlet() {
 		super();
-		new TomcatGenericExports(false).register();
+		stats = new TomcatStats(false);
 	}
 
+	@Override
+	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
+		stats.refresh();
+		super.doGet(request, response);
+	}
 }
diff --git 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
deleted file mode 100644
index 5403b53b2..000000000
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/logging/TomcatGenericExports.java
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.openmeetings.web.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;
-import javax.management.AttributeList;
-import javax.management.MBeanServer;
-import javax.management.ObjectInstance;
-import javax.management.ObjectName;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import io.prometheus.client.Collector;
-import io.prometheus.client.CounterMetricFamily;
-import io.prometheus.client.GaugeMetricFamily;
-
-/**
- * Exports Tomcat metrics applicable to most most applications:
- *
- * - http session metrics - request processor metrics - thread pool metrics
- *
- * Example usage:
- *
- * <pre>
- * {@code
- *   new TomcatGenericExports(false).register();
- * }
- * </pre>
- *
- * Example metrics being exported:
- *
- * <pre>
- * tomcat_info{version="7.0.61.0",build="Apr 29 2015 14:58:03 UTC",} 1.0
- * tomcat_session_active_total{context="/foo",host="default",} 877.0
- * tomcat_session_rejected_total{context="/foo",host="default",} 0.0
- * tomcat_session_created_total{context="/foo",host="default",} 24428.0
- * tomcat_session_expired_total{context="/foo",host="default",} 23832.0
- * tomcat_session_alivetime_seconds_avg{context="/foo",host="default",} 633.0
- * tomcat_session_alivetime_seconds_max{context="/foo",host="default",} 9883.0
- * tomcat_requestprocessor_received_bytes{name="http-bio-0.0.0.0-8080",} 0.0
- * tomcat_requestprocessor_sent_bytes{name="http-bio-0.0.0.0-8080",} 5056098.0
- * tomcat_requestprocessor_time_seconds{name="http-bio-0.0.0.0-8080",} 127386.0
- * tomcat_requestprocessor_error_count{name="http-bio-0.0.0.0-8080",} 0.0
- * tomcat_requestprocessor_request_count{name="http-bio-0.0.0.0-8080",} 33709.0
- * tomcat_threads_total{pool="http-bio-0.0.0.0-8080",} 10.0
- * tomcat_threads_active_total{pool="http-bio-0.0.0.0-8080",} 2.0
- * tomcat_threads_active_max{pool="http-bio-0.0.0.0-8080",} 200.0
- * </pre>
- */
-public class TomcatGenericExports extends Collector {
-	private static final Logger log = LoggerFactory.getLogger(TomcatGenericExports.class);
-	private static final String LABEL_NAME = "name";
-	private String jmxDomain = "Catalina";
-
-	public TomcatGenericExports(boolean embedded) {
-		if (embedded) {
-			jmxDomain = "Tomcat";
-		}
-	}
-
-	private void addRequestProcessorMetrics(List<MetricFamilySamples> mfs) {
-		try {
-			final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
-			ObjectName filterName = new ObjectName(jmxDomain + ":type=GlobalRequestProcessor,name=*");
-			Set<ObjectInstance> mBeans = server.queryMBeans(filterName, null);
-
-			if (!mBeans.isEmpty()) {
-				List<String> labelNameList = List.of(LABEL_NAME);
-
-				GaugeMetricFamily requestProcessorBytesReceivedGauge = new GaugeMetricFamily(
-						"tomcat_requestprocessor_received_bytes", "Number of bytes received by this request processor",
-						labelNameList);
-
-				GaugeMetricFamily requestProcessorBytesSentGauge = new GaugeMetricFamily(
-						"tomcat_requestprocessor_sent_bytes", "Number of bytes sent by this request processor",
-						labelNameList);
-
-				GaugeMetricFamily requestProcessorProcessingTimeGauge = new GaugeMetricFamily(
-						"tomcat_requestprocessor_time_seconds", "The total time spend by this request processor",
-						labelNameList);
-
-				CounterMetricFamily requestProcessorErrorCounter = new CounterMetricFamily(
-						"tomcat_requestprocessor_error_count",
-						"The number of error request served by this request processor", labelNameList);
-
-				CounterMetricFamily requestProcessorRequestCounter = new CounterMetricFamily(
-						"tomcat_requestprocessor_request_count",
-						"The number of request served by this request processor", labelNameList);
-
-				for (final ObjectInstance mBean : mBeans) {
-					List<String> labelValueList = Collections
-							.singletonList(mBean.getObjectName().getKeyProperty("name").replaceAll("[\"\\\\]", ""));
-
-					requestProcessorBytesReceivedGauge.addMetric(labelValueList,
-							((Long) server.getAttribute(mBean.getObjectName(), "bytesReceived")).doubleValue());
-
-					requestProcessorBytesSentGauge.addMetric(labelValueList,
-							((Long) server.getAttribute(mBean.getObjectName(), "bytesSent")).doubleValue());
-
-					requestProcessorProcessingTimeGauge.addMetric(labelValueList,
-							((Long) server.getAttribute(mBean.getObjectName(), "processingTime")).doubleValue()
-									/ 1000.0);
-
-					requestProcessorErrorCounter.addMetric(labelValueList,
-							((Integer) server.getAttribute(mBean.getObjectName(), "errorCount")).doubleValue());
-
-					requestProcessorRequestCounter.addMetric(labelValueList,
-							((Integer) server.getAttribute(mBean.getObjectName(), "requestCount")).doubleValue());
-				}
-
-				mfs.add(requestProcessorBytesReceivedGauge);
-				mfs.add(requestProcessorBytesSentGauge);
-				mfs.add(requestProcessorProcessingTimeGauge);
-				mfs.add(requestProcessorRequestCounter);
-				mfs.add(requestProcessorErrorCounter);
-			}
-		} catch (Exception e) {
-			log.error("Error retrieving metric.", e);
-		}
-	}
-
-	private void addSessionMetrics(List<MetricFamilySamples> mfs) {
-		try {
-			final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
-			ObjectName filterName = new ObjectName(jmxDomain + ":type=Manager,context=*,host=*");
-			Set<ObjectInstance> mBeans = server.queryMBeans(filterName, null);
-
-			if (!mBeans.isEmpty()) {
-				List<String> labelNameList = List.of("host", "context");
-
-				GaugeMetricFamily activeSessionCountGauge = new GaugeMetricFamily("tomcat_session_active_total",
-						"Number of active sessions", labelNameList);
-
-				GaugeMetricFamily rejectedSessionCountGauge = new GaugeMetricFamily("tomcat_session_rejected_total",
-						"Number of sessions rejected due to maxActive being reached", labelNameList);
-
-				GaugeMetricFamily createdSessionCountGauge = new GaugeMetricFamily("tomcat_session_created_total",
-						"Number of sessions created", labelNameList);
-
-				GaugeMetricFamily expiredSessionCountGauge = new GaugeMetricFamily("tomcat_session_expired_total",
-						"Number of sessions that expired", labelNameList);
-
-				GaugeMetricFamily sessionAvgAliveTimeGauge = new GaugeMetricFamily(
-						"tomcat_session_alivetime_seconds_avg", "Average time an expired session had been alive",
-						labelNameList);
-
-				GaugeMetricFamily sessionMaxAliveTimeGauge = new GaugeMetricFamily(
-						"tomcat_session_alivetime_seconds_max", "Maximum time an expired session had been alive",
-						labelNameList);
-
-				GaugeMetricFamily contextStateGauge = new GaugeMetricFamily("tomcat_context_state_started",
-						"Indication if the lifecycle state of this context is STARTED", labelNameList);
-
-				for (final ObjectInstance mBean : mBeans) {
-					List<String> labelValueList = List.of(mBean.getObjectName().getKeyProperty("host"),
-							mBean.getObjectName().getKeyProperty("context"));
-
-					activeSessionCountGauge.addMetric(labelValueList,
-							((Integer) server.getAttribute(mBean.getObjectName(), "activeSessions")).doubleValue());
-
-					rejectedSessionCountGauge.addMetric(labelValueList,
-							((Integer) server.getAttribute(mBean.getObjectName(), "rejectedSessions")).doubleValue());
-
-					createdSessionCountGauge.addMetric(labelValueList,
-							((Long) server.getAttribute(mBean.getObjectName(), "sessionCounter")).doubleValue());
-
-					expiredSessionCountGauge.addMetric(labelValueList,
-							((Long) server.getAttribute(mBean.getObjectName(), "expiredSessions")).doubleValue());
-
-					sessionAvgAliveTimeGauge.addMetric(labelValueList,
-							((Integer) server.getAttribute(mBean.getObjectName(), "sessionAverageAliveTime"))
-									.doubleValue());
-
-					sessionMaxAliveTimeGauge.addMetric(labelValueList,
-							((Integer) server.getAttribute(mBean.getObjectName(), "sessionMaxAliveTime"))
-									.doubleValue());
-
-					if (server.getAttribute(mBean.getObjectName(), "stateName").equals("STARTED")) {
-						contextStateGauge.addMetric(labelValueList, 1.0);
-					} else {
-						contextStateGauge.addMetric(labelValueList, 0.0);
-					}
-				}
-
-				mfs.add(activeSessionCountGauge);
-				mfs.add(rejectedSessionCountGauge);
-				mfs.add(createdSessionCountGauge);
-				mfs.add(expiredSessionCountGauge);
-				mfs.add(sessionAvgAliveTimeGauge);
-				mfs.add(sessionMaxAliveTimeGauge);
-				mfs.add(contextStateGauge);
-			}
-		} catch (Exception e) {
-			log.error("Error retrieving metric.", e);
-		}
-	}
-
-	private void addThreadPoolMetrics(List<MetricFamilySamples> mfs) {
-		try {
-			final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
-			ObjectName filterName = new ObjectName(jmxDomain + ":type=ThreadPool,name=*");
-			Set<ObjectInstance> mBeans = server.queryMBeans(filterName, null);
-
-			if (!mBeans.isEmpty()) {
-				List<String> labelList = List.of(LABEL_NAME);
-
-				GaugeMetricFamily threadPoolCurrentCountGauge = new GaugeMetricFamily("tomcat_threads_total",
-						"Number threads in this pool.", labelList);
-
-				GaugeMetricFamily threadPoolActiveCountGauge = new GaugeMetricFamily("tomcat_threads_active_total",
-						"Number of active threads in this pool.", labelList);
-
-				GaugeMetricFamily threadPoolMaxThreadsGauge = new GaugeMetricFamily("tomcat_threads_max",
-						"Maximum number of threads allowed in this pool.", labelList);
-
-				GaugeMetricFamily threadPoolConnectionCountGauge = new GaugeMetricFamily(
-						"tomcat_connections_active_total", "Number of connections served by this pool.", labelList);
-
-				GaugeMetricFamily threadPoolMaxConnectionGauge = new GaugeMetricFamily("tomcat_connections_active_max",
-						"Maximum number of concurrent connections served by this pool.", labelList);
-
-				String[] genericAttributes = new String[] { "currentThreadCount", "currentThreadsBusy", "maxThreads",
-						"connectionCount", "maxConnections" };
-
-				for (final ObjectInstance mBean : mBeans) {
-					List<String> labelValueList = Collections
-							.singletonList(mBean.getObjectName().getKeyProperty("name").replaceAll("[\"\\\\]", ""));
-					AttributeList attributeList = server.getAttributes(mBean.getObjectName(), genericAttributes);
-					for (Attribute attribute : attributeList.asList()) {
-						switch (attribute.getName()) {
-							case "currentThreadCount":
-								threadPoolCurrentCountGauge.addMetric(labelValueList,
-										((Integer) attribute.getValue()).doubleValue());
-								break;
-							case "currentThreadsBusy":
-								threadPoolActiveCountGauge.addMetric(labelValueList,
-										((Integer) attribute.getValue()).doubleValue());
-								break;
-							case "maxThreads":
-								threadPoolMaxThreadsGauge.addMetric(labelValueList,
-										((Integer) attribute.getValue()).doubleValue());
-								break;
-							case "connectionCount":
-								threadPoolConnectionCountGauge.addMetric(labelValueList,
-										((Long) attribute.getValue()).doubleValue());
-								break;
-							case "maxConnections":
-								threadPoolMaxConnectionGauge.addMetric(labelValueList,
-										((Integer) attribute.getValue()).doubleValue());
-								break;
-							default:
-								log.warn("Unexpected attribute {}", attribute);
-								break;
-						}
-					}
-				}
-
-				addNonEmptyMetricFamily(mfs, threadPoolCurrentCountGauge);
-				addNonEmptyMetricFamily(mfs, threadPoolActiveCountGauge);
-				addNonEmptyMetricFamily(mfs, threadPoolMaxThreadsGauge);
-				addNonEmptyMetricFamily(mfs, threadPoolConnectionCountGauge);
-				addNonEmptyMetricFamily(mfs, threadPoolMaxConnectionGauge);
-			}
-		} catch (Exception e) {
-			log.error("Error retrieving metric: {}", e.getMessage());
-		}
-	}
-
-	private void addVersionInfo(List<MetricFamilySamples> mfs) {
-		GaugeMetricFamily tomcatInfo = new GaugeMetricFamily("tomcat_info", "tomcat version info",
-				List.of("version", "build"));
-		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 (Exception t) {
-			log.warn("Unable to read Tomcat version: ", t);
-		}
-		mfs.add(tomcatInfo);
-	}
-
-	private void addNonEmptyMetricFamily(List<MetricFamilySamples> mfs, GaugeMetricFamily metricFamily) {
-		if (!metricFamily.samples.isEmpty()) {
-			mfs.add(metricFamily);
-		}
-	}
-
-	@Override
-	public List<MetricFamilySamples> collect() {
-		List<MetricFamilySamples> mfs = new ArrayList<>();
-		addSessionMetrics(mfs);
-		addThreadPoolMetrics(mfs);
-		addRequestProcessorMetrics(mfs);
-		addVersionInfo(mfs);
-		return mfs;
-
-	}
-}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/logging/TomcatStats.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/logging/TomcatStats.java
new file mode 100644
index 000000000..cd1f9842d
--- /dev/null
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/logging/TomcatStats.java
@@ -0,0 +1,314 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.web.util.logging;
+
+import java.io.InputStream;
+import java.lang.management.ManagementFactory;
+import java.util.Properties;
+import java.util.Set;
+
+import javax.management.Attribute;
+import javax.management.AttributeList;
+import javax.management.AttributeNotFoundException;
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanException;
+import javax.management.MBeanServer;
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+import javax.management.ReflectionException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.prometheus.metrics.core.metrics.Gauge;
+
+/**
+ * Exports Tomcat metrics applicable to most applications:
+ *
+ * - http session metrics - request processor metrics - thread pool metrics
+ *
+ * Example usage:
+ *
+ * <pre>
+ * {@code
+ *   TomcatStats stats = new TomcatStats(false);
+ *   stats.refresh();
+ * }
+ * </pre>
+ *
+ * Example metrics being exported:
+ *
+ * <pre>
+ * tomcat_info{version="7.0.61.0",build="Apr 29 2015 14:58:03 UTC",} 1.0
+ * tomcat_session_active{context="/foo",host="default",} 877.0
+ * tomcat_session_rejected{context="/foo",host="default",} 0.0
+ * tomcat_session_constructed{context="/foo",host="default",} 24428.0
+ * tomcat_session_expired{context="/foo",host="default",} 23832.0
+ * tomcat_session_alivetime_seconds_avg{context="/foo",host="default",} 633.0
+ * tomcat_session_alivetime_seconds_max{context="/foo",host="default",} 9883.0
+ * tomcat_requestprocessor_received_bytes{name="http-bio-0.0.0.0-8080",} 0.0
+ * tomcat_requestprocessor_sent_bytes{name="http-bio-0.0.0.0-8080",} 5056098.0
+ * tomcat_requestprocessor_time_seconds{name="http-bio-0.0.0.0-8080",} 127386.0
+ * tomcat_requestprocessor_error_count{name="http-bio-0.0.0.0-8080",} 0.0
+ * tomcat_requestprocessor_request_count{name="http-bio-0.0.0.0-8080",} 33709.0
+ * tomcat_threads{pool="http-bio-0.0.0.0-8080",} 10.0
+ * tomcat_threads_active{pool="http-bio-0.0.0.0-8080",} 2.0
+ * tomcat_threads_active_max{pool="http-bio-0.0.0.0-8080",} 200.0
+ * </pre>
+ */
+
+public class TomcatStats {
+	private static final Logger log = LoggerFactory.getLogger(TomcatStats.class);
+
+	private static final String[] LBL_NAMES = new String[]{"name"};
+	private static final Gauge rqBytesReceived = Gauge.builder()
+			.name("tomcat_requestprocessor_received_bytes")
+			.help("Number of bytes received by this request processor")
+			.labelNames(LBL_NAMES)
+			.register();
+	private static final Gauge rqBytesSent = Gauge.builder()
+			.name("tomcat_requestprocessor_sent_bytes")
+			.help("Number of bytes sent by this request processor")
+			.labelNames(LBL_NAMES)
+			.register();
+	private static final Gauge rqTime = Gauge.builder()
+			.name("tomcat_requestprocessor_time_seconds")
+			.help("The total time spend by this request processor")
+			.labelNames(LBL_NAMES)
+			.register();
+	private static final Gauge rqErrors = Gauge.builder()
+			.name("tomcat_requestprocessor_error_count")
+			.help("The number of error request served by this request processor")
+			.labelNames(LBL_NAMES)
+			.register();
+	private static final Gauge rqRequests = Gauge.builder()
+			.name("tomcat_requestprocessor_request_count")
+			.help("The number of request served by this request processor")
+			.labelNames(LBL_NAMES)
+			.register();
+
+	private static final Gauge threads = Gauge.builder()
+			.name("tomcat_threads")
+			.help("Number threads in this pool.")
+			.labelNames(LBL_NAMES)
+			.register();
+	private static final Gauge threadsActive = Gauge.builder()
+			.name("tomcat_threads_active")
+			.help("Number of active threads in this pool.")
+			.labelNames(LBL_NAMES)
+			.register();
+	private static final Gauge threadsMax = Gauge.builder()
+			.name("tomcat_threads_max")
+			.help("Maximum number of threads allowed in this pool.")
+			.labelNames(LBL_NAMES)
+			.register();
+	private static final Gauge connsActive = Gauge.builder()
+			.name("tomcat_connections_active")
+			.help("Number of connections served by this pool.")
+			.labelNames(LBL_NAMES)
+			.register();
+	private static final Gauge connsActiveMax = Gauge.builder()
+			.name("tomcat_connections_active_max")
+			.help("Maximum number of concurrent connections served by this pool.")
+			.labelNames(LBL_NAMES)
+			.register();
+
+	private static final String[] SESSION_LBL_NAMES = new String[]{"host", "context"};
+	private static final Gauge sessionActive = Gauge.builder()
+			.name("tomcat_session_active")
+			.help("Number of active sessions")
+			.labelNames(SESSION_LBL_NAMES)
+			.register();
+	private static final Gauge sessionRejected = Gauge.builder()
+			.name("tomcat_session_rejected")
+			.help("Number of sessions rejected due to maxActive being reached")
+			.labelNames(SESSION_LBL_NAMES)
+			.register();
+	private static final Gauge sessionCreated = Gauge.builder()
+			.name("tomcat_session_constructed")
+			.help("Number of sessions created")
+			.labelNames(SESSION_LBL_NAMES)
+			.register();
+	private static final Gauge sessionExpired = Gauge.builder()
+			.name("tomcat_session_expired")
+			.help("Number of sessions that expired")
+			.labelNames(SESSION_LBL_NAMES)
+			.register();
+	private static final Gauge sessionAvgAlive = Gauge.builder()
+			.name("tomcat_session_alivetime_seconds_avg")
+			.help("Average time an expired session had been alive")
+			.labelNames(SESSION_LBL_NAMES)
+			.register();
+	private static final Gauge sessionMaxAlive = Gauge.builder()
+			.name("tomcat_session_alivetime_seconds_max")
+			.help("Maximum time an expired session had been alive")
+			.labelNames(SESSION_LBL_NAMES)
+			.register();
+	private static final Gauge ctxState = Gauge.builder()
+			.name("tomcat_context_state_started")
+			.help("Indication if the lifecycle state of this context is STARTED")
+			.labelNames(SESSION_LBL_NAMES)
+			.register();
+
+	private static final Gauge version = Gauge.builder()
+			.name("tomcat_details")
+			.help("tomcat version info")
+			.labelNames("version", "build")
+			.register();
+
+	private final String jmxDomain;
+
+	public TomcatStats(boolean embedded) {
+		jmxDomain = embedded ? "Tomcat" : "Catalina";
+	}
+
+	private double getAttr(Attribute attribute) {
+		return ((Number)attribute.getValue()).doubleValue();
+	}
+
+	private double getAttr(final MBeanServer server, final ObjectInstance mBean, String attr) throws InstanceNotFoundException, AttributeNotFoundException, ReflectionException, MBeanException {
+		return ((Number)server.getAttribute(mBean.getObjectName(), attr)).doubleValue();
+	}
+
+	private void updateRequestProcessorMetrics() {
+		try {
+			final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+			ObjectName filterName = new ObjectName(jmxDomain + ":type=GlobalRequestProcessor,name=*");
+			Set<ObjectInstance> mBeans = server.queryMBeans(filterName, null);
+
+			for (final ObjectInstance mBean : mBeans) {
+				String labels = mBean.getObjectName().getKeyProperty("name").replaceAll("[\"\\\\]", "");
+
+				rqBytesReceived.labelValues(labels)
+						.set(getAttr(server, mBean, "bytesReceived"));
+
+				rqBytesSent.labelValues(labels)
+						.set(getAttr(server, mBean, "bytesSent"));
+
+				rqTime.labelValues(labels)
+						.set(getAttr(server, mBean, "processingTime") / 1000.0);
+
+				rqErrors.labelValues(labels)
+						.set(getAttr(server, mBean, "errorCount"));
+
+				rqRequests.labelValues(labels)
+						.set(getAttr(server, mBean, "requestCount"));
+			}
+		} catch (Exception e) {
+			log.error("Error retrieving RequestProcessor metric.", e);
+		}
+	}
+
+	private void updateSessionMetrics() {
+		try {
+			final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+			ObjectName filterName = new ObjectName(jmxDomain + ":type=Manager,context=*,host=*");
+			Set<ObjectInstance> mBeans = server.queryMBeans(filterName, null);
+
+			for (final ObjectInstance mBean : mBeans) {
+				String[] labelValues = new String[] {
+						mBean.getObjectName().getKeyProperty("host")
+						, mBean.getObjectName().getKeyProperty("context")};
+
+				sessionActive.labelValues(labelValues)
+						.set(getAttr(server, mBean, "activeSessions"));
+
+				sessionRejected.labelValues(labelValues)
+						.set(getAttr(server, mBean, "rejectedSessions"));
+
+				sessionCreated.labelValues(labelValues)
+						.set(getAttr(server, mBean, "sessionCounter"));
+
+				sessionExpired.labelValues(labelValues)
+						.set(getAttr(server, mBean, "expiredSessions"));
+
+				sessionAvgAlive.labelValues(labelValues)
+						.set(getAttr(server, mBean, "sessionAverageAliveTime"));
+
+				sessionMaxAlive.labelValues(labelValues)
+						.set(getAttr(server, mBean, "sessionMaxAliveTime"));
+
+				ctxState.labelValues(labelValues)
+						.set("STARTED".equals(server.getAttribute(mBean.getObjectName(), "stateName")) ? 1. : 0.);
+			}
+		} catch (Exception e) {
+			log.error("Error retrieving Session metric.", e);
+		}
+	}
+
+	private void updateThreadPoolMetrics() {
+		try {
+			final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+			ObjectName filterName = new ObjectName(jmxDomain + ":type=ThreadPool,name=*");
+			Set<ObjectInstance> mBeans = server.queryMBeans(filterName, null);
+
+			if (!mBeans.isEmpty()) {
+				String[] genericAttributes = new String[] { "currentThreadCount", "currentThreadsBusy", "maxThreads",
+						"connectionCount", "maxConnections" };
+
+				for (final ObjectInstance mBean : mBeans) {
+					String label = mBean.getObjectName().getKeyProperty("name").replaceAll("[\"\\\\]", "");
+					AttributeList attributeList = server.getAttributes(mBean.getObjectName(), genericAttributes);
+					for (Attribute attribute : attributeList.asList()) {
+						switch (attribute.getName()) {
+							case "currentThreadCount":
+								threads.labelValues(label).set(getAttr(attribute));
+								break;
+							case "currentThreadsBusy":
+								threadsActive.labelValues(label).set(getAttr(attribute));
+								break;
+							case "maxThreads":
+								threadsMax.labelValues(label).set(getAttr(attribute));
+								break;
+							case "connectionCount":
+								connsActive.labelValues(label).set(getAttr(attribute));
+								break;
+							case "maxConnections":
+								connsActiveMax.labelValues(label).set(getAttr(attribute));
+								break;
+							default:
+								log.warn("Unexpected attribute {}", attribute);
+								break;
+						}
+					}
+				}
+			}
+		} catch (Exception e) {
+			log.error("Error retrieving ThreadPool metric: {}", e.getMessage());
+		}
+	}
+
+	private void updateVersionInfo() {
+		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");
+			version.labelValues(props.getProperty("server.number"), props.getProperty("server.built")).set(1.);
+		} catch (Exception t) {
+			log.warn("Unable to read Tomcat version: ", t);
+		}
+	}
+
+	public void refresh() {
+		updateRequestProcessorMetrics();
+		updateSessionMetrics();
+		updateThreadPoolMetrics();
+		updateVersionInfo();
+	}
+}
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml
index a069c52cd..d3503511c 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml
@@ -41,7 +41,7 @@
 	<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
 	<!-- Start annotation Prometheus metrics
 	<aop:aspectj-autoproxy/>
-	End annotation -->
+		End annotation -->
 	<context:annotation-config />
 	<context:component-scan base-package="org.apache.openmeetings" />
 
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/web.xml b/openmeetings-web/src/main/webapp/WEB-INF/web.xml
index 7dbe3091b..769f299b4 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/web.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/web.xml
@@ -57,34 +57,6 @@
 		</init-param>
 	</filter>
 
-	<!-- Start Prometheus Filter HTTP Servlet metrics
-	<filter>
-		<filter-name>prometheusFilter</filter-name>
-		<filter-class>io.prometheus.client.servlet.jakarta.filter.MetricsFilter</filter-class>
-		<init-param>
-			<param-name>metric-name</param-name>
-			<param-value>webapp_metrics_filter</param-value>
-		</init-param>
-		<init-param>
-			<param-name>help</param-name>
-			<param-value>This is the help for your metrics filter</param-value>
-		</init-param>
-		<init-param>
-			<param-name>buckets</param-name>
-			<param-value>0.005,0.01,0.025,0.05,0.075,0.1,0.25,0.5,0.75,1,2.5,5,7.5,10</param-value>
-		</init-param>
-		<init-param>
-			<param-name>path-components</param-name>
-			<param-value>0</param-value>
-		</init-param>
-	</filter>
-
-	<filter-mapping>
-		<filter-name>prometheusFilter</filter-name>
-		<url-pattern>/*</url-pattern>
-	</filter-mapping>
-	End Prometheus -->
-
 	<filter-mapping>
 		<filter-name>OpenmeetingsApplication</filter-name>
 		<url-pattern>/*</url-pattern>
@@ -94,6 +66,17 @@
 		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 	</listener>
 
+	<!-- Start Prometheus export metrics HTTP
+	<servlet>
+		<servlet-name>metrics</servlet-name>
+		<servlet-class>org.apache.openmeetings.web.util.logging.OpenMeetingsMetricsServlet</servlet-class>
+	</servlet>
+	<servlet-mapping>
+		<servlet-name>metrics</servlet-name>
+		<url-pattern>/services/metrics/</url-pattern>
+	</servlet-mapping>
+		End Prometheus -->
+
 	<servlet>
 		<servlet-name>CXFServlet</servlet-name>
 		<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
@@ -109,17 +92,6 @@
 		<url-pattern>/services/*</url-pattern>
 	</servlet-mapping>
 
-	<!-- Start Prometheus export metrics HTTP
-	<servlet>
-		<servlet-name>metrics</servlet-name>
-		<servlet-class>org.apache.openmeetings.web.util.logging.OpenMeetingsMetricsServlet</servlet-class>
-	</servlet>
-	<servlet-mapping>
-		<servlet-name>metrics</servlet-name>
-		<url-pattern>/services/metrics/</url-pattern>
-	</servlet-mapping>
-	End Prometheus -->
-
 	<mime-mapping>
 		<extension>inc</extension>
 		<mime-type>text/plain</mime-type>
diff --git a/openmeetings-web/src/test/java/module-info.test b/openmeetings-web/src/test/java/module-info.test
deleted file mode 100644
index 428ba6791..000000000
--- a/openmeetings-web/src/test/java/module-info.test
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-open module org.apache.openmeetings.web {
-	// This one should be in-sync with module-info.java
-	requires org.apache.openmeetings.core;
-	requires org.apache.openmeetings.db;
-	requires org.apache.openmeetings.install;
-	requires org.apache.openmeetings.mediaserver;
-	requires org.apache.openmeetings.service;
-	requires org.apache.openmeetings.util;
-	requires org.apache.openmeetings.webservice;
-
-	requires com.github.openjson;
-
-	requires totp;
-
-	requires org.apache.commons.io;
-	requires org.apache.commons.fileupload2.core;
-	requires org.apache.commons.fileupload2.jakarta;
-	requires org.apache.commons.lang3;
-
-	requires org.apache.openjpa;
-
-	requires org.apache.httpcomponents.httpclient;
-
-	requires org.apache.wicket.auth.roles;
-	requires org.apache.wicket.core;
-	requires org.apache.wicket.devutils;
-	requires org.apache.wicket.extensions;
-	requires org.apache.wicket.ioc;
-	requires org.apache.wicket.request;
-	requires org.apache.wicket.spring;
-	requires org.apache.wicket.util;
-	requires org.apache.wicket.websocket.core;
-
-	requires wicketstuff.dashboard.core;
-	requires wicketstuff.datastore.hazelcast;
-	requires wicketstuff.select2;
-	requires wicketstuff.urlfragment;
-	requires jqplot;
-	requires jqplot4java;
-	requires wicket.bootstrap.extensions;
-	requires wicket.bootstrap.core;
-	requires wicket.bootstrap.themes;
-	requires wicket.webjars;
-	requires wicket.jquery.ui;
-	requires wicket.jquery.ui.calendar;
-	requires wicket.jquery.ui.core;
-	requires wicket.jquery.ui.plugins;
-
-	requires jakarta.annotation;
-	requires jakarta.inject;
-	requires jakarta.servlet;
-	requires jakarta.websocket.client;
-	requires jakarta.ws.rs;
-
-	requires java.net.http;
-	requires java.management;
-	requires java.sql;
-
-	requires com.hazelcast.core;
-	requires org.danekja.jdk.serializable.functional;
-	requires simpleclient.servlet.jakarta;
-	requires xstream;
-
-	requires spring.beans;
-	requires spring.context;
-	requires spring.orm;
-	requires spring.web;
-
-	requires org.slf4j;
-
-	//tests
-	requires org.junit.jupiter.api;
-}
diff --git a/openmeetings-webservice/pom.xml b/openmeetings-webservice/pom.xml
index acb255775..34409e16d 100644
--- a/openmeetings-webservice/pom.xml
+++ b/openmeetings-webservice/pom.xml
@@ -34,7 +34,7 @@
 	</properties>
 	<build>
 		<plugins>
-			<!--plugin>
+			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-javadoc-plugin</artifactId>
 				<executions>
@@ -51,10 +51,9 @@
 						<goals>
 							<goal>javadoc-no-fork</goal>
 						</goals>
-						<phase>generate-resources</phase>
 					</execution>
 				</executions>
-			</plugin-->
+			</plugin>
 			<plugin>
 				<groupId>io.openapitools.swagger</groupId>
 				<artifactId>swagger-maven-plugin</artifactId>
@@ -196,12 +195,5 @@
 			<groupId>io.swagger.core.v3</groupId>
 			<artifactId>swagger-annotations</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>org.apache.openmeetings</groupId>
-			<artifactId>openmeetings-util</artifactId>
-			<version>${project.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
 	</dependencies>
 </project>
diff --git a/openmeetings-webservice/src/test/java/module-info.test b/openmeetings-webservice/src/test/java/module-info.test
deleted file mode 100644
index d1c1fe2b3..000000000
--- a/openmeetings-webservice/src/test/java/module-info.test
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-open module org.apache.openmeetings.webservice {
-	// This one should be in-sync with module-info.java
-	exports org.apache.openmeetings.webservice.util;
-
-	requires org.apache.openmeetings.core;
-	requires org.apache.openmeetings.db;
-	requires org.apache.openmeetings.service;
-	requires org.apache.openmeetings.util;
-
-	requires com.github.openjson;
-	requires org.apache.commons.lang3;
-
-	requires jakarta.annotation;
-	requires jakarta.inject;
-	requires jakarta.jws;
-	requires jakarta.servlet;
-	requires jakarta.xml.ws;
-	requires jakarta.ws.rs;
-
-	requires org.apache.cxf.core;
-	requires org.apache.cxf.frontend.jaxrs;
-
-	requires org.apache.pdfbox;
-
-	requires org.apache.wicket.core;
-	requires org.apache.wicket.extensions;
-	requires org.apache.wicket.util;
-
-	requires io.swagger.v3.oas.annotations;
-	requires java.desktop;
-
-	requires spring.beans;
-	requires spring.context;
-
-	requires org.slf4j;
-
-	//tests
-	requires org.junit.jupiter.api;
-}
diff --git a/pom.xml b/pom.xml
index 814637c1d..cb2a51203 100644
--- a/pom.xml
+++ b/pom.xml
@@ -91,7 +91,7 @@
 		<tomcat.version>10.1.17</tomcat.version>
 		<ical4j.version>4.0.0-rc1</ical4j.version>
 		<cxf.version>4.0.3</cxf.version>
-		<io.prometheus.version>0.16.0</io.prometheus.version>
+		<io.prometheus.version>1.0.0</io.prometheus.version>
 		<aspectjtools.version>1.9.21</aspectjtools.version>
 		<simple-xml.version>2.7.1</simple-xml.version>
 		<jettison.version>1.5.4</jettison.version>
@@ -452,6 +452,12 @@
 				<artifactId>openmeetings-webservice</artifactId>
 				<version>${project.version}</version>
 			</dependency>
+			<dependency>
+				<groupId>org.apache.openmeetings</groupId>
+				<artifactId>openmeetings-tests</artifactId>
+				<version>${project.version}</version>
+				<scope>test</scope>
+			</dependency>
 			<dependency>
 				<groupId>org.apache.openmeetings</groupId>
 				<artifactId>openmeetings-util</artifactId>
@@ -570,7 +576,12 @@
 			</dependency>
 			<dependency>
 				<groupId>io.prometheus</groupId>
-				<artifactId>simpleclient_servlet_jakarta</artifactId>
+				<artifactId>prometheus-metrics-core</artifactId>
+				<version>${io.prometheus.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>io.prometheus</groupId>
+				<artifactId>prometheus-metrics-exporter-servlet-jakarta</artifactId>
 				<version>${io.prometheus.version}</version>
 			</dependency>
 			<dependency>
@@ -1159,6 +1170,36 @@
 					</execution>
 				</executions>
 			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-source-plugin</artifactId>
+				<configuration>
+					<skip>${om.quick.build}</skip>
+				</configuration>
+				<executions>
+					<execution>
+						<id>attach-sources</id>
+						<goals>
+							<goal>jar</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-javadoc-plugin</artifactId>
+				<configuration>
+					<skip>${om.quick.build}</skip>
+				</configuration>
+				<executions>
+					<execution>
+						<id>attach-javadocs</id>
+						<goals>
+							<goal>jar</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
 		</plugins>
 		<pluginManagement>
 			<plugins>
@@ -1169,7 +1210,6 @@
 						<doclint>none</doclint>
 						<additionalOptions>-html5</additionalOptions>
 						<source>${jdk.version}</source>
-						<javadocVersion>${jdk.version}</javadocVersion>
 						<notimestamp>true</notimestamp>
 						<links>
 							<link>https://openmeetings.apache.org/openmeetings-db/apidocs/</link>
@@ -1274,9 +1314,13 @@
 						<excludes>
 							<exclude/>
 						</excludes>
+						<argLine>@{argLine} --add-modules java.se --add-exports java.base/jdk.internal.ref=ALL-UNNAMED
+								--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED
+								--add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.management/sun.management=ALL-UNNAMED
+								--add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED
+								--add-opens java.base/java.util=ALL-UNNAMED --add-opens=java.base/sun.security.util=ALL-UNNAMED
+								--add-opens=java.base/sun.security.x509=ALL-UNNAMED</argLine>
 						<useModulePath>false</useModulePath>
-						<!--argLine>-Xint ${argLine}</argLine-->
-						<argLine>@{argLine} --add-modules java.se --add-exports java.base/jdk.internal.ref=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.management/sun.management=ALL-UNNAMED --add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens=java.base/sun.security.util=ALL-UNNAMED --add-opens=java.base/sun.security.x509=A [...]
 					</configuration>
 				</plugin>
 				<plugin>
@@ -1709,6 +1753,7 @@
 				<activeByDefault>true</activeByDefault>
 			</activation>
 			<modules>
+				<module>openmeetings-tests</module>
 				<module>openmeetings-util</module>
 				<module>openmeetings-db</module>
 				<module>openmeetings-core</module>
@@ -1740,33 +1785,6 @@
 			</properties>
 			<build>
 				<plugins>
-					<plugin>
-						<groupId>org.apache.maven.plugins</groupId>
-						<artifactId>maven-source-plugin</artifactId>
-						<executions>
-							<execution>
-								<id>attach-sources</id>
-								<goals>
-									<goal>jar</goal>
-								</goals>
-							</execution>
-						</executions>
-					</plugin>
-					<plugin>
-						<groupId>org.apache.maven.plugins</groupId>
-						<artifactId>maven-javadoc-plugin</artifactId>
-						<configuration>
-							<skip>false</skip>
-						</configuration>
-						<executions>
-							<execution>
-								<id>attach-javadocs</id>
-								<goals>
-									<goal>jar</goal>
-								</goals>
-							</execution>
-						</executions>
-					</plugin>
 					<plugin>
 						<groupId>net.nicoulaj.maven.plugins</groupId>
 						<artifactId>checksum-maven-plugin</artifactId>


(openmeetings) 13/29: [OPENMEETINGS-2756] spring, cxf, tomcat, wicket

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

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

commit 513af2513f3eee09d724aede7f4448e9943caba4
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Thu Dec 29 13:34:15 2022 +0700

    [OPENMEETINGS-2756] spring, cxf, tomcat, wicket
---
 .../java/org/apache/openmeetings/IApplication.java |  2 +-
 .../openmeetings/db/util/ApplicationHelper.java    |  6 ++--
 .../calendar/caldav/AppointmentManager.java        |  4 +--
 .../calendar/caldav/handler/CtagHandler.java       |  2 +-
 .../calendar/caldav/handler/EtagsHandler.java      |  6 ++--
 .../calendar/caldav/handler/MultigetHandler.java   |  2 +-
 .../calendar/caldav/handler/WebDAVSyncHandler.java |  8 ++---
 .../openmeetings/util/OMContextListener.java       |  4 +--
 .../web/common/upload/UploadResourceReference.java |  2 +-
 .../web/room/GroupCustomCssResourceReference.java  |  2 +-
 .../openmeetings/web/user/chat/ChatToolbar.java    |  2 +-
 .../web/util/FileItemResourceReference.java        |  2 +-
 .../web/util/GroupLogoResourceReference.java       |  2 +-
 .../web/util/ProfileImageResourceReference.java    |  2 +-
 .../org/apache/openmeetings/backup/TestExport.java |  4 +--
 .../web/app/TestOmAuthenticationStrategy.java      |  2 +-
 .../webservice/AbstractWebServiceTest.java         | 11 ++++---
 .../webservice/TestCalendarService.java            |  4 +--
 .../openmeetings/webservice/TestErrorService.java  |  2 +-
 .../openmeetings/webservice/TestGroupService.java  |  8 ++---
 .../openmeetings/webservice/TestUserService.java   |  6 ++--
 .../webservice/CalendarWebService.java             | 24 +++++++--------
 .../openmeetings/webservice/ErrorWebService.java   | 20 ++++++-------
 .../openmeetings/webservice/FileWebService.java    | 24 +++++++--------
 .../openmeetings/webservice/GroupWebService.java   | 22 +++++++-------
 .../openmeetings/webservice/InfoWebService.java    | 12 ++++----
 .../openmeetings/webservice/NetTestWebService.java | 19 ++++++------
 .../webservice/RecordingWebService.java            | 20 ++++++-------
 .../openmeetings/webservice/RoomWebService.java    | 24 +++++++--------
 .../openmeetings/webservice/UserWebService.java    | 24 +++++++--------
 .../openmeetings/webservice/WbWebService.java      | 23 +++++++-------
 .../webservice/error/ServiceException.java         |  2 +-
 .../util/AppointmentListMessageBodyWriter.java     | 10 +++----
 .../util/AppointmentMessageBodyReader.java         | 10 +++----
 .../util/AppointmentMessageBodyWriter.java         | 10 +++----
 .../webservice/util/AppointmentParamConverter.java |  2 +-
 .../webservice/util/CalendarParamConverter.java    |  2 +-
 .../webservice/util/DateParamConverter.java        |  2 +-
 .../webservice/util/OmExceptionHandler.java        |  4 +--
 .../webservice/util/OmParamConverterProvider.java  |  4 +--
 .../webservice/util/RateLimitRequestFilter.java    | 15 +++++-----
 .../openmeetings/webservice/util/RateLimited.java  |  2 +-
 .../webservice/util/UserMessageBodyWriter.java     | 10 +++----
 .../webservice/util/UserParamConverter.java        |  2 +-
 pom.xml                                            | 35 +++++++++++-----------
 45 files changed, 203 insertions(+), 202 deletions(-)

diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java b/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java
index d078f2945..fb0695fa1 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java
@@ -23,7 +23,7 @@ import java.util.Set;
 import java.util.function.Supplier;
 
 import javax.annotation.Nonnull;
-import javax.servlet.ServletContext;
+import jakarta.servlet.ServletContext;
 
 import org.apache.openmeetings.db.entity.room.Invitation;
 import org.apache.openmeetings.util.ws.IClusterWsMessage;
diff --git 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
index 89f3bee09..8c3db65f8 100644
--- 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
@@ -29,9 +29,9 @@ import java.util.Enumeration;
 import java.util.Map;
 import java.util.UUID;
 
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextEvent;
+import jakarta.servlet.FilterConfig;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletContextEvent;
 
 import org.apache.openmeetings.IApplication;
 import org.apache.openmeetings.IWebSession;
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/AppointmentManager.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/AppointmentManager.java
index 5c858eade..573a79905 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/AppointmentManager.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/AppointmentManager.java
@@ -18,8 +18,8 @@
  */
 package org.apache.openmeetings.service.calendar.caldav;
 
-import static javax.servlet.http.HttpServletResponse.SC_NO_CONTENT;
-import static javax.servlet.http.HttpServletResponse.SC_OK;
+import static jakarta.servlet.http.HttpServletResponse.SC_NO_CONTENT;
+import static jakarta.servlet.http.HttpServletResponse.SC_OK;
 
 import java.io.IOException;
 import java.net.URI;
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/CtagHandler.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/CtagHandler.java
index 3ed451db1..bf7c6525c 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/CtagHandler.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/CtagHandler.java
@@ -18,7 +18,7 @@
  */
 package org.apache.openmeetings.service.calendar.caldav.handler;
 
-import static javax.servlet.http.HttpServletResponse.SC_OK;
+import static jakarta.servlet.http.HttpServletResponse.SC_OK;
 
 import java.io.IOException;
 
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/EtagsHandler.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/EtagsHandler.java
index 262cd5051..a05b1f4ba 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/EtagsHandler.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/EtagsHandler.java
@@ -18,9 +18,9 @@
  */
 package org.apache.openmeetings.service.calendar.caldav.handler;
 
-import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
-import static javax.servlet.http.HttpServletResponse.SC_NO_CONTENT;
-import static javax.servlet.http.HttpServletResponse.SC_OK;
+import static jakarta.servlet.http.HttpServletResponse.SC_NOT_FOUND;
+import static jakarta.servlet.http.HttpServletResponse.SC_NO_CONTENT;
+import static jakarta.servlet.http.HttpServletResponse.SC_OK;
 
 import java.io.IOException;
 import java.net.URI;
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/MultigetHandler.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/MultigetHandler.java
index c7483f195..7c7f66a19 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/MultigetHandler.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/MultigetHandler.java
@@ -18,7 +18,7 @@
  */
 package org.apache.openmeetings.service.calendar.caldav.handler;
 
-import static javax.servlet.http.HttpServletResponse.SC_OK;
+import static jakarta.servlet.http.HttpServletResponse.SC_OK;
 
 import java.io.IOException;
 import java.util.List;
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/WebDAVSyncHandler.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/WebDAVSyncHandler.java
index 31d86739e..a041683eb 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/WebDAVSyncHandler.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/handler/WebDAVSyncHandler.java
@@ -19,10 +19,10 @@
 package org.apache.openmeetings.service.calendar.caldav.handler;
 
 
-import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN;
-import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
-import static javax.servlet.http.HttpServletResponse.SC_OK;
-import static javax.servlet.http.HttpServletResponse.SC_PRECONDITION_FAILED;
+import static jakarta.servlet.http.HttpServletResponse.SC_FORBIDDEN;
+import static jakarta.servlet.http.HttpServletResponse.SC_NOT_FOUND;
+import static jakarta.servlet.http.HttpServletResponse.SC_OK;
+import static jakarta.servlet.http.HttpServletResponse.SC_PRECONDITION_FAILED;
 import static org.apache.jackrabbit.webdav.DavServletResponse.SC_INSUFFICIENT_SPACE_ON_RESOURCE;
 
 import java.io.IOException;
diff --git a/openmeetings-util/src/main/java/org/apache/openmeetings/util/OMContextListener.java b/openmeetings-util/src/main/java/org/apache/openmeetings/util/OMContextListener.java
index 409de1771..8d0f84eac 100644
--- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/OMContextListener.java
+++ b/openmeetings-util/src/main/java/org/apache/openmeetings/util/OMContextListener.java
@@ -21,8 +21,8 @@ package org.apache.openmeetings.util;
 import java.io.IOException;
 import java.io.InputStream;
 
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
+import jakarta.servlet.ServletContextEvent;
+import jakarta.servlet.ServletContextListener;
 
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.LoggerFactory;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/upload/UploadResourceReference.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/upload/UploadResourceReference.java
index ee93c650f..e27570510 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/upload/UploadResourceReference.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/upload/UploadResourceReference.java
@@ -26,7 +26,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import javax.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.MediaType;
 
 import org.apache.commons.fileupload.FileItem;
 import org.apache.openmeetings.core.util.WebSocketHelper;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/GroupCustomCssResourceReference.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/GroupCustomCssResourceReference.java
index bca95d732..951961fd7 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/GroupCustomCssResourceReference.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/GroupCustomCssResourceReference.java
@@ -23,7 +23,7 @@ import static org.apache.openmeetings.util.OmFileHelper.getGroupCss;
 import java.io.File;
 import java.io.IOException;
 
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
 
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.resource.IResource;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
index 15501b539..868941abb 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
@@ -31,7 +31,7 @@ import static org.apache.openmeetings.web.room.RoomPanel.isModerator;
 
 import java.util.List;
 
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
 
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.dao.basic.ChatDao;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java
index 4b55126e9..8f83817d5 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java
@@ -24,7 +24,7 @@ import java.io.File;
 import java.io.IOException;
 import java.util.Map.Entry;
 
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
 
 import org.apache.openmeetings.db.dto.room.Whiteboard;
 import org.apache.openmeetings.db.dto.room.Whiteboards;
diff --git 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
index 23366bbc0..fca3b4805 100644
--- 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
@@ -27,7 +27,7 @@ import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import java.io.File;
 import java.io.IOException;
 
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
 
 import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.dao.user.GroupUserDao;
diff --git 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
index ce7959542..0fe896f25 100644
--- 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
@@ -33,7 +33,7 @@ import org.apache.wicket.util.io.IOUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.InputStream;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestExport.java b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestExport.java
index 6325193a4..4264812bc 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestExport.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestExport.java
@@ -30,8 +30,8 @@ import java.io.StringWriter;
 import java.nio.file.Paths;
 import java.time.LocalDate;
 
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.Marshaller;
+import jakarta.xml.bind.JAXBContext;
+import jakarta.xml.bind.Marshaller;
 
 import org.apache.openmeetings.AbstractOmServerTest;
 import org.apache.openmeetings.db.dao.file.FileItemDao;
diff --git 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
index 8c0a7c1f4..66929f191 100644
--- 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
@@ -23,7 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 
-import javax.servlet.http.Cookie;
+import jakarta.servlet.http.Cookie;
 
 import org.apache.openmeetings.AbstractWicketTesterTest;
 import org.apache.openmeetings.db.entity.user.User;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/AbstractWebServiceTest.java b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/AbstractWebServiceTest.java
index a9c15588d..3e40e1a2a 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/AbstractWebServiceTest.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/AbstractWebServiceTest.java
@@ -19,7 +19,6 @@
 package org.apache.openmeetings.webservice;
 
 import static java.util.UUID.randomUUID;
-import static javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED;
 import static org.apache.openmeetings.AbstractOmServerTest.createPass;
 import static org.apache.openmeetings.AbstractOmServerTest.ensureSchema;
 import static org.apache.openmeetings.AbstractOmServerTest.soapUsername;
@@ -35,9 +34,6 @@ import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.ws.rs.core.Form;
-import javax.ws.rs.core.MediaType;
-
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.cxf.jaxrs.ext.multipart.Attachment;
 import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
@@ -56,6 +52,9 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
+import jakarta.ws.rs.core.Form;
+import jakarta.ws.rs.core.MediaType;
+
 @Tag("webservice")
 public abstract class AbstractWebServiceTest {
 	private static final String HOST = "localhost";
@@ -115,7 +114,7 @@ public abstract class AbstractWebServiceTest {
 	protected static RoomDTO create(String sid, RoomDTO r) {
 		return getClient(getRoomUrl())
 				.query("sid", sid)
-				.type(APPLICATION_FORM_URLENCODED)
+				.type(MediaType.APPLICATION_FORM_URLENCODED)
 				.post(new Form().param("room", r.toString()), RoomDTO.class);
 	}
 
@@ -146,7 +145,7 @@ public abstract class AbstractWebServiceTest {
 		UserDTO user = getClient(getUserUrl())
 				.path("/")
 				.query("sid", r.getMessage())
-				.type(APPLICATION_FORM_URLENCODED)
+				.type(MediaType.APPLICATION_FORM_URLENCODED)
 				.post(new Form().param("user", dto.toString()).param("confirm", "" + false), UserDTO.class);
 		assertNotNull(user.getId());
 		u.setId(user.getId());
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestCalendarService.java b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestCalendarService.java
index ff962b016..c4f6420f3 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestCalendarService.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestCalendarService.java
@@ -34,8 +34,8 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
-import javax.ws.rs.core.Form;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Form;
+import jakarta.ws.rs.core.Response;
 
 import org.apache.openmeetings.AbstractOmServerTest;
 import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestErrorService.java b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestErrorService.java
index 42124d665..02e27cdbd 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestErrorService.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestErrorService.java
@@ -25,7 +25,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 import java.util.Locale;
 
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response;
 
 import org.apache.openmeetings.db.dao.label.LabelDao;
 import org.apache.openmeetings.db.dto.basic.ServiceResult;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestGroupService.java b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestGroupService.java
index 89bfa7ea1..1c2ff2127 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestGroupService.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestGroupService.java
@@ -23,18 +23,18 @@ import static org.apache.openmeetings.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;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.util.Collection;
 
-import javax.ws.rs.BadRequestException;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.BadRequestException;
+import jakarta.ws.rs.core.Response;
 
 import org.apache.openmeetings.db.dto.basic.ServiceResult;
 import org.apache.openmeetings.db.dto.basic.ServiceResult.Type;
 import org.apache.openmeetings.db.dto.room.RoomDTO;
 import org.apache.openmeetings.db.dto.user.GroupDTO;
 import org.apache.openmeetings.db.entity.room.Room;
-import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 class TestGroupService extends AbstractWebServiceTest {
@@ -92,7 +92,7 @@ class TestGroupService extends AbstractWebServiceTest {
 		RoomDTO rdto = new RoomDTO();
 		rdto.setName("Group WS Room");
 		String msg = sr.getMessage();
-		Assertions.assertThrows(BadRequestException.class, () -> create(msg, rdto));
+		assertThrows(BadRequestException.class, () -> create(msg, rdto));
 	}
 
 	@Test
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestUserService.java b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestUserService.java
index e3319ba6d..932eceb94 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestUserService.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestUserService.java
@@ -19,7 +19,7 @@
 package org.apache.openmeetings.webservice;
 
 import static java.util.UUID.randomUUID;
-import static javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED;
+import static jakarta.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED;
 import static org.apache.openmeetings.AbstractOmServerTest.adminUsername;
 import static org.apache.openmeetings.AbstractOmServerTest.createPass;
 import static org.apache.openmeetings.AbstractOmServerTest.rnd;
@@ -35,8 +35,8 @@ import java.util.Collection;
 import java.util.Locale;
 import java.util.TimeZone;
 
-import javax.ws.rs.core.Form;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Form;
+import jakarta.ws.rs.core.Response;
 
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.dto.basic.ServiceResult;
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
index 38d29fa93..3de82dd94 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
@@ -25,18 +25,18 @@ import java.util.Date;
 import java.util.List;
 import java.util.Set;
 
-import javax.jws.WebMethod;
-import javax.jws.WebParam;
-import javax.jws.WebService;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.FormParam;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
+import jakarta.jws.WebMethod;
+import jakarta.jws.WebParam;
+import jakarta.jws.WebService;
+import jakarta.ws.rs.DELETE;
+import jakarta.ws.rs.FormParam;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.core.MediaType;
 
 import org.apache.cxf.feature.Features;
 import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/ErrorWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/ErrorWebService.java
index 3561036e9..a84ab1bcc 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/ErrorWebService.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/ErrorWebService.java
@@ -20,16 +20,16 @@ package org.apache.openmeetings.webservice;
 
 import static org.apache.openmeetings.webservice.Constants.TNS;
 
-import javax.jws.WebMethod;
-import javax.jws.WebParam;
-import javax.jws.WebService;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
+import jakarta.jws.WebMethod;
+import jakarta.jws.WebParam;
+import jakarta.jws.WebService;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.core.MediaType;
 
 import org.apache.cxf.feature.Features;
 import org.apache.openmeetings.db.dao.label.LabelDao;
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/FileWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/FileWebService.java
index 5642c2f33..c1d587e99 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/FileWebService.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/FileWebService.java
@@ -25,18 +25,18 @@ import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 
-import javax.jws.WebMethod;
-import javax.jws.WebParam;
-import javax.jws.WebService;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
+import jakarta.jws.WebMethod;
+import jakarta.jws.WebParam;
+import jakarta.jws.WebService;
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.DELETE;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.core.MediaType;
 
 import org.apache.cxf.feature.Features;
 import org.apache.cxf.jaxrs.ext.multipart.Multipart;
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/GroupWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/GroupWebService.java
index 4da907296..6901fb608 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/GroupWebService.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/GroupWebService.java
@@ -25,17 +25,17 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-import javax.jws.WebMethod;
-import javax.jws.WebParam;
-import javax.jws.WebService;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
+import jakarta.jws.WebMethod;
+import jakarta.jws.WebParam;
+import jakarta.jws.WebService;
+import jakarta.ws.rs.DELETE;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.core.MediaType;
 
 import org.apache.cxf.feature.Features;
 import org.apache.openmeetings.db.dao.user.GroupDao;
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/InfoWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/InfoWebService.java
index 662ec883e..ae596c6d1 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/InfoWebService.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/InfoWebService.java
@@ -24,12 +24,12 @@ import static org.apache.openmeetings.webservice.Constants.TNS;
 
 import java.net.URI;
 
-import javax.jws.WebMethod;
-import javax.jws.WebService;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
+import jakarta.jws.WebMethod;
+import jakarta.jws.WebService;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.core.MediaType;
 
 import org.apache.cxf.feature.Features;
 import org.apache.openmeetings.db.dto.basic.Health;
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/NetTestWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/NetTestWebService.java
index 7a5ca8db5..1db37f87c 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/NetTestWebService.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/NetTestWebService.java
@@ -24,16 +24,17 @@ import java.io.InputStream;
 import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response.Status;
+
 import javax.annotation.PostConstruct;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.Status;
 
 import org.apache.openmeetings.webservice.util.RateLimited;
 import org.slf4j.Logger;
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RecordingWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RecordingWebService.java
index 255412cfd..2a8d16741 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RecordingWebService.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RecordingWebService.java
@@ -22,16 +22,16 @@ import static org.apache.openmeetings.webservice.Constants.TNS;
 
 import java.util.List;
 
-import javax.jws.WebMethod;
-import javax.jws.WebParam;
-import javax.jws.WebService;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
+import jakarta.jws.WebMethod;
+import jakarta.jws.WebParam;
+import jakarta.jws.WebService;
+import jakarta.ws.rs.DELETE;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.core.MediaType;
 
 import org.apache.cxf.feature.Features;
 import org.apache.openmeetings.db.dao.record.RecordingDao;
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
index bfec25a41..7dfc20c9b 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
@@ -23,18 +23,18 @@ import static org.apache.openmeetings.webservice.Constants.TNS;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.jws.WebMethod;
-import javax.jws.WebParam;
-import javax.jws.WebService;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.FormParam;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
+import jakarta.jws.WebMethod;
+import jakarta.jws.WebParam;
+import jakarta.jws.WebService;
+import jakarta.ws.rs.DELETE;
+import jakarta.ws.rs.FormParam;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.core.MediaType;
 
 import org.apache.cxf.feature.Features;
 import org.apache.openmeetings.core.util.WebSocketHelper;
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java
index 19acc7c6c..bb26ee6e9 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java
@@ -30,18 +30,18 @@ import java.security.NoSuchAlgorithmException;
 import java.util.List;
 import java.util.Locale;
 
-import javax.jws.WebMethod;
-import javax.jws.WebParam;
-import javax.jws.WebService;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.FormParam;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
+import jakarta.jws.WebMethod;
+import jakarta.jws.WebParam;
+import jakarta.jws.WebService;
+import jakarta.ws.rs.DELETE;
+import jakarta.ws.rs.FormParam;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.core.MediaType;
 
 import org.apache.cxf.feature.Features;
 import org.apache.openmeetings.core.util.StrongPasswordValidator;
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/WbWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/WbWebService.java
index 2c88b72fd..4be455b1f 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/WbWebService.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/WbWebService.java
@@ -29,17 +29,18 @@ import java.io.OutputStream;
 import java.nio.file.Paths;
 
 import javax.imageio.ImageIO;
-import javax.jws.WebMethod;
-import javax.jws.WebParam;
-import javax.jws.WebService;
-import javax.ws.rs.FormParam;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
+
+import jakarta.jws.WebMethod;
+import jakarta.jws.WebParam;
+import jakarta.jws.WebService;
+import jakarta.ws.rs.FormParam;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.core.MediaType;
 
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.io.FileUtils;
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/error/ServiceException.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/error/ServiceException.java
index 4b67a9b8c..447ec00dd 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/error/ServiceException.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/error/ServiceException.java
@@ -18,7 +18,7 @@
  */
 package org.apache.openmeetings.webservice.error;
 
-import javax.xml.ws.WebFault;
+import jakarta.xml.ws.WebFault;
 
 import org.apache.openmeetings.db.dto.basic.ServiceResult;
 
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentListMessageBodyWriter.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentListMessageBodyWriter.java
index 087c1cb22..3765fcf3b 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentListMessageBodyWriter.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentListMessageBodyWriter.java
@@ -30,11 +30,11 @@ import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.util.List;
 
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.ext.MessageBodyWriter;
-import javax.ws.rs.ext.Provider;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.ext.MessageBodyWriter;
+import jakarta.ws.rs.ext.Provider;
 
 import org.apache.openmeetings.db.dto.calendar.AppointmentDTO;
 
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentMessageBodyReader.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentMessageBodyReader.java
index 812fb0f35..68b931059 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentMessageBodyReader.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentMessageBodyReader.java
@@ -27,11 +27,11 @@ import java.io.InputStreamReader;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 
-import javax.ws.rs.Consumes;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.ext.MessageBodyReader;
-import javax.ws.rs.ext.Provider;
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.ext.MessageBodyReader;
+import jakarta.ws.rs.ext.Provider;
 
 import org.apache.openmeetings.db.dto.calendar.AppointmentDTO;
 
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentMessageBodyWriter.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentMessageBodyWriter.java
index 736c2a926..42de63dc1 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentMessageBodyWriter.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentMessageBodyWriter.java
@@ -28,11 +28,11 @@ import java.io.Writer;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.ext.MessageBodyWriter;
-import javax.ws.rs.ext.Provider;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.ext.MessageBodyWriter;
+import jakarta.ws.rs.ext.Provider;
 
 import org.apache.openmeetings.db.dto.calendar.AppointmentDTO;
 
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
index f3228015d..b557f1a8e 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
@@ -24,7 +24,7 @@ import static org.apache.openmeetings.util.CalendarPatterns.ISO8601_FULL_FORMAT;
 
 import java.util.Date;
 
-import javax.ws.rs.ext.ParamConverter;
+import jakarta.ws.rs.ext.ParamConverter;
 
 import org.apache.openmeetings.db.dto.calendar.AppointmentDTO;
 import org.apache.openmeetings.db.dto.calendar.MeetingMemberDTO;
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/CalendarParamConverter.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/CalendarParamConverter.java
index 7d4cf1990..31ee459be 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/CalendarParamConverter.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/CalendarParamConverter.java
@@ -23,7 +23,7 @@ import static org.apache.openmeetings.util.CalendarPatterns.ISO8601_FULL_FORMAT;
 import java.util.Calendar;
 import java.util.TimeZone;
 
-import javax.ws.rs.ext.ParamConverter;
+import jakarta.ws.rs.ext.ParamConverter;
 
 import org.apache.wicket.util.string.Strings;
 
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/DateParamConverter.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/DateParamConverter.java
index 0b454051b..3051c7d38 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/DateParamConverter.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/DateParamConverter.java
@@ -25,7 +25,7 @@ import static org.apache.openmeetings.util.CalendarPatterns.ISO8601_FULL_FORMAT;
 import java.text.ParseException;
 import java.util.Date;
 
-import javax.ws.rs.ext.ParamConverter;
+import jakarta.ws.rs.ext.ParamConverter;
 
 import org.apache.commons.lang3.time.FastDateFormat;
 import org.apache.wicket.util.string.Strings;
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmExceptionHandler.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmExceptionHandler.java
index 56aac5d42..2747b252e 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmExceptionHandler.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmExceptionHandler.java
@@ -18,8 +18,8 @@
  */
 package org.apache.openmeetings.webservice.util;
 
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.ExceptionMapper;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.ext.ExceptionMapper;
 
 import org.apache.openmeetings.db.dto.basic.ServiceResult;
 import org.apache.openmeetings.db.dto.basic.ServiceResult.Type;
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmParamConverterProvider.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmParamConverterProvider.java
index 52fafc7e4..ca5ae0c75 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmParamConverterProvider.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmParamConverterProvider.java
@@ -23,8 +23,8 @@ import java.lang.reflect.Type;
 import java.util.Calendar;
 import java.util.Date;
 
-import javax.ws.rs.ext.ParamConverter;
-import javax.ws.rs.ext.ParamConverterProvider;
+import jakarta.ws.rs.ext.ParamConverter;
+import jakarta.ws.rs.ext.ParamConverterProvider;
 
 import org.apache.openmeetings.db.dto.calendar.AppointmentDTO;
 import org.apache.openmeetings.db.dto.user.UserDTO;
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/RateLimitRequestFilter.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/RateLimitRequestFilter.java
index 50352cb83..6542cbb17 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/RateLimitRequestFilter.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/RateLimitRequestFilter.java
@@ -20,13 +20,14 @@ package org.apache.openmeetings.webservice.util;
 
 import java.util.List;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-import javax.ws.rs.container.ContainerRequestContext;
-import javax.ws.rs.container.ContainerRequestFilter;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.Status;
+import jakarta.ws.rs.container.ContainerRequestContext;
+import jakarta.ws.rs.container.ContainerRequestFilter;
+import jakarta.ws.rs.core.Context;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response.Status;
+
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpSession;
 
 import org.apache.openmeetings.webservice.NetTestWebService;
 import org.apache.openmeetings.webservice.NetTestWebService.TestType;
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/RateLimited.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/RateLimited.java
index 86834f863..3d5a55a62 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/RateLimited.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/RateLimited.java
@@ -25,7 +25,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
-import javax.ws.rs.NameBinding;
+import jakarta.ws.rs.NameBinding;
 
 @Retention(RUNTIME)
 @Target({TYPE, METHOD})
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/UserMessageBodyWriter.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/UserMessageBodyWriter.java
index b97b173c4..0ed1f7edd 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/UserMessageBodyWriter.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/UserMessageBodyWriter.java
@@ -28,11 +28,11 @@ import java.io.Writer;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.ext.MessageBodyWriter;
-import javax.ws.rs.ext.Provider;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.ext.MessageBodyWriter;
+import jakarta.ws.rs.ext.Provider;
 
 import org.apache.openmeetings.db.dto.user.UserDTO;
 
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/UserParamConverter.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/UserParamConverter.java
index 9ffde2ebc..ec4bc8d43 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/UserParamConverter.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/UserParamConverter.java
@@ -18,7 +18,7 @@
  */
 package org.apache.openmeetings.webservice.util;
 
-import javax.ws.rs.ext.ParamConverter;
+import jakarta.ws.rs.ext.ParamConverter;
 
 import org.apache.openmeetings.db.dto.user.UserDTO;
 
diff --git a/pom.xml b/pom.xml
index d5700cfa3..b137d792f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -83,14 +83,14 @@
 
 		<!-- dependency versions -->
 		<junit.version>5.10.1</junit.version>
-		<wicket.version>9.16.0</wicket.version>
-		<wicket-jquery-ui.version>9.12.0</wicket-jquery-ui.version>
-		<wicketstuff.version>9.16.0</wicketstuff.version>
-		<wicket-bootstrap.version>6.0.5</wicket-bootstrap.version>
-		<spring.version>5.3.31</spring.version>
-		<tomcat.version>9.0.84</tomcat.version>
+		<wicket.version>10.0.0-M2</wicket.version>
+		<wicket-jquery-ui.version>10.0.0-M1</wicket-jquery-ui.version>
+		<wicketstuff.version>10.0.0-M2</wicketstuff.version>
+		<wicket-bootstrap.version>7.0.1</wicket-bootstrap.version>
+		<spring.version>6.1.2</spring.version>
+		<tomcat.version>10.1.17</tomcat.version>
 		<ical4j.version>4.0.0-rc1</ical4j.version>
-		<cxf.version>3.6.2</cxf.version>
+		<cxf.version>4.0.3</cxf.version>
 		<io.prometheus.version>0.16.0</io.prometheus.version>
 		<aspectjtools.version>1.9.21</aspectjtools.version>
 		<simple-xml.version>2.7.1</simple-xml.version>
@@ -121,7 +121,7 @@
 		<tika-parsers.version>2.9.1</tika-parsers.version>
 		<slf4j.version>2.0.9</slf4j.version>
 		<logback.version>1.4.14</logback.version>
-		<jetty.version>9.4.53.v20231009</jetty.version>
+		<jetty.version>12.0.4</jetty.version>
 		<license.excludedScopes>test</license.excludedScopes>
 		<bcprov.version>1.77</bcprov.version>
 		<mockito.version>5.2.0</mockito.version>
@@ -130,8 +130,8 @@
 		<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.7</jodconverter.version>
-		<jaxb-runtime.version>2.3.9</jaxb-runtime.version>
-		<javax.servlet-api.version>3.1.0</javax.servlet-api.version>
+		<jaxb-runtime.version>4.0.4</jaxb-runtime.version>
+		<jakarta.servlet-api.version>5.0.0</jakarta.servlet-api.version>
 		<jquery-ui-touch-punch.version>0.2.3-2</jquery-ui-touch-punch.version>
 		<apacheds-test-framework.version>2.0.0.AM27</apacheds-test-framework.version>
 		<swagger.version>2.2.19</swagger.version>
@@ -539,7 +539,7 @@
 						<artifactId>*</artifactId>
 					</exclusion>
 					<exclusion>
-						<groupId>javax.servlet</groupId>
+						<groupId>jakarta.servlet</groupId>
 						<artifactId>*</artifactId>
 					</exclusion>
 				</exclusions>
@@ -554,7 +554,7 @@
 						<artifactId>*</artifactId>
 					</exclusion>
 					<exclusion>
-						<groupId>javax.servlet</groupId>
+						<groupId>jakarta.servlet</groupId>
 						<artifactId>*</artifactId>
 					</exclusion>
 					<exclusion>
@@ -654,10 +654,9 @@
 				<artifactId>wicketstuff-datastore-hazelcast</artifactId>
 				<version>${wicketstuff.version}</version>
 			</dependency>
-			<dependency>
-				<groupId>javax.servlet</groupId>
-				<artifactId>javax.servlet-api</artifactId>
-				<version>${javax.servlet-api.version}</version>
+				<groupId>jakarta.servlet</groupId>
+				<artifactId>jakarta.servlet-api</artifactId>
+				<version>${jakarta.servlet-api.version}</version>
 				<scope>provided</scope>
 			</dependency>
 			<dependency>
@@ -1043,8 +1042,8 @@
 			<scope>test</scope>
 		</dependency>
 		<dependency>
-			<groupId>javax.servlet</groupId>
-			<artifactId>javax.servlet-api</artifactId>
+			<groupId>jakarta.servlet</groupId>
+			<artifactId>jakarta.servlet-api</artifactId>
 		</dependency>
 	</dependencies>
 	<build>


(openmeetings) 06/29: Some more work on modules

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

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

commit 9447020eacdc84515602f23cdcc931a71290d019
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Fri Jul 23 10:22:37 2021 +0700

    Some more work on modules
---
 openmeetings-db/src/main/java/module-info.java   |  4 +--
 openmeetings-util/src/main/java/module-info.java | 37 ++++++++++++------------
 openmeetings-util/src/test/java/module-info.test | 25 ++++++++++++++++
 pom.xml                                          | 10 +++++++
 4 files changed, 55 insertions(+), 21 deletions(-)

diff --git a/openmeetings-db/src/main/java/module-info.java b/openmeetings-db/src/main/java/module-info.java
index 671932f9f..aa1690d87 100644
--- a/openmeetings-db/src/main/java/module-info.java
+++ b/openmeetings-db/src/main/java/module-info.java
@@ -49,8 +49,8 @@ module apache.openmeetings.db {
 	exports org.apache.openmeetings.db.util.ws;
 
 	requires transitive apache.openmeetings.util;
-	requires transitive wicket.request;
-	requires transitive wicket.native.websocket.core;
+	requires transitive org.apache.wicket.request;
+	requires transitive org.apache.wicket.websocket.core;
 	requires transitive spring.beans;
 	requires transitive spring.web;
 	requires transitive spring.core;
diff --git a/openmeetings-util/src/main/java/module-info.java b/openmeetings-util/src/main/java/module-info.java
index 3032e41b1..ecd52506e 100644
--- a/openmeetings-util/src/main/java/module-info.java
+++ b/openmeetings-util/src/main/java/module-info.java
@@ -16,34 +16,33 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-module 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 javax.servlet.api;
-
-	requires transitive wicket.util;
-	requires transitive wicket.core;
-	requires transitive wicket.extensions;
+module org.apache.openmeetings.util {
+	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 com.github.openjson;
 	requires transitive org.slf4j;
-	requires transitive logback.classic;
-	requires transitive logback.core;
-	requires transitive dom4j;
-	requires transitive jcip.annotations;
 	requires transitive org.bouncycastle.provider;
-	requires transitive java.activation;
+	requires transitive jakarta.activation;
 	requires transitive org.mnode.ical4j.core;
-	requires transitive tika.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 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;
 }
diff --git a/openmeetings-util/src/test/java/module-info.test b/openmeetings-util/src/test/java/module-info.test
new file mode 100644
index 000000000..5987c837c
--- /dev/null
+++ b/openmeetings-util/src/test/java/module-info.test
@@ -0,0 +1,25 @@
+/*
+ * 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.test {
+	requires transitive org.apache.openmeetings.util;
+
+	//tests
+	requires org.junit.jupiter.engine;
+	requires org.junit.jupiter.api;
+}
diff --git a/pom.xml b/pom.xml
index cf2c1d93c..c6a051818 100644
--- a/pom.xml
+++ b/pom.xml
@@ -650,6 +650,16 @@
 				<artifactId>wicket-spring</artifactId>
 				<version>${wicket.version}</version>
 			</dependency>
+			<dependency>
+				<groupId>org.wicketstuff</groupId>
+				<artifactId>wicketstuff-datastore-hazelcast</artifactId>
+				<version>${wicketstuff.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>javax.servlet</groupId>
 				<artifactId>javax.servlet-api</artifactId>


(openmeetings) 28/29: [OPENMEETINGS-2756] dependencies are aligned to wicket-M2

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

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

commit 5aac0901c587de5cd79dd13f7813cb54981f476c
Author: Maxim Solodovnik <so...@apache.org>
AuthorDate: Fri Oct 13 14:56:37 2023 +0700

    [OPENMEETINGS-2756] dependencies are aligned to wicket-M2
---
 openmeetings-core/src/main/java/module-info.java           |  6 +++---
 openmeetings-db/src/main/java/module-info.java             |  6 +++---
 openmeetings-install/src/main/java/module-info.java        |  2 +-
 openmeetings-mediaserver/src/main/java/module-info.java    |  4 ++--
 openmeetings-service/src/main/java/module-info.java        |  2 +-
 openmeetings-util/src/main/java/module-info.java           |  2 +-
 .../apache/openmeetings/util/process/ProcessHelper.java    |  2 +-
 openmeetings-web/pom.xml                                   |  8 ++++++++
 openmeetings-web/src/main/java/module-info.java            | 12 ++++++------
 .../apache/openmeetings/web/AbstractWicketTesterTest.java  |  2 +-
 .../java/org/apache/openmeetings/web/TestCalendar.java     |  1 -
 .../java/org/apache/openmeetings/web/TestMainAreas.java    |  1 -
 .../java/org/apache/openmeetings/web/TestMainMenu.java     |  1 -
 .../org/apache/openmeetings/web/pages/TestHashPage.java    |  2 +-
 openmeetings-webservice/src/main/java/module-info.java     |  2 +-
 pom.xml                                                    | 14 +++++++++++++-
 16 files changed, 42 insertions(+), 25 deletions(-)

diff --git a/openmeetings-core/src/main/java/module-info.java b/openmeetings-core/src/main/java/module-info.java
index e14c5ac26..2bf323ec7 100644
--- a/openmeetings-core/src/main/java/module-info.java
+++ b/openmeetings-core/src/main/java/module-info.java
@@ -27,7 +27,7 @@ module org.apache.openmeetings.core {
 	exports org.apache.openmeetings.core.sip;
 	exports org.apache.openmeetings.core.util;
 
-	requires com.github.openjson;
+	requires transitive com.github.openjson;
 
 	requires jakarta.annotation;
 	requires jakarta.inject;
@@ -39,8 +39,8 @@ module org.apache.openmeetings.core {
 	requires org.apache.tika.core;
 	requires org.apache.tika.parser.image;
 
-	requires org.apache.openmeetings.db;
-	requires org.apache.openmeetings.util;
+	requires transitive org.apache.openmeetings.db;
+	requires transitive org.apache.openmeetings.util;
 
 	requires org.apache.wicket.core;
 	requires org.apache.wicket.websocket.core;
diff --git a/openmeetings-db/src/main/java/module-info.java b/openmeetings-db/src/main/java/module-info.java
index 622b7a9b0..592e04f20 100644
--- a/openmeetings-db/src/main/java/module-info.java
+++ b/openmeetings-db/src/main/java/module-info.java
@@ -51,14 +51,14 @@ module org.apache.openmeetings.db {
 	exports org.apache.openmeetings.db.util;
 	exports org.apache.openmeetings.db.util.ws;
 
-	requires com.github.openjson;
+	requires transitive com.github.openjson;
 
 	requires org.apache.commons.lang3;
 	requires org.apache.commons.text;
 
 	requires org.apache.openjpa;
 
-	requires org.apache.openmeetings.util;
+	requires transitive org.apache.openmeetings.util;
 
 	requires org.apache.wicket.core;
 	requires org.apache.wicket.extensions;
@@ -74,7 +74,7 @@ module org.apache.openmeetings.db {
 
 	requires jakarta.annotation;
 	requires jakarta.inject;
-	requires jakarta.persistence;
+	requires transitive jakarta.persistence;
 	requires jakarta.servlet;
 	requires jakarta.xml.bind;
 
diff --git a/openmeetings-install/src/main/java/module-info.java b/openmeetings-install/src/main/java/module-info.java
index 60729e6df..e7aa2a2c2 100644
--- a/openmeetings-install/src/main/java/module-info.java
+++ b/openmeetings-install/src/main/java/module-info.java
@@ -30,7 +30,7 @@ module org.apache.openmeetings.install {
 	requires org.apache.openjpa;
 
 	requires org.apache.openmeetings.core;
-	requires org.apache.openmeetings.db;
+	requires transitive org.apache.openmeetings.db;
 	requires org.apache.openmeetings.util;
 
 	requires org.apache.wicket.core;
diff --git a/openmeetings-mediaserver/src/main/java/module-info.java b/openmeetings-mediaserver/src/main/java/module-info.java
index 45dee43fb..13752f047 100644
--- a/openmeetings-mediaserver/src/main/java/module-info.java
+++ b/openmeetings-mediaserver/src/main/java/module-info.java
@@ -25,7 +25,7 @@ module org.apache.openmeetings.mediaserver {
 	requires org.apache.commons.lang3;
 
 	requires org.apache.openmeetings.core;
-	requires org.apache.openmeetings.db;
+	requires transitive org.apache.openmeetings.db;
 	requires org.apache.openmeetings.util;
 
 	requires org.apache.wicket.ioc;
@@ -38,7 +38,7 @@ module org.apache.openmeetings.mediaserver {
 	requires spring.context;
 	requires spring.core;
 
-	requires kurento.client;
+	requires transitive kurento.client;
 	requires kurento.jsonrpc.client;
 	requires kurento.commons;
 	requires com.google.gson;
diff --git a/openmeetings-service/src/main/java/module-info.java b/openmeetings-service/src/main/java/module-info.java
index b0f443fcf..16b3d8aba 100644
--- a/openmeetings-service/src/main/java/module-info.java
+++ b/openmeetings-service/src/main/java/module-info.java
@@ -28,7 +28,7 @@ module org.apache.openmeetings.service {
 
 	requires org.apache.commons.lang3;
 
-	requires org.apache.openmeetings.db;
+	requires transitive org.apache.openmeetings.db;
 	requires org.apache.openmeetings.core;
 	requires org.apache.openmeetings.util;
 
diff --git a/openmeetings-util/src/main/java/module-info.java b/openmeetings-util/src/main/java/module-info.java
index 12b8d3ca4..cf9e7ebb6 100644
--- a/openmeetings-util/src/main/java/module-info.java
+++ b/openmeetings-util/src/main/java/module-info.java
@@ -30,7 +30,7 @@ module org.apache.openmeetings.util {
 	requires com.github.openjson;
 
 	requires org.apache.commons.codec;
-	requires org.apache.commons.lang3;
+	requires transitive org.apache.commons.lang3;
 
 	requires org.apache.tika.core;
 
diff --git a/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ProcessHelper.java b/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ProcessHelper.java
index 1eeb86b2a..be3413535 100644
--- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ProcessHelper.java
+++ b/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ProcessHelper.java
@@ -34,7 +34,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class ProcessHelper {
-	public static final Logger log = LoggerFactory.getLogger(ProcessHelper.class);
+	private static final Logger log = LoggerFactory.getLogger(ProcessHelper.class);
 
 	// This is necessary to prevent 'buffer overflow'
 	// https://stackoverflow.com/questions/9885643/ffmpeg-executed-from-javas-processbuilder-does-not-return-under-windows-7
diff --git a/openmeetings-web/pom.xml b/openmeetings-web/pom.xml
index 48dceb1ab..296658a08 100644
--- a/openmeetings-web/pom.xml
+++ b/openmeetings-web/pom.xml
@@ -474,6 +474,14 @@
 			<artifactId>commons-net</artifactId>
 		</dependency>
 		<!-- Test dependencies -->
+		<dependency>
+			<groupId>org.apache.wicket</groupId>
+			<artifactId>wicket-tester</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.wicket</groupId>
+			<artifactId>wicket-native-websocket-tester</artifactId>
+		</dependency>
 		<dependency>
 			<groupId>org.apache.openmeetings</groupId>
 			<artifactId>openmeetings-tests</artifactId>
diff --git a/openmeetings-web/src/main/java/module-info.java b/openmeetings-web/src/main/java/module-info.java
index 78eefd4db..b9cbf922c 100644
--- a/openmeetings-web/src/main/java/module-info.java
+++ b/openmeetings-web/src/main/java/module-info.java
@@ -47,12 +47,12 @@ module org.apache.openmeetings.web {
 	requires org.apache.wicket.util;
 	requires org.apache.wicket.websocket.core;
 
-	requires wicketstuff.dashboard.core;
-	requires wicketstuff.datastore.hazelcast;
-	requires wicketstuff.select2;
-	requires wicketstuff.urlfragment;
-	requires jqplot;
-	requires jqplot4java;
+	requires org.wicketstuff.dashboard;
+	requires org.wicketstuff.datastore.hazelcast;
+	requires org.wicketstuff.select2;
+	requires org.wicketstuff.urlfragment;
+	requires org.wicketstuff.jqplot;
+	requires org.wicketstuff.jqplot4j;
 	requires wicket.bootstrap.extensions;
 	requires wicket.bootstrap.core;
 	requires wicket.bootstrap.themes;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/web/AbstractWicketTesterTest.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/AbstractWicketTesterTest.java
index 1338fb00d..53e358747 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/AbstractWicketTesterTest.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/AbstractWicketTesterTest.java
@@ -40,7 +40,7 @@ import org.apache.openmeetings.util.OmException;
 import org.apache.wicket.behavior.AbstractAjaxBehavior;
 import org.apache.wicket.feedback.ExactLevelFeedbackMessageFilter;
 import org.apache.wicket.feedback.FeedbackMessage;
-import org.apache.wicket.protocol.ws.util.tester.WebSocketTester;
+import org.apache.wicket.protocol.ws.tester.WebSocketTester;
 import org.apache.wicket.util.lang.Args;
 import org.apache.wicket.util.tester.WicketTester;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestCalendar.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestCalendar.java
index aa41ad9c2..83bd16230 100644
--- 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,7 +25,6 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 import java.time.LocalDateTime;
 import java.util.List;
 
-import org.apache.openmeetings.web.AbstractWicketTesterTest;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.web.user.calendar.CalendarPanel;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestMainAreas.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestMainAreas.java
index 0f189264e..2a2498c02 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestMainAreas.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestMainAreas.java
@@ -40,7 +40,6 @@ import static org.junit.jupiter.api.Assertions.fail;
 
 import java.util.function.Consumer;
 
-import org.apache.openmeetings.web.AbstractWicketTesterTest;
 import org.apache.openmeetings.web.admin.backup.BackupPanel;
 import org.apache.openmeetings.web.admin.configurations.ConfigsPanel;
 import org.apache.openmeetings.web.admin.connection.ConnectionsPanel;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestMainMenu.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestMainMenu.java
index bd2be7d93..a73ff1054 100644
--- 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,7 +20,6 @@ package org.apache.openmeetings.web;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.apache.openmeetings.web.AbstractWicketTesterTest;
 import org.apache.openmeetings.web.admin.backup.BackupPanel;
 import org.apache.openmeetings.web.admin.configurations.ConfigsPanel;
 import org.apache.openmeetings.web.admin.connection.ConnectionsPanel;
diff --git 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
index c7be79a20..8cf579901 100644
--- 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
@@ -44,7 +44,7 @@ import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.openmeetings.web.user.record.VideoInfo;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.protocol.ws.util.tester.WebSocketTester;
+import org.apache.wicket.protocol.ws.tester.WebSocketTester;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.string.Strings;
 import org.junit.jupiter.api.Test;
diff --git a/openmeetings-webservice/src/main/java/module-info.java b/openmeetings-webservice/src/main/java/module-info.java
index 8ce3aff07..3024213c5 100644
--- a/openmeetings-webservice/src/main/java/module-info.java
+++ b/openmeetings-webservice/src/main/java/module-info.java
@@ -21,7 +21,7 @@ module org.apache.openmeetings.webservice {
 	exports org.apache.openmeetings.webservice.util;
 
 	requires org.apache.openmeetings.core;
-	requires org.apache.openmeetings.db;
+	requires transitive org.apache.openmeetings.db;
 	requires org.apache.openmeetings.service;
 	requires org.apache.openmeetings.util;
 
diff --git a/pom.xml b/pom.xml
index 88ebeee40..5f8a667fc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -89,6 +89,7 @@
 		<wicket-bootstrap.version>7.0.1</wicket-bootstrap.version>
 		<spring.version>6.1.2</spring.version>
 		<tomcat.version>10.1.17</tomcat.version>
+		<jetty.version>12.0.4</jetty.version>
 		<ical4j.version>4.0.0-rc1</ical4j.version>
 		<cxf.version>4.0.3</cxf.version>
 		<io.prometheus.version>1.0.0</io.prometheus.version>
@@ -126,7 +127,6 @@
 		<tika-parsers.version>3.0.0-BETA</tika-parsers.version>
 		<slf4j.version>2.0.9</slf4j.version>
 		<logback.version>1.4.14</logback.version>
-		<jetty.version>12.0.4</jetty.version>
 		<license.excludedScopes>test</license.excludedScopes>
 		<bcprov.version>1.77</bcprov.version>
 		<mockito.version>5.2.0</mockito.version>
@@ -605,11 +605,23 @@
 				<artifactId>wicket-util</artifactId>
 				<version>${wicket.version}</version>
 			</dependency>
+			<dependency>
+				<groupId>org.apache.wicket</groupId>
+				<artifactId>wicket-tester</artifactId>
+				<version>${wicket.version}</version>
+				<scope>test</scope>
+			</dependency>
 			<dependency>
 				<groupId>org.apache.wicket</groupId>
 				<artifactId>wicket-native-websocket-core</artifactId>
 				<version>${wicket.version}</version>
 			</dependency>
+			<dependency>
+				<groupId>org.apache.wicket</groupId>
+				<artifactId>wicket-native-websocket-tester</artifactId>
+				<version>${wicket.version}</version>
+				<scope>test</scope>
+			</dependency>
 			<dependency>
 				<groupId>org.apache.wicket</groupId>
 				<artifactId>wicket-core</artifactId>


(openmeetings) 24/29: [OPENMEETINGS-2756] custom-mimetypes.xml is moved to be searchable by Tika-3

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

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

commit 11987636fb707ce262d5f6ced0407a95db5ee87e
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Wed Oct 4 16:41:59 2023 +0700

    [OPENMEETINGS-2756] custom-mimetypes.xml is moved to be searchable by Tika-3
---
 .../src/main/resources/{org/apache/tika/mime => }/custom-mimetypes.xml    | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

diff --git a/openmeetings-util/src/main/resources/org/apache/tika/mime/custom-mimetypes.xml b/openmeetings-util/src/main/resources/custom-mimetypes.xml
similarity index 100%
rename from openmeetings-util/src/main/resources/org/apache/tika/mime/custom-mimetypes.xml
rename to openmeetings-util/src/main/resources/custom-mimetypes.xml


(openmeetings) 01/29: no jira: project is partially converted to use java11 modules

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

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

commit 172fff987104854ebaf0cec09217b014b747a5bf
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Tue Feb 18 00:32:32 2020 +0700

    no jira: project is partially converted to use java11 modules
---
 openmeetings-core/src/main/java/module-info.java   | 40 +++++++++++++
 openmeetings-db/src/main/java/module-info.java     | 66 ++++++++++++++++++++++
 .../apache/openmeetings/db/dao/label/LabelDao.java |  4 +-
 openmeetings-util/src/main/java/module-info.java   | 45 +++++++++++++++
 4 files changed, 153 insertions(+), 2 deletions(-)

diff --git a/openmeetings-core/src/main/java/module-info.java b/openmeetings-core/src/main/java/module-info.java
new file mode 100644
index 000000000..833be8717
--- /dev/null
+++ b/openmeetings-core/src/main/java/module-info.java
@@ -0,0 +1,40 @@
+/*
+ * 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;
+
+	requires transitive org.apache.commons.io;
+
+	requires transitive spring.context;
+
+	requires kurento.client;
+	requires kurento.commons;
+	requires kurento.jsonrpc.client;
+	requires java.activation;
+	requires com.google.gson;
+	requires java.mail;
+	requires api.all;
+	requires org.apache.tika.parsers;
+	requires java.xml;
+	requires xstream;
+
+	requires jodconverter.core;
+	requires jodconverter.local;
+}
diff --git a/openmeetings-db/src/main/java/module-info.java b/openmeetings-db/src/main/java/module-info.java
new file mode 100644
index 000000000..2d01a8c92
--- /dev/null
+++ b/openmeetings-db/src/main/java/module-info.java
@@ -0,0 +1,66 @@
+/*
+ * 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;
+	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.util;
+	exports org.apache.openmeetings.db.util.ws;
+
+	requires transitive apache.openmeetings.util;
+	requires transitive org.apache.wicket.request;
+	requires transitive org.apache.wicket.websocket.core;
+	requires transitive spring.beans;
+	requires transitive simple.xml;
+	requires transitive spring.web;
+	requires transitive spring.core;
+
+	requires spring.tx;
+	requires spring.context;
+	requires java.persistence;
+	requires openjpa;
+	requires asterisk.java;
+	requires java.xml.bind;
+	requires org.apache.commons.text;
+}
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/label/LabelDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/label/LabelDao.java
index 150e434a8..aabe63062 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/label/LabelDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/label/LabelDao.java
@@ -47,7 +47,6 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.openmeetings.db.dao.IDataProviderDao;
 import org.apache.openmeetings.db.entity.label.OmLanguage;
 import org.apache.openmeetings.db.entity.label.StringLabel;
@@ -194,7 +193,8 @@ public class LabelDao implements IDataProviderDao<StringLabel>{
 		}
 		List<StringLabel> result = new ArrayList<>(labelCache.containsKey(l) ? labelCache.get(l) : new ArrayList<StringLabel>());
 		if (!Strings.isEmpty(search)) {
-			CollectionUtils.filter(result, o -> o != null && (o.getKey().contains(search) || o.getValue().contains(search)));
+			result = result.stream().filter(o -> o != null && (o.getKey().contains(search) || o.getValue().contains(search)))
+					.collect(Collectors.toList());
 		}
 		return result;
 	}
diff --git a/openmeetings-util/src/main/java/module-info.java b/openmeetings-util/src/main/java/module-info.java
new file mode 100644
index 000000000..72dfb3c61
--- /dev/null
+++ b/openmeetings-util/src/main/java/module-info.java
@@ -0,0 +1,45 @@
+/*
+ * 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.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;
+
+	requires transitive javax.servlet.api;
+
+	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 com.github.openjson;
+	requires transitive org.slf4j;
+	requires transitive logback.classic;
+	requires transitive logback.core;
+	requires transitive dom4j;
+	requires transitive jcip.annotations;
+	requires transitive org.bouncycastle.provider;
+	requires transitive java.activation;
+	requires transitive org.mnode.ical4j.core;
+}


(openmeetings) 04/29: some compilation errors are resolved

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

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

commit 3260409c3b34c3288e05958e2aa6879b330c0bae
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Sat Jul 3 13:00:04 2021 +0700

    some compilation errors are resolved
---
 openmeetings-core/src/main/java/module-info.java | 11 +++++++++--
 openmeetings-db/src/main/java/module-info.java   |  5 ++---
 openmeetings-util/src/main/java/module-info.java | 12 ++++++++----
 3 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/openmeetings-core/src/main/java/module-info.java b/openmeetings-core/src/main/java/module-info.java
index 833be8717..7b874cd9c 100644
--- a/openmeetings-core/src/main/java/module-info.java
+++ b/openmeetings-core/src/main/java/module-info.java
@@ -30,11 +30,18 @@ module apache.openmeetings.core {
 	requires java.activation;
 	requires com.google.gson;
 	requires java.mail;
-	requires api.all;
-	requires org.apache.tika.parsers;
 	requires java.xml;
 	requires xstream;
 
 	requires jodconverter.core;
 	requires jodconverter.local;
+	requires org.apache.directory.ldap.api.all;
+	requires tika.core;
+	requires tika.parsers;
+	requires javax.inject;
+	requires wicket.ioc;
+	requires java.annotation;
+	requires apache.openmeetings.util;
+	requires asterisk.java;
+	requires jain.sip.ri;
 }
diff --git a/openmeetings-db/src/main/java/module-info.java b/openmeetings-db/src/main/java/module-info.java
index 120187f78..d8849cf89 100644
--- a/openmeetings-db/src/main/java/module-info.java
+++ b/openmeetings-db/src/main/java/module-info.java
@@ -49,8 +49,8 @@ module apache.openmeetings.db {
 	exports org.apache.openmeetings.db.util.ws;
 
 	requires transitive apache.openmeetings.util;
-	requires transitive org.apache.wicket.request;
-	requires transitive org.apache.wicket.websocket.core;
+	requires transitive wicket.request;
+	requires transitive wicket.native.websocket.core;
 	requires transitive spring.beans;
 	requires transitive spring.web;
 	requires transitive spring.core;
@@ -59,7 +59,6 @@ module apache.openmeetings.db {
 	requires spring.context;
 	requires javax.persistence;
 	requires openjpa;
-	requires asterisk.java;
 	requires java.xml.bind;
 	requires org.apache.commons.text;
 }
diff --git a/openmeetings-util/src/main/java/module-info.java b/openmeetings-util/src/main/java/module-info.java
index 72dfb3c61..65ecb4f2b 100644
--- a/openmeetings-util/src/main/java/module-info.java
+++ b/openmeetings-util/src/main/java/module-info.java
@@ -22,16 +22,16 @@ module apache.openmeetings.util {
 	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 javax.servlet.api;
 
-	requires transitive org.apache.wicket.util;
-	requires transitive org.apache.wicket.core;
-	requires transitive org.apache.wicket.extensions;
+	requires transitive wicket.util;
+	requires transitive wicket.core;
+	requires transitive wicket.extensions;
 
 	requires transitive org.apache.commons.codec;
 	requires transitive org.apache.commons.lang3;
-	requires transitive org.apache.tika.core;
 
 	requires transitive com.github.openjson;
 	requires transitive org.slf4j;
@@ -42,4 +42,8 @@ module apache.openmeetings.util {
 	requires transitive org.bouncycastle.provider;
 	requires transitive java.activation;
 	requires transitive org.mnode.ical4j.core;
+	requires transitive tika.core;
+	requires org.aspectj.tools;
+	requires spring.context;
+	requires simpleclient;
 }


(openmeetings) 22/29: [OPENMEETINGS-2756] audio/video is fixed; version is bumped

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

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

commit 4f282e02cfbd7973e07daefe76cc83b2abb18ccb
Author: Maxim Solodovnik <so...@apache.org>
AuthorDate: Wed Sep 27 18:54:43 2023 +0700

    [OPENMEETINGS-2756] audio/video is fixed; version is bumped
---
 openmeetings-core/pom.xml                          |  2 +-
 openmeetings-db/pom.xml                            |  2 +-
 openmeetings-install/pom.xml                       |  2 +-
 openmeetings-mediaserver/pom.xml                   |  2 +-
 .../src/main/java/module-info.java                 |  1 +
 .../openmeetings/mediaserver/IStreamProcessor.java | 24 ------------
 .../org/apache/openmeetings/mediaserver/KRoom.java |  2 +-
 .../openmeetings/mediaserver/KurentoHandler.java   | 44 ++++++++++++++++------
 .../openmeetings/mediaserver/StreamProcessor.java  | 18 +++++----
 .../mediaserver/StreamProcessorActions.java        |  7 ++--
 .../mediaserver/TestStreamProcessor.java           | 11 +++---
 .../src/test/java/module-info.test                 |  1 +
 openmeetings-screenshare/pom.xml                   |  2 +-
 openmeetings-server/pom.xml                        |  2 +-
 openmeetings-service/pom.xml                       |  2 +-
 openmeetings-util/pom.xml                          |  2 +-
 openmeetings-web/pom.xml                           |  2 +-
 openmeetings-webservice/pom.xml                    |  2 +-
 pom.xml                                            |  4 +-
 19 files changed, 67 insertions(+), 65 deletions(-)

diff --git a/openmeetings-core/pom.xml b/openmeetings-core/pom.xml
index 7b3e47fa1..54a96621f 100644
--- a/openmeetings-core/pom.xml
+++ b/openmeetings-core/pom.xml
@@ -22,7 +22,7 @@
 	<parent>
 		<groupId>org.apache.openmeetings</groupId>
 		<artifactId>openmeetings-parent</artifactId>
-		<version>7.2.0-SNAPSHOT</version>
+		<version>8.0.0-SNAPSHOT</version>
 		<relativePath>..</relativePath>
 	</parent>
 	<artifactId>openmeetings-core</artifactId>
diff --git a/openmeetings-db/pom.xml b/openmeetings-db/pom.xml
index 416b02239..3ba12399c 100644
--- a/openmeetings-db/pom.xml
+++ b/openmeetings-db/pom.xml
@@ -22,7 +22,7 @@
 	<parent>
 		<groupId>org.apache.openmeetings</groupId>
 		<artifactId>openmeetings-parent</artifactId>
-		<version>7.2.0-SNAPSHOT</version>
+		<version>8.0.0-SNAPSHOT</version>
 		<relativePath>..</relativePath>
 	</parent>
 	<artifactId>openmeetings-db</artifactId>
diff --git a/openmeetings-install/pom.xml b/openmeetings-install/pom.xml
index f01dd5faa..3e37d0ed7 100644
--- a/openmeetings-install/pom.xml
+++ b/openmeetings-install/pom.xml
@@ -22,7 +22,7 @@
 	<parent>
 		<groupId>org.apache.openmeetings</groupId>
 		<artifactId>openmeetings-parent</artifactId>
-		<version>7.2.0-SNAPSHOT</version>
+		<version>8.0.0-SNAPSHOT</version>
 		<relativePath>..</relativePath>
 	</parent>
 	<artifactId>openmeetings-install</artifactId>
diff --git a/openmeetings-mediaserver/pom.xml b/openmeetings-mediaserver/pom.xml
index 017679e2f..a38173417 100644
--- a/openmeetings-mediaserver/pom.xml
+++ b/openmeetings-mediaserver/pom.xml
@@ -22,7 +22,7 @@
 	<parent>
 		<groupId>org.apache.openmeetings</groupId>
 		<artifactId>openmeetings-parent</artifactId>
-		<version>7.2.0-SNAPSHOT</version>
+		<version>8.0.0-SNAPSHOT</version>
 		<relativePath>..</relativePath>
 	</parent>
 	<artifactId>openmeetings-mediaserver</artifactId>
diff --git a/openmeetings-mediaserver/src/main/java/module-info.java b/openmeetings-mediaserver/src/main/java/module-info.java
index 42f766fac..45dee43fb 100644
--- a/openmeetings-mediaserver/src/main/java/module-info.java
+++ b/openmeetings-mediaserver/src/main/java/module-info.java
@@ -36,6 +36,7 @@ module org.apache.openmeetings.mediaserver {
 
 	requires spring.beans;
 	requires spring.context;
+	requires spring.core;
 
 	requires kurento.client;
 	requires kurento.jsonrpc.client;
diff --git a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/IStreamProcessor.java b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/IStreamProcessor.java
deleted file mode 100644
index 6d6e65f96..000000000
--- a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/IStreamProcessor.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.openmeetings.mediaserver;
-
-public interface IStreamProcessor {
-	void release(AbstractStream stream, boolean releaseStream);
-	void destroy();
-}
diff --git a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KRoom.java b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KRoom.java
index abffc893a..e7edc4771 100644
--- a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KRoom.java
+++ b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KRoom.java
@@ -76,7 +76,7 @@ public class KRoom {
 	private JSONObject recordingUser = new JSONObject();
 	private JSONObject sharingUser = new JSONObject();
 
-	public KRoom(Room r) {
+	KRoom(Room r) {
 		this.room = r;
 		Injector.get().inject(this);
 		log.info("ROOM {} has been created", room.getId());
diff --git a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KurentoHandler.java b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KurentoHandler.java
index 957d33abe..d3989f7fe 100644
--- a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KurentoHandler.java
+++ b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KurentoHandler.java
@@ -57,6 +57,7 @@ import org.kurento.client.Continuation;
 import org.kurento.client.Endpoint;
 import org.kurento.client.EventListener;
 import org.kurento.client.KurentoClient;
+import org.kurento.client.ListenerSubscription;
 import org.kurento.client.MediaObject;
 import org.kurento.client.MediaPipeline;
 import org.kurento.client.ObjectCreatedEvent;
@@ -69,16 +70,17 @@ import org.kurento.client.WebRtcEndpoint;
 import org.kurento.jsonrpc.client.JsonRpcClientNettyWebSocket;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
 
 import com.github.openjson.JSONArray;
 import com.github.openjson.JSONObject;
 
 import jakarta.inject.Inject;
+import jakarta.inject.Named;
+import jakarta.inject.Singleton;
 
-@Component
+@Singleton
+@Named
 public class KurentoHandler {
 	private static final Logger log = LoggerFactory.getLogger(KurentoHandler.class);
 	public static final String PARAM_ICE = "iceServers";
@@ -115,6 +117,8 @@ public class KurentoHandler {
 	private String kuid;
 	private CertificateKeyType certificateType;
 	private KurentoClient client;
+	private ListenerSubscription objectCreatedListener;
+	private ListenerSubscription objectDestroyedListener;
 	private final AtomicBoolean connected = new AtomicBoolean(false);
 	private final Map<Long, KRoom> rooms = new ConcurrentHashMap<>();
 	private final Set<String> ignoredKuids = new HashSet<>();
@@ -138,6 +142,7 @@ public class KurentoHandler {
 
 	@PostConstruct
 	public void init() {
+		log.trace("KurentoHandler::PostConstruct");
 		Runnable check = () -> {
 			try {
 				if (client != null) {
@@ -178,8 +183,8 @@ public class KurentoHandler {
 							notifyRooms(true);
 						}
 					});
-				client.getServerManager().addObjectCreatedListener(new KWatchDogCreate());
-				client.getServerManager().addObjectDestroyedListener(event ->
+				objectCreatedListener = client.getServerManager().addObjectCreatedListener(new KWatchDogCreate());
+				objectDestroyedListener = client.getServerManager().addObjectDestroyedListener(event ->
 					log.debug("Kurento::ObjectDestroyedEvent objectId {}, tags {}, source {}", event.getObjectId(), event.getTags(), event.getSource())
 				);
 			} catch (Exception e) {
@@ -204,6 +209,14 @@ public class KurentoHandler {
 				client = null;
 				if (!copy.isClosed()) {
 					log.debug("Client will be destroyed ...");
+					if (objectCreatedListener != null) {
+						copy.getServerManager().removeObjectCreatedListener(objectCreatedListener);
+						objectCreatedListener = null;
+					}
+					if (objectDestroyedListener != null) {
+						copy.getServerManager().removeObjectDestroyedListener(objectDestroyedListener);
+						objectDestroyedListener = null;
+					}
 					copy.destroy();
 					log.debug(".... Client is destroyed");
 				}
@@ -304,7 +317,8 @@ public class KurentoHandler {
 		return rooms.computeIfAbsent(roomId, k -> {
 			log.debug("Room {} does not exist. Will create now!", roomId);
 			Room r = roomDao.get(roomId);
-			return new KRoom(r);
+			KRoom kRoom = new KRoom(r);
+			return kRoom;
 		});
 	}
 
@@ -382,7 +396,7 @@ public class KurentoHandler {
 		this.certificateType = CertificateKeyType.valueOf(certificateType);
 	}
 
-	public CertificateKeyType getCertificateType() {
+	CertificateKeyType getCertificateType() {
 		return certificateType;
 	}
 
@@ -412,6 +426,7 @@ public class KurentoHandler {
 		private void checkPipeline(String roomOid) {
 			scheduler.schedule(() -> {
 				if (client == null) {
+					log.trace("KWatchDog::checkPipeline Client is NULL");
 					return;
 				}
 				// still alive
@@ -420,17 +435,24 @@ public class KurentoHandler {
 				try {
 					final String inKuid = tags.get(TAG_KUID);
 					if (inKuid != null && ignoredKuids.contains(inKuid)) {
+						log.trace("KWatchDog::checkPipeline KUID in ignore list");
 						return;
 					}
 					if (validTestPipeline(tags)) {
+						log.trace("KWatchDog::checkPipeline test pipeline detected");
 						return;
 					}
 					if (kuid.equals(inKuid)) {
-						KStream stream = streamProcessor.getByUid(tags.get(TAG_STREAM_UID));
+						String streamUId = tags.get(TAG_STREAM_UID);
+						log.trace("KWatchDog::checkPipeline kuid matched, streamId: {}", streamUId);
+						KStream stream = streamProcessor.getByUid(streamUId);
 						if (stream != null) {
-							if (stream.getRoomId().equals(Long.valueOf(tags.get(TAG_ROOM)))
-									&& stream.getPipeline().getId().equals(pipe.getId()))
-							{
+							Long sRoomId = stream.getRoomId();
+							Long tRoomId = Long.valueOf(tags.get(TAG_ROOM));
+							String pipeId = stream.getPipeline().getId();
+							log.trace("KWatchDog::checkPipeline stream found! Room match ? {}, Pipe match ? {}"
+									, sRoomId.equals(tRoomId), pipeId.equals(pipe.getId()));
+							if (sRoomId.equals(tRoomId) && pipeId.equals(pipe.getId())) {
 								return;
 							} else {
 								stream.release();
diff --git a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/StreamProcessor.java b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/StreamProcessor.java
index e5116d70c..ee09c7545 100644
--- a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/StreamProcessor.java
+++ b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/StreamProcessor.java
@@ -35,11 +35,11 @@ import org.apache.openmeetings.core.converter.RecordingConverter;
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.dao.record.RecordingDao;
 import org.apache.openmeetings.db.entity.basic.Client;
-import org.apache.openmeetings.db.entity.basic.ScreenStreamDesc;
 import org.apache.openmeetings.db.entity.basic.Client.Activity;
+import org.apache.openmeetings.db.entity.basic.Client.StreamType;
+import org.apache.openmeetings.db.entity.basic.ScreenStreamDesc;
 import org.apache.openmeetings.db.entity.basic.StreamDesc;
 import org.apache.openmeetings.db.entity.basic.WebcamStreamDesc;
-import org.apache.openmeetings.db.entity.basic.Client.StreamType;
 import org.apache.openmeetings.db.entity.record.Recording;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.Room.Right;
@@ -52,17 +52,19 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.springframework.core.task.TaskExecutor;
-import org.springframework.stereotype.Component;
 
 import com.github.openjson.JSONObject;
 
 import jakarta.inject.Inject;
+import jakarta.inject.Named;
+import jakarta.inject.Singleton;
 
-@Component
-public class StreamProcessor implements IStreamProcessor {
+@Singleton
+@Named
+public class StreamProcessor {
 	private static final Logger log = LoggerFactory.getLogger(StreamProcessor.class);
 	/**
-	 * Holds a reference to the current streams available on the server instance
+	 * Holds references to the current streams available on the server instance
 	 */
 	private final Map<String, KStream> streamByUid = new ConcurrentHashMap<>();
 
@@ -465,7 +467,6 @@ public class StreamProcessor implements IStreamProcessor {
 		return recDao;
 	}
 
-	@Override
 	public void release(AbstractStream stream, boolean releaseStream) {
 		final String uid = stream.getUid();
 		if (releaseStream) {
@@ -480,11 +481,12 @@ public class StreamProcessor implements IStreamProcessor {
 				WebSocketHelper.sendRoom(new TextRoomMessage(c.getRoomId(), c, RoomMessage.Type.RIGHT_UPDATED, c.getUid()));
 			}
 		}
+		log.trace("StreamProcessor::release uid: {}", uid);
 		streamByUid.remove(uid);
 	}
 
-	@Override
 	public void destroy() {
+		log.trace("StreamProcessor::destroy !!!!");
 		for (Map.Entry<String, KStream> e : streamByUid.entrySet()) {
 			release(e.getValue(), true);
 		}
diff --git a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/StreamProcessorActions.java b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/StreamProcessorActions.java
index ea8f7d63e..d74da8d40 100644
--- a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/StreamProcessorActions.java
+++ b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/StreamProcessorActions.java
@@ -35,13 +35,14 @@ import org.kurento.client.internal.server.KurentoServerException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.springframework.stereotype.Component;
-
 import com.github.openjson.JSONObject;
 
 import jakarta.inject.Inject;
+import jakarta.inject.Named;
+import jakarta.inject.Singleton;
 
-@Component
+@Singleton
+@Named
 public class StreamProcessorActions {
 	private static final Logger log = LoggerFactory.getLogger(StreamProcessorActions.class);
 
diff --git a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/TestStreamProcessor.java b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/TestStreamProcessor.java
index a7309d122..42ce6fd1e 100644
--- a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/TestStreamProcessor.java
+++ b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/TestStreamProcessor.java
@@ -32,14 +32,15 @@ import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.entity.basic.IWsClient;
 import org.kurento.client.IceCandidate;
 
-import org.springframework.stereotype.Component;
-
 import com.github.openjson.JSONObject;
 
 import jakarta.inject.Inject;
+import jakarta.inject.Named;
+import jakarta.inject.Singleton;
 
-@Component
-class TestStreamProcessor implements IStreamProcessor {
+@Singleton
+@Named
+class TestStreamProcessor {
 	private final Map<String, KTestStream> streamByUid = new ConcurrentHashMap<>();
 
 	@Inject
@@ -101,12 +102,10 @@ class TestStreamProcessor implements IStreamProcessor {
 		}
 	}
 
-	@Override
 	public void release(AbstractStream stream, boolean releaseStream) {
 		streamByUid.remove(stream.getUid());
 	}
 
-	@Override
 	public void destroy() {
 		for (Entry<String, KTestStream> e : streamByUid.entrySet()) {
 			e.getValue().release();
diff --git a/openmeetings-mediaserver/src/test/java/module-info.test b/openmeetings-mediaserver/src/test/java/module-info.test
index deaf32995..5f839623c 100644
--- a/openmeetings-mediaserver/src/test/java/module-info.test
+++ b/openmeetings-mediaserver/src/test/java/module-info.test
@@ -37,6 +37,7 @@ module org.apache.openmeetings.mediaserver {
 
 	requires spring.beans;
 	requires spring.context;
+	requires spring.core;
 
 	requires kurento.client;
 	requires kurento.jsonrpc.client;
diff --git a/openmeetings-screenshare/pom.xml b/openmeetings-screenshare/pom.xml
index c7c819935..05b9e9035 100644
--- a/openmeetings-screenshare/pom.xml
+++ b/openmeetings-screenshare/pom.xml
@@ -22,7 +22,7 @@
 	<parent>
 		<groupId>org.apache.openmeetings</groupId>
 		<artifactId>openmeetings-parent</artifactId>
-		<version>7.2.0-SNAPSHOT</version>
+		<version>8.0.0-SNAPSHOT</version>
 		<relativePath>..</relativePath>
 	</parent>
 	<artifactId>openmeetings-screenshare</artifactId>
diff --git a/openmeetings-server/pom.xml b/openmeetings-server/pom.xml
index e51a40415..696978a04 100644
--- a/openmeetings-server/pom.xml
+++ b/openmeetings-server/pom.xml
@@ -22,7 +22,7 @@
 	<parent>
 		<groupId>org.apache.openmeetings</groupId>
 		<artifactId>openmeetings-parent</artifactId>
-		<version>7.2.0-SNAPSHOT</version>
+		<version>8.0.0-SNAPSHOT</version>
 		<relativePath>..</relativePath>
 	</parent>
 	<artifactId>openmeetings-server</artifactId>
diff --git a/openmeetings-service/pom.xml b/openmeetings-service/pom.xml
index 9d7bece7a..d3524fab7 100644
--- a/openmeetings-service/pom.xml
+++ b/openmeetings-service/pom.xml
@@ -22,7 +22,7 @@
 	<parent>
 		<groupId>org.apache.openmeetings</groupId>
 		<artifactId>openmeetings-parent</artifactId>
-		<version>7.2.0-SNAPSHOT</version>
+		<version>8.0.0-SNAPSHOT</version>
 		<relativePath>..</relativePath>
 	</parent>
 	<artifactId>openmeetings-service</artifactId>
diff --git a/openmeetings-util/pom.xml b/openmeetings-util/pom.xml
index 9989d3894..b4388d9a5 100644
--- a/openmeetings-util/pom.xml
+++ b/openmeetings-util/pom.xml
@@ -22,7 +22,7 @@
 	<parent>
 		<groupId>org.apache.openmeetings</groupId>
 		<artifactId>openmeetings-parent</artifactId>
-		<version>7.2.0-SNAPSHOT</version>
+		<version>8.0.0-SNAPSHOT</version>
 		<relativePath>..</relativePath>
 	</parent>
 	<artifactId>openmeetings-util</artifactId>
diff --git a/openmeetings-web/pom.xml b/openmeetings-web/pom.xml
index ee8ad5190..dda3a619f 100644
--- a/openmeetings-web/pom.xml
+++ b/openmeetings-web/pom.xml
@@ -22,7 +22,7 @@
 	<parent>
 		<groupId>org.apache.openmeetings</groupId>
 		<artifactId>openmeetings-parent</artifactId>
-		<version>7.2.0-SNAPSHOT</version>
+		<version>8.0.0-SNAPSHOT</version>
 		<relativePath>..</relativePath>
 	</parent>
 	<artifactId>openmeetings-web</artifactId>
diff --git a/openmeetings-webservice/pom.xml b/openmeetings-webservice/pom.xml
index d1758e1e7..acb255775 100644
--- a/openmeetings-webservice/pom.xml
+++ b/openmeetings-webservice/pom.xml
@@ -22,7 +22,7 @@
 	<parent>
 		<groupId>org.apache.openmeetings</groupId>
 		<artifactId>openmeetings-parent</artifactId>
-		<version>7.2.0-SNAPSHOT</version>
+		<version>8.0.0-SNAPSHOT</version>
 		<relativePath>..</relativePath>
 	</parent>
 	<artifactId>openmeetings-webservice</artifactId>
diff --git a/pom.xml b/pom.xml
index db407e748..79623a2c3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,13 +26,13 @@
 	</parent>
 	<groupId>org.apache.openmeetings</groupId>
 	<artifactId>openmeetings-parent</artifactId>
-	<version>7.2.0-SNAPSHOT</version>
+	<version>8.0.0-SNAPSHOT</version>
 	<packaging>pom</packaging>
 	<name>Openmeetings</name>
 	<description>Parent project for all OpenMeetings Maven modules. Required to hold general settings</description>
 	<properties>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-		<project.build.outputTimestamp>2023-05-10T02:44:22Z</project.build.outputTimestamp>
+		<project.build.outputTimestamp>2023-09-27T11:15:33Z</project.build.outputTimestamp>
 		<wicket.configuration>DEPLOYMENT</wicket.configuration>
 		<om.quick.build>false</om.quick.build>
 		<om.notquick.build>true</om.notquick.build>


(openmeetings) 07/29: The build is green

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

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

commit 6c8577f9d1aa58bba1bf2638aae9458ecab805e9
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Thu Apr 21 15:52:27 2022 +0700

    The build is green
---
 .../openmeetings/db/util/ApplicationHelper.java    |  6 ++-
 .../apache/openmeetings/backup/BackupImport.java   | 48 +++++++++++++++-------
 .../service/scheduler/ReminderJob.java             |  4 +-
 .../org/apache/openmeetings/backup/TestExport.java |  6 +--
 .../mail/template/subject/TestSubjTemplate.java    |  2 +-
 5 files changed, 44 insertions(+), 22 deletions(-)

diff --git 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
index d63c6c20a..89f3bee09 100644
--- 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
@@ -123,7 +123,11 @@ public class ApplicationHelper {
 			} catch(IllegalStateException e) {
 				app.setServletContext(new MockServletContext(app, null));
 			}
-			app.setConfigurationType(RuntimeConfigurationType.DEPLOYMENT);
+			try {
+				app.setConfigurationType(RuntimeConfigurationType.DEPLOYMENT);
+			} catch (IllegalStateException e) {
+				// no-op, might be already set
+			}
 			OMContextListener omcl = new OMContextListener();
 			omcl.contextInitialized(new ServletContextEvent(app.getServletContext()));
 			ThreadContext.setApplication(app);
diff --git a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
index 6ec134772..0ac284644 100644
--- a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
+++ b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
@@ -523,7 +523,8 @@ public class BackupImport {
 		messageFolderMap.put(TRASH_FOLDER_ID, TRASH_FOLDER_ID);
 	}
 
-	static BackupVersion getVersion(File base) {
+	// public for testing
+	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);
@@ -532,7 +533,8 @@ public class BackupImport {
 	/*
 	 * ##################### Import Configs
 	 */
-	void importConfigs(File base) throws Exception {
+	// public for testing
+	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_"))
@@ -595,7 +597,8 @@ public class BackupImport {
 	/*
 	 * ##################### Import Groups
 	 */
-	void importGroups(File base) {
+	// public for testing
+	public void importGroups(File base) {
 		log.info("Configs import complete, starting group import");
 		readList(base, "organizations.xml", GROUP_LIST_NODE, GROUP_NODE, Group.class, g -> {
 			Long oldId = g.getId();
@@ -608,7 +611,8 @@ public class BackupImport {
 	/*
 	 * ##################### Import LDAP Configs
 	 */
-	Long importLdap(File base) {
+	// public for testing
+	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 -> {
@@ -631,7 +635,8 @@ public class BackupImport {
 	/*
 	 * ##################### OAuth2 servers
 	 */
-	void importOauth(File base) {
+	// public for testing
+	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 -> {
@@ -676,7 +681,8 @@ public class BackupImport {
 	/*
 	 * ##################### Import Users
 	 */
-	void importUsers(File base) throws Exception {
+	// public for testing
+	public void importUsers(File base) throws Exception {
 		log.info("OAuth2 servers import complete, starting user import");
 		String jNameTimeZone = getDefaultTimezone();
 		//add existent emails from database
@@ -740,7 +746,8 @@ public class BackupImport {
 	/*
 	 * ##################### Import Rooms
 	 */
-	void importRooms(File base) throws Exception {
+	// public for testing
+	public void importRooms(File base) throws Exception {
 		log.info("Users import complete, starting room import");
 		Class<Room> eClazz = Room.class;
 		JAXBContext jc = JAXBContext.newInstance(eClazz);
@@ -775,7 +782,8 @@ public class BackupImport {
 	/*
 	 * ##################### Import Room Groups
 	 */
-	void importRoomGroups(File base) throws Exception {
+	// public for testing
+	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);
@@ -804,7 +812,8 @@ public class BackupImport {
 	/*
 	 * ##################### Import Chat messages
 	 */
-	void importChat(File base) throws Exception {
+	// public for testing
+	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);
@@ -827,7 +836,8 @@ public class BackupImport {
 	/*
 	 * ##################### Import Calendars
 	 */
-	void importCalendars(File base) throws Exception {
+	// public for testing
+	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);
@@ -845,7 +855,8 @@ public class BackupImport {
 	/*
 	 * ##################### Import Appointments
 	 */
-	void importAppointments(File base) throws Exception {
+	// public for testing
+	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);
@@ -880,7 +891,8 @@ public class BackupImport {
 	 *
 	 * Reminder Invitations will be NOT send!
 	 */
-	void importMeetingMembers(File base) throws Exception {
+	// public for testing
+	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);
@@ -970,10 +982,16 @@ public class BackupImport {
 		remain.entrySet().forEach(e -> log.warn("Doungling file/recording: {}", e.getValue()));
 		tree.process(f -> isInvalidFile(f, folders), save);
 	}
+
 	/*
 	 * ##################### Import Recordings
 	 */
+<<<<<<< HEAD
 	void importRecordings(File base) {
+=======
+	// public for testing
+	public void importRecordings(File base) throws Exception {
+>>>>>>> 2590e5123 (The build is green)
 		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 -> {
@@ -1016,7 +1034,8 @@ public class BackupImport {
 	/*
 	 * ##################### Import Private Message Folders
 	 */
-	void importPrivateMsgFolders(File base) {
+	// public for testing
+	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();
@@ -1161,7 +1180,8 @@ public class BackupImport {
 		}, true);
 	}
 
-	void importExtraMenus(File base) throws Exception {
+	// public for testing
+	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 --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/scheduler/ReminderJob.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/scheduler/ReminderJob.java
index 7bfd134a6..c0ceb43b1 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/scheduler/ReminderJob.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/scheduler/ReminderJob.java
@@ -65,8 +65,8 @@ public class ReminderJob extends AbstractJob {
 	@Autowired
 	private GroupUserDao groupUserDao;
 
-	//package private for testing
-	Map<Long, LocalDateTime> groupNotifications = new HashMap<>();
+	// public for testing
+	public Map<Long, LocalDateTime> groupNotifications = new HashMap<>();
 
 	public void remindMeetings() {
 		log.trace("ReminderJob.remindMeetings");
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestExport.java b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestExport.java
index 6a22356d3..5e51cb8de 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestExport.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestExport.java
@@ -26,9 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
-import java.io.IOException;
 import java.io.StringWriter;
-import java.io.Writer;
 import java.nio.file.Paths;
 import java.time.LocalDate;
 
@@ -45,8 +43,6 @@ 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 AbstractOmServerTest {
 	@Autowired
 	private FileItemDao fileItemDao;
@@ -68,12 +64,14 @@ class TestExport extends AbstractOmServerTest {
 		JAXBContext jc = JAXBContext.newInstance(eClazz);
 		Marshaller marshaller = jc.createMarshaller();
 		marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+		/* FIXME TODO
 		marshaller.setProperty(CharacterEscapeHandler.class.getName(), new CharacterEscapeHandler() {
 			@Override
 			public void escape(char[] ac, int i, int j, boolean flag, Writer writer) throws IOException {
 				writer.write(ac, i, j);
 			}
 		});
+		*/
 		StringWriter writer = new StringWriter();
 		marshaller.marshal(u, writer);
 		Assertions.assertNotNull(writer.getBuffer());
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/service/mail/template/subject/TestSubjTemplate.java b/openmeetings-web/src/test/java/org/apache/openmeetings/service/mail/template/subject/TestSubjTemplate.java
index d57918187..e7ed63470 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/service/mail/template/subject/TestSubjTemplate.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/service/mail/template/subject/TestSubjTemplate.java
@@ -85,7 +85,7 @@ class TestSubjTemplate extends AbstractWicketTesterTest {
 			private static final long serialVersionUID = 1L;
 
 			@Override
-			String getPrefix() {
+			public String getPrefix() {
 				return null;
 			}
 		};


(openmeetings) 05/29: Another attempt to fix the build

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

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

commit f3245bbc11bc1a79003f71e8973d39ae6db0503c
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Sat Jul 3 18:07:33 2021 +0700

    Another attempt to fix the build
---
 openmeetings-core/src/main/java/module-info.java | 3 ---
 openmeetings-db/src/main/java/module-info.java   | 1 -
 openmeetings-util/src/main/java/module-info.java | 2 +-
 3 files changed, 1 insertion(+), 5 deletions(-)

diff --git a/openmeetings-core/src/main/java/module-info.java b/openmeetings-core/src/main/java/module-info.java
index 7b874cd9c..6495df2b8 100644
--- a/openmeetings-core/src/main/java/module-info.java
+++ b/openmeetings-core/src/main/java/module-info.java
@@ -22,8 +22,6 @@ module apache.openmeetings.core {
 
 	requires transitive org.apache.commons.io;
 
-	requires transitive spring.context;
-
 	requires kurento.client;
 	requires kurento.commons;
 	requires kurento.jsonrpc.client;
@@ -36,7 +34,6 @@ module apache.openmeetings.core {
 	requires jodconverter.core;
 	requires jodconverter.local;
 	requires org.apache.directory.ldap.api.all;
-	requires tika.core;
 	requires tika.parsers;
 	requires javax.inject;
 	requires wicket.ioc;
diff --git a/openmeetings-db/src/main/java/module-info.java b/openmeetings-db/src/main/java/module-info.java
index d8849cf89..671932f9f 100644
--- a/openmeetings-db/src/main/java/module-info.java
+++ b/openmeetings-db/src/main/java/module-info.java
@@ -56,7 +56,6 @@ module apache.openmeetings.db {
 	requires transitive spring.core;
 
 	requires spring.tx;
-	requires spring.context;
 	requires javax.persistence;
 	requires openjpa;
 	requires java.xml.bind;
diff --git a/openmeetings-util/src/main/java/module-info.java b/openmeetings-util/src/main/java/module-info.java
index 65ecb4f2b..3032e41b1 100644
--- a/openmeetings-util/src/main/java/module-info.java
+++ b/openmeetings-util/src/main/java/module-info.java
@@ -44,6 +44,6 @@ module apache.openmeetings.util {
 	requires transitive org.mnode.ical4j.core;
 	requires transitive tika.core;
 	requires org.aspectj.tools;
-	requires spring.context;
+	requires transitive spring.context;
 	requires simpleclient;
 }


(openmeetings) 12/29: Some minor (incomplete) JPMS changes

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

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

commit efbfea5179f1bd35ec25151740adcb731b28e607
Author: Maxim Solodovnik <so...@apache.org>
AuthorDate: Mon Sep 25 11:24:42 2023 +0700

    Some minor (incomplete) JPMS changes
---
 openmeetings-core/src/main/java/module-info.java | 1 -
 openmeetings-util/src/main/java/module-info.java | 2 +-
 openmeetings-util/src/test/java/module-info.test | 2 +-
 3 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/openmeetings-core/src/main/java/module-info.java b/openmeetings-core/src/main/java/module-info.java
index ec9973b40..9a17eeddd 100644
--- a/openmeetings-core/src/main/java/module-info.java
+++ b/openmeetings-core/src/main/java/module-info.java
@@ -41,6 +41,5 @@ module org.apache.openmeetings.core {
 	requires javax.inject;
 	requires asterisk.java;
 	requires jain.sip.ri;
-	requires org.apache.tika.parsers;
 	requires jakarta.mail;
 }
diff --git a/openmeetings-util/src/main/java/module-info.java b/openmeetings-util/src/main/java/module-info.java
index fdb492512..3e307dab1 100644
--- a/openmeetings-util/src/main/java/module-info.java
+++ b/openmeetings-util/src/main/java/module-info.java
@@ -39,7 +39,7 @@ module org.apache.openmeetings.util {
 	requires jakarta.activation;
 	requires org.mnode.ical4j.core;
 	requires org.aspectj.tools;
-	requires dom4j;
+	requires org.dom4j;
 	requires simpleclient;
 	requires ch.qos.logback.classic;
 	requires ch.qos.logback.core;
diff --git a/openmeetings-util/src/test/java/module-info.test b/openmeetings-util/src/test/java/module-info.test
index b65dab769..579e840ad 100644
--- a/openmeetings-util/src/test/java/module-info.test
+++ b/openmeetings-util/src/test/java/module-info.test
@@ -40,7 +40,7 @@ open module org.apache.openmeetings.util {
 	requires jakarta.activation;
 	requires org.mnode.ical4j.core;
 	requires org.aspectj.tools;
-	requires dom4j;
+	requires org.dom4j;
 	requires simpleclient;
 	requires ch.qos.logback.classic;
 	requires ch.qos.logback.core;


(openmeetings) 03/29: OpenJpa modules were changed

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

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

commit 456f9e030ad9cf5824de76d5019f231bf39486c1
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Sun Mar 15 15:24:33 2020 +0700

    OpenJpa modules were changed
---
 openmeetings-db/src/main/java/module-info.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/openmeetings-db/src/main/java/module-info.java b/openmeetings-db/src/main/java/module-info.java
index b42eb42a0..120187f78 100644
--- a/openmeetings-db/src/main/java/module-info.java
+++ b/openmeetings-db/src/main/java/module-info.java
@@ -57,7 +57,7 @@ module apache.openmeetings.db {
 
 	requires spring.tx;
 	requires spring.context;
-	requires java.persistence;
+	requires javax.persistence;
 	requires openjpa;
 	requires asterisk.java;
 	requires java.xml.bind;


(openmeetings) 02/29: Simple-xml is dropped

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

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

commit 6c43bbac4e64c20c5ac970dc105112a45a41c674
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Sat Mar 14 11:03:03 2020 +0700

    Simple-xml is dropped
---
 openmeetings-db/src/main/java/module-info.java | 1 -
 1 file changed, 1 deletion(-)

diff --git a/openmeetings-db/src/main/java/module-info.java b/openmeetings-db/src/main/java/module-info.java
index 2d01a8c92..b42eb42a0 100644
--- a/openmeetings-db/src/main/java/module-info.java
+++ b/openmeetings-db/src/main/java/module-info.java
@@ -52,7 +52,6 @@ module apache.openmeetings.db {
 	requires transitive org.apache.wicket.request;
 	requires transitive org.apache.wicket.websocket.core;
 	requires transitive spring.beans;
-	requires transitive simple.xml;
 	requires transitive spring.web;
 	requires transitive spring.core;
 


(openmeetings) 29/29: [OPENMEETINGS-2756] the build seems to be fixed

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

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

commit b7d01a1ed9233718932c53753a5114f4977769bd
Author: Maxim Solodovnik <so...@apache.org>
AuthorDate: Thu Dec 21 12:05:23 2023 +0700

    [OPENMEETINGS-2756] the build seems to be fixed
---
 .../src/main/java/module-info.java                 |    3 +-
 openmeetings-service/pom.xml                       |    8 +-
 .../src/main/java/module-info.java                 |    9 +-
 .../jackrabbit/webdav/AbstractLocatorFactory.java  |  403 +++++
 .../webdav/ContentCodingAwareRequest.java          |   39 +
 .../apache/jackrabbit/webdav/DavCompliance.java    |   72 +
 .../org/apache/jackrabbit/webdav/DavConstants.java |  154 ++
 .../org/apache/jackrabbit/webdav/DavException.java |  175 +++
 .../jackrabbit/webdav/DavLocatorFactory.java       |   72 +
 .../org/apache/jackrabbit/webdav/DavMethods.java   |  410 ++++++
 .../org/apache/jackrabbit/webdav/DavResource.java  |  334 +++++
 .../jackrabbit/webdav/DavResourceFactory.java      |   46 +
 .../jackrabbit/webdav/DavResourceIterator.java     |   39 +
 .../jackrabbit/webdav/DavResourceIteratorImpl.java |   85 ++
 .../jackrabbit/webdav/DavResourceLocator.java      |  115 ++
 .../jackrabbit/webdav/DavServletRequest.java       |  199 +++
 .../jackrabbit/webdav/DavServletResponse.java      |  149 ++
 .../org/apache/jackrabbit/webdav/DavSession.java   |   62 +
 .../jackrabbit/webdav/DavSessionProvider.java      |   48 +
 .../org/apache/jackrabbit/webdav/MultiStatus.java  |  193 +++
 .../jackrabbit/webdav/MultiStatusResponse.java     |  486 ++++++
 .../java/org/apache/jackrabbit/webdav/Status.java  |  125 ++
 .../apache/jackrabbit/webdav/WebdavRequest.java    |   36 +
 .../jackrabbit/webdav/WebdavRequestContext.java    |   30 +
 .../jackrabbit/webdav/WebdavRequestImpl.java       | 1324 +++++++++++++++++
 .../apache/jackrabbit/webdav/WebdavResponse.java   |   42 +
 .../jackrabbit/webdav/WebdavResponseImpl.java      |  392 +++++
 .../jackrabbit/webdav/bind/BindConstants.java      |   52 +
 .../apache/jackrabbit/webdav/bind/BindInfo.java    |  108 ++
 .../jackrabbit/webdav/bind/BindServletRequest.java |   65 +
 .../jackrabbit/webdav/bind/BindableResource.java   |   50 +
 .../jackrabbit/webdav/bind/ParentElement.java      |  111 ++
 .../apache/jackrabbit/webdav/bind/ParentSet.java   |   45 +
 .../apache/jackrabbit/webdav/bind/RebindInfo.java  |  108 ++
 .../apache/jackrabbit/webdav/bind/UnbindInfo.java  |   90 ++
 .../jackrabbit/webdav/bind/package-info.java       |   18 +
 .../webdav/client/methods/BaseDavRequest.java      |  219 +++
 .../jackrabbit/webdav/client/methods/HttpBind.java |   54 +
 .../webdav/client/methods/HttpCheckin.java         |   51 +
 .../webdav/client/methods/HttpCheckout.java        |   51 +
 .../jackrabbit/webdav/client/methods/HttpCopy.java |   59 +
 .../webdav/client/methods/HttpDelete.java          |   43 +
 .../webdav/client/methods/HttpLabel.java           |   57 +
 .../jackrabbit/webdav/client/methods/HttpLock.java |  107 ++
 .../webdav/client/methods/HttpMerge.java           |   55 +
 .../webdav/client/methods/HttpMkcol.java           |   51 +
 .../webdav/client/methods/HttpMkworkspace.java     |   51 +
 .../jackrabbit/webdav/client/methods/HttpMove.java |   56 +
 .../webdav/client/methods/HttpOptions.java         |   79 +
 .../webdav/client/methods/HttpOrderpatch.java      |   53 +
 .../jackrabbit/webdav/client/methods/HttpPoll.java |   58 +
 .../webdav/client/methods/HttpPropfind.java        |   77 +
 .../webdav/client/methods/HttpProppatch.java       |  104 ++
 .../webdav/client/methods/HttpRebind.java          |   54 +
 .../webdav/client/methods/HttpReport.java          |   66 +
 .../webdav/client/methods/HttpSearch.java          |   54 +
 .../webdav/client/methods/HttpSubscribe.java       |   88 ++
 .../webdav/client/methods/HttpUnbind.java          |   54 +
 .../webdav/client/methods/HttpUnlock.java          |   55 +
 .../webdav/client/methods/HttpUnsubscribe.java     |   53 +
 .../webdav/client/methods/HttpUpdate.java          |   54 +
 .../webdav/client/methods/HttpVersionControl.java  |   51 +
 .../webdav/client/methods/XmlEntity.java           |   68 +
 .../webdav/client/methods/package-info.java        |   31 +
 .../jackrabbit/webdav/header/CodedUrlHeader.java   |  113 ++
 .../jackrabbit/webdav/header/DepthHeader.java      |  128 ++
 .../jackrabbit/webdav/header/FieldValueParser.java |   55 +
 .../apache/jackrabbit/webdav/header/Header.java    |   27 +
 .../apache/jackrabbit/webdav/header/IfHeader.java  |  905 ++++++++++++
 .../jackrabbit/webdav/header/LabelHeader.java      |   61 +
 .../jackrabbit/webdav/header/OverwriteHeader.java  |   75 +
 .../webdav/header/PollTimeoutHeader.java           |   52 +
 .../jackrabbit/webdav/header/TimeoutHeader.java    |  104 ++
 .../jackrabbit/webdav/header/package-info.java     |   18 +
 .../apache/jackrabbit/webdav/io/InputContext.java  |   78 +
 .../jackrabbit/webdav/io/InputContextImpl.java     |   98 ++
 .../apache/jackrabbit/webdav/io/OutputContext.java |   82 ++
 .../jackrabbit/webdav/io/OutputContextImpl.java    |   88 ++
 .../apache/jackrabbit/webdav/io/package-info.java  |   18 +
 .../jackrabbit/webdav/lock/AbstractActiveLock.java |   86 ++
 .../jackrabbit/webdav/lock/AbstractLockEntry.java  |   47 +
 .../apache/jackrabbit/webdav/lock/ActiveLock.java  |  124 ++
 .../jackrabbit/webdav/lock/DefaultActiveLock.java  |  147 ++
 .../jackrabbit/webdav/lock/LockDiscovery.java      |  233 +++
 .../apache/jackrabbit/webdav/lock/LockEntry.java   |   39 +
 .../apache/jackrabbit/webdav/lock/LockInfo.java    |  237 +++
 .../apache/jackrabbit/webdav/lock/LockManager.java |   87 ++
 .../org/apache/jackrabbit/webdav/lock/Scope.java   |  122 ++
 .../jackrabbit/webdav/lock/SimpleLockManager.java  |  233 +++
 .../jackrabbit/webdav/lock/SupportedLock.java      |  166 +++
 .../org/apache/jackrabbit/webdav/lock/Type.java    |  129 ++
 .../jackrabbit/webdav/lock/package-info.java       |   18 +
 .../webdav/observation/DefaultEventType.java       |  148 ++
 .../jackrabbit/webdav/observation/EventBundle.java |   29 +
 .../webdav/observation/EventDiscovery.java         |  121 ++
 .../jackrabbit/webdav/observation/EventType.java   |   30 +
 .../jackrabbit/webdav/observation/Filter.java      |   74 +
 .../webdav/observation/ObservationConstants.java   |  101 ++
 .../observation/ObservationDavServletRequest.java  |   54 +
 .../observation/ObservationDavServletResponse.java |   45 +
 .../webdav/observation/ObservationResource.java    |   72 +
 .../webdav/observation/Subscription.java           |   49 +
 .../webdav/observation/SubscriptionDiscovery.java  |  139 ++
 .../webdav/observation/SubscriptionInfo.java       |  242 +++
 .../webdav/observation/SubscriptionManager.java    |   69 +
 .../webdav/observation/package-info.java           |   18 +
 .../jackrabbit/webdav/ordering/OrderPatch.java     |  212 +++
 .../webdav/ordering/OrderingConstants.java         |  106 ++
 .../webdav/ordering/OrderingDavServletRequest.java |   55 +
 .../webdav/ordering/OrderingResource.java          |   47 +
 .../jackrabbit/webdav/ordering/OrderingType.java   |   52 +
 .../jackrabbit/webdav/ordering/Position.java       |  164 +++
 .../jackrabbit/webdav/ordering/package-info.java   |   18 +
 .../org/apache/jackrabbit/webdav/package-info.java |   18 +
 .../webdav/property/AbstractDavProperty.java       |  163 ++
 .../jackrabbit/webdav/property/DavProperty.java    |   71 +
 .../webdav/property/DavPropertyIterator.java       |   34 +
 .../webdav/property/DavPropertyName.java           |  206 +++
 .../webdav/property/DavPropertyNameIterator.java   |   28 +
 .../webdav/property/DavPropertyNameSet.java        |  203 +++
 .../jackrabbit/webdav/property/DavPropertySet.java |  300 ++++
 .../webdav/property/DefaultDavProperty.java        |  144 ++
 .../jackrabbit/webdav/property/HrefProperty.java   |  159 ++
 .../jackrabbit/webdav/property/PropContainer.java  |  120 ++
 .../jackrabbit/webdav/property/PropEntry.java      |   25 +
 .../jackrabbit/webdav/property/PropfindInfo.java   |   84 ++
 .../jackrabbit/webdav/property/ProppatchInfo.java  |  128 ++
 .../jackrabbit/webdav/property/ResourceType.java   |  205 +++
 .../jackrabbit/webdav/property/package-info.java   |   18 +
 .../jackrabbit/webdav/search/QueryGrammerSet.java  |  144 ++
 .../jackrabbit/webdav/search/SearchConstants.java  |   91 ++
 .../jackrabbit/webdav/search/SearchInfo.java       |  271 ++++
 .../jackrabbit/webdav/search/SearchResource.java   |   55 +
 .../jackrabbit/webdav/search/package-info.java     |   18 +
 .../jackrabbit/webdav/security/AclProperty.java    |  262 ++++
 .../jackrabbit/webdav/security/AclResource.java    |   70 +
 .../webdav/security/AclRestrictionsProperty.java   |  107 ++
 .../security/CurrentUserPrivilegeSetProperty.java  |   90 ++
 .../jackrabbit/webdav/security/Principal.java      |  189 +++
 .../jackrabbit/webdav/security/Privilege.java      |  204 +++
 .../webdav/security/SecurityConstants.java         |  110 ++
 .../webdav/security/SupportedPrivilege.java        |  139 ++
 .../security/SupportedPrivilegeSetProperty.java    |   95 ++
 .../jackrabbit/webdav/security/package-info.java   |   18 +
 .../security/report/AbstractSecurityReport.java    |   82 ++
 .../webdav/security/report/AclPrincipalReport.java |   96 ++
 .../security/report/PrincipalMatchReport.java      |  115 ++
 .../security/report/PrincipalSearchReport.java     |  184 +++
 .../security/report/SearchablePropertyReport.java  |  204 +++
 .../webdav/security/report/package-info.java       |   18 +
 .../webdav/server/AbstractWebdavServlet.java       | 1557 ++++++++++++++++++++
 .../webdav/server/WebdavRequestContextHolder.java  |   46 +
 .../webdav/server/WebdavRequestContextImpl.java    |   35 +
 .../jackrabbit/webdav/server/package-info.java     |   18 +
 .../webdav/transaction/TransactionConstants.java   |  125 ++
 .../transaction/TransactionDavServletRequest.java  |   51 +
 .../webdav/transaction/TransactionInfo.java        |  105 ++
 .../webdav/transaction/TransactionResource.java    |   59 +
 .../webdav/transaction/TxActiveLock.java           |   93 ++
 .../jackrabbit/webdav/transaction/TxLockEntry.java |   72 +
 .../webdav/transaction/TxLockManager.java          |   65 +
 .../webdav/transaction/package-info.java           |   18 +
 .../apache/jackrabbit/webdav/util/CSRFUtil.java    |  168 +++
 .../apache/jackrabbit/webdav/util/EncodeUtil.java  |  220 +++
 .../jackrabbit/webdav/util/HttpDateFormat.java     |   64 +
 .../webdav/util/HttpDateTimeFormatter.java         |  152 ++
 .../webdav/util/LinkHeaderFieldParser.java         |  197 +++
 .../jackrabbit/webdav/util/package-info.java       |   18 +
 .../webdav/version/ActivityResource.java           |   98 ++
 .../webdav/version/BaselineResource.java           |   81 +
 .../jackrabbit/webdav/version/DeltaVConstants.java |  374 +++++
 .../jackrabbit/webdav/version/DeltaVResource.java  |  111 ++
 .../webdav/version/DeltaVServletRequest.java       |   84 ++
 .../jackrabbit/webdav/version/LabelInfo.java       |  188 +++
 .../webdav/version/LabelSetProperty.java           |   63 +
 .../jackrabbit/webdav/version/MergeInfo.java       |  182 +++
 .../jackrabbit/webdav/version/OptionsInfo.java     |  126 ++
 .../jackrabbit/webdav/version/OptionsResponse.java |  144 ++
 .../webdav/version/SupportedMethodSetProperty.java |   63 +
 .../jackrabbit/webdav/version/UpdateInfo.java      |  243 +++
 .../webdav/version/VersionControlledResource.java  |  363 +++++
 .../webdav/version/VersionHistoryResource.java     |   73 +
 .../jackrabbit/webdav/version/VersionResource.java |  213 +++
 .../webdav/version/VersionableResource.java        |   64 +
 .../webdav/version/WorkspaceResource.java          |   94 ++
 .../jackrabbit/webdav/version/package-info.java    |   18 +
 .../webdav/version/report/AbstractReport.java      |   59 +
 .../version/report/CompareBaselineReport.java      |  188 +++
 .../version/report/ExpandPropertyReport.java       |  266 ++++
 .../report/LatestActivityVersionReport.java        |  151 ++
 .../version/report/LocateByHistoryReport.java      |  175 +++
 .../jackrabbit/webdav/version/report/Report.java   |   62 +
 .../webdav/version/report/ReportInfo.java          |  263 ++++
 .../webdav/version/report/ReportType.java          |  190 +++
 .../version/report/SupportedReportSetProperty.java |  119 ++
 .../webdav/version/report/VersionTreeReport.java   |  187 +++
 .../webdav/version/report/package-info.java        |   18 +
 .../webdav/xml/DavDocumentBuilderFactory.java      |   87 ++
 .../org/apache/jackrabbit/webdav/xml/DomUtil.java  |  839 +++++++++++
 .../jackrabbit/webdav/xml/ElementIterator.java     |  170 +++
 .../apache/jackrabbit/webdav/xml/Namespace.java    |   97 ++
 .../apache/jackrabbit/webdav/xml/ResultHelper.java |  458 ++++++
 .../jackrabbit/webdav/xml/XmlSerializable.java     |   38 +
 .../apache/jackrabbit/webdav/xml/package-info.java |   18 +
 .../apache/jackrabbit/webdav/statuscode.properties |   62 +
 openmeetings-util/src/main/java/module-info.java   |    4 +-
 openmeetings-web/src/main/java/module-info.java    |    9 +-
 .../org/apache/openmeetings/ldap/TestLdap.java     |    2 -
 pom.xml                                            |   20 +-
 209 files changed, 26536 insertions(+), 24 deletions(-)

diff --git a/openmeetings-install/src/main/java/module-info.java b/openmeetings-install/src/main/java/module-info.java
index e7aa2a2c2..2ee926d43 100644
--- a/openmeetings-install/src/main/java/module-info.java
+++ b/openmeetings-install/src/main/java/module-info.java
@@ -24,8 +24,10 @@ module org.apache.openmeetings.install {
 
 	requires com.github.openjson;
 
+	requires org.apache.commons.cli;
 	requires org.apache.commons.io;
 	requires org.apache.commons.lang3;
+	requires org.apache.commons.text;
 
 	requires org.apache.openjpa;
 
@@ -45,7 +47,6 @@ module org.apache.openmeetings.install {
 	requires spring.web;
 
 	requires java.desktop;
-	requires commons.cli;
 	requires quartz;
 	requires xstream;
 
diff --git a/openmeetings-service/pom.xml b/openmeetings-service/pom.xml
index d3524fab7..4384c2e72 100644
--- a/openmeetings-service/pom.xml
+++ b/openmeetings-service/pom.xml
@@ -53,9 +53,9 @@
 			<groupId>com.github.caldav4j</groupId>
 			<artifactId>caldav4j</artifactId>
 		</dependency>
-		<dependency>
+		<!--dependency> FIXME TODO have to be placed back as soon as `jackrabbit.webdav` will be jackarta compatible
 			<groupId>org.apache.jackrabbit</groupId>
-			<artifactId>jackrabbit-webdav-jakarta</artifactId>
-		</dependency>
-</dependencies>
+			<artifactId>jackrabbit-webdav</artifactId>
+		</dependency-->
+	</dependencies>
 </project>
diff --git a/openmeetings-service/src/main/java/module-info.java b/openmeetings-service/src/main/java/module-info.java
index 16b3d8aba..e2e2ededb 100644
--- a/openmeetings-service/src/main/java/module-info.java
+++ b/openmeetings-service/src/main/java/module-info.java
@@ -26,7 +26,14 @@ module org.apache.openmeetings.service {
 	exports org.apache.openmeetings.service.room;
 	exports org.apache.openmeetings.service.scheduler;
 
+	//FIXME TODO temporary
+	exports org.apache.jackrabbit.webdav;
+	exports org.apache.jackrabbit.webdav.xml;
+	exports org.apache.jackrabbit.webdav.property;
+	exports org.apache.jackrabbit.webdav.client.methods;
+
 	requires org.apache.commons.lang3;
+	requires org.apache.commons.text;
 
 	requires transitive org.apache.openmeetings.db;
 	requires org.apache.openmeetings.core;
@@ -45,7 +52,7 @@ module org.apache.openmeetings.service {
 
 	requires org.apache.httpcomponents.httpcore;
 	requires org.apache.httpcomponents.httpclient;
-	requires jackrabbit.webdav.jakarta;
+	//requires jackrabbit.webdav; FIXME TODO have to be placed back as soon as `jackrabbit.webdav` will be jackarta compatible
 	requires caldav4j;
 	requires java.xml;
 	requires org.mnode.ical4j.core;
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/AbstractLocatorFactory.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/AbstractLocatorFactory.java
new file mode 100644
index 000000000..36b0a68e1
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/AbstractLocatorFactory.java
@@ -0,0 +1,403 @@
+/*
+ * 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.jackrabbit.webdav;
+
+import org.apache.jackrabbit.webdav.util.EncodeUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * {@code AbstractLocatorFactory} is an implementation of the DavLocatorFactory
+ * interface that defines how a given URI is split to workspace path and
+ * resource path and how it's implementation of {@code DavResourceLocator}
+ * builds the href. In contrast, the conversion from repository path to
+ * resource path and vice versa is left to subclasses.
+ */
+public abstract class AbstractLocatorFactory implements DavLocatorFactory {
+
+    private static Logger log = LoggerFactory.getLogger(AbstractLocatorFactory.class);
+
+    private final String pathPrefix;
+
+    /**
+     * Create a new factory
+     *
+     * @param pathPrefix Prefix, that needs to be removed in order to retrieve
+     * the path of the repository item from a given {@code DavResourceLocator}.
+     */
+    public AbstractLocatorFactory(String pathPrefix) {
+        this.pathPrefix = pathPrefix;
+    }
+
+    //--------------------------------------------------< DavLocatorFactory >---
+    /**
+     * Create a new {@code DavResourceLocator}. Any leading prefix and
+     * path-prefix (as defined with the constructor) are removed from the
+     * given request handle. The same applies for trailing '/'. The remaining
+     * String is called the 'resource handle' and it's first segment is treated
+     * as workspace name. If resource handle (and therefore workspace name)
+     * are missing, both values are set to {@code null}.
+     * <p>
+     * Examples:
+     *
+     * <pre>
+     * http://www.foo.bar/ (path prefix missing)
+     * -&gt; workspace path = null
+     * -&gt; resource path  = null
+     * -&gt; href           = http://www.foo.bar/pathPrefix/
+     *
+     * http://www.foo.bar/pathPrefix/
+     * -&gt; workspace path = null
+     * -&gt; resource path  = null
+     * -&gt; href           = http://www.foo.bar/pathPrefix/
+     *
+     * http://www.foo.bar/pathPrefix/wspName
+     * -&gt; workspace path = /wspName
+     * -&gt; resource path  = /wspName
+     * -&gt; href           = http://www.foo.bar/pathPrefix/wspName
+     *
+     * http://www.foo.bar/pathPrefix/wspName/anypath
+     * -&gt; workspace path = /wspName
+     * -&gt; resource path  = /wspName/anypath
+     * -&gt; href           = http://www.foo.bar/pathPrefix/wspName/anypath
+     * </pre>
+     *
+     * NOTE: If the given href is an absolute URI it must start with the
+     * specified prefix.
+     *
+     * @param prefix
+     * @param href
+     * @return a new {@code DavResourceLocator}
+     * @throws IllegalArgumentException if the given href is {@code null}
+     */
+    public DavResourceLocator createResourceLocator(String prefix, String href) {
+        if (href == null) {
+            throw new IllegalArgumentException("Request handle must not be null.");
+        }
+
+        // build prefix string and remove all prefixes from the given href.
+        StringBuffer b = new StringBuffer("");
+        if (prefix != null && prefix.length() > 0) {
+            b.append(prefix);
+            if (href.startsWith(prefix)) {
+                href = href.substring(prefix.length());
+            }
+        }
+        if (pathPrefix != null && pathPrefix.length() > 0) {
+            if (!b.toString().endsWith(pathPrefix)) {
+                b.append(pathPrefix);
+            }
+            if (href.startsWith(pathPrefix)) {
+                href = href.substring(pathPrefix.length());
+            }
+        }
+
+        // remove trailing "/" that is present with collections
+        if (href.endsWith("/")) {
+            href = href.substring(0, href.length() - 1);
+        }
+
+        String resourcePath;
+        String workspacePath;
+
+        // an empty requestHandle (after removal of the "/") signifies a request
+        // to the root that does not represent a repository item.
+        if ("".equals(href)) {
+            resourcePath = null;
+            workspacePath = null;
+        } else {
+            resourcePath = EncodeUtil.unescape(href);
+            // retrieve wspPath: look for the first slash ignoring the leading one
+            int pos = href.indexOf('/', 1);
+            if (pos == -1) {
+                // request to a 'workspace' resource
+                workspacePath = resourcePath;
+            } else {
+                // separate the workspace path from the resource path.
+                workspacePath = EncodeUtil.unescape(href.substring(0, pos));
+            }
+        }
+
+        log.trace("createResourceLocator: prefix='" + prefix + "' href='" + href + "' -> prefix='" + b.toString()
+                + "' workspacePath='" + workspacePath + "' resourcePath='" + resourcePath + "'");
+        return new DavResourceLocatorImpl(b.toString(), workspacePath, resourcePath, this);
+    }
+
+    /**
+     * Like {@link #createResourceLocator(String, String)}, but by setting
+     * {@code forDestination} to {@code true} any special processing of URI
+     * suffixes can be disabled.
+     */
+    public DavResourceLocator createResourceLocator(String prefix, String href, boolean forDestination) {
+        return createResourceLocator(prefix, href);
+    }
+
+   /**
+     * Create a new {@code DavResourceLocator} from the specified prefix,
+     * workspace path and resource path, without modifying the specified Strings.
+     * Note, that it is expected that the resource path starts with the
+     * given workspace path unless both values are {@code null}.
+     *
+     * @param prefix
+     * @param workspacePath path or the workspace containing this resource or
+     * {@code null}.
+     * @param resourcePath Path of the resource or {@code null}. Any non
+     * null value must start with the specified workspace path.
+     * @return a new {@code DavResourceLocator}
+     * @see DavLocatorFactory#createResourceLocator(String, String, String)
+     */
+    public DavResourceLocator createResourceLocator(String prefix, String workspacePath, String resourcePath) {
+        return createResourceLocator(prefix, workspacePath, resourcePath, true);
+    }
+
+    /**
+     * Create a new {@code DavResourceLocator} from the specified prefix,
+     * workspace path and resource path. If {@code isResourcePath} is set
+     * to {@code false}, the given 'resourcePath' is converted by calling
+     * {@link #getResourcePath(String, String)}. Otherwise the same restriction
+     * applies as for {@link #createResourceLocator(String, String, String)}.
+     *
+     * @param prefix
+     * @param workspacePath
+     * @param path
+     * @param isResourcePath
+     * @return
+     * @see DavLocatorFactory#createResourceLocator(String, String, String, boolean)
+     */
+    public DavResourceLocator createResourceLocator(String prefix, String workspacePath, String path, boolean isResourcePath) {
+        String resourcePath = (isResourcePath) ? path : getResourcePath(path, workspacePath);
+        return new DavResourceLocatorImpl(prefix, workspacePath, resourcePath, this);
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+     * Subclasses must defined how the repository path is built from the given
+     * resource and workspace path.
+     *
+     * @param resourcePath
+     * @param wspPath
+     * @return
+     */
+    protected abstract String getRepositoryPath(String resourcePath, String wspPath);
+
+    /**
+     * Subclasses must defined how the resource path is built from the given
+     * repository and workspace path.
+     *
+     * @param repositoryPath
+     * @param wspPath
+     * @return
+     */
+    protected abstract String getResourcePath(String repositoryPath, String wspPath);
+
+    //--------------------------------------------------------< DavResource >---
+    /**
+     * Private inner class {@code DavResourceLocatorImpl} implementing
+     * the {@code DavResourceLocator} interface.
+     */
+    private class DavResourceLocatorImpl implements DavResourceLocator {
+
+        private final String prefix;
+        private final String workspacePath;
+        private final String resourcePath;
+        private final AbstractLocatorFactory factory;
+
+        private final String href;
+
+        /**
+         * Create a new {@code DavResourceLocatorImpl}.
+         *
+         * @param prefix
+         * @param workspacePath
+         * @param resourcePath
+         */
+        private DavResourceLocatorImpl(String prefix, String workspacePath, String resourcePath, AbstractLocatorFactory factory) {
+
+            this.prefix = prefix;
+            this.workspacePath = workspacePath;
+            this.resourcePath = resourcePath;
+            this.factory = factory;
+
+            StringBuffer buf = new StringBuffer(prefix);
+            // NOTE: no need to append the workspace path, since it must
+            // be part of the resource path.
+            if (resourcePath != null && resourcePath.length() > 0) {
+                // check if condition is really met
+                if (!resourcePath.startsWith(workspacePath)) {
+                    throw new IllegalArgumentException("Resource path '" + resourcePath + "' does not start with workspace path '" + workspacePath + "'.");
+                }
+                buf.append(EncodeUtil.escapePath(resourcePath));
+            }
+            int length = buf.length();
+            if (length == 0 || (length > 0 && buf.charAt(length - 1) != '/')) {
+                buf.append("/");
+            }
+            this.href = buf.toString();
+        }
+
+        /**
+         * Return the prefix used to build the href String. This includes the initial
+         * hrefPrefix as well a the path prefix.
+         *
+         * @return prefix String used to build the href.
+         */
+        public String getPrefix() {
+            return prefix;
+        }
+
+        /**
+         * Returns the resource path which always starts with the workspace
+         * path, if a workspace resource exists. For the top most resource
+         * (request handle '/'), {@code null} is returned.
+         *
+         * @return resource path or {@code null}
+         * @see org.apache.jackrabbit.webdav.DavResourceLocator#getResourcePath()
+         */
+        public String getResourcePath() {
+            return resourcePath;
+        }
+
+        /**
+         * Return the workspace path or {@code null} if this locator object
+         * represents the '/' request handle.
+         *
+         * @return workspace path or {@code null}
+         * @see org.apache.jackrabbit.webdav.DavResourceLocator#getWorkspacePath()
+         */
+        public String getWorkspacePath() {
+            return workspacePath;
+        }
+
+        /**
+         * Return the workspace name or {@code null} if this locator object
+         * represents the '/' request handle, which does not contain a workspace
+         * path.
+         *
+         * @return workspace name or {@code null}
+         * @see org.apache.jackrabbit.webdav.DavResourceLocator#getWorkspaceName()
+         */
+        public String getWorkspaceName() {
+            if (workspacePath != null && workspacePath.length() > 0) {
+                return workspacePath.substring(1);
+            }
+            return null;
+        }
+
+        /**
+         * Returns true if the specified locator object refers to a resource within
+         * the same workspace.
+         *
+         * @param locator
+         * @return true if the workspace name obtained from the given locator
+         * refers to the same workspace as the workspace name of this locator.
+         * @see DavResourceLocator#isSameWorkspace(org.apache.jackrabbit.webdav.DavResourceLocator)
+         */
+        public boolean isSameWorkspace(DavResourceLocator locator) {
+            return (locator == null) ? false : isSameWorkspace(locator.getWorkspaceName());
+        }
+
+        /**
+         * Returns true if the specified string equals to this workspace name or
+         * if both names are null.
+         *
+         * @param workspaceName
+         * @return true if the workspace name is equal to this workspace name.
+         * @see DavResourceLocator#isSameWorkspace(String)
+         */
+        public boolean isSameWorkspace(String workspaceName) {
+            String thisWspName = getWorkspaceName();
+            return (thisWspName == null) ? workspaceName == null : thisWspName.equals(workspaceName);
+        }
+
+        /**
+         * Returns an 'href' consisting of prefix and resource path (which starts
+         * with the workspace path). It assures a trailing '/' in case the href
+         * is used for collection. Note, that the resource path is
+         * {@link org.apache.jackrabbit.webdav.util.EncodeUtil#escapePath(String) escaped}.
+         *
+         * @param isCollection
+         * @return href String representing the text of the href element
+         * @see org.apache.jackrabbit.webdav.DavConstants#XML_HREF
+         * @see DavResourceLocator#getHref(boolean)
+         */
+        public String getHref(boolean isCollection) {
+            return (isCollection) ? href : href.substring(0, href.length() - 1);
+        }
+
+        /**
+         * Returns true if the 'workspacePath' field is {@code null}.
+         *
+         * @return true if the 'workspacePath' field is {@code null}.
+         * @see org.apache.jackrabbit.webdav.DavResourceLocator#isRootLocation()
+         */
+        public boolean isRootLocation() {
+            return getWorkspacePath() == null;
+        }
+
+        /**
+         * Return the factory that created this locator.
+         *
+         * @return factory
+         * @see org.apache.jackrabbit.webdav.DavResourceLocator#getFactory()
+         */
+        public DavLocatorFactory getFactory() {
+            return factory;
+        }
+
+        /**
+         * Uses {@link AbstractLocatorFactory#getRepositoryPath(String, String)}
+         * to build the repository path.
+         *
+         * @see DavResourceLocator#getRepositoryPath()
+         */
+        public String getRepositoryPath() {
+            return factory.getRepositoryPath(getResourcePath(), getWorkspacePath());
+        }
+
+        /**
+         * Computes the hash code from the href, that is built from the prefix,
+         * the workspace name and the resource path all of them representing
+         * final instance fields.
+         *
+         * @return the hash code
+         */
+        @Override
+        public int hashCode() {
+            return href.hashCode();
+        }
+
+        /**
+         * Returns true, if the given object is a {@code DavResourceLocatorImpl}
+         * with the same hash code.
+         *
+         * @param obj the object to compare to
+         * @return {@code true} if the 2 objects are equal;
+         *         {@code false} otherwise
+         */
+        @Override
+        public boolean equals(Object obj) {
+            if (obj == this) {
+                return true;
+            }
+            if (obj instanceof DavResourceLocatorImpl) {
+                DavResourceLocatorImpl other = (DavResourceLocatorImpl) obj;
+                return hashCode() == other.hashCode();
+            }
+            return false;
+        }
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/ContentCodingAwareRequest.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/ContentCodingAwareRequest.java
new file mode 100644
index 000000000..27a24b7f9
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/ContentCodingAwareRequest.java
@@ -0,0 +1,39 @@
+/*
+ * 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.jackrabbit.webdav;
+
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+public interface ContentCodingAwareRequest {
+
+    /**
+     * Element name for signaling "must be supported content coding"
+     */
+    public final QName PRECONDITION_SUPPORTED = new QName("http://www.day.com/jcr/webdav/1.0", "supported-content-coding", "dcr");
+
+    /**
+     * @return value suitable for Accept response field
+     */
+    public String getAcceptableCodings();
+
+    /**
+     * @return content codings used in request
+     */
+    public List<String> getRequestContentCodings();
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavCompliance.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavCompliance.java
new file mode 100644
index 000000000..de09b5b60
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavCompliance.java
@@ -0,0 +1,72 @@
+/*
+ * 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.jackrabbit.webdav;
+
+/**
+ * <code>DavCompliance</code> defines constants for the various compliance
+ * classes defined RFC 2518, RFC 4918 and it's extensions.
+ */
+public final class DavCompliance {
+
+    /**
+     * Avoid instantiation
+     */
+    private DavCompliance() {}
+
+    // RFC 2518
+    public static final String _1_ = "1";
+    public static final String _2_ = "2";
+
+    // RFC 4918
+    public static final String _3_ = "3";
+
+    // RFC 3253
+    public static final String ACTIVITY = "activity";
+    public static final String BASELINE = "baseline";
+    public static final String CHECKOUT_IN_PLACE = "checkout-in-place";
+    public static final String LABEL = "label";
+    public static final String MERGE = "merge";
+    public static final String UPDATE = "update";
+    public static final String VERSION_CONTROL = "version-control";
+    public static final String VERSION_CONTROLLED_COLLECTION = "version-controlled-collection";
+    public static final String VERSION_HISTORY = "version-history";
+    public static final String WORKING_RESOURCE = "working-resource";
+    public static final String WORKSPACE = "workspace";
+
+    // RFC 3648
+    public static final String ORDERED_COLLECTIONS = "ordered-collections";
+
+    // RFC 3744
+    public static final String ACCESS_CONTROL = "access-control";
+
+    // RFC 5842
+    public static final String BIND = "bind";
+    
+    // no RFC
+    public static final String OBSERVATION = "observation";
+
+    public static String concatComplianceClasses(String[] complianceClasses) {
+        StringBuffer b = new StringBuffer();
+        for (int i = 0; i < complianceClasses.length; i++) {
+            if (i > 0) {
+                b.append(",");
+            }
+            b.append(complianceClasses[i]);
+        }
+        return b.toString();
+    }
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavConstants.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavConstants.java
new file mode 100644
index 000000000..a50b1cd2a
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavConstants.java
@@ -0,0 +1,154 @@
+/*
+ * 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.jackrabbit.webdav;
+
+import org.apache.jackrabbit.webdav.util.HttpDateFormat;
+import org.apache.jackrabbit.webdav.xml.Namespace;
+
+import java.text.DateFormat;
+
+/**
+ * <code>DavConstants</code> provide constants for request and response
+ * headers, XML elements and property names defined by
+ * <a href="http://www.webdav.org/specs/rfc2518.html">RFC 2518</a>. In addition,
+ * common date formats (creation date and modification time) are included.
+ */
+public interface DavConstants {
+
+    /**
+     * Default Namespace constant
+     */
+    public static final Namespace NAMESPACE = Namespace.getNamespace("D", "DAV:");
+
+    //--------------------------------< Headers (Names and Value Constants) >---
+    public static final String HEADER_DAV = "DAV";
+    public static final String HEADER_DESTINATION = "Destination";
+    public static final String HEADER_IF = "If";
+    public static final String HEADER_AUTHORIZATION = "Authorization";
+    public static final String HEADER_CONTENT_TYPE = "Content-Type";
+    public static final String HEADER_CONTENT_LENGTH = "Content-Length";
+    public static final String HEADER_CONTENT_LANGUAGE = "Content-Language";
+    public static final String HEADER_ETAG = "ETag";
+    public static final String HEADER_LAST_MODIFIED = "Last-Modified";
+
+    //--------------------------------------------------< Lock-Token Header >---
+    public static final String HEADER_LOCK_TOKEN = "Lock-Token";
+    public static final String OPAQUE_LOCK_TOKEN_PREFIX = "opaquelocktoken:";
+
+    //-----------------------------------------------------< Timeout Header >---
+    public static final String HEADER_TIMEOUT = "Timeout";
+    public static final String TIMEOUT_INFINITE = "Infinite";
+    // RFC 2518: timeout value for TimeType "Second" MUST NOT be greater than 2^32-1
+    public static final long INFINITE_TIMEOUT = Integer.MAX_VALUE;
+    public static final long UNDEFINED_TIMEOUT = Integer.MIN_VALUE;
+
+    //---------------------------------------------------< Overwrite Header >---
+    public static final String HEADER_OVERWRITE = "Overwrite";
+
+    //-------------------------------------------------------< Depth Header >---
+    public static final String HEADER_DEPTH = "Depth";
+    public static final String DEPTH_INFINITY_S = "infinity";
+    public static final int DEPTH_INFINITY = Integer.MAX_VALUE;
+    public static final int DEPTH_0 = 0;
+    public static final int DEPTH_1 = 1;
+
+    //---< XML Element, Attribute Names >---------------------------------------
+    public static final String XML_ALLPROP = "allprop";
+    public static final String XML_COLLECTION = "collection";
+    public static final String XML_DST = "dst";
+    public static final String XML_HREF = "href";
+    public static final String XML_INCLUDE = "include";
+    public static final String XML_KEEPALIVE = "keepalive";
+    public static final String XML_LINK = "link";
+    public static final String XML_MULTISTATUS = "multistatus";
+    public static final String XML_OMIT = "omit";
+    public static final String XML_PROP = "prop";
+    public static final String XML_PROPERTYBEHAVIOR = "propertybehavior";
+    public static final String XML_PROPERTYUPDATE = "propertyupdate";
+    public static final String XML_PROPFIND = "propfind";
+    public static final String XML_PROPNAME = "propname";
+    public static final String XML_PROPSTAT = "propstat";
+    public static final String XML_REMOVE = "remove";
+    public static final String XML_RESPONSE = "response";
+    public static final String XML_RESPONSEDESCRIPTION = "responsedescription";
+    public static final String XML_SET = "set";
+    public static final String XML_SOURCE = "source";
+    public static final String XML_STATUS = "status";
+
+    //------------------------------------------------------------< locking >---
+    public static final String XML_ACTIVELOCK = "activelock";
+    public static final String XML_DEPTH = "depth";
+    public static final String XML_LOCKTOKEN = "locktoken";
+    public static final String XML_TIMEOUT = "timeout";
+    public static final String XML_LOCKSCOPE = "lockscope";
+    public static final String XML_EXCLUSIVE = "exclusive";
+    public static final String XML_SHARED = "shared";
+    public static final String XML_LOCKENTRY = "lockentry";
+    public static final String XML_LOCKINFO = "lockinfo";
+    public static final String XML_LOCKTYPE = "locktype";
+    public static final String XML_WRITE = "write";
+    public static final String XML_OWNER = "owner";
+    /**
+     * The <code>lockroot</code> XML element
+     * @see <a href="http://www.webdav.org/specs/rfc4918.html#ELEMENT_lockroot">RFC 4918</a>
+     */
+    public static final String XML_LOCKROOT = "lockroot";
+
+    //-----------------------------------------------------< Property Names >---
+    /*
+     * Webdav property names as defined by RFC 2518<br>
+     * Note: Microsoft webdav clients as well as Webdrive request additional
+     * property (e.g. href, name, owner, isRootLocation, isCollection)  within the
+     * default namespace, which are are ignored by this implementation, except
+     * for the 'isCollection' property, needed for XP built-in clients.
+     */
+    public static final String PROPERTY_CREATIONDATE = "creationdate";
+    public static final String PROPERTY_DISPLAYNAME = "displayname";
+    public static final String PROPERTY_GETCONTENTLANGUAGE = "getcontentlanguage";
+    public static final String PROPERTY_GETCONTENTLENGTH = "getcontentlength";
+    public static final String PROPERTY_GETCONTENTTYPE = "getcontenttype";
+    public static final String PROPERTY_GETETAG = "getetag";
+    public static final String PROPERTY_GETLASTMODIFIED = "getlastmodified";
+    public static final String PROPERTY_LOCKDISCOVERY = "lockdiscovery";
+    public static final String PROPERTY_RESOURCETYPE = "resourcetype";
+    public static final String PROPERTY_SOURCE = "source";
+    public static final String PROPERTY_SUPPORTEDLOCK = "supportedlock";
+
+    //-------------------------------------------------< PropFind Constants >---
+    public static final int PROPFIND_BY_PROPERTY = 0;
+    public static final int PROPFIND_ALL_PROP = 1;
+    public static final int PROPFIND_PROPERTY_NAMES = 2;
+    public static final int PROPFIND_ALL_PROP_INCLUDE = 3; // RFC 4918, Section 9.1
+
+    //----------------------------------------------< Date Format Constants >---
+    /**
+     * Marker for undefined modification or creation time.
+     */
+    public static long UNDEFINED_TIME = -1;
+
+    /**
+     * modificationDate date format per RFC 1123.<br>
+     * NOTE: Access to <code>DateFormat</code> isn't thread save.
+     */
+    public static DateFormat modificationDateFormat = HttpDateFormat.modificationDateFormat();
+
+    /**
+     * Simple date format for the creation date ISO representation (partial).<br>
+     * NOTE: Access to <code>DateFormat</code> isn't thread save.
+     */
+    public static DateFormat creationDateFormat = HttpDateFormat.creationDateFormat();
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavException.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavException.java
new file mode 100644
index 000000000..1c7c611db
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavException.java
@@ -0,0 +1,175 @@
+/*
+ * 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.jackrabbit.webdav;
+
+import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import java.io.IOException;
+import java.util.Properties;
+
+/**
+ * <code>DavException</code> extends the {@link Exception} class in order
+ * to simplify handling of exceptional situations occurring during processing
+ * of WebDAV requests and provides possibility to retrieve an Xml representation
+ * of the error.
+ */
+public class DavException extends Exception implements XmlSerializable {
+
+    private static Logger log = LoggerFactory.getLogger(DavException.class);
+    private static Properties statusPhrases = new Properties();
+    static {
+        try {
+            statusPhrases.load(DavException.class.getResourceAsStream("statuscode.properties"));
+        } catch (IOException e) {
+            log.error("Failed to load status properties: " + e.getMessage());
+        }
+    }
+
+    public static final String XML_ERROR = "error";
+
+    private int errorCode = DavServletResponse.SC_INTERNAL_SERVER_ERROR;
+    private Element errorCondition;
+
+    /**
+     * Create a new <code>DavException</code>.
+     *
+     * @param errorCode integer specifying any of the status codes defined by
+     * {@link DavServletResponse}.
+     * @param message Human readable error message.
+     * @see DavException#DavException(int, String, Throwable, Element)
+     */
+    public DavException(int errorCode, String message) {
+        this(errorCode, message, null, null);
+    }
+
+    /**
+     * Create a new <code>DavException</code>.
+     *
+     * @param errorCode integer specifying any of the status codes defined by
+     * {@link DavServletResponse}.
+     * @param cause Cause of this DavException
+     * @see DavException#DavException(int, String, Throwable, Element)
+     */
+    public DavException(int errorCode, Throwable cause) {
+        this(errorCode, null, cause, null);
+    }
+
+    /**
+     * Create a new <code>DavException</code>.
+     *
+     * @param errorCode integer specifying any of the status codes defined by
+     * {@link DavServletResponse}.
+     * @see DavException#DavException(int, String, Throwable, Element)
+     */
+    public DavException(int errorCode) {
+        this(errorCode, statusPhrases.getProperty(String.valueOf(errorCode)), null, null);
+    }
+
+    /**
+     * Create a new <code>DavException</code>.
+     *
+     * @param errorCode integer specifying any of the status codes defined by
+     * {@link DavServletResponse}.
+     * @param message Human readable error message.
+     * @param cause Cause of this <code>DavException</code>.
+     * @param errorCondition Xml element providing detailed information about
+     * the error. If the condition is not <code>null</code>, {@link #toXml(Document)}
+     */
+    public DavException(int errorCode, String message, Throwable cause, Element errorCondition) {
+        super(message, cause);
+        this.errorCode = errorCode;
+        this.errorCondition = errorCondition;
+        log.debug("DavException: (" + errorCode + ") " + message);
+    }
+
+    /**
+     * Return the error code attached to this <code>DavException</code>.
+     *
+     * @return errorCode
+     */
+    public int getErrorCode() {
+        return errorCode;
+    }
+
+    /**
+     * Return the status phrase corresponding to the error code attached to
+     * this <code>DavException</code>.
+     *
+     * @return status phrase corresponding to the error code.
+     * @see #getErrorCode()
+     */
+    public String getStatusPhrase() {
+        return getStatusPhrase(errorCode);
+    }
+
+    /**
+     * Returns the status phrase for the given error code.
+     *
+     * @param errorCode
+     * @return status phrase corresponding to the given error code.
+     */
+    public static String getStatusPhrase(int errorCode) {
+        return statusPhrases.getProperty(errorCode + "");
+    }
+
+    /**
+     * @return true if a error condition has been specified, false otherwise.
+     */
+    public boolean hasErrorCondition() {
+        return errorCondition != null;
+    }
+
+    /**
+     * Return the error condition attached to this <code>DavException</code>.
+     *
+     * @return errorCondition
+     */
+    public Element getErrorCondition() {
+        return errorCondition;
+    }
+
+    /**
+     * Returns a DAV:error element containing the error condition or
+     * <code>null</code> if no specific condition is available. See
+     * <a href="http://www.ietf.org/rfc/rfc3253.txt">RFC 3253</a>
+     * Section 1.6 "Method Preconditions and Postconditions" for additional
+     * information.
+     *
+     * @param document
+     * @return A DAV:error element indicating the error cause or <code>null</code>.
+     * @see org.apache.jackrabbit.webdav.xml.XmlSerializable#toXml(Document)
+     */
+    public Element toXml(Document document) {
+        if (hasErrorCondition()) {
+            Element error;
+            if (DomUtil.matches(errorCondition, XML_ERROR, DavConstants.NAMESPACE)) {
+                error = (Element) document.importNode(errorCondition, true);
+            } else {
+                error = DomUtil.createElement(document, XML_ERROR, DavConstants.NAMESPACE);
+                error.appendChild(document.importNode(errorCondition, true));
+            }
+            return error;
+        } else {
+            return null;
+        }
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavLocatorFactory.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavLocatorFactory.java
new file mode 100644
index 000000000..db4ca0a9b
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavLocatorFactory.java
@@ -0,0 +1,72 @@
+/*
+ * 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.jackrabbit.webdav;
+
+/**
+ * <code>DavLocatorFactory</code>...
+ */
+public interface DavLocatorFactory {
+
+    /**
+     * Create a new <code>DavResourceLocator</code>.
+     *
+     * @param prefix String consisting of  [scheme:][//authority][path] where
+     * path defines the (imaginary) path to the {@link DavResourceLocator#isRootLocation root location}.
+     * @param href of the resource to be created. The given string may start with
+     * the 'prefix'. Please note, that in contrast to
+     * {@link DavLocatorFactory#createResourceLocator(String, String, String)} the
+     * href is expected to be URL encoded.
+     * @return a new resource locator.
+     */
+    public DavResourceLocator createResourceLocator(String prefix, String href);
+
+    /**
+     * Create a new <code>DavResourceLocator</code>. This methods corresponds to
+     * {@link DavLocatorFactory#createResourceLocator(String, String, String, boolean)}
+     * with the flag set to true.
+     *
+     * @param prefix String consisting of  [scheme:][//authority][path] where
+     * path defines the path to the {@link DavResourceLocator#isRootLocation root location}.
+     * @param workspacePath the first segment of the URIs path indicating the
+     * workspace. The implementation may allow a empty String if workspaces
+     * are not supported.
+     * @param resourcePath the URL decoded resource path.
+     * @return a new resource locator.
+     */
+    public DavResourceLocator createResourceLocator(String prefix, String workspacePath, String resourcePath);
+
+    /**
+     *
+     * @param prefix String consisting of  [scheme:][//authority][path] where
+     * path defines the path to the {@link DavResourceLocator#isRootLocation root location}.
+     * @param workspacePath the first segment of the URIs path indicating the
+     * workspace. The implementation may allow a empty String if workspaces
+     * are not supported.
+     * @param path the URL decoded path.
+     * @param isResourcePath If true this method returns the same as
+     * {@link DavLocatorFactory#createResourceLocator(String, String, String)},
+     * otherwise the given path is treated as internal repository path.
+     * The implementation may choose to implement a conversion of the repository
+     * path to a valid resource path, e.g. (un)escaping of certain characters, due
+     * to incompatibility with the URI definition (or vice versa). Note that
+     * {@link DavResourceLocator#getRepositoryPath()} should in this case implement
+     * the reverse operation.
+     * @return a new resource locator.
+     * @see DavResourceLocator#getRepositoryPath()
+     */
+    public DavResourceLocator createResourceLocator(String prefix, String workspacePath, String path, boolean isResourcePath);
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavMethods.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavMethods.java
new file mode 100644
index 000000000..003d7976d
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavMethods.java
@@ -0,0 +1,410 @@
+/*
+ * 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.jackrabbit.webdav;
+
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+/**
+ * <code>DavMethods</code> defines constants for the WebDAV METHODS.
+ */
+public final class DavMethods {
+
+    /**
+     * Avoid instantiation
+     */
+    private DavMethods() {}
+
+    /**
+     * A map of WebDAV METHODS
+     */
+    private static Map<String, Integer> methodMap = new HashMap<String, Integer>();
+
+    /**
+     * An array of method codes that are affected by a Label header
+     * @see org.apache.jackrabbit.webdav.version.DeltaVConstants#HEADER_LABEL
+     */
+    private static int[] labelMethods;
+
+    /**
+     * An array of method codes defined by RFC 3253 (deltaV)
+     */
+    private static int[] deltaVMethods;
+
+    /**
+     * The webdav OPTIONS method and public constant
+     */
+    public static final int DAV_OPTIONS = 1;
+    public static final String METHOD_OPTIONS = "OPTIONS";
+
+    /**
+     * The webdav GET method and public constant
+     */
+    public static final int DAV_GET = DAV_OPTIONS + 1;
+    public static final String METHOD_GET = "GET";
+
+    /**
+     * The webdav HEAD method and public constant
+     */
+    public static final int DAV_HEAD = DAV_GET + 1;
+    public static final String METHOD_HEAD = "HEAD";
+
+
+    /**
+     * The webdav POST method and public constant
+     */
+    public static final int DAV_POST = DAV_HEAD + 1;
+    public static final String METHOD_POST = "POST";
+
+
+    /** The webdav DELETE method and public constant */
+    public static final int DAV_DELETE = DAV_POST + 1;
+    public static final String METHOD_DELETE = "DELETE";
+
+
+    /** The webdav PUT method and public constant */
+    public static final int DAV_PUT = DAV_DELETE + 1;
+    public static final String METHOD_PUT = "PUT";
+
+
+    /**
+     * The webdav PROPFIND method and public constant as defined by
+     * <a href="http://www.ietf.org/rfc/rfc2518.txt">RFC 2518</a>.
+     */
+    public static final int DAV_PROPFIND = DAV_PUT + 1;
+    public static final String METHOD_PROPFIND = "PROPFIND";
+
+
+    /**
+     * The webdav PROPPATCH method and public constant as defined by
+     * <a href="http://www.ietf.org/rfc/rfc2518.txt">RFC 2518</a>
+     */
+    public static final int DAV_PROPPATCH = DAV_PROPFIND + 1;
+    public static final String METHOD_PROPPATCH = "PROPPATCH";
+
+
+    /**
+     * The webdav MKCOL (make collection) method and public constant as defined by
+     * <a href="http://www.ietf.org/rfc/rfc2518.txt">RFC 2518</a>
+     */
+    public static final int DAV_MKCOL = DAV_PROPPATCH + 1;
+    public static final String METHOD_MKCOL = "MKCOL";
+
+
+    /**
+     * The webdav COPY method and public constant as defined by
+     * <a href="http://www.ietf.org/rfc/rfc2518.txt">RFC 2518</a>
+     */
+    public static final int DAV_COPY = DAV_MKCOL + 1;
+    public static final String METHOD_COPY = "COPY";
+
+
+    /**
+     * The webdav MOVE method and public constant as defined by
+     * <a href="http://www.ietf.org/rfc/rfc2518.txt">RFC 2518</a>
+     */
+    public static final int DAV_MOVE = DAV_COPY + 1;
+    public static final String METHOD_MOVE = "MOVE";
+
+
+    /**
+     * The webdav LOCK method and public constant as defined by
+     * <a href="http://www.ietf.org/rfc/rfc2518.txt">RFC 2518</a>
+     */
+    public static final int DAV_LOCK = DAV_MOVE + 1;
+    public static final String METHOD_LOCK = "LOCK";
+
+
+    /**
+     * The webdav UNLOCK method and public constant as defined by
+     * <a href="http://www.ietf.org/rfc/rfc2518.txt">RFC 2518</a>
+     */
+    public static final int DAV_UNLOCK = DAV_LOCK + 1;
+    public static final String METHOD_UNLOCK = "UNLOCK";
+
+
+    /**
+     * The webdav ORDERPATCH method and public constant
+     * defined by <a href="http://www.ietf.org/rfc/rfc3648.txt">RFC 3648</a>.
+     */
+    public static final int DAV_ORDERPATCH = DAV_UNLOCK + 1;
+    public static final String METHOD_ORDERPATCH = "ORDERPATCH";
+
+
+    /**
+     * The webdav SUBSCRIBE method and public constant.<br>
+     * NOTE: This method is not defined by any of the Webdav RFCs
+     */
+    public static final int DAV_SUBSCRIBE = DAV_ORDERPATCH + 1;
+    public static final String METHOD_SUBSCRIBE = "SUBSCRIBE";
+
+
+    /**
+     * The webdav UNSUBSCRIBE method and public constant<br>
+     * NOTE: This method is not defined by any of the Webdav RFCs
+     */
+    public static final int DAV_UNSUBSCRIBE = DAV_SUBSCRIBE + 1;
+    public static final String METHOD_UNSUBSCRIBE = "UNSUBSCRIBE";
+
+
+    /**
+     * The webdav POLL method and public constant<br>
+     * NOTE: This method is not defined by any of the Webdav RFCs
+     */
+    public static final int DAV_POLL = DAV_UNSUBSCRIBE + 1;
+    public static final String METHOD_POLL = "POLL";
+
+
+    /**
+     * The webdav SEARCH method and public constant as defined by the
+     * Webdav Search internet draft.
+     */
+    public static final int DAV_SEARCH = DAV_POLL + 1;
+    public static final String METHOD_SEARCH = "SEARCH";
+
+
+    /**
+     * The webdav REPORT method and public constant defined by
+     * <a href="http://www.ietf.org/rfc/rfc3253.txt">RFC 3253</a>
+     */
+    public static final int DAV_REPORT = DAV_SEARCH + 1;
+    public static final String METHOD_REPORT = "REPORT";
+
+
+    /**
+     * The webdav VERSION-CONTROL method and public constant defined by
+     * <a href="http://www.ietf.org/rfc/rfc3253.txt">RFC 3253</a>
+     */
+    public static final int DAV_VERSION_CONTROL = DAV_REPORT + 1;
+    public static final String METHOD_VERSION_CONTROL = "VERSION-CONTROL";
+
+    /**
+     * The webdav CHECKIN method and public constant defined by
+     * <a href="http://www.ietf.org/rfc/rfc3253.txt">RFC 3253</a>
+     */
+    public static final int DAV_CHECKIN = DAV_VERSION_CONTROL + 1;
+    public static final String METHOD_CHECKIN = "CHECKIN";
+
+    /**
+     * The webdav CHECKOUT method and public constant defined by
+     * <a href="http://www.ietf.org/rfc/rfc3253.txt">RFC 3253</a>
+     */
+    public static final int DAV_CHECKOUT = DAV_CHECKIN + 1;
+    public static final String METHOD_CHECKOUT = "CHECKOUT";
+
+    /**
+     * The webdav UNCHECKOUT method and public constant defined by
+     * <a href="http://www.ietf.org/rfc/rfc3253.txt">RFC 3253</a>
+     */
+    public static final int DAV_UNCHECKOUT = DAV_CHECKOUT + 1;
+    public static final String METHOD_UNCHECKOUT = "UNCHECKOUT";
+
+    /**
+     * The webdav LABEL method and public constant defined by
+     * <a href="http://www.ietf.org/rfc/rfc3253.txt">RFC 3253</a>
+     */
+    public static final int DAV_LABEL = DAV_UNCHECKOUT + 1;
+    public static final String METHOD_LABEL = "LABEL";
+
+    /**
+     * The webdav MERGE method and public constant defined by
+     * <a href="http://www.ietf.org/rfc/rfc3253.txt">RFC 3253</a>
+     */
+    public static final int DAV_MERGE = DAV_LABEL + 1;
+    public static final String METHOD_MERGE = "MERGE";
+
+    /**
+     * The webdav UPDATE method and public constant defined by
+     * <a href="http://www.ietf.org/rfc/rfc3253.txt">RFC 3253</a>
+     */
+    public static final int DAV_UPDATE = DAV_MERGE + 1;
+    public static final String METHOD_UPDATE = "UPDATE";
+
+    /**
+     * The webdav MKWORKSPACE method and public constant defined by
+     * <a href="http://www.ietf.org/rfc/rfc3253.txt">RFC 3253</a>
+     */
+    public static final int DAV_MKWORKSPACE = DAV_UPDATE + 1;
+    public static final String METHOD_MKWORKSPACE = "MKWORKSPACE";
+
+    /**
+     * The webdav BASELINE-CONTROL method and public constant defined by
+     * <a href="http://www.ietf.org/rfc/rfc3253.txt">RFC 3253</a>
+     */
+    public static final int DAV_BASELINE_CONTROL = DAV_MKWORKSPACE + 1;
+    public static final String METHOD_BASELINE_CONTROL = "BASELINE-CONTROL";
+
+    /**
+     * The webdav MKACTIVITY method and public constant defined by
+     * <a href="http://www.ietf.org/rfc/rfc3253.txt">RFC 3253</a>
+     */
+    public static final int DAV_MKACTIVITY = DAV_BASELINE_CONTROL + 1;
+    public static final String METHOD_MKACTIVITY = "MKACTIVITY";
+
+    /**
+     * The webdav ACL method and public constant defined by
+     * <a href="http://www.ietf.org/rfc/rfc3744.txt">RFC 3744</a>
+     */
+    public static final int DAV_ACL = DAV_MKACTIVITY + 1;
+    public static final String METHOD_ACL = "ACL";
+
+    /**
+     * The webdav REBIND method and public constant defined by
+     * the BIND specification
+     */
+    public static final int DAV_REBIND = DAV_ACL + 1;
+    public static final String METHOD_REBIND = "REBIND";
+
+    /**
+     * The webdav UNBIND method and public constant defined by
+     * the BIND specification
+     */
+    public static final int DAV_UNBIND = DAV_REBIND + 1;
+    public static final String METHOD_UNBIND = "UNBIND";
+
+    /**
+     * The webdav BIND method and public constant defined by
+     * the BIND specification
+     */
+    public static final int DAV_BIND = DAV_UNBIND + 1;
+    public static final String METHOD_BIND = "BIND";
+
+    /**
+     * Returns webdav method type code, error result &lt;= 0
+     * Valid type codes &gt; 0
+     */
+    public static int getMethodCode(String method) {
+        Integer code = methodMap.get(method.toUpperCase(Locale.ROOT));
+        if (code != null) {
+            return code;
+        }
+        return 0;
+    }
+
+    /**
+     * Static initializer for methodTable map
+     */
+    private static void addMethodCode(String method, int code) {
+        methodMap.put(method, code);
+    }
+
+    /**
+     *  Webdav Method table
+     */
+    static {
+        addMethodCode(METHOD_OPTIONS, DAV_OPTIONS);
+        addMethodCode(METHOD_GET, DAV_GET);
+        addMethodCode(METHOD_HEAD, DAV_HEAD);
+        addMethodCode(METHOD_POST, DAV_POST);
+        addMethodCode(METHOD_PUT, DAV_PUT);
+        addMethodCode(METHOD_DELETE, DAV_DELETE);
+        addMethodCode(METHOD_PROPFIND, DAV_PROPFIND);
+        addMethodCode(METHOD_PROPPATCH, DAV_PROPPATCH);
+        addMethodCode(METHOD_MKCOL, DAV_MKCOL);
+        addMethodCode(METHOD_COPY, DAV_COPY);
+        addMethodCode(METHOD_MOVE, DAV_MOVE);
+        addMethodCode(METHOD_LOCK, DAV_LOCK);
+        addMethodCode(METHOD_UNLOCK, DAV_UNLOCK);
+        addMethodCode(METHOD_ORDERPATCH, DAV_ORDERPATCH);
+        addMethodCode(METHOD_SUBSCRIBE, DAV_SUBSCRIBE);
+        addMethodCode(METHOD_UNSUBSCRIBE, DAV_UNSUBSCRIBE);
+        addMethodCode(METHOD_POLL, DAV_POLL);
+        addMethodCode(METHOD_SEARCH, DAV_SEARCH);
+        addMethodCode(METHOD_REPORT, DAV_REPORT);
+        addMethodCode(METHOD_VERSION_CONTROL, DAV_VERSION_CONTROL);
+        addMethodCode(METHOD_CHECKIN, DAV_CHECKIN);
+        addMethodCode(METHOD_CHECKOUT, DAV_CHECKOUT);
+        addMethodCode(METHOD_UNCHECKOUT, DAV_UNCHECKOUT);
+        addMethodCode(METHOD_LABEL, DAV_LABEL);
+        addMethodCode(METHOD_MERGE, DAV_MERGE);
+        addMethodCode(METHOD_UPDATE, DAV_UPDATE);
+        addMethodCode(METHOD_MKWORKSPACE, DAV_MKWORKSPACE);
+        addMethodCode(METHOD_BASELINE_CONTROL, DAV_BASELINE_CONTROL);
+        addMethodCode(METHOD_MKACTIVITY, DAV_MKACTIVITY);
+        addMethodCode(METHOD_ACL, DAV_ACL);
+        addMethodCode(METHOD_REBIND, DAV_REBIND);
+        addMethodCode(METHOD_UNBIND, DAV_UNBIND);
+        addMethodCode(METHOD_BIND, DAV_BIND);
+
+        labelMethods = new int[] { DAV_GET, DAV_HEAD, DAV_OPTIONS, DAV_PROPFIND,
+                                   DAV_LABEL, DAV_COPY };
+
+        deltaVMethods = new int[] { DAV_REPORT, DAV_VERSION_CONTROL, DAV_CHECKIN,
+                                    DAV_CHECKOUT, DAV_UNCHECKOUT, DAV_LABEL,
+                                    DAV_MERGE, DAV_UPDATE, DAV_MKWORKSPACE,
+                                    DAV_BASELINE_CONTROL, DAV_MKACTIVITY };
+    }
+
+    /**
+     * Returns <code>true</code> if the request is to create a resource.
+     * True for <code>PUT</code>, <code>POST</code>, <code>MKCOL</code>
+     * and <code>MKWORKSPACE</code> requests.
+     *
+     * @return true if request method is to create (or replace) a resource
+     */
+    public static boolean isCreateRequest(DavServletRequest request) {
+        int methodCode = getMethodCode(request.getMethod());
+        return ( methodCode == DAV_PUT ||
+                 methodCode == DAV_POST ||
+                 methodCode == DAV_MKCOL ||
+                 methodCode == DAV_MKWORKSPACE);
+    }
+
+    /**
+     * Returns <code>true</code> if the request is to create a collection resource.
+     * True for <code>MKCOL</code> and <code>MKWORKSPACE</code> requests.
+     *
+     * @return true if request method is to create a new collection resource
+     */
+    public static boolean isCreateCollectionRequest(DavServletRequest request) {
+        int methodCode = getMethodCode(request.getMethod());
+        return (methodCode == DAV_MKCOL || methodCode == DAV_MKWORKSPACE);
+    }
+
+    /**
+     * Returns true, if the specified method is affected by a Label header
+     *
+     * @param request
+     * @return
+     */
+    public static boolean isMethodAffectedByLabel(DavServletRequest request) {
+        int code = getMethodCode(request.getMethod());
+        for (int labelMethod : labelMethods) {
+            if (code == labelMethod) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Returns true, if the specified method is defined by RFC 3253
+     *
+     * @param request
+     * @return true, if the specified method is defined by RFC 3253
+     */
+    public static boolean isDeltaVMethod(DavServletRequest request) {
+        int code = getMethodCode(request.getMethod());
+        for (int deltaVMethod : deltaVMethods) {
+            if (code == deltaVMethod) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavResource.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavResource.java
new file mode 100644
index 000000000..6e70a4206
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavResource.java
@@ -0,0 +1,334 @@
+/*
+ * 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.jackrabbit.webdav;
+
+import org.apache.jackrabbit.webdav.io.InputContext;
+import org.apache.jackrabbit.webdav.io.OutputContext;
+import org.apache.jackrabbit.webdav.lock.ActiveLock;
+import org.apache.jackrabbit.webdav.lock.LockInfo;
+import org.apache.jackrabbit.webdav.lock.LockManager;
+import org.apache.jackrabbit.webdav.lock.Scope;
+import org.apache.jackrabbit.webdav.lock.Type;
+import org.apache.jackrabbit.webdav.property.DavProperty;
+import org.apache.jackrabbit.webdav.property.DavPropertyName;
+import org.apache.jackrabbit.webdav.property.DavPropertySet;
+import org.apache.jackrabbit.webdav.property.PropEntry;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * <code>DavResource</code> provides standard WebDAV functionality as specified
+ * by <a href="http://www.ietf.org/rfc/rfc2518.txt">RFC 2518</a>.
+ */
+public interface DavResource {
+
+    /**
+     * String constant representing the WebDAV 1 and 2 method set.
+     */
+    public static final String METHODS = "OPTIONS, GET, HEAD, TRACE, PROPFIND, PROPPATCH, MKCOL, COPY, PUT, DELETE, MOVE, LOCK, UNLOCK";
+
+    /**
+     * Returns a comma separated list of all compliance classes the given
+     * resource is fulfilling.
+     *
+     * @return compliance classes
+     */
+    public String getComplianceClass();
+
+    /**
+     * Returns a comma separated list of all METHODS supported by the given
+     * resource.
+     *
+     * @return METHODS supported by this resource.
+     */
+    public String getSupportedMethods();
+
+    /**
+     * Returns true if this webdav resource represents an existing repository item.
+     *
+     * @return true, if the resource represents an existing repository item.
+     */
+    public boolean exists();
+
+    /**
+     * Returns true if this webdav resource has the resourcetype 'collection'.
+     *
+     * @return true if the resource represents a collection resource.
+     */
+    public boolean isCollection();
+
+    /**
+     * Returns the display name of this resource.
+     *
+     * @return display name.
+     */
+    public String getDisplayName();
+
+    /**
+     * Returns the {@link DavResourceLocator locator} object for this webdav resource,
+     * which encapsulates the information for building the complete 'href'.
+     *
+     * @return the locator for this resource.
+     * @see #getResourcePath()
+     * @see #getHref()
+     */
+    public DavResourceLocator getLocator();
+
+    /**
+     * Returns the path of the hierarchy element defined by this <code>DavResource</code>.
+     * This method is a shortcut for <code>DavResource.getLocator().getResourcePath()</code>.
+     *
+     * @return path of the element defined by this <code>DavResource</code>.
+     */
+    public String getResourcePath();
+
+    /**
+     * Returns the absolute href of this resource as returned in the
+     * multistatus response body.
+     *
+     * @return href
+     */
+    public String getHref();
+
+    /**
+     * Return the time of the last modification or -1 if the modification time
+     * could not be retrieved.
+     *
+     * @return time of last modification or -1.
+     */
+    public long getModificationTime();
+
+    /**
+     * Spools the resource properties and ev. content to the specified context
+     * (e.g. to respond to a 'GET' or 'HEAD' request). The context could e.g.
+     * wrap the servlet response.
+     *
+     * @param outputContext The output context.
+     * @throws IOException If an error occurs.
+     */
+    public void spool(OutputContext outputContext) throws IOException;
+
+    /**
+     * Returns an array of all {@link DavPropertyName property names} available
+     * on this resource.
+     *
+     * @return an array of property names.
+     */
+    public DavPropertyName[] getPropertyNames();
+
+    /**
+     * Return the webdav property with the specified name.
+     *
+     * @param name name of the webdav property
+     * @return the {@link DavProperty} with the given name or <code>null</code>
+     * if the property does not exist.
+     */
+    public DavProperty<?> getProperty(DavPropertyName name);
+
+    /**
+     * Returns all webdav properties present on this resource that will be
+     * return upon a {@link DavConstants#PROPFIND_ALL_PROP} request. The
+     * implementation may in addition expose other (protected or calculated)
+     * properties which should be marked accordingly (see also
+     * {@link org.apache.jackrabbit.webdav.property.DavProperty#isInvisibleInAllprop()}.
+     *
+     * @return a {@link DavPropertySet} containing at least all properties
+     * of this resource that are exposed in 'allprop' PROPFIND request.
+     */
+    public DavPropertySet getProperties();
+
+    /**
+     * Add/Set the specified property on this resource.
+     *
+     * @param property
+     * @throws DavException if an error occurs
+     */
+    public void setProperty(DavProperty<?> property) throws DavException;
+
+    /**
+     * Remove the specified property from this resource.
+     *
+     * @param propertyName
+     * @throws DavException if an error occurs
+     */
+    public void removeProperty(DavPropertyName propertyName) throws DavException;
+
+    /**
+     * Set/add and remove the specified properties from this resource.
+     *
+     * @param changeList list containing {@link DavPropertyName} objects (for
+     * properties to be removed) and {@link DavProperty} objects (for
+     * properties to be added/set).
+     * @return multistatus response listing the status resulting from
+     * setting and/or removing the specified properties, in order to allow a
+     * detailed multistatus response.
+     * @throws DavException if an error occurred. This may be the case if the
+     * general state of the resource prevents any properties to be set or removed
+     * (e.g. due to a lock).
+     */
+    public MultiStatusResponse alterProperties(List<? extends PropEntry> changeList) throws DavException;
+
+    /**
+     * Retrieve the resource this resource is internal member of.
+     *
+     * @return resource this resource is an internal member of. In case this resource
+     * is the root <code>null</code> is returned.
+     */
+    public DavResource getCollection();
+
+    /**
+     * Add the given resource as an internal member to this resource.
+     *
+     * @param resource {@link DavResource} to be added as internal member.
+     * @param inputContext Context providing the properties and content for the
+     * internal member to be created or replaced.
+     * @throws DavException
+     */
+    public void addMember(DavResource resource, InputContext inputContext) throws DavException;
+
+    /**
+     * Returns an iterator over all internal members.
+     *
+     * @return a {@link DavResourceIterator} over all internal members.
+     */
+    public DavResourceIterator getMembers();
+
+    /**
+     * Removes the specified member from this resource.
+     *
+     * @throws DavException
+     */
+    public void removeMember(DavResource member) throws DavException;
+
+    /**
+     * Move this DavResource to the given destination resource
+     *
+     * @param destination
+     * @throws DavException
+     */
+    public void move(DavResource destination) throws DavException;
+
+    /**
+     * Copy this DavResource to the given destination resource
+     *
+     * @param destination
+     * @param shallow
+     * @throws DavException
+     */
+    public void copy(DavResource destination, boolean shallow) throws DavException;
+
+    /**
+     * Returns true, if the this resource allows locking. NOTE, that this method
+     * does not define, whether a lock/unlock can be successfully executed.
+     *
+     * @return true, if this resource supports any locking.
+     * @param type
+     * @param scope
+     */
+    public boolean isLockable(Type type, Scope scope);
+
+    /**
+     * Returns true if a lock applies to this resource. This may be either a
+     * lock on this resource itself or a deep lock inherited from a collection
+     * above this resource.<br>
+     * Note, that true is returned whenever a lock applies to that resource even
+     * if the lock is expired or not effective due to the fact that the request
+     * provides the proper lock token.
+     *
+     * @return true if a lock applies to this resource.
+     * @param type
+     */
+    public boolean hasLock(Type type, Scope scope);
+
+    /**
+     * Return the lock present on this webdav resource or <code>null</code>
+     * if the resource is either not locked or not lockable at all. Note, that
+     * a resource may have a lock that is inherited by a deep lock enforced on
+     * one of its 'parent' resources.
+     *
+     * @return lock information of this resource or <code>null</code> if this
+     * resource has no lock applying it. If an error occurs while retrieving the
+     * lock information <code>null</code> is returned as well.
+     * @param type
+     */
+    public ActiveLock getLock(Type type, Scope scope) ;
+
+    /**
+     * Returns an array of all locks applied to the given resource.
+     *
+     * @return array of locks. The array is empty if there are no locks applied
+     * to this resource.
+     */
+    public ActiveLock[] getLocks();
+
+    /**
+     * Lock this webdav resource with the information retrieve from the request
+     * and return the resulting lockdiscovery object.
+     *
+     * @param reqLockInfo lock info as retrieved from the request.
+     * @return lockdiscovery object to be returned in the response. If the lock
+     * could not be obtained a <code>DavException</code> is thrown.
+     * @throws DavException if the lock could not be obtained.
+     */
+    public ActiveLock lock(LockInfo reqLockInfo) throws DavException;
+
+    /**
+     * Refresh an existing lock by resetting the timeout.
+     *
+     * @param reqLockInfo lock info as retrieved from the request.
+     * @param lockToken identifying the lock to be refreshed.
+     * @return lockdiscovery object to be returned in the response body. If the lock
+     * could not be refreshed a <code>DavException</code> is thrown.
+     * @throws DavException if the lock could not be refreshed.
+     */
+    public ActiveLock refreshLock(LockInfo reqLockInfo, String lockToken) throws DavException;
+
+    /**
+     * Remove the lock identified by the included lock token from this resource.
+     * This method will return false if the unlocking did not succeed.
+     *
+     * @param lockToken identifying the lock to be removed.
+     * @throws DavException if the lock could not be removed.
+     */
+    public void unlock(String lockToken) throws DavException;
+
+    /**
+     * Add an external {@link LockManager} to this resource. This method may
+     * throw {@link UnsupportedOperationException} if the resource does handle
+     * locking itself.
+     *
+     * @param lockmgr
+     * @see LockManager
+     */
+    public void addLockManager(LockManager lockmgr);
+
+    /**
+     * Return the <code>DavResourceFactory</code> that created this resource.
+     *
+     * @return the factory that created this resource.
+     */
+    public DavResourceFactory getFactory();
+
+    /**
+     * Retrieve the <code>DavSession</code> associated with this resource.
+     *
+     * @return session object associated with this resource.
+     */
+    public DavSession getSession();
+}
+
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavResourceFactory.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavResourceFactory.java
new file mode 100644
index 000000000..b015fe330
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavResourceFactory.java
@@ -0,0 +1,46 @@
+/*
+ * 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.jackrabbit.webdav;
+
+/**
+ * <code>DavResourceFactory</code> interface defines a single method for creating
+ * {@link DavResource} objects.
+ */
+public interface DavResourceFactory {
+
+    /**
+     * Create a {@link DavResource} object from the given locator, request and response
+     * objects.
+     *
+     * @param locator locator of the resource
+     * @param request
+     * @param response
+     * @return a new <code>DavResource</code> object.
+     * @throws DavException
+     */
+    public DavResource createResource(DavResourceLocator locator, DavServletRequest request, DavServletResponse response) throws DavException;
+
+    /**
+     * Create a new {@link DavResource} object from the given locator and session.
+     *
+     * @param locator
+     * @param session
+     * @return a new <code>DavResource</code> object.
+     * @throws DavException
+     */
+    public DavResource createResource(DavResourceLocator locator, DavSession session) throws DavException;
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavResourceIterator.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavResourceIterator.java
new file mode 100644
index 000000000..e625b28ad
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavResourceIterator.java
@@ -0,0 +1,39 @@
+/*
+ * 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.jackrabbit.webdav;
+
+import java.util.Iterator;
+
+/**
+ * DavResourceIterator extends the <code>Iterator</code> interface. Additional
+ * METHODS allow to retrieve the next {@link DavResource} from the iterator
+ * and the iterators size.
+ */
+public interface DavResourceIterator extends Iterator<DavResource> {
+
+    /**
+     * Returns the next {@link DavResource} in the iterator
+     * @return the next {@link DavResource}
+     */
+    public DavResource nextResource();
+
+    /**
+     * Return the number of {@link DavResource}s in the iterator.
+     * @return number of elements in the iterator.
+     */
+    public int size();
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavResourceIteratorImpl.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavResourceIteratorImpl.java
new file mode 100644
index 000000000..3f43b7a9a
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavResourceIteratorImpl.java
@@ -0,0 +1,85 @@
+/*
+ * 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.jackrabbit.webdav;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Collections;
+
+/**
+ * <code>DavResourceIteratorImpl</code> implementation of the {@link DavResourceIterator}
+ * interface.<br>
+ * NOTE: {@link #remove()} is not implemented.
+ */
+public class DavResourceIteratorImpl implements DavResourceIterator {
+
+    private static Logger log = LoggerFactory.getLogger(DavResourceIteratorImpl.class);
+
+    public static final DavResourceIterator EMPTY = new DavResourceIteratorImpl(Collections.<DavResource>emptyList());
+
+    private Iterator<DavResource> it;
+    private int size;
+
+    /**
+     * Create a new DavResourceIterator from the specified list.
+     * @param list
+     */
+    public DavResourceIteratorImpl(List<DavResource> list) {
+        it = list.iterator();
+        size = list.size();
+    }
+
+    /**
+     * @see DavResourceIterator#hasNext()
+     */
+    public boolean hasNext() {
+        return it.hasNext();
+    }
+
+    /**
+     * @see DavResourceIterator#next()
+     */
+    public DavResource next() {
+        return it.next();
+    }
+
+    /**
+     * @see DavResourceIterator#nextResource()
+     */
+    public DavResource nextResource() {
+        return next();
+    }
+
+    /**
+     * Returns the size of the initial list.
+     *
+     * @see DavResourceIterator#size()
+     */
+    public int size() {
+        return size;
+    }
+
+    /**
+     * @see DavResourceIterator#remove()
+     */
+    public void remove() {
+        throw new UnsupportedOperationException("Remove not allowed with DavResourceIteratorImpl");
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavResourceLocator.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavResourceLocator.java
new file mode 100644
index 000000000..2a9b82270
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavResourceLocator.java
@@ -0,0 +1,115 @@
+/*
+ * 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.jackrabbit.webdav;
+
+/**
+ * <code>DavResourceLocator</code>...
+ */
+public interface DavResourceLocator {
+
+    /**
+     * Return the prefix used to build the complete href of the resource as
+     * required for the {@link DavConstants#XML_HREF href Xml} element.
+     * This includes scheme and host information as well as constant prefixes.
+     * However, this must not include workspace prefix.
+     *
+     * @return prefix needed in order to build the href from a resource path.
+     * @see #getResourcePath()
+     */
+    public String getPrefix();
+
+    /**
+     * Return the resource path.
+     *
+     * @return resource path
+     */
+    public String getResourcePath();
+
+    /**
+     * Return the path of the workspace the resource identified by this
+     * locator is member of.
+     *
+     * @return path of the workspace
+     */
+    public String getWorkspacePath();
+
+    /**
+     * Return the name of the workspace the resource identified by this
+     * locator is member of.
+     *
+     * @return workspace name
+     */
+    public String getWorkspaceName();
+
+    /**
+     * Returns true if the specified locator refers to a resource within the
+     * same workspace.
+     *
+     * @param locator
+     * @return true if both paths are in the same workspace.
+     */
+    public boolean isSameWorkspace(DavResourceLocator locator);
+
+    /**
+     * Returns true if the specified workspace name equals to the workspace
+     * name defined with this locator.
+     *
+     * @param workspaceName
+     * @return true if workspace names are equal.
+     */
+    public boolean isSameWorkspace(String workspaceName);
+
+    /**
+     * Return the 'href' representation of this locator object. The implementation
+     * should perform an URL encoding of the resource path.
+     *
+     * @param isCollection
+     * @return 'href' representation of this path
+     * @see DavConstants#XML_HREF
+     * @see DavResource#getHref()
+     */
+    public String getHref(boolean isCollection);
+
+    /**
+     * Returns true if this <code>DavResourceLocator</code> represents the root
+     * locator that would be requested with 'hrefPrefix'+'pathPrefix' with or
+     * without a trailing '/'.
+     *
+     * @return true if this locator object belongs to the root resource.
+     */
+    public boolean isRootLocation();
+
+    /**
+     * Return the locator factory that created this locator.
+     *
+     * @return the locator factory
+     */
+    public DavLocatorFactory getFactory();
+
+    /**
+     * An implementation may choose to circumvent the incompatibility of a
+     * repository path with the URI path by applying an appropriate conversion.
+     * This utility method allows to retrieve this transformed repository path.
+     * By default this method should return the same as {@link #getResourcePath()}
+     *
+     * @return a repository compatible form if the resource path.
+     * @see DavLocatorFactory#createResourceLocator(String, String, String, boolean)
+     * that allows to build a valid <code>DavResourceLocator</code> from a given
+     * repository path.
+     */
+    public String getRepositoryPath();
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavServletRequest.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavServletRequest.java
new file mode 100644
index 000000000..e26f0cdcb
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavServletRequest.java
@@ -0,0 +1,199 @@
+/*
+ * 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.jackrabbit.webdav;
+
+import org.apache.jackrabbit.webdav.lock.LockInfo;
+import org.apache.jackrabbit.webdav.property.DavPropertyNameSet;
+import org.apache.jackrabbit.webdav.property.DavProperty;
+import org.apache.jackrabbit.webdav.property.DavPropertyName;
+import org.apache.jackrabbit.webdav.property.PropEntry;
+import org.w3c.dom.Document;
+
+import jakarta.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * <code>DavServletRequest</code> extends the HttpServletRequest by Webdav
+ * specific METHODS.
+ */
+public interface DavServletRequest extends HttpServletRequest {
+
+    /**
+     * Sets the <code>DavSession</code> to this request.
+     *
+     * @param session
+     */
+    public void setDavSession(DavSession session);
+
+    /**
+     * Returns the {@link DavSession} created for this request.
+     *
+     * @return session for this resource
+     */
+    public DavSession getDavSession();
+
+    /**
+     * Return the locator of the requested {@link DavResource resource}.
+     *
+     * @return locator of the requested {@link DavResource resource}.
+     */
+    public DavResourceLocator getRequestLocator();
+
+    /**
+     * Parse the {@link DavConstants#HEADER_DESTINATION Destination header}
+     * and return the locator of the corresponding {@link DavResource resource}.
+     *
+     * @return locator of the resource specified with the Destination header.
+     * @see DavConstants#HEADER_DESTINATION
+     */
+    public DavResourceLocator getDestinationLocator() throws DavException;
+
+    /**
+     * Returns true if the {@link DavConstants#HEADER_OVERWRITE Overwrite header}
+     * is set to 'T' thus instructing the server to overwrite the state of a
+     * non-null destination resource during a COPY or MOVE. A Overwrite header
+     * value of 'F' will return false.
+     *
+     * @return true if the Overwrite header is set to 'T', false if it is set
+     * to 'F'.
+     * @see DavConstants#HEADER_OVERWRITE
+     */
+    public boolean isOverwrite();
+
+    /**
+     * Return the integer representation of the given {@link DavConstants#HEADER_DEPTH
+     * Depth header}. 'Infinity' is represented by {@link DavConstants#DEPTH_INFINITY}.
+     *
+     * @return integer representation of the {@link DavConstants#HEADER_DEPTH
+     * Depth header}.
+     * @see DavConstants#HEADER_DEPTH
+     */
+    public int getDepth();
+
+    /**
+     * Returns the integer representation of the {@link DavConstants#HEADER_DEPTH
+     * Depth header} or the given defaultValue, if the Depth header is missing.
+     *
+     * @param defaultValue to be returned if no Depth header is present.
+     * @return integer representation of the {@link DavConstants#HEADER_DEPTH
+     * Depth header} or the given defaultValue.
+     * @see DavConstants#HEADER_DEPTH
+     */
+    public int getDepth(int defaultValue);
+
+    /**
+     * Returns the token present in the {@link DavConstants#HEADER_LOCK_TOKEN
+     * Lock-Token Header} or <code>null</code> if no such header is available.<br>
+     * Note: The 'Lock-Token' header is sent with UNLOCK requests and with
+     * lock responses only. For any other request that may be affected by a lock
+     * the 'If' header field is responsible.
+     *
+     * @return the token present in the Lock-Token header.
+     * @see DavConstants#HEADER_LOCK_TOKEN
+     */
+    public String getLockToken();
+
+    /**
+     * Return the timeout requested in the {@link DavConstants#HEADER_TIMEOUT
+     * Timeout header} as <code>long</code>. The representation of the
+     * 'Infinite' timeout is left to the implementation.
+     *
+     * @return long value representation of the Timeout header.
+     * @see DavConstants#HEADER_TIMEOUT
+     * @see DavConstants#TIMEOUT_INFINITE
+     */
+    public long getTimeout();
+
+    /**
+     * Parse the Xml request body and return a {@link org.w3c.dom.Document}.
+     *
+     * @return Document representing the Xml request body or <code>null</code>
+     * if no request body is present.
+     * @throws DavException If the request body cannot be parsed into an Xml
+     * Document.
+     */
+    public Document getRequestDocument() throws DavException;
+
+    /**
+     * Return the type of PROPFIND request as indicated by the PROPFIND request
+     * body.
+     *
+     * @return type of PROPFIND request
+     * @see DavConstants#PROPFIND_ALL_PROP
+     * @see DavConstants#PROPFIND_BY_PROPERTY
+     * @see DavConstants#PROPFIND_PROPERTY_NAMES
+     * @see DavConstants#PROPFIND_ALL_PROP_INCLUDE
+     * @throws DavException If the propfind type could not be determined due to
+     * an invalid request body.
+     */
+    public int getPropFindType() throws DavException;
+
+    /**
+     * Return the set of properties the client requested with a PROPFIND request
+     * or an empty set if the type of PROPFIND request was {@link DavConstants#PROPFIND_ALL_PROP}
+     * or {@link DavConstants#PROPFIND_PROPERTY_NAMES}.
+     *
+     * @return set of properties the client requested with a PROPFIND request
+     * @throws DavException In case of invalid request body
+     */
+    public DavPropertyNameSet getPropFindProperties() throws DavException;
+
+    /**
+     * Return a {@link List} of property change operations. Each entry
+     * is either of type {@link DavPropertyName}, indicating a &lt;remove&gt;
+     * operation, or of type {@link DavProperty}, indicating a &lt;set&gt;
+     * operation. Note that ordering is significant here.
+     *
+     * @return {@link List} of property change operations
+     * @throws DavException In case of invalid request body
+     */
+    public List<? extends PropEntry> getPropPatchChangeList() throws DavException;
+
+    /**
+     * Return the parsed 'lockinfo' request body, the {@link DavConstants#HEADER_TIMEOUT
+     * Timeout header} and the {@link DavConstants#HEADER_DEPTH Depth header}
+     * of a LOCK request as <code>LockInfo</code> object.
+     *
+     * @return <code>LockInfo</code> object encapsulating the information
+     * present in the LOCK request.
+     * @see DavConstants#HEADER_TIMEOUT
+     * @see DavConstants#HEADER_DEPTH
+     * @see DavConstants#XML_LOCKINFO
+     * @throws DavException
+     */
+    public LockInfo getLockInfo() throws DavException;
+
+    /**
+     * Returns true, if the {@link DavConstants#HEADER_IF If header} present
+     * with the request matches the given resource.
+     *
+     * @param resource
+     * @return true, if the test is successful, false otherwise.
+     */
+    public boolean matchesIfHeader(DavResource resource);
+
+    /**
+     * Returns true, if the {@link DavConstants#HEADER_IF If header} present
+     * with the request matches to the given href, token and eTag.
+     *
+     * @param href
+     * @param token
+     * @param eTag
+     * @return true, if the test is successful, false otherwise.
+     */
+    public boolean matchesIfHeader(String href, String token, String eTag);
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavServletResponse.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavServletResponse.java
new file mode 100644
index 000000000..452b974e6
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavServletResponse.java
@@ -0,0 +1,149 @@
+/*
+ * 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.jackrabbit.webdav;
+
+import org.apache.jackrabbit.webdav.lock.ActiveLock;
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * <code>WebdavResponse</code> extends the HttpServletResponse by
+ * Webdav specific status codes and METHODS.
+ */
+public interface DavServletResponse extends HttpServletResponse {
+
+    /**
+     * The 102 (Processing) status code is an interim response used to
+     * inform the client that the server has accepted the complete request,
+     * but has not yet completed it.
+     */
+    int SC_PROCESSING = 102;
+
+    /**
+     * Status code (207) indicating that the response requires
+     * providing status for multiple independent operations.
+     */
+    int SC_MULTI_STATUS = 207;
+
+    /**
+     * The 422 (Unprocessable Entity) status code means the server understands
+     * the content type of the request entity (hence a 415(Unsupported Media Type)
+     * status code is inappropriate), and the syntax of the request entity is
+     * correct (thus a 400 (Bad Request) status code is inappropriate) but was
+     * unable to process the contained instructions. For example, this error
+     * condition may occur if an XML request body contains well-formed (i.e.,
+     * syntactically correct), but semantically erroneous XML instructions.
+     */
+    int SC_UNPROCESSABLE_ENTITY = 422;
+
+    /**
+     * Status code (423) indicating the destination resource of a
+     * method is locked, and either the request did not contain a
+     * valid Lock-Info header, or the Lock-Info header identifies
+     * a lock held by another principal.
+     */
+    int SC_LOCKED = 423;
+
+    /**
+     * Status code (424) indicating that the method could not be
+     * performed on the resource, because the requested action depended
+     * on another action which failed.
+     */
+    int SC_FAILED_DEPENDENCY = 424;
+
+    /**
+     * Status code (507) indicating that the resource does not have
+     * sufficient space to record the state of the resource after the
+     * execution of this method.
+     */
+    int SC_INSUFFICIENT_SPACE_ON_RESOURCE = 507;
+
+    /**
+     * Send a response body given more detailed information about the error
+     * occurred.
+     *
+     * @param error
+     * @throws IOException
+     */
+    public void sendError(DavException error) throws IOException;
+
+    /**
+     * Send the multistatus response to the client. A multistatus response
+     * is returned in response to a successful PROPFIND and PROPPATCH request.
+     * In addition multistatus response is required response in case a COPY,
+     * MOVE, DELETE, LOCK or PROPPATCH request fails.
+     *
+     * @param multistatus
+     * @throws IOException
+     * @see #SC_MULTI_STATUS
+     */
+    public void sendMultiStatus(MultiStatus multistatus) throws IOException;
+
+    /**
+     * Send the multistatus response to the client. A multistatus response
+     * is returned in response to a successful PROPFIND and PROPPATCH request.
+     * In addition multistatus response is required response in case a COPY,
+     * MOVE, DELETE, LOCK or PROPPATCH request fails.
+     *
+     * @param multistatus
+     * @param acceptableContentCodings content codings accepted by the client
+     * @throws IOException
+     * @see #SC_MULTI_STATUS
+     */
+    default void sendMultiStatus(MultiStatus multistatus, List<String> acceptableContentCodings) throws IOException {
+        sendMultiStatus(multistatus);
+    }
+
+    /**
+     * Send the lock response for a successful LOCK request, that was intended
+     * to refresh an existing lock. The locks array must contain at least
+     * a single element; the <code>ActiveLock</code> objects are then
+     * included in the lockdiscovery property of the response body as required
+     * by RFC 2518.
+     *
+     * @param locks
+     * @throws IOException
+     * @see DavConstants#PROPERTY_LOCKDISCOVERY
+     */
+    public void sendRefreshLockResponse(ActiveLock[] locks) throws IOException;
+
+    /**
+     * Generic method to return an Xml response body.
+     *
+     * @param serializable object that can be converted to the root Xml element
+     * of the document to be sent as response body.
+     * @param status Status code to be used with {@link #setStatus(int)}.
+     * @throws IOException
+     */
+    public void sendXmlResponse(XmlSerializable serializable, int status) throws IOException;
+
+    /**
+     * Generic method to return an Xml response body.
+     *
+     * @param serializable object that can be converted to the root Xml element
+     * of the document to be sent as response body.
+     * @param status Status code to be used with {@link #setStatus(int)}.
+     * @param acceptableContentCodings content codings accepted by the client
+     * @throws IOException
+     */
+    default void sendXmlResponse(XmlSerializable serializable, int status, List<String> acceptableContentCodings) throws IOException {
+        sendXmlResponse(serializable, status);
+    }
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavSession.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavSession.java
new file mode 100644
index 000000000..90cc43e0a
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavSession.java
@@ -0,0 +1,62 @@
+/*
+ * 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.jackrabbit.webdav;
+
+/**
+ * <code>DavSession</code> allows to pass session information between request,
+ * response and resource(s).
+ */
+public interface DavSession {
+
+    /**
+     * Adds a reference to this <code>DavSession</code> indicating that this
+     * session must not be discarded after completion of the current request.
+     *
+     * @param reference to be added.
+     */
+    public void addReference(Object reference);
+
+    /**
+     * Releasing a reference to this <code>DavSession</code>. If no more
+     * references are present, this session may be discarded.
+     *
+     * @param reference to be removed.
+     */
+    public void removeReference(Object reference);
+
+    /**
+     * Adds a lock token to this <code>DavSession</code>.
+     *
+     * @param token
+     */
+    public void addLockToken(String token);
+
+    /**
+     * Returns the lock tokens of this <code>DavSession</code>.
+     *
+     * @return
+     */
+    public String[] getLockTokens();
+
+    /**
+     * Removes a lock token from this <code>DavSession</code>.
+     *
+     * @param token
+     */
+    public void removeLockToken(String token);
+
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavSessionProvider.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavSessionProvider.java
new file mode 100644
index 000000000..ff1f7062d
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/DavSessionProvider.java
@@ -0,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.
+ */
+package org.apache.jackrabbit.webdav;
+
+/**
+ * <code>DavSessionProvider</code> is an interface for components that
+ * can initiate and complete {@link DavSession}s. A provider is
+ * responsible for supplying references from a {@link WebdavRequest}
+ * to a {@link DavSession} when acquired and removing the references
+ * when released.
+
+ */
+public interface DavSessionProvider {
+
+    /**
+     * Acquires a DavSession. Upon success, the WebdavRequest will
+     * reference that session.
+     *
+     * A session will not be available if an exception is thrown.
+     *
+     * @param request
+     * @return <code>true</code> if the session was attached to the request;
+     *         <code>false</code> otherwise.
+     * @throws DavException if a problem occurred while obtaining the session
+     */
+    public boolean attachSession(WebdavRequest request) throws DavException;
+
+    /**
+     * Releases the reference from the request to the session.
+     *
+     * @param request
+     */
+    public void releaseSession(WebdavRequest request);
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/MultiStatus.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/MultiStatus.java
new file mode 100644
index 000000000..79536b628
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/MultiStatus.java
@@ -0,0 +1,193 @@
+/*
+ * 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.jackrabbit.webdav;
+
+import org.apache.jackrabbit.webdav.property.DavPropertyNameSet;
+import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.apache.jackrabbit.webdav.xml.ElementIterator;
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * MultiStatus representing the content of a multistatus response body and
+ * allows to retrieve the Xml representation.
+ */
+public class MultiStatus implements DavConstants, XmlSerializable {
+
+    /**
+     * Map collecting the responses for this multistatus, where every href must
+     * only occur one single time.
+     */
+    private Map<String, MultiStatusResponse> responses = new LinkedHashMap<String, MultiStatusResponse>();
+
+    /**
+     * A general response description at the multistatus top level is used to
+     * provide a general message describing the overarching nature of the response.
+     * If this value is available an application may use it instead of
+     * presenting the individual response descriptions contained within the
+     * responses.
+     */
+    private String responseDescription;
+
+    /**
+     * Add response(s) to this multistatus, in order to build a multistatus for
+     * responding to a PROPFIND request.
+     *
+     * @param resource The resource to add property from
+     * @param propNameSet The requested property names of the PROPFIND request
+     * @param propFindType
+     * @param depth
+     */
+    public void addResourceProperties(DavResource resource, DavPropertyNameSet propNameSet,
+                                      int propFindType, int depth) {
+        addResponse(new MultiStatusResponse(resource, propNameSet, propFindType));
+        if (depth > 0 && resource.isCollection()) {
+            DavResourceIterator iter = resource.getMembers();
+            while (iter.hasNext()) {
+                addResourceProperties(iter.nextResource(), propNameSet, propFindType, depth-1);
+            }
+        }
+    }
+
+    /**
+     * Add response(s) to this multistatus, in order to build a multistatus e.g.
+     * in order to respond to a PROPFIND request. Please note, that in terms
+     * of PROPFIND, this method would correspond to a
+     * {@link DavConstants#PROPFIND_BY_PROPERTY} propfind type.
+     *
+     * @param resource The resource to add property from
+     * @param propNameSet The requested property names of the PROPFIND request
+     * @param depth
+     * @see #addResourceProperties(DavResource, DavPropertyNameSet, int, int) for
+     * the corresponding method that allows to specify the type.
+     */
+    public void addResourceProperties(DavResource resource, DavPropertyNameSet propNameSet,
+                                      int depth) {
+        addResourceProperties(resource, propNameSet, PROPFIND_BY_PROPERTY, depth);
+    }
+
+    /**
+     * Add response(s) to this multistatus, in order to build a multistatus
+     * as returned for COPY, MOVE, LOCK or DELETE requests resulting in an error
+     * with a resource other than the resource identified in the Request-URI.
+     *
+     * @param resource
+     * @param status
+     * @param depth
+     */
+    public void addResourceStatus(DavResource resource, int status, int depth) {
+        addResponse(new MultiStatusResponse(resource.getHref(), status));
+        if (depth > 0 && resource.isCollection()) {
+            DavResourceIterator iter = resource.getMembers();
+            while (iter.hasNext()) {
+                addResourceStatus(iter.nextResource(), status, depth-1);
+            }
+        }
+    }
+
+    /**
+     * Add a <code>MultiStatusResponse</code> element to this <code>MultiStatus</code>
+     * <p>
+     * This method is synchronized to avoid the problem described in
+     * <a href="https://issues.apache.org/jira/browse/JCR-2755">JCR-2755</a>.
+     *
+     * @param response
+     */
+    public synchronized void addResponse(MultiStatusResponse response) {
+        responses.put(response.getHref(), response);
+    }
+
+    /**
+     * Returns the multistatus responses present as array.
+     * <p>
+     * This method is synchronized to avoid the problem described in
+     * <a href="https://issues.apache.org/jira/browse/JCR-2755">JCR-2755</a>.
+     *
+     * @return array of all {@link MultiStatusResponse responses} present in this
+     * multistatus.
+     */
+    public synchronized MultiStatusResponse[] getResponses() {
+        return responses.values().toArray(new MultiStatusResponse[responses.size()]);
+    }
+
+    /**
+     * Set the response description.
+     *
+     * @param responseDescription
+     */
+    public void setResponseDescription(String responseDescription) {
+        this.responseDescription = responseDescription;
+    }
+
+    /**
+     * Returns the response description.
+     *
+     * @return responseDescription
+     */
+    public String getResponseDescription() {
+        return responseDescription;
+    }
+
+    /**
+     * Return the Xml representation of this <code>MultiStatus</code>.
+     *
+     * @return Xml document
+     * @param document
+     */
+    public Element toXml(Document document) {
+        Element multistatus = DomUtil.createElement(document, XML_MULTISTATUS, NAMESPACE);
+        for (MultiStatusResponse resp : getResponses()) {
+            multistatus.appendChild(resp.toXml(document));
+        }
+        if (responseDescription != null) {
+            Element respDesc = DomUtil.createElement(document, XML_RESPONSEDESCRIPTION, NAMESPACE, responseDescription);
+            multistatus.appendChild(respDesc);
+        }
+        return multistatus;
+    }
+
+    /**
+     * Build a <code>MultiStatus</code> from the specified xml element.
+     *
+     * @param multistatusElement
+     * @return new <code>MultiStatus</code> instance.
+     * @throws IllegalArgumentException if the given document is <code>null</code>
+     * or does not provide the required element.
+     */
+    public static MultiStatus createFromXml(Element multistatusElement) {
+        if (!DomUtil.matches(multistatusElement, XML_MULTISTATUS, NAMESPACE)) {
+            throw new IllegalArgumentException("DAV:multistatus element expected.");
+        }
+
+        MultiStatus multistatus = new MultiStatus();
+
+        ElementIterator it = DomUtil.getChildren(multistatusElement, XML_RESPONSE, NAMESPACE);
+        while (it.hasNext()) {
+            Element respElem = it.nextElement();
+            MultiStatusResponse response = MultiStatusResponse.createFromXml(respElem);
+            multistatus.addResponse(response);
+        }
+
+        // optional response description on the multistatus element
+        multistatus.setResponseDescription(DomUtil.getChildText(multistatusElement, XML_RESPONSEDESCRIPTION, NAMESPACE));
+        return multistatus;
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/MultiStatusResponse.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/MultiStatusResponse.java
new file mode 100644
index 000000000..a0a5d0d7c
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/MultiStatusResponse.java
@@ -0,0 +1,486 @@
+/*
+ * 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.jackrabbit.webdav;
+
+import org.apache.jackrabbit.webdav.property.DavProperty;
+import org.apache.jackrabbit.webdav.property.DavPropertyName;
+import org.apache.jackrabbit.webdav.property.DavPropertyNameSet;
+import org.apache.jackrabbit.webdav.property.DavPropertySet;
+import org.apache.jackrabbit.webdav.property.DefaultDavProperty;
+import org.apache.jackrabbit.webdav.property.PropContainer;
+import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.apache.jackrabbit.webdav.xml.ElementIterator;
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * <code>MultiStatusResponse</code> represents the DAV:multistatus element defined
+ * by RFC 2518:
+ * <pre>
+ * &lt;!ELEMENT response (href, ((href*, status)|(propstat+)), responsedescription?) &gt;
+ * &lt;!ELEMENT status (#PCDATA) &gt;
+ * &lt;!ELEMENT propstat (prop, status, responsedescription?) &gt;
+ * &lt;!ELEMENT responsedescription (#PCDATA) &gt;
+ * &lt;!ELEMENT prop ANY &gt;
+ * </pre>
+ */
+public class MultiStatusResponse implements XmlSerializable, DavConstants {
+
+    private static final int TYPE_PROPSTAT = 0;
+    private static final int TYPE_HREFSTATUS = 1;
+
+    /**
+     * The type of MultiStatusResponse
+     */
+    private final int type;
+
+    /**
+     * The content the 'href' element for this response
+     */
+    private final String href;
+
+    /**
+     * An optional response description.
+     */
+    private final String responseDescription;
+
+    /**
+     * Type of MultiStatus response: Href + Status
+     */
+    private Status status;
+
+    /**
+     * Type of MultiStatus response: PropStat Hashmap containing all status
+     */
+    private HashMap<Integer, PropContainer> statusMap = new HashMap<Integer, PropContainer>();
+
+    private MultiStatusResponse(String href, String responseDescription, int type) {
+        if (!isValidHref(href)) {
+            throw new IllegalArgumentException("Invalid href ('" + href + "')");
+        }
+        this.href = href;
+        this.responseDescription = responseDescription;
+        this.type = type;
+    }
+
+    /**
+     * Constructs an WebDAV multistatus response
+     *
+     * @param href
+     * @param status
+     * @param responseDescription
+     */
+    public MultiStatusResponse(String href, Status status, String responseDescription) {
+        this(href, responseDescription, TYPE_HREFSTATUS);
+        if (status == null) {
+            throw new IllegalArgumentException("Status must not be null in case of a multistatus reponse that consists of href + status only.");
+        }
+        this.status = status;
+    }
+
+    /**
+     * Constructs an WebDAV multistatus response for a given resource. This
+     * would be used by COPY, MOVE, DELETE, LOCK that require a multistatus in
+     * case of error with a resource other than the resource identified in the
+     * Request-URI.<br>
+     * The response description is set to <code>null</code>.
+     *
+     * @param href
+     * @param statusCode
+     */
+    public MultiStatusResponse(String href, int statusCode) {
+        this(href, statusCode, null);
+    }
+
+    /**
+     * Constructs an WebDAV multistatus response for a given resource. This
+     * would be used by COPY, MOVE, DELETE, LOCK that require a multistatus in
+     * case of error with a resource other than the resource identified in the
+     * Request-URI.
+     *
+     * @param href
+     * @param statusCode
+     * @param responseDescription
+     */
+    public MultiStatusResponse(String href, int statusCode, String responseDescription) {
+        this(href, new Status(statusCode), responseDescription);
+    }
+
+    /**
+     * Constructs an empty WebDAV multistatus response of type 'PropStat'
+     */
+    public MultiStatusResponse(String href, String responseDescription) {
+        this(href, responseDescription, TYPE_PROPSTAT);
+    }
+
+    /**
+     * Constructs a WebDAV multistatus response and retrieves the resource
+     * properties according to the given <code>DavPropertyNameSet</code>.
+     *
+     * @param resource
+     * @param propNameSet
+     */
+    public MultiStatusResponse(DavResource resource, DavPropertyNameSet propNameSet) {
+        this(resource, propNameSet, PROPFIND_BY_PROPERTY);
+    }
+
+    /**
+     * Constructs a WebDAV multistatus response and retrieves the resource
+     * properties according to the given <code>DavPropertyNameSet</code>. It
+     * adds all known property to the '200' set, while unknown properties are
+     * added to the '404' set.
+     * <p>
+     * Note, that the set of property names is ignored in case of a {@link
+     * #PROPFIND_ALL_PROP} and {@link #PROPFIND_PROPERTY_NAMES} propFindType.
+     *
+     * @param resource The resource to retrieve the property from
+     * @param propNameSet The property name set as obtained from the request
+     * body.
+     * @param propFindType any of the following values: {@link
+     * #PROPFIND_ALL_PROP}, {@link #PROPFIND_BY_PROPERTY}, {@link
+     * #PROPFIND_PROPERTY_NAMES}, {@link #PROPFIND_ALL_PROP_INCLUDE}
+     */
+    public MultiStatusResponse(
+            DavResource resource, DavPropertyNameSet propNameSet,
+            int propFindType) {
+        this(resource.getHref(), null, TYPE_PROPSTAT);
+
+        if (propFindType == PROPFIND_PROPERTY_NAMES) {
+            // only property names requested
+            PropContainer status200 = getPropContainer(DavServletResponse.SC_OK, true);
+            for (DavPropertyName propName : resource.getPropertyNames()) {
+                status200.addContent(propName);
+            }
+        } else {
+            // all or a specified set of property and their values requested.
+            PropContainer status200 = getPropContainer(DavServletResponse.SC_OK, false);
+
+            // Collection of missing property names for 404 responses
+            Set<DavPropertyName> missing = new HashSet<DavPropertyName>(propNameSet.getContent());
+
+            // Add requested properties or all non-protected properties,
+            // or non-protected properties plus requested properties (allprop/include) 
+            if (propFindType == PROPFIND_BY_PROPERTY) {
+                // add explicitly requested properties (proptected or non-protected)
+                for (DavPropertyName propName : propNameSet) {
+                    DavProperty<?> prop = resource.getProperty(propName);
+                    if (prop != null) {
+                        status200.addContent(prop);
+                        missing.remove(propName);
+                    }
+                }
+            } else {
+                // add all non-protected properties
+                for (DavProperty<?> property : resource.getProperties()) {
+                    boolean allDeadPlusRfc4918LiveProperties =
+                        propFindType == PROPFIND_ALL_PROP
+                        || propFindType == PROPFIND_ALL_PROP_INCLUDE;
+                    boolean wasRequested = missing.remove(property.getName());
+
+                    if ((allDeadPlusRfc4918LiveProperties
+                            && !property.isInvisibleInAllprop())
+                            || wasRequested) {
+                        status200.addContent(property);
+                    }
+                }
+
+                // try if missing properties specified in the include section
+                // can be obtained using resource.getProperty
+                if (propFindType == PROPFIND_ALL_PROP_INCLUDE && !missing.isEmpty()) {
+                    for (DavPropertyName propName : new HashSet<DavPropertyName>(missing)) {
+                        DavProperty<?> prop = resource.getProperty(propName);
+                        if (prop != null) {
+                            status200.addContent(prop);
+                            missing.remove(propName);
+                        }
+                    }
+                }
+            }
+
+            if (!missing.isEmpty() && propFindType != PROPFIND_ALL_PROP) {
+                PropContainer status404 = getPropContainer(DavServletResponse.SC_NOT_FOUND, true);
+                for (DavPropertyName propName : missing) {
+                    status404.addContent(propName);
+                }
+            }
+        }
+    }
+
+    /**
+     * Returns the href
+     *
+     * @return href
+     * @see MultiStatusResponse#getHref()
+     */
+    public String getHref() {
+        return href;
+    }
+
+    /**
+     * @return responseDescription
+     * @see MultiStatusResponse#getResponseDescription()
+     */
+    public String getResponseDescription() {
+        return responseDescription;
+    }
+
+    /**
+     * Return an array listing all 'status' available is this response object.
+     * Note, that a the array contains a single element if this
+     * <code>MultiStatusResponse</code> defines an response consisting of
+     * href and status elements.
+     *
+     * @return
+     */
+    public Status[] getStatus() {
+        Status[] sts;
+        if (type == TYPE_PROPSTAT) {
+            sts = new Status[statusMap.size()];
+            Iterator<Integer> iter = statusMap.keySet().iterator();
+            for (int i = 0; iter.hasNext(); i++) {
+                Integer statusKey = iter.next();
+                sts[i] = new Status(statusKey);
+            }
+        } else {
+            sts = new Status[] {status};
+        }
+        return sts;
+    }
+
+    /**
+     * @return {@code true} if the response is of type "propstat" (containing information about individual properties)
+     */
+    public boolean isPropStat() {
+        return this.type == TYPE_PROPSTAT;
+    }
+
+    /**
+     * @param document
+     * @see org.apache.jackrabbit.webdav.xml.XmlSerializable#toXml(org.w3c.dom.Document)
+     */
+    public Element toXml(Document document) {
+        Element response = DomUtil.createElement(document, XML_RESPONSE, NAMESPACE);
+        // add '<href>'
+        response.appendChild(DomUtil.hrefToXml(getHref(), document));
+        if (type == TYPE_PROPSTAT) {
+            // add '<propstat>' elements
+            for (Integer statusKey : statusMap.keySet()) {
+                Status st = new Status(statusKey);
+                PropContainer propCont = statusMap.get(statusKey);
+                if (!propCont.isEmpty()) {
+                    Element propstat = DomUtil.createElement(document, XML_PROPSTAT, NAMESPACE);
+                    propstat.appendChild(propCont.toXml(document));
+                    propstat.appendChild(st.toXml(document));
+                    response.appendChild(propstat);
+                }
+            }
+        } else {
+            // add a single '<status>' element
+            // NOTE: a href+status response cannot be created with 'null' status
+            response.appendChild(status.toXml(document));
+        }
+        // add the optional '<responsedescription>' element
+        String description = getResponseDescription();
+        if (description != null) {
+            Element desc = DomUtil.createElement(document, XML_RESPONSEDESCRIPTION, NAMESPACE);
+            DomUtil.setText(desc, description);
+            response.appendChild(desc);
+        }
+        return response;
+    }
+    //----------------------------------------------< type specific methods >---
+    /**
+     * Adds a property to this response '200' propstat set.
+     *
+     * @param property the property to add
+     */
+    public void add(DavProperty<?> property) {
+        checkType(TYPE_PROPSTAT);
+        PropContainer status200 = getPropContainer(DavServletResponse.SC_OK, false);
+        status200.addContent(property);
+    }
+
+    /**
+     * Adds a property name to this response '200' propstat set.
+     *
+     * @param propertyName the property name to add
+     */
+    public void add(DavPropertyName propertyName) {
+        checkType(TYPE_PROPSTAT);
+        PropContainer status200 = getPropContainer(DavServletResponse.SC_OK, true);
+        status200.addContent(propertyName);
+    }
+
+    /**
+     * Adds a property to this response
+     *
+     * @param property the property to add
+     * @param status the status of the response set to select
+     */
+    public void add(DavProperty<?> property, int status) {
+        checkType(TYPE_PROPSTAT);
+        PropContainer propCont = getPropContainer(status, false);
+        propCont.addContent(property);
+    }
+
+    /**
+     * Adds a property name to this response
+     *
+     * @param propertyName the property name to add
+     * @param status the status of the response set to select
+     */
+    public void add(DavPropertyName propertyName, int status) {
+        checkType(TYPE_PROPSTAT);
+        PropContainer propCont = getPropContainer(status, true);
+        propCont.addContent(propertyName);
+    }
+
+    /**
+     * @param status
+     * @return
+     */
+    private PropContainer getPropContainer(int status, boolean forNames) {
+        PropContainer propContainer = statusMap.get(status);
+        if (propContainer == null) {
+            if (forNames) {
+                propContainer = new DavPropertyNameSet();
+            } else {
+                propContainer = new DavPropertySet();
+            }
+            statusMap.put(status, propContainer);
+        }
+        return propContainer;
+    }
+
+    private void checkType(int type) {
+        if (this.type != type) {
+            throw new IllegalStateException("The given MultiStatusResponse is not of the required type.");
+        }
+    }
+
+    /**
+     * Get properties present in this response for the given status code. In
+     * case this MultiStatusResponse does not represent a 'propstat' response,
+     * always an empty {@link DavPropertySet} will be returned.
+     *
+     * @param status
+     * @return property set
+     */
+    public DavPropertySet getProperties(int status) {
+        if (statusMap.containsKey(status)) {
+            PropContainer mapEntry = statusMap.get(status);
+            if (mapEntry != null && mapEntry instanceof DavPropertySet) {
+                return (DavPropertySet) mapEntry;
+            }
+        }
+        return new DavPropertySet();
+    }
+
+    /**
+     * Get property names present in this response for the given status code. In
+     * case this MultiStatusResponse does not represent a 'propstat' response,
+     * always an empty {@link DavPropertyNameSet} will be returned.
+     *
+     * @param status
+     * @return property names
+     */
+    public DavPropertyNameSet getPropertyNames(int status) {
+        if (statusMap.containsKey(status)) {
+            PropContainer mapEntry = statusMap.get(status);
+            if (mapEntry != null) {
+                if (mapEntry instanceof DavPropertySet) {
+                    DavPropertyNameSet set = new DavPropertyNameSet();
+                    for (DavPropertyName name : ((DavPropertySet) mapEntry).getPropertyNames()) {
+                        set.add(name);
+                    }
+                    return set;
+                } else {
+                    // is already a DavPropertyNameSet
+                    return (DavPropertyNameSet) mapEntry;
+                }
+            }
+        }
+        return new DavPropertyNameSet();
+    }
+
+    /**
+     * Build a new response object from the given xml element.
+     *
+     * @param responseElement
+     * @return new <code>MultiStatusResponse</code> instance
+     * @throws IllegalArgumentException if the specified element is
+     * <code>null</code> or not a DAV:response element or if the mandatory
+     * DAV:href child is missing.
+     */
+    public static MultiStatusResponse createFromXml(Element responseElement) {
+        if (!DomUtil.matches(responseElement, XML_RESPONSE, NAMESPACE)) {
+            throw new IllegalArgumentException("DAV:response element required.");
+        }
+        String href = DomUtil.getChildTextTrim(responseElement, XML_HREF, NAMESPACE);
+        if (href == null) {
+            throw new IllegalArgumentException("DAV:response element must contain a DAV:href element expected.");
+        }
+        String statusLine = DomUtil.getChildText(responseElement, XML_STATUS, NAMESPACE);
+        String responseDescription = DomUtil.getChildText(responseElement, XML_RESPONSEDESCRIPTION, NAMESPACE);
+
+        MultiStatusResponse response;
+        if (statusLine != null) {
+            Status status = Status.parse(statusLine);
+            response = new MultiStatusResponse(href, status, responseDescription);
+        } else {
+            response = new MultiStatusResponse(href, responseDescription, TYPE_PROPSTAT);
+            // read propstat elements
+            ElementIterator it = DomUtil.getChildren(responseElement, XML_PROPSTAT, NAMESPACE);
+            while (it.hasNext()) {
+                Element propstat = it.nextElement();
+                String propstatus = DomUtil.getChildText(propstat, XML_STATUS, NAMESPACE);
+                Element prop = DomUtil.getChildElement(propstat, XML_PROP, NAMESPACE);
+                if (propstatus != null && prop != null) {
+                    int statusCode = Status.parse(propstatus).getStatusCode();
+                    ElementIterator propIt = DomUtil.getChildren(prop);
+                    while (propIt.hasNext()) {
+                        Element el = propIt.nextElement();
+                        /*
+                        always build dav property from the given element, since
+                        distinction between prop-names and properties not having
+                        a value is not possible.
+                        retrieval of the set of 'property names' is possible from
+                        the given prop-set by calling DavPropertySet#getPropertyNameSet()
+                        */
+                        DavProperty<?> property = DefaultDavProperty.createFromXml(el);
+                        response.add(property, statusCode);
+                    }
+                }
+            }
+        }
+        return response;
+    }
+
+    /**
+     * @param href
+     * @return false if the given href is <code>null</code> or empty string.
+     */
+    private static boolean isValidHref(String href) {
+        return href != null && !"".equals(href);
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/Status.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/Status.java
new file mode 100644
index 000000000..4357416cc
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/Status.java
@@ -0,0 +1,125 @@
+/*
+ * 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.jackrabbit.webdav;
+
+import java.util.Locale;
+
+import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * <code>Status</code> encapsulating the 'status' present in multistatus
+ * responses.
+ */
+public class Status implements DavConstants, XmlSerializable{
+
+    private static Logger log = LoggerFactory.getLogger(Status.class);
+
+    private final String version;
+    private final int code;
+    private final String phrase;
+
+    public Status(int code) {
+        version = "HTTP/1.1";
+        this.code = code;
+        phrase = DavException.getStatusPhrase(code);
+    }
+
+    public Status(String version, int code, String phrase) {
+        this.version = version;
+        this.code = code;
+        this.phrase = phrase;
+    }
+
+    public int getStatusCode() {
+        return code;
+    }
+
+    /**
+     * @see XmlSerializable#toXml(Document)
+     */
+    public Element toXml(Document document) {
+        String statusLine = version + " " + code + " " + phrase;
+        Element e = DomUtil.createElement(document, XML_STATUS, NAMESPACE);
+        DomUtil.setText(e, statusLine);
+        return e;
+    }
+
+    /**
+     * Parse the given status line and return a new <code>Status</code> object.
+     *
+     * @param statusLine
+     * @return a new <code>Status</code>
+     */
+    public static Status parse(String statusLine) {
+        if (statusLine == null) {
+            throw new IllegalArgumentException("Unable to parse status line from null xml element.");
+        }
+        Status status;
+
+        // code copied from org.apache.commons.httpclient.StatusLine
+        int length = statusLine.length();
+        int at = 0;
+        int start = 0;
+        try {
+            while (Character.isWhitespace(statusLine.charAt(at))) {
+                ++at;
+                ++start;
+            }
+            if (!"HTTP".equals(statusLine.substring(at, at += 4))) {
+                log.warn("Status-Line '" + statusLine + "' does not start with HTTP");
+            }
+            //handle the HTTP-Version
+            at = statusLine.indexOf(' ', at);
+            if (at <= 0) {
+                log.warn("Unable to parse HTTP-Version from the status line: '" + statusLine + "'");
+            }
+            String version = (statusLine.substring(start, at)).toUpperCase(Locale.ROOT);
+            //advance through spaces
+            while (statusLine.charAt(at) == ' ') {
+                at++;
+            }
+            //handle the Status-Code
+            int code;
+            int to = statusLine.indexOf(' ', at);
+            if (to < 0) {
+                to = length;
+            }
+            try {
+                code = Integer.parseInt(statusLine.substring(at, to));
+            } catch (NumberFormatException e) {
+                throw new IllegalArgumentException("Unable to parse status code from status line: '" + statusLine + "'");
+            }
+            //handle the Reason-Phrase
+            String phrase = "";
+            at = to + 1;
+            if (at < length) {
+                phrase = statusLine.substring(at).trim();
+            }
+
+            status = new Status(version, code, phrase);
+
+        } catch (StringIndexOutOfBoundsException e) {
+            throw new IllegalArgumentException("Status-Line '" + statusLine + "' is not valid");
+        }
+        return status;
+    }
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/WebdavRequest.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/WebdavRequest.java
new file mode 100644
index 000000000..09aa79f88
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/WebdavRequest.java
@@ -0,0 +1,36 @@
+/*
+ * 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.jackrabbit.webdav;
+
+import org.apache.jackrabbit.webdav.observation.ObservationDavServletRequest;
+import org.apache.jackrabbit.webdav.ordering.OrderingDavServletRequest;
+import org.apache.jackrabbit.webdav.transaction.TransactionDavServletRequest;
+import org.apache.jackrabbit.webdav.version.DeltaVServletRequest;
+import org.apache.jackrabbit.webdav.bind.BindServletRequest;
+
+/**
+ * The empty <code>WebdavRequest</code> interface collects the functionality
+ * defined by {@link org.apache.jackrabbit.webdav.DavServletRequest} encapsulating
+ * the core Webdav specification (RFC 2518) as well as the various extensions
+ * used for observation and transaction support, ordering of collections, search
+ * and versioning.
+ */
+public interface WebdavRequest extends DavServletRequest,
+        ObservationDavServletRequest, OrderingDavServletRequest,
+        TransactionDavServletRequest, DeltaVServletRequest,
+        BindServletRequest {
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/WebdavRequestContext.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/WebdavRequestContext.java
new file mode 100644
index 000000000..c1de4183c
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/WebdavRequestContext.java
@@ -0,0 +1,30 @@
+/*
+ * 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.jackrabbit.webdav;
+
+/**
+ * Interface providing the minimum WebDAV request information associated with the current thread of execution.
+ */
+public interface WebdavRequestContext {
+
+    /**
+     * Return the current {@link WebdavRequest} instance associated with the current thread of execution.
+     * @return the current {@link WebdavRequest} instance associated with the current thread of execution
+     */
+    public WebdavRequest getRequest();
+
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/WebdavRequestImpl.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/WebdavRequestImpl.java
new file mode 100644
index 000000000..493531394
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/WebdavRequestImpl.java
@@ -0,0 +1,1324 @@
+/*
+ * 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.jackrabbit.webdav;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.InflaterInputStream;
+
+import jakarta.servlet.AsyncContext;
+import jakarta.servlet.DispatcherType;
+import jakarta.servlet.ReadListener;
+import jakarta.servlet.RequestDispatcher;
+import jakarta.servlet.ServletConnection;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletInputStream;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.Cookie;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpSession;
+import jakarta.servlet.http.HttpUpgradeHandler;
+import jakarta.servlet.http.Part;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.apache.jackrabbit.webdav.bind.BindInfo;
+import org.apache.jackrabbit.webdav.bind.RebindInfo;
+import org.apache.jackrabbit.webdav.bind.UnbindInfo;
+import org.apache.jackrabbit.webdav.header.CodedUrlHeader;
+import org.apache.jackrabbit.webdav.header.DepthHeader;
+import org.apache.jackrabbit.webdav.header.IfHeader;
+import org.apache.jackrabbit.webdav.header.LabelHeader;
+import org.apache.jackrabbit.webdav.header.OverwriteHeader;
+import org.apache.jackrabbit.webdav.header.PollTimeoutHeader;
+import org.apache.jackrabbit.webdav.header.TimeoutHeader;
+import org.apache.jackrabbit.webdav.lock.ActiveLock;
+import org.apache.jackrabbit.webdav.lock.LockInfo;
+import org.apache.jackrabbit.webdav.lock.Scope;
+import org.apache.jackrabbit.webdav.lock.Type;
+import org.apache.jackrabbit.webdav.observation.ObservationConstants;
+import org.apache.jackrabbit.webdav.observation.SubscriptionInfo;
+import org.apache.jackrabbit.webdav.ordering.OrderPatch;
+import org.apache.jackrabbit.webdav.ordering.OrderingConstants;
+import org.apache.jackrabbit.webdav.ordering.Position;
+import org.apache.jackrabbit.webdav.property.DavProperty;
+import org.apache.jackrabbit.webdav.property.DavPropertyName;
+import org.apache.jackrabbit.webdav.property.DavPropertyNameSet;
+import org.apache.jackrabbit.webdav.property.DavPropertySet;
+import org.apache.jackrabbit.webdav.property.DefaultDavProperty;
+import org.apache.jackrabbit.webdav.property.PropEntry;
+import org.apache.jackrabbit.webdav.server.AbstractWebdavServlet;
+import org.apache.jackrabbit.webdav.transaction.TransactionConstants;
+import org.apache.jackrabbit.webdav.transaction.TransactionInfo;
+import org.apache.jackrabbit.webdav.version.LabelInfo;
+import org.apache.jackrabbit.webdav.version.MergeInfo;
+import org.apache.jackrabbit.webdav.version.OptionsInfo;
+import org.apache.jackrabbit.webdav.version.UpdateInfo;
+import org.apache.jackrabbit.webdav.version.report.ReportInfo;
+import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.apache.jackrabbit.webdav.xml.ElementIterator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
+
+/**
+ * <code>WebdavRequestImpl</code>...
+ */
+public class WebdavRequestImpl implements WebdavRequest, DavConstants, ContentCodingAwareRequest {
+
+    private static Logger log = LoggerFactory.getLogger(WebdavRequestImpl.class);
+
+    private final HttpServletRequest httpRequest;
+    private final DavLocatorFactory factory;
+    private final IfHeader ifHeader;
+    private final String hrefPrefix;
+
+    private DavSession session;
+
+    private int propfindType = PROPFIND_ALL_PROP;
+    private DavPropertyNameSet propfindProps;
+    private DavPropertySet proppatchSet;
+    private List<PropEntry> proppatchList;
+
+    /**
+     * Creates a new <code>DavServletRequest</code> with the given parameters.
+     */
+    public WebdavRequestImpl(HttpServletRequest httpRequest, DavLocatorFactory factory) {
+        this(httpRequest, factory, true);
+    }
+
+    /**
+     * Creates a new <code>DavServletRequest</code> with the given parameters.
+     *
+     * @param httpRequest
+     * @param factory
+     * @param createAbsoluteURI defines if we must create a absolute URI. if false a absolute path will be created
+     */
+    public WebdavRequestImpl(HttpServletRequest httpRequest, DavLocatorFactory factory, boolean createAbsoluteURI) {
+        this.httpRequest = httpRequest;
+        this.factory = factory;
+        this.ifHeader = new IfHeader(httpRequest);
+
+        String host = getHeader("Host");
+        String scheme = getScheme();
+        String uriPrefix = scheme + "://" + host + getContextPath();
+        this.hrefPrefix = createAbsoluteURI ? uriPrefix : getContextPath();
+    }
+
+    /**
+     * Sets the session field and adds all lock tokens present with either the
+     * Lock-Token header or the If header to the given session object.
+     *
+     * @param session
+     * @see DavServletRequest#setDavSession(DavSession)
+     */
+    public void setDavSession(DavSession session) {
+        this.session = session;
+        // set lock-tokens from header to the current session
+        if (session != null) {
+            String lt = getLockToken();
+            if (lt != null) {
+                session.addLockToken(lt);
+            }
+            // add all token present in the the If header to the session as well.
+            Iterator<String> it = ifHeader.getAllTokens();
+            while (it.hasNext()) {
+                String ifHeaderToken = it.next();
+                session.addLockToken(ifHeaderToken);
+            }
+        }
+    }
+
+    /**
+     * @see DavServletRequest#getDavSession()
+     */
+    public DavSession getDavSession() {
+        return session;
+    }
+
+    /**
+     * Return a <code>DavResourceLocator</code> representing the request handle.
+     *
+     * @return locator of the requested resource
+     * @see DavServletRequest#getRequestLocator()
+     */
+    public DavResourceLocator getRequestLocator() {
+        String path = getRequestURI();
+        String ctx = getContextPath();
+        if (path.startsWith(ctx)) {
+            path = path.substring(ctx.length());
+        }
+        return factory.createResourceLocator(hrefPrefix, path);
+    }
+
+    /**
+     * Parse the destination header field and return the path of the destination
+     * resource.
+     *
+     * @return path of the destination resource.
+     * @throws DavException
+     * @see #HEADER_DESTINATION
+     * @see DavServletRequest#getDestinationLocator
+     */
+    public DavResourceLocator getDestinationLocator() throws DavException {
+        return getHrefLocator(httpRequest.getHeader(HEADER_DESTINATION), true);
+    }
+
+    private DavResourceLocator getHrefLocator(String href, boolean forDestination) throws DavException {
+        String ref = href;
+        if (ref != null) {
+            //href should be a Simple-ref production as defined in RFC4918, so it is either an absolute URI
+            //or an absolute path
+            try {
+                URI uri = new URI(ref).normalize(); // normalize path (see JCR-3174)
+                String auth = uri.getAuthority();
+                ref = uri.getRawPath();
+                if (auth == null) {
+                    //verify that href is an absolute path
+                    if (ref.startsWith("//") || !ref.startsWith("/")) {
+                        log.warn("expected absolute path but found " + ref);
+                        throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+                    }
+                } else if (!auth.equals(httpRequest.getHeader("Host"))) {
+                    //this looks like an unsupported cross-server operation, but of course a reverse-proxy
+                    //might have rewritten the Host header. Since we can't find out, we have to reject anyway.
+                    //Better use absolute paths in DAV:href elements!
+                    throw new DavException(DavServletResponse.SC_FORBIDDEN);
+                }
+            } catch (URISyntaxException e) {
+                log.warn("malformed uri: " + href, e);
+                throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+            }
+            // cut off the context path
+            String contextPath = httpRequest.getContextPath();
+            if (ref.startsWith(contextPath)) {
+                ref = ref.substring(contextPath.length());
+            } else {
+                //absolute path has to start with context path
+                throw new DavException(DavServletResponse.SC_FORBIDDEN);
+            }
+        }
+        if (factory instanceof AbstractLocatorFactory) {
+            return ((AbstractLocatorFactory)factory).createResourceLocator(hrefPrefix, ref, forDestination);
+        }
+        else {
+            return factory.createResourceLocator(hrefPrefix, ref);
+        }
+    }
+
+    /**
+     * Parse a href and return the path of the resource.
+     *
+     * @return path of the resource identified by the href.
+     * @see org.apache.jackrabbit.webdav.bind.BindServletRequest#getHrefLocator
+     */
+    public DavResourceLocator getHrefLocator(String href) throws DavException {
+        return getHrefLocator(href, false);
+    }
+
+    /**
+     * Returns the path of the member resource of the request resource which is identified by the segment parameter.
+     *
+     * @return path of internal member resource.
+     */
+    public DavResourceLocator getMemberLocator(String segment) {
+        String path = (this.getRequestLocator().getHref(true) + segment).substring(hrefPrefix.length());
+        return factory.createResourceLocator(hrefPrefix, path);
+    }
+
+    /**
+     * Return true if the overwrite header does not inhibit overwriting.
+     *
+     * @return true if the overwrite header requests 'overwriting'
+     * @see #HEADER_OVERWRITE
+     * @see DavServletRequest#isOverwrite()
+     */
+    public boolean isOverwrite() {
+        return new OverwriteHeader(httpRequest).isOverwrite();
+    }
+
+    /**
+     * @see DavServletRequest#getDepth(int)
+     */
+    public int getDepth(int defaultValue) {
+        return DepthHeader.parse(httpRequest, defaultValue).getDepth();
+    }
+
+    /**
+     * @see DavServletRequest#getDepth()
+     */
+    public int getDepth() {
+        return getDepth(DEPTH_INFINITY);
+    }
+
+    /**
+     * Parse the Timeout header and return a long representing the value.
+     * {@link #UNDEFINED_TIMEOUT} is used as default value if no header
+     * is available or if the parsing fails.
+     *
+     * @return milliseconds indicating length of the timeout.
+     * @see DavServletRequest#getTimeout()
+     * @see TimeoutHeader#parse(jakarta.servlet.http.HttpServletRequest, long)
+     */
+    public long getTimeout() {
+        return TimeoutHeader.parse(httpRequest, UNDEFINED_TIMEOUT).getTimeout();
+    }
+
+    /**
+     * Retrieve the lock token from the 'Lock-Token' header.
+     *
+     * @return String representing the lock token sent in the Lock-Token header.
+     * @throws IllegalArgumentException If the value has not the correct format.
+     * @see #HEADER_LOCK_TOKEN
+     * @see DavServletRequest#getLockToken()
+     */
+    public String getLockToken() {
+        return CodedUrlHeader.parse(httpRequest, HEADER_LOCK_TOKEN).getCodedUrl();
+    }
+
+    /**
+     * @see DavServletRequest#getRequestDocument()
+     */
+    public Document getRequestDocument() throws DavException {
+        Document requestDocument = null;
+        /*
+        Don't attempt to parse the body if the content length header is 0.
+        NOTE: a value of -1 indicates that the length is unknown, thus we have
+        to parse the body. Note that http1.1 request using chunked transfer
+        coding will therefore not be detected here.
+        */
+        if (httpRequest.getContentLength() == 0) {
+            return requestDocument;
+        }
+        // try to parse the request body
+        try {
+            InputStream in = getDecodedInputStream();
+            if (in != null) {
+                // use a buffered input stream to find out whether there actually
+                // is a request body
+                InputStream bin = new BufferedInputStream(in);
+                bin.mark(1);
+                boolean isEmpty = -1 == bin.read();
+                bin.reset();
+                if (!isEmpty) {
+                    requestDocument = DomUtil.parseDocument(bin);
+                }
+            }
+        } catch (IOException e) {
+            if (log.isDebugEnabled()) {
+                log.debug("Unable to build an XML Document from the request body: " + e.getMessage());
+            }
+            Throwable cause = e.getCause();
+            throw (cause instanceof DavException) ? (DavException) cause : new DavException(DavServletResponse.SC_BAD_REQUEST);
+        } catch (ParserConfigurationException e) {
+            if (log.isDebugEnabled()) {
+                log.debug("Unable to build an XML Document from the request body: " + e.getMessage());
+            }
+            throw new DavException(DavServletResponse.SC_INTERNAL_SERVER_ERROR);
+        } catch (SAXException e) {
+            if (log.isDebugEnabled()) {
+                log.debug("Unable to build an XML Document from the request body: " + e.getMessage());
+            }
+            throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+        }
+        return requestDocument;
+    }
+
+    /**
+     * Returns the type of PROPFIND as indicated by the request body.
+     *
+     * @return type of the PROPFIND request. Default value is {@link #PROPFIND_ALL_PROP allprops}
+     * @see DavServletRequest#getPropFindType()
+     */
+    public int getPropFindType() throws DavException {
+        if (propfindProps == null) {
+            parsePropFindRequest();
+        }
+        return propfindType;
+    }
+
+    /**
+     * Returns the set of properties requested by the PROPFIND body or an
+     * empty set if the {@link #getPropFindType type} is either 'allprop' or
+     * 'propname'.
+     *
+     * @return set of properties requested by the PROPFIND body or an empty set.
+     * @see DavServletRequest#getPropFindProperties()
+     */
+    public DavPropertyNameSet getPropFindProperties() throws DavException {
+        if (propfindProps == null) {
+            parsePropFindRequest();
+        }
+        return propfindProps;
+    }
+
+    private InputStream getDecodedInputStream() throws IOException {
+        List<String> contentCodings = getRequestContentCodings();
+        int len = contentCodings.size();
+
+        log.trace("content codings: " + contentCodings);
+        InputStream result = httpRequest.getInputStream();
+
+        for (int i = 1; i <= len; i++) {
+            String s = contentCodings.get(len - i);
+            log.trace("decoding: " + s);
+            if ("gzip".equals(s)) {
+                result = new GZIPInputStream(result);
+            } else if ("deflate".equals(s)) {
+                result = new InflaterInputStream(result);
+            } else {
+                String message = "Unsupported content coding: " + s;
+                try {
+                    Element condition = DomUtil.createElement(DomUtil.createDocument(), PRECONDITION_SUPPORTED);
+                    throw new IOException(
+                            new DavException(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message, null, condition));
+                } catch (ParserConfigurationException ex) {
+                    throw new IOException(message);
+                }
+            }
+        }
+
+        return result;
+    }
+
+    private List<String> requestContentCodings = null;
+
+    @Override
+    public List<String> getRequestContentCodings() {
+        if (requestContentCodings == null) {
+            requestContentCodings = AbstractWebdavServlet.getContentCodings(httpRequest);
+        }
+
+        return requestContentCodings;
+    }
+
+    @Override
+    public String getAcceptableCodings() {
+        return "deflate, gzip";
+    }
+
+    /**
+     * Parse the propfind request body in order to determine the type of the propfind
+     * and the set of requested property.
+     * NOTE: An empty 'propfind' request body will be treated as request for all
+     * property according to the specification.
+     */
+    private void parsePropFindRequest() throws DavException {
+        propfindProps = new DavPropertyNameSet();
+        Document requestDocument = getRequestDocument();
+        // propfind httpRequest with empty body >> retrieve all property
+        if (requestDocument == null) {
+            return;
+        }
+
+        // propfind httpRequest with invalid body
+        Element root = requestDocument.getDocumentElement();
+        if (!XML_PROPFIND.equals(root.getLocalName())) {
+            log.info("PropFind-Request has no <propfind> tag.");
+            throw new DavException(DavServletResponse.SC_BAD_REQUEST, "PropFind-Request has no <propfind> tag.");
+        }
+
+        DavPropertyNameSet include = null;
+
+        ElementIterator it = DomUtil.getChildren(root);
+        int propfindTypeFound = 0;
+
+        while (it.hasNext()) {
+            Element child = it.nextElement();
+            String nodeName = child.getLocalName();
+            if (NAMESPACE.getURI().equals(child.getNamespaceURI())) {
+                if (XML_PROP.equals(nodeName)) {
+                    propfindType = PROPFIND_BY_PROPERTY;
+                    propfindProps = new DavPropertyNameSet(child);
+                    propfindTypeFound += 1;
+                }
+                else if (XML_PROPNAME.equals(nodeName)) {
+                    propfindType = PROPFIND_PROPERTY_NAMES;
+                    propfindTypeFound += 1;
+                }
+                else if (XML_ALLPROP.equals(nodeName)) {
+                    propfindType = PROPFIND_ALL_PROP;
+                    propfindTypeFound += 1;
+                }
+                else if (XML_INCLUDE.equals(nodeName)) {
+                    include = new DavPropertyNameSet();
+                    ElementIterator pit = DomUtil.getChildren(child);
+                    while (pit.hasNext()) {
+                        include.add(DavPropertyName.createFromXml(pit.nextElement()));
+                    }
+                }
+            }
+        }
+
+        if (propfindTypeFound > 1) {
+            log.info("Multiple top-level propfind instructions");
+            throw new DavException(DavServletResponse.SC_BAD_REQUEST, "Multiple top-level propfind instructions");
+        }
+
+        if (include != null) {
+            if (propfindType == PROPFIND_ALL_PROP) {
+                // special case: allprop with include extension
+                propfindType = PROPFIND_ALL_PROP_INCLUDE;
+                propfindProps = include;
+            }
+            else {
+                throw new DavException(DavServletResponse.SC_BAD_REQUEST, "<include> goes only with <allprop>");
+
+            }
+        }
+    }
+
+     /**
+      * Return a {@link List} of property change operations. Each entry
+      * is either of type {@link DavPropertyName}, indicating a &lt;remove&gt;
+      * operation, or of type {@link DavProperty}, indicating a &lt;set&gt;
+      * operation. Note that ordering is significant here.
+      *
+      * @return the list of change operations entries in the PROPPATCH request body
+      * @see DavServletRequest#getPropPatchChangeList()
+      */
+     public List<? extends PropEntry> getPropPatchChangeList() throws DavException {
+         if (proppatchList == null) {
+             parsePropPatchRequest();
+         }
+         return proppatchList;
+     }
+
+    /**
+     * Parse the PROPPATCH request body.
+     */
+    private void parsePropPatchRequest() throws DavException {
+
+        proppatchSet = new DavPropertySet();
+        proppatchList = new ArrayList<PropEntry>();
+
+        Document requestDocument = getRequestDocument();
+
+        if (requestDocument == null) {
+            throw new DavException(DavServletResponse.SC_BAD_REQUEST, "Invalid request body.");
+        }
+
+        Element root = requestDocument.getDocumentElement();
+        if (!DomUtil.matches(root, XML_PROPERTYUPDATE, NAMESPACE)) {
+            log.warn("PropPatch-Request has no <DAV:propertyupdate> tag.");
+            throw new DavException(DavServletResponse.SC_BAD_REQUEST, "PropPatch-Request has no <propertyupdate> tag.");
+        }
+
+        ElementIterator it = DomUtil.getChildren(root);
+        while (it.hasNext()) {
+            Element el = it.nextElement();
+            if (DomUtil.matches(el, XML_SET, NAMESPACE)) {
+                Element propEl = DomUtil.getChildElement(el, XML_PROP, NAMESPACE);
+                if (propEl != null) {
+                    ElementIterator properties = DomUtil.getChildren(propEl);
+                    while (properties.hasNext()) {
+                        DavProperty<?> davProp = DefaultDavProperty.createFromXml(properties.nextElement());
+                        proppatchSet.add(davProp);
+                        proppatchList.add(davProp);
+                    }
+                }
+            } else if (DomUtil.matches(el, XML_REMOVE, NAMESPACE)) {
+                Element propEl = DomUtil.getChildElement(el, XML_PROP, NAMESPACE);
+                if (propEl != null) {
+                    ElementIterator properties = DomUtil.getChildren(propEl);
+                    while (properties.hasNext()) {
+                        DavProperty<?> davProp = DefaultDavProperty.createFromXml(properties.nextElement());
+                        proppatchSet.add(davProp);
+                        proppatchList.add(davProp.getName());
+                    }
+                }
+            } else {
+                log.debug("Unknown element in DAV:propertyupdate: " + el.getNodeName());
+                // unknown child elements are ignored
+            }
+        }
+    }
+
+    /**
+     * {@link LockInfo} object encapsulating the information passed with a LOCK
+     * request if the LOCK request body was valid. If the request body is
+     * missing a 'refresh lock' request is assumed. The {@link LockInfo}
+     * then only provides timeout and isDeep property and returns true on
+     * {@link org.apache.jackrabbit.webdav.lock.LockInfo#isRefreshLock()}
+     *
+     * @return lock info object or <code>null</code> if an error occurred while
+     *         parsing the request body.
+     * @throws DavException throws a 400 (Bad Request) DavException if a request
+     * body is present but does not start with a DAV:lockinfo element. Note however,
+     * that a non-existing request body is a valid request used to refresh
+     * an existing lock.
+     * @see DavServletRequest#getLockInfo()
+     */
+    public LockInfo getLockInfo() throws DavException {
+        LockInfo lockInfo;
+        boolean isDeep = (getDepth(DEPTH_INFINITY) == DEPTH_INFINITY);
+        Document requestDocument = getRequestDocument();
+        // check if XML request body is present. It SHOULD have one for
+        // 'create Lock' request and missing for a 'refresh Lock' request
+        if (requestDocument != null) {
+            Element root = requestDocument.getDocumentElement();
+            if (root.getLocalName().equals(XML_LOCKINFO)) {
+                lockInfo = new LockInfo(root, getTimeout(), isDeep);
+            } else {
+                log.debug("Lock request body must start with a DAV:lockinfo element.");
+                throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+            }
+        } else {
+            lockInfo = new LockInfo(null, getTimeout(), isDeep);
+        }
+        return lockInfo;
+    }
+
+    /**
+     * Test if the if header matches the given resource. The comparison is
+     * made with the {@link DavResource#getHref()
+     * resource href} and the token returned from an exclusive write lock present on
+     * the resource.<br>
+     * NOTE: If either the If header or the resource is <code>null</code> or if
+     * the resource has not applied an exclusive write lock the preconditions are met.
+     * If in contrast the lock applied to the given resource returns a
+     * <code>null</code> lock token (e.g. for security reasons) or a lock token
+     * that does not match, the method will return false.
+     *
+     * @param resource Webdav resources being operated on
+     * @return true if the test is successful and the preconditions for the
+     *         request processing are fulfilled.
+     * @see DavServletRequest#matchesIfHeader(DavResource)
+     * @see IfHeader#matches(String, String, String)
+     * @see DavResource#hasLock(org.apache.jackrabbit.webdav.lock.Type, org.apache.jackrabbit.webdav.lock.Scope)
+     * @see org.apache.jackrabbit.webdav.lock.ActiveLock#getToken()
+     */
+    public boolean matchesIfHeader(DavResource resource) {
+        // no ifheader
+        // >> preconditions ok so far
+        if (!ifHeader.hasValue() || resource == null) {
+            return true;
+        }
+
+        ActiveLock[] locks = resource.getLocks();
+        if (!resource.exists() || locks.length == 0) {
+            return matchesIfHeader(resource.getHref(), null, getStrongETag(resource));
+        }
+        for (ActiveLock lock : locks) {
+            if (matchesIfHeader(resource.getHref(), lock.getToken(), getStrongETag(resource))) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * @see DavServletRequest#matchesIfHeader(String, String, String)
+     * @see IfHeader#matches(String, String, String)
+     */
+    public boolean matchesIfHeader(String href, String token, String eTag) {
+        return ifHeader.matches(href, token, isStrongETag(eTag) ?  eTag : "");
+    }
+
+    /**
+     * Returns the strong etag present on the given resource or empty string
+     * if either the resource does not provide any etag or if the etag is weak.
+     *
+     * @param resource
+     * @return strong etag or empty string.
+     */
+    private String getStrongETag(DavResource resource) {
+        if (resource.exists()) {
+            DavProperty<?> prop = resource.getProperty(DavPropertyName.GETETAG);
+            if (prop != null && prop.getValue() != null) {
+                String etag = prop.getValue().toString();
+                if (isStrongETag(etag)) {
+                    return etag;
+                }
+            }
+        }
+        // no strong etag available
+        return "";
+    }
+
+    /**
+     * Returns true if the given string represents a strong etag.
+     *
+     * @param eTag
+     * @return true, if its a strong etag
+     */
+    private static boolean isStrongETag(String eTag) {
+        return eTag != null && eTag.length() > 0 && !eTag.startsWith("W\\");
+    }
+
+    //-----------------------------< TransactionDavServletRequest Interface >---
+    /**
+     * @see org.apache.jackrabbit.webdav.transaction.TransactionDavServletRequest#getTransactionId()
+     */
+    public String getTransactionId() {
+        return CodedUrlHeader.parse(httpRequest, TransactionConstants.HEADER_TRANSACTIONID).getCodedUrl();
+    }
+
+    /**
+     * @see org.apache.jackrabbit.webdav.transaction.TransactionDavServletRequest#getTransactionInfo()
+     */
+    public TransactionInfo getTransactionInfo() throws DavException {
+        Document requestDocument = getRequestDocument();
+        if (requestDocument != null) {
+            return new TransactionInfo(requestDocument.getDocumentElement());
+        }
+        return null;
+    }
+
+    //-----------------------------< ObservationDavServletRequest Interface >---
+    /**
+     * @see org.apache.jackrabbit.webdav.observation.ObservationDavServletRequest#getSubscriptionId()
+     */
+    public String getSubscriptionId() {
+        return CodedUrlHeader.parse(httpRequest, ObservationConstants.HEADER_SUBSCRIPTIONID).getCodedUrl();
+    }
+
+    /**
+     * @see org.apache.jackrabbit.webdav.observation.ObservationDavServletRequest#getPollTimeout()
+     */
+    public long getPollTimeout() {
+        return PollTimeoutHeader.parseHeader(httpRequest, 0).getTimeout();
+    }
+
+    /**
+     * @see org.apache.jackrabbit.webdav.observation.ObservationDavServletRequest#getSubscriptionInfo()
+     */
+    public SubscriptionInfo getSubscriptionInfo() throws DavException {
+        Document requestDocument = getRequestDocument();
+        if (requestDocument != null) {
+            Element root = requestDocument.getDocumentElement();
+            if (ObservationConstants.XML_SUBSCRIPTIONINFO.equals(root.getLocalName())) {
+                int depth = getDepth(DEPTH_0);
+                return new SubscriptionInfo(root, getTimeout(), depth == DEPTH_INFINITY);
+            }
+        }
+        return null;
+    }
+
+    //--------------------------------< OrderingDavServletRequest Interface >---
+    /**
+     * @see org.apache.jackrabbit.webdav.ordering.OrderingDavServletRequest#getOrderingType()
+     */
+    public String getOrderingType() {
+        return getHeader(OrderingConstants.HEADER_ORDERING_TYPE);
+    }
+
+    /**
+     * @see org.apache.jackrabbit.webdav.ordering.OrderingDavServletRequest#getPosition()
+     */
+    public Position getPosition() {
+        String h = getHeader(OrderingConstants.HEADER_POSITION);
+        Position pos = null;
+        if (h != null) {
+            String[] typeNSegment = h.split("\\s");
+            if (typeNSegment.length == 2) {
+                try {
+                    pos = new Position(typeNSegment[0], typeNSegment[1]);
+                } catch (IllegalArgumentException e) {
+                    log.error("Cannot parse Position header: " + e.getMessage());
+                }
+            }
+        }
+        return pos;
+    }
+
+    /**
+     * @return <code>OrderPatch</code> object representing the orderpatch request
+     *         body or <code>null</code> if the
+     * @see org.apache.jackrabbit.webdav.ordering.OrderingDavServletRequest#getOrderPatch()
+     */
+    public OrderPatch getOrderPatch() throws DavException {
+        OrderPatch op = null;
+        Document requestDocument = getRequestDocument();
+        if (requestDocument != null) {
+            Element root = requestDocument.getDocumentElement();
+            op = OrderPatch.createFromXml(root);
+        } else {
+            log.error("Error while building xml document from ORDERPATH request body.");
+        }
+        return op;
+    }
+
+    //-------------------------------------< DeltaVServletRequest interface >---
+    /**
+     * @see org.apache.jackrabbit.webdav.version.DeltaVServletRequest#getLabel()
+     */
+    public String getLabel() {
+        LabelHeader label = LabelHeader.parse(this);
+        if (label != null) {
+            return label.getLabel();
+        }
+        return null;
+    }
+
+    /**
+     * @see org.apache.jackrabbit.webdav.version.DeltaVServletRequest#getLabelInfo()
+     */
+    public LabelInfo getLabelInfo() throws DavException {
+        LabelInfo lInfo = null;
+        Document requestDocument = getRequestDocument();
+        if (requestDocument != null) {
+            Element root = requestDocument.getDocumentElement();
+            int depth = getDepth(DEPTH_0);
+            lInfo = new LabelInfo(root, depth);
+        }
+        return lInfo;
+    }
+
+    /**
+     * @see org.apache.jackrabbit.webdav.version.DeltaVServletRequest#getMergeInfo()
+     */
+    public MergeInfo getMergeInfo()  throws DavException {
+        MergeInfo mInfo = null;
+        Document requestDocument = getRequestDocument();
+        if (requestDocument != null) {
+            mInfo = new MergeInfo(requestDocument.getDocumentElement());
+        }
+        return mInfo;
+    }
+
+    /**
+     * @see org.apache.jackrabbit.webdav.version.DeltaVServletRequest#getUpdateInfo()
+     */
+    public UpdateInfo getUpdateInfo() throws DavException  {
+        UpdateInfo uInfo = null;
+        Document requestDocument = getRequestDocument();
+        if (requestDocument != null) {
+            uInfo = new UpdateInfo(requestDocument.getDocumentElement());
+        }
+        return uInfo;
+    }
+
+    /**
+     * @see org.apache.jackrabbit.webdav.version.DeltaVServletRequest#getReportInfo()
+     */
+    public ReportInfo getReportInfo() throws DavException  {
+        ReportInfo rInfo = null;
+        Document requestDocument = getRequestDocument();
+        if (requestDocument != null) {
+            rInfo = new ReportInfo(requestDocument.getDocumentElement(), getDepth(DEPTH_0));
+        }
+        return rInfo;
+    }
+
+    /**
+     * @see org.apache.jackrabbit.webdav.version.DeltaVServletRequest#getOptionsInfo()
+     */
+    public OptionsInfo getOptionsInfo() throws DavException {
+        OptionsInfo info = null;
+        Document requestDocument = getRequestDocument();
+        if (requestDocument != null) {
+            info = OptionsInfo.createFromXml(requestDocument.getDocumentElement());
+        }
+        return info;
+    }
+
+    /**
+     * @see org.apache.jackrabbit.webdav.bind.BindServletRequest#getRebindInfo()
+     */
+    public RebindInfo getRebindInfo() throws DavException {
+        RebindInfo info = null;
+        Document requestDocument = getRequestDocument();
+        if (requestDocument != null) {
+            info = RebindInfo.createFromXml(requestDocument.getDocumentElement());
+        }
+        return info;
+    }
+
+    /**
+     * @see org.apache.jackrabbit.webdav.bind.BindServletRequest#getUnbindInfo()
+     */
+    public UnbindInfo getUnbindInfo() throws DavException {
+        UnbindInfo info = null;
+        Document requestDocument = getRequestDocument();
+        if (requestDocument != null) {
+            info = UnbindInfo.createFromXml(requestDocument.getDocumentElement());
+        }
+        return info;
+    }
+
+    /**
+     * @see org.apache.jackrabbit.webdav.bind.BindServletRequest#getBindInfo()
+     */
+    public BindInfo getBindInfo() throws DavException {
+        BindInfo info = null;
+        Document requestDocument = getRequestDocument();
+        if (requestDocument != null) {
+            info = BindInfo.createFromXml(requestDocument.getDocumentElement());
+        }
+        return info;
+    }
+
+    //---------------------------------------< HttpServletRequest interface >---
+
+    @Override
+    public String getAuthType() {
+        return httpRequest.getAuthType();
+    }
+
+    @Override
+    public Cookie[] getCookies() {
+        return httpRequest.getCookies();
+    }
+
+    @Override
+    public long getDateHeader(String s) {
+        return httpRequest.getDateHeader(s);
+    }
+
+    @Override
+    public String getHeader(String s) {
+        return httpRequest.getHeader(s);
+    }
+
+    @Override
+    public Enumeration<String> getHeaders(String s) {
+        return httpRequest.getHeaders(s);
+    }
+
+    @Override
+    public Enumeration<String> getHeaderNames() {
+        return httpRequest.getHeaderNames();
+    }
+
+    @Override
+    public int getIntHeader(String s) {
+        return httpRequest.getIntHeader(s);
+    }
+
+    @Override
+    public String getMethod() {
+        return httpRequest.getMethod();
+    }
+
+    @Override
+    public String getPathInfo() {
+        return httpRequest.getPathInfo();
+    }
+
+    @Override
+    public String getPathTranslated() {
+        return httpRequest.getPathTranslated();
+    }
+
+    @Override
+    public String getContextPath() {
+        return httpRequest.getContextPath();
+    }
+
+    @Override
+    public String getQueryString() {
+        return httpRequest.getQueryString();
+    }
+
+    @Override
+    public String getRemoteUser() {
+        return httpRequest.getRemoteUser();
+    }
+
+    @Override
+    public boolean isUserInRole(String s) {
+        return httpRequest.isUserInRole(s);
+    }
+
+    @Override
+    public Principal getUserPrincipal() {
+        return httpRequest.getUserPrincipal();
+    }
+
+    @Override
+    public String getRequestedSessionId() {
+        return httpRequest.getRequestedSessionId();
+    }
+
+    @Override
+    public String getRequestURI() {
+        return httpRequest.getRequestURI();
+    }
+
+    @Override
+    public StringBuffer getRequestURL() {
+        return httpRequest.getRequestURL();
+    }
+
+    @Override
+    public String getServletPath() {
+        return httpRequest.getServletPath();
+    }
+
+    @Override
+    public HttpSession getSession(boolean b) {
+        return httpRequest.getSession(b);
+    }
+
+    @Override
+    public HttpSession getSession() {
+        return httpRequest.getSession();
+    }
+
+    @Override
+    public boolean isRequestedSessionIdValid() {
+        return httpRequest.isRequestedSessionIdValid();
+    }
+
+    @Override
+    public boolean isRequestedSessionIdFromCookie() {
+        return httpRequest.isRequestedSessionIdFromCookie();
+    }
+
+    @Override
+    public boolean isRequestedSessionIdFromURL() {
+        return httpRequest.isRequestedSessionIdFromURL();
+    }
+
+    @Override
+    public Object getAttribute(String s) {
+        return httpRequest.getAttribute(s);
+    }
+
+    @Override
+    public Enumeration<String> getAttributeNames() {
+        return httpRequest.getAttributeNames();
+    }
+
+    @Override
+    public String getCharacterEncoding() {
+        return httpRequest.getCharacterEncoding();
+    }
+
+    @Override
+    public void setCharacterEncoding(String s) throws UnsupportedEncodingException {
+        httpRequest.setCharacterEncoding(s);
+    }
+
+    @Override
+    public int getContentLength() {
+        return httpRequest.getContentLength();
+    }
+
+    @Override
+    public String getContentType() {
+        return httpRequest.getContentType();
+    }
+
+    @Override
+    public ServletInputStream getInputStream() throws IOException {
+        return new MyServletInputStream(getDecodedInputStream());
+    }
+
+    @Override
+    public String getParameter(String s) {
+        return httpRequest.getParameter(s);
+    }
+
+    @Override
+    public Enumeration<String> getParameterNames() {
+        return httpRequest.getParameterNames();
+    }
+
+    @Override
+    public String[] getParameterValues(String s) {
+        return httpRequest.getParameterValues(s);
+    }
+
+    @Override
+    public Map<String, String[]> getParameterMap() {
+        return httpRequest.getParameterMap();
+    }
+
+    @Override
+    public String getProtocol() {
+        return httpRequest.getProtocol();
+    }
+
+    @Override
+    public String getScheme() {
+        return httpRequest.getScheme();
+    }
+
+    @Override
+    public String getServerName() {
+        return httpRequest.getServerName();
+    }
+
+    @Override
+    public int getServerPort() {
+        return httpRequest.getServerPort();
+    }
+
+    @Override
+    public BufferedReader getReader() throws IOException {
+        return httpRequest.getReader();
+    }
+
+    @Override
+    public String getRemoteAddr() {
+        return httpRequest.getRemoteAddr();
+    }
+
+    @Override
+    public String getRemoteHost() {
+        return httpRequest.getRemoteHost();
+    }
+
+    @Override
+    public void setAttribute(String s, Object o) {
+        httpRequest.setAttribute(s, o);
+    }
+
+    @Override
+    public void removeAttribute(String s) {
+        httpRequest.removeAttribute(s);
+    }
+
+    @Override
+    public Locale getLocale() {
+        return httpRequest.getLocale();
+    }
+
+    @Override
+    public Enumeration<Locale> getLocales() {
+        return httpRequest.getLocales();
+    }
+
+    @Override
+    public boolean isSecure() {
+        return httpRequest.isSecure();
+    }
+
+    @Override
+    public RequestDispatcher getRequestDispatcher(String s) {
+        return httpRequest.getRequestDispatcher(s);
+    }
+
+    @Override
+    public int getRemotePort() {
+        return httpRequest.getRemotePort();
+    }
+
+    @Override
+    public String getLocalName() {
+        return httpRequest.getLocalName();
+    }
+
+    @Override
+    public String getLocalAddr() {
+        return httpRequest.getLocalAddr();
+    }
+
+    @Override
+    public int getLocalPort() {
+        return httpRequest.getLocalPort();
+    }
+
+    @Override
+    public String changeSessionId() {
+        return httpRequest.changeSessionId();
+    }
+
+    @Override
+    public boolean authenticate(HttpServletResponse response) throws IOException, ServletException {
+        return httpRequest.authenticate(response);
+    }
+
+    @Override
+    public void login(String username, String password) throws ServletException {
+        httpRequest.login(username, password);
+    }
+
+    @Override
+    public void logout() throws ServletException {
+        httpRequest.logout();
+    }
+
+    @Override
+    public Collection<Part> getParts() throws IOException, ServletException {
+        return httpRequest.getParts();
+    }
+
+    @Override
+    public Part getPart(String name) throws IOException, ServletException {
+        return httpRequest.getPart(name);
+    }
+
+    @Override
+    public <T extends HttpUpgradeHandler> T upgrade(Class<T> handlerClass) throws IOException, ServletException {
+        return httpRequest.upgrade(handlerClass);
+    }
+
+    @Override
+    public long getContentLengthLong() {
+        return httpRequest.getContentLengthLong();
+    }
+
+    @Override
+    public ServletContext getServletContext() {
+        return httpRequest.getServletContext();
+    }
+
+    @Override
+    public AsyncContext startAsync() throws IllegalStateException {
+        return httpRequest.startAsync();
+    }
+
+    @Override
+    public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException {
+        return httpRequest.startAsync(servletRequest, servletResponse);
+    }
+
+    @Override
+    public boolean isAsyncStarted() {
+        return httpRequest.isAsyncStarted();
+    }
+
+    @Override
+    public boolean isAsyncSupported() {
+        return httpRequest.isAsyncSupported();
+    }
+
+    @Override
+    public AsyncContext getAsyncContext() {
+        return httpRequest.getAsyncContext();
+    }
+
+    @Override
+    public DispatcherType getDispatcherType() {
+        return httpRequest.getDispatcherType();
+    }
+
+	@Override
+    public ServletConnection getServletConnection() {
+		return httpRequest.getServletConnection();
+	}
+
+	@Override
+    public String getProtocolRequestId() {
+		return httpRequest.getProtocolRequestId();
+	}
+
+	@Override
+    public String getRequestId() {
+		return httpRequest.getRequestId();
+	}
+
+	private static class MyServletInputStream extends ServletInputStream {
+
+        private final InputStream delegate;
+
+        public MyServletInputStream(InputStream delegate) {
+            this.delegate = delegate;
+        }
+
+        @Override
+        public int available() throws IOException {
+            return delegate.available();
+        }
+
+        @Override
+        public void close() throws IOException {
+            delegate.close();
+        }
+
+        @Override
+        public boolean equals(Object other) {
+            return delegate.equals(other);
+        }
+
+        @Override
+        public int hashCode() {
+            return delegate.hashCode();
+        }
+
+        @Override
+        public void mark(int readlimit) {
+            delegate.mark(readlimit);
+        }
+
+        @Override
+        public boolean markSupported() {
+            return delegate.markSupported();
+        }
+
+        @Override
+        public int read() throws IOException {
+            return delegate.read();
+        }
+
+        @Override
+        public int read(byte[] b, int off, int len) throws IOException {
+            return delegate.read(b, off, len);
+        }
+
+        @Override
+        public int read(byte[] b) throws IOException {
+            return delegate.read(b);
+        }
+
+        @Override
+        public int readLine(byte[] b, int off, int len) throws IOException {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public void reset() throws IOException {
+            delegate.reset();
+        }
+
+        @Override
+        public long skip(long n) throws IOException {
+            return delegate.skip(n);
+        }
+
+        @Override
+        public String toString() {
+            return delegate.toString();
+        }
+
+        @Override
+        public boolean isFinished() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean isReady() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public void setReadListener(ReadListener readListener) {
+            throw new UnsupportedOperationException();
+        }
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/WebdavResponse.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/WebdavResponse.java
new file mode 100644
index 000000000..2fa1811b6
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/WebdavResponse.java
@@ -0,0 +1,42 @@
+/*
+ * 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.jackrabbit.webdav;
+
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.jackrabbit.webdav.observation.ObservationDavServletResponse;
+
+/**
+ * The empty <code>WebdavResponse</code> interface collects the functionality
+ * defined by {@link org.apache.jackrabbit.webdav.DavServletResponse}
+ * encapsulating for the core WebDAV specification (RFC 2518) as well as the
+ * various extensions used for observation and transaction support, ordering of
+ * collections, search and versioning.
+ */
+public interface WebdavResponse extends DavServletResponse, ObservationDavServletResponse {
+
+    // can be removed when we move to Servlet API 4.0
+    public default void setTrailerFields(Supplier<Map<String, String>> supplier) {
+        // nop
+    }
+
+    // can be removed when we move to Servlet API 4.0
+    public default Supplier<Map<String, String>> getTrailerFields() {
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/WebdavResponseImpl.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/WebdavResponseImpl.java
new file mode 100644
index 000000000..660d951ad
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/WebdavResponseImpl.java
@@ -0,0 +1,392 @@
+/*
+ * 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.jackrabbit.webdav;
+
+import org.apache.jackrabbit.webdav.header.CodedUrlHeader;
+import org.apache.jackrabbit.webdav.header.Header;
+import org.apache.jackrabbit.webdav.lock.ActiveLock;
+import org.apache.jackrabbit.webdav.lock.LockDiscovery;
+import org.apache.jackrabbit.webdav.observation.EventDiscovery;
+import org.apache.jackrabbit.webdav.observation.ObservationConstants;
+import org.apache.jackrabbit.webdav.observation.Subscription;
+import org.apache.jackrabbit.webdav.observation.SubscriptionDiscovery;
+import org.apache.jackrabbit.webdav.property.DavPropertySet;
+import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+import org.xml.sax.SAXException;
+
+import jakarta.servlet.ServletOutputStream;
+import jakarta.servlet.http.Cookie;
+import jakarta.servlet.http.HttpServletResponse;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.function.Supplier;
+import java.util.zip.GZIPOutputStream;
+
+/**
+ * WebdavResponseImpl implements the <code>WebdavResponse</code> interface.
+ */
+public class WebdavResponseImpl implements WebdavResponse {
+
+    private static Logger log = LoggerFactory.getLogger(WebdavResponseImpl.class);
+
+    private HttpServletResponse httpResponse;
+
+    /**
+     * Create a new <code>WebdavResponse</code>
+     *
+     * @param httpResponse
+     */
+    public WebdavResponseImpl(HttpServletResponse httpResponse) {
+        this(httpResponse, false);
+    }
+
+    /**
+     * Create a new <code>WebdavResponse</code>
+     *
+     * @param httpResponse
+     * @param noCache
+     */
+    public WebdavResponseImpl(HttpServletResponse httpResponse, boolean noCache) {
+        this.httpResponse = httpResponse;
+        if (noCache) {
+            /* set cache control headers */
+            addHeader("Pragma", "No-cache");  // http1.0
+            addHeader("Cache-Control", "no-cache"); // http1.1
+        }
+    }
+
+    /**
+     * If the specifid exception provides an error condition an Xml response body
+     * is sent providing more detailed information about the error. Otherwise only
+     * the error code and status phrase is sent back.
+     *
+     * @param exception
+     * @throws IOException
+     * @see DavServletResponse#sendError(org.apache.jackrabbit.webdav.DavException)
+     * @see #sendError(int, String)
+     * @see #sendXmlResponse(XmlSerializable, int)
+     */
+    public void sendError(DavException exception) throws IOException {
+        if (!exception.hasErrorCondition()) {
+            httpResponse.sendError(exception.getErrorCode(), exception.getStatusPhrase());
+        } else {
+            sendXmlResponse(exception, exception.getErrorCode());
+        }
+    }
+
+    @Override
+    public void sendMultiStatus(MultiStatus multistatus) throws IOException {
+        sendXmlResponse(multistatus, SC_MULTI_STATUS);
+    }
+
+    @Override
+    public void sendMultiStatus(MultiStatus multistatus, List<String> acceptableContentCodings) throws IOException {
+        sendXmlResponse(multistatus, SC_MULTI_STATUS, acceptableContentCodings);
+    }
+
+    /**
+     * Send response body for a lock request that was intended to refresh one
+     * or several locks.
+     *
+     * @param locks
+     * @throws java.io.IOException
+     * @see DavServletResponse#sendRefreshLockResponse(org.apache.jackrabbit.webdav.lock.ActiveLock[])
+     */
+    public void sendRefreshLockResponse(ActiveLock[] locks) throws IOException {
+        DavPropertySet propSet = new DavPropertySet();
+        propSet.add(new LockDiscovery(locks));
+        sendXmlResponse(propSet, SC_OK);
+    }
+
+    @Override
+    public void sendXmlResponse(XmlSerializable serializable, int status) throws IOException {
+        sendXmlResponse(serializable, status, Collections.emptyList());
+    }
+
+    @Override
+    public void sendXmlResponse(XmlSerializable serializable, int status, List<String> acceptableContentCodings) throws IOException {
+        httpResponse.setStatus(status);
+
+        if (serializable != null) {
+            try {
+                ByteArrayOutputStream out = new ByteArrayOutputStream();
+                Document doc = DomUtil.createDocument();
+                doc.appendChild(serializable.toXml(doc));
+                DomUtil.transformDocument(doc, out);
+                out.close();
+
+                httpResponse.setContentType("text/xml; charset=UTF-8");
+
+                // use GZIP iff accepted by client and content size >= 256 octets
+                if (out.size() < 256 || !acceptableContentCodings.contains("gzip")) {
+                    httpResponse.setContentLength(out.size());
+                    out.writeTo(httpResponse.getOutputStream());
+                } else {
+                    httpResponse.setHeader("Content-Encoding", "gzip");
+                    try (OutputStream os = new GZIPOutputStream(httpResponse.getOutputStream())) {
+                        out.writeTo(os);
+                    }
+                }
+            } catch (ParserConfigurationException e) {
+                log.error(e.getMessage());
+                throw new IOException(e.getMessage());
+            } catch (TransformerException e) {
+                log.error(e.getMessage());
+                throw new IOException(e.getMessage());
+            } catch (SAXException e) {
+                log.error(e.getMessage());
+                throw new IOException(e.getMessage());
+            }
+        }
+    }
+
+    //----------------------------< ObservationDavServletResponse Interface >---
+    /**
+     *
+     * @param subscription
+     * @throws IOException
+     * @see org.apache.jackrabbit.webdav.observation.ObservationDavServletResponse#sendSubscriptionResponse(org.apache.jackrabbit.webdav.observation.Subscription)
+     */
+    public void sendSubscriptionResponse(Subscription subscription) throws IOException {
+        String id = subscription.getSubscriptionId();
+        if (id != null) {
+            Header h = new CodedUrlHeader(ObservationConstants.HEADER_SUBSCRIPTIONID, id);
+            httpResponse.setHeader(h.getHeaderName(), h.getHeaderValue());
+        }
+        DavPropertySet propSet = new DavPropertySet();
+        propSet.add(new SubscriptionDiscovery(subscription));
+        sendXmlResponse(propSet, SC_OK);
+    }
+
+    /**
+     *
+     * @param eventDiscovery
+     * @throws IOException
+     * @see org.apache.jackrabbit.webdav.observation.ObservationDavServletResponse#sendPollResponse(org.apache.jackrabbit.webdav.observation.EventDiscovery)
+     */
+    public void sendPollResponse(EventDiscovery eventDiscovery) throws IOException {
+        sendXmlResponse(eventDiscovery, SC_OK);
+    }
+
+    //--------------------------------------< HttpServletResponse interface >---
+
+    @Override
+    public void addCookie(Cookie cookie) {
+        httpResponse.addCookie(cookie);
+    }
+
+    @Override
+    public boolean containsHeader(String s) {
+        return httpResponse.containsHeader(s);
+    }
+
+    @Override
+    public String encodeURL(String s) {
+        return httpResponse.encodeRedirectURL(s);
+    }
+
+    @Override
+    public String encodeRedirectURL(String s) {
+        return httpResponse.encodeRedirectURL(s);
+    }
+
+    @Override
+    public void sendError(int i, String s) throws IOException {
+        httpResponse.sendError(i, s);
+    }
+
+    @Override
+    public void sendError(int i) throws IOException {
+        httpResponse.sendError(i);
+    }
+
+    @Override
+    public void sendRedirect(String s) throws IOException {
+        httpResponse.sendRedirect(s);
+    }
+
+    @Override
+    public void setDateHeader(String s, long l) {
+        httpResponse.setDateHeader(s, l);
+    }
+
+    @Override
+    public void addDateHeader(String s, long l) {
+        httpResponse.addDateHeader(s, l);
+    }
+
+    @Override
+    public void setHeader(String s, String s1) {
+        httpResponse.setHeader(s, s1);
+    }
+
+    @Override
+    public void addHeader(String s, String s1) {
+        httpResponse.addHeader(s, s1);
+    }
+
+    @Override
+    public void setIntHeader(String s, int i) {
+        httpResponse.setIntHeader(s, i);
+    }
+
+    @Override
+    public void addIntHeader(String s, int i) {
+        httpResponse.addIntHeader(s, i);
+    }
+
+    @Override
+    public void setStatus(int i) {
+        httpResponse.setStatus(i);
+    }
+
+    @Override
+    public String getCharacterEncoding() {
+        return httpResponse.getCharacterEncoding();
+    }
+
+    @Override
+    public ServletOutputStream getOutputStream() throws IOException {
+        return httpResponse.getOutputStream();
+    }
+
+    @Override
+    public PrintWriter getWriter() throws IOException {
+        return httpResponse.getWriter();
+    }
+
+    @Override
+    public void setContentLength(int i) {
+        httpResponse.setContentLength(i);
+    }
+
+    @Override
+    public void setContentType(String s) {
+        httpResponse.setContentType(s);
+    }
+
+    @Override
+    public void setBufferSize(int i) {
+        httpResponse.setBufferSize(i);
+    }
+
+    @Override
+    public int getBufferSize() {
+        return httpResponse.getBufferSize();
+    }
+
+    @Override
+    public void flushBuffer() throws IOException {
+        httpResponse.flushBuffer();
+    }
+
+    @Override
+    public void resetBuffer() {
+        httpResponse.resetBuffer();
+    }
+
+    @Override
+    public boolean isCommitted() {
+        return httpResponse.isCommitted();
+    }
+
+    @Override
+    public void reset() {
+        httpResponse.reset();
+    }
+
+    @Override
+    public void setLocale(Locale locale) {
+        httpResponse.setLocale(locale);
+    }
+
+    @Override
+    public Locale getLocale() {
+        return httpResponse.getLocale();
+    }
+
+    @Override
+    public String getContentType() {
+        return httpResponse.getContentType();
+    }
+
+    @Override
+    public void setCharacterEncoding(String charset) {
+        httpResponse.setCharacterEncoding(charset);
+    }
+
+    @Override
+    public int getStatus() {
+        return httpResponse.getStatus();
+    }
+
+    @Override
+    public String getHeader(String name) {
+        return httpResponse.getHeader(name);
+    }
+
+    @Override
+    public Collection<String> getHeaders(String name) {
+        return httpResponse.getHeaders(name);
+    }
+
+    @Override
+    public Collection<String> getHeaderNames() {
+        return httpResponse.getHeaderNames();
+    }
+
+    @Override
+    public void setContentLengthLong(long len) {
+        httpResponse.setContentLengthLong(len);
+    }
+
+    // Servlet 4.0 API support for trailers, for now using reflection
+
+    public void setTrailerFields(Supplier<Map<String, String>> supplier) {
+        try {
+            java.lang.reflect.Method stf = httpResponse.getClass().getDeclaredMethod("setTrailerFields", Supplier.class);
+            stf.invoke(httpResponse, supplier);
+        } catch (IllegalAccessException | java.lang.reflect.InvocationTargetException | NoSuchMethodException
+                | SecurityException ex) {
+            throw new UnsupportedOperationException("no servlet 4.0 support on: " + httpResponse.getClass(), ex);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    public Supplier<Map<String, String>> getTrailerFields() {
+        try {
+            java.lang.reflect.Method stf = httpResponse.getClass().getDeclaredMethod("getTrailerFields");
+            return (Supplier<Map<String, String>>) stf.invoke(httpResponse);
+        } catch (IllegalAccessException | java.lang.reflect.InvocationTargetException | NoSuchMethodException
+                | SecurityException ex) {
+            throw new UnsupportedOperationException("no servlet 4.0 support on: " + httpResponse.getClass(), ex);
+        }
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/BindConstants.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/BindConstants.java
new file mode 100644
index 000000000..e52f8c668
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/BindConstants.java
@@ -0,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.
+ */
+package org.apache.jackrabbit.webdav.bind;
+
+import org.apache.jackrabbit.webdav.xml.Namespace;
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.property.DavPropertyName;
+
+/**
+ * <code>BindConstants</code> provide constants for request and response
+ * headers, Xml elements and property names defined by
+ * the BIND specification.
+ */
+public interface BindConstants {
+
+    /**
+     * The namespace
+     */
+    public static final Namespace NAMESPACE = DavConstants.NAMESPACE;
+
+    /**
+     * local names of XML elements used in the request bodies of the methods BIND, REBIND and UNBIND.
+     */
+    public static final String XML_BIND = "bind";
+    public static final String XML_REBIND = "rebind";
+    public static final String XML_UNBIND = "unbind";
+    public static final String XML_SEGMENT = "segment";
+    public static final String XML_HREF = "href";
+    public static final String XML_PARENT = "parent";
+
+    public static final String METHODS = "BIND, REBIND, UNBIND";
+
+    /*
+     * Webdav properties defined by the BIND specification. 
+     */
+    public static final DavPropertyName RESOURCEID = DavPropertyName.create("resource-id");
+    public static final DavPropertyName PARENTSET = DavPropertyName.create("parent-set");
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/BindInfo.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/BindInfo.java
new file mode 100644
index 000000000..627640ebf
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/BindInfo.java
@@ -0,0 +1,108 @@
+/*
+ * 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.jackrabbit.webdav.bind;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.DavException;
+import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.apache.jackrabbit.webdav.xml.ElementIterator;
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
+import org.w3c.dom.Element;
+import org.w3c.dom.Document;
+
+public class BindInfo implements XmlSerializable {
+
+    private static Logger log = LoggerFactory.getLogger(BindInfo.class);
+
+    private String segment;
+    private String href;
+
+    public BindInfo(String href, String segment) {
+        this.href = href;
+        this.segment = segment;
+    }
+
+    public String getHref() {
+        return this.href;
+    }
+
+    public String getSegment() {
+        return this.segment;
+    }
+
+    /**
+     * Build an <code>BindInfo</code> object from the root element present
+     * in the request body.
+     *
+     * @param root the root element of the request body
+     * @return a BindInfo object containing segment and href
+     * @throws org.apache.jackrabbit.webdav.DavException if the BIND request is malformed
+     */
+    public static BindInfo createFromXml(Element root) throws DavException {
+        if (!DomUtil.matches(root, BindConstants.XML_BIND, BindConstants.NAMESPACE)) {
+            log.warn("DAV:bind element expected");
+            throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+        }
+        String href = null;
+        String segment = null;
+        ElementIterator it = DomUtil.getChildren(root);
+        while (it.hasNext()) {
+            Element elt = it.nextElement();
+            if (DomUtil.matches(elt, BindConstants.XML_SEGMENT, BindConstants.NAMESPACE)) {
+                if (segment == null) {
+                    segment = DomUtil.getText(elt);
+                } else {
+                    log.warn("unexpected multiple occurrence of DAV:segment element");
+                    throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+                }
+            } else if (DomUtil.matches(elt, BindConstants.XML_HREF, BindConstants.NAMESPACE)) {
+                if (href == null) {
+                    href = DomUtil.getText(elt);
+                } else {
+                    log.warn("unexpected multiple occurrence of DAV:href element");
+                    throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+                }
+            } else  {
+                log.warn("unexpected element " + elt.getLocalName());
+                throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+            }
+        }
+        if (href == null) {
+            log.warn("DAV:href element expected");
+            throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+        }
+        if (segment == null) {
+            log.warn("DAV:segment element expected");
+            throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+        }
+        return new BindInfo(href, segment);
+    }
+
+    /**
+     * @see org.apache.jackrabbit.webdav.xml.XmlSerializable#toXml(org.w3c.dom.Document)
+     */
+    public Element toXml(Document document) {
+        Element bindElt = DomUtil.createElement(document, BindConstants.XML_BIND, BindConstants.NAMESPACE);
+        Element hrefElt = DomUtil.createElement(document, BindConstants.XML_HREF, BindConstants.NAMESPACE, this.href);
+        Element segElt = DomUtil.createElement(document, BindConstants.XML_SEGMENT, BindConstants.NAMESPACE, this.segment);
+        bindElt.appendChild(hrefElt);
+        bindElt.appendChild(segElt);
+        return bindElt;
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/BindServletRequest.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/BindServletRequest.java
new file mode 100644
index 000000000..8d6c5168e
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/BindServletRequest.java
@@ -0,0 +1,65 @@
+/*
+ * 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.jackrabbit.webdav.bind;
+
+import org.apache.jackrabbit.webdav.DavException;
+import org.apache.jackrabbit.webdav.DavResourceLocator;
+
+/**
+ * <code>BindServletRequest</code> provides extension useful for functionality
+ * related to BIND specification.
+ */
+public interface BindServletRequest {
+
+    /**
+     * Returns the {@link RebindInfo} present with the request
+     *
+     * @return {@link RebindInfo} object
+     * @throws org.apache.jackrabbit.webdav.DavException in case of an invalid or missing request body
+     */
+    public RebindInfo getRebindInfo() throws DavException;
+
+    /**
+     * Returns the {@link UnbindInfo} present with the request
+     *
+     * @return {@link UnbindInfo} object
+     * @throws org.apache.jackrabbit.webdav.DavException in case of an invalid or missing request body
+     */
+    public UnbindInfo getUnbindInfo() throws DavException;
+
+    /**
+     * Returns the {@link BindInfo} present with the request
+     *
+     * @return {@link BindInfo} object
+     * @throws org.apache.jackrabbit.webdav.DavException in case of an invalid or missing request body
+     */
+    public BindInfo getBindInfo() throws DavException;
+
+    /**
+     * Parses a href and returns the path of the resource.
+     *
+     * @return path of the resource identified by the href.
+     */
+    public DavResourceLocator getHrefLocator(String href) throws DavException;
+
+    /**
+     * Returns the path of the member resource of the request resource which is identified by the segment parameter.
+     *
+     * @return path of internal member resource.
+     */
+    public DavResourceLocator getMemberLocator(String segment);
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/BindableResource.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/BindableResource.java
new file mode 100644
index 000000000..86be8faa3
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/BindableResource.java
@@ -0,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.
+ */
+package org.apache.jackrabbit.webdav.bind;
+
+import java.util.Set;
+
+import org.apache.jackrabbit.webdav.DavException;
+import org.apache.jackrabbit.webdav.DavResource;
+
+public interface BindableResource {
+
+    /**
+     * Will add a new binding to the given collection referencing this resource.
+     *
+     * @param collection the collection to create the new binding in.
+     * @param newBinding the new binding
+     */
+    public void bind(DavResource collection, DavResource newBinding) throws DavException;
+
+    /**
+     * Will rebind the resource to the given collection. By definition, this is
+     * an atomic move operation.
+     *
+     * @param collection the collection to create the new binding in.
+     * @param newBinding the new binding
+     */
+    public void rebind(DavResource collection, DavResource newBinding) throws DavException;
+
+    /**
+     * Will retrieve a collection of parent elements of the bindable resource
+     * representing the parent set.
+     *
+     * @return newBinding the new binding
+     */
+    public Set<ParentElement> getParentElements();
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/ParentElement.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/ParentElement.java
new file mode 100644
index 000000000..3edd2ab15
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/ParentElement.java
@@ -0,0 +1,111 @@
+/*
+ * 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.jackrabbit.webdav.bind;
+
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
+import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.apache.jackrabbit.webdav.xml.ElementIterator;
+import org.apache.jackrabbit.webdav.DavException;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.w3c.dom.Element;
+import org.w3c.dom.Document;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * <code>ParentElement</code> wraps en element of the parent set of a resource. A <code>java.util.Set</code> of
+ * <code>ParentElement</code> objects may serve as the value object of the <code>ParentSet</code> DavProperty.
+ */
+public class ParentElement implements XmlSerializable {
+
+    private static Logger log = LoggerFactory.getLogger(ParentElement.class);
+
+    private final String href;
+    private final String segment;
+
+    public ParentElement(String href, String segment) {
+        this.href = href;
+        this.segment = segment;
+    }
+
+    public String getHref() {
+        return this.href;
+    }
+
+    public String getSegment() {
+        return this.segment;
+    }
+
+    /**
+     * Build an <code>ParentElement</code> object from an XML element DAV:parent
+     *
+     * @param root the DAV:parent element
+     * @return a ParentElement object
+     * @throws org.apache.jackrabbit.webdav.DavException if the DAV:parent element is malformed
+     */
+    public static ParentElement createFromXml(Element root) throws DavException {
+        if (!DomUtil.matches(root, BindConstants.XML_PARENT, BindConstants.NAMESPACE)) {
+            log.warn("DAV:paret element expected");
+            throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+        }
+        String href = null;
+        String segment = null;
+        ElementIterator it = DomUtil.getChildren(root);
+        while (it.hasNext()) {
+            Element elt = it.nextElement();
+            if (DomUtil.matches(elt, BindConstants.XML_SEGMENT, BindConstants.NAMESPACE)) {
+                if (segment == null) {
+                    segment = DomUtil.getText(elt);
+                } else {
+                    log.warn("unexpected multiple occurrence of DAV:segment element");
+                    throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+                }
+            } else if (DomUtil.matches(elt, BindConstants.XML_HREF, BindConstants.NAMESPACE)) {
+                if (href == null) {
+                    href = DomUtil.getText(elt);
+                } else {
+                    log.warn("unexpected multiple occurrence of DAV:href element");
+                    throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+                }
+            } else  {
+                log.warn("unexpected element " + elt.getLocalName());
+                throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+            }
+        }
+        if (href == null) {
+            log.warn("DAV:href element expected");
+            throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+        }
+        if (segment == null) {
+            log.warn("DAV:segment element expected");
+            throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+        }
+        return new ParentElement(href, segment);
+    }
+
+    /**
+     * @see org.apache.jackrabbit.webdav.xml.XmlSerializable#toXml(org.w3c.dom.Document)  
+     */
+    public Element toXml(Document document) {
+        Element parentElt = DomUtil.createElement(document, BindConstants.XML_PARENT, BindConstants.NAMESPACE);
+        Element hrefElt = DomUtil.createElement(document, BindConstants.XML_HREF, BindConstants.NAMESPACE, this.href);
+        Element segElt = DomUtil.createElement(document, BindConstants.XML_SEGMENT, BindConstants.NAMESPACE, this.segment);
+        parentElt.appendChild(hrefElt);
+        parentElt.appendChild(segElt);
+        return parentElt;
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/ParentSet.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/ParentSet.java
new file mode 100644
index 000000000..01fae4230
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/ParentSet.java
@@ -0,0 +1,45 @@
+/*
+ * 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.jackrabbit.webdav.bind;
+
+import org.apache.jackrabbit.webdav.property.AbstractDavProperty;
+
+import java.util.Collection;
+
+/**
+ * <code>ParentSet</code> represents a DAV:parent-set property.
+ */
+public class ParentSet extends AbstractDavProperty<Collection<ParentElement>> {
+
+    private final Collection<ParentElement> parents;
+
+    /**
+     * Creates a new ParentSet from a collection of <code>ParentElement</code> objects.
+     * @param parents
+     */
+    public ParentSet(Collection<ParentElement> parents) {
+        super(BindConstants.PARENTSET, true);
+        this.parents = parents;
+    }
+
+    /**
+     * @see org.apache.jackrabbit.webdav.property.AbstractDavProperty#getValue() 
+     */
+    public Collection<ParentElement> getValue() {
+        return this.parents;
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/RebindInfo.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/RebindInfo.java
new file mode 100644
index 000000000..233b236a7
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/RebindInfo.java
@@ -0,0 +1,108 @@
+/*
+ * 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.jackrabbit.webdav.bind;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.DavException;
+import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.apache.jackrabbit.webdav.xml.ElementIterator;
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
+import org.w3c.dom.Element;
+import org.w3c.dom.Document;
+
+public class RebindInfo implements XmlSerializable {
+
+    private static Logger log = LoggerFactory.getLogger(RebindInfo.class);
+
+    private String segment;
+    private String href;
+
+    public RebindInfo(String href, String segment) {
+        this.href = href;
+        this.segment = segment;
+    }
+
+    public String getHref() {
+        return this.href;
+    }
+
+    public String getSegment() {
+        return this.segment;
+    }
+
+    /**
+     * Build an <code>RebindInfo</code> object from the root element present
+     * in the request body.
+     *
+     * @param root the root element of the request body
+     * @return a RebindInfo object containing segment and href
+     * @throws org.apache.jackrabbit.webdav.DavException if the REBIND request is malformed 
+     */
+    public static RebindInfo createFromXml(Element root) throws DavException {
+        if (!DomUtil.matches(root, BindConstants.XML_REBIND, BindConstants.NAMESPACE)) {
+            log.warn("DAV:rebind element expected");
+            throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+        }
+        String href = null;
+        String segment = null;
+        ElementIterator it = DomUtil.getChildren(root);
+        while (it.hasNext()) {
+            Element elt = it.nextElement();
+            if (DomUtil.matches(elt, BindConstants.XML_SEGMENT, BindConstants.NAMESPACE)) {
+                if (segment == null) {
+                    segment = DomUtil.getText(elt);
+                } else {
+                    log.warn("unexpected multiple occurrence of DAV:segment element");
+                    throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+                }
+            } else if (DomUtil.matches(elt, BindConstants.XML_HREF, BindConstants.NAMESPACE)) {
+                if (href == null) {
+                    href = DomUtil.getText(elt);
+                } else {
+                    log.warn("unexpected multiple occurrence of DAV:href element");
+                    throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+                }
+            } else  {
+                log.warn("unexpected element " + elt.getLocalName());
+                throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+            }
+        }
+        if (href == null) {
+            log.warn("DAV:href element expected");
+            throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+        }
+        if (segment == null) {
+            log.warn("DAV:segment element expected");
+            throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+        }
+        return new RebindInfo(href, segment);
+    }
+
+    /**
+     * @see org.apache.jackrabbit.webdav.xml.XmlSerializable#toXml(org.w3c.dom.Document)
+     */
+    public Element toXml(Document document) {
+        Element rebindElt = DomUtil.createElement(document, BindConstants.XML_REBIND, BindConstants.NAMESPACE);
+        Element hrefElt = DomUtil.createElement(document, BindConstants.XML_HREF, BindConstants.NAMESPACE, this.href);
+        Element segElt = DomUtil.createElement(document, BindConstants.XML_SEGMENT, BindConstants.NAMESPACE, this.segment);
+        rebindElt.appendChild(hrefElt);
+        rebindElt.appendChild(segElt);
+        return rebindElt;
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/UnbindInfo.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/UnbindInfo.java
new file mode 100644
index 000000000..e3c7a3e2d
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/UnbindInfo.java
@@ -0,0 +1,90 @@
+/*
+ * 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.jackrabbit.webdav.bind;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.DavException;
+import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.apache.jackrabbit.webdav.xml.ElementIterator;
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
+import org.w3c.dom.Element;
+import org.w3c.dom.Document;
+
+public class UnbindInfo implements XmlSerializable {
+
+    private static Logger log = LoggerFactory.getLogger(UnbindInfo.class);
+
+    private String segment;
+
+    private UnbindInfo() {}
+
+    public UnbindInfo(String segment) {
+        this.segment = segment;
+    }
+
+    public String getSegment() {
+        return this.segment;
+    }
+
+    /**
+     * Build an <code>UnbindInfo</code> object from the root element present
+     * in the request body.
+     *
+     * @param root the root element of the request body
+     * @return a UnbindInfo object containing a segment identifier
+     * @throws org.apache.jackrabbit.webdav.DavException if the UNBIND request is malformed
+     */
+    public static UnbindInfo createFromXml(Element root) throws DavException {
+        if (!DomUtil.matches(root, BindConstants.XML_UNBIND, BindConstants.NAMESPACE)) {
+            log.warn("DAV:unbind element expected");
+            throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+        }
+        String segment = null;
+        ElementIterator it = DomUtil.getChildren(root);
+        while (it.hasNext()) {
+            Element elt = it.nextElement();
+            if (DomUtil.matches(elt, BindConstants.XML_SEGMENT, BindConstants.NAMESPACE)) {
+                if (segment == null) {
+                    segment = DomUtil.getText(elt);
+                } else {
+                    log.warn("unexpected multiple occurrence of DAV:segment element");
+                    throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+                }
+            } else  {
+                log.warn("unexpected element " + elt.getLocalName());
+                throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+            }
+        }
+        if (segment == null) {
+            log.warn("DAV:segment element expected");
+            throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+        }
+        return new UnbindInfo(segment);
+    }
+
+    /**
+     * @see org.apache.jackrabbit.webdav.xml.XmlSerializable#toXml(org.w3c.dom.Document)
+     */
+    public Element toXml(Document document) {
+        Element unbindElt = DomUtil.createElement(document, BindConstants.XML_UNBIND, BindConstants.NAMESPACE);
+        Element segElt = DomUtil.createElement(document, BindConstants.XML_SEGMENT, BindConstants.NAMESPACE, this.segment);
+        unbindElt.appendChild(segElt);
+        return unbindElt;
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/package-info.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/package-info.java
new file mode 100644
index 000000000..05d41820c
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/bind/package-info.java
@@ -0,0 +1,18 @@
+/*
+ * 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.
+ */
+@org.osgi.annotation.versioning.Version("1.0.0")
+package org.apache.jackrabbit.webdav.bind;
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/BaseDavRequest.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/BaseDavRequest.java
new file mode 100644
index 000000000..ca365b75f
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/BaseDavRequest.java
@@ -0,0 +1,219 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.StatusLine;
+import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.DavException;
+import org.apache.jackrabbit.webdav.MultiStatus;
+import org.apache.jackrabbit.webdav.lock.LockDiscovery;
+import org.apache.jackrabbit.webdav.observation.EventDiscovery;
+import org.apache.jackrabbit.webdav.observation.ObservationConstants;
+import org.apache.jackrabbit.webdav.observation.Subscription;
+import org.apache.jackrabbit.webdav.observation.SubscriptionDiscovery;
+import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
+
+/**
+ * Base class for HTTP request classes defined in this package.
+ */
+public abstract class BaseDavRequest extends HttpEntityEnclosingRequestBase {
+
+    private static Logger log = LoggerFactory.getLogger(BaseDavRequest.class);
+
+    public BaseDavRequest(URI uri) {
+        super();
+        super.setURI(uri);
+    }
+
+    /**
+     * Gets a {@link Document} representing the response body.
+     * @return document or {@code null} for null entity
+     * @throws IOException in case of I/O or XMP pasting problems 
+     */
+    public Document getResponseBodyAsDocument(HttpEntity entity) throws IOException {
+
+        if (entity == null) {
+            return null;
+        } else {
+            // read response and try to build a xml document
+            InputStream in = entity.getContent();
+            try {
+                return DomUtil.parseDocument(in);
+            } catch (ParserConfigurationException ex) {
+                throw new IOException("XML parser configuration error", ex);
+            } catch (SAXException ex) {
+                throw new IOException("XML parsing error", ex);
+            } finally {
+                in.close();
+            }
+        }
+    }
+
+    /**
+     * Return response body as {@link MultiStatus} object.
+     * @throws IllegalStateException when response does not represent a {@link MultiStatus}
+     * @throws DavException for failures in obtaining/parsing the response body
+     */
+    public MultiStatus getResponseBodyAsMultiStatus(HttpResponse response) throws DavException {
+        try {
+            Document doc = getResponseBodyAsDocument(response.getEntity());
+            if (doc == null) {
+                throw new DavException(response.getStatusLine().getStatusCode(), "no response body");
+            }
+            return MultiStatus.createFromXml(doc.getDocumentElement());
+        } catch (IOException ex) {
+            throw new DavException(response.getStatusLine().getStatusCode(), ex);
+        }
+    }
+
+    /**
+     * Return response body as {@link LockDiscovery} object.
+     * @throws IllegalStateException when response does not represent a {@link LockDiscovery}
+     * @throws DavException for failures in obtaining/parsing the response body
+     */
+    public LockDiscovery getResponseBodyAsLockDiscovery(HttpResponse response) throws DavException {
+        try {
+            Document doc = getResponseBodyAsDocument(response.getEntity());
+            if (doc == null) {
+                throw new DavException(response.getStatusLine().getStatusCode(), "no response body");
+            }
+            Element root = doc.getDocumentElement();
+
+            if (!DomUtil.matches(root, DavConstants.XML_PROP, DavConstants.NAMESPACE)
+                    && DomUtil.hasChildElement(root, DavConstants.PROPERTY_LOCKDISCOVERY, DavConstants.NAMESPACE)) {
+                throw new DavException(response.getStatusLine().getStatusCode(),
+                        "Missing DAV:prop response body in LOCK response.");
+            }
+
+            Element lde = DomUtil.getChildElement(root, DavConstants.PROPERTY_LOCKDISCOVERY, DavConstants.NAMESPACE);
+            if (!DomUtil.hasChildElement(lde, DavConstants.XML_ACTIVELOCK, DavConstants.NAMESPACE)) {
+                throw new DavException(response.getStatusLine().getStatusCode(),
+                        "The DAV:lockdiscovery must contain a least a single DAV:activelock in response to a successful LOCK request.");
+            }
+
+            return LockDiscovery.createFromXml(lde);
+        } catch (IOException ex) {
+            throw new DavException(response.getStatusLine().getStatusCode(), ex);
+        }
+    }
+
+    /**
+     * Return response body as {@link SubscriptionDiscovery} object.
+     * @throws IllegalStateException when response does not represent a {@link SubscriptionDiscovery}
+     * @throws DavException for failures in obtaining/parsing the response body
+     */
+    public SubscriptionDiscovery getResponseBodyAsSubscriptionDiscovery(HttpResponse response) throws DavException {
+        try {
+            Document doc = getResponseBodyAsDocument(response.getEntity());
+            if (doc == null) {
+                throw new DavException(response.getStatusLine().getStatusCode(), "no response body");
+            }
+            Element root = doc.getDocumentElement();
+
+            if (!DomUtil.matches(root, DavConstants.XML_PROP, DavConstants.NAMESPACE)
+                    && DomUtil.hasChildElement(root, ObservationConstants.SUBSCRIPTIONDISCOVERY.getName(),
+                            ObservationConstants.SUBSCRIPTIONDISCOVERY.getNamespace())) {
+                throw new DavException(response.getStatusLine().getStatusCode(),
+                        "Missing DAV:prop response body in SUBSCRIBE response.");
+            }
+
+            Element sde = DomUtil.getChildElement(root, ObservationConstants.SUBSCRIPTIONDISCOVERY.getName(),
+                    ObservationConstants.SUBSCRIPTIONDISCOVERY.getNamespace());
+            SubscriptionDiscovery sd = SubscriptionDiscovery.createFromXml(sde);
+            if (((Subscription[]) sd.getValue()).length > 0) {
+                return sd;
+            } else {
+                throw new DavException(response.getStatusLine().getStatusCode(),
+                        "Missing 'subscription' elements in SUBSCRIBE response body. At least a single subscription must be present if SUBSCRIBE was successful.");
+            }
+        } catch (IOException ex) {
+            throw new DavException(response.getStatusLine().getStatusCode(), ex);
+        }
+    }
+
+    /**
+     * Return response body as {@link EventDiscovery} object.
+     * @throws IllegalStateException when response does not represent a {@link EventDiscovery}
+     * @throws DavException for failures in obtaining/parsing the response body
+     */
+    public EventDiscovery getResponseBodyAsEventDiscovery(HttpResponse response) throws DavException {
+        try {
+            Document doc = getResponseBodyAsDocument(response.getEntity());
+            if (doc == null) {
+                throw new DavException(response.getStatusLine().getStatusCode(), "no response body");
+            }
+            return EventDiscovery.createFromXml(doc.getDocumentElement());
+        } catch (IOException ex) {
+            throw new DavException(response.getStatusLine().getStatusCode(), ex);
+        }
+    }
+
+    /**
+     * Check the response and throw when it is considered to represent a failure.
+     */
+    public void checkSuccess(HttpResponse response) throws DavException {
+        if (!succeeded(response)) {
+            throw getResponseException(response);
+        }
+    }
+
+    /**
+     * Obtain a {@link DavException} representing the response.
+     * @throws IllegalStateException when the response is considered to be successful
+     */
+    public DavException getResponseException(HttpResponse response) {
+        if (succeeded(response)) {
+            String msg = "Cannot retrieve exception from successful response.";
+            log.warn(msg);
+            throw new IllegalStateException(msg);
+        }
+
+        StatusLine st = response.getStatusLine();
+        Element responseRoot = null;
+        try {
+            responseRoot = getResponseBodyAsDocument(response.getEntity()).getDocumentElement();
+        } catch (IOException e) {
+            // non-parseable body -> use null element
+        }
+
+        return new DavException(st.getStatusCode(), st.getReasonPhrase(), null, responseRoot);
+    }
+
+    /**
+     * Check the provided {@link HttpResponse} for successful execution. The default implementation treats all
+     * 2xx status codes (<a href="http://webdav.org/specs/rfc7231.html#rfc.section.6.3">RFC 7231, Section 6.3</a>).
+     * Implementations can further restrict the accepted range of responses (or even check the response body).
+     */
+    public boolean succeeded(HttpResponse response) {
+        int status = response.getStatusLine().getStatusCode();
+        return status >= 200 && status <= 299;
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpBind.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpBind.java
new file mode 100644
index 000000000..4c2161810
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpBind.java
@@ -0,0 +1,54 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.bind.BindInfo;
+
+/**
+ * Represents an HTTP BIND request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc5842.html#rfc.section.4">RFC 5842, Section 4</a>
+ * @since 2.13.6
+ */
+public class HttpBind extends BaseDavRequest {
+
+    public HttpBind(URI uri, BindInfo info) throws IOException {
+        super(uri);
+        super.setEntity(XmlEntity.create(info));
+    }
+
+    public HttpBind(String uri, BindInfo info) throws IOException {
+        this(URI.create(uri), info);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_BIND;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_OK || statusCode == DavServletResponse.SC_CREATED;
+    }
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCheckin.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCheckin.java
new file mode 100644
index 000000000..06b67aec0
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCheckin.java
@@ -0,0 +1,51 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+
+/**
+ * Represents an HTTP CHECKIN request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc3253.html#rfc.section.4.4">RFC 3253, Section 4.4</a>
+ * @since 2.13.6
+ */
+public class HttpCheckin extends BaseDavRequest {
+
+    public HttpCheckin(URI uri) {
+        super(uri);
+    }
+
+    public HttpCheckin(String uri) {
+        this(URI.create(uri));
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_CHECKIN;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_CREATED;
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCheckout.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCheckout.java
new file mode 100644
index 000000000..a7f5e009b
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCheckout.java
@@ -0,0 +1,51 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+
+/**
+ * Represents an HTTP CHECKOUT request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc3253.html#rfc.section.4.3">RFC 3253, Section 4.3</a>
+ * @since 2.13.6
+ */
+public class HttpCheckout extends BaseDavRequest {
+
+    public HttpCheckout(URI uri) {
+        super(uri);
+    }
+
+    public HttpCheckout(String uri) {
+        this(URI.create(uri));
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_CHECKOUT;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_OK;
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCopy.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCopy.java
new file mode 100644
index 000000000..4f5337b87
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCopy.java
@@ -0,0 +1,59 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+
+/**
+ * Represents an HTTP COPY request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc4918.html#rfc.section.9.8">RFC 4918, Section 9.8</a>
+ * @since 2.13.6
+ */
+public class HttpCopy extends BaseDavRequest {
+
+    public HttpCopy(URI uri, URI dest, boolean overwrite, boolean shallow) {
+        super(uri);
+        super.setHeader(DavConstants.HEADER_DESTINATION, dest.toASCIIString());
+        if (!overwrite) {
+            super.setHeader(DavConstants.HEADER_OVERWRITE, "F");
+        }
+        if (shallow) {
+            super.setHeader("Depth", "0");
+        }
+    }
+
+    public HttpCopy(String uri, String dest, boolean overwrite, boolean shallow) {
+        this(URI.create(uri), URI.create(dest), overwrite, shallow);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_COPY;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_CREATED || statusCode == DavServletResponse.SC_NO_CONTENT;
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpDelete.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpDelete.java
new file mode 100644
index 000000000..99c283bab
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpDelete.java
@@ -0,0 +1,43 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.net.URI;
+
+import org.apache.jackrabbit.webdav.DavMethods;
+
+/**
+ * Represents an HTTP DELETE request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc7231.html#rfc.section.4.3.5">RFC 7231, Section 4.3.5</a>
+ * @since 2.13.6
+ */
+public class HttpDelete extends BaseDavRequest {
+
+    public HttpDelete(URI uri){
+        super(uri);
+    }
+
+    public HttpDelete(String uri) {
+        this(URI.create(uri));
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_DELETE;
+    }
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpLabel.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpLabel.java
new file mode 100644
index 000000000..05c6f48ce
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpLabel.java
@@ -0,0 +1,57 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.header.DepthHeader;
+import org.apache.jackrabbit.webdav.version.LabelInfo;
+
+/**
+ * Represents an HTTP LABEL request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc3253.html#rfc.section.8.2">RFC 3253, Section 8.2</a>
+ * @since 2.13.6
+ */
+public class HttpLabel extends BaseDavRequest {
+
+    public HttpLabel(URI uri, LabelInfo labelInfo) throws IOException {
+        super(uri);
+        DepthHeader dh = new DepthHeader(labelInfo.getDepth());
+        super.setHeader(dh.getHeaderName(), dh.getHeaderValue());
+        super.setEntity(XmlEntity.create(labelInfo));
+    }
+
+    public HttpLabel(String uri, LabelInfo labelInfo) throws IOException {
+        this(URI.create(uri), labelInfo);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_LABEL;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_OK;
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpLock.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpLock.java
new file mode 100644
index 000000000..171776d17
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpLock.java
@@ -0,0 +1,107 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.Arrays;
+
+import org.apache.http.Header;
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.header.DepthHeader;
+import org.apache.jackrabbit.webdav.header.IfHeader;
+import org.apache.jackrabbit.webdav.header.TimeoutHeader;
+import org.apache.jackrabbit.webdav.lock.LockInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Represents an HTTP LOCK request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc4918.html#rfc.section.9.10">RFC 4918, Section 9.10</a>
+ * @since 2.13.6
+ */
+public class HttpLock extends BaseDavRequest {
+
+    private static final Logger LOG = LoggerFactory.getLogger(HttpLock.class);
+
+    private final boolean isRefresh;
+
+    public HttpLock(URI uri, LockInfo lockInfo) throws IOException {
+        super(uri);
+
+        TimeoutHeader th = new TimeoutHeader(lockInfo.getTimeout());
+        super.setHeader(th.getHeaderName(), th.getHeaderValue());
+        DepthHeader dh = new DepthHeader(lockInfo.isDeep());
+        super.setHeader(dh.getHeaderName(), dh.getHeaderValue());
+
+        super.setEntity(XmlEntity.create(lockInfo));
+
+        isRefresh = false;
+    }
+
+    public HttpLock(String uri, LockInfo lockInfo) throws IOException {
+        this(URI.create(uri), lockInfo);
+    }
+
+    public HttpLock(URI uri, long timeout, String[] lockTokens) {
+        super(uri);
+
+        TimeoutHeader th = new TimeoutHeader(timeout);
+        super.setHeader(th.getHeaderName(), th.getHeaderValue());
+        IfHeader ifh = new IfHeader(lockTokens);
+        super.setHeader(ifh.getHeaderName(), ifh.getHeaderValue());
+        isRefresh = true;
+    }
+
+    public HttpLock(String uri, long timeout, String[] lockTokens) {
+        this(URI.create(uri), timeout, lockTokens);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_LOCK;
+    }
+
+    public String getLockToken(HttpResponse response) {
+        Header[] ltHeader = response.getHeaders(DavConstants.HEADER_LOCK_TOKEN);
+        if (ltHeader == null || ltHeader.length == 0) {
+            return null;
+        } else if (ltHeader.length != 1) {
+            LOG.debug("Multiple 'Lock-Token' header fields in response for " + getURI() + ": " + Arrays.asList(ltHeader));
+            return null;
+        } else {
+            String v = ltHeader[0].getValue().trim();
+            if (!v.startsWith("<") || !v.endsWith(">")) {
+                LOG.debug("Invalid 'Lock-Token' header field in response for " + getURI() + ": " + Arrays.asList(ltHeader));
+                return null;
+            } else {
+                return v.substring(1, v.length() - 1);
+            }
+        }
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        boolean lockTokenHeaderOk = isRefresh || null != getLockToken(response);
+        return lockTokenHeaderOk && (statusCode == DavServletResponse.SC_OK || statusCode == DavServletResponse.SC_CREATED);
+    }
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMerge.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMerge.java
new file mode 100644
index 000000000..b8db71dcf
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMerge.java
@@ -0,0 +1,55 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.version.MergeInfo;
+
+/**
+ * Represents an HTTP MERGE request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc3253.html#rfc.section.11.2">RFC 3253, Section 11.2</a>
+ * @since 2.13.6
+ */
+public class HttpMerge extends BaseDavRequest {
+
+    public HttpMerge(URI uri, MergeInfo mergeInfo) throws IOException {
+        super(uri);
+        super.setEntity(XmlEntity.create(mergeInfo));
+    }
+
+    public HttpMerge(String uri, MergeInfo mergeInfo) throws IOException {
+        this(URI.create(uri), mergeInfo);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_MERGE;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        // TODO: is this correct?
+        return statusCode == DavServletResponse.SC_MULTI_STATUS;
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMkcol.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMkcol.java
new file mode 100644
index 000000000..5ecf6a237
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMkcol.java
@@ -0,0 +1,51 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+
+/**
+ * Represents an HTTP MKCOL request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc4918.html#rfc.section.9.3">RFC 4918, Section 9.3</a>
+ * @since 2.13.6
+ */
+public class HttpMkcol extends BaseDavRequest {
+
+    public HttpMkcol(URI uri) {
+        super(uri);
+    }
+
+    public HttpMkcol(String uri) {
+        this(URI.create(uri));
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_MKCOL;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_CREATED;
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMkworkspace.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMkworkspace.java
new file mode 100644
index 000000000..1c14fe52a
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMkworkspace.java
@@ -0,0 +1,51 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+
+/**
+ * Represents an HTTP MKWORKSPACE request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc3253.html#rfc.section.6.3">RFC 3253, Section 6.3</a>
+ * @since 2.13.6
+ */
+public class HttpMkworkspace extends BaseDavRequest {
+
+    public HttpMkworkspace(URI uri) {
+        super(uri);
+    }
+
+    public HttpMkworkspace(String uri) {
+        this(URI.create(uri));
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_MKWORKSPACE;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_CREATED;
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMove.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMove.java
new file mode 100644
index 000000000..2411e0891
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMove.java
@@ -0,0 +1,56 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+
+/**
+ * Represents an HTTP MOVE request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc4918.html#rfc.section.9.9">RFC 4918, Section 9.9</a>
+ * @since 2.13.6
+ */
+public class HttpMove extends BaseDavRequest {
+
+    public HttpMove(URI uri, URI dest, boolean overwrite) {
+        super(uri);
+        super.setHeader(DavConstants.HEADER_DESTINATION, dest.toASCIIString());
+        if (!overwrite) {
+            super.setHeader(DavConstants.HEADER_OVERWRITE, "F");
+        }
+    }
+
+    public HttpMove(String uri, String dest, boolean overwrite) {
+        this(URI.create(uri), URI.create(dest), overwrite);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_MOVE;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_CREATED || statusCode == DavServletResponse.SC_NO_CONTENT;
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpOptions.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpOptions.java
new file mode 100644
index 000000000..4986ee2b9
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpOptions.java
@@ -0,0 +1,79 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.net.URI;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.http.Header;
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.header.FieldValueParser;
+import org.apache.jackrabbit.webdav.search.SearchConstants;
+
+/**
+ * Represents an HTTP OPTIONS request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc7231.html#rfc.section.4.3.7">RFC 7231, Section 4.3.7</a>
+ * @since 2.13.6
+ */
+public class HttpOptions extends org.apache.http.client.methods.HttpOptions {
+
+    public HttpOptions(URI uri) {
+        super(uri);
+    }
+
+    public HttpOptions(String uri) {
+        super(URI.create(uri));
+    }
+
+    /**
+     * Compute the set of compliance classes returned in the "dav" header field
+     */
+    public Set<String> getDavComplianceClasses(HttpResponse response) {
+        Header[] headers = response.getHeaders(DavConstants.HEADER_DAV);
+        return parseTokenOrCodedUrlheaderField(headers, false);
+    }
+
+    /**
+     * Compute set of search grammars returned in the "dasl" header field
+     */
+    public Set<String> getSearchGrammars(HttpResponse response) {
+        Header[] headers = response.getHeaders(SearchConstants.HEADER_DASL);
+        return parseTokenOrCodedUrlheaderField(headers, true);
+    }
+
+    private Set<String> parseTokenOrCodedUrlheaderField(Header[] headers, boolean removeBrackets) {
+        if (headers == null) {
+            return Collections.emptySet();
+        }
+        else {
+            Set<String> result = new HashSet<String>();
+            for (Header h : headers) {
+                for (String s : FieldValueParser.tokenizeList(h.getValue())) {
+                    if (removeBrackets && s.startsWith("<") && s.endsWith(">")) {
+                        s = s.substring(1, s.length() - 1);
+                    }
+                    result.add(s.trim());
+                }
+            }
+            return Collections.unmodifiableSet(result);
+        }
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpOrderpatch.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpOrderpatch.java
new file mode 100644
index 000000000..0e6f0fbf0
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpOrderpatch.java
@@ -0,0 +1,53 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.ordering.OrderPatch;
+
+/**
+ * Represents an HTTP ORDERPATCH request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc3648.html#rfc.section.5">RFC 3648, Section 5</a>
+ * @since 2.13.6
+ */
+public class HttpOrderpatch extends BaseDavRequest {
+
+    public HttpOrderpatch(URI uri, OrderPatch info) throws IOException {
+        super(uri);
+        super.setEntity(XmlEntity.create(info));
+    }
+
+    public HttpOrderpatch(String uri, OrderPatch info) throws IOException {
+        this(URI.create(uri), info);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_ORDERPATCH;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        return response.getStatusLine().getStatusCode() == DavServletResponse.SC_OK;
+    }
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpPoll.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpPoll.java
new file mode 100644
index 000000000..af7d62084
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpPoll.java
@@ -0,0 +1,58 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.header.PollTimeoutHeader;
+import org.apache.jackrabbit.webdav.observation.ObservationConstants;
+
+/**
+ * Represents an HTTP POLL request.
+ * <p>
+ * Note that "POLL" is a custom HTTP extension, not defined in a standards paper.
+ * @since 2.13.6
+ */
+public class HttpPoll extends BaseDavRequest {
+
+    public HttpPoll(URI uri, String subscriptionId, long timeout) {
+        super(uri);
+        super.setHeader(ObservationConstants.HEADER_SUBSCRIPTIONID, subscriptionId);
+        if (timeout > 0) {
+            PollTimeoutHeader th = new PollTimeoutHeader(timeout);
+            super.setHeader(th.getHeaderName(), th.getHeaderValue());
+        }
+    }
+
+    public HttpPoll(String uri, String subscriptionId, long timeout) {
+        this(URI.create(uri), subscriptionId, timeout);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_POLL;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_OK;
+    }
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpPropfind.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpPropfind.java
new file mode 100644
index 000000000..e548db069
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpPropfind.java
@@ -0,0 +1,77 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.header.DepthHeader;
+import org.apache.jackrabbit.webdav.property.DavPropertyNameSet;
+import org.apache.jackrabbit.webdav.property.PropfindInfo;
+
+/**
+ * Represents an HTTP PROPFIND request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc4918.html#rfc.section.9.1">RFC 4918, Section 9.1</a>
+ * @since 2.13.6
+ */
+public class HttpPropfind extends BaseDavRequest {
+
+    public HttpPropfind(URI uri, int propfindType, DavPropertyNameSet names, int depth) throws IOException {
+        super(uri);
+
+        DepthHeader dh = new DepthHeader(depth);
+        super.setHeader(dh.getHeaderName(), dh.getHeaderValue());
+
+        PropfindInfo info = new PropfindInfo(propfindType, names);
+        super.setEntity(XmlEntity.create(info));
+    }
+
+    public HttpPropfind(URI uri, DavPropertyNameSet names, int depth) throws IOException {
+        this(uri, DavConstants.PROPFIND_BY_PROPERTY, names, depth);
+    }
+
+    public HttpPropfind(URI uri, int propfindType, int depth) throws IOException {
+        this(uri, propfindType, new DavPropertyNameSet(), depth);
+    }
+
+    public HttpPropfind(String uri, int propfindType, int depth) throws IOException {
+        this(URI.create(uri), propfindType, depth);
+    }
+
+    public HttpPropfind(String uri, int propfindType, DavPropertyNameSet names, int depth) throws IOException {
+        this(URI.create(uri), propfindType, names, depth);
+    }
+
+    public HttpPropfind(String uri, DavPropertyNameSet names, int depth) throws IOException {
+        this(URI.create(uri), names, depth);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_PROPFIND;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        return response.getStatusLine().getStatusCode() == DavServletResponse.SC_MULTI_STATUS;
+    }
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpProppatch.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpProppatch.java
new file mode 100644
index 000000000..2cd35f8f0
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpProppatch.java
@@ -0,0 +1,104 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.List;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.property.DavPropertyNameSet;
+import org.apache.jackrabbit.webdav.property.DavPropertySet;
+import org.apache.jackrabbit.webdav.property.PropEntry;
+import org.apache.jackrabbit.webdav.property.ProppatchInfo;
+
+/**
+ * Represents an HTTP PROPPATCH request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc4918.html#rfc.section.9.2">RFC 4918, Section 9.2</a>
+ * @since 2.13.6
+ */
+public class HttpProppatch extends BaseDavRequest {
+
+    // private DavPropertyNameSet propertyNames;
+
+    public HttpProppatch(URI uri, ProppatchInfo info) throws IOException {
+        super(uri);
+        super.setEntity(XmlEntity.create(info));
+        // this.propertyNames = info.getAffectedProperties();
+    }
+
+    public HttpProppatch(URI uri, List<? extends PropEntry> changeList) throws IOException {
+        this(uri, new ProppatchInfo(changeList));
+    }
+
+    public HttpProppatch(URI uri, DavPropertySet setProperties, DavPropertyNameSet removeProperties) throws IOException {
+        this(uri, new ProppatchInfo(setProperties, removeProperties));
+    }
+
+    public HttpProppatch(String uri, List<? extends PropEntry> changeList) throws IOException {
+        this(URI.create(uri), new ProppatchInfo(changeList));
+    }
+
+    public HttpProppatch(String uri, DavPropertySet setProperties, DavPropertyNameSet removeProperties) throws IOException {
+        this(URI.create(uri), new ProppatchInfo(setProperties, removeProperties));
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_PROPPATCH;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        return response.getStatusLine().getStatusCode() == DavServletResponse.SC_MULTI_STATUS;
+
+        // disabled code that fails for current PROPPATCH behavior of Jackrabbit
+//        MultiStatusResponse responses[] = super.getResponseBodyAsMultiStatus(response).getResponses();
+//        if (responses.length != 1) {
+//            throw new DavException(DavServletResponse.SC_MULTI_STATUS,
+//                    "PROPPATCH failed: Expected exactly one multistatus response element, but got " + responses.length);
+//        }
+//        DavPropertyNameSet okSet = responses[0].getPropertyNames(DavServletResponse.SC_OK);
+//        if (okSet.isEmpty()) {
+//            throw new DavException(DavServletResponse.SC_MULTI_STATUS,
+//                    "PROPPATCH failed: No 'OK' response found for resource " + responses[0].getHref());
+//        } else {
+//            DavPropertyNameIterator it = propertyNames.iterator();
+//            while (it.hasNext()) {
+//                DavPropertyName pn = it.nextPropertyName();
+//                boolean success = okSet.remove(pn);
+//                if (!success) {
+//                    throw new DavException(DavServletResponse.SC_MULTI_STATUS,
+//                            "PROPPATCH failed: Property name not present in multistatus response: " + pn);
+//                }
+//            }
+//        }
+//        if (!okSet.isEmpty()) {
+//            StringBuilder b = new StringBuilder();
+//            DavPropertyNameIterator it = okSet.iterator();
+//            while (it.hasNext()) {
+//                b.append(it.nextPropertyName().toString()).append("; ");
+//            }
+//            throw new DavException(DavServletResponse.SC_MULTI_STATUS,
+//                    "PROPPATCH failed: The following properties outside of the original request where set or removed: " + b.toString());
+//        }
+//        return true;
+    }
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpRebind.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpRebind.java
new file mode 100644
index 000000000..e72dea890
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpRebind.java
@@ -0,0 +1,54 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.bind.RebindInfo;
+
+/**
+ * Represents an HTTP REBIND request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc5842.html#rfc.section.6">RFC 5842, Section 6</a>
+ * @since 2.13.6
+ */
+public class HttpRebind extends BaseDavRequest {
+
+    public HttpRebind(URI uri, RebindInfo info) throws IOException {
+        super(uri);
+        super.setEntity(XmlEntity.create(info));
+    }
+
+    public HttpRebind(String uri, RebindInfo info) throws IOException {
+        this(URI.create(uri), info);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_REBIND;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_OK || statusCode == DavServletResponse.SC_CREATED;
+    }
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpReport.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpReport.java
new file mode 100644
index 000000000..efb20b6ca
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpReport.java
@@ -0,0 +1,66 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.header.DepthHeader;
+import org.apache.jackrabbit.webdav.version.report.ReportInfo;
+
+/**
+ * Represents an HTTP REPORT request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc3253.html#rfc.section.3.6">RFC 3253, Section 3.6</a>
+ * @since 2.13.6
+ */
+public class HttpReport extends BaseDavRequest {
+
+    private final boolean isDeep;
+
+    public HttpReport(URI uri, ReportInfo reportInfo) throws IOException {
+        super(uri);
+        DepthHeader dh = new DepthHeader(reportInfo.getDepth());
+        isDeep = reportInfo.getDepth() > DavConstants.DEPTH_0;
+        super.setHeader(dh.getHeaderName(), dh.getHeaderValue());
+        super.setEntity(XmlEntity.create(reportInfo));
+    }
+
+    public HttpReport(String uri, ReportInfo reportInfo) throws IOException {
+        this(URI.create(uri), reportInfo);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_REPORT;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        if (isDeep) {
+            return statusCode == DavServletResponse.SC_MULTI_STATUS;
+        } else {
+            return statusCode == DavServletResponse.SC_OK || statusCode == DavServletResponse.SC_MULTI_STATUS;
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpSearch.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpSearch.java
new file mode 100644
index 000000000..f230f2dfb
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpSearch.java
@@ -0,0 +1,54 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.search.SearchInfo;
+
+/**
+ * Represents an HTTP SEARCH request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc5323.html#rfc.section.2">RFC 5323, Section 2</a>
+ * @since 2.13.6
+ */
+public class HttpSearch extends BaseDavRequest {
+
+    public HttpSearch(URI uri, SearchInfo searchInfo) throws IOException {
+        super(uri);
+        super.setEntity(XmlEntity.create(searchInfo));
+    }
+
+    public HttpSearch(String uri, SearchInfo searchInfo) throws IOException {
+        this(URI.create(uri), searchInfo);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_SEARCH;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_MULTI_STATUS;
+    }
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpSubscribe.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpSubscribe.java
new file mode 100644
index 000000000..6bdbb7adc
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpSubscribe.java
@@ -0,0 +1,88 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.header.CodedUrlHeader;
+import org.apache.jackrabbit.webdav.header.DepthHeader;
+import org.apache.jackrabbit.webdav.header.TimeoutHeader;
+import org.apache.jackrabbit.webdav.observation.ObservationConstants;
+import org.apache.jackrabbit.webdav.observation.SubscriptionInfo;
+
+/**
+ * Represents an HTTP SUBSCRIBE request.
+ * <p>
+ * Note that "SUBSCRIBE" is a custom HTTP extension, not defined in a standards paper.
+ * @since 2.13.6
+ */
+public class HttpSubscribe extends BaseDavRequest {
+
+    public HttpSubscribe(URI uri, SubscriptionInfo info, String subscriptionId) throws IOException {
+        super(uri);
+        if (info == null) {
+            throw new IllegalArgumentException("SubscriptionInfo must not be null.");
+        }
+        // optional subscriptionId (only required to modify an existing
+        // subscription)
+        if (subscriptionId != null) {
+            CodedUrlHeader h = new CodedUrlHeader(ObservationConstants.HEADER_SUBSCRIPTIONID, subscriptionId);
+            super.setHeader(h.getHeaderName(), h.getHeaderValue());
+        }
+        // optional timeout header
+        long to = info.getTimeOut();
+        if (to != DavConstants.UNDEFINED_TIMEOUT) {
+            TimeoutHeader h = new TimeoutHeader(info.getTimeOut());
+            super.setHeader(h.getHeaderName(), h.getHeaderValue());
+        }
+        // always set depth header since value is boolean flag
+        DepthHeader dh = new DepthHeader(info.isDeep());
+        super.setHeader(dh.getHeaderName(), dh.getHeaderValue());
+        super.setEntity(XmlEntity.create(info));
+    }
+
+    public HttpSubscribe(String uri, SubscriptionInfo info, String subscriptionId) throws IOException {
+        this(URI.create(uri), info, subscriptionId);
+    }
+
+    public String getSubscriptionId(HttpResponse response) {
+        org.apache.http.Header sbHeader = response.getFirstHeader(ObservationConstants.HEADER_SUBSCRIPTIONID);
+        if (sbHeader != null) {
+            CodedUrlHeader cuh = new CodedUrlHeader(ObservationConstants.HEADER_SUBSCRIPTIONID, sbHeader.getValue());
+            return cuh.getCodedUrl();
+        }
+        else {
+            return null;
+        }
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_SUBSCRIBE;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_OK;
+    }
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnbind.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnbind.java
new file mode 100644
index 000000000..10e7f4a5b
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnbind.java
@@ -0,0 +1,54 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.bind.UnbindInfo;
+
+/**
+ * Represents an HTTP UNBIND request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc5842.html#rfc.section.5">RFC 5842, Section 5</a>
+ * @since 2.13.6
+ */
+public class HttpUnbind extends BaseDavRequest {
+
+    public HttpUnbind(URI uri, UnbindInfo info) throws IOException {
+        super(uri);
+        super.setEntity(XmlEntity.create(info));
+    }
+
+    public HttpUnbind(String uri, UnbindInfo info) throws IOException {
+        this(URI.create(uri), info);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_UNBIND;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_OK || statusCode == DavServletResponse.SC_NO_CONTENT;
+    }
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnlock.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnlock.java
new file mode 100644
index 000000000..aee347365
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnlock.java
@@ -0,0 +1,55 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.header.CodedUrlHeader;
+
+/**
+ * Represents an HTTP UNLOCK request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc4918.html#rfc.section.9.11">RFC 4918, Section 9.11</a>
+ * @since 2.13.6
+ */
+public class HttpUnlock extends BaseDavRequest {
+
+    public HttpUnlock(URI uri, String lockToken) {
+        super(uri);
+        CodedUrlHeader lth = new CodedUrlHeader(DavConstants.HEADER_LOCK_TOKEN, lockToken);
+        super.setHeader(lth.getHeaderName(), lth.getHeaderValue());
+    }
+
+    public HttpUnlock(String uri, String lockToken) {
+        this(URI.create(uri), lockToken);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_UNLOCK;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_OK || statusCode == DavServletResponse.SC_NO_CONTENT;
+    }
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnsubscribe.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnsubscribe.java
new file mode 100644
index 000000000..522f17fce
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnsubscribe.java
@@ -0,0 +1,53 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.observation.ObservationConstants;
+
+/**
+ * Represents an HTTP UNSUBSCRIBE request.
+ * <p>
+ * Note that "UNSUBSCRIBE" is a custom HTTP extension, not defined in a standards paper.
+ * @since 2.13.6
+ */
+public class HttpUnsubscribe extends BaseDavRequest {
+
+    public HttpUnsubscribe(URI uri, String subscriptionId) {
+        super(uri);
+        super.setHeader(ObservationConstants.HEADER_SUBSCRIPTIONID, subscriptionId);
+    }
+
+    public HttpUnsubscribe(String uri, String subscriptionId) {
+        this(URI.create(uri), subscriptionId);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_UNSUBSCRIBE;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_NO_CONTENT;
+    }
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUpdate.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUpdate.java
new file mode 100644
index 000000000..019a24fff
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUpdate.java
@@ -0,0 +1,54 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.version.UpdateInfo;
+
+/**
+ * Represents an HTTP UPDATE request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc3253.html#rfc.section.7.1">RFC 3253, Section 7.1</a>
+ * @since 2.13.6
+ */
+public class HttpUpdate extends BaseDavRequest {
+
+    public HttpUpdate(URI uri, UpdateInfo updateInfo) throws IOException {
+        super(uri);
+        super.setEntity(XmlEntity.create(updateInfo));
+    }
+
+    public HttpUpdate(String uri, UpdateInfo updateInfo) throws IOException {
+        this(URI.create(uri), updateInfo);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_UPDATE;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_MULTI_STATUS;
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpVersionControl.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpVersionControl.java
new file mode 100644
index 000000000..e23a601be
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpVersionControl.java
@@ -0,0 +1,51 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+
+/**
+ * Represents an HTTP VERSION-CONTROL request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc3253.html#rfc.section.3.5">RFC 3253, Section 3.5</a>
+ * @since 2.13.6
+ */
+public class HttpVersionControl extends BaseDavRequest {
+
+    public HttpVersionControl(URI uri) {
+        super(uri);
+    }
+
+    public HttpVersionControl(String uri) {
+        this(URI.create(uri));
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_VERSION_CONTROL;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_OK;
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/XmlEntity.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/XmlEntity.java
new file mode 100644
index 000000000..859bbe404
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/XmlEntity.java
@@ -0,0 +1,68 @@
+/*
+ * 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.jackrabbit.webdav.client.methods;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.entity.ContentType;
+import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+import org.xml.sax.SAXException;
+
+/**
+ * Utility methods for creating request entities from {@link Document}s or {@link XmlSerializable}s.
+ */
+public class XmlEntity {
+
+    private static Logger LOG = LoggerFactory.getLogger(XmlEntity.class);
+
+    private static ContentType CT = ContentType.create("application/xml", "UTF-8");
+
+    public static HttpEntity create(Document doc) throws IOException {
+        try {
+            ByteArrayOutputStream xml = new ByteArrayOutputStream();
+            DomUtil.transformDocument(doc, xml);
+            return new ByteArrayEntity(xml.toByteArray(), CT);
+        } catch (TransformerException ex) {
+            LOG.error(ex.getMessage());
+            throw new IOException(ex);
+        } catch (SAXException ex) {
+            LOG.error(ex.getMessage());
+            throw new IOException(ex);
+        }
+    }
+
+    public static HttpEntity create(XmlSerializable payload) throws IOException {
+        try {
+            Document doc = DomUtil.createDocument();
+            doc.appendChild(payload.toXml(doc));
+            return create(doc);
+        } catch (ParserConfigurationException ex) {
+            LOG.error(ex.getMessage());
+            throw new IOException(ex);
+        }
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/package-info.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/package-info.java
new file mode 100644
index 000000000..b667d39c6
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/client/methods/package-info.java
@@ -0,0 +1,31 @@
+/*
+ * 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.
+ */
+
+/**
+ * Provides classes for use with the Apache HttpClient, supporting WebDAV
+ * request methods.
+ * <p>
+ * This version also contains classes for use with the obsolete "Commons
+ * HttpClient"; they have been marked "deprecated" and will be removed in the
+ * next major release.
+ * 
+ * @see <a href="https://issues.apache.org/jira/browse/JCR-2406">JCR-2406</a>
+ * @see <a href=
+ *      "https://hc.apache.org/httpcomponents-client-4.5.x/">https://hc.apache.org/httpcomponents-client-4.5.x/</a>
+ */
+@org.osgi.annotation.versioning.Version("2.0.0")
+package org.apache.jackrabbit.webdav.client.methods;
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/CodedUrlHeader.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/CodedUrlHeader.java
new file mode 100644
index 000000000..edbe8aed9
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/CodedUrlHeader.java
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.webdav.header;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import jakarta.servlet.http.HttpServletRequest;
+
+/**
+ * <code>CodedUrlHeader</code>...
+ */
+public class CodedUrlHeader implements Header {
+
+    private static Logger log = LoggerFactory.getLogger(CodedUrlHeader.class);
+
+    private final String headerName;
+    private final String headerValue;
+
+    public CodedUrlHeader(String headerName, String headerValue) {
+        this.headerName = headerName;
+        if (headerValue != null && !(headerValue.startsWith("<") && headerValue.endsWith(">"))) {
+            headerValue = "<" + headerValue + ">";
+        }
+        this.headerValue = headerValue;
+    }
+
+    /**
+     * Return the name of the header
+     *
+     * @return header name
+     * @see Header#getHeaderName()
+     */
+    public String getHeaderName() {
+	return headerName;
+    }
+
+    /**
+     * Return the value of the header
+     *
+     * @return value
+     * @see Header#getHeaderValue()
+     */
+    public String getHeaderValue() {
+        return headerValue;
+    }
+
+    /**
+     * Returns the token present in the header value or <code>null</code>.
+     * If the header contained multiple tokens separated by ',' the first value
+     * is returned.
+     *
+     * @return token present in the CodedURL header or <code>null</code> if
+     * the header is not present.
+     * @see #getCodedUrls()
+     */
+    public String getCodedUrl() {
+        String[] codedUrls = getCodedUrls();
+        return (codedUrls != null) ? codedUrls[0] : null;
+    }
+
+    /**
+     * Return an array of coded urls as present in the header value or <code>null</code> if
+     * no value is present.
+     *
+     * @return array of coded urls
+     */
+    public String[] getCodedUrls() {
+        String[] codedUrls = null;
+        if (headerValue != null) {
+            String[] values = headerValue.split(",");
+            codedUrls = new String[values.length];
+            for (int i = 0; i < values.length; i++) {
+                int p1 = values[i].indexOf('<');
+                if (p1<0) {
+                    throw new IllegalArgumentException("Invalid CodedURL header value:" + values[i]);
+                }
+                int p2 = values[i].indexOf('>', p1);
+                if (p2<0) {
+                    throw new IllegalArgumentException("Invalid CodedURL header value:" + values[i]);
+                }
+                codedUrls[i] = values[i].substring(p1+1, p2);
+            }
+	}
+        return codedUrls;
+    }
+
+    /**
+     * Retrieves the header with the given name and builds a new <code>CodedUrlHeader</code>.
+     *
+     * @param request
+     * @param headerName
+     * @return new <code>CodedUrlHeader</code> instance
+     */
+    public static CodedUrlHeader parse(HttpServletRequest request, String headerName) {
+        String headerValue = request.getHeader(headerName);
+        return new CodedUrlHeader(headerName, headerValue);
+    }
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/DepthHeader.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/DepthHeader.java
new file mode 100644
index 000000000..9b74194a5
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/DepthHeader.java
@@ -0,0 +1,128 @@
+/*
+ * 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.jackrabbit.webdav.header;
+
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import jakarta.servlet.http.HttpServletRequest;
+
+/**
+ * <code>DepthHeader</code>...
+ */
+public class DepthHeader implements Header, DavConstants {
+
+    private static Logger log = LoggerFactory.getLogger(DepthHeader.class);
+
+    private final int depth;
+
+    /**
+     * Create a new <code>DepthHeader</code> from the given integer.
+     *
+     * @param depth
+     */
+    public DepthHeader(int depth) {
+	if (depth == DEPTH_0 || depth == DEPTH_1 || depth == DEPTH_INFINITY) {
+	    this.depth = depth;
+	} else {
+	    throw new IllegalArgumentException("Invalid depth: " + depth);
+	}
+    }
+
+    /**
+     * Create a new <code>DepthHeader</code> with either value {@link #DEPTH_0 0}
+     * or {@link #DEPTH_INFINITY infinity}.
+     *
+     * @param isDeep
+     */
+    public DepthHeader(boolean isDeep) {
+        this.depth = (isDeep) ? DEPTH_INFINITY : DEPTH_0;
+    }
+
+    /**
+     * @return integer representation of the depth indicated by the given header.
+     */
+    public int getDepth() {
+        return depth;
+    }
+
+    /**
+     * Return {@link DavConstants#HEADER_DEPTH Depth}
+     *
+     * @return {@link DavConstants#HEADER_DEPTH Depth}
+     * @see DavConstants#HEADER_DEPTH
+     * @see Header#getHeaderName()
+     */
+    public String getHeaderName() {
+	return DavConstants.HEADER_DEPTH;
+    }
+
+    /**
+     * Returns the header value.
+     *
+     * @return header value
+     * @see Header#getHeaderValue()
+     */
+    public String getHeaderValue() {
+        if (depth == DavConstants.DEPTH_0 || depth == DavConstants.DEPTH_1) {
+	    return String.valueOf(depth);
+	} else {
+	    return DavConstants.DEPTH_INFINITY_S;
+	}
+    }
+
+    /**
+     * Retrieve the Depth header from the given request object and parse the
+     * value. If no header is present or the value is empty String, the
+     * defaultValue is used ot build a new <code>DepthHeader</code> instance.
+     *
+     * @param request
+     * @param defaultValue
+     * @return a new <code>DepthHeader</code> instance
+     */
+    public static DepthHeader parse(HttpServletRequest request, int defaultValue) {
+        String headerValue = request.getHeader(HEADER_DEPTH);
+        if (headerValue == null || "".equals(headerValue)) {
+	    return new DepthHeader(defaultValue);
+	} else {
+	    return new DepthHeader(depthToInt(headerValue));
+	}
+    }
+
+    /**
+     * Convert the String depth value to an integer.
+     *
+     * @param depth
+     * @return integer representation of the given depth String
+     * @throws IllegalArgumentException if the String does not represent a valid
+     * depth.
+     */
+    private static int depthToInt(String depth) {
+        int d;
+	if (depth.equalsIgnoreCase(DavConstants.DEPTH_INFINITY_S)) {
+	    d = DavConstants.DEPTH_INFINITY;
+	} else if (depth.equals(DavConstants.DEPTH_0+"")) {
+	    d = DavConstants.DEPTH_0;
+	} else if (depth.equals(DavConstants.DEPTH_1+"")) {
+	    d = DavConstants.DEPTH_1;
+	} else {
+	    throw new IllegalArgumentException("Invalid depth value: " + depth);
+	}
+        return d;
+    }
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/FieldValueParser.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/FieldValueParser.java
new file mode 100644
index 000000000..6f3052168
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/FieldValueParser.java
@@ -0,0 +1,55 @@
+/*
+ * 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.jackrabbit.webdav.header;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class FieldValueParser {
+
+    /**
+     * Tokenize lists of token and quoted-url
+     * @param list field value
+     */
+    public static List<String> tokenizeList(String list) {
+
+        String[] split = list.split(",");
+        if (split.length == 1) {
+            return Collections.singletonList(split[0].trim());
+        } else {
+            List<String> result = new ArrayList<String>();
+            String inCodedUrl = null;
+            for (String t : split) {
+                String trimmed = t.trim();
+                // handle quoted-url containing ","
+                if (trimmed.startsWith("<") && !trimmed.endsWith(">")) {
+                    inCodedUrl = trimmed + ",";
+                } else if (inCodedUrl != null && trimmed.endsWith(">")) {
+                    inCodedUrl += trimmed;
+                    result.add(inCodedUrl);
+                    inCodedUrl = null;
+                } else {
+                    if (trimmed.length() != 0) {
+                        result.add(trimmed);
+                    }
+                }
+            }
+            return Collections.unmodifiableList(result);
+        }
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/Header.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/Header.java
new file mode 100644
index 000000000..f61a07e90
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/Header.java
@@ -0,0 +1,27 @@
+/*
+ * 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.jackrabbit.webdav.header;
+
+/**
+ * <code>Header</code>...
+ */
+public interface Header {
+
+    public String getHeaderName();
+
+    public String getHeaderValue();
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/IfHeader.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/IfHeader.java
new file mode 100644
index 000000000..43ff4dbac
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/IfHeader.java
@@ -0,0 +1,905 @@
+/*
+ * 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.jackrabbit.webdav.header;
+
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import jakarta.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * The <code>IfHeader</code> class represents the state lists defined
+ * through the HTTP <em>If</em> header, which is specified in RFC 2518 as
+ * follows :
+ * <pre>
+     If = "If" ":" ( 1*No-tag-list | 1*Tagged-list)
+     No-tag-list = List
+     Tagged-list = Resource 1*List
+     Resource = Coded-URL
+     List = "(" 1*(["Not"](State-etag | "[" entity-tag "]")) ")"
+     State-etag = Coded-URL
+     Coded-URL = "&lt;" absoluteURI "&gt;"
+ * </pre>
+ * <p>
+ * Reformulating this specification into proper EBNF as specified by N. Wirth
+ * we get the following productions, which map to the parse METHODS of this
+ * class. Any whitespace is ignored except for white space surrounding and
+ * within words which is considered significant.
+ * <pre>
+     If = "If:" ( Tagged | Untagged ).
+     Tagged = { "&lt;" Word "&gt;" Untagged } .
+     Untagged = { "(" IfList ")" } .
+     IfList = { [ "Not" ] ( ("&lt;" Word "&gt;" ) | ( "[" Word "]" ) ) } .
+     Word = characters .
+ * </pre>
+ * <p>
+ * An <em>If</em> header either contains untagged <em>IfList</em> entries or
+ * tagged <em>IfList</em> entries but not a mixture of both. An <em>If</em>
+ * header containing tagged entries is said to be of <em>tagged</em> type while
+ * an <em>If</em> header containing untagged entries is said to be of
+ * <em>untagged</em> type.
+ * <p>
+ * An <em>IfList</em> is a list of tokens - words enclosed in <em>&lt; &gt;</em>
+ * - and etags - words enclosed in <em>[ ]</em>. An <em>IfList</em> matches a
+ * (token, etag) tuple if all entries in the list match. If an entry in the list
+ * is prefixed with the word <em>Not</em> (parsed case insensitively) the entry
+ * must not match the concrete token or etag.
+ * <p>
+ * Example: The <em>ifList</em> <code>(&lt;token&gt; [etag])</code> only matches
+ * if the concret token has the value <code>token</code> and the conrete etag
+ * has the value <code>etag</code>. On the other hand, the <em>ifList</em>
+ * <code>(Not &lt;notoken&gt;)</code> matches any token which is not
+ * <code>notoken</code> (in this case the concrete value of the etag is
+ * not taken into consideration).
+ *
+ * @author Felix Meschberger
+ */
+public class IfHeader implements Header {
+
+    /**
+     * default logger
+     */
+    private static final Logger log = LoggerFactory.getLogger(IfHeader.class);
+
+    /**
+     * The string representation of the header value
+     */
+    private final String headerValue;
+
+    /**
+     * The list of untagged state entries
+     */
+    private final IfHeaderInterface ifHeader;
+
+    /**
+     * The list of all positive tokens present in the If header.
+     */
+    private List<String> allTokens = new ArrayList<String>();
+    /**
+     * The list of all NOT tokens present in the If header.
+     */
+    private List<String> allNotTokens = new ArrayList<String>();
+
+    private String uriPrefix;
+
+    /**
+     * Create a Untagged <code>IfHeader</code> if the given lock tokens.
+     *
+     * @param tokens
+     */
+    public IfHeader(String[] tokens) {
+        allTokens.addAll(Arrays.asList(tokens));
+        StringBuffer b = new StringBuffer();
+        for (String token : tokens) {
+            b.append("(").append("<");
+            b.append(token);
+            b.append(">").append(")");
+        }
+        headerValue = b.toString();
+        ifHeader = parse();
+    }
+
+    /**
+     * Parses the <em>If</em> header and creates and internal representation
+     * which is easy to query.
+     *
+     * @param req The request object
+     */
+    public IfHeader(HttpServletRequest req) {
+        String host = req.getHeader("Host");
+        String scheme = req.getScheme();
+        uriPrefix = scheme + "://" + host + req.getContextPath();
+        headerValue = req.getHeader(DavConstants.HEADER_IF);
+        ifHeader = parse();
+    }
+
+    /**
+     * Return {@link DavConstants#HEADER_IF If}
+     *
+     * @return {@link DavConstants#HEADER_IF If}
+     * @see DavConstants#HEADER_IF
+     */
+    public String getHeaderName() {
+        return DavConstants.HEADER_IF;
+    }
+
+    /**
+     * Return the String representation of the If header present on
+     * the given request or <code>null</code>.
+     *
+     * @return If header value as String or <code>null</code>.
+     */
+    public String getHeaderValue() {
+        return headerValue;
+    }
+
+    /**
+     * Returns true if an If header was present in the given request. False otherwise.
+     *
+     * @return  true if an If header was present.
+     */
+    public boolean hasValue() {
+        return ifHeader != null;
+    }
+
+    /**
+     * Tries to match the contents of the <em>If</em> header with the given
+     * token and etag values with the restriction to only check for the tag.
+     * <p>
+     * If the <em>If</em> header is of untagged type, the untagged <em>IfList</em>
+     * is matched against the token and etag given: A match of the token and
+     * etag is found if at least one of the <em>IfList</em> entries match the
+     * token and etag tuple.
+     *
+     * @param tag The tag to identify the <em>IfList</em> to match the token
+     * and etag against.
+     * @param token The token to compare.
+     * @param etag The ETag value to compare.
+     *
+     * @return If the <em>If</em> header is of untagged type the result is
+     *      <code>true</code> if any of the <em>IfList</em> entries matches
+     *      the token and etag values. For tagged type <em>If</em> header the
+     *      result is <code>true</code> if either no entry for the given tag
+     *      exists in the <em>If</em> header or if the <em>IfList</em> for the
+     *      given tag matches the token and etag given.
+     */
+    public boolean matches(String tag, String token, String etag) {
+        if (ifHeader == null) {
+            log.debug("matches: No If header, assume match");
+            return true;
+        } else {
+            return ifHeader.matches(tag, token, etag);
+        }
+    }
+
+    /**
+     * @return an iterator over all tokens present in the if header, that were
+     * not denied by a leading NOT statement.
+     */
+    public Iterator<String> getAllTokens() {
+        return allTokens.iterator();
+    }
+
+    /**
+     * @return an iterator over all NOT tokens present in the if header, that
+     * were explicitly denied.
+     */
+    public Iterator<String> getAllNotTokens() {
+        return allNotTokens.iterator();
+    }
+
+    /**
+     * Parse the original header value and build the internal IfHeaderInterface
+     * object that is easy to query.
+     */
+    private IfHeaderInterface parse() {
+        IfHeaderInterface ifHeader;
+        if (headerValue != null && headerValue.length() > 0) {
+            StringReader reader = null;
+            int firstChar = 0;
+
+            try {
+                reader = new StringReader(headerValue);
+                // get the first character to decide - expect '(' or '<'
+                try {
+                    reader.mark(1);
+                    firstChar = readWhiteSpace(reader);
+                    reader.reset();
+                } catch (IOException ignore) {
+                    // may be thrown according to API but is only thrown by the
+                    // StringReader class if the reader is already closed.
+                }
+
+                if (firstChar == '(') {
+                    ifHeader = parseUntagged(reader);
+                } else if (firstChar == '<') {
+                    ifHeader = parseTagged(reader);
+                } else {
+                    logIllegalState("If", firstChar, "(<", null);
+                    ifHeader = null;
+                }
+
+            } finally  {
+                if (reader != null) {
+                    reader.close();
+                }
+            }
+
+        } else {
+            log.debug("IfHeader: No If header in request");
+            ifHeader = null;
+        }
+        return ifHeader;
+    }
+
+    //---------- internal IF header parser -------------------------------------
+    /**
+     * Parses a tagged type <em>If</em> header. This method implements the
+     * <em>Tagged</em> production given in the class comment :
+     * <pre>
+         Tagged = { "<" Word ">" Untagged } .
+     * </pre>
+     *
+     * @param reader
+     * @return
+     */
+    private IfHeaderMap parseTagged(StringReader reader) {
+        IfHeaderMap map = new IfHeaderMap();
+        try {
+            while (true) {
+                // read next non-white space
+                int c = readWhiteSpace(reader);
+                if (c < 0) {
+                    // end of input, no more entries
+                    break;
+                } else if (c == '<') {
+                    // start a tag with an IfList
+                    String resource = readWord(reader, '>');
+                    if (resource != null) {
+                        // go to untagged after reading the resource
+                        map.put(resource, parseUntagged(reader));
+                    } else {
+                        break;
+                    }
+                } else {
+                    // unexpected character
+                    // catchup to end of input or start of a tag
+                    logIllegalState("Tagged", c, "<", reader);
+                }
+            }
+        } catch (IOException ioe) {
+            log.error("parseTagged: Problem parsing If header: "+ioe.toString());
+        }
+
+        return map;
+    }
+
+    /**
+     * Parses an untagged type <em>If</em> header. This method implements the
+     * <em>Untagged</em> production given in the class comment :
+     * <pre>
+         Untagged = { "(" IfList ")" } .
+     * </pre>
+     *
+     * @param reader The <code>StringReader</code> to read from for parsing
+     *
+     * @return An <code>ArrayList</code> of {@link IfList} entries.
+     */
+    private IfHeaderList parseUntagged(StringReader reader) {
+        IfHeaderList list = new IfHeaderList();
+        try {
+            while (true) {
+                // read next non white space
+                reader.mark(1);
+                int c = readWhiteSpace(reader);
+                if (c < 0) {
+                    // end of input, no more IfLists
+                    break;
+
+                } else if (c == '(') {
+                    // start of an IfList, parse
+                    list.add(parseIfList(reader));
+
+                } else if (c == '<') {
+                    // start of a tag, return current list
+                    reader.reset();
+                    break;
+
+                } else {
+                    // unexpected character
+                    // catchup to end of input or start of an IfList
+                    logIllegalState("Untagged", c, "(", reader);
+                }
+            }
+        } catch (IOException ioe) {
+            log.error("parseUntagged: Problem parsing If header: "+ioe.toString());
+        }
+        return list;
+    }
+
+    /**
+     * Parses an <em>IfList</em> in the <em>If</em> header. This method
+     * implements the <em>Tagged</em> production given in the class comment :
+     * <pre>
+         IfList = { [ "Not" ] ( ("<" Word ">" ) | ( "[" Word "]" ) ) } .
+     * </pre>
+     *
+     * @param reader The <code>StringReader</code> to read from for parsing
+     *
+     * @return The {@link IfList} for the input <em>IfList</em>.
+     *
+     * @throws IOException if a problem occurs during reading.
+     */
+    private IfList parseIfList(StringReader reader) throws IOException {
+        IfList res = new IfList();
+        boolean positive = true;
+        String word;
+
+        ReadLoop:
+        while (true) {
+            int nextChar = readWhiteSpace(reader);
+            switch (nextChar) {
+                case 'N':
+                case 'n':
+                    // read not
+
+                    // check whether o or O
+                    int not = reader.read();
+                    if (not != 'o' && not != 'O') {
+                        logIllegalState("IfList-Not", not, "o", null);
+                        break;
+                    }
+
+                    // check whether t or T
+                    not = reader.read();
+                    if (not !='t' && not != 'T') {
+                        logIllegalState("IfList-Not", not, "t", null);
+                        break;
+                    }
+
+                    // read Not ok
+                    positive = false;
+                    break;
+
+                case '<':
+                    // state token
+                    word = readWord(reader, '>');
+                    if (word != null) {
+                        res.add(new IfListEntryToken(word, positive));
+                        // also add the token to the list of all tokens
+                        if (positive) {
+                            allTokens.add(word);
+                        } else {
+                            allNotTokens.add(word);
+                        }
+                        positive = true;
+                    }
+                    break;
+
+                case '[':
+                    // etag
+                    word = readWord(reader, ']');
+                    if (word != null) {
+                        res.add(new IfListEntryEtag(word, positive));
+                        positive = true;
+                    }
+                    break;
+
+                case ')':
+                    // correct end of list, end the loop
+                    log.debug("parseIfList: End of If list, terminating loop");
+                    break ReadLoop;
+
+                default:
+                    logIllegalState("IfList", nextChar, "nN<[)", reader);
+
+                    // abort loop if EOF
+                    if (nextChar < 0) {
+                        break ReadLoop;
+                    }
+
+                    break;
+            }
+        }
+
+        // return the current list anyway
+        return res;
+    }
+
+    /**
+     * Returns the first non-whitespace character from the reader or -1 if
+     * the end of the reader is encountered.
+     *
+     * @param reader The <code>Reader</code> to read from
+     *
+     * @return The first non-whitespace character or -1 in case of EOF.
+     *
+     * @throws IOException if a problem occurs during reading.
+     */
+    private int readWhiteSpace(Reader reader) throws IOException {
+        int c = reader.read();
+        while (c >= 0 && Character.isWhitespace((char) c)) {
+             c = reader.read();
+        }
+        return c;
+    }
+
+    /**
+     * Reads from the input until the end character is encountered and returns
+     * the string up to but not including this end character. If the end of input
+     * is reached before reading the end character <code>null</code> is
+     * returned.
+     * <p>
+     * Note that this method does not support any escaping.
+     *
+     * @param reader The <code>Reader</code> to read from
+     * @param end The ending character limiting the word.
+     *
+     * @return The string read up to but not including the ending character or
+     *      <code>null</code> if the end of input is reached before the ending
+     *      character has been read.
+     *
+     * @throws IOException if a problem occurs during reading.
+     */
+    private String readWord(Reader reader, char end) throws IOException {
+        StringBuffer buf = new StringBuffer();
+
+        // read the word value
+        int c = reader.read();
+        for (; c >= 0 && c != end; c=reader.read()) {
+            buf.append((char) c);
+        }
+
+        // check whether we succeeded
+        if (c < 0) {
+            log.error("readWord: Unexpected end of input reading word");
+            return null;
+        }
+
+        // build the string and return it
+        return buf.toString();
+    }
+
+    /**
+     * Logs an unexpected character with the corresponding state and list of
+     * expected characters. If the reader parameter is not null, characters
+     * are read until either the end of the input is reached or any of the
+     * characters in the expChar string is read.
+     *
+     * @param state The name of the current parse state. This method logs this
+     *      name in the message. The intended value would probably be the
+     *      name of the EBNF production during which the error occurs.
+     * @param effChar The effective character read.
+     * @param expChar The list of characters acceptable in the current state.
+     * @param reader The reader to be caught up to any of the expected
+     *      characters. If <code>null</code> the input is not caught up to
+     *      any of the expected characters (of course ;-).
+     */
+    private void logIllegalState(String state, int effChar, String expChar,
+                                 StringReader reader) {
+
+        // format the effective character to be logged
+        String effString = (effChar < 0) ? "<EOF>" : String.valueOf((char) effChar);
+
+        // log the error
+        log.error("logIllegalState: Unexpected character '"+effString+"' in state "+state+", expected any of "+expChar);
+
+        // catch up if a reader is given
+        if (reader != null && effChar >= 0) {
+            try {
+                log.debug("logIllegalState: Catch up to any of "+expChar);
+                do {
+                    reader.mark(1);
+                    effChar = reader.read();
+                } while (effChar >= 0 && expChar.indexOf(effChar) < 0);
+                if (effChar >= 0) {
+                    reader.reset();
+                }
+            } catch (IOException ioe) {
+                log.error("logIllegalState: IO Problem catching up to any of "+expChar);
+            }
+        }
+    }
+
+    //---------- internal If header structure ----------------------------------
+
+    /**
+     * The <code>IfListEntry</code> abstract class is the base class for
+     * entries in an <em>IfList</em> production. This abstract base class
+     * provides common functionality to both types of entries, namely tokens
+     * enclosed in angle brackets (<code>&lt; &gt;</code>) and etags enclosed
+     * in square brackets (<code>[ ]</code>).
+     */
+    private static abstract class IfListEntry {
+
+        /**
+         * The entry string value - the semantics of this value depends on the
+         * implementing class.
+         */
+        protected final String value;
+
+        /** Flag to indicate, whether this is a positive match or not */
+        protected final boolean positive;
+
+        /** The cached result of the {@link #toString} method. */
+        protected String stringValue;
+
+        /**
+         * Sets up the final fields of this abstract class. The meaning of
+         * value parameter depends solely on the implementing class. From the
+         * point of view of this abstract class, it is simply a string value.
+         *
+         * @param value The string value of this instance
+         * @param positive <code>true</code> if matches are positive
+         */
+        protected IfListEntry(String value, boolean positive) {
+            this.value = value;
+            this.positive = positive;
+        }
+
+        /**
+         * Matches the value from the parameter to the internal string value.
+         * If the parameter and the {@link #value} field match, the method
+         * returns <code>true</code> for positive matches and <code>false</code>
+         * for negative matches.
+         * <p>
+         * This helper method can be called by implementations to evaluate the
+         * concrete match on the correct value parameter. See
+         * {@link #match(String, String)} for the external API method.
+         *
+         * @param value The string value to compare to the {@link #value}
+         *      field.
+         *
+         * @return <code>true</code> if the value parameter and the
+         *      {@link #value} field match and the {@link #positive} field is
+         *      <code>true</code> or if the values do not match and the
+         *      {@link #positive} field is <code>false</code>.
+         */
+        protected boolean match(String value) {
+            return positive == this.value.equals(value);
+        }
+
+        /**
+         * Matches the entry's value to the the token or etag. Depending on the
+         * concrete implementation, only one of the parameters may be evaluated
+         * while the other may be ignored.
+         * <p>
+         * Implementing METHODS may call the helper method {@link #match(String)}
+         * for the actual matching.
+         *
+         * @param token The token value to compare
+         * @param etag The etag value to compare
+         *
+         * @return <code>true</code> if the token/etag matches the <em>IfList</em>
+         *      entry.
+         */
+        public abstract boolean match(String token, String etag);
+
+        /**
+         * Returns a short type name for the implementation. This method is
+         * used by the {@link #toString} method to build the string representation
+         * if the instance.
+         *
+         * @return The type name of the implementation.
+         */
+        protected abstract String getType();
+
+        /**
+         * Returns the value of this entry.
+         *
+         * @return the value
+         */
+        protected String getValue() {
+            return value;
+        }
+
+        /**
+         * Returns the String representation of this entry. This method uses the
+         * {@link #getType} to build the string representation.
+         *
+         * @return the String representation of this entry.
+         */
+        @Override
+        public String toString() {
+            if (stringValue == null) {
+                stringValue = getType() + ": " + (positive?"":"!") + value;
+            }
+            return stringValue;
+        }
+    }
+
+    /**
+     * The <code>IfListEntryToken</code> extends the {@link IfListEntry}
+     * abstract class to represent an entry for token matching.
+     */
+    private static class IfListEntryToken extends IfListEntry {
+
+        /**
+         * Creates a token matching entry.
+         *
+         * @param token The token value pertinent to this instance.
+         * @param positive <code>true</code> if this is a positive match entry.
+         */
+        IfListEntryToken(String token, boolean positive) {
+            super(token, positive);
+        }
+
+        /**
+         * Matches the token parameter to the stored token value and returns
+         * <code>true</code> if the values match and if the match is positive.
+         * <code>true</code> is also returned for negative matches if the values
+         * do not match.
+         *
+         * @param token The token value to compare
+         * @param etag The etag value to compare, which is ignored in this
+         *      implementation.
+         *
+         * @return <code>true</code> if the token matches the <em>IfList</em>
+         *      entry's token value.
+         */
+        @Override
+        public boolean match(String token, String etag) {
+            return token == null || super.match(token);
+        }
+
+        /**
+         * Returns the type name of this implementation, which is fixed to
+         * be <em>Token</em>.
+         *
+         * @return The fixed string <em>Token</em> as the type name.
+         */
+        @Override
+        protected String getType() {
+            return "Token";
+        }
+    }
+
+    /**
+     * The <code>IfListEntryToken</code> extends the {@link IfListEntry}
+     * abstract class to represent an entry for etag matching.
+     */
+    private static class IfListEntryEtag extends IfListEntry {
+
+        /**
+         * Creates an etag matching entry.
+         *
+         * @param etag The etag value pertinent to this instance.
+         * @param positive <code>true</code> if this is a positive match entry.
+         */
+        IfListEntryEtag(String etag, boolean positive) {
+            super(etag, positive);
+        }
+
+        /**
+         * Matches the etag parameter to the stored etag value and returns
+         * <code>true</code> if the values match and if the match is positive.
+         * <code>true</code> is also returned for negative matches if the values
+         * do not match.
+         *
+         * @param token The token value to compare, which is ignored in this
+         *      implementation.
+         * @param etag The etag value to compare
+         *
+         * @return <code>true</code> if the etag matches the <em>IfList</em>
+         *      entry's etag value.
+         */
+        @Override
+        public boolean match(String token, String etag) {
+            return super.match(etag);
+        }
+
+        /**
+         * Returns the type name of this implementation, which is fixed to
+         * be <em>ETag</em>.
+         *
+         * @return The fixed string <em>ETag</em> as the type name.
+         */
+        @Override
+        protected String getType() {
+            return "ETag";
+        }
+    }
+
+    /**
+     * The <code>IfList</code> class extends the <code>ArrayList</code> class
+     * with the limitation to only support adding {@link IfListEntry} objects
+     * and adding a {@link #match} method.
+     * <p>
+     * This class is a container for data contained in the <em>If</em>
+     * production <em>IfList</em>
+     * <pre>
+         IfList = { [ "Not" ] ( ("&lt;" Word "&gt;" ) | ( "[" Word "]" ) ) } .
+     * </pre>
+     * <p>
+     */
+    private static class IfList extends ArrayList<IfListEntry> {
+
+        /**
+         * Adds the {@link IfListEntry} at the end of the list.
+         *
+         * @param entry The {@link IfListEntry} to add to the list
+         *
+         * @return <code>true</code> (as per the general contract of Collection.add).
+         */
+        @Override
+        public boolean add(IfListEntry entry) {
+            return super.add(entry);
+        }
+
+        /**
+         * Adds the {@link IfListEntry} at the indicated position of the list.
+         *
+         * @param index
+         * @param entry
+         *
+         * @throws IndexOutOfBoundsException if index is out of range
+         *      <code>(index &lt; 0 || index &gt; size())</code>.
+         */
+        @Override
+        public void add(int index, IfListEntry entry) {
+            super.add(index, entry);
+        }
+
+        /**
+         * Returns <code>true</code> if all {@link IfListEntry} objects in the
+         * list match the given token and etag. If the list is entry, it is
+         * considered to match the token and etag.
+         *
+         * @param token The token to compare.
+         * @param etag The etag to compare.
+         *
+         * @return <code>true</code> if all entries in the list match the
+         *      given tag and token.
+         */
+        public boolean match(String token, String etag) {
+            log.debug("match: Trying to match token="+token+", etag="+etag);
+            for (int i=0; i < size(); i++) {
+                IfListEntry ile = get(i);
+                if (!ile.match(token, etag)) {
+                    log.debug("match: Entry "+i+"-"+ile+" does not match");
+                    return false;
+                }
+            }
+            // invariant: all entries matched
+
+            return true;
+        }
+    }
+
+    /**
+     * The <code>IfHeaderInterface</code> interface abstracts away the difference of
+     * tagged and untagged <em>If</em> header lists. The single method provided
+     * by this interface is to check whether a request may be applied to a
+     * resource with given token and etag.
+     */
+    private static interface IfHeaderInterface {
+
+        /**
+         * Matches the resource, token, and etag against this
+         * <code>IfHeaderInterface</code> instance.
+         *
+         * @param resource The resource to match this instance against. This
+         *      must be absolute URI of the resource as defined in Section 3
+         *      (URI Syntactic Components) of RFC 2396 Uniform Resource
+         *      Identifiers (URI): Generic Syntax.
+         * @param token The resource's lock token to match
+         * @param etag The resource's etag to match
+         *
+         * @return <code>true</code> if the header matches the resource with
+         *      token and etag, which means that the request is applicable
+         *      to the resource according to the <em>If</em> header.
+         */
+        public boolean matches(String resource, String token, String etag);
+    }
+
+    /**
+     * The <code>IfHeaderList</code> class implements the {@link IfHeaderInterface}
+     * interface to support untagged lists of {@link IfList}s. This class
+     * implements the data container for the production :
+     * <pre>
+         Untagged = { "(" IfList ")" } .
+     * </pre>
+     */
+    private static class IfHeaderList extends ArrayList<IfList> implements IfHeaderInterface {
+
+        /**
+         * Matches a list of {@link IfList}s against the token and etag. If any of
+         * the {@link IfList}s matches, the method returns <code>true</code>.
+         * On the other hand <code>false</code> is only returned if non of the
+         * {@link IfList}s match.
+         *
+         * @param resource The resource to match, which is ignored by this
+         *      implementation. A value of <code>null</code> is therefor
+         *      acceptable.
+         * @param token The token to compare.
+         * @param etag The ETag value to compare.
+         *
+         * @return <code>True</code> if any of the {@link IfList}s matches the token
+         *      and etag, else <code>false</code> is returned.
+         */
+        public boolean matches(String resource, String token, String etag) {
+            log.debug("matches: Trying to match token="+token+", etag="+etag);
+
+            for (IfList il : this) {
+                if (il.match(token, etag)) {
+                    log.debug("matches: Found match with " + il);
+                    return true;
+                }
+            }
+            // invariant: no match found
+
+            return false;
+        }
+    }
+
+    /**
+     * The <code>IfHeaderMap</code> class implements the {@link IfHeaderInterface}
+     * interface to support tagged lists of {@link IfList}s. This class
+     * implements the data container for the production :
+     * <pre>
+         Tagged = { "&lt;" Word "&gt;" "(" IfList ")" } .
+     * </pre>
+     */
+    private class IfHeaderMap extends HashMap<String, IfHeaderList> implements IfHeaderInterface {
+
+        /**
+         * Matches the token and etag for the given resource. If the resource is
+         * not mentioned in the header, a match is assumed and <code>true</code>
+         * is returned in this case.
+         *
+         * @param resource The absolute URI of the resource for which to find
+         *      a match.
+         * @param token The token to compare.
+         * @param etag The etag to compare.
+         *
+         * @return <code>true</code> if either no entry exists for the resource
+         *      or if the entry for the resource matches the token and etag.
+         */
+        public boolean matches(String resource, String token, String etag) {
+            log.debug("matches: Trying to match resource="+resource+", token="+token+","+etag);
+
+            String uri;
+            String path;
+            if (resource.startsWith("/")) {
+                path = resource;
+                uri = IfHeader.this.uriPrefix + resource;
+            } else {
+                path = resource.substring(IfHeader.this.uriPrefix.length());
+                uri = resource;
+            }
+            IfHeaderList list = get(path);
+            if (list == null) {
+                list = get(uri);
+            }
+            if (list == null) {
+                log.debug("matches: No entry for tag "+resource+", assuming mismatch");
+                return false;
+            } else {
+                return list.matches(resource, token, etag);
+            }
+        }
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/LabelHeader.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/LabelHeader.java
new file mode 100644
index 000000000..723df11ec
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/LabelHeader.java
@@ -0,0 +1,61 @@
+/*
+ * 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.jackrabbit.webdav.header;
+
+import org.apache.jackrabbit.webdav.WebdavRequest;
+import org.apache.jackrabbit.webdav.util.EncodeUtil;
+import org.apache.jackrabbit.webdav.version.DeltaVConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * <code>LabelHeader</code>...
+ */
+public class LabelHeader implements Header {
+
+    private static Logger log = LoggerFactory.getLogger(LabelHeader.class);
+
+    private final String label;
+
+    public LabelHeader(String label) {
+        if (label == null) {
+            throw new IllegalArgumentException("null is not a valid label.");
+        }
+        this.label = label;
+    }
+
+    public String getLabel() {
+        return label;
+    }
+
+    public String getHeaderName() {
+        return DeltaVConstants.HEADER_LABEL;
+    }
+
+    public String getHeaderValue() {
+        return EncodeUtil.escape(label);
+    }
+
+    public static LabelHeader parse(WebdavRequest request) {
+        String hv = request.getHeader(DeltaVConstants.HEADER_LABEL);
+        if (hv == null) {
+            return null;
+        } else {
+            return new LabelHeader(EncodeUtil.unescape(hv));
+        }
+    }
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/OverwriteHeader.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/OverwriteHeader.java
new file mode 100644
index 000000000..1de797411
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/OverwriteHeader.java
@@ -0,0 +1,75 @@
+/*
+ * 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.jackrabbit.webdav.header;
+
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import jakarta.servlet.http.HttpServletRequest;
+
+/**
+ * <code>OverwriteHeader</code>...
+ */
+public class OverwriteHeader implements Header {
+
+    private static Logger log = LoggerFactory.getLogger(OverwriteHeader.class);
+
+    public static final String OVERWRITE_TRUE = "T";
+    public static final String OVERWRITE_FALSE = "F";
+
+    /**
+     * Set 'doOverwrite' to <code>true</code> by default. See RFC 2518:
+     * "If the overwrite header is not included in a COPY or MOVE request then
+     * the resource MUST treat the request as if it has an overwrite header of
+     * value {@link #OVERWRITE_TRUE}".
+     */
+    private final boolean doOverwrite;
+
+    public OverwriteHeader(boolean doOverwrite) {
+        this.doOverwrite = doOverwrite;
+    }
+
+    /**
+     * Create a new <code>OverwriteHeader</code> for the given request object.
+     * If the latter does not contain an "Overwrite" header field, the default
+     * applies, which is {@link #OVERWRITE_TRUE} according to RFC 2518.
+     *
+     * @param request
+     */
+    public OverwriteHeader(HttpServletRequest request) {
+        String overwriteHeader = request.getHeader(DavConstants.HEADER_OVERWRITE);
+        if (overwriteHeader != null) {
+            doOverwrite = overwriteHeader.equalsIgnoreCase(OVERWRITE_TRUE);
+        } else {
+            // no Overwrite header -> default is 'true'
+            doOverwrite = true;
+        }
+    }
+
+    public String getHeaderName() {
+        return DavConstants.HEADER_OVERWRITE;
+    }
+
+    public String getHeaderValue() {
+        return (doOverwrite) ? OVERWRITE_TRUE : OVERWRITE_FALSE;
+    }
+
+    public boolean isOverwrite() {
+        return doOverwrite;
+    }
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/PollTimeoutHeader.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/PollTimeoutHeader.java
new file mode 100644
index 000000000..73d638053
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/PollTimeoutHeader.java
@@ -0,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.
+ */
+package org.apache.jackrabbit.webdav.header;
+
+import org.apache.jackrabbit.webdav.observation.ObservationConstants;
+
+import jakarta.servlet.http.HttpServletRequest;
+
+/**
+ * <code>PollTimeoutHeader</code> implements a timeout header for subscription
+ * polling.
+ */
+public class PollTimeoutHeader extends TimeoutHeader {
+
+    public PollTimeoutHeader(long timeout) {
+        super(timeout);
+    }
+
+    @Override
+    public String getHeaderName() {
+        return ObservationConstants.HEADER_POLL_TIMEOUT;
+    }
+
+    /**
+     * Parses the request timeout header and converts it into a new
+     * <code>PollTimeoutHeader</code> object.<br>The default value is used as
+     * fallback if the String is not parseable.
+     *
+     * @param request
+     * @param defaultValue
+     * @return a new PollTimeoutHeader object.
+     */
+    public static PollTimeoutHeader parseHeader(HttpServletRequest request, long defaultValue) {
+        String timeoutStr = request.getHeader(ObservationConstants.HEADER_POLL_TIMEOUT);
+        long timeout = parse(timeoutStr, defaultValue);
+        return new PollTimeoutHeader(timeout);
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/TimeoutHeader.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/TimeoutHeader.java
new file mode 100644
index 000000000..0e5525359
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/TimeoutHeader.java
@@ -0,0 +1,104 @@
+/*
+ * 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.jackrabbit.webdav.header;
+
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import jakarta.servlet.http.HttpServletRequest;
+
+/**
+ * <code>TimeoutHeader</code>...
+ */
+public class TimeoutHeader implements Header, DavConstants {
+
+    private static Logger log = LoggerFactory.getLogger(TimeoutHeader.class);
+
+    private final long timeout;
+
+    public TimeoutHeader(long timeout) {
+        this.timeout = timeout;
+    }
+
+    public String getHeaderName() {
+        return DavConstants.HEADER_TIMEOUT;
+    }
+
+    public String getHeaderValue() {
+        if (timeout == INFINITE_TIMEOUT) {
+            return TIMEOUT_INFINITE;
+        } else {
+            return "Second-" + (timeout / 1000);
+        }
+    }
+
+    public long getTimeout() {
+        return timeout;
+    }
+
+    /**
+     * Parses the request timeout header and converts it into a new
+     * <code>TimeoutHeader</code> object.<br>The default value is used as
+     * fallback if the String is not parseable.
+     *
+     * @param request
+     * @param defaultValue
+     * @return a new TimeoutHeader object.
+     */
+    public static TimeoutHeader parse(HttpServletRequest request, long defaultValue) {
+        String timeoutStr = request.getHeader(HEADER_TIMEOUT);
+        long timeout = parse(timeoutStr, defaultValue);
+        return new TimeoutHeader(timeout);
+    }
+
+    /**
+     * Parses the given timeout String and converts the timeout value
+     * into a long indicating the number of milliseconds until expiration time
+     * is reached.<br>
+     * NOTE: If the timeout String equals to {@link #TIMEOUT_INFINITE 'infinite'}
+     * {@link Integer#MAX_VALUE} is returned. If the Sting is invalid or is in an
+     * invalid format that cannot be parsed, the default value is returned.
+     *
+     * @param timeoutStr
+     * @param defaultValue
+     * @return long representing the timeout present in the header or the default
+     * value if the header is missing or could not be parsed.
+     */
+    public static long parse(String timeoutStr, long defaultValue) {
+        long timeout = defaultValue;
+        if (timeoutStr != null && timeoutStr.length() > 0) {
+            int secondsInd = timeoutStr.indexOf("Second-");
+            if (secondsInd >= 0) {
+                secondsInd += 7; // read over "Second-"
+                int i = secondsInd;
+                while (i < timeoutStr.length() && Character.isDigit(timeoutStr.charAt(i))) {
+                    i++;
+                }
+                try {
+                    timeout = 1000L * Long.parseLong(timeoutStr.substring(secondsInd, i));
+                } catch (NumberFormatException ignore) {
+                    // ignore and return 'undefined' timeout
+                    log.error("Invalid timeout format: " + timeoutStr);
+                }
+            } else if (timeoutStr.equalsIgnoreCase(TIMEOUT_INFINITE)) {
+                timeout = INFINITE_TIMEOUT;
+            }
+        }
+        return timeout;
+    }
+}
\ No newline at end of file
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/package-info.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/package-info.java
new file mode 100644
index 000000000..3c834230d
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/header/package-info.java
@@ -0,0 +1,18 @@
+/*
+ * 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.
+ */
+@org.osgi.annotation.versioning.Version("1.1.0")
+package org.apache.jackrabbit.webdav.header;
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/io/InputContext.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/io/InputContext.java
new file mode 100644
index 000000000..7faaf32fb
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/io/InputContext.java
@@ -0,0 +1,78 @@
+/*
+ * 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.jackrabbit.webdav.io;
+
+import java.io.InputStream;
+
+/**
+ * <code>InputContext</code>...
+ */
+public interface InputContext {
+
+    /**
+     * Return true, if there are any data to be imported (and not only properties)
+     *
+     * @return
+     */
+    public boolean hasStream();
+
+    /**
+     * Returns the input stream of the resource to import.
+     *
+     * @return the input stream.
+     */
+    public InputStream getInputStream();
+
+    /**
+     * Returns the modification time of the resource or the current time if
+     * the modification time has not been set.
+     *
+     * @return the modification time.
+     */
+    public long getModificationTime();
+
+    /**
+     * Returns the content language or <code>null</code>
+     *
+     * @return contentLanguage
+     */
+    public String getContentLanguage();
+
+    /**
+     * Returns the length of the data or -1 if the contentlength could not be
+     * determined.
+     *
+     * @return the content length
+     */
+    public long getContentLength();
+
+    /**
+     * Return the content type or <code>null</code>
+     *
+     * @return
+     */
+    public String getContentType();
+
+    /**
+     * Returns the value of the given property or <code>null</code> if this property does
+     * not exist.
+     *
+     * @param propertyName
+     * @return String property value or <code>null</code>
+     */
+    public String getProperty(String propertyName);
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/io/InputContextImpl.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/io/InputContextImpl.java
new file mode 100644
index 000000000..592eecc1e
--- /dev/null
+++ b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/io/InputContextImpl.java
@@ -0,0 +1,98 @@
+/*
+ * 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.jackrabbit.webdav.io;
+
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import jakarta.servlet.http.HttpServletRequest;
+import java.io.InputStream;
+import java.util.Date;
+
+/**
+ * <code>InputContextImpl</code> class encapsulates the <code>InputStream</code>
+ * and some header values as present in the POST, PUT or MKCOL request.
+ */
+public class InputContextImpl implements InputContext {
+
+    private static Logger log = LoggerFactory.getLogger(InputContextImpl.class);
+
+    private final HttpServletRequest request;
+    private final InputStream in;
+
+    public InputContextImpl(HttpServletRequest request, InputStream in) {
+        if (request == null) {
+            throw new IllegalArgumentException("DavResource and Request must not be null.");
+        }
+
+        this.request = request;
+        this.in = in;
+    }
+
+    public boolean hasStream() {
+        return in != null;
+    }
+
+    /**
+     * Returns the input stream of the resource to import.
+     *
+     * @return the input stream.
+     */
+    public InputStream getInputStream() {
+        return in;
+    }
+
+    public long getModificationTime() {
+        return new Date().getTime();
+    }
+
+    /**
+     * Returns the content language or <code>null</code>.
+     *
+     * @return contentLanguage
+     */
+    public String getContentLanguage() {
+        return request.getHeader(DavConstants.HEADER_CONTENT_LANGUAGE);
+    }
+
+    /**
+     * @return content length or -1 when unknown
+     */
+    public long getContentLength() {
+        String length = request.getHeader(DavConstants.HEADER_CONTENT_LENGTH);
+        if (length == null) {
+            // header not present
+            return -1;
+        } else {
+            try {
+                return Long.parseLong(length);
+            } catch (NumberFormatException ex) {
+                log.error("broken Content-Length header: " + length);
+                return -1;
+            }
+        }
+    }
+
+    public String getContentType() {
+        return request.getHeader(DavConstants.HEADER_CONTENT_TYPE);
+    }
+
+    public String getProperty(String propertyName) {
+        return request.getHeader(propertyName);
+    }
+}
diff --git a/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/io/OutputContext.java b/openmeetings-service/src/main/java/org/apache/jackrabbit/webdav/io/OutputContext.java
new file mode 100644
index 000000000..a5a25eff5
--- /dev/null
... 18212 lines suppressed ...


(openmeetings) 14/29: Project is compilable, tests are RED

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

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

commit 5c116dfa8a12d4639b1819b70f5fed446a3915d6
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Thu Jan 12 23:47:56 2023 +0700

    Project is compilable, tests are RED
---
 openmeetings-core/pom.xml                          |  4 --
 .../openmeetings/core/converter/BaseConverter.java | 12 +++--
 .../core/converter/DocumentConverter.java          |  8 +--
 .../core/converter/ImageConverter.java             |  6 ++-
 .../openmeetings/core/data/file/FileProcessor.java | 12 +++--
 .../openmeetings/core/ldap/LdapLoginManager.java   | 13 +++--
 .../apache/openmeetings/core/mail/MailHandler.java |  7 +--
 openmeetings-db/pom.xml                            | 15 +++++-
 .../bind/adapter/AppointmentReminderAdapter.java   |  2 +-
 .../db/bind/adapter/BooleanAdapter.java            |  2 +-
 .../db/bind/adapter/ConfigTypeAdapter.java         |  2 +-
 .../openmeetings/db/bind/adapter/DateAdapter.java  |  2 +-
 .../db/bind/adapter/EntityAdapter.java             |  2 +-
 .../db/bind/adapter/FileTypeAdapter.java           |  2 +-
 .../openmeetings/db/bind/adapter/IntAdapter.java   |  2 +-
 .../db/bind/adapter/LocalDateAdapter.java          |  2 +-
 .../openmeetings/db/bind/adapter/LongAdapter.java  |  2 +-
 .../db/bind/adapter/OauthMapAdapter.java           |  2 +-
 .../db/bind/adapter/PollTypeAdapter.java           |  2 +-
 .../db/bind/adapter/RecordingStatusAdapter.java    |  2 +-
 .../db/bind/adapter/RoomElementAdapter.java        |  2 +-
 .../db/bind/adapter/RoomTypeAdapter.java           |  2 +-
 .../db/bind/adapter/SalutationAdapter.java         |  2 +-
 .../db/bind/adapter/UserRightAdapter.java          |  2 +-
 .../db/bind/adapter/UserTypeAdapter.java           |  2 +-
 .../apache/openmeetings/db/dao/basic/ChatDao.java  |  4 +-
 .../db/dao/basic/ConfigurationDao.java             | 13 ++---
 .../openmeetings/db/dao/basic/MailMessageDao.java  |  4 +-
 .../db/dao/calendar/AppointmentDao.java            | 21 ++++----
 .../db/dao/calendar/MeetingMemberDao.java          |  4 +-
 .../db/dao/calendar/OmCalendarDao.java             | 10 ++--
 .../openmeetings/db/dao/file/BaseFileItemDao.java  | 14 ++---
 .../openmeetings/db/dao/file/FileItemDao.java      |  2 +-
 .../openmeetings/db/dao/file/FileItemLogDao.java   |  4 +-
 .../openmeetings/db/dao/log/ConferenceLogDao.java  |  4 +-
 .../db/dao/record/RecordingChunkDao.java           | 10 ++--
 .../openmeetings/db/dao/record/RecordingDao.java   |  7 +--
 .../openmeetings/db/dao/room/ExtraMenuDao.java     | 12 ++---
 .../openmeetings/db/dao/room/InvitationDao.java    | 14 ++---
 .../apache/openmeetings/db/dao/room/PollDao.java   |  6 +--
 .../apache/openmeetings/db/dao/room/RoomDao.java   | 23 +++++----
 .../openmeetings/db/dao/server/LdapConfigDao.java  | 13 ++---
 .../openmeetings/db/dao/server/OAuth2Dao.java      | 10 ++--
 .../openmeetings/db/dao/server/SOAPLoginDao.java   |  4 +-
 .../openmeetings/db/dao/server/SessiondataDao.java |  4 +-
 .../apache/openmeetings/db/dao/user/GroupDao.java  | 12 ++---
 .../openmeetings/db/dao/user/GroupUserDao.java     | 12 ++---
 .../db/dao/user/PrivateMessageDao.java             |  8 +--
 .../db/dao/user/PrivateMessageFolderDao.java       |  4 +-
 .../openmeetings/db/dao/user/UserContactDao.java   | 12 +++--
 .../apache/openmeetings/db/dao/user/UserDao.java   | 17 ++++---
 .../apache/openmeetings/db/dto/basic/Health.java   |  6 +--
 .../org/apache/openmeetings/db/dto/basic/Info.java |  6 +--
 .../openmeetings/db/dto/basic/ServiceResult.java   |  8 +--
 .../db/dto/calendar/AppointmentDTO.java            |  6 +--
 .../db/dto/calendar/MeetingMemberDTO.java          |  6 +--
 .../db/dto/file/FileExplorerObject.java            |  6 +--
 .../openmeetings/db/dto/file/FileItemDTO.java      |  6 +--
 .../openmeetings/db/dto/record/RecordingDTO.java   |  6 +--
 .../openmeetings/db/dto/room/InvitationDTO.java    |  6 +--
 .../apache/openmeetings/db/dto/room/RoomDTO.java   |  6 +--
 .../openmeetings/db/dto/room/RoomFileDTO.java      |  6 +--
 .../openmeetings/db/dto/room/RoomOptionsDTO.java   |  6 +--
 .../openmeetings/db/dto/user/ExternalUserDTO.java  |  6 +--
 .../apache/openmeetings/db/dto/user/GroupDTO.java  |  2 +-
 .../apache/openmeetings/db/dto/user/UserDTO.java   |  2 +-
 .../openmeetings/db/dto/user/UserSearchResult.java |  2 +-
 .../openmeetings/db/entity/HistoricalEntity.java   | 16 +++---
 .../openmeetings/db/entity/basic/ChatMessage.java  | 34 ++++++-------
 .../db/entity/basic/Configuration.java             | 38 +++++++-------
 .../openmeetings/db/entity/basic/MailMessage.java  | 20 ++++----
 .../db/entity/calendar/Appointment.java            | 44 ++++++++--------
 .../db/entity/calendar/MeetingMember.java          | 36 ++++++-------
 .../db/entity/calendar/OmCalendar.java             | 34 ++++++-------
 .../openmeetings/db/entity/file/BaseFileItem.java  | 34 ++++++-------
 .../openmeetings/db/entity/file/FileItem.java      | 16 +++---
 .../openmeetings/db/entity/file/FileItemLog.java   | 16 +++---
 .../openmeetings/db/entity/log/ConferenceLog.java  | 18 +++----
 .../openmeetings/db/entity/record/Recording.java   | 32 ++++++------
 .../db/entity/record/RecordingChunk.java           | 38 +++++++-------
 .../openmeetings/db/entity/room/ExtraMenu.java     | 34 ++++++-------
 .../openmeetings/db/entity/room/Invitation.java    | 30 +++++------
 .../apache/openmeetings/db/entity/room/Room.java   | 50 +++++++++---------
 .../openmeetings/db/entity/room/RoomFile.java      | 28 +++++-----
 .../openmeetings/db/entity/room/RoomGroup.java     | 30 +++++------
 .../openmeetings/db/entity/room/RoomModerator.java | 32 ++++++------
 .../openmeetings/db/entity/room/RoomPoll.java      | 44 ++++++++--------
 .../db/entity/room/RoomPollAnswer.java             | 32 ++++++------
 .../openmeetings/db/entity/server/LdapConfig.java  | 34 ++++++-------
 .../openmeetings/db/entity/server/OAuthServer.java | 42 +++++++--------
 .../openmeetings/db/entity/server/SOAPLogin.java   | 16 +++---
 .../openmeetings/db/entity/server/Sessiondata.java | 24 ++++-----
 .../openmeetings/db/entity/user/Address.java       | 26 +++++-----
 .../db/entity/user/AsteriskSipUser.java            | 28 +++++-----
 .../apache/openmeetings/db/entity/user/Group.java  | 28 +++++-----
 .../openmeetings/db/entity/user/GroupUser.java     | 32 ++++++------
 .../db/entity/user/PrivateMessage.java             | 34 ++++++-------
 .../db/entity/user/PrivateMessageFolder.java       | 25 +++++----
 .../apache/openmeetings/db/entity/user/User.java   | 56 ++++++++++----------
 .../openmeetings/db/entity/user/UserContact.java   | 32 ++++++------
 .../openmeetings/db/mapper/CalendarMapper.java     | 12 +++--
 .../apache/openmeetings/db/mapper/RoomMapper.java  | 12 +++--
 .../apache/openmeetings/db/mapper/UserMapper.java  |  8 +--
 .../org/apache/openmeetings/db/util/DaoHelper.java | 20 ++++----
 .../apache/openmeetings/backup/BackupExport.java   | 41 +++++++--------
 .../apache/openmeetings/backup/BackupImport.java   | 43 ++++++++--------
 .../apache/openmeetings/backup/BackupVersion.java  | 10 ++--
 .../installation/ImportInitvalues.java             | 16 +++---
 .../org/apache/openmeetings/mediaserver/KRoom.java |  2 +-
 .../apache/openmeetings/mediaserver/KStream.java   |  2 +-
 .../openmeetings/mediaserver/KTestStream.java      |  2 +-
 .../openmeetings/mediaserver/KurentoHandler.java   | 12 +++--
 .../openmeetings/mediaserver/StreamProcessor.java  | 18 ++++---
 .../mediaserver/StreamProcessorActions.java        | 10 ++--
 .../mediaserver/TestStreamProcessor.java           |  6 ++-
 .../openmeetings/mediaserver/BaseMockedTest.java   |  2 +-
 .../src/main/assembly/conf/context.xml             |  5 +-
 .../src/main/assembly/conf/server.xml              | 50 +++++++++++-------
 openmeetings-server/src/main/assembly/conf/web.xml | 27 +++++-----
 openmeetings-service/pom.xml                       |  7 ++-
 .../service/calendar/AppointmentLogic.java         | 10 ++--
 .../calendar/caldav/AppointmentManager.java        | 10 ++--
 .../service/calendar/caldav/IcalUtils.java         |  4 +-
 .../openmeetings/service/mail/EmailManager.java    |  6 ++-
 .../mail/template/AbstractTemplatePage.java        |  5 +-
 .../subject/RecordingExpiringTemplate.java         |  5 +-
 .../service/notifier/MailNotifier.java             |  8 +--
 .../service/notifier/TextNotifier.java             | 10 ++--
 .../service/room/InvitationManager.java            |  8 +--
 .../service/scheduler/AbstractJob.java             |  8 +--
 .../openmeetings/service/scheduler/CleanupJob.java | 10 ++--
 .../service/scheduler/ReminderJob.java             | 14 ++---
 .../web/admin/AdminUserChoiceProvider.java         |  6 ++-
 .../openmeetings/web/admin/backup/BackupPanel.java |  4 +-
 .../backup/BackupUploadResourceReference.java      |  7 +--
 .../web/admin/configurations/ConfigForm.java       |  6 ++-
 .../web/admin/configurations/ConfigsPanel.java     |  5 +-
 .../web/admin/connection/ConnectionsPanel.java     | 12 +++--
 .../openmeetings/web/admin/email/EmailForm.java    |  5 +-
 .../openmeetings/web/admin/extra/ExtraForm.java    |  7 +--
 .../openmeetings/web/admin/groups/GroupForm.java   | 10 ++--
 .../web/admin/groups/GroupUsersPanel.java          |  5 +-
 .../openmeetings/web/admin/ldaps/LdapForm.java     |  6 ++-
 .../openmeetings/web/admin/oauth/OAuthForm.java    |  4 +-
 .../openmeetings/web/admin/rooms/RoomForm.java     | 13 ++---
 .../openmeetings/web/admin/rooms/RoomsPanel.java   |  6 ++-
 .../web/admin/users/PasswordDialog.java            |  5 +-
 .../openmeetings/web/admin/users/UserForm.java     | 11 ++--
 .../openmeetings/web/admin/users/UsersPanel.java   |  5 +-
 .../apache/openmeetings/web/app/Application.java   | 20 ++++----
 .../apache/openmeetings/web/app/ClientManager.java | 11 ++--
 .../apache/openmeetings/web/app/TimerService.java  | 12 +++--
 .../apache/openmeetings/web/app/UserManager.java   | 14 ++---
 .../apache/openmeetings/web/app/WebSession.java    | 21 ++++----
 .../openmeetings/web/app/WhiteboardManager.java    |  6 ++-
 .../openmeetings/web/common/GeneralUserForm.java   |  8 +--
 .../web/common/GroupChoiceProvider.java            |  8 +--
 .../openmeetings/web/common/InvitationForm.java    |  8 +--
 .../apache/openmeetings/web/common/MainPanel.java  | 10 ++--
 .../openmeetings/web/common/OmWebSocketPanel.java  |  6 ++-
 .../openmeetings/web/common/ProfileImagePanel.java |  6 ++-
 .../web/common/UploadableProfileImagePanel.java    |  8 +--
 .../web/common/tree/ConvertingErrorsDialog.java    |  4 +-
 .../web/common/tree/FileItemPanel.java             |  6 ++-
 .../web/common/tree/FileTreePanel.java             |  6 +--
 .../openmeetings/web/common/tree/FolderPanel.java  |  8 +--
 .../web/common/tree/OmTreeProvider.java            | 10 ++--
 .../web/common/upload/UploadResourceReference.java |  6 +--
 .../openmeetings/web/pages/ActivatePage.java       |  6 ++-
 .../apache/openmeetings/web/pages/HashPage.java    |  7 +--
 .../apache/openmeetings/web/pages/ResetPage.java   |  5 +-
 .../web/pages/auth/ForgetPasswordDialog.java       |  7 +--
 .../openmeetings/web/pages/auth/OtpDialog.java     |  8 +--
 .../web/pages/auth/RegisterDialog.java             |  7 +--
 .../web/pages/auth/ResetPasswordDialog.java        |  5 +-
 .../openmeetings/web/pages/auth/SignInDialog.java  | 12 +++--
 .../openmeetings/web/pages/auth/SignInPage.java    |  9 ++--
 .../web/pages/install/InstallWizard.java           |  5 +-
 .../openmeetings/web/room/NicknameDialog.java      |  6 ++-
 .../apache/openmeetings/web/room/RoomPanel.java    | 19 +++----
 .../web/room/RoomResourceReference.java            | 11 ++--
 .../web/room/activities/ActivitiesPanel.java       |  7 ++-
 .../openmeetings/web/room/menu/ActionsSubMenu.java |  7 ++-
 .../openmeetings/web/room/menu/ExtrasSubMenu.java  |  8 +--
 .../openmeetings/web/room/menu/PollsSubMenu.java   |  9 ++--
 .../web/room/menu/RoomInvitationForm.java          | 11 ++--
 .../openmeetings/web/room/menu/RoomMenuPanel.java  | 14 ++---
 .../web/room/menu/SipDialerDialog.java             |  6 ++-
 .../web/room/poll/CreatePollDialog.java            | 10 ++--
 .../web/room/poll/PollResultsDialog.java           |  8 +--
 .../openmeetings/web/room/poll/VoteDialog.java     |  8 +--
 .../web/room/sidebar/RoomFilePanel.java            |  9 ++--
 .../sidebar/RoomFileUploadResourceReference.java   | 12 +++--
 .../openmeetings/web/room/sidebar/RoomSidebar.java |  6 ++-
 .../openmeetings/web/room/wb/InterviewWbPanel.java |  7 ++-
 .../apache/openmeetings/web/room/wb/WbPanel.java   | 11 ++--
 .../web/user/InviteUserMessageDialog.java          |  8 +--
 .../web/user/InviteUserToRoomDialog.java           |  8 +--
 .../openmeetings/web/user/MessageDialog.java       | 18 ++++---
 .../openmeetings/web/user/UserInfoDialog.java      |  8 +--
 .../web/user/calendar/AppointmentDialog.java       | 14 ++---
 .../web/user/calendar/CalendarDialog.java          |  8 +--
 .../web/user/calendar/CalendarPanel.java           |  9 ++--
 .../apache/openmeetings/web/user/chat/Chat.java    | 13 +++--
 .../openmeetings/web/user/chat/ChatForm.java       | 12 +++--
 .../openmeetings/web/user/chat/ChatToolbar.java    |  7 +--
 .../web/user/dashboard/MyRoomsWidgetView.java      |  7 ++-
 .../web/user/dashboard/RecentRoomsWidgetView.java  |  7 ++-
 .../web/user/dashboard/WelcomeWidgetView.java      |  9 ++--
 .../dashboard/admin/AdminCleanupInfoDialog.java    | 10 ++--
 .../web/user/profile/ChangePasswordDialog.java     |  6 ++-
 .../web/user/profile/EditProfileForm.java          |  5 +-
 .../web/user/profile/InvitationDetails.java        |  6 ++-
 .../web/user/profile/MessagesContactsPanel.java    | 12 +++--
 .../web/user/profile/ToggleOtpDialog.java          |  7 +--
 .../web/user/profile/UserProfilePanel.java         |  9 ++--
 .../web/user/profile/UserSearchPanel.java          | 10 ++--
 .../web/user/profile/WidgetsPanel.java             |  7 ++-
 .../web/user/record/RecordingInvitationForm.java   |  7 ++-
 .../user/record/RecordingResourceReference.java    | 11 ++--
 .../web/user/record/RecordingsPanel.java           | 11 ++--
 .../openmeetings/web/user/record/VideoInfo.java    |  7 ++-
 .../openmeetings/web/user/rooms/RoomListPanel.java |  6 ++-
 .../openmeetings/web/user/rooms/RoomsPanel.java    | 11 ++--
 .../web/user/rooms/RoomsSelectorPanel.java         |  7 ++-
 .../web/user/rooms/RoomsTabbedPanel.java           |  8 +--
 .../web/util/FileItemResourceReference.java        |  6 ++-
 .../web/util/GroupLogoResourceReference.java       |  8 +--
 .../web/util/ProfileImageResourceReference.java    |  5 +-
 .../openmeetings/web/util/UserChoiceProvider.java  |  7 ++-
 .../util/logging/OpenMeetingsMetricsServlet.java   |  4 +-
 .../WEB-INF/classes/META-INF/h2_persistence.xml    |  4 +-
 openmeetings-web/src/main/webapp/WEB-INF/web.xml   |  6 ++-
 .../apache/openmeetings/AbstractOmServerTest.java  | 16 +++---
 .../openmeetings/backup/AbstractTestImport.java    |  6 ++-
 .../org/apache/openmeetings/backup/TestExport.java |  4 +-
 .../org/apache/openmeetings/backup/TestImport.java | 16 +++---
 .../openmeetings/backup/TestImportCalendar.java    |  8 +--
 .../apache/openmeetings/backup/TestImportOld.java  | 10 ++--
 .../apache/openmeetings/backup/TestImportRoom.java |  6 ++-
 .../apache/openmeetings/backup/TestImportUser.java |  6 ++-
 .../calendar/TestAppointmentAddAppointment.java    |  8 +--
 .../calendar/TestAppointmentSchedulerTask.java     |  6 ++-
 .../openmeetings/calendar/TestGetAppointment.java  |  6 ++-
 .../openmeetings/calendar/TestOmCalendar.java      |  6 ++-
 .../openmeetings/calendar/TestSendIcalMessage.java |  5 +-
 .../openmeetings/core/file/TestFileProcessor.java  |  6 ++-
 .../apache/openmeetings/db/dao/TestFileDao.java    |  8 +--
 .../apache/openmeetings/db/dao/TestRoomDao.java    |  6 ++-
 .../openmeetings/invitiation/TestInvitation.java   | 10 ++--
 .../org/apache/openmeetings/ldap/TestLdap.java     |  5 +-
 .../openmeetings/service/scheduler/TestJob.java    |  8 +--
 .../apache/openmeetings/user/TestUserGroup.java    |  6 ++-
 .../org/apache/openmeetings/userdata/TestAuth.java |  6 ++-
 .../openmeetings/web/pages/TestHashPage.java       |  9 ++--
 openmeetings-web/src/test/jetty/web.xml            |  6 ++-
 openmeetings-webservice/pom.xml                    |  5 +-
 .../openmeetings/webservice/BaseWebService.java    | 12 +++--
 .../webservice/CalendarWebService.java             |  7 +--
 .../openmeetings/webservice/FileWebService.java    |  5 +-
 .../openmeetings/webservice/GroupWebService.java   |  7 +--
 .../webservice/RecordingWebService.java            |  5 +-
 .../openmeetings/webservice/RoomWebService.java    | 13 ++---
 .../openmeetings/webservice/UserWebService.java    | 11 ++--
 .../openmeetings/webservice/WbWebService.java      |  7 +--
 pom.xml                                            | 59 +++++++++++++++++++++-
 266 files changed, 1712 insertions(+), 1316 deletions(-)

diff --git a/openmeetings-core/pom.xml b/openmeetings-core/pom.xml
index 4e7650dab..95ab8775b 100644
--- a/openmeetings-core/pom.xml
+++ b/openmeetings-core/pom.xml
@@ -89,10 +89,6 @@
 			<groupId>org.apache.wicket</groupId>
 			<artifactId>wicket-core</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>org.apache.wicket</groupId>
-			<artifactId>wicket-ioc</artifactId>
-		</dependency>
 		<dependency>
 			<groupId>org.apache.directory.api</groupId>
 			<artifactId>api-all</artifactId>
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/BaseConverter.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/BaseConverter.java
index dd4770170..58fc910a0 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/BaseConverter.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/BaseConverter.java
@@ -56,7 +56,9 @@ import org.apache.openmeetings.util.process.ProcessResultList;
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
+import jakarta.inject.Inject;
+
 
 public abstract class BaseConverter {
 	private static final Logger log = LoggerFactory.getLogger(BaseConverter.class);
@@ -66,13 +68,13 @@ public abstract class BaseConverter {
 	public static final int TIME_TO_WAIT_FOR_FRAME = 5 * MINUTE_MULTIPLIER;
 	public static final double HALF_STEP = 1. / 2;
 
-	@Autowired
+	@Inject
 	protected ConfigurationDao cfgDao;
-	@Autowired
+	@Inject
 	protected RecordingChunkDao chunkDao;
-	@Autowired
+	@Inject
 	protected FileItemLogDao logDao;
-	@Autowired
+	@Inject
 	protected RecordingDao recordingDao;
 
 	protected record Dimension(int width, int height) {}
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/DocumentConverter.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/DocumentConverter.java
index 379f09c19..39bbb873e 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/DocumentConverter.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/DocumentConverter.java
@@ -41,17 +41,19 @@ import org.jodconverter.local.LocalConverter;
 import org.jodconverter.local.office.LocalOfficeManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Component;
 
+import jakarta.inject.Inject;
+
 @Component
 public class DocumentConverter {
 	private static final Logger log = LoggerFactory.getLogger(DocumentConverter.class);
 	private static final String JOD_JOD_NAME = "doJodConvert";
 
-	@Autowired
+	@Inject
 	protected ConfigurationDao cfgDao;
-	@Autowired
+	@Inject
 	private ImageConverter imageConverter;
 
 	public ProcessResultList convertPDF(FileItem f, StoredFile sf) throws Exception {
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/ImageConverter.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/ImageConverter.java
index 36af1c820..ce92aad1d 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/ImageConverter.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/ImageConverter.java
@@ -55,16 +55,18 @@ import org.apache.tika.parser.Parser;
 import org.apache.tika.parser.image.ImageParser;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Component;
 import org.xml.sax.helpers.DefaultHandler;
 
+import jakarta.inject.Inject;
+
 @Component
 public class ImageConverter extends BaseConverter {
 	private static final Logger log = LoggerFactory.getLogger(ImageConverter.class);
 	private static final String PAGE_TMPLT = DOC_PAGE_PREFIX + "-%04d." + EXTENSION_PNG;
 
-	@Autowired
+	@Inject
 	private UserDao userDao;
 
 	public ProcessResultList convertImage(BaseFileItem f, StoredFile sf, Optional<DoubleConsumer> progress) throws IOException {
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java
index e4ac79b52..8358993d6 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java
@@ -41,21 +41,23 @@ import org.apache.openmeetings.util.process.ProcessResultList;
 import org.apache.tika.exception.UnsupportedFormatException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Component;
 
+import jakarta.inject.Inject;
+
 @Component
 public class FileProcessor {
 	private static final Logger log = LoggerFactory.getLogger(FileProcessor.class);
 
 	//Spring loaded Beans
-	@Autowired
+	@Inject
 	private VideoConverter videoConverter;
-	@Autowired
+	@Inject
 	private FileItemDao fileDao;
-	@Autowired
+	@Inject
 	private ImageConverter imageConverter;
-	@Autowired
+	@Inject
 	private DocumentConverter docConverter;
 
 	public ProcessResultList processFile(FileItem f, InputStream is, Optional<DoubleConsumer> progress) throws Exception {
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/ldap/LdapLoginManager.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/ldap/LdapLoginManager.java
index bdce1e700..5baa5f2d7 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/ldap/LdapLoginManager.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/ldap/LdapLoginManager.java
@@ -74,9 +74,11 @@ import org.apache.openmeetings.util.StoredFile;
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Component;
 
+import jakarta.inject.Inject;
+
 /**
  * Management of optional LDAP Login
  *
@@ -134,13 +136,14 @@ public class LdapLoginManager {
 		, ATTRIBUTE
 		, QUERY
 	}
-	@Autowired
+
+	@Inject
 	private LdapConfigDao ldapConfigDao;
-	@Autowired
+	@Inject
 	private UserDao userDao;
-	@Autowired
+	@Inject
 	private GroupDao groupDao;
-	@Autowired
+	@Inject
 	private ImageConverter imageConverter;
 
 	private static void bindAdmin(LdapConnection conn, LdapOptions options) throws LdapException {
diff --git 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
index d673220d2..027e203b4 100644
--- 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
@@ -47,11 +47,12 @@ import org.apache.openmeetings.util.mail.MailUtil;
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.core.task.TaskExecutor;
 import org.springframework.stereotype.Component;
 
 import jakarta.activation.DataHandler;
+import jakarta.inject.Inject;
 import jakarta.mail.Authenticator;
 import jakarta.mail.BodyPart;
 import jakarta.mail.Message;
@@ -79,9 +80,9 @@ public class MailHandler {
 	private static final int MAIL_SEND_TIMEOUT = 60 * 60 * 1000; // 1 hour
 	private static final int MAXIMUM_ERROR_COUNT = 5;
 
-	@Autowired
+	@Inject
 	private TaskExecutor taskExecutor;
-	@Autowired
+	@Inject
 	private MailMessageDao mailMessageDao;
 
 	protected MimeMessage appendIcsBody(MimeMessage msg, MailMessage m) throws Exception {
diff --git a/openmeetings-db/pom.xml b/openmeetings-db/pom.xml
index f037a424d..e82e7264b 100644
--- a/openmeetings-db/pom.xml
+++ b/openmeetings-db/pom.xml
@@ -42,13 +42,26 @@
 			<groupId>org.glassfish.jaxb</groupId>
 			<artifactId>jaxb-runtime</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>org.apache.wicket</groupId>
+			<artifactId>wicket-ioc</artifactId>
+		</dependency>
 		<dependency>
 			<groupId>org.wicketstuff</groupId>
 			<artifactId>wicketstuff-datastore-hazelcast</artifactId>
 		</dependency>
 		<dependency>
-		<groupId>org.apache.openjpa</groupId>
+			<groupId>org.apache.openjpa</groupId>
 			<artifactId>openjpa</artifactId>
+			<classifier>jakarta</classifier>
+		</dependency>
+		<dependency>
+			<groupId>jakarta.persistence</groupId>
+			<artifactId>jakarta.persistence-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>jakarta.transaction</groupId>
+			<artifactId>jakarta.transaction-api</artifactId>
 		</dependency>
 		<dependency>
 			<groupId>org.springframework</groupId>
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/AppointmentReminderAdapter.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/AppointmentReminderAdapter.java
index c6af037fb..93d145d99 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/AppointmentReminderAdapter.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/AppointmentReminderAdapter.java
@@ -20,7 +20,7 @@ package org.apache.openmeetings.db.bind.adapter;
 
 import static org.apache.commons.lang3.math.NumberUtils.toInt;
 
-import javax.xml.bind.annotation.adapters.XmlAdapter;
+import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 
 import org.apache.openmeetings.db.entity.calendar.Appointment;
 import org.apache.wicket.util.string.Strings;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/BooleanAdapter.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/BooleanAdapter.java
index 8b12587c0..fd61652eb 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/BooleanAdapter.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/BooleanAdapter.java
@@ -18,7 +18,7 @@
  */
 package org.apache.openmeetings.db.bind.adapter;
 
-import javax.xml.bind.annotation.adapters.XmlAdapter;
+import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 
 public class BooleanAdapter extends XmlAdapter<String, Boolean> {
 
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/ConfigTypeAdapter.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/ConfigTypeAdapter.java
index f85379aac..d06594d9c 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/ConfigTypeAdapter.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/ConfigTypeAdapter.java
@@ -20,7 +20,7 @@ package org.apache.openmeetings.db.bind.adapter;
 
 import java.util.Locale;
 
-import javax.xml.bind.annotation.adapters.XmlAdapter;
+import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 
 import org.apache.openmeetings.db.entity.basic.Configuration;
 import org.apache.wicket.util.string.Strings;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/DateAdapter.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/DateAdapter.java
index c681c9229..27d163ece 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/DateAdapter.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/DateAdapter.java
@@ -20,7 +20,7 @@ package org.apache.openmeetings.db.bind.adapter;
 
 import java.util.Date;
 
-import javax.xml.bind.annotation.adapters.XmlAdapter;
+import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 
 public class DateAdapter extends XmlAdapter<String, Date> {
 
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/EntityAdapter.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/EntityAdapter.java
index b9dad2936..bf2bb5608 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/EntityAdapter.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/EntityAdapter.java
@@ -22,7 +22,7 @@ import static org.apache.commons.lang3.math.NumberUtils.toLong;
 
 import java.util.Map;
 
-import javax.xml.bind.annotation.adapters.XmlAdapter;
+import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 
 import org.apache.openmeetings.db.dao.IDataProviderDao;
 import org.apache.openmeetings.db.entity.IDataProviderEntity;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/FileTypeAdapter.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/FileTypeAdapter.java
index 7f3c59afe..bf3cb55b6 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/FileTypeAdapter.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/FileTypeAdapter.java
@@ -20,7 +20,7 @@ package org.apache.openmeetings.db.bind.adapter;
 
 import java.util.Locale;
 
-import javax.xml.bind.annotation.adapters.XmlAdapter;
+import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 
 import org.apache.openmeetings.db.entity.file.BaseFileItem;
 import org.apache.wicket.util.string.Strings;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/IntAdapter.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/IntAdapter.java
index ae3b5052a..928aa56d8 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/IntAdapter.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/IntAdapter.java
@@ -20,7 +20,7 @@ package org.apache.openmeetings.db.bind.adapter;
 
 import static org.apache.commons.lang3.math.NumberUtils.toInt;
 
-import javax.xml.bind.annotation.adapters.XmlAdapter;
+import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 
 public class IntAdapter extends XmlAdapter<String, Integer> {
 
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/LocalDateAdapter.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/LocalDateAdapter.java
index 0d3a3a8e6..d35a4b14c 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/LocalDateAdapter.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/LocalDateAdapter.java
@@ -23,7 +23,7 @@ import java.time.LocalDate;
 import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
 
-import javax.xml.bind.annotation.adapters.XmlAdapter;
+import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 
 import org.apache.openmeetings.util.CalendarPatterns;
 
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/LongAdapter.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/LongAdapter.java
index 77c3a4fea..50e1a043d 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/LongAdapter.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/LongAdapter.java
@@ -20,7 +20,7 @@ package org.apache.openmeetings.db.bind.adapter;
 
 import static org.apache.commons.lang3.math.NumberUtils.toLong;
 
-import javax.xml.bind.annotation.adapters.XmlAdapter;
+import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 
 public class LongAdapter extends XmlAdapter<String, Long> {
 
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/OauthMapAdapter.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/OauthMapAdapter.java
index 9807541ed..9ba090398 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/OauthMapAdapter.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/OauthMapAdapter.java
@@ -22,7 +22,7 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 
-import javax.xml.bind.annotation.adapters.XmlAdapter;
+import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 
 import org.apache.openmeetings.db.dto.user.OAuthUser;
 import org.apache.openmeetings.db.util.XmlHelper;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/PollTypeAdapter.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/PollTypeAdapter.java
index 91bffabd9..7f5205eae 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/PollTypeAdapter.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/PollTypeAdapter.java
@@ -20,7 +20,7 @@ package org.apache.openmeetings.db.bind.adapter;
 
 import static org.apache.commons.lang3.math.NumberUtils.toInt;
 
-import javax.xml.bind.annotation.adapters.XmlAdapter;
+import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 
 import org.apache.openmeetings.db.entity.room.RoomPoll;
 
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/RecordingStatusAdapter.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/RecordingStatusAdapter.java
index 0934dea9a..dbc3c8ed0 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/RecordingStatusAdapter.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/RecordingStatusAdapter.java
@@ -18,7 +18,7 @@
  */
 package org.apache.openmeetings.db.bind.adapter;
 
-import javax.xml.bind.annotation.adapters.XmlAdapter;
+import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 
 import org.apache.openmeetings.db.entity.record.Recording;
 import org.apache.openmeetings.db.entity.record.Recording.Status;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/RoomElementAdapter.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/RoomElementAdapter.java
index 21cb13f1d..f5453cd82 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/RoomElementAdapter.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/RoomElementAdapter.java
@@ -20,7 +20,7 @@ package org.apache.openmeetings.db.bind.adapter;
 
 import java.util.Locale;
 
-import javax.xml.bind.annotation.adapters.XmlAdapter;
+import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.wicket.util.string.Strings;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/RoomTypeAdapter.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/RoomTypeAdapter.java
index 8bb266fd8..3387e7469 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/RoomTypeAdapter.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/RoomTypeAdapter.java
@@ -20,7 +20,7 @@ package org.apache.openmeetings.db.bind.adapter;
 
 import static org.apache.commons.lang3.math.NumberUtils.toInt;
 
-import javax.xml.bind.annotation.adapters.XmlAdapter;
+import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.wicket.util.string.Strings;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/SalutationAdapter.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/SalutationAdapter.java
index 1d5ab519f..f5e2f80e0 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/SalutationAdapter.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/SalutationAdapter.java
@@ -20,7 +20,7 @@ package org.apache.openmeetings.db.bind.adapter;
 
 import static org.apache.commons.lang3.math.NumberUtils.toInt;
 
-import javax.xml.bind.annotation.adapters.XmlAdapter;
+import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 
 import org.apache.openmeetings.db.entity.user.User.Salutation;
 
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/UserRightAdapter.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/UserRightAdapter.java
index fdaf3dd53..ad7655f8c 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/UserRightAdapter.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/UserRightAdapter.java
@@ -20,7 +20,7 @@ package org.apache.openmeetings.db.bind.adapter;
 
 import java.util.Locale;
 
-import javax.xml.bind.annotation.adapters.XmlAdapter;
+import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.wicket.util.string.Strings;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/UserTypeAdapter.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/UserTypeAdapter.java
index bbb0256f0..be14a2046 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/UserTypeAdapter.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/UserTypeAdapter.java
@@ -20,7 +20,7 @@ package org.apache.openmeetings.db.bind.adapter;
 
 import java.util.Locale;
 
-import javax.xml.bind.annotation.adapters.XmlAdapter;
+import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.wicket.util.string.Strings;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
index 2624887f3..e8a6f2c17 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
@@ -24,8 +24,8 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.PARAM_USER_ID;
 import java.util.Date;
 import java.util.List;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
 
 import org.apache.openmeetings.db.entity.basic.ChatMessage;
 import org.springframework.stereotype.Repository;
diff --git 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
index dfff60d21..143eadb39 100644
--- 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
@@ -32,8 +32,9 @@ import java.util.List;
 import java.util.Set;
 import java.util.TimeZone;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
+import jakarta.inject.Inject;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
 
 import org.apache.openjpa.conf.OpenJPAConfiguration;
 import org.apache.openjpa.event.RemoteCommitProvider;
@@ -55,7 +56,7 @@ import org.apache.wicket.protocol.http.WebApplication;
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -84,11 +85,11 @@ public class ConfigurationDao implements IDataProviderDao<Configuration> {
 	@PersistenceContext
 	private EntityManager em;
 
-	@Autowired
+	@Inject
 	private UserDao userDao;
-	@Autowired
+	@Inject
 	private OAuth2Dao oauthDao;
-	@Autowired
+	@Inject
 	private IApplication app;
 
 	public void updateClusterAddresses(String addresses) throws UnknownHostException {
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/MailMessageDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/MailMessageDao.java
index b954828ab..0269dde33 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/MailMessageDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/MailMessageDao.java
@@ -24,8 +24,8 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.PARAM_STATUS;
 import java.util.Calendar;
 import java.util.List;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
 
 import org.apache.openmeetings.db.dao.IDataProviderDao;
 import org.apache.openmeetings.db.entity.basic.MailMessage;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java
index 209860fb7..fa67ae42b 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java
@@ -30,10 +30,11 @@ import java.util.Date;
 import java.util.List;
 import java.util.Set;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-import javax.persistence.TypedQuery;
+import jakarta.inject.Inject;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.Query;
+import jakarta.persistence.TypedQuery;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.openmeetings.db.dao.IDataProviderDao;
@@ -49,7 +50,7 @@ import org.apache.openmeetings.db.manager.IInvitationManager;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -59,15 +60,17 @@ public class AppointmentDao implements IDataProviderDao<Appointment>{
 	private static final Logger log = LoggerFactory.getLogger(AppointmentDao.class);
 	private static final String PARAM_START = "start";
 	private static final String PARAM_CALID = "calId";
+
 	@PersistenceContext
 	private EntityManager em;
-	@Autowired
+
+	@Inject
 	private MeetingMemberDao meetingMemberDao;
-	@Autowired
+	@Inject
 	private RoomDao roomDao;
-	@Autowired
+	@Inject
 	private ConfigurationDao cfgDao;
-	@Autowired
+	@Inject
 	private IInvitationManager invitationManager;
 
 	/*
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/MeetingMemberDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/MeetingMemberDao.java
index a45c24663..e20d8c572 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/MeetingMemberDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/MeetingMemberDao.java
@@ -24,8 +24,8 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
 
 import org.apache.openmeetings.db.entity.calendar.MeetingMember;
 import org.slf4j.Logger;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/OmCalendarDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/OmCalendarDao.java
index 21f9c834c..aca8fafd5 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/OmCalendarDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/OmCalendarDao.java
@@ -24,13 +24,14 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.PARAM_USER_ID;
 
 import java.util.List;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
+import jakarta.inject.Inject;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
 
 import org.apache.openmeetings.db.dao.IDataProviderDao;
 import org.apache.openmeetings.db.entity.calendar.OmCalendar;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -39,7 +40,8 @@ import org.springframework.transaction.annotation.Transactional;
 public class OmCalendarDao implements IDataProviderDao<OmCalendar> {
 	@PersistenceContext
 	private EntityManager em;
-	@Autowired
+
+	@Inject
 	private AppointmentDao appointmentDao;
 
 	public List<OmCalendar> get() {
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/BaseFileItemDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/BaseFileItemDao.java
index 9ef4ce279..8a4320a6b 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/BaseFileItemDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/BaseFileItemDao.java
@@ -23,8 +23,9 @@ import static org.apache.openmeetings.db.util.DaoHelper.single;
 
 import java.util.List;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
+import jakarta.inject.Inject;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
 
 import org.apache.openmeetings.db.dao.IDataProviderDao;
 import org.apache.openmeetings.db.dao.room.RoomDao;
@@ -38,7 +39,7 @@ import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -48,11 +49,12 @@ public class BaseFileItemDao implements IDataProviderDao<BaseFileItem> {
 	private static final Logger log = LoggerFactory.getLogger(BaseFileItemDao.class);
 	@PersistenceContext
 	protected EntityManager em;
-	@Autowired
+
+	@Inject
 	private RoomDao roomDao;
-	@Autowired
+	@Inject
 	private GroupDao groupDao;
-	@Autowired
+	@Inject
 	private UserDao userDao;
 
 	public <T extends BaseFileItem> T get(String hash, Class<T> clazz) {
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileItemDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileItemDao.java
index e3e5d3485..6c6f98145 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileItemDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileItemDao.java
@@ -25,7 +25,7 @@ import java.io.File;
 import java.util.Collection;
 import java.util.List;
 
-import javax.persistence.TypedQuery;
+import jakarta.persistence.TypedQuery;
 
 import org.apache.openmeetings.db.entity.file.BaseFileItem;
 import org.apache.openmeetings.db.entity.file.BaseFileItem.Type;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileItemLogDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileItemLogDao.java
index 1bccb9c46..0bc68bb22 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileItemLogDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileItemLogDao.java
@@ -21,8 +21,8 @@ package org.apache.openmeetings.db.dao.file;
 import java.util.Date;
 import java.util.List;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
 
 import org.apache.openmeetings.db.entity.file.BaseFileItem;
 import org.apache.openmeetings.db.entity.file.FileItemLog;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/log/ConferenceLogDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/log/ConferenceLogDao.java
index 8c25f8504..107597fa0 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/log/ConferenceLogDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/log/ConferenceLogDao.java
@@ -20,8 +20,8 @@ package org.apache.openmeetings.db.dao.log;
 
 import java.util.Date;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
 
 import org.apache.openmeetings.db.entity.log.ConferenceLog;
 import org.apache.openmeetings.db.entity.log.ConferenceLog.Type;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingChunkDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingChunkDao.java
index bc09bb106..bb5ef7e83 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingChunkDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingChunkDao.java
@@ -23,15 +23,16 @@ import static org.apache.openmeetings.db.util.DaoHelper.only;
 import java.util.Date;
 import java.util.List;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
+import jakarta.inject.Inject;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
 
 import org.apache.openmeetings.db.entity.record.RecordingChunk;
 import org.apache.openmeetings.db.entity.record.RecordingChunk.Status;
 import org.apache.openmeetings.db.entity.record.RecordingChunk.Type;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -42,7 +43,8 @@ public class RecordingChunkDao {
 	private static final String PARAM_RECID = "recordingId";
 	@PersistenceContext
 	private EntityManager em;
-	@Autowired
+
+	@Inject
 	private RecordingDao recordingDao;
 
 	public RecordingChunk get(Long id) {
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java
index b45278781..9a053bc92 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java
@@ -28,7 +28,8 @@ import java.time.Instant;
 import java.util.Date;
 import java.util.List;
 
-import javax.persistence.TypedQuery;
+import jakarta.inject.Inject;
+import jakarta.persistence.TypedQuery;
 
 import org.apache.openmeetings.db.dao.file.BaseFileItemDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
@@ -39,7 +40,7 @@ import org.apache.openmeetings.db.entity.record.Recording.Status;
 import org.apache.openmeetings.db.entity.user.GroupUser;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -52,7 +53,7 @@ import org.springframework.transaction.annotation.Transactional;
 public class RecordingDao extends BaseFileItemDao {
 	private static final Logger log = LoggerFactory.getLogger(RecordingDao.class);
 
-	@Autowired
+	@Inject
 	private UserDao userDao;
 
 	@Override
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/ExtraMenuDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/ExtraMenuDao.java
index 814c2d2c1..1a975f490 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/ExtraMenuDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/ExtraMenuDao.java
@@ -24,12 +24,12 @@ import static org.apache.openmeetings.db.util.DaoHelper.single;
 
 import java.util.List;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Predicate;
+import jakarta.persistence.criteria.Root;
 
 import org.apache.openmeetings.db.dao.IGroupAdminDataProviderDao;
 import org.apache.openmeetings.db.entity.room.ExtraMenu;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/InvitationDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/InvitationDao.java
index 54c7b015c..3c1a2eaea 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/InvitationDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/InvitationDao.java
@@ -27,13 +27,13 @@ import java.time.ZonedDateTime;
 import java.util.List;
 import java.util.TimeZone;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-import javax.persistence.criteria.Subquery;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Predicate;
+import jakarta.persistence.criteria.Root;
+import jakarta.persistence.criteria.Subquery;
 
 import org.apache.openmeetings.db.dao.IDataProviderDao;
 import org.apache.openmeetings.db.entity.record.Recording;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/PollDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/PollDao.java
index c2d42b649..4707a3af6 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/PollDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/PollDao.java
@@ -24,9 +24,9 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.PARAM_USER_ID;
 import java.util.Date;
 import java.util.List;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.Query;
 
 import org.apache.openmeetings.db.entity.room.RoomPoll;
 import org.apache.openmeetings.db.entity.room.RoomPollAnswer;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java
index 9eed7c2fb..76c820fc0 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java
@@ -35,13 +35,14 @@ import java.util.List;
 import java.util.Set;
 import java.util.TimeZone;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.TypedQuery;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
+import jakarta.inject.Inject;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.TypedQuery;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Predicate;
+import jakarta.persistence.criteria.Root;
 
 import org.apache.openmeetings.db.dao.IGroupAdminDataProviderDao;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
@@ -58,7 +59,7 @@ import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -73,11 +74,11 @@ public class RoomDao implements IGroupAdminDataProviderDao<Room> {
 
 	@PersistenceContext
 	private EntityManager em;
-	@Autowired
+	@Inject
 	private ConfigurationDao cfgDao;
-	@Autowired
+	@Inject
 	private ISipManager sipManager;
-	@Autowired
+	@Inject
 	private UserDao userDao;
 
 	@Override
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/LdapConfigDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/LdapConfigDao.java
index d2a6a5ea0..9e9520d2c 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/LdapConfigDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/LdapConfigDao.java
@@ -24,10 +24,11 @@ import static org.apache.openmeetings.db.util.DaoHelper.setLimits;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.PersistenceException;
-import javax.persistence.TypedQuery;
+import jakarta.inject.Inject;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.PersistenceException;
+import jakarta.persistence.TypedQuery;
 
 import org.apache.openmeetings.db.dao.IDataProviderDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
@@ -36,7 +37,7 @@ import org.apache.openmeetings.db.util.DaoHelper;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -56,7 +57,7 @@ public class LdapConfigDao implements IDataProviderDao<LdapConfig> {
 	@PersistenceContext
 	private EntityManager em;
 
-	@Autowired
+	@Inject
 	private UserDao userDao;
 
 	@Override
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/OAuth2Dao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/OAuth2Dao.java
index c626c510c..3dc7872e8 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/OAuth2Dao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/OAuth2Dao.java
@@ -24,8 +24,9 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.isAllowRegister
 
 import java.util.List;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
+import jakarta.inject.Inject;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
 
 import org.apache.openmeetings.db.dao.IDataProviderDao;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
@@ -33,7 +34,7 @@ import org.apache.openmeetings.db.entity.server.LdapConfig;
 import org.apache.openmeetings.db.entity.server.OAuthServer;
 import org.apache.openmeetings.db.util.DaoHelper;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -43,7 +44,8 @@ public class OAuth2Dao implements IDataProviderDao<OAuthServer> {
 	private static final List<String> searchFields = List.of("name");
 	@PersistenceContext
 	private EntityManager em;
-	@Autowired
+
+	@Inject
 	private ConfigurationDao cfgDao;
 
 	public List<OAuthServer> getActive() {
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/SOAPLoginDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/SOAPLoginDao.java
index 5dbeab254..da55f07c2 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/SOAPLoginDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/SOAPLoginDao.java
@@ -23,8 +23,8 @@ import static org.apache.openmeetings.db.util.DaoHelper.only;
 
 import java.util.Date;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
 
 import org.apache.openmeetings.db.dto.room.RoomOptionsDTO;
 import org.apache.openmeetings.db.entity.server.SOAPLogin;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/SessiondataDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/SessiondataDao.java
index fd67e9b05..d8da2e383 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/SessiondataDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/SessiondataDao.java
@@ -23,8 +23,8 @@ import static java.util.UUID.randomUUID;
 import java.util.Date;
 import java.util.List;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
 
 import org.apache.openmeetings.db.entity.server.Sessiondata;
 import org.slf4j.Logger;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupDao.java
index 7c0303479..22effd4fe 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupDao.java
@@ -25,12 +25,12 @@ import static org.apache.openmeetings.db.util.DaoHelper.setLimits;
 import java.util.Collection;
 import java.util.List;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Predicate;
+import jakarta.persistence.criteria.Root;
 
 import org.apache.openmeetings.db.dao.IGroupAdminDataProviderDao;
 import org.apache.openmeetings.db.entity.user.Group;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupUserDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupUserDao.java
index d72e4fc4e..3d10ba07c 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupUserDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupUserDao.java
@@ -27,12 +27,12 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.PARAM_USER_ID;
 import java.util.Date;
 import java.util.List;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Predicate;
+import jakarta.persistence.criteria.Root;
 
 import org.apache.openmeetings.db.dao.IDataProviderDao;
 import org.apache.openmeetings.db.entity.user.GroupUser;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/PrivateMessageDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/PrivateMessageDao.java
index b6ad0bd7d..3e14a9de7 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/PrivateMessageDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/PrivateMessageDao.java
@@ -28,10 +28,10 @@ import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-import javax.persistence.TypedQuery;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.Query;
+import jakarta.persistence.TypedQuery;
 
 import org.apache.openmeetings.db.dao.IDataProviderDao;
 import org.apache.openmeetings.db.entity.user.PrivateMessage;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/PrivateMessageFolderDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/PrivateMessageFolderDao.java
index 9fd437aa0..165d2a130 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/PrivateMessageFolderDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/PrivateMessageFolderDao.java
@@ -25,8 +25,8 @@ import static org.apache.openmeetings.db.util.DaoHelper.setLimits;
 import java.util.Date;
 import java.util.List;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
 
 import org.apache.openmeetings.db.dao.IDataProviderDao;
 import org.apache.openmeetings.db.entity.user.PrivateMessageFolder;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserContactDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserContactDao.java
index f6576d09e..332325f25 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserContactDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserContactDao.java
@@ -25,14 +25,15 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.PARAM_USER_ID;
 import java.util.Date;
 import java.util.List;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.TypedQuery;
+import jakarta.inject.Inject;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.TypedQuery;
 
 import org.apache.openmeetings.db.entity.user.UserContact;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -43,7 +44,8 @@ public class UserContactDao {
 	private static final String PARAM_OWNERID = "ownerId";
 	@PersistenceContext
 	private EntityManager em;
-	@Autowired
+
+	@Inject
 	private UserDao userDao;
 
 	public UserContact add(Long userId, Long ownerId, boolean pending) {
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
index 41ecfd549..aff76369c 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
@@ -44,14 +44,15 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Set;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.JoinType;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-import javax.persistence.criteria.Subquery;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.TypedQuery;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.JoinType;
+import jakarta.persistence.criteria.Predicate;
+import jakarta.persistence.criteria.Root;
+import jakarta.persistence.criteria.Subquery;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.openmeetings.db.dao.IGroupAdminDataProviderDao;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/basic/Health.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/basic/Health.java
index 718802dfd..6b6310d24 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/basic/Health.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/basic/Health.java
@@ -22,9 +22,9 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.isInitComplete;
 
 import java.io.Serializable;
 
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlRootElement;
 
 @XmlRootElement
 @XmlAccessorType(XmlAccessType.FIELD)
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/basic/Info.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/basic/Info.java
index cd31c4a24..c8f0fdd8c 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/basic/Info.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/basic/Info.java
@@ -20,9 +20,9 @@ package org.apache.openmeetings.db.dto.basic;
 
 import java.io.Serializable;
 
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlRootElement;
 
 import org.apache.openmeetings.util.OmVersion;
 
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/basic/ServiceResult.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/basic/ServiceResult.java
index de3ed5ddc..a26e8f95f 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/basic/ServiceResult.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/basic/ServiceResult.java
@@ -20,10 +20,10 @@ package org.apache.openmeetings.db.dto.basic;
 
 import java.io.Serializable;
 
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlType;
 
 import org.apache.openmeetings.util.OmException;
 
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java
index 2a904e002..f197924a2 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java
@@ -25,9 +25,9 @@ import java.util.Date;
 import java.util.List;
 import java.util.TimeZone;
 
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlRootElement;
 
 import org.apache.openmeetings.db.dto.room.RoomDTO;
 import org.apache.openmeetings.db.dto.user.UserDTO;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
index 4fa265da7..0a5875132 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
@@ -22,9 +22,9 @@ import static org.apache.openmeetings.db.util.DtoHelper.optLong;
 
 import java.io.Serializable;
 
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlRootElement;
 
 import org.apache.openmeetings.db.dto.user.UserDTO;
 import org.apache.openmeetings.db.entity.calendar.MeetingMember;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerObject.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerObject.java
index e1c77eaca..67965760e 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerObject.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerObject.java
@@ -21,9 +21,9 @@ package org.apache.openmeetings.db.dto.file;
 import java.io.Serializable;
 import java.util.List;
 
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlRootElement;
 
 import org.apache.openmeetings.db.entity.file.FileItem;
 
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileItemDTO.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileItemDTO.java
index d92977504..3e8b6fdd5 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileItemDTO.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileItemDTO.java
@@ -22,9 +22,9 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlRootElement;
 
 import org.apache.openmeetings.db.entity.file.BaseFileItem.Type;
 import org.apache.openmeetings.db.entity.file.FileItem;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/record/RecordingDTO.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/record/RecordingDTO.java
index 4ccaf5ced..36351c5d6 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/record/RecordingDTO.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/record/RecordingDTO.java
@@ -23,9 +23,9 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlRootElement;
 
 import org.apache.openmeetings.db.entity.record.Recording;
 
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/InvitationDTO.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/InvitationDTO.java
index d9741506d..c531d4fa1 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/InvitationDTO.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/InvitationDTO.java
@@ -20,9 +20,9 @@ package org.apache.openmeetings.db.dto.room;
 
 import java.io.Serializable;
 
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlRootElement;
 
 import org.apache.openmeetings.db.entity.room.Invitation.Valid;
 
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
index f774f1bb8..76c950d87 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
@@ -29,9 +29,9 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlRootElement;
 
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomFileDTO.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomFileDTO.java
index 053f7f9c4..1adb40567 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomFileDTO.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomFileDTO.java
@@ -24,9 +24,9 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlRootElement;
 
 import org.apache.openmeetings.db.entity.room.RoomFile;
 
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomOptionsDTO.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomOptionsDTO.java
index 000762a24..1509e5248 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomOptionsDTO.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomOptionsDTO.java
@@ -22,9 +22,9 @@ import static org.apache.openmeetings.db.util.DtoHelper.optLong;
 
 import java.io.Serializable;
 
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlRootElement;
 
 import com.github.openjson.JSONObject;
 
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/ExternalUserDTO.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/ExternalUserDTO.java
index 2f1403005..f3c2964e2 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/ExternalUserDTO.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/ExternalUserDTO.java
@@ -20,9 +20,9 @@ package org.apache.openmeetings.db.dto.user;
 
 import java.io.Serializable;
 
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlRootElement;
 
 import com.github.openjson.JSONObject;
 
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/GroupDTO.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/GroupDTO.java
index 828d8006e..700b46297 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/GroupDTO.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/GroupDTO.java
@@ -22,7 +22,7 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
 
 import org.apache.openmeetings.db.entity.user.Group;
 
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
index b4848be43..dbd77aa15 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
@@ -28,7 +28,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import javax.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
 
 import org.apache.openmeetings.db.entity.user.Address;
 import org.apache.openmeetings.db.entity.user.User;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserSearchResult.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserSearchResult.java
index 04530d1d2..caf9b370c 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserSearchResult.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserSearchResult.java
@@ -21,7 +21,7 @@ package org.apache.openmeetings.db.dto.user;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
 
 import org.apache.openmeetings.db.dto.basic.SearchResult;
 import org.apache.openmeetings.db.entity.user.User;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/HistoricalEntity.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/HistoricalEntity.java
index 916985cda..978cb1129 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/HistoricalEntity.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/HistoricalEntity.java
@@ -20,14 +20,14 @@ package org.apache.openmeetings.db.entity;
 
 import java.util.Date;
 
-import javax.persistence.Column;
-import javax.persistence.MappedSuperclass;
-import javax.persistence.PrePersist;
-import javax.persistence.PreUpdate;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.Column;
+import jakarta.persistence.MappedSuperclass;
+import jakarta.persistence.PrePersist;
+import jakarta.persistence.PreUpdate;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openmeetings.db.bind.adapter.BooleanAdapter;
 import org.apache.openmeetings.db.bind.adapter.DateAdapter;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java
index 13512f900..6d14f6eb0 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java
@@ -22,23 +22,23 @@ import static org.apache.openmeetings.db.bind.Constants.CHAT_NODE;
 
 import java.util.Date;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.Lob;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.Lob;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openjpa.persistence.jdbc.ForeignKey;
 import org.apache.openmeetings.db.bind.adapter.BooleanAdapter;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Configuration.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Configuration.java
index 6b94bb824..529ccdded 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Configuration.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Configuration.java
@@ -21,25 +21,25 @@ package org.apache.openmeetings.db.entity.basic;
 import static java.lang.Boolean.TRUE;
 import static org.apache.openmeetings.db.bind.Constants.CFG_NODE;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Index;
-import javax.persistence.JoinColumn;
-import javax.persistence.Lob;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Index;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.Lob;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openjpa.persistence.jdbc.ForeignKey;
 import org.apache.openmeetings.db.bind.adapter.ConfigTypeAdapter;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/MailMessage.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/MailMessage.java
index 90a296243..4eb756697 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/MailMessage.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/MailMessage.java
@@ -20,16 +20,16 @@ package org.apache.openmeetings.db.entity.basic;
 
 import java.io.IOException;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Lob;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Lob;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
 
 import org.apache.openmeetings.db.entity.HistoricalEntity;
 import org.apache.openmeetings.util.mail.IcalHandler;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/Appointment.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/Appointment.java
index e592d3bcb..8bd27db77 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/Appointment.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/Appointment.java
@@ -26,28 +26,28 @@ import java.util.Date;
 import java.util.List;
 import java.util.TimeZone;
 
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Index;
-import javax.persistence.JoinColumn;
-import javax.persistence.Lob;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Index;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.Lob;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.Table;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlTransient;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openjpa.persistence.jdbc.ForeignKey;
 import org.apache.openmeetings.db.bind.adapter.AppointmentReminderAdapter;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/MeetingMember.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/MeetingMember.java
index 63a5de1e1..d3ab90cef 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/MeetingMember.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/MeetingMember.java
@@ -20,24 +20,24 @@ package org.apache.openmeetings.db.entity.calendar;
 
 import static org.apache.openmeetings.db.bind.Constants.MMEMBER_NODE;
 
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToOne;
+import jakarta.persistence.Table;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlTransient;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openjpa.persistence.jdbc.ForeignKey;
 import org.apache.openmeetings.db.bind.adapter.AppointmentAdapter;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/OmCalendar.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/OmCalendar.java
index 0dd1bfca8..7392bb908 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/OmCalendar.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/OmCalendar.java
@@ -20,23 +20,23 @@ package org.apache.openmeetings.db.entity.calendar;
 
 import static org.apache.openmeetings.db.bind.Constants.CALENDAR_NODE;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openjpa.persistence.jdbc.ForeignKey;
 import org.apache.openmeetings.db.bind.adapter.LongAdapter;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/BaseFileItem.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/BaseFileItem.java
index ccab06e80..a03d09ca7 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/BaseFileItem.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/BaseFileItem.java
@@ -36,23 +36,23 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Index;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Index;
+import jakarta.persistence.Inheritance;
+import jakarta.persistence.InheritanceType;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlTransient;
+import jakarta.xml.bind.annotation.XmlType;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openmeetings.db.bind.adapter.FileTypeAdapter;
 import org.apache.openmeetings.db.bind.adapter.IntAdapter;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItem.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItem.java
index 90e84f5b0..fd8b147a8 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItem.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItem.java
@@ -20,14 +20,14 @@ package org.apache.openmeetings.db.entity.file;
 
 import static org.apache.openmeetings.db.bind.Constants.FILE_NODE;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.NamedQuery;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.NamedQuery;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openmeetings.db.bind.adapter.LongAdapter;
 
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItemLog.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItemLog.java
index b88205963..045f57718 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItemLog.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItemLog.java
@@ -22,14 +22,14 @@ import static org.apache.openmeetings.util.process.ProcessResult.ZERO;
 
 import java.util.Date;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Lob;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Lob;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
 
 import org.apache.openmeetings.db.entity.IDataProviderEntity;
 
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/log/ConferenceLog.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/log/ConferenceLog.java
index aab393b79..56a5e9437 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/log/ConferenceLog.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/log/ConferenceLog.java
@@ -20,15 +20,15 @@ package org.apache.openmeetings.db.entity.log;
 
 import java.util.Date;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
 
 import org.apache.openmeetings.db.entity.IDataProviderEntity;
 
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java
index 2253b34c4..7555aa00f 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java
@@ -26,22 +26,22 @@ import static org.apache.openmeetings.util.OmFileHelper.RECORDING_FILE_NAME;
 import java.util.Date;
 import java.util.List;
 
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.FetchType;
-import javax.persistence.JoinColumn;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlElementWrapper;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlType;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openjpa.persistence.FetchAttribute;
 import org.apache.openjpa.persistence.FetchGroup;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/RecordingChunk.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/RecordingChunk.java
index 5cf2ee32a..3d4bd4d99 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/RecordingChunk.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/RecordingChunk.java
@@ -20,25 +20,25 @@ package org.apache.openmeetings.db.entity.record;
 
 import java.util.Date;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlTransient;
+import jakarta.xml.bind.annotation.XmlType;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openjpa.persistence.jdbc.ForeignKey;
 import org.apache.openmeetings.db.bind.adapter.DateAdapter;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/ExtraMenu.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/ExtraMenu.java
index cf8ede7b9..229b77a2e 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/ExtraMenu.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/ExtraMenu.java
@@ -23,23 +23,23 @@ import static org.apache.openmeetings.db.bind.Constants.EXTRA_MENU_NODE;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.persistence.CollectionTable;
-import javax.persistence.Column;
-import javax.persistence.ElementCollection;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.CollectionTable;
+import jakarta.persistence.Column;
+import jakarta.persistence.ElementCollection;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlElementWrapper;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openmeetings.db.bind.adapter.LongAdapter;
 import org.apache.openmeetings.db.entity.IDataProviderEntity;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Invitation.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Invitation.java
index be1295ae8..981c26d8c 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Invitation.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Invitation.java
@@ -21,21 +21,21 @@ package org.apache.openmeetings.db.entity.room;
 import java.util.Date;
 import java.util.stream.Stream;
 
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Index;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.persistence.Transient;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Index;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
 
 import org.apache.openjpa.persistence.jdbc.ForeignKey;
 import org.apache.openmeetings.db.entity.HistoricalEntity;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java
index 09dd3ebf7..f96ca0a4d 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java
@@ -29,31 +29,31 @@ import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 
-import javax.persistence.CascadeType;
-import javax.persistence.CollectionTable;
-import javax.persistence.Column;
-import javax.persistence.ElementCollection;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Index;
-import javax.persistence.JoinColumn;
-import javax.persistence.Lob;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.CollectionTable;
+import jakarta.persistence.Column;
+import jakarta.persistence.ElementCollection;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Index;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.Lob;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.Table;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlElementWrapper;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlTransient;
+import jakarta.xml.bind.annotation.XmlType;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openjpa.persistence.ElementDependent;
 import org.apache.openjpa.persistence.FetchAttribute;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomFile.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomFile.java
index a9e4d71de..fdd1cc440 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomFile.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomFile.java
@@ -20,20 +20,20 @@ package org.apache.openmeetings.db.entity.room;
 
 import static org.apache.openmeetings.db.bind.Constants.ROOM_FILE_NODE;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.Table;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openjpa.persistence.jdbc.ForeignKey;
 import org.apache.openmeetings.db.bind.adapter.FileAdapter;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomGroup.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomGroup.java
index 495979f22..07785d07b 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomGroup.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomGroup.java
@@ -20,21 +20,21 @@ package org.apache.openmeetings.db.entity.room;
 
 import static org.apache.openmeetings.db.bind.Constants.ROOM_GRP_NODE;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openjpa.persistence.jdbc.ForeignKey;
 import org.apache.openmeetings.db.bind.adapter.GroupAdapter;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomModerator.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomModerator.java
index f26fd32f9..5a5725876 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomModerator.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomModerator.java
@@ -18,22 +18,22 @@
  */
 package org.apache.openmeetings.db.entity.room;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlTransient;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openjpa.persistence.jdbc.ForeignKey;
 import org.apache.openmeetings.db.bind.adapter.BooleanAdapter;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomPoll.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomPoll.java
index f34776994..f917b9e24 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomPoll.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomPoll.java
@@ -24,28 +24,28 @@ import java.util.Date;
 import java.util.LinkedList;
 import java.util.List;
 
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.OneToOne;
+import jakarta.persistence.Table;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlElementWrapper;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlTransient;
+import jakarta.xml.bind.annotation.XmlType;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openjpa.persistence.jdbc.ForeignKey;
 import org.apache.openmeetings.db.bind.adapter.BooleanAdapter;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomPollAnswer.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomPollAnswer.java
index 43e6bacf2..83afe02f4 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomPollAnswer.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomPollAnswer.java
@@ -20,22 +20,22 @@ package org.apache.openmeetings.db.entity.room;
 
 import java.util.Date;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToOne;
+import jakarta.persistence.Table;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlTransient;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openjpa.persistence.jdbc.ForeignKey;
 import org.apache.openmeetings.db.bind.adapter.BooleanAdapter;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/LdapConfig.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/LdapConfig.java
index 1e322e548..40f64af8f 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/LdapConfig.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/LdapConfig.java
@@ -20,23 +20,23 @@ package org.apache.openmeetings.db.entity.server;
 
 import static org.apache.openmeetings.db.bind.Constants.LDAP_NODE;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.Lob;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.Lob;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlTransient;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openjpa.persistence.jdbc.ForeignKey;
 import org.apache.openmeetings.db.bind.adapter.BooleanAdapter;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/OAuthServer.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/OAuthServer.java
index 049eba852..9e55662cb 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/OAuthServer.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/OAuthServer.java
@@ -23,27 +23,27 @@ import static org.apache.openmeetings.db.bind.Constants.OAUTH_NODE;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
-import javax.persistence.CollectionTable;
-import javax.persistence.Column;
-import javax.persistence.ElementCollection;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.MapKeyColumn;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAnyElement;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.CollectionTable;
+import jakarta.persistence.Column;
+import jakarta.persistence.ElementCollection;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.MapKeyColumn;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlAnyElement;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlTransient;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openmeetings.db.bind.adapter.BooleanAdapter;
 import org.apache.openmeetings.db.bind.adapter.LongAdapter;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/SOAPLogin.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/SOAPLogin.java
index 6f884a62f..e57771e5e 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/SOAPLogin.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/SOAPLogin.java
@@ -21,14 +21,14 @@ package org.apache.openmeetings.db.entity.server;
 import java.io.Serializable;
 import java.util.Date;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Index;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Index;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
 
 @Entity
 @Table(name = "soaplogin", indexes = {
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/Sessiondata.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/Sessiondata.java
index 9ba80c533..3e44cc67c 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/Sessiondata.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/server/Sessiondata.java
@@ -21,18 +21,18 @@ package org.apache.openmeetings.db.entity.server;
 import java.io.Serializable;
 import java.util.Date;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Index;
-import javax.persistence.Lob;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlRootElement;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Index;
+import jakarta.persistence.Lob;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlRootElement;
 
 @Entity
 @NamedQuery(name = "getSessionById", query = "SELECT s FROM Sessiondata s WHERE s.sessionId LIKE :sessionId")
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Address.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Address.java
index 4836fed09..99f8118f8 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Address.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Address.java
@@ -18,19 +18,19 @@
  */
 package org.apache.openmeetings.db.entity.user;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Index;
-import javax.persistence.Lob;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Index;
+import jakarta.persistence.Lob;
+import jakarta.persistence.Table;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlTransient;
 
 import org.apache.openmeetings.db.entity.HistoricalEntity;
 
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/AsteriskSipUser.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/AsteriskSipUser.java
index 1e9404c7d..30267895d 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/AsteriskSipUser.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/AsteriskSipUser.java
@@ -20,20 +20,20 @@ package org.apache.openmeetings.db.entity.user;
 
 import java.io.Serializable;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlType;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openmeetings.db.bind.adapter.IntAdapter;
 import org.apache.openmeetings.db.bind.adapter.LongAdapter;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.java
index 30b0c33e9..ee91698b1 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Group.java
@@ -20,20 +20,20 @@ package org.apache.openmeetings.db.entity.user;
 
 import static org.apache.openmeetings.db.bind.Constants.GROUP_NODE;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Index;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Index;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlTransient;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openmeetings.db.bind.adapter.BooleanAdapter;
 import org.apache.openmeetings.db.bind.adapter.IntAdapter;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/GroupUser.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/GroupUser.java
index b693ef542..7df5736a0 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/GroupUser.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/GroupUser.java
@@ -18,22 +18,22 @@
  */
 package org.apache.openmeetings.db.entity.user;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlTransient;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openjpa.persistence.jdbc.ForeignKey;
 import org.apache.openmeetings.db.bind.adapter.BooleanAdapter;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/PrivateMessage.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/PrivateMessage.java
index 3ca489ce2..d50aedb17 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/PrivateMessage.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/PrivateMessage.java
@@ -22,23 +22,23 @@ import static org.apache.openmeetings.db.bind.Constants.MSG_NODE;
 
 import java.util.Date;
 
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.Lob;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.Lob;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openjpa.persistence.jdbc.ForeignKey;
 import org.apache.openmeetings.db.bind.adapter.BooleanAdapter;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/PrivateMessageFolder.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/PrivateMessageFolder.java
index 310b225ab..87bf1d081 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/PrivateMessageFolder.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/PrivateMessageFolder.java
@@ -22,19 +22,18 @@ import static org.apache.openmeetings.db.bind.Constants.MSG_FOLDER_NODE;
 
 import java.util.Date;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlTransient;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openmeetings.db.bind.adapter.DateAdapter;
 import org.apache.openmeetings.db.bind.adapter.LongAdapter;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
index 7bf3340fc..220826e97 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
@@ -36,34 +36,34 @@ import java.util.Set;
 import java.util.StringJoiner;
 import java.util.stream.Stream;
 
-import javax.persistence.Basic;
-import javax.persistence.CascadeType;
-import javax.persistence.CollectionTable;
-import javax.persistence.Column;
-import javax.persistence.ElementCollection;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Index;
-import javax.persistence.JoinColumn;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
-import javax.persistence.PrimaryKeyJoinColumn;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.Basic;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.CollectionTable;
+import jakarta.persistence.Column;
+import jakarta.persistence.ElementCollection;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Index;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.OneToOne;
+import jakarta.persistence.PrimaryKeyJoinColumn;
+import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlElementWrapper;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlTransient;
+import jakarta.xml.bind.annotation.XmlType;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openjpa.persistence.ElementDependent;
 import org.apache.openjpa.persistence.FetchAttribute;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/UserContact.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/UserContact.java
index bbf8b67df..fed9a1a97 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/UserContact.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/UserContact.java
@@ -23,22 +23,22 @@ import static org.apache.openmeetings.db.bind.Constants.CONTACT_NODE;
 import java.io.Serializable;
 import java.util.Date;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlTransient;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openjpa.persistence.jdbc.ForeignKey;
 import org.apache.openmeetings.db.bind.adapter.BooleanAdapter;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/CalendarMapper.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/CalendarMapper.java
index 6fd6d68f1..a12beaae2 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/CalendarMapper.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/CalendarMapper.java
@@ -30,18 +30,20 @@ import org.apache.openmeetings.db.entity.calendar.Appointment;
 import org.apache.openmeetings.db.entity.calendar.MeetingMember;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.wicket.util.string.Strings;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Component;
 
+import jakarta.inject.Inject;
+
 @Component
 public class CalendarMapper {
-	@Autowired
+	@Inject
 	private UserDao userDao;
-	@Autowired
+	@Inject
 	private AppointmentDao appointmentDao;
-	@Autowired
+	@Inject
 	private UserMapper uMapper;
-	@Autowired
+	@Inject
 	private RoomMapper rMapper;
 
 	public Appointment get(AppointmentDTO dto, User u) {
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/RoomMapper.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/RoomMapper.java
index 51020af71..39b18cdcc 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/RoomMapper.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/RoomMapper.java
@@ -41,20 +41,22 @@ import org.apache.openmeetings.util.crypt.CryptProvider;
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Component;
 
+import jakarta.inject.Inject;
+
 @Component
 public class RoomMapper {
 	private static final Logger log = LoggerFactory.getLogger(RoomMapper.class);
 	private static final FastDateFormat SDF = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");
-	@Autowired
+	@Inject
 	private RoomDao roomDao;
-	@Autowired
+	@Inject
 	private UserDao userDao;
-	@Autowired
+	@Inject
 	private GroupDao groupDao;
-	@Autowired
+	@Inject
 	private FileItemDao fileDao;
 
 	public Room get(RoomDTO dto) {
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/UserMapper.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/UserMapper.java
index cd5fc13fe..23d9fc740 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/UserMapper.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/UserMapper.java
@@ -26,14 +26,16 @@ import org.apache.openmeetings.db.entity.user.Group;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Type;
 import org.apache.wicket.util.string.Strings;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Component;
 
+import jakarta.inject.Inject;
+
 @Component
 public class UserMapper {
-	@Autowired
+	@Inject
 	private UserDao userDao;
-	@Autowired
+	@Inject
 	private GroupDao groupDao;
 
 	public User get(UserDTO dto) {
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/DaoHelper.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/DaoHelper.java
index 3e5515e7e..3a3435e52 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/DaoHelper.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/DaoHelper.java
@@ -24,16 +24,16 @@ import java.util.function.BiFunction;
 import java.util.function.Function;
 import java.util.stream.Stream;
 
-import javax.persistence.EntityManager;
-import javax.persistence.TypedQuery;
-import javax.persistence.criteria.AbstractQuery;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Expression;
-import javax.persistence.criteria.Path;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-import javax.persistence.criteria.Subquery;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.TypedQuery;
+import jakarta.persistence.criteria.AbstractQuery;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Expression;
+import jakarta.persistence.criteria.Path;
+import jakarta.persistence.criteria.Predicate;
+import jakarta.persistence.criteria.Root;
+import jakarta.persistence.criteria.Subquery;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.openjpa.persistence.OpenJPAEntityManager;
diff --git a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java
index c47267b1f..fdc95b1eb 100644
--- a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java
+++ b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java
@@ -62,8 +62,9 @@ import java.util.concurrent.atomic.AtomicInteger;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.Marshaller;
+import jakarta.inject.Inject;
+import jakarta.xml.bind.JAXBContext;
+import jakarta.xml.bind.Marshaller;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.openmeetings.db.dao.basic.ChatDao;
@@ -101,7 +102,7 @@ import org.apache.openmeetings.installation.ImportInitvalues;
 import org.apache.openmeetings.installation.InstallationConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Component;
 
 /**
@@ -120,39 +121,39 @@ public class BackupExport {
  ###############################################
 """;
 
-	@Autowired
+	@Inject
 	private AppointmentDao appointmentDao;
-	@Autowired
+	@Inject
 	private OmCalendarDao calendarDao;
-	@Autowired
+	@Inject
 	private FileItemDao fileItemDao;
-	@Autowired
+	@Inject
 	private RecordingDao recordingDao;
-	@Autowired
+	@Inject
 	private UserDao userDao;
-	@Autowired
+	@Inject
 	private MeetingMemberDao meetingMemberDao;
-	@Autowired
+	@Inject
 	private LdapConfigDao ldapConfigDao;
-	@Autowired
+	@Inject
 	private PrivateMessageDao privateMessageDao;
-	@Autowired
+	@Inject
 	private PrivateMessageFolderDao privateMessageFolderDao;
-	@Autowired
+	@Inject
 	private UserContactDao userContactDao;
-	@Autowired
+	@Inject
 	private PollDao pollManager;
-	@Autowired
+	@Inject
 	private ConfigurationDao configurationDao;
-	@Autowired
+	@Inject
 	private ChatDao chatDao;
-	@Autowired
+	@Inject
 	private OAuth2Dao auth2Dao;
-	@Autowired
+	@Inject
 	private GroupDao groupDao;
-	@Autowired
+	@Inject
 	private RoomDao roomDao;
-	@Autowired
+	@Inject
 	private ExtraMenuDao menuDao;
 
 	public void performExport(File zip, boolean includeFiles, AtomicInteger progress) throws Exception {
diff --git a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
index 5f1d85126..d2648b120 100644
--- a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
+++ b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
@@ -167,8 +167,9 @@ import java.util.regex.Pattern;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.Unmarshaller;
+import jakarta.inject.Inject;
+import jakarta.xml.bind.JAXBContext;
+import jakarta.xml.bind.Unmarshaller;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamConstants;
 import javax.xml.stream.XMLStreamReader;
@@ -236,7 +237,7 @@ import org.apache.openmeetings.util.crypt.SCryptImplementation;
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Component;
 
 @Component
@@ -322,41 +323,41 @@ public class BackupImport {
 			);
 	private static final Pattern UUID_PATTERN = Pattern.compile("^[\\da-f]{8}(?:-[\\da-f]{4}){3}-[\\da-f]{12}$");
 
-	@Autowired
+	@Inject
 	private AppointmentDao appointmentDao;
-	@Autowired
+	@Inject
 	private OmCalendarDao calendarDao;
-	@Autowired
+	@Inject
 	private RoomDao roomDao;
-	@Autowired
+	@Inject
 	private UserDao userDao;
-	@Autowired
+	@Inject
 	private RecordingDao recordingDao;
-	@Autowired
+	@Inject
 	private PrivateMessageFolderDao privateMessageFolderDao;
-	@Autowired
+	@Inject
 	private PrivateMessageDao privateMessageDao;
-	@Autowired
+	@Inject
 	private MeetingMemberDao meetingMemberDao;
-	@Autowired
+	@Inject
 	private LdapConfigDao ldapConfigDao;
-	@Autowired
+	@Inject
 	private FileItemDao fileItemDao;
-	@Autowired
+	@Inject
 	private UserContactDao userContactDao;
-	@Autowired
+	@Inject
 	private PollDao pollDao;
-	@Autowired
+	@Inject
 	private ConfigurationDao cfgDao;
-	@Autowired
+	@Inject
 	private ChatDao chatDao;
-	@Autowired
+	@Inject
 	private OAuth2Dao auth2Dao;
-	@Autowired
+	@Inject
 	private GroupDao groupDao;
-	@Autowired
+	@Inject
 	private ExtraMenuDao menuDao;
-	@Autowired
+	@Inject
 	private DocumentConverter docConverter;
 
 	private final Map<Long, Long> ldapMap = new HashMap<>();
diff --git a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupVersion.java b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupVersion.java
index 3e33e12e4..2429ac0f6 100644
--- a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupVersion.java
+++ b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupVersion.java
@@ -23,11 +23,11 @@ import static org.apache.openmeetings.db.bind.Constants.VERSION_NODE;
 
 import java.io.Serializable;
 
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.openmeetings.db.bind.adapter.IntAdapter;
 import org.apache.openmeetings.util.OmVersion;
diff --git a/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java b/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
index 1f8f7ce01..17f2a33f7 100644
--- a/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
+++ b/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
@@ -148,9 +148,11 @@ import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Right;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Component;
 
+import jakarta.inject.Inject;
+
 @Component
 public class ImportInitvalues {
 	private static final Logger log = LoggerFactory.getLogger(ImportInitvalues.class);
@@ -168,17 +170,17 @@ public class ImportInitvalues {
 	private static final String FNAME_PARAM = "first_name";
 	private static final String LNAME_PARAM = "last_name";
 
-	@Autowired
+	@Inject
 	private ConfigurationDao cfgDao;
-	@Autowired
+	@Inject
 	private UserDao userDao;
-	@Autowired
+	@Inject
 	private SipManager sipDao;
-	@Autowired
+	@Inject
 	private OAuth2Dao oauthDao;
-	@Autowired
+	@Inject
 	private GroupDao groupDao;
-	@Autowired
+	@Inject
 	private RoomDao roomDao;
 
 	private int progress = 0;
diff --git a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KRoom.java b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KRoom.java
index 810c938b1..abffc893a 100644
--- a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KRoom.java
+++ b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KRoom.java
@@ -27,7 +27,7 @@ import java.util.Date;
 import java.util.Optional;
 import java.util.concurrent.atomic.AtomicBoolean;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import org.apache.commons.lang3.time.FastDateFormat;
 import org.apache.openmeetings.IApplication;
diff --git a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KStream.java b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KStream.java
index 8a6856a59..9aaff56bd 100644
--- a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KStream.java
+++ b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KStream.java
@@ -43,7 +43,7 @@ import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import org.apache.openmeetings.core.sip.ISipCallbacks;
 import org.apache.openmeetings.core.sip.SipManager;
diff --git a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KTestStream.java b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KTestStream.java
index 3df66efce..3875c590a 100644
--- a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KTestStream.java
+++ b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KTestStream.java
@@ -36,7 +36,7 @@ import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.entity.basic.IWsClient;
diff --git a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KurentoHandler.java b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KurentoHandler.java
index 0f6fe7876..33fd09c0f 100644
--- a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KurentoHandler.java
+++ b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KurentoHandler.java
@@ -69,13 +69,15 @@ import org.kurento.client.WebRtcEndpoint;
 import org.kurento.jsonrpc.client.JsonRpcClientNettyWebSocket;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
 import com.github.openjson.JSONArray;
 import com.github.openjson.JSONObject;
 
+import jakarta.inject.Inject;
+
 @Component
 public class KurentoHandler {
 	private static final Logger log = LoggerFactory.getLogger(KurentoHandler.class);
@@ -117,13 +119,13 @@ public class KurentoHandler {
 	private final Map<Long, KRoom> rooms = new ConcurrentHashMap<>();
 	private final Set<String> ignoredKuids = new HashSet<>();
 
-	@Autowired
+	@Inject
 	private IClientManager cm;
-	@Autowired
+	@Inject
 	private RoomDao roomDao;
-	@Autowired
+	@Inject
 	private TestStreamProcessor testProcessor;
-	@Autowired
+	@Inject
 	private StreamProcessor streamProcessor;
 
 	boolean isConnected() {
diff --git a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/StreamProcessor.java b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/StreamProcessor.java
index 4738d69b1..e5116d70c 100644
--- a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/StreamProcessor.java
+++ b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/StreamProcessor.java
@@ -50,12 +50,14 @@ import org.apache.openmeetings.db.util.ws.TextRoomMessage;
 import org.apache.openmeetings.util.logging.TimedApplication;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.core.task.TaskExecutor;
 import org.springframework.stereotype.Component;
 
 import com.github.openjson.JSONObject;
 
+import jakarta.inject.Inject;
+
 @Component
 public class StreamProcessor implements IStreamProcessor {
 	private static final Logger log = LoggerFactory.getLogger(StreamProcessor.class);
@@ -64,19 +66,19 @@ public class StreamProcessor implements IStreamProcessor {
 	 */
 	private final Map<String, KStream> streamByUid = new ConcurrentHashMap<>();
 
-	@Autowired
+	@Inject
 	private IClientManager cm;
-	@Autowired
+	@Inject
 	private RecordingDao recDao;
-	@Autowired
+	@Inject
 	private KurentoHandler kHandler;
-	@Autowired
+	@Inject
 	private TaskExecutor taskExecutor;
-	@Autowired
+	@Inject
 	private RecordingConverter recordingConverter;
-	@Autowired
+	@Inject
 	private InterviewConverter interviewConverter;
-	@Autowired
+	@Inject
 	private StreamProcessorActions streamProcessorActions;
 
 	@TimedApplication
diff --git a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/StreamProcessorActions.java b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/StreamProcessorActions.java
index eafe4cae4..ea8f7d63e 100644
--- a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/StreamProcessorActions.java
+++ b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/StreamProcessorActions.java
@@ -34,20 +34,22 @@ import org.kurento.client.IceCandidate;
 import org.kurento.client.internal.server.KurentoServerException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Component;
 
 import com.github.openjson.JSONObject;
 
+import jakarta.inject.Inject;
+
 @Component
 public class StreamProcessorActions {
 	private static final Logger log = LoggerFactory.getLogger(StreamProcessorActions.class);
 
-	@Autowired
+	@Inject
 	private IClientManager cm;
-	@Autowired
+	@Inject
 	private KurentoHandler kHandler;
-	@Autowired
+	@Inject
 	private StreamProcessor streamProcessor;
 
 	@TimedApplication
diff --git a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/TestStreamProcessor.java b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/TestStreamProcessor.java
index eaa164282..a7309d122 100644
--- a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/TestStreamProcessor.java
+++ b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/TestStreamProcessor.java
@@ -31,16 +31,18 @@ import java.util.concurrent.ConcurrentHashMap;
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.entity.basic.IWsClient;
 import org.kurento.client.IceCandidate;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Component;
 
 import com.github.openjson.JSONObject;
 
+import jakarta.inject.Inject;
+
 @Component
 class TestStreamProcessor implements IStreamProcessor {
 	private final Map<String, KTestStream> streamByUid = new ConcurrentHashMap<>();
 
-	@Autowired
+	@Inject
 	private KurentoHandler kHandler;
 
 	void onMessage(IWsClient c, final String cmdId, JSONObject msg) {
diff --git a/openmeetings-mediaserver/src/test/java/org/apache/openmeetings/mediaserver/BaseMockedTest.java b/openmeetings-mediaserver/src/test/java/org/apache/openmeetings/mediaserver/BaseMockedTest.java
index ce7286093..ca7a77633 100644
--- a/openmeetings-mediaserver/src/test/java/org/apache/openmeetings/mediaserver/BaseMockedTest.java
+++ b/openmeetings-mediaserver/src/test/java/org/apache/openmeetings/mediaserver/BaseMockedTest.java
@@ -33,7 +33,7 @@ import java.lang.reflect.Field;
 import java.util.Locale;
 import java.util.Set;
 
-import javax.inject.Inject;
+import jakarta.inject.Inject;
 
 import org.apache.openmeetings.IApplication;
 import org.apache.openmeetings.core.util.WebSocketHelper;
diff --git a/openmeetings-server/src/main/assembly/conf/context.xml b/openmeetings-server/src/main/assembly/conf/context.xml
index cf13d0732..06304f6db 100644
--- a/openmeetings-server/src/main/assembly/conf/context.xml
+++ b/openmeetings-server/src/main/assembly/conf/context.xml
@@ -24,11 +24,12 @@
     <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
     <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
 
-    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
+    <!-- Uncomment this to enable session persistence across Tomcat restarts -->
     <!--
-    <Manager pathname="" />
+    <Manager pathname="SESSIONS.ser" />
     -->
     <JarScanner>
         <JarScanFilter tldSkip="*"/>
     </JarScanner>
 </Context>
+
diff --git a/openmeetings-server/src/main/assembly/conf/server.xml b/openmeetings-server/src/main/assembly/conf/server.xml
index 989577aaa..9564df641 100644
--- a/openmeetings-server/src/main/assembly/conf/server.xml
+++ b/openmeetings-server/src/main/assembly/conf/server.xml
@@ -24,13 +24,27 @@
   <!-- Security listener. Documentation at /docs/config/listeners.html
   <Listener className="org.apache.catalina.security.SecurityListener" />
   -->
-  <!--APR library loader. Documentation at /docs/apr.html -->
+  <!-- APR library loader. Documentation at /docs/apr.html -->
   <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
   <!-- Prevent memory leaks due to use of particular java/javax APIs-->
   <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
   <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
   <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
 
+  <!-- Global JNDI resources
+       Documentation at /docs/jndi-resources-howto.html
+  -->
+  <GlobalNamingResources>
+    <!-- Editable user database that can also be used by
+         UserDatabaseRealm to authenticate users
+    -->
+    <!--Resource name="UserDatabase" auth="Container"
+              type="org.apache.catalina.UserDatabase"
+              description="User database that can be updated and saved"
+              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
+              pathname="conf/tomcat-users.xml" /-->
+  </GlobalNamingResources>
+
   <!-- A "Service" is a collection of one or more "Connectors" that share
        a single "Container" Note:  A "Service" is not itself a "Container",
        so you may not define subcomponents such as "Valves" at this level.
@@ -47,9 +61,8 @@
 
     <!-- A "Connector" represents an endpoint by which requests are received
          and responses are returned. Documentation at :
-         Java HTTP Connector: /docs/config/http.html
-         Java AJP  Connector: /docs/config/ajp.html
-         APR (HTTP/AJP) Connector: /docs/apr.html
+         HTTP Connector: /docs/config/http.html
+         AJP  Connector: /docs/config/ajp.html
          Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
     -->
     <Connector port="5080" protocol="HTTP/1.1"
@@ -62,11 +75,10 @@
                connectionTimeout="20000"
                redirectPort="5443" />
     -->
-    <!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443
+    <!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2
          This connector uses the NIO implementation. The default
          SSLImplementation will depend on the presence of the APR/native
-         library and the useOpenSSL attribute of the
-         AprLifecycleListener.
+         library and the useOpenSSL attribute of the AprLifecycleListener.
          Either JSSE or OpenSSL style configuration may be used regardless of
          the SSLImplementation selected. JSSE style configuration is used below.
     -->
@@ -81,20 +93,12 @@
                          type="RSA" />
         </SSLHostConfig>
     </Connector>
-    <!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2
-         This connector uses the APR/native implementation which always uses
-         OpenSSL for TLS.
-         Either JSSE or OpenSSL style configuration may be used. OpenSSL style
-         configuration is used below.
-    -->
     <!--
-    <Connector port="5443" protocol="org.apache.coyote.http11.Http11AprProtocol"
+    <Connector port="5443" protocol="org.apache.coyote.http11.Http11NioProtocol"
                maxThreads="150" SSLEnabled="true" >
         <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
         <SSLHostConfig>
-            <Certificate certificateKeyFile="conf/localhost-rsa-key.pem"
-                         certificateFile="conf/localhost-rsa-cert.pem"
-                         certificateChainFile="conf/localhost-rsa-chain.pem"
+            <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
                          type="RSA" />
         </SSLHostConfig>
     </Connector>
@@ -126,6 +130,17 @@
       <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
       -->
 
+      <!-- Use the LockOutRealm to prevent attempts to guess user passwords
+           via a brute-force attack -->
+      <Realm className="org.apache.catalina.realm.LockOutRealm">
+        <!-- This Realm uses the UserDatabase configured in the global JNDI
+             resources under the key "UserDatabase".  Any edits
+             that are performed against this UserDatabase are immediately
+             available for use by the Realm.  -->
+        <!--Realm className="org.apache.catalina.realm.UserDatabaseRealm"
+               resourceName="UserDatabase"/-->
+      </Realm>
+
       <Host name="localhost"  appBase="webapps"
             unpackWARs="false" autoDeploy="true">
 
@@ -148,3 +163,4 @@
     </Engine>
   </Service>
 </Server>
+
diff --git a/openmeetings-server/src/main/assembly/conf/web.xml b/openmeetings-server/src/main/assembly/conf/web.xml
index 838309649..87f6c66b0 100644
--- a/openmeetings-server/src/main/assembly/conf/web.xml
+++ b/openmeetings-server/src/main/assembly/conf/web.xml
@@ -15,11 +15,11 @@
   See the License for the specific language governing permissions and
   limitations under the License.
 -->
-<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
-                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
-  version="4.0">
+  xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
+                      https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
+  version="6.0">
 
   <!-- ======================== Introduction ============================== -->
   <!-- This document defines default values for *all* web applications      -->
@@ -32,6 +32,11 @@
   <!-- They should go in the "/WEB-INF/web.xml" file in your application.   -->
 
 
+  <!-- Set the default request and response character encodings to UTF-8.   -->
+  <request-character-encoding>UTF-8</request-character-encoding>
+  <response-character-encoding>UTF-8</response-character-encoding>
+
+
   <!-- ================== Built In Servlet Definitions ==================== -->
 
 
@@ -107,8 +112,10 @@
   <!--                                                                      -->
   <!--   allowPartialPut     Should the server treat an HTTP PUT request    -->
   <!--                       with a Range header as a partial PUT? Note     -->
-  <!--                       that RFC 7233 clarified that Range headers are -->
-  <!--                       only valid for GET requests. [true]            -->
+  <!--                       that while RFC 7233 clarified that Range       -->
+  <!--                       headers only valid for GET requests, RFC 9110  -->
+  <!--                       (which obsoletes RFC 7233) now allows partial  -->
+  <!--                       puts. [true]                                   -->
 
     <servlet>
         <servlet-name>default</servlet-name>
@@ -148,9 +155,9 @@
   <!--                       pages.  See the jasper documentation for more  -->
   <!--                       information.                                   -->
   <!--                                                                      -->
-  <!--   compilerSourceVM    Compiler source VM. [1.8]                      -->
+  <!--   compilerSourceVM    Compiler source VM. [11]                      -->
   <!--                                                                      -->
-  <!--   compilerTargetVM    Compiler target VM. [1.8]                      -->
+  <!--   compilerTargetVM    Compiler target VM. [11]                      -->
   <!--                                                                      -->
   <!--   development         Is Jasper used in development mode? If true,   -->
   <!--                       the frequency at which JSPs are checked for    -->
@@ -190,10 +197,6 @@
   <!--                       arrays, to improve performance in some cases?  -->
   <!--                       [false]                                        -->
   <!--                                                                      -->
-  <!--   ieClassId           The class-id value to be sent to Internet      -->
-  <!--                       Explorer when using <jsp:plugin> tags.         -->
-  <!--                       [clsid:8AD9C840-044E-11D1-B3E9-00805F499D93]   -->
-  <!--                                                                      -->
   <!--   javaEncoding        Java file encoding to use for generating java  -->
   <!--                       source files. [UTF8]                           -->
   <!--                                                                      -->
diff --git a/openmeetings-service/pom.xml b/openmeetings-service/pom.xml
index f168b59d2..2a42181fe 100644
--- a/openmeetings-service/pom.xml
+++ b/openmeetings-service/pom.xml
@@ -53,5 +53,10 @@
 			<groupId>com.github.caldav4j</groupId>
 			<artifactId>caldav4j</artifactId>
 		</dependency>
-	</dependencies>
+		<dependency>
+			<groupId>org.apache.jackrabbit</groupId>
+			<artifactId>jackrabbit-webdav</artifactId>
+			<classifier>jakarta</classifier>
+		</dependency>
+</dependencies>
 </project>
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/AppointmentLogic.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/AppointmentLogic.java
index 5d31d5af9..b4f220c44 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/AppointmentLogic.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/AppointmentLogic.java
@@ -35,18 +35,20 @@ import org.apache.openmeetings.db.entity.room.Invitation;
 import org.apache.openmeetings.db.entity.user.User;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Component;
 
+import jakarta.inject.Inject;
+
 @Component
 public class AppointmentLogic {
 	private static final Logger log = LoggerFactory.getLogger(AppointmentLogic.class);
 
-	@Autowired
+	@Inject
 	private AppointmentDao appointmentDao;
-	@Autowired
+	@Inject
 	private InvitationDao invitationDao;
-	@Autowired
+	@Inject
 	private NotifierService notifierService;
 
 	// --------------------------------------------------------------------------------------------
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/AppointmentManager.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/AppointmentManager.java
index 573a79905..c425eb90f 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/AppointmentManager.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/AppointmentManager.java
@@ -57,12 +57,14 @@ import org.apache.openmeetings.service.calendar.caldav.handler.WebDAVSyncHandler
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Component;
 import org.w3c.dom.Element;
 
 import com.github.caldav4j.CalDAVConstants;
 
+import jakarta.inject.Inject;
+
 /**
  * Class which does syncing and provides respective API's required for performing CalDAV Operations.
  * @author Ankush Mishra (ankushmishra9@gmail.com)
@@ -78,11 +80,11 @@ public class AppointmentManager {
 
 	private PoolingHttpClientConnectionManager connmanager = null;
 
-	@Autowired
+	@Inject
 	private OmCalendarDao calendarDao;
-	@Autowired
+	@Inject
 	private AppointmentDao appointmentDao;
-	@Autowired
+	@Inject
 	private IcalUtils utils;
 
 	/**
diff --git 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
index 950a9664f..1b47d3ec0 100644
--- 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
@@ -53,8 +53,8 @@ import org.apache.wicket.protocol.http.WebSession;
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 
+import jakarta.inject.Inject;
 import net.fortuna.ical4j.model.Calendar;
 import net.fortuna.ical4j.model.Component;
 import net.fortuna.ical4j.model.ComponentList;
@@ -89,7 +89,7 @@ public class IcalUtils {
 	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
+	@Inject
 	private UserDao userDao;
 
 	/**
diff --git 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
index 593c7c706..e3a51799d 100644
--- 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
@@ -30,9 +30,11 @@ import org.apache.wicket.Application;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Component;
 
+import jakarta.inject.Inject;
+
 /**
  * @author swagner
  *
@@ -41,7 +43,7 @@ import org.springframework.stereotype.Component;
 public class EmailManager {
 	private static final Logger log = LoggerFactory.getLogger(EmailManager.class);
 
-	@Autowired
+	@Inject
 	private MailHandler mailHandler;
 
 	private static IApplication getApp() {
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/AbstractTemplatePage.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/AbstractTemplatePage.java
index 50d75ef17..0d017fc38 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/AbstractTemplatePage.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/AbstractTemplatePage.java
@@ -33,7 +33,8 @@ import org.apache.wicket.protocol.http.mock.MockHttpServletRequest;
 import org.apache.wicket.protocol.http.mock.MockHttpSession;
 import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
 import org.apache.wicket.request.Request;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
+import jakarta.inject.Inject;
 
 public abstract class AbstractTemplatePage extends WebPage {
 	private static final long serialVersionUID = 1L;
@@ -41,7 +42,7 @@ public abstract class AbstractTemplatePage extends WebPage {
 	protected final Locale locale;
 	protected final ComponentRenderer renderer;
 
-	@SpringBean
+	@Inject
 	protected IApplication app;
 
 	protected AbstractTemplatePage(Locale locale) {
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/RecordingExpiringTemplate.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/RecordingExpiringTemplate.java
index db696b774..10babe193 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/RecordingExpiringTemplate.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/RecordingExpiringTemplate.java
@@ -29,7 +29,8 @@ import org.apache.openmeetings.db.util.LocaleHelper;
 import org.apache.openmeetings.service.mail.template.OmTextLabel;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.panel.Fragment;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
+import jakarta.inject.Inject;
 
 public class RecordingExpiringTemplate extends SubjectEmailTemplate {
 	private static final long serialVersionUID = 1L;
@@ -37,7 +38,7 @@ public class RecordingExpiringTemplate extends SubjectEmailTemplate {
 	private long remainingDays;
 	private final User u;
 
-	@SpringBean
+	@Inject
 	protected RoomDao roomDao;
 
 	private RecordingExpiringTemplate(User u, final Recording rec, long remainingDays) {
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/notifier/MailNotifier.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/notifier/MailNotifier.java
index 1aa6bed87..131e786f5 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/notifier/MailNotifier.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/notifier/MailNotifier.java
@@ -33,14 +33,16 @@ import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.manager.IInvitationManager;
 import org.apache.openmeetings.service.mail.template.subject.AppointmentReminderTemplate;
 import org.apache.openmeetings.service.mail.template.subject.SubjectEmailTemplate;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Component;
 
+import jakarta.inject.Inject;
+
 @Component
 public class MailNotifier implements INotifier {
-	@Autowired
+	@Inject
 	private NotifierService notifier;
-	@Autowired
+	@Inject
 	private IInvitationManager invitationManager;
 
 	@PostConstruct
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/notifier/TextNotifier.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/notifier/TextNotifier.java
index 49f81f0b2..0dded20c0 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/notifier/TextNotifier.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/notifier/TextNotifier.java
@@ -32,18 +32,20 @@ import org.apache.openmeetings.db.entity.user.User;
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.core.task.TaskExecutor;
 import org.springframework.stereotype.Component;
 
+import jakarta.inject.Inject;
+
 @Component
 public class TextNotifier implements INotifier {
 	private static final Logger log = LoggerFactory.getLogger(TextNotifier.class);
-	@Autowired
+	@Inject
 	private NotifierService notifier;
-	@Autowired
+	@Inject
 	protected TaskExecutor taskExecutor;
-	@Autowired
+	@Inject
 	protected ConfigurationDao cfgDao;
 
 	@PostConstruct
diff --git 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
index dfbc437c5..073c2177d 100644
--- 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
@@ -50,9 +50,11 @@ import org.apache.openmeetings.util.crypt.CryptProvider;
 import org.apache.openmeetings.util.mail.IcalHandler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Component;
 
+import jakarta.inject.Inject;
+
 /**
  *
  * @author swagner
@@ -62,9 +64,9 @@ import org.springframework.stereotype.Component;
 public class InvitationManager implements IInvitationManager {
 	private static final Logger log = LoggerFactory.getLogger(InvitationManager.class);
 
-	@Autowired
+	@Inject
 	private InvitationDao invitationDao;
-	@Autowired
+	@Inject
 	private MailHandler mailHandler;
 
 	/**
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/scheduler/AbstractJob.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/scheduler/AbstractJob.java
index ae53f5323..8480915ed 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/scheduler/AbstractJob.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/scheduler/AbstractJob.java
@@ -30,13 +30,15 @@ import org.apache.openmeetings.db.entity.record.Recording;
 import org.apache.openmeetings.db.entity.user.Group;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
+import jakarta.inject.Inject;
+
 
 public abstract class AbstractJob {
 	private static Logger log = LoggerFactory.getLogger(AbstractJob.class);
-	@Autowired
+	@Inject
 	GroupDao groupDao;
-	@Autowired
+	@Inject
 	RecordingDao recordingDao;
 
 	void processExpiringRecordings(boolean notified, ObjLongConsumer<Recording> consumer) {
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/scheduler/CleanupJob.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/scheduler/CleanupJob.java
index b446320df..5fc45a53e 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/scheduler/CleanupJob.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/scheduler/CleanupJob.java
@@ -34,10 +34,12 @@ import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.user.User;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
+import jakarta.inject.Inject;
+
 @Component("cleanupJob")
 public class CleanupJob extends AbstractJob {
 	private static Logger log = LoggerFactory.getLogger(CleanupJob.class);
@@ -50,11 +52,11 @@ public class CleanupJob extends AbstractJob {
 	@Value("${job.cleanup.conf.log.ttl}")
 	private long confLogTtl = 7 * 24 * 60 * 60 * 1000L; // 7 days
 
-	@Autowired
+	@Inject
 	private SessiondataDao sessionDao;
-	@Autowired
+	@Inject
 	private UserDao userDao;
-	@Autowired
+	@Inject
 	private ConferenceLogDao confLogDao;
 
 	public void cleanTestSetup() {
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/scheduler/ReminderJob.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/scheduler/ReminderJob.java
index c0ceb43b1..291e9d7dc 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/scheduler/ReminderJob.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/scheduler/ReminderJob.java
@@ -46,23 +46,25 @@ import org.apache.openmeetings.util.crypt.CryptProvider;
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Component;
 
 import com.github.openjson.JSONArray;
 
+import jakarta.inject.Inject;
+
 @Component("reminderJob")
 public class ReminderJob extends AbstractJob {
 	private static Logger log = LoggerFactory.getLogger(ReminderJob.class);
-	@Autowired
+	@Inject
 	private AppointmentLogic appointmentLogic;
-	@Autowired
+	@Inject
 	private UserDao userDao;
-	@Autowired
+	@Inject
 	private MailHandler mailHandler;
-	@Autowired
+	@Inject
 	private ConfigurationDao cfgDao;
-	@Autowired
+	@Inject
 	private GroupUserDao groupUserDao;
 
 	// public for testing
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminUserChoiceProvider.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminUserChoiceProvider.java
index 6452dd050..3e3fe12c8 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminUserChoiceProvider.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminUserChoiceProvider.java
@@ -25,14 +25,16 @@ import java.util.List;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.wicket.injection.Injector;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.wicketstuff.select2.ChoiceProvider;
 import org.wicketstuff.select2.Response;
 
+import jakarta.inject.Inject;
+
 public abstract class AdminUserChoiceProvider extends ChoiceProvider<User> {
 	private static final long serialVersionUID = 1L;
 	public static final long PAGE_SIZE = 20;
-	@SpringBean
+
+	@Inject
 	private UserDao userDao;
 
 	protected AdminUserChoiceProvider() {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java
index bf6cb90c9..634ec85ea 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java
@@ -47,7 +47,6 @@ import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.resource.FileSystemResource;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -57,6 +56,7 @@ import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel
 import de.agilecoders.wicket.core.markup.html.bootstrap.components.progress.UpdatableProgressBar;
 import de.agilecoders.wicket.core.markup.html.bootstrap.utilities.BackgroundColorBehavior;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome6IconType;
+import jakarta.inject.Inject;
 /**
  * Panel component to manage Backup Import/Export
  *
@@ -71,7 +71,7 @@ public class BackupPanel extends AdminBasePanel {
 	private final NotificationPanel feedback = new NotificationPanel("feedback");
 	private UploadForm upload;
 
-	@SpringBean
+	@Inject
 	private BackupExport backupExport;
 
 	public BackupPanel(String id) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupUploadResourceReference.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupUploadResourceReference.java
index d73acaf98..12a579554 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupUploadResourceReference.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupUploadResourceReference.java
@@ -27,22 +27,23 @@ import java.util.Timer;
 import java.util.TimerTask;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload2.FileItem;
 import org.apache.openmeetings.backup.BackupImport;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.web.common.upload.UploadResourceReference;
 import org.apache.wicket.injection.Injector;
 import org.apache.wicket.protocol.http.servlet.MultipartServletWebRequest;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import jakarta.inject.Inject;
+
 public class BackupUploadResourceReference extends UploadResourceReference {
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = LoggerFactory.getLogger(BackupUploadResourceReference.class);
 
-	@SpringBean
+	@Inject
 	private BackupImport backupImport;
 
 	public BackupUploadResourceReference() {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java
index a89d614c4..e9a5c19bc 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java
@@ -52,11 +52,12 @@ import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.validation.IValidatable;
 import org.apache.wicket.validation.IValidator;
 import org.apache.wicket.validation.ValidationError;
 
+import jakarta.inject.Inject;
+
 /**
  * Handle {@link Configuration} items as list and form
  *
@@ -82,7 +83,8 @@ public class ConfigForm extends AdminBaseForm<Configuration> {
 	};
 	private final CheckBox valueB = new CheckBox("valueB");
 	private final TextField<String> valueH = new TextField<>("value");
-	@SpringBean
+
+	@Inject
 	private ConfigurationDao cfgDao;
 
 	public ConfigForm(String id, WebMarkupContainer listContainer, Configuration configuration) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigsPanel.java
index afb2e0a81..9d0f4b868 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigsPanel.java
@@ -35,7 +35,8 @@ import org.apache.wicket.authroles.authorization.strategies.role.annotations.Aut
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.repeater.Item;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
+import jakarta.inject.Inject;
 
 /**
  * add/update/delete {@link Configuration}
@@ -49,7 +50,7 @@ public class ConfigsPanel extends AdminBasePanel {
 	private ConfigForm form;
 	private final WebMarkupContainer listContainer = new WebMarkupContainer("listContainer");
 
-	@SpringBean
+	@Inject
 	private ConfigurationDao cfgDao;
 
 	public ConfigsPanel(String id) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
index f62eeb9be..a48306326 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
@@ -44,19 +44,25 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.markup.repeater.RepeatingView;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.apache.openmeetings.mediaserver.KurentoHandler;
 import org.apache.openmeetings.mediaserver.StreamProcessor;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
+import jakarta.inject.Inject;
 
 @AuthorizeInstantiation({"ADMIN", "ADMIN_CONNECTIONS"})
 public class ConnectionsPanel extends AdminBasePanel {
 	private static final long serialVersionUID = 1L;
-	@SpringBean
+
+	@Inject
 	private ClientManager cm;
-	@SpringBean
+	@Inject
+	private KurentoHandler kHandler;
+	@Inject
 	private StreamProcessor streamProcessor;
+	@Inject
+	private IUserManager userManager;
 
 	public ConnectionsPanel(String id) {
 		super(id);
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailForm.java
index d0c530ba5..5c297898b 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/email/EmailForm.java
@@ -31,10 +31,10 @@ import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxButton;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
+import jakarta.inject.Inject;
 
 public class EmailForm extends Form<MailMessage> {
 	private static final long serialVersionUID = 1L;
@@ -42,7 +42,8 @@ public class EmailForm extends Form<MailMessage> {
 	private BootstrapAjaxButton reset;
 	private AjaxLink<Void> delBtn;
 	private final WebMarkupContainer list;
-	@SpringBean
+
+	@Inject
 	private MailMessageDao emailDao;
 
 	public EmailForm(String id, final WebMarkupContainer list, MailMessage m) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraForm.java
index 3ad9f25c2..01b82539c 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/extra/ExtraForm.java
@@ -38,9 +38,10 @@ import org.apache.wicket.markup.html.form.TextArea;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.model.util.CollectionModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.wicketstuff.select2.Select2MultiChoice;
 
+import jakarta.inject.Inject;
+
 public class ExtraForm extends AdminBaseForm<ExtraMenu> {
 	private static final long serialVersionUID = 1L;
 	private final WebMarkupContainer list;
@@ -48,9 +49,9 @@ public class ExtraForm extends AdminBaseForm<ExtraMenu> {
 			, new CollectionModel<>(new ArrayList<>())
 			, new GroupChoiceProvider());
 
-	@SpringBean
+	@Inject
 	private ExtraMenuDao menuDao;
-	@SpringBean
+	@Inject
 	private GroupDao groupDao;
 
 	public ExtraForm(String id, final WebMarkupContainer list, ExtraMenu m) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java
index aacb0b4cf..a56f17c71 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java
@@ -52,9 +52,10 @@ import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.wicketstuff.select2.Select2Choice;
 
+import jakarta.inject.Inject;
+
 public class GroupForm extends AdminBaseForm<Group> {
 	private static final long serialVersionUID = 1L;
 	private GroupUsersPanel usersPanel;
@@ -93,11 +94,12 @@ public class GroupForm extends AdminBaseForm<Group> {
 			return getString("admin.group.form.logo");
 		}
 	};
-	@SpringBean
+
+	@Inject
 	private ImageConverter imageConverter;
-	@SpringBean
+	@Inject
 	private GroupUserDao groupUserDao;
-	@SpringBean
+	@Inject
 	private GroupDao groupDao;
 
 	public GroupForm(String id, WebMarkupContainer groupList, Group group) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.java
index cd295b95f..f4044ca6c 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.java
@@ -38,19 +38,20 @@ import org.apache.wicket.markup.html.form.CheckBox;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.badge.BootstrapBadge;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.utilities.BackgroundColorBehavior;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome6IconType;
+import jakarta.inject.Inject;
 
 public class GroupUsersPanel extends Panel {
 	private static final long serialVersionUID = 1L;
 	private long groupId;
 	private List<GroupUser> users2add = new ArrayList<>();
-	@SpringBean
+
+	@Inject
 	private UserDao userDao;
 
 	public GroupUsersPanel(String id, long groupId) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapForm.java
index 2a835a648..7d33bd020 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapForm.java
@@ -33,7 +33,8 @@ import org.apache.wicket.markup.html.form.TextArea;
 import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
+import jakarta.inject.Inject;
 
 /**
  * Form components to insert/update/delete {@link LdapConfig}
@@ -44,7 +45,8 @@ import org.apache.wicket.spring.injection.annot.SpringBean;
 public class LdapForm extends AdminBaseForm<LdapConfig> {
 	private static final long serialVersionUID = 1L;
 	private final WebMarkupContainer listContainer;
-	@SpringBean
+
+	@Inject
 	private LdapConfigDao ldapDao;
 
 	public LdapForm(String id, WebMarkupContainer listContainer, final LdapConfig ldapConfig) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthForm.java
index d3c28f4c1..d4689c12f 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/oauth/OAuthForm.java
@@ -49,13 +49,13 @@ import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.model.util.ListModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.string.Strings;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxButton;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome6IconType;
+import jakarta.inject.Inject;
 
 public class OAuthForm extends AdminBaseForm<OAuthServer> {
 	private static final long serialVersionUID = 1L;
@@ -87,7 +87,7 @@ public class OAuthForm extends AdminBaseForm<OAuthServer> {
 		}
 	};
 
-	@SpringBean
+	@Inject
 	private OAuth2Dao oauthDao;
 
 	public OAuthForm(String id, WebMarkupContainer listContainer, OAuthServer server) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
index b54565194..0eeac1703 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
@@ -72,7 +72,6 @@ import org.apache.wicket.model.Model;
 import org.apache.wicket.model.PropertyModel;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.model.util.CollectionModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.string.Strings;
 import org.wicketstuff.select2.ChoiceProvider;
 import org.wicketstuff.select2.Response;
@@ -85,6 +84,7 @@ import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.utilities.BackgroundColorBehavior;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome6IconType;
+import jakarta.inject.Inject;
 
 public class RoomForm extends AdminBaseForm<Room> {
 	private static final long serialVersionUID = 1L;
@@ -120,15 +120,16 @@ public class RoomForm extends AdminBaseForm<Room> {
 	private IModel<User> moderator2add = Model.of((User)null);
 	private IModel<Collection<BaseFileItem>> files2add = new CollectionModel<>(new ArrayList<>());
 	private IModel<Long> wbIdx = Model.of(0L);
-	@SpringBean
+
+	@Inject
 	private GroupDao groupDao;
-	@SpringBean
+	@Inject
 	private UserDao userDao;
-	@SpringBean
+	@Inject
 	private FileItemDao fileDao;
-	@SpringBean
+	@Inject
 	private ClientManager cm;
-	@SpringBean
+	@Inject
 	private RoomDao roomDao;
 
 	public RoomForm(String id, WebMarkupContainer roomList, final Room room) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java
index 898be3229..2879f8b6e 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java
@@ -35,14 +35,16 @@ import org.apache.wicket.authroles.authorization.strategies.role.annotations.Aut
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.repeater.Item;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
+import jakarta.inject.Inject;
 
 @AuthorizeInstantiation({"ADMIN", "GROUP_ADMIN"})
 public class RoomsPanel extends AdminBasePanel {
 	private static final long serialVersionUID = 1L;
 	final WebMarkupContainer listContainer = new WebMarkupContainer("listContainer");
 	private RoomForm form;
-	@SpringBean
+
+	@Inject
 	private RoomDao roomDao;
 
 	public RoomsPanel(String id) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.java
index a93c46698..a206ecbf0 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.java
@@ -28,13 +28,13 @@ import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.PasswordTextField;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.danekja.java.util.function.serializable.SerializableConsumer;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxButton;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import jakarta.inject.Inject;
 
 public class PasswordDialog extends Modal<String> {
 	private static final long serialVersionUID = 1L;
@@ -42,7 +42,8 @@ public class PasswordDialog extends Modal<String> {
 	private final Form<String> form = new Form<>("form");
 	private final PasswordTextField pass = new PasswordTextField("password", Model.of(""));
 	private SerializableConsumer<AjaxRequestTarget> action = null;
-	@SpringBean
+
+	@Inject
 	private UserDao userDao;
 
 	public PasswordDialog(String id) {
diff --git 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
index c0f83a8b1..1245920ea 100644
--- 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
@@ -68,7 +68,6 @@ import org.apache.wicket.markup.html.panel.PanelMarkupSourcingStrategy;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.string.Strings;
 import org.danekja.java.util.function.serializable.SerializableConsumer;
 import org.slf4j.Logger;
@@ -77,6 +76,7 @@ import org.wicketstuff.select2.Response;
 import org.wicketstuff.select2.Select2MultiChoice;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import jakarta.inject.Inject;
 
 /**
  * CRUD operations in form for {@link User}
@@ -99,13 +99,14 @@ public class UserForm extends AdminBaseForm<User> {
 	private final PasswordDialog adminPass;
 	private final UploadableProfileImagePanel avatar = new UploadableProfileImagePanel("avatar", null);
 	private final CheckBox otpEnabled = new CheckBox("otp-enabled", Model.of(false));
-	@SpringBean
+
+	@Inject
 	private UserDao userDao;
-	@SpringBean
+	@Inject
 	private EmailManager emainManager;
-	@SpringBean
+	@Inject
 	private LdapConfigDao ldapDao;
-	@SpringBean
+	@Inject
 	private OAuth2Dao oauthDao;
 
 	public UserForm(String id, WebMarkupContainer listContainer, final User user, final PasswordDialog adminPass, Modal<String> warning) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
index 6dba04d0b..820d12a05 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
@@ -40,10 +40,10 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import de.agilecoders.wicket.core.markup.html.bootstrap.utilities.ColorBehavior;
+import jakarta.inject.Inject;
 
 @AuthorizeInstantiation({"ADMIN", "GROUP_ADMIN"})
 public class UsersPanel extends AdminBasePanel {
@@ -51,7 +51,8 @@ public class UsersPanel extends AdminBasePanel {
 	final WebMarkupContainer listContainer = new WebMarkupContainer("listContainer");
 	private final PasswordDialog adminPass = new PasswordDialog("adminPass");
 	private UserForm form;
-	@SpringBean
+
+	@Inject
 	private UserDao userDao;
 
 	public UsersPanel(String id) {
diff --git 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
index a8c459869..3a1b8d0ac 100644
--- 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
@@ -136,7 +136,6 @@ import org.apache.wicket.validation.validator.UrlValidator;
 import org.apache.openmeetings.mediaserver.KStream;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.ApplicationContext;
 import org.springframework.stereotype.Component;
@@ -161,6 +160,7 @@ import de.agilecoders.wicket.core.settings.IBootstrapSettings;
 import de.agilecoders.wicket.core.settings.NoopThemeProvider;
 import de.agilecoders.wicket.themes.markup.html.bootswatch.BootswatchTheme;
 import de.agilecoders.wicket.themes.markup.html.bootswatch.BootswatchThemeProvider;
+import jakarta.inject.Inject;
 
 @Component
 public class Application extends AuthenticatedWebApplication implements IApplication {
@@ -182,23 +182,23 @@ public class Application extends AuthenticatedWebApplication implements IApplica
 	private String serverId;
 	private final Set<String> wsUrls = new HashSet<>();
 
-	@Autowired
+	@Inject
 	private ApplicationContext ctx;
-	@Autowired
+	@Inject
 	private ConfigurationDao cfgDao;
-	@Autowired
+	@Inject
 	private RecordingDao recordingDao;
-	@Autowired
+	@Inject
 	private UserDao userDao;
-	@Autowired
+	@Inject
 	private UserManager userManager;
-	@Autowired
+	@Inject
 	private ClientManager cm;
-	@Autowired
+	@Inject
 	private WhiteboardManager wbManager;
-	@Autowired
+	@Inject
 	private AppointmentDao appointmentDao;
-	@Autowired
+	@Inject
 	private SipManager sipManager;
 	@Value("${remember.me.encryption.key}")
 	private String rememberMeKey;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java
index 11c2c47dd..959d987f3 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java
@@ -48,7 +48,6 @@ import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.string.StringValue;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import com.hazelcast.core.EntryEvent;
@@ -58,6 +57,8 @@ import com.hazelcast.map.listener.EntryRemovedListener;
 import com.hazelcast.map.listener.EntryUpdatedListener;
 import com.hazelcast.query.Predicates;
 
+import jakarta.inject.Inject;
+
 @Component
 public class ClientManager implements IClientManager {
 	private static final Logger log = LoggerFactory.getLogger(ClientManager.class);
@@ -70,13 +71,13 @@ public class ClientManager implements IClientManager {
 	private final Map<Long, Set<String>> onlineRooms = new ConcurrentHashMap<>();
 	private final Map<String, ServerInfo> onlineServers = new ConcurrentHashMap<>();
 
-	@Autowired
+	@Inject
 	private ConferenceLogDao confLogDao;
-	@Autowired
+	@Inject
 	private Application app;
-	@Autowired
+	@Inject
 	private KurentoHandler kHandler;
-	@Autowired
+	@Inject
 	private TimerService timerService;
 
 	private IMap<String, Client> map() {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/TimerService.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/TimerService.java
index 9349f6f09..6b460fe3f 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/TimerService.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/TimerService.java
@@ -41,9 +41,11 @@ import org.apache.wicket.ThreadContext;
 import org.apache.openmeetings.mediaserver.KurentoHandler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Service;
 
+import jakarta.inject.Inject;
+
 @Service
 public class TimerService {
 	private static final Logger log = LoggerFactory.getLogger(TimerService.class);
@@ -53,13 +55,13 @@ public class TimerService {
 	private final Map<Long, CompletableFuture<Object>> modCheckMap = new ConcurrentHashMap<>();
 	private final Map<Long, CompletableFuture<Object>> sipCheckMap = new ConcurrentHashMap<>();
 
-	@Autowired
+	@Inject
 	private ClientManager cm;
-	@Autowired
+	@Inject
 	private SipManager sipManager;
-	@Autowired
+	@Inject
 	private KurentoHandler kHandler;
-	@Autowired
+	@Inject
 	private Application app;
 
 	@PostConstruct
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/UserManager.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/UserManager.java
index 830063a12..6b2034e14 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/UserManager.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/UserManager.java
@@ -81,11 +81,13 @@ import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Component;
 
 import com.github.openjson.JSONObject;
 
+import jakarta.inject.Inject;
+
 /**
  *
  * @author swagner
@@ -95,15 +97,15 @@ import com.github.openjson.JSONObject;
 public class UserManager implements IUserManager {
 	private static final Logger log = LoggerFactory.getLogger(UserManager.class);
 
-	@Autowired
+	@Inject
 	private ConfigurationDao cfgDao;
-	@Autowired
+	@Inject
 	private GroupDao groupDao;
-	@Autowired
+	@Inject
 	private UserDao userDao;
-	@Autowired
+	@Inject
 	private EmailManager emailManager;
-	@Autowired
+	@Inject
 	private IClientManager cm;
 	private HttpClient httpClient;
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
index 1102f774b..434e959da 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
@@ -86,7 +86,6 @@ import org.apache.wicket.request.Request;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.flow.RedirectToUrlException;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.string.StringValue;
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
@@ -96,6 +95,8 @@ import org.wicketstuff.dashboard.Widget;
 import org.wicketstuff.dashboard.WidgetFactory;
 import org.wicketstuff.dashboard.web.DashboardContext;
 
+import jakarta.inject.Inject;
+
 public class WebSession extends AbstractAuthenticatedWebSession implements IWebSession {
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = LoggerFactory.getLogger(WebSession.class);
@@ -118,23 +119,23 @@ public class WebSession extends AbstractAuthenticatedWebSession implements IWebS
 	private Long recordingId = null;
 	private boolean kickedByAdmin = false;
 	private ExtendedClientProperties extProps = new ExtendedClientProperties();
-	@SpringBean
+	@Inject
 	private ClientManager cm;
-	@SpringBean
+	@Inject
 	private InvitationDao inviteDao;
-	@SpringBean
+	@Inject
 	private SOAPLoginDao soapDao;
-	@SpringBean
+	@Inject
 	private SessiondataDao sessionDao;
-	@SpringBean
+	@Inject
 	private GroupDao groupDao;
-	@SpringBean
+	@Inject
 	private UserDao userDao;
-	@SpringBean
+	@Inject
 	private LdapLoginManager ldapManager;
-	@SpringBean
+	@Inject
 	private ConfigurationDao cfgDao;
-	@SpringBean
+	@Inject
 	private RoomDao roomDao;
 
 	public WebSession(Request request) {
diff --git 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
index 49801d1a9..fff4fb376 100644
--- 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
@@ -45,7 +45,7 @@ import org.apache.openmeetings.db.util.ws.RoomMessage;
 import org.apache.openmeetings.web.room.wb.WbAction;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Component;
 
 import com.github.openjson.JSONArray;
@@ -56,6 +56,8 @@ import com.hazelcast.map.listener.EntryAddedListener;
 import com.hazelcast.map.listener.EntryRemovedListener;
 import com.hazelcast.map.listener.EntryUpdatedListener;
 
+import jakarta.inject.Inject;
+
 /**
  * Hazelcast based Whiteboard manager
  *
@@ -68,7 +70,7 @@ public class WhiteboardManager implements IWhiteboardManager {
 	private final Map<Long, Whiteboards> onlineWbs = new ConcurrentHashMap<>();
 	private static final String WBS_KEY = "WBS_KEY";
 
-	@Autowired
+	@Inject
 	private Application app;
 
 	private IMap<Long, Whiteboards> map() {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
index 3eb84407c..728191b4c 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
@@ -47,20 +47,22 @@ import org.apache.wicket.markup.html.panel.IMarkupSourcingStrategy;
 import org.apache.wicket.markup.html.panel.PanelMarkupSourcingStrategy;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.string.Strings;
 import org.wicketstuff.select2.Response;
 import org.wicketstuff.select2.Select2MultiChoice;
 
+import jakarta.inject.Inject;
+
 public class GeneralUserForm extends Form<User> {
 	private static final long serialVersionUID = 1L;
 	private final RequiredTextField<String> email = new RequiredTextField<>("address.email");
 	private final List<GroupUser> grpUsers = new ArrayList<>();
 	private final AjaxOmDatePicker bday = new AjaxOmDatePicker("age");
 	private final boolean isAdminForm;
-	@SpringBean
+
+	@Inject
 	private GroupDao groupDao;
-	@SpringBean
+	@Inject
 	private UserDao userDao;
 
 	public GeneralUserForm(String id, IModel<User> model, boolean isAdminForm) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GroupChoiceProvider.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GroupChoiceProvider.java
index fb9abd995..a2cb5790f 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GroupChoiceProvider.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GroupChoiceProvider.java
@@ -32,17 +32,19 @@ import org.apache.openmeetings.db.entity.user.GroupUser;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.wicket.injection.Injector;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.string.Strings;
 import org.wicketstuff.select2.ChoiceProvider;
 import org.wicketstuff.select2.Response;
 
+import jakarta.inject.Inject;
+
 public class GroupChoiceProvider extends ChoiceProvider<Group> {
 	private static final long serialVersionUID = 1L;
 	public static final long PAGE_SIZE = 5;
-	@SpringBean
+
+	@Inject
 	private GroupDao groupDao;
-	@SpringBean
+	@Inject
 	private UserDao userDao;
 
 	public GroupChoiceProvider() {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
index d6d16f616..f0c3a0b46 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
@@ -60,12 +60,12 @@ import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.model.util.CollectionModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
+import jakarta.inject.Inject;
 
 public abstract class InvitationForm extends Form<Invitation> {
 	private static final long serialVersionUID = 1L;
@@ -83,11 +83,11 @@ public abstract class InvitationForm extends Form<Invitation> {
 	protected InvitationDialog dialog;
 	protected String dropDownParentId;
 
-	@SpringBean
+	@Inject
 	private InvitationDao inviteDao;
-	@SpringBean
+	@Inject
 	private UserDao userDao;
-	@SpringBean
+	@Inject
 	private InvitationManager inviteManager;
 
 	public enum Action {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
index 991d263cd..f7b0a06ee 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
@@ -81,7 +81,6 @@ import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.protocol.ws.api.WebSocketRequestHandler;
 import org.apache.wicket.protocol.ws.api.message.AbstractClientMessage;
 import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.wicketstuff.urlfragment.UrlFragment;
@@ -90,6 +89,7 @@ import com.github.openjson.JSONObject;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.navbar.INavbarComponent;
 import de.agilecoders.wicket.core.markup.html.references.BootstrapJavaScriptReference;
+import jakarta.inject.Inject;
 
 public class MainPanel extends Panel {
 	private static final long serialVersionUID = 1L;
@@ -106,11 +106,13 @@ public class MainPanel extends Panel {
 	private BasePanel curPanel;
 	private InviteUserToRoomDialog inviteUser;
 
-	@SpringBean
+	@Inject
 	private ClientManager cm;
-	@SpringBean
+	@Inject
+	private ConfigurationDao cfgDao;
+	@Inject
 	private UserDao userDao;
-	@SpringBean
+	@Inject
 	private RoomDao roomDao;
 
 	public MainPanel(String id) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmWebSocketPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmWebSocketPanel.java
index 819268af3..5ea40228c 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmWebSocketPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmWebSocketPanel.java
@@ -42,19 +42,21 @@ import org.apache.wicket.protocol.ws.api.message.ClosedMessage;
 import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
 import org.apache.wicket.protocol.ws.api.message.ErrorMessage;
 import org.apache.wicket.protocol.ws.api.message.TextMessage;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.openmeetings.mediaserver.KurentoHandler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.github.openjson.JSONObject;
 
+import jakarta.inject.Inject;
+
 public abstract class OmWebSocketPanel extends Panel {
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = LoggerFactory.getLogger(OmWebSocketPanel.class);
 	public static final String CONNECTED_MSG = "socketConnected";
 	private final AtomicBoolean connected = new AtomicBoolean();
-	@SpringBean
+
+	@Inject
 	private KurentoHandler kHandler;
 	private boolean pingable = false;
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/ProfileImagePanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/ProfileImagePanel.java
index 25d5b84d2..f971ef0d3 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/ProfileImagePanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/ProfileImagePanel.java
@@ -21,12 +21,14 @@ package org.apache.openmeetings.web.common;
 import static org.apache.openmeetings.web.util.ProfileImageResourceReference.getUrl;
 
 import org.apache.openmeetings.db.dao.user.UserDao;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
+import jakarta.inject.Inject;
 
 public class ProfileImagePanel extends ImagePanel {
 	private static final long serialVersionUID = 1L;
 	private final long userId;
-	@SpringBean
+
+	@Inject
 	private UserDao userDao;
 
 	public ProfileImagePanel(String id, final long userId) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/UploadableProfileImagePanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/UploadableProfileImagePanel.java
index 57b3e0084..65c1d96d9 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/UploadableProfileImagePanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/UploadableProfileImagePanel.java
@@ -31,14 +31,16 @@ 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.util.StoredFile;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
+import jakarta.inject.Inject;
 
 public class UploadableProfileImagePanel extends UploadableImagePanel {
 	private static final long serialVersionUID = 1L;
 	private Long userId;
-	@SpringBean
+
+	@Inject
 	private ImageConverter converter;
-	@SpringBean
+	@Inject
 	private UserDao userDao;
 
 	public UploadableProfileImagePanel(String id, final Long userId) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/ConvertingErrorsDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/ConvertingErrorsDialog.java
index 473da666f..3cd6170be 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/ConvertingErrorsDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/ConvertingErrorsDialog.java
@@ -35,9 +35,9 @@ import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import jakarta.inject.Inject;
 
 public class ConvertingErrorsDialog extends Modal<BaseFileItem> {
 	private static final long serialVersionUID = 1L;
@@ -61,7 +61,7 @@ public class ConvertingErrorsDialog extends Modal<BaseFileItem> {
 	};
 	private Component headerLabel;
 
-	@SpringBean
+	@Inject
 	private FileItemLogDao fileLogDao;
 
 	public ConvertingErrorsDialog(String id, IModel<BaseFileItem> model) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemPanel.java
index b2364829f..0d2dfef7d 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemPanel.java
@@ -28,12 +28,14 @@ import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
+import jakarta.inject.Inject;
 
 public class FileItemPanel extends FolderPanel {
 	private static final long serialVersionUID = 1L;
 	private final WebMarkupContainer errors = new WebMarkupContainer("errors");
-	@SpringBean
+
+	@Inject
 	private FileItemLogDao fileLogDao;
 
 	public FileItemPanel(String id, final IModel<BaseFileItem> model, final FileTreePanel fileTreePanel) {
diff --git 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
index 5fe0f2a10..c60d25889 100644
--- 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
@@ -69,7 +69,6 @@ import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
 import org.apache.wicket.resource.FileSystemResource;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 
 import com.googlecode.wicket.jquery.core.JQueryBehavior;
 import com.googlecode.wicket.jquery.core.Options;
@@ -86,6 +85,7 @@ import de.agilecoders.wicket.core.markup.html.bootstrap.button.dropdown.SplitBut
 import de.agilecoders.wicket.core.markup.html.bootstrap.image.IconType;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.confirmation.ConfirmationBehavior;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome6IconType;
+import jakarta.inject.Inject;
 
 public abstract class FileTreePanel extends Panel {
 	private static final long serialVersionUID = 1L;
@@ -138,9 +138,9 @@ public abstract class FileTreePanel extends Panel {
 	});
 	private final Component upload = new WebMarkupContainer("upload");
 
-	@SpringBean
+	@Inject
 	private RecordingDao recDao;
-	@SpringBean
+	@Inject
 	private FileItemDao fileDao;
 
 	protected FileTreePanel(String id, Long roomId, NameDialog addFolder) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
index 6d9f5638f..fab8c2a57 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
@@ -43,7 +43,6 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.string.Strings;
 
 import com.github.openjson.JSONObject;
@@ -54,6 +53,8 @@ import com.googlecode.wicket.jquery.ui.interaction.draggable.IDraggableListener;
 import com.googlecode.wicket.jquery.ui.interaction.droppable.DroppableBehavior;
 import com.googlecode.wicket.jquery.ui.interaction.droppable.IDroppableListener;
 
+import jakarta.inject.Inject;
+
 public class FolderPanel extends Panel implements IDraggableListener, IDroppableListener {
 	private static final long serialVersionUID = 1L;
 	private static final String CSS_CLASS_FILE = "file ps-5 ";
@@ -62,9 +63,10 @@ public class FolderPanel extends Panel implements IDraggableListener, IDroppable
 	private static final String PARAM_CTRL = "c";
 	private final StyleBehavior styleClass;
 	private final FileTreePanel treePanel;
-	@SpringBean
+
+	@Inject
 	private RecordingDao recDao;
-	@SpringBean
+	@Inject
 	private FileItemDao fileDao;
 
 	public FolderPanel(String id, final IModel<BaseFileItem> model, final FileTreePanel treePanel) {
diff --git 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
index fde3e082e..e2f055aca 100644
--- 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
@@ -41,7 +41,8 @@ import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider;
 import org.apache.wicket.injection.Injector;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
+import jakarta.inject.Inject;
 
 public class OmTreeProvider implements ITreeProvider<BaseFileItem> {
 	private static final long serialVersionUID = 1L;
@@ -57,11 +58,12 @@ public class OmTreeProvider implements ITreeProvider<BaseFileItem> {
 	private final String lblPublic;
 	private final String lblGroupFile;
 	private final String lblGroupRec;
-	@SpringBean
+
+	@Inject
 	private UserDao userDao;
-	@SpringBean
+	@Inject
 	private RecordingDao recDao;
-	@SpringBean
+	@Inject
 	private FileItemDao fileDao;
 
 	public OmTreeProvider(Long roomId) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/upload/UploadResourceReference.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/upload/UploadResourceReference.java
index e27570510..a669b6212 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/upload/UploadResourceReference.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/upload/UploadResourceReference.java
@@ -26,9 +26,10 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import jakarta.inject.Inject;
 import jakarta.ws.rs.core.MediaType;
 
-import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload2.FileItem;
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.web.app.Application;
@@ -42,7 +43,6 @@ import org.apache.wicket.request.resource.AbstractResource.WriteCallback;
 import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.request.resource.IResource.Attributes;
 import org.apache.wicket.request.resource.ResourceReference;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.lang.Bytes;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -61,7 +61,7 @@ public abstract class UploadResourceReference extends ResourceReference {
 		, ERROR
 	}
 
-	@SpringBean
+	@Inject
 	private ClientManager cm;
 
 	protected UploadResourceReference(Class<?> scope, String name) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/ActivatePage.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/ActivatePage.java
index 780ceb8ed..921b6b971 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/ActivatePage.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/ActivatePage.java
@@ -24,13 +24,15 @@ import org.apache.openmeetings.db.entity.user.User.Right;
 import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.string.StringValue;
 
+import jakarta.inject.Inject;
+
 public class ActivatePage extends BaseNotInitedPage {
 	private static final long serialVersionUID = 1L;
 	public static final String ACTIVATION_PARAM = "u";
-	@SpringBean
+
+	@Inject
 	private UserDao userDao;
 
 	public ActivatePage(PageParameters pp) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java
index 498bc1177..88b95e896 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java
@@ -53,9 +53,10 @@ import org.apache.wicket.protocol.ws.api.WebSocketRequestHandler;
 import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
 import org.apache.wicket.request.IRequestParameters;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.string.StringValue;
 
+import jakarta.inject.Inject;
+
 public class HashPage extends BaseInitedPage implements IUpdatable {
 	private static final long serialVersionUID = 1L;
 	public static final String APP = "app";
@@ -78,9 +79,9 @@ public class HashPage extends BaseInitedPage implements IUpdatable {
 	private final StringValue swf;
 	private final StringValue app;
 
-	@SpringBean
+	@Inject
 	private RoomDao roomDao;
-	@SpringBean
+	@Inject
 	private RecordingDao recDao;
 
 	public HashPage(PageParameters p) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/ResetPage.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/ResetPage.java
index 84c1d647b..98ad7cca9 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/ResetPage.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/ResetPage.java
@@ -26,10 +26,10 @@ import org.apache.openmeetings.web.pages.auth.ResetPasswordDialog;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.TextContentModal;
+import jakarta.inject.Inject;
 
 public class ResetPage extends BaseNotInitedPage {
 	private static final long serialVersionUID = 1L;
@@ -42,7 +42,8 @@ public class ResetPage extends BaseNotInitedPage {
 			setResponsePage(Application.get().getSignInPageClass());
 		}
 	};
-	@SpringBean
+
+	@Inject
 	private UserDao userDao;
 
 	public ResetPage(PageParameters pp) {
diff --git 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
index fe26e94ce..d921aa4fe 100644
--- 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
@@ -49,7 +49,7 @@ import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.util.string.Strings;
 import org.apache.wicket.validation.IValidatable;
 import org.apache.wicket.validation.IValidator;
@@ -61,6 +61,7 @@ import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxButt
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import jakarta.inject.Inject;
 
 public class ForgetPasswordDialog extends Modal<String> {
 	private static final Logger log = LoggerFactory.getLogger(ForgetPasswordDialog.class);
@@ -74,9 +75,9 @@ public class ForgetPasswordDialog extends Modal<String> {
 	private ForgetPasswordForm form = new ForgetPasswordForm("form");
 	private boolean wasReset = false;
 
-	@SpringBean
+	@Inject
 	private UserDao userDao;
-	@SpringBean
+	@Inject
 	private MailHandler mailHandler;
 
 	enum Type {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/OtpDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/OtpDialog.java
index 968d3d636..48359f756 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/OtpDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/OtpDialog.java
@@ -41,13 +41,14 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.request.cycle.RequestCycle;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.util.string.Strings;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.spinner.SpinnerAjaxButton;
+import jakarta.inject.Inject;
 
 public class OtpDialog extends Modal<User> {
 	private static final long serialVersionUID = 1L;
@@ -56,9 +57,10 @@ public class OtpDialog extends Modal<User> {
 	private final NotificationPanel feedback = new NotificationPanel("feedback");
 	private final OtpForm form = new OtpForm("form");
 	private final RadioGroup<String> radioGroup = new RadioGroup<>("type", Model.of(TYPE_OTP));
-	@SpringBean
+
+	@Inject
 	private OtpManager otpManager;
-	@SpringBean
+	@Inject
 	private UserDao userDao;
 
 	public OtpDialog(String id, IModel<User> model) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.java
index 0ec636d04..004fc4622 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.java
@@ -47,7 +47,7 @@ import org.apache.wicket.model.Model;
 import org.apache.wicket.model.PropertyModel;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.request.cycle.RequestCycle;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.util.string.Strings;
 import org.apache.wicket.validation.IValidatable;
 import org.slf4j.Logger;
@@ -57,6 +57,7 @@ import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.spinner.SpinnerAjaxButton;
+import jakarta.inject.Inject;
 
 public class RegisterDialog extends Modal<String> {
 	private static final long serialVersionUID = 1L;
@@ -75,9 +76,9 @@ public class RegisterDialog extends Modal<String> {
 	private Long lang;
 	private boolean wasRegistered = false;
 
-	@SpringBean
+	@Inject
 	private IUserManager userManager;
-	@SpringBean
+	@Inject
 	private UserDao userDao;
 
 	public RegisterDialog(String id) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java
index dff43f077..473d84e3b 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java
@@ -29,12 +29,13 @@ import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.request.cycle.RequestCycle;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxButton;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import jakarta.inject.Inject;
 
 public class ResetPasswordDialog extends Modal<String> {
 	private static final long serialVersionUID = 1L;
@@ -43,7 +44,7 @@ public class ResetPasswordDialog extends Modal<String> {
 	private PasswordTextField password;
 	private final User user;
 
-	@SpringBean
+	@Inject
 	private UserDao userDao;
 
 	public ResetPasswordDialog(String id, final User user) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java
index 06b9320a1..223ad9292 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java
@@ -67,7 +67,7 @@ import org.apache.wicket.model.PropertyModel;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -78,6 +78,7 @@ import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import de.agilecoders.wicket.core.markup.html.bootstrap.image.IconType;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.spinner.SpinnerAjaxButton;
+import jakarta.inject.Inject;
 
 public class SignInDialog extends Modal<String> {
 	private static final long serialVersionUID = 1L;
@@ -87,13 +88,14 @@ public class SignInDialog extends Modal<String> {
 	private boolean rememberMe = false;
 	private LdapConfig domain;
 	private NotificationPanel feedback = new NotificationPanel("feedback");
-	@SpringBean
+
+	@Inject
 	private ConfigurationDao cfgDao;
-	@SpringBean
+	@Inject
 	private LdapConfigDao ldapDao;
-	@SpringBean
+	@Inject
 	private OAuth2Dao oauthDao;
-	@SpringBean
+	@Inject
 	private UserDao userDao;
 
 	public SignInDialog(String id) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
index 1746a0698..e3808b841 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
@@ -43,7 +43,6 @@ import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.request.IRequestParameters;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.string.StringValue;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -52,6 +51,7 @@ import com.github.openjson.JSONException;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.TextContentModal;
+import jakarta.inject.Inject;
 
 public class SignInPage extends BaseInitedPage {
 	private static final long serialVersionUID = 1L;
@@ -108,10 +108,11 @@ public class SignInPage extends BaseInitedPage {
 	};
 	RegisterDialog r = new RegisterDialog("register");
 	private final OtpDialog otpDialog = new OtpDialog("otpDialog", Model.of());
-
-	@SpringBean
+	@Inject
+	private ConfigurationDao cfgDao;
+	@Inject
 	private UserManager userManager;
-	@SpringBean
+	@Inject
 	private OAuth2Dao oauthDao;
 
 	public SignInPage() throws InterruptedException {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java
index ab4e1e3ba..ac6ba1e44 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java
@@ -87,7 +87,7 @@ import org.apache.wicket.model.PropertyModel;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.model.StringResourceModel;
 import org.apache.wicket.request.cycle.RequestCycle;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -103,6 +103,7 @@ import de.agilecoders.wicket.core.markup.html.bootstrap.components.progress.Upda
 import de.agilecoders.wicket.core.markup.html.bootstrap.utilities.BackgroundColorBehavior;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.spinner.SpinnerAjaxButton;
 import de.agilecoders.wicket.extensions.wizard.BootstrapWizard;
+import jakarta.inject.Inject;
 
 public class InstallWizard extends BootstrapWizard {
 	private static final long serialVersionUID = 1L;
@@ -123,7 +124,7 @@ public class InstallWizard extends BootstrapWizard {
 	private final List<Button> buttons = new ArrayList<>(4);
 	private WizardButtonBar btnBar;
 
-	@SpringBean
+	@Inject
 	private ImportInitvalues initvalues;
 
 	//onInit, applyState
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/NicknameDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/NicknameDialog.java
index ffa7ea219..27394ad00 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/NicknameDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/NicknameDialog.java
@@ -34,13 +34,14 @@ import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.RequiredTextField;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.util.string.Strings;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxButton;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import jakarta.inject.Inject;
 
 public class NicknameDialog extends Modal<User> {
 	private static final long serialVersionUID = 1L;
@@ -48,7 +49,8 @@ public class NicknameDialog extends Modal<User> {
 	private final NotificationPanel feedback = new NotificationPanel("feedback");
 	private final RoomPanel room;
 	private Form<User> form;
-	@SpringBean
+
+	@Inject
 	private ClientManager cm;
 
 	public NicknameDialog(String id, final RoomPanel room) {
diff --git 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
index 558bb6556..347dce303 100644
--- 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
@@ -92,7 +92,7 @@ import org.apache.wicket.protocol.ws.api.event.WebSocketPushPayload;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.resource.ResourceStreamResource;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.util.resource.FileResourceStream;
 import org.apache.wicket.util.resource.IResourceStream;
 import org.apache.wicket.util.string.Strings;
@@ -113,6 +113,7 @@ import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Alert;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal.Backdrop;
+import jakarta.inject.Inject;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.TextContentModal;
 
 @AuthorizeInstantiation("ROOM")
@@ -257,21 +258,21 @@ public class RoomPanel extends BasePanel {
 	private boolean avInited = false;
 	private boolean jsInited = false;
 
-	@SpringBean
+	@Inject
 	private ClientManager cm;
-	@SpringBean
+	@Inject
 	private UserDao userDao;
-	@SpringBean
+	@Inject
 	private AppointmentDao apptDao;
-	@SpringBean
+	@Inject
 	private QuickPollManager qpollManager;
-	@SpringBean
+	@Inject
 	private KurentoHandler kHandler;
-	@SpringBean
+	@Inject
 	private StreamProcessor streamProcessor;
-	@SpringBean
+	@Inject
 	private TimerService timerService;
-	@SpringBean
+	@Inject
 	private FileItemDao fileDao;
 
 	public RoomPanel(String id, Room r) {
diff --git 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
index 98636ed83..d9ae8cc85 100644
--- 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
@@ -38,17 +38,20 @@ import org.apache.openmeetings.web.util.FileItemResourceReference;
 import org.apache.wicket.injection.Injector;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.resource.IResource.Attributes;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.util.string.StringValue;
 
+import jakarta.inject.Inject;
+
 public class RoomResourceReference extends FileItemResourceReference<FileItem> {
 	private static final long serialVersionUID = 1L;
 	private static final String DEFAULT_NAME = "wb-room-file";
-	@SpringBean
+
+	@Inject
 	private ClientManager cm;
-	@SpringBean
+	@Inject
 	private FileItemDao fileDao;
-	@SpringBean
+	@Inject
 	private GroupUserDao groupUserDao;
 
 	public RoomResourceReference() {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java
index 86ac8a69b..8890d4b51 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java
@@ -43,7 +43,7 @@ import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.PriorityHeaderItem;
 import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.util.string.StringValue;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -51,6 +51,8 @@ import org.slf4j.LoggerFactory;
 import com.github.openjson.JSONArray;
 import com.github.openjson.JSONObject;
 
+import jakarta.inject.Inject;
+
 public class ActivitiesPanel extends Panel {
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = LoggerFactory.getLogger(ActivitiesPanel.class);
@@ -155,7 +157,8 @@ public class ActivitiesPanel extends Panel {
 			response.render(new PriorityHeaderItem(getNamedFunction("activityAction", this, explicit(PARAM_ROOM_ID), explicit(ACTION), explicit(PARAM_ID))));
 		}
 	};
-	@SpringBean
+
+	@Inject
 	private ClientManager cm;
 
 	public ActivitiesPanel(String id, RoomPanel room) {
diff --git 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
index 0d69ea287..c7cca66ac 100644
--- 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
@@ -36,7 +36,9 @@ import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
 import org.apache.wicket.ajax.attributes.IAjaxCallListener;
 import org.apache.wicket.injection.Injector;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
+import jakarta.inject.Inject;
+
 
 public class ActionsSubMenu implements Serializable {
 	private static final long serialVersionUID = 1L;
@@ -56,7 +58,8 @@ public class ActionsSubMenu implements Serializable {
 	private OmMenuItem resetWb;
 	private OmMenuItem localSettings;
 	private final boolean visible;
-	@SpringBean
+
+	@Inject
 	private WhiteboardManager wbManager;
 
 	public ActionsSubMenu(final RoomPanel room, final RoomMenuPanel mp) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/ExtrasSubMenu.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/ExtrasSubMenu.java
index b5376109b..2e6fe3e95 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/ExtrasSubMenu.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/ExtrasSubMenu.java
@@ -30,16 +30,18 @@ import org.apache.openmeetings.web.common.menu.OmMenuItem;
 import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.injection.Injector;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
+import jakarta.inject.Inject;
+
 
 public class ExtrasSubMenu implements Serializable {
 	private static final long serialVersionUID = 1L;
 	private final RoomPanel room;
 	private OmMenuItem extraMenu;
 
-	@SpringBean
+	@Inject
 	private RoomDao roomDao;
-	@SpringBean
+	@Inject
 	private ExtraMenuDao menuDao;
 
 	public ExtrasSubMenu(final RoomPanel room) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/PollsSubMenu.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/PollsSubMenu.java
index 5432adf45..2db859c50 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/PollsSubMenu.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/PollsSubMenu.java
@@ -42,10 +42,12 @@ import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.injection.Injector;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.PriorityHeaderItem;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import jakarta.inject.Inject;
+
 public class PollsSubMenu implements Serializable {
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = LoggerFactory.getLogger(PollsSubMenu.class);
@@ -88,9 +90,10 @@ public class PollsSubMenu implements Serializable {
 		}
 	};
 	private final boolean visible;
-	@SpringBean
+
+	@Inject
 	private QuickPollManager qpollManager;
-	@SpringBean
+	@Inject
 	private PollDao pollDao;
 
 	public PollsSubMenu(final RoomPanel room, final RoomMenuPanel mp) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomInvitationForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomInvitationForm.java
index 65e11512d..63dc55f34 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomInvitationForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomInvitationForm.java
@@ -45,12 +45,14 @@ import org.apache.wicket.markup.html.form.RadioGroup;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.model.util.CollectionModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.wicketstuff.select2.Select2MultiChoice;
 
+import jakarta.inject.Inject;
+
 public class RoomInvitationForm extends InvitationForm {
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = LoggerFactory.getLogger(RoomInvitationForm.class);
@@ -61,11 +63,12 @@ public class RoomInvitationForm extends InvitationForm {
 			, new CollectionModel<>(new ArrayList<>())
 			, new GroupChoiceProvider());
 	final WebMarkupContainer sipContainer = new WebMarkupContainer("sip-container");
-	@SpringBean
+
+	@Inject
 	private RoomDao roomDao;
-	@SpringBean
+	@Inject
 	private GroupUserDao groupUserDao;
-	@SpringBean
+	@Inject
 	private InvitationManager invitationManager;
 
 	enum InviteeType {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
index bba3616c5..2dcc1deb7 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
@@ -61,7 +61,7 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.request.flow.RedirectToUrlException;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.util.string.Strings;
 import org.apache.openmeetings.mediaserver.KurentoHandler;
 import org.apache.openmeetings.mediaserver.StreamProcessor;
@@ -70,6 +70,7 @@ import com.github.openjson.JSONObject;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.navbar.INavbarComponent;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome6IconType;
+import jakarta.inject.Inject;
 
 public class RoomMenuPanel extends Panel {
 	private static final long serialVersionUID = 1L;
@@ -106,15 +107,16 @@ public class RoomMenuPanel extends Panel {
 	private final PollsSubMenu pollsSubMenu;
 	private final ActionsSubMenu actionsSubMenu;
 	private final ExtrasSubMenu extrasSubMenu;
-	@SpringBean
+
+	@Inject
 	private ClientManager cm;
-	@SpringBean
+	@Inject
 	private ConfigurationDao cfgDao;
-	@SpringBean
+	@Inject
 	private ChatDao chatDao;
-	@SpringBean
+	@Inject
 	private KurentoHandler kHandler;
-	@SpringBean
+	@Inject
 	private StreamProcessor streamProcessor;
 
 	public RoomMenuPanel(String id, final RoomPanel room) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.java
index 33b0ce9c3..be0ea2031 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/SipDialerDialog.java
@@ -27,12 +27,13 @@ import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxButton;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import jakarta.inject.Inject;
 
 public class SipDialerDialog extends Modal<String> {
 	private static final long serialVersionUID = 1L;
@@ -40,7 +41,8 @@ public class SipDialerDialog extends Modal<String> {
 	private final Form<String> form = new Form<>("form", Model.of(""));
 	private final TextField<String> number = new TextField<>("number", Model.of(""));
 	private final RoomPanel room;
-	@SpringBean
+
+	@Inject
 	private SipManager sipDao;
 
 	public SipDialerDialog(String id, RoomPanel room) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/CreatePollDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/CreatePollDialog.java
index 1085c75cd..5d1dd1d5f 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/CreatePollDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/CreatePollDialog.java
@@ -40,23 +40,25 @@ import org.apache.wicket.markup.html.form.TextArea;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxButton;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import jakarta.inject.Inject;
 
 public class CreatePollDialog extends Modal<RoomPoll> {
 	private static final long serialVersionUID = 1L;
 	private final Long roomId;
 	private PollForm form;
 	private final NotificationPanel feedback = new NotificationPanel("feedback");
-	@SpringBean
+
+	@Inject
 	private RoomDao roomDao;
-	@SpringBean
+	@Inject
 	private UserDao userDao;
-	@SpringBean
+	@Inject
 	private PollDao pollDao;
 
 	public CreatePollDialog(String id, Long roomId) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/PollResultsDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/PollResultsDialog.java
index 08ada8e24..346eec104 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/PollResultsDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/PollResultsDialog.java
@@ -47,7 +47,7 @@ import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.wicketstuff.jqplot.behavior.JqPlotBehavior;
 import org.wicketstuff.jqplot.behavior.JqPlotCssResourceReference;
 import org.wicketstuff.jqplot.behavior.JqPlotJavascriptResourceReference;
@@ -65,6 +65,7 @@ import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome6IconType;
+import jakarta.inject.Inject;
 
 public class PollResultsDialog extends Modal<RoomPoll> {
 	private static final long serialVersionUID = 1L;
@@ -82,9 +83,10 @@ public class PollResultsDialog extends Modal<RoomPoll> {
 	private String chartPie;
 	private final CreatePollDialog createPoll;
 	private DropDownChoice<String> chartType;
-	@SpringBean
+
+	@Inject
 	private PollDao pollDao;
-	@SpringBean
+	@Inject
 	private UserDao userDao;
 
 	public PollResultsDialog(String id, CreatePollDialog createPoll, Long roomId) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/VoteDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/VoteDialog.java
index 9ef769ca2..86a8cc3b5 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/VoteDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/VoteDialog.java
@@ -45,12 +45,13 @@ import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxButton;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import jakarta.inject.Inject;
 
 public class VoteDialog extends Modal<RoomPollAnswer> {
 	private static final long serialVersionUID = 1L;
@@ -58,9 +59,10 @@ public class VoteDialog extends Modal<RoomPollAnswer> {
 	private PollAnswerForm form;
 	private final NotificationPanel feedback = new NotificationPanel("feedback");
 	private final Label userLbl = new Label("user", Model.of(""));
-	@SpringBean
+
+	@Inject
 	private UserDao userDao;
-	@SpringBean
+	@Inject
 	private PollDao pollDao;
 
 	public VoteDialog(String id) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java
index 5eb979d13..8423d9548 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java
@@ -32,14 +32,17 @@ import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
+import jakarta.inject.Inject;
+
 
 public class RoomFilePanel extends FileTreePanel {
 	private static final long serialVersionUID = 1L;
 	private final RoomPanel room;
-	@SpringBean
+
+	@Inject
 	private FileItemDao fileDao;
-	@SpringBean
+	@Inject
 	private RecordingDao recDao;
 
 	public RoomFilePanel(String id, RoomPanel room, NameDialog addFolder) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFileUploadResourceReference.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFileUploadResourceReference.java
index 1ed5dfa5d..5fb346aaf 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFileUploadResourceReference.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFileUploadResourceReference.java
@@ -26,7 +26,7 @@ import java.util.Optional;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.DoubleConsumer;
 
-import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload2.FileItem;
 import org.apache.openmeetings.core.data.file.FileProcessor;
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.dao.file.FileItemDao;
@@ -44,12 +44,14 @@ import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.common.upload.UploadResourceReference;
 import org.apache.wicket.injection.Injector;
 import org.apache.wicket.protocol.http.servlet.MultipartServletWebRequest;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.github.openjson.JSONObject;
 
+import jakarta.inject.Inject;
+
 public class RoomFileUploadResourceReference extends UploadResourceReference {
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = LoggerFactory.getLogger(RoomFileUploadResourceReference.class);
@@ -60,11 +62,11 @@ public class RoomFileUploadResourceReference extends UploadResourceReference {
 	public static final String PARAM_LAST_SELECTED_OWNER = "room-upload-last-selected-owner";
 	public static final String PARAM_LAST_SELECTED_GROUP = "room-upload-last-selected-group";
 
-	@SpringBean
+	@Inject
 	private FileProcessor processor;
-	@SpringBean
+	@Inject
 	private FileItemLogDao fileLogDao;
-	@SpringBean
+	@Inject
 	private FileItemDao fileDao;
 
 	public RoomFileUploadResourceReference() {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
index 15274466e..309188915 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
@@ -37,13 +37,15 @@ import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.github.openjson.JSONObject;
 
+import jakarta.inject.Inject;
+
 public class RoomSidebar extends Panel {
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = LoggerFactory.getLogger(RoomSidebar.class);
@@ -60,7 +62,7 @@ public class RoomSidebar extends Panel {
 	private VideoSettings settings = new VideoSettings("settings");
 	private ActivitiesPanel activities;
 
-	@SpringBean
+	@Inject
 	private ClientManager cm;
 
 	public RoomSidebar(String id, final RoomPanel room) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/InterviewWbPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/InterviewWbPanel.java
index e6a6b49fa..3701ee8ad 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/InterviewWbPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/InterviewWbPanel.java
@@ -24,14 +24,17 @@ import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.room.Room.Right;
 import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.openmeetings.mediaserver.StreamProcessor;
 
 import com.github.openjson.JSONObject;
 
+import jakarta.inject.Inject;
+
 public class InterviewWbPanel extends AbstractWbPanel {
 	private static final long serialVersionUID = 1L;
-	@SpringBean
+
+	@Inject
 	private StreamProcessor streamProcessor;
 
 	public InterviewWbPanel(String id, RoomPanel rp) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
index df7d746e6..adeb3cb03 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
@@ -69,7 +69,9 @@ import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.apache.wicket.request.resource.JavaScriptResourceReference;
+import org.apache.wicket.request.resource.ResourceReference;
+
 import org.apache.wicket.util.string.Strings;
 import org.danekja.java.util.function.serializable.SerializableBiConsumer;
 import org.slf4j.Logger;
@@ -79,6 +81,8 @@ import com.github.openjson.JSONArray;
 import com.github.openjson.JSONObject;
 import com.github.openjson.JSONTokener;
 
+import jakarta.inject.Inject;
+
 public class WbPanel extends AbstractWbPanel {
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = LoggerFactory.getLogger(WbPanel.class);
@@ -132,9 +136,10 @@ public class WbPanel extends AbstractWbPanel {
 					, UndoObject.Type.REMOVE, arr));
 		}
 	};
-	@SpringBean
+
+	@Inject
 	private WhiteboardManager wbm;
-	@SpringBean
+	@Inject
 	private FileItemDao fileDao;
 
 	public WbPanel(String id, RoomPanel rp) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.java
index 0cd6cbe1f..9c9739eab 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserMessageDialog.java
@@ -30,20 +30,22 @@ import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.TextArea;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxButton;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import jakarta.inject.Inject;
 
 public class InviteUserMessageDialog extends Modal<String> {
 	private static final long serialVersionUID = 1L;
 	private final Form<Void> form = new Form<>("form");
 	private final TextArea<String> message = new TextArea<>("message", Model.of(""));
 	private final CheckBox enterRoom = new CheckBox("enterRoom", Model.of(false));
-	@SpringBean
+
+	@Inject
 	private UserDao userDao;
-	@SpringBean
+	@Inject
 	private RoomDao roomDao;
 
 	public InviteUserMessageDialog(String id) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.java
index 942efb5a0..e00e1dc64 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.java
@@ -32,9 +32,10 @@ import org.apache.openmeetings.web.user.rooms.RoomListPanel;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import jakarta.inject.Inject;
 
 public class InviteUserToRoomDialog extends Modal<String> {
 	private static final long serialVersionUID = 1L;
@@ -42,9 +43,10 @@ public class InviteUserToRoomDialog extends Modal<String> {
 	private RoomListPanel privateRooms;
 	private final InviteUserMessageDialog inviteMsg = new InviteUserMessageDialog("inviteMsg");
 	private Long userId;
-	@SpringBean
+
+	@Inject
 	private RoomDao roomDao;
-	@SpringBean
+	@Inject
 	private UserDao userDao;
 
 	private class InviteRoomListPanel extends RoomListPanel {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
index a8e036268..11a70d2db 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
@@ -70,7 +70,7 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.model.util.CollectionModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 
 import com.googlecode.wicket.jquery.ui.plugins.wysiwyg.WysiwygEditor;
 
@@ -78,6 +78,7 @@ import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxButt
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import jakarta.inject.Inject;
 
 public class MessageDialog extends Modal<PrivateMessage> {
 	private static final long serialVersionUID = 1L;
@@ -89,17 +90,20 @@ public class MessageDialog extends Modal<PrivateMessage> {
 	private final OmDateTimePicker end = new OmDateTimePicker("end", Model.of(LocalDateTime.now()));
 	private boolean isPrivate = false;
 	private final IModel<Collection<User>> modelTo = new CollectionModel<>(new ArrayList<>());
-	@SpringBean
+
+	@Inject
 	private RoomDao roomDao;
-	@SpringBean
+	@Inject
 	private UserDao userDao;
-	@SpringBean
+	@Inject
+	private ConfigurationDao cfgDao;
+	@Inject
 	private AppointmentDao apptDao;
-	@SpringBean
+	@Inject
 	private PrivateMessageDao msgDao;
-	@SpringBean
+	@Inject
 	private IInvitationManager inviteManager;
-	@SpringBean
+	@Inject
 	private MailHandler handler;
 
 	public MessageDialog(String id, CompoundPropertyModel<PrivateMessage> model) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.java
index faa07127e..4a162bbb9 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/UserInfoDialog.java
@@ -29,22 +29,24 @@ import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import jakarta.inject.Inject;
 
 public class UserInfoDialog extends Modal<String> {
 	private static final long serialVersionUID = 1L;
 	private WebMarkupContainer container = new WebMarkupContainer("container");
 	private MessageDialog newMessage;
 	private long userId;
-	@SpringBean
-	private UserContactDao contactDao;
 	private BootstrapAjaxLink<String> message;
 	private BootstrapAjaxLink<String> contacts;
 
+	@Inject
+	private UserContactDao contactDao;
+
 	public UserInfoDialog(String id, MessageDialog newMessage) {
 		super(id);
 		this.newMessage = newMessage;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
index a77932c6c..4403bd667 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
@@ -83,7 +83,7 @@ import org.apache.wicket.model.Model;
 import org.apache.wicket.model.PropertyModel;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.model.util.CollectionModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.wicketstuff.select2.Select2MultiChoice;
@@ -95,6 +95,7 @@ import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import jakarta.inject.Inject;
 
 public class AppointmentDialog extends Modal<Appointment> {
 	private static final long serialVersionUID = 1L;
@@ -116,15 +117,16 @@ public class AppointmentDialog extends Modal<Appointment> {
 		USER
 		, GROUP
 	}
-	@SpringBean
+
+	@Inject
 	private RoomDao roomDao;
-	@SpringBean
+	@Inject
 	private UserDao userDao;
-	@SpringBean
+	@Inject
 	private AppointmentDao apptDao;
-	@SpringBean
+	@Inject
 	private GroupUserDao groupUserDao;
-	@SpringBean
+	@Inject
 	private AppointmentManager apptManager;
 
 	public AppointmentDialog(String id, CalendarPanel calendarPanel, CompoundPropertyModel<Appointment> model) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarDialog.java
index 58f1ca298..db8500706 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarDialog.java
@@ -45,7 +45,7 @@ import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.validation.IValidatable;
 import org.apache.wicket.validation.validator.UrlValidator;
 import org.slf4j.Logger;
@@ -56,6 +56,7 @@ import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import jakarta.inject.Inject;
 
 /**
  * Multipurpose Calendar Dialog form. This provides the ability to ask for a user prompt,
@@ -73,9 +74,10 @@ public class CalendarDialog extends Modal<OmCalendar> {
 	private UserCalendarForm form;
 	private List<OmCalendar> cals; //List of calendars for syncing
 	private int calIndex = 0;
-	@SpringBean
+
+	@Inject
 	private UserDao userDao;
-	@SpringBean
+	@Inject
 	private AppointmentManager apptManager;
 
 	public enum DIALOG_TYPE {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java
index aa44efedd..afcb41f71 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java
@@ -59,7 +59,7 @@ import org.apache.wicket.model.LoadableDetachableModel;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
 import org.apache.wicket.request.resource.ResourceReference;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -71,6 +71,7 @@ import com.googlecode.wicket.jquery.ui.calendar.EventSource.GoogleCalendar;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
+import jakarta.inject.Inject;
 
 public class CalendarPanel extends UserBasePanel {
 	private static final Logger log = LoggerFactory.getLogger(CalendarPanel.class);
@@ -104,11 +105,11 @@ public class CalendarPanel extends UserBasePanel {
 	// Context for the HttpClient. Mainly used for credentials.
 	private transient HttpClientContext context = null;
 
-	@SpringBean
+	@Inject
 	private AppointmentDao apptDao;
-	@SpringBean
+	@Inject
 	private AppointmentManager apptManager;
-	@SpringBean
+	@Inject
 	private UserDao userDao;
 
 	public CalendarPanel(String id) {
diff --git 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
index e7207ae46..ef3882a4b 100644
--- 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
@@ -55,13 +55,16 @@ import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
 import org.apache.wicket.markup.head.PriorityHeaderItem;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.request.cycle.RequestCycle;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.apache.wicket.request.resource.JavaScriptResourceReference;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.github.openjson.JSONObject;
 import com.googlecode.wicket.jquery.ui.settings.JQueryUILibrarySettings;
 
+import jakarta.inject.Inject;
+
 public class Chat extends Panel {
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = LoggerFactory.getLogger(Chat.class);
@@ -103,13 +106,13 @@ public class Chat extends Panel {
 		}
 	};
 
-	@SpringBean
+	@Inject
 	private ClientManager cm;
-	@SpringBean
+	@Inject
 	private ConfigurationDao cfgDao;
-	@SpringBean
+	@Inject
 	private ChatDao chatDao;
-	@SpringBean
+	@Inject
 	private UserDao userDao;
 
 	public Chat(String id) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java
index 91f410222..cc2a591e6 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java
@@ -48,7 +48,7 @@ import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.HiddenField;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -56,18 +56,20 @@ import org.slf4j.LoggerFactory;
 import com.github.openjson.JSONObject;
 import com.googlecode.wicket.jquery.ui.plugins.wysiwyg.WysiwygEditor;
 
+import jakarta.inject.Inject;
+
 public class ChatForm extends Form<Void> {
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = LoggerFactory.getLogger(ChatForm.class);
 	private final HiddenField<String> activeTab = new HiddenField<>("activeTab", Model.of(""));
 
-	@SpringBean
+	@Inject
 	private ClientManager cm;
-	@SpringBean
+	@Inject
 	private ChatDao chatDao;
-	@SpringBean
+	@Inject
 	private UserDao userDao;
-	@SpringBean
+	@Inject
 	private RoomDao roomDao;
 
 	public ChatForm(String id) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
index 868941abb..548787b41 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
@@ -31,6 +31,7 @@ import static org.apache.openmeetings.web.room.RoomPanel.isModerator;
 
 import java.util.List;
 
+import jakarta.inject.Inject;
 import jakarta.servlet.http.HttpServletResponse;
 
 import org.apache.openmeetings.core.util.WebSocketHelper;
@@ -48,7 +49,7 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.request.resource.ResourceStreamResource;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.util.resource.IResourceStream;
 import org.apache.wicket.util.resource.StringResourceStream;
 
@@ -141,9 +142,9 @@ public class ChatToolbar extends Panel implements IWysiwygToolbar {
 		}
 	});
 
-	@SpringBean
+	@Inject
 	private ClientManager cm;
-	@SpringBean
+	@Inject
 	private ChatDao chatDao;
 
 	/**
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/MyRoomsWidgetView.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/MyRoomsWidgetView.java
index 7400b33c1..6439d88d3 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/MyRoomsWidgetView.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/MyRoomsWidgetView.java
@@ -24,13 +24,16 @@ import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.user.rooms.RoomsPanel;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.wicketstuff.dashboard.Widget;
 import org.wicketstuff.dashboard.web.WidgetView;
 
+import jakarta.inject.Inject;
+
 public class MyRoomsWidgetView extends WidgetView {
 	private static final long serialVersionUID = 1L;
-	@SpringBean
+
+	@Inject
 	private RoomDao roomDao;
 
 	public MyRoomsWidgetView(String id, Model<Widget> model) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/RecentRoomsWidgetView.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/RecentRoomsWidgetView.java
index 25af7240c..3378ae398 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/RecentRoomsWidgetView.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/RecentRoomsWidgetView.java
@@ -23,13 +23,16 @@ import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.web.user.rooms.RoomsPanel;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.wicketstuff.dashboard.Widget;
 import org.wicketstuff.dashboard.web.WidgetView;
 
+import jakarta.inject.Inject;
+
 public class RecentRoomsWidgetView extends WidgetView {
 	private static final long serialVersionUID = 1L;
-	@SpringBean
+
+	@Inject
 	private RoomDao roomDao;
 
 	public RecentRoomsWidgetView(String id, Model<Widget> model) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/WelcomeWidgetView.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/WelcomeWidgetView.java
index 81f32960c..cab5c17a4 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/WelcomeWidgetView.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/WelcomeWidgetView.java
@@ -40,15 +40,18 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.wicketstuff.dashboard.Widget;
 import org.wicketstuff.dashboard.web.WidgetView;
 
+import jakarta.inject.Inject;
+
 public class WelcomeWidgetView extends WidgetView {
 	private static final long serialVersionUID = 1L;
-	@SpringBean
+
+	@Inject
 	private UserDao userDao;
-	@SpringBean
+	@Inject
 	private PrivateMessageDao msgDao;
 
 	public WelcomeWidgetView(String id, Model<Widget> model) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/admin/AdminCleanupInfoDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/admin/AdminCleanupInfoDialog.java
index 44509eb18..b5fd1e2fa 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/admin/AdminCleanupInfoDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/admin/AdminCleanupInfoDialog.java
@@ -40,12 +40,13 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.spinner.SpinnerAjaxButton;
+import jakarta.inject.Inject;
 
 public class AdminCleanupInfoDialog extends Modal<String> {
 	private static final long serialVersionUID = 1L;
@@ -58,11 +59,12 @@ public class AdminCleanupInfoDialog extends Modal<String> {
 	private CleanupEntityUnitPanel fin;
 	private final WebMarkupContainer container = new WebMarkupContainer("container");
 	private final NotificationPanel feedback = new NotificationPanel("feedback");
-	@SpringBean
+
+	@Inject
 	private UserDao userDao;
-	@SpringBean
+	@Inject
 	private FileItemDao fileDao;
-	@SpringBean
+	@Inject
 	private RecordingDao recDao;
 
 	public AdminCleanupInfoDialog(String id) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/ChangePasswordDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/ChangePasswordDialog.java
index f2280c5e5..1ad79bbb6 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/ChangePasswordDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/ChangePasswordDialog.java
@@ -30,13 +30,14 @@ import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.PasswordTextField;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.util.string.Strings;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.spinner.SpinnerAjaxButton;
+import jakarta.inject.Inject;
 
 public class ChangePasswordDialog extends Modal<String> {
 	private static final long serialVersionUID = 1L;
@@ -61,7 +62,8 @@ public class ChangePasswordDialog extends Modal<String> {
 		}
 	};
 	private final NotificationPanel feedback = new NotificationPanel("feedback");
-	@SpringBean
+
+	@Inject
 	private UserDao userDao;
 
 	public ChangePasswordDialog(String id) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/EditProfileForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/EditProfileForm.java
index 2ac5b1372..c4efb0b61 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/EditProfileForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/EditProfileForm.java
@@ -47,13 +47,14 @@ import org.apache.wicket.markup.html.panel.PanelMarkupSourcingStrategy;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.util.string.Strings;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.confirmation.ConfirmationBehavior;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome6IconType;
+import jakarta.inject.Inject;
 
 public class EditProfileForm extends Form<User> {
 	private static final long serialVersionUID = 1L;
@@ -63,7 +64,7 @@ public class EditProfileForm extends Form<User> {
 	private FormActionsPanel<User> actions;
 	private BootstrapAjaxLink<String> toggleOtp;
 
-	@SpringBean
+	@Inject
 	private UserDao userDao;
 
 	public EditProfileForm(String id) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/InvitationDetails.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/InvitationDetails.java
index 8e968e4f8..1d574d78e 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/InvitationDetails.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/InvitationDetails.java
@@ -35,7 +35,8 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
+import jakarta.inject.Inject;
 
 public class InvitationDetails extends Form<Invitation>{
 	private static final long serialVersionUID = 1L;
@@ -45,7 +46,8 @@ public class InvitationDetails extends Form<Invitation>{
 	private final Label invitee = new Label("invitee", Model.of(""));
 	private final DateLabel from = new DateLabel("validFrom", Model.of((Date)null));
 	private final DateLabel to = new DateLabel("validTo", Model.of((Date)null));
-	@SpringBean
+
+	@Inject
 	private InvitationDao inviteDao;
 
 	public InvitationDetails(String id, final WebMarkupContainer list, Invitation i) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessagesContactsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessagesContactsPanel.java
index 4ee480534..a231adbc9 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessagesContactsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessagesContactsPanel.java
@@ -76,11 +76,12 @@ import org.apache.wicket.markup.repeater.data.IDataProvider;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.util.ListModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome6IconType;
+import jakarta.inject.Inject;
 
 public class MessagesContactsPanel extends UserBasePanel {
 	private static final long serialVersionUID = 1L;
@@ -125,13 +126,14 @@ public class MessagesContactsPanel extends UserBasePanel {
 		, List.of(notMoveFolder)
 		, new LambdaChoiceRenderer<>(PrivateMessageFolder::getFolderName, f -> "" + f.getId()));
 	private WebMarkupContainer selectedFolder;
-	@SpringBean
+
+	@Inject
 	private PrivateMessageDao msgDao;
-	@SpringBean
+	@Inject
 	private PrivateMessageFolderDao folderDao;
-	@SpringBean
+	@Inject
 	private UserContactDao contactDao;
-	@SpringBean
+	@Inject
 	private AppointmentDao apptDao;
 
 	public MessagesContactsPanel(String id) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/ToggleOtpDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/ToggleOtpDialog.java
index 72df0279a..ab7c994e3 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/ToggleOtpDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/ToggleOtpDialog.java
@@ -34,13 +34,14 @@ import org.apache.wicket.markup.html.form.PasswordTextField;
 import org.apache.wicket.markup.html.form.TextArea;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.util.string.Strings;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.spinner.SpinnerAjaxButton;
+import jakarta.inject.Inject;
 
 public class ToggleOtpDialog extends Modal<User> {
 	private final NotificationPanel feedback = new NotificationPanel("feedback");
@@ -50,9 +51,9 @@ public class ToggleOtpDialog extends Modal<User> {
 	private String secret;
 	private String[] codes;
 
-	@SpringBean
+	@Inject
 	private OtpManager otpManager;
-	@SpringBean
+	@Inject
 	private UserDao userDao;
 
 	public ToggleOtpDialog(String id) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserProfilePanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserProfilePanel.java
index 4b32b8407..abd8a9b08 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserProfilePanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/UserProfilePanel.java
@@ -30,16 +30,19 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.TextArea;
 import org.apache.wicket.model.CompoundPropertyModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
+import jakarta.inject.Inject;
+
 
 public class UserProfilePanel extends UserBasePanel {
 	private static final long serialVersionUID = 1L;
 	private final WebMarkupContainer address = new WebMarkupContainer("address");
 	private final Label addressDenied = new Label("addressDenied", "");
 	private final WebMarkupContainer infoPanel = new WebMarkupContainer("info-panel");
-	@SpringBean
+
+	@Inject
 	private UserDao userDao;
-	@SpringBean
+	@Inject
 	private UserContactDao contactDao;
 
 	public UserProfilePanel(String id, long userId) {
diff --git 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
index 98db6288f..6d20f4441 100644
--- 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
@@ -47,10 +47,11 @@ import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxButton;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
+import jakarta.inject.Inject;
 
 public class UserSearchPanel extends UserBasePanel {
 	private static final long serialVersionUID = 1L;
@@ -62,11 +63,12 @@ public class UserSearchPanel extends UserBasePanel {
 	private final TextField<String> offer = new TextField<>("offer", Model.of(""));
 	private boolean searched = false;
 	private final WebMarkupContainer container = new WebMarkupContainer("container");
-	@SpringBean
+
+	@Inject
 	private UserDao userDao;
-	@SpringBean
+	@Inject
 	private UserContactDao contactDao;
-	@SpringBean
+	@Inject
 	private ClientManager cm;
 
 	public UserSearchPanel(String id) {
diff --git 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
index 0e80f3846..2c7160cd8 100644
--- 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
@@ -40,15 +40,18 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.wicketstuff.dashboard.Dashboard;
 import org.wicketstuff.dashboard.Widget;
 import org.wicketstuff.dashboard.WidgetDescriptor;
 import org.wicketstuff.dashboard.web.DashboardContext;
 
+import jakarta.inject.Inject;
+
 public class WidgetsPanel extends UserBasePanel {
 	private static final long serialVersionUID = 1L;
-	@SpringBean
+
+	@Inject
 	private ConfigurationDao cfgDao;
 
 	public WidgetsPanel(String id) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingInvitationForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingInvitationForm.java
index c319b0fcb..9a3816dc9 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingInvitationForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingInvitationForm.java
@@ -21,12 +21,15 @@ package org.apache.openmeetings.web.user.record;
 import org.apache.openmeetings.db.dao.record.RecordingDao;
 import org.apache.openmeetings.web.common.InvitationForm;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
+import jakarta.inject.Inject;
+
 
 public class RecordingInvitationForm extends InvitationForm {
 	private static final long serialVersionUID = 1L;
 	private Long recordingId;
-	@SpringBean
+
+	@Inject
 	private RecordingDao recDao;
 
 	public RecordingInvitationForm(String id, String dropDownParentId) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java
index a3f0c0d8e..a518e6bc2 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java
@@ -32,16 +32,19 @@ import org.apache.openmeetings.web.util.FileItemResourceReference;
 import org.apache.wicket.injection.Injector;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.resource.IResource.Attributes;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.util.string.StringValue;
 
+import jakarta.inject.Inject;
+
 public abstract class RecordingResourceReference extends FileItemResourceReference<Recording> {
 	private static final long serialVersionUID = 1L;
-	@SpringBean
+
+	@Inject
 	private RecordingDao recDao;
-	@SpringBean
+	@Inject
 	private ClientManager cm;
-	@SpringBean
+	@Inject
 	private GroupUserDao groupUserDao;
 
 	protected RecordingResourceReference(String name) {
diff --git 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
index 5e1c0be8e..a98a39521 100644
--- 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
@@ -41,10 +41,11 @@ import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.link.AbstractLink;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
+import jakarta.inject.Inject;
 
 public class RecordingsPanel extends UserBasePanel {
 	private static final long serialVersionUID = 1L;
@@ -55,13 +56,13 @@ public class RecordingsPanel extends UserBasePanel {
 	private InvitationDialog invite;
 	private RecordingInvitationForm rif = new RecordingInvitationForm("form", INVITE_DIALOG_ID);
 
-	@SpringBean
+	@Inject
 	private RecordingDao recDao;
-	@SpringBean
+	@Inject
 	private InterviewConverter interviewConverter;
-	@SpringBean
+	@Inject
 	private RecordingConverter recordingConverter;
-	@SpringBean
+	@Inject
 	private RecordingChunkDao chunkDao;
 
 	public RecordingsPanel(String id) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java
index 84433323c..b8c8df344 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java
@@ -30,14 +30,17 @@ import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
+import jakarta.inject.Inject;
+
 
 public class VideoInfo extends Panel {
 	private static final long serialVersionUID = 1L;
 	private final Form<Void> form = new Form<>("form");
 	private final Label dateLbl = new Label("recordEnd", Model.of(""));
 	private final Label roomNameLbl = new Label("roomName", Model.of(""));
-	@SpringBean
+
+	@Inject
 	private RoomDao roomDao;
 
 	public VideoInfo(String id) {
diff --git 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
index 0402ecdee..0507b73eb 100644
--- 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
@@ -41,12 +41,13 @@ import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.behavior.CssClassNameAppender;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome6IconType;
+import jakarta.inject.Inject;
 
 public class RoomListPanel extends Panel {
 	private static final long serialVersionUID = 1L;
@@ -101,7 +102,8 @@ public class RoomListPanel extends Panel {
 			}.add(AttributeModifier.append(ATTR_TITLE, new ResourceModel("lbl.refresh"))));
 		}
 	};
-	@SpringBean
+
+	@Inject
 	private ClientManager cm;
 
 	public RoomListPanel(String id, List<Room> rooms, final String label) {
diff --git 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
index 520486273..cee177c5c 100644
--- 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
@@ -38,9 +38,11 @@ import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.request.resource.ByteArrayResource;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.util.io.IOUtils;
 
+import jakarta.inject.Inject;
+
 public class RoomsPanel extends UserPanel {
 	private static final long serialVersionUID = 1L;
 	private final WebMarkupContainer clientsContainer = new WebMarkupContainer("clientsContainer");
@@ -52,11 +54,12 @@ public class RoomsPanel extends UserPanel {
 	private List<Client> clientsInRoom = null;
 	private final List<Room> rooms;
 	private Long roomId = 0L;
-	@SpringBean
+
+	@Inject
 	private UserDao userDao;
-	@SpringBean
+	@Inject
 	private ClientManager cm;
-	@SpringBean
+	@Inject
 	private RoomDao roomDao;
 
 	public RoomsPanel(String id, List<Room> rooms) {
diff --git 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
index f8c7716e5..f27116fed 100644
--- 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
@@ -31,13 +31,16 @@ import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
+import jakarta.inject.Inject;
+
 
 public class RoomsSelectorPanel extends UserBasePanel {
 	private static final long serialVersionUID = 1L;
 	private static final String PANEL_ID = "rooms";
 	private final String type;
-	@SpringBean
+
+	@Inject
 	private RoomDao roomDao;
 
 	public RoomsSelectorPanel(String id, String type) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsTabbedPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsTabbedPanel.java
index 6bf19f9a7..2d86c7bd0 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsTabbedPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsTabbedPanel.java
@@ -31,15 +31,17 @@ import org.apache.openmeetings.web.common.UserPanel;
 import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.tabs.AjaxBootstrapTabbedPanel;
+import jakarta.inject.Inject;
 
 public class RoomsTabbedPanel extends UserPanel {
 	private static final long serialVersionUID = 1L;
-	@SpringBean
+
+	@Inject
 	private RoomDao roomDao;
-	@SpringBean
+	@Inject
 	private UserDao userDao;
 
 	public RoomsTabbedPanel(String id) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java
index 8f83817d5..e944c49aa 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java
@@ -24,6 +24,7 @@ import java.io.File;
 import java.io.IOException;
 import java.util.Map.Entry;
 
+import jakarta.inject.Inject;
 import jakarta.servlet.http.HttpServletResponse;
 
 import org.apache.openmeetings.db.dto.room.Whiteboard;
@@ -35,7 +36,7 @@ import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.request.resource.IResource.Attributes;
 import org.apache.wicket.resource.FileSystemResource;
 import org.apache.wicket.resource.FileSystemResourceReference;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -45,7 +46,8 @@ import com.github.openjson.JSONObject;
 public abstract class FileItemResourceReference<T extends BaseFileItem> extends FileSystemResourceReference {
 	private static final long serialVersionUID = 1L;
 	protected static final Logger log = LoggerFactory.getLogger(FileItemResourceReference.class);
-	@SpringBean
+
+	@Inject
 	private WhiteboardManager wbm;
 
 	protected FileItemResourceReference(String name) {
diff --git 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
index fca3b4805..6cdee3776 100644
--- 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
@@ -27,6 +27,7 @@ import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import java.io.File;
 import java.io.IOException;
 
+import jakarta.inject.Inject;
 import jakarta.servlet.http.HttpServletResponse;
 
 import org.apache.openmeetings.db.dao.room.RoomDao;
@@ -40,7 +41,7 @@ import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.resource.FileSystemResource;
 import org.apache.wicket.resource.FileSystemResourceReference;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.util.string.StringValue;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -48,9 +49,10 @@ import org.slf4j.LoggerFactory;
 public class GroupLogoResourceReference extends FileSystemResourceReference {
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = LoggerFactory.getLogger(GroupLogoResourceReference.class);
-	@SpringBean
+
+	@Inject
 	private GroupUserDao groupUserDao;
-	@SpringBean
+	@Inject
 	private RoomDao roomDao;
 
 	public GroupLogoResourceReference() {
diff --git 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
index 0fe896f25..8b3f45b69 100644
--- 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
@@ -28,11 +28,12 @@ import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.resource.ByteArrayResource;
 import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.request.resource.ResourceReference;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.util.io.IOUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import jakarta.inject.Inject;
 import jakarta.servlet.http.HttpServletResponse;
 import java.io.File;
 import java.io.FileInputStream;
@@ -45,7 +46,7 @@ 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);
-	@SpringBean
+	@Inject
 	private UserDao userDao;
 
 	public ProfileImageResourceReference() {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/UserChoiceProvider.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/UserChoiceProvider.java
index 2b5db90f1..0bc279f0d 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/UserChoiceProvider.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/UserChoiceProvider.java
@@ -29,18 +29,21 @@ import org.apache.openmeetings.db.entity.user.User.Type;
 import org.apache.openmeetings.db.util.FormatHelper;
 import org.apache.wicket.extensions.validation.validator.RfcCompliantEmailAddressValidator;
 import org.apache.wicket.injection.Injector;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+
 import org.apache.wicket.util.string.Strings;
 import org.apache.wicket.validation.Validatable;
 import org.wicketstuff.select2.Response;
 
 import com.github.openjson.JSONStringer;
 
+import jakarta.inject.Inject;
+
 public class UserChoiceProvider extends RestrictiveChoiceProvider<User> {
 	private static final long serialVersionUID = 1L;
 	private static final long PAGE_SIZE = 10;
 	private final Map<String, User> newContacts = new HashMap<>();
-	@SpringBean
+
+	@Inject
 	private UserDao userDao;
 
 	public UserChoiceProvider() {
diff --git 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
index 1b9bdd531..ed6375beb 100644
--- 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
@@ -18,9 +18,9 @@
  */
 package org.apache.openmeetings.web.util.logging;
 
-import io.prometheus.client.exporter.MetricsServlet;
+//INCOMPATIBLE with Jackarta! import io.prometheus.client.exporter.MetricsServlet;
 
-public class OpenMeetingsMetricsServlet extends MetricsServlet {
+public class OpenMeetingsMetricsServlet /*extends MetricsServlet*/ {
 	private static final long serialVersionUID = 1L;
 
 	public OpenMeetingsMetricsServlet() {
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/h2_persistence.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/h2_persistence.xml
index 88010b68b..cf0eb47a8 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/h2_persistence.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/h2_persistence.xml
@@ -71,8 +71,8 @@
 					, TestOnBorrow=true
 					, Username=
 					, Password=" />
-			<property name="javax.persistence.schema-generation.database.action" value="create" />
-			<property name="javax.persistence.schema-generation.create-database-schemas" value="true" />
+			<property name="jakarta.persistence.schema-generation.database.action" value="create" />
+			<property name="jakarta.persistence.schema-generation.create-database-schemas" value="true" />
 			<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema" />
 			<property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO" />
 			<property name="openjpa.DataCache" value="true" />
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/web.xml b/openmeetings-web/src/main/webapp/WEB-INF/web.xml
index fc4cdf637..6877a51da 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/web.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/web.xml
@@ -18,9 +18,11 @@
   under the License.
 
 -->
-<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
 		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-		xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
+		xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
+		version="6.0"
+		metadata-complete="true">
 	<context-param>
 		<param-name>contextConfigLocation</param-name>
 		<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/AbstractOmServerTest.java b/openmeetings-web/src/test/java/org/apache/openmeetings/AbstractOmServerTest.java
index b277a7575..9c471535e 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/AbstractOmServerTest.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/AbstractOmServerTest.java
@@ -48,9 +48,11 @@ import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig;
 
+import jakarta.inject.Inject;
+
 @SpringJUnitWebConfig(locations={"classpath:applicationContext.xml"})
 @RegularTest
 public abstract class AbstractOmServerTest {
@@ -67,17 +69,17 @@ public abstract class AbstractOmServerTest {
 	public static final String UNIT_TEST_ARAB_EXT_TYPE = "النُّجُومُ الخَمْسَةِ";
 	public static final Random rnd = new Random();
 
-	@Autowired
+	@Inject
 	protected AppointmentDao appointmentDao;
-	@Autowired
+	@Inject
 	protected UserDao userDao;
-	@Autowired
+	@Inject
 	protected GroupDao groupDao;
-	@Autowired
+	@Inject
 	private ImportInitvalues importInitvalues;
-	@Autowired
+	@Inject
 	protected ConfigurationDao cfgDao;
-	@Autowired
+	@Inject
 	protected Application app;
 
 	@BeforeAll
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/AbstractTestImport.java b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/AbstractTestImport.java
index 4f4406285..0b3b076f6 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/AbstractTestImport.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/AbstractTestImport.java
@@ -30,11 +30,13 @@ import org.apache.openmeetings.AbstractOmServerTest;
 import org.apache.openmeetings.db.entity.basic.Configuration;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
-import org.springframework.beans.factory.annotation.Autowired;
+
+import jakarta.inject.Inject;
+
 
 public class AbstractTestImport extends AbstractOmServerTest {
 	private String cryptClass = null;
-	@Autowired
+	@Inject
 	protected BackupImport backupImport;
 
 	@BeforeEach
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestExport.java b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestExport.java
index 4264812bc..877c26431 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestExport.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestExport.java
@@ -30,6 +30,7 @@ import java.io.StringWriter;
 import java.nio.file.Paths;
 import java.time.LocalDate;
 
+import jakarta.inject.Inject;
 import jakarta.xml.bind.JAXBContext;
 import jakarta.xml.bind.Marshaller;
 
@@ -41,10 +42,9 @@ import org.apache.openmeetings.db.entity.user.Group;
 import org.apache.openmeetings.db.entity.user.User;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
 
 class TestExport extends AbstractOmServerTest {
-	@Autowired
+	@Inject
 	private FileItemDao fileItemDao;
 
 	@Test
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImport.java b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImport.java
index 249e38b18..b5b125884 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImport.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImport.java
@@ -32,21 +32,23 @@ import org.apache.openmeetings.db.dao.user.PrivateMessageFolderDao;
 import org.apache.openmeetings.db.entity.basic.Configuration;
 import org.apache.openmeetings.db.entity.server.LdapConfig;
 import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
+
+import jakarta.inject.Inject;
+
 
 class TestImport extends AbstractTestImport {
 	public static final String BACKUP_ROOT = "org/apache/openmeetings/backup/";
-	@Autowired
+	@Inject
 	private LdapConfigDao ldapDao;
-	@Autowired
+	@Inject
 	private OAuth2Dao oauthDao;
-	@Autowired
+	@Inject
 	private ChatDao chatDao;
-	@Autowired
+	@Inject
 	private RecordingDao recDao;
-	@Autowired
+	@Inject
 	private PrivateMessageFolderDao msgFolderDao;
-	@Autowired
+	@Inject
 	private ExtraMenuDao menuDao;
 
 	@Test
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportCalendar.java b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportCalendar.java
index 46a759afa..8c8f36167 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportCalendar.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportCalendar.java
@@ -26,12 +26,14 @@ import java.io.File;
 import org.apache.openmeetings.db.dao.calendar.MeetingMemberDao;
 import org.apache.openmeetings.db.dao.calendar.OmCalendarDao;
 import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
+
+import jakarta.inject.Inject;
+
 
 class TestImportCalendar extends AbstractTestImport {
-	@Autowired
+	@Inject
 	private OmCalendarDao calendarDao;
-	@Autowired
+	@Inject
 	private MeetingMemberDao meetingMemberDao;
 
 	@Test
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportOld.java b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportOld.java
index b5d9452f7..a8a4d4363 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportOld.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportOld.java
@@ -37,16 +37,18 @@ import org.apache.openmeetings.db.entity.user.User;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
+import jakarta.inject.Inject;
+
 
 class TestImportOld extends AbstractTestImport {
 	private static final Logger log = LoggerFactory.getLogger(TestImportOld.class);
 
-	@Autowired
+	@Inject
 	private RoomDao roomDao;
-	@Autowired
+	@Inject
 	private MeetingMemberDao meetingMemberDao;
-	@Autowired
+	@Inject
 	private FileItemDao fileDao;
 
 	@Test
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportRoom.java b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportRoom.java
index 3561ebda6..60006b7e4 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportRoom.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportRoom.java
@@ -27,10 +27,12 @@ import java.io.File;
 import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
+
+import jakarta.inject.Inject;
+
 
 class TestImportRoom extends AbstractTestImport {
-	@Autowired
+	@Inject
 	private RoomDao roomDao;
 
 	@Test
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportUser.java b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportUser.java
index 3f52b008f..8b0270700 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportUser.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportUser.java
@@ -30,10 +30,12 @@ import org.apache.openmeetings.db.entity.server.LdapConfig;
 import org.apache.openmeetings.db.entity.user.User;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
+
+import jakarta.inject.Inject;
+
 
 class TestImportUser extends AbstractTestImport {
-	@Autowired
+	@Inject
 	private LdapConfigDao ldapDao;
 
 	@Test
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestAppointmentAddAppointment.java b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestAppointmentAddAppointment.java
index 65ba0b02a..796085cab 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestAppointmentAddAppointment.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestAppointmentAddAppointment.java
@@ -43,14 +43,16 @@ import org.apache.wicket.util.string.Strings;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
+import jakarta.inject.Inject;
+
 
 class TestAppointmentAddAppointment extends AbstractWicketTesterTest {
 	private static final Logger log = LoggerFactory.getLogger(TestAppointmentAddAppointment.class);
 
-	@Autowired
+	@Inject
 	private AppointmentLogic appointmentLogic;
-	@Autowired
+	@Inject
 	private MeetingMemberDao meetingMemberDao;
 
 	private static void setTime(Appointment a) {
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestAppointmentSchedulerTask.java b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestAppointmentSchedulerTask.java
index 50996e8f5..ec8ad9b45 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestAppointmentSchedulerTask.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestAppointmentSchedulerTask.java
@@ -29,12 +29,14 @@ import org.apache.openmeetings.service.calendar.AppointmentLogic;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
+import jakarta.inject.Inject;
+
 
 class TestAppointmentSchedulerTask extends AbstractOmServerTest {
 	private static final Logger log = LoggerFactory.getLogger(TestAppointmentSchedulerTask.class);
 
-	@Autowired
+	@Inject
 	private AppointmentLogic appointmentLogic;
 
 	@Test
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestGetAppointment.java b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestGetAppointment.java
index bde16528f..33acec44b 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestGetAppointment.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestGetAppointment.java
@@ -30,12 +30,14 @@ import org.apache.openmeetings.db.entity.calendar.Appointment;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
+import jakarta.inject.Inject;
+
 
 class TestGetAppointment extends AbstractOmServerTest {
 	private static final Logger log = LoggerFactory.getLogger(TestGetAppointment.class);
 
-	@Autowired
+	@Inject
 	private RoomDao roomDao;
 
 	@Test
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestOmCalendar.java b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestOmCalendar.java
index cf9e9530d..99b11c02c 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestOmCalendar.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestOmCalendar.java
@@ -26,10 +26,12 @@ 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.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
+
+import jakarta.inject.Inject;
+
 
 class TestOmCalendar extends AbstractOmServerTest {
-	@Autowired
+	@Inject
 	private OmCalendarDao calendarDao;
 
 	@Test
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestSendIcalMessage.java b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestSendIcalMessage.java
index 02d5f1970..eecb2f388 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestSendIcalMessage.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestSendIcalMessage.java
@@ -34,9 +34,10 @@ import org.apache.openmeetings.util.mail.IcalHandler;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 
 import jakarta.activation.DataHandler;
+import jakarta.inject.Inject;
 import jakarta.mail.BodyPart;
 import jakarta.mail.Message;
 import jakarta.mail.Multipart;
@@ -48,7 +49,7 @@ import jakarta.mail.internet.MimeMultipart;
 class TestSendIcalMessage extends AbstractOmServerTest {
 	private static final Logger log = LoggerFactory.getLogger(TestSendIcalMessage.class);
 
-	@Autowired
+	@Inject
 	private MailHandler mailHandler;
 
 	String subject = "test iCal";
diff --git 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
index e472b7958..f68796405 100644
--- 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
@@ -35,12 +35,14 @@ 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.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
+
+import jakarta.inject.Inject;
+
 
 class TestFileProcessor extends AbstractOmServerTest {
 	private static final String FILE_NAME = "test_name";
 
-	@Autowired
+	@Inject
 	protected FileProcessor processor;
 
 	@Test
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/db/dao/TestFileDao.java b/openmeetings-web/src/test/java/org/apache/openmeetings/db/dao/TestFileDao.java
index 6e9b0a4dd..db8d0fb45 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/db/dao/TestFileDao.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/db/dao/TestFileDao.java
@@ -31,12 +31,14 @@ 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.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
+
+import jakarta.inject.Inject;
+
 
 class TestFileDao extends AbstractOmServerTest {
-	@Autowired
+	@Inject
 	protected FileItemDao fileDao;
-	@Autowired
+	@Inject
 	protected GroupDao groupDao;
 
 	@Test
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/db/dao/TestRoomDao.java b/openmeetings-web/src/test/java/org/apache/openmeetings/db/dao/TestRoomDao.java
index 86ee4cafe..ee24c2ec4 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/db/dao/TestRoomDao.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/db/dao/TestRoomDao.java
@@ -34,11 +34,13 @@ import org.apache.openmeetings.db.entity.user.User;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
+import jakarta.inject.Inject;
+
 
 class TestRoomDao extends AbstractOmServerTest {
 	private static final Logger log = LoggerFactory.getLogger(TestRoomDao.class);
-	@Autowired
+	@Inject
 	protected RoomDao roomDao;
 
 	@Test
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/invitiation/TestInvitation.java b/openmeetings-web/src/test/java/org/apache/openmeetings/invitiation/TestInvitation.java
index 43de067c1..8c7803447 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/invitiation/TestInvitation.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/invitiation/TestInvitation.java
@@ -36,14 +36,16 @@ 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.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
+
+import jakarta.inject.Inject;
+
 
 class TestInvitation extends AbstractWicketTesterTest {
-	@Autowired
+	@Inject
 	private InvitationDao inviteDao;
-	@Autowired
+	@Inject
 	private InvitationManager invitationManager;
-	@Autowired
+	@Inject
 	private RoomDao roomDao;
 
 	private Invitation create(Valid valid) {
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/ldap/TestLdap.java b/openmeetings-web/src/test/java/org/apache/openmeetings/ldap/TestLdap.java
index 70206019a..177a917c2 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/ldap/TestLdap.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/ldap/TestLdap.java
@@ -67,6 +67,9 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+import jakarta.inject.Inject;
 
 @ExtendWith(ApacheDSTestExtension.class)
 @CreateDS(name = "omDS",
@@ -98,7 +101,7 @@ public class TestLdap extends AbstractWicketTesterTest {
 	/** The current revision */
 	public static long revision = 0L;
 
-	@Autowired
+	@Inject
 	private LdapConfigDao ldapDao;
 
 	@BeforeAll
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/service/scheduler/TestJob.java b/openmeetings-web/src/test/java/org/apache/openmeetings/service/scheduler/TestJob.java
index cbba81ce9..626c00d2e 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/service/scheduler/TestJob.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/service/scheduler/TestJob.java
@@ -45,15 +45,17 @@ import org.mockito.Mock;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.junit.jupiter.MockitoExtension;
 import org.mockito.stubbing.Answer;
-import org.springframework.beans.factory.annotation.Autowired;
+
+import jakarta.inject.Inject;
+
 
 @ExtendWith(MockitoExtension.class)
 class TestJob extends AbstractWicketTesterTest {
-	@Autowired
+	@Inject
 	private CleanupJob cleanJob;
 	@Mock
 	private MailHandler mailHandler;
-	@Autowired
+	@Inject
 	@InjectMocks
 	private ReminderJob reminderJob;
 
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserGroup.java b/openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserGroup.java
index a0c3a6f8b..8a8cc6bf4 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserGroup.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserGroup.java
@@ -38,11 +38,13 @@ import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.util.OmException;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
+
+import jakarta.inject.Inject;
+
 
 class TestUserGroup extends AbstractOmServerTest {
 	public static final String GROUP_NAME = "Test Group";
-	@Autowired
+	@Inject
 	private GroupUserDao groupUserDao;
 
 	private User getValidUser() {
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/userdata/TestAuth.java b/openmeetings-web/src/test/java/org/apache/openmeetings/userdata/TestAuth.java
index b2a36aa23..749d49c6c 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/userdata/TestAuth.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/userdata/TestAuth.java
@@ -26,10 +26,12 @@ import org.apache.openmeetings.AbstractOmServerTest;
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
 import org.apache.openmeetings.db.entity.server.Sessiondata;
 import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
+
+import jakarta.inject.Inject;
+
 
 class TestAuth extends AbstractOmServerTest {
-	@Autowired
+	@Inject
 	private SessiondataDao sessionDao;
 
 	@Test
diff --git 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
index 12f3604b5..c1e09c739 100644
--- 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
@@ -50,18 +50,19 @@ import org.apache.wicket.util.string.Strings;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import jakarta.inject.Inject;
 
 class TestHashPage extends AbstractWicketTesterTest {
 	private static final Logger log = LoggerFactory.getLogger(TestHashPage.class);
 
-	@Autowired
+	@Inject
 	protected RoomDao roomDao;
-	@Autowired
+	@Inject
 	protected RecordingDao recDao;
-	@Autowired
+	@Inject
 	protected InvitationDao inviteDao;
 
 	private void checkAccessDenied(boolean visible) {
diff --git a/openmeetings-web/src/test/jetty/web.xml b/openmeetings-web/src/test/jetty/web.xml
index 1922c4310..67bed99f4 100644
--- a/openmeetings-web/src/test/jetty/web.xml
+++ b/openmeetings-web/src/test/jetty/web.xml
@@ -18,9 +18,11 @@
   under the License.
 
 -->
-<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
 		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-		xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
+		xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
+		version="6.0"
+		metadata-complete="true">
 	<context-param>
 		<param-name>contextConfigLocation</param-name>
 		<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
diff --git a/openmeetings-webservice/pom.xml b/openmeetings-webservice/pom.xml
index cc357571b..fedb97db1 100644
--- a/openmeetings-webservice/pom.xml
+++ b/openmeetings-webservice/pom.xml
@@ -138,7 +138,7 @@
 						<servers>
 							<server>
 								<description>Your local OpenMeetings Server</description>
-								<url>http://localhost:5080/openmeetings/services</url>
+								<url>https://localhost:5443/openmeetings/services</url>
 							</server>
 							<server>
 								<description>Om Demo Server</description>
@@ -146,7 +146,8 @@
 							</server>
 						</servers>
 					</swaggerConfig>
-					<skip>${site.skip}</skip>
+					<!--skip>${site.skip}</skip-->
+					<skip>true</skip> <!-- Getting weird "Cannot invoke "java.util.Map.size()" because "map" is null" Error !!!!!! -->
 				</configuration>
 				<executions>
 					<execution>
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/BaseWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/BaseWebService.java
index 421eca0c2..70ba9cea2 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/BaseWebService.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/BaseWebService.java
@@ -36,18 +36,20 @@ import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.openmeetings.webservice.error.ServiceException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
+import jakarta.inject.Inject;
+
 
 public abstract class BaseWebService {
 	private static final Logger log = LoggerFactory.getLogger(BaseWebService.class);
 
-	@Autowired
+	@Inject
 	protected SessiondataDao sessionDao;
-	@Autowired
+	@Inject
 	protected UserDao userDao;
-	@Autowired
+	@Inject
 	protected RoomDao roomDao;
-	@Autowired
+	@Inject
 	protected FileItemDao fileDao;
 
 	// this one is fail safe
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
index 3de82dd94..9fc1c2d68 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
@@ -25,6 +25,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.Set;
 
+import jakarta.inject.Inject;
 import jakarta.jws.WebMethod;
 import jakarta.jws.WebParam;
 import jakarta.jws.WebService;
@@ -55,7 +56,7 @@ import org.apache.openmeetings.webservice.schema.AppointmentDTOWrapper;
 import org.apache.openmeetings.webservice.schema.ServiceResultWrapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Service;
 
 import io.swagger.v3.oas.annotations.Operation;
@@ -80,9 +81,9 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 public class CalendarWebService extends BaseWebService {
 	private static final Logger log = LoggerFactory.getLogger(CalendarWebService.class);
 
-	@Autowired
+	@Inject
 	private AppointmentDao dao;
-	@Autowired
+	@Inject
 	private CalendarMapper calMapper;
 
 	/**
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/FileWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/FileWebService.java
index c1d587e99..35d1f6bc5 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/FileWebService.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/FileWebService.java
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 
+import jakarta.inject.Inject;
 import jakarta.jws.WebMethod;
 import jakarta.jws.WebParam;
 import jakarta.jws.WebService;
@@ -58,7 +59,7 @@ import org.apache.openmeetings.webservice.schema.FileItemDTOWrapper;
 import org.apache.openmeetings.webservice.schema.ServiceResultWrapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Service;
 
 import io.swagger.v3.oas.annotations.Operation;
@@ -85,7 +86,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 public class FileWebService extends BaseWebService {
 	private static final Logger log = LoggerFactory.getLogger(FileWebService.class);
 
-	@Autowired
+	@Inject
 	private FileProcessor fileProcessor;
 
 	/**
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/GroupWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/GroupWebService.java
index 6901fb608..0c196c485 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/GroupWebService.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/GroupWebService.java
@@ -25,6 +25,7 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
+import jakarta.inject.Inject;
 import jakarta.jws.WebMethod;
 import jakarta.jws.WebParam;
 import jakarta.jws.WebService;
@@ -57,7 +58,7 @@ import org.apache.openmeetings.webservice.schema.UserSearchResultWrapper;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Service;
 
 import io.swagger.v3.oas.annotations.Operation;
@@ -84,9 +85,9 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 public class GroupWebService extends BaseWebService {
 	private static final Logger log = LoggerFactory.getLogger(GroupWebService.class);
 
-	@Autowired
+	@Inject
 	private GroupDao groupDao;
-	@Autowired
+	@Inject
 	private GroupUserDao groupUserDao;
 
 	/**
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RecordingWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RecordingWebService.java
index 2a8d16741..15aad443f 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RecordingWebService.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RecordingWebService.java
@@ -22,6 +22,7 @@ import static org.apache.openmeetings.webservice.Constants.TNS;
 
 import java.util.List;
 
+import jakarta.inject.Inject;
 import jakarta.jws.WebMethod;
 import jakarta.jws.WebParam;
 import jakarta.jws.WebService;
@@ -44,7 +45,7 @@ import org.apache.openmeetings.webservice.schema.RecordingDTOListWrapper;
 import org.apache.openmeetings.webservice.schema.ServiceResultWrapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Service;
 
 import io.swagger.v3.oas.annotations.Operation;
@@ -68,7 +69,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 public class RecordingWebService extends BaseWebService {
 	private static final Logger log = LoggerFactory.getLogger(RecordingWebService.class);
 
-	@Autowired
+	@Inject
 	private RecordingDao recordingDao;
 
 	/**
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
index 7dfc20c9b..354926548 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
@@ -23,6 +23,7 @@ import static org.apache.openmeetings.webservice.Constants.TNS;
 import java.util.ArrayList;
 import java.util.List;
 
+import jakarta.inject.Inject;
 import jakarta.jws.WebMethod;
 import jakarta.jws.WebParam;
 import jakarta.jws.WebService;
@@ -63,7 +64,7 @@ import org.apache.openmeetings.webservice.schema.UserDTOListWrapper;
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Service;
 
 import io.swagger.v3.oas.annotations.Operation;
@@ -88,15 +89,15 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 public class RoomWebService extends BaseWebService {
 	private static final Logger log = LoggerFactory.getLogger(RoomWebService.class);
 
-	@Autowired
+	@Inject
 	private IUserManager userManager;
-	@Autowired
+	@Inject
 	private IClientManager clientManager;
-	@Autowired
+	@Inject
 	private InvitationDao inviteDao;
-	@Autowired
+	@Inject
 	private InvitationManager inviteManager;
-	@Autowired
+	@Inject
 	private RoomMapper rMapper;
 
 	/**
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java
index bb26ee6e9..aaf62217a 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java
@@ -30,6 +30,7 @@ import java.security.NoSuchAlgorithmException;
 import java.util.List;
 import java.util.Locale;
 
+import jakarta.inject.Inject;
 import jakarta.jws.WebMethod;
 import jakarta.jws.WebParam;
 import jakarta.jws.WebService;
@@ -72,7 +73,7 @@ import org.apache.wicket.validation.Validatable;
 import org.apache.wicket.validation.ValidationError;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Service;
 
 import io.swagger.v3.oas.annotations.Operation;
@@ -99,13 +100,13 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 public class UserWebService extends BaseWebService {
 	private static final Logger log = LoggerFactory.getLogger(UserWebService.class);
 
-	@Autowired
+	@Inject
 	private IUserManager userManager;
-	@Autowired
+	@Inject
 	private SOAPLoginDao soapDao;
-	@Autowired
+	@Inject
 	private GroupDao groupDao;
-	@Autowired
+	@Inject
 	private UserMapper uMapper;
 
 	/**
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/WbWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/WbWebService.java
index 4be455b1f..654f409e0 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/WbWebService.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/WbWebService.java
@@ -30,6 +30,7 @@ import java.nio.file.Paths;
 
 import javax.imageio.ImageIO;
 
+import jakarta.inject.Inject;
 import jakarta.jws.WebMethod;
 import jakarta.jws.WebParam;
 import jakarta.jws.WebService;
@@ -64,7 +65,7 @@ import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
 import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+
 import org.springframework.stereotype.Service;
 
 import com.github.openjson.JSONArray;
@@ -89,9 +90,9 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 public class WbWebService extends BaseWebService {
 	private static final Logger log = LoggerFactory.getLogger(WbWebService.class);
 
-	@Autowired
+	@Inject
 	private IWhiteboardManager wbManager;
-	@Autowired
+	@Inject
 	private IClientManager cm;
 
 	/**
diff --git a/pom.xml b/pom.xml
index b137d792f..9c4832404 100644
--- a/pom.xml
+++ b/pom.xml
@@ -100,6 +100,8 @@
 		<h2.version>2.2.224</h2.version>
 		<jakarta.mail.version>2.0.1</jakarta.mail.version>
 		<openjpa.version>3.2.2</openjpa.version>
+		<jakarta.persistence.version>3.1.0</jakarta.persistence.version>
+		<jakarta.transaction.version>2.0.1</jakarta.transaction.version>
 		<asterisk-java.version>3.39.0</asterisk-java.version>
 		<commons-lang3.version>3.14.0</commons-lang3.version>
 		<commons-dbcp.version>2.11.0</commons-dbcp.version>
@@ -131,7 +133,7 @@
 		<jasny-bootstrap.version>3.1.3-2</jasny-bootstrap.version>
 		<jodconverter.version>4.4.7</jodconverter.version>
 		<jaxb-runtime.version>4.0.4</jaxb-runtime.version>
-		<jakarta.servlet-api.version>5.0.0</jakarta.servlet-api.version>
+		<jakarta.servlet-api.version>6.0.0</jakarta.servlet-api.version>
 		<jquery-ui-touch-punch.version>0.2.3-2</jquery-ui-touch-punch.version>
 		<apacheds-test-framework.version>2.0.0.AM27</apacheds-test-framework.version>
 		<swagger.version>2.2.19</swagger.version>
@@ -809,6 +811,27 @@
 				<groupId>org.apache.openjpa</groupId>
 				<artifactId>openjpa</artifactId>
 				<version>${openjpa.version}</version>
+				<classifier>jakarta</classifier>
+				<exclusions>
+					<exclusion>
+						<groupId>org.apache.geronimo.specs</groupId>
+						<artifactId>geronimo-jpa_2.2_spec</artifactId>
+					</exclusion>
+					<exclusion>
+						<groupId>org.apache.geronimo.specs</groupId>
+						<artifactId>geronimo-jta_1.1_spec</artifactId>
+					</exclusion>
+				</exclusions>
+			</dependency>
+			<dependency>
+				<groupId>jakarta.persistence</groupId>
+				<artifactId>jakarta.persistence-api</artifactId>
+				<version>${jakarta.persistence.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>jakarta.transaction</groupId>
+				<artifactId>jakarta.transaction-api</artifactId>
+				<version>${jakarta.transaction.version}</version>
 			</dependency>
 			<dependency>
 				<groupId>org.apache.commons</groupId>
@@ -861,8 +884,19 @@
 						<groupId>net.sf.ehcache</groupId>
 						<artifactId>ehcache</artifactId>
 					</exclusion>
+					<exclusion>
+						<!-- will be replaced with Jakarta version below -->
+						<groupId>org.apache.jackrabbit</groupId>
+						<artifactId>jackrabbit-webdav</artifactId>
+					</exclusion>
 				</exclusions>
 			</dependency>
+			<dependency>
+				<groupId>org.apache.jackrabbit</groupId>
+				<artifactId>jackrabbit-webdav</artifactId>
+				<version>2.21.15-SNAPSHOT</version>
+				<classifier>jakarta</classifier>
+			</dependency>
 			<dependency>
 				<groupId>com.mysql</groupId>
 				<artifactId>mysql-connector-j</artifactId>
@@ -1456,12 +1490,33 @@
 					<groupId>org.apache.openjpa</groupId>
 					<artifactId>openjpa-maven-plugin</artifactId>
 					<version>${openjpa.version}</version>
+					<!-- set the version to be the same as the level in your runtime -->
 					<dependencies>
 						<dependency>
 							<groupId>org.apache.openjpa</groupId>
 							<artifactId>openjpa</artifactId>
-							<!-- set the version to be the same as the level in your runtime -->
 							<version>${openjpa.version}</version>
+							<classifier>jakarta</classifier>
+							<exclusions>
+								<exclusion>
+									<groupId>org.apache.geronimo.specs</groupId>
+									<artifactId>geronimo-jpa_2.2_spec</artifactId>
+								</exclusion>
+								<exclusion>
+									<groupId>org.apache.geronimo.specs</groupId>
+									<artifactId>geronimo-jta_1.1_spec</artifactId>
+								</exclusion>
+							</exclusions>
+						</dependency>
+						<dependency>
+							<groupId>jakarta.persistence</groupId>
+							<artifactId>jakarta.persistence-api</artifactId>
+							<version>${jakarta.persistence.version}</version>
+						</dependency>
+						<dependency>
+							<groupId>jakarta.transaction</groupId>
+							<artifactId>jakarta.transaction-api</artifactId>
+							<version>${jakarta.transaction.version}</version>
 						</dependency>
 					</dependencies>
 				</plugin>


(openmeetings) 20/29: [OPENMEETINGS-2756] JPMS branch is merged into this one

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

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

commit 42208b77df25a7cd8421035173136b5081661e29
Author: Maxim Solodovnik <so...@apache.org>
AuthorDate: Mon Sep 25 16:51:55 2023 +0700

    [OPENMEETINGS-2756] JPMS branch is merged into this one
---
 LICENSE                                            | 273 ---------------------
 openmeetings-core/pom.xml                          |   4 +-
 openmeetings-core/src/main/java/module-info.java   |  29 ++-
 .../openmeetings/core/util/WebSocketHelper.java    |   2 +-
 .../java/module-info.test}                         |  34 ++-
 openmeetings-db/pom.xml                            |   8 +-
 openmeetings-db/src/main/java/module-info.java     |  36 ++-
 .../java/org/apache/openmeetings/IApplication.java |   2 +-
 .../openmeetings/db/entity/basic/Client.java       |   2 +-
 .../openmeetings/db/entity/basic/IWsClient.java    |   2 +-
 .../openmeetings/db/entity/basic/WsClient.java     |   2 +-
 .../db/entity/user/PrivateMessageFolder.java       |   1 +
 .../java/module-info.test}                         |  41 +++-
 .../src/main/java/module-info.java                 |  27 +-
 .../apache/openmeetings/backup/BackupExport.java   |   5 +-
 .../java/org/apache/openmeetings/cli/Admin.java    |   5 +-
 .../java/module-info.test}                         |  32 ++-
 openmeetings-mediaserver/pom.xml                   |   4 +-
 .../src/main/java/module-info.java                 |  21 +-
 .../java/module-info.test}                         |  26 +-
 .../src/main/java/module-info.java                 |  26 +-
 .../subject/AppointmentReminderTemplate.java       |   2 +-
 .../mail/template/subject/AppointmentTemplate.java |   2 +-
 .../subject/CanceledAppointmentTemplate.java       |   2 +-
 .../subject/CreatedAppointmentTemplate.java        |   2 +-
 .../subject/InvitedAppointmentTemplate.java        |   2 +-
 .../subject/UpdatedAppointmentTemplate.java        |   2 +-
 openmeetings-util/src/main/java/module-info.java   |  27 +-
 openmeetings-util/src/test/java/module-info.test   |  27 +-
 openmeetings-web/pom.xml                           |   4 +-
 openmeetings-web/src/main/java/module-info.java    |  42 +++-
 .../web/admin/configurations/ConfigForm.java       |   2 +-
 .../web/admin/connection/ConnectionsPanel.java     |   2 +-
 .../openmeetings/web/admin/groups/GroupForm.java   |   6 +-
 .../openmeetings/web/admin/groups/GroupsPanel.java |   2 +-
 .../openmeetings/web/admin/labels/LangPanel.java   |   2 +-
 .../openmeetings/web/admin/rooms/RoomForm.java     |   2 +-
 .../openmeetings/web/admin/users/UserForm.java     |   6 +-
 .../openmeetings/web/admin/users/UsersPanel.java   |   2 +-
 .../apache/openmeetings/web/app/Application.java   |  14 +-
 .../apache/openmeetings/web/app/OtpManager.java    |   3 +-
 .../apache/openmeetings/web/app/UserManager.java   |   4 +-
 .../apache/openmeetings/web/app/WebSession.java    |   8 +-
 .../openmeetings/web/app/WhiteboardManager.java    |   2 +-
 .../openmeetings/web/common/GeneralUserForm.java   |   2 +-
 .../openmeetings/web/common/InvitationForm.java    |   2 +-
 .../apache/openmeetings/web/common/MainPanel.java  |   6 +-
 .../web/common/UploadableImagePanel.java           |   2 +-
 .../web/common/tree/FileTreePanel.java             |  12 +-
 .../web/common/tree/OmTreeProvider.java            |   2 +-
 .../apache/openmeetings/web/pages/BasePage.java    |   2 +-
 .../web/pages/auth/ForgetPasswordDialog.java       |   2 +-
 .../openmeetings/web/pages/auth/SignInDialog.java  |   8 +-
 .../openmeetings/web/pages/auth/SignInPage.java    |   2 +-
 .../web/pages/install/InstallWizard.java           |   8 +-
 .../apache/openmeetings/web/room/RoomPanel.java    |   4 +-
 .../web/room/RoomResourceReference.java            |   2 +-
 .../openmeetings/web/room/menu/ActionsSubMenu.java |   2 +-
 .../openmeetings/web/room/menu/RoomMenuPanel.java  |  10 +-
 .../web/room/sidebar/RoomFilePanel.java            |   2 +-
 .../web/room/sidebar/RoomUploadForm.java           |   2 +-
 .../apache/openmeetings/web/room/wb/WbPanel.java   |  10 +-
 .../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.java  |   2 +-
 .../openmeetings/web/user/MessageDialog.java       |   4 +-
 .../web/user/calendar/AppointmentDialog.java       |   2 +-
 .../apache/openmeetings/web/user/chat/Chat.java    |   5 +-
 .../dashboard/admin/AdminCleanupInfoDialog.java    |   2 +-
 .../web/user/profile/InvitationsPanel.java         |   2 +-
 .../web/user/profile/MessagesContactsPanel.java    |   4 +-
 .../web/user/profile/UserSearchPanel.java          |   2 +-
 .../web/user/profile/WidgetsPanel.java             |   4 +-
 .../web/user/record/RecordingsPanel.java           |   2 +-
 .../openmeetings/web/user/rooms/RoomListPanel.java |   2 +-
 .../openmeetings/web/user/rooms/RoomsPanel.java    |   2 +-
 .../web/user/rooms/RoomsSelectorPanel.java         |   4 +-
 .../web/util/GroupLogoResourceReference.java       |   4 +-
 .../web/util/ProfileImageResourceReference.java    |   9 +-
 .../web/util/UserDashboardPersister.java           |   2 +-
 .../java/module-info.test}                         |  49 +++-
 .../calendar/TestAppointmentAddAppointment.java    |   2 +-
 .../calendar/TestAppointmentSchedulerTask.java     |   2 +-
 .../calendar/TestDatabaseStructureAppointment.java |   2 +-
 ...TestDatabaseStructureGetAppointmentByRange.java |   2 +-
 .../openmeetings/calendar/TestGetAppointment.java  |   2 +-
 .../openmeetings/calendar/TestOmCalendar.java      |   2 +-
 .../openmeetings/calendar/TestSendIcalMessage.java |   2 +-
 .../org/apache/openmeetings/config/TestConfig.java |   2 +-
 .../openmeetings/core/file/TestFileProcessor.java  |   2 +-
 .../apache/openmeetings/domain/TestAddGroup.java   |   2 +-
 .../domain/TestUserGroupAggregation.java           |   2 +-
 .../openmeetings/invitiation/TestInvitation.java   |   2 +-
 .../org/apache/openmeetings/ldap/TestLdap.java     |   4 +-
 .../apache/openmeetings/smoke/TestSmokeBasic.java  |   2 +-
 .../apache/openmeetings/user/TestUserContact.java  |   4 +-
 .../apache/openmeetings/user/TestUserCount.java    |   2 +-
 .../apache/openmeetings/user/TestUserGroup.java    |   2 +-
 .../org/apache/openmeetings/userdata/TestAuth.java |   2 +-
 .../apache/openmeetings/userdata/TestLogin.java    |   2 +-
 .../{ => web}/AbstractOmServerTest.java            |   4 +-
 .../{ => web}/AbstractWicketTesterTest.java        |   4 +-
 .../openmeetings/{ => web}/IsolatedTest.java       |   2 +-
 .../apache/openmeetings/{ => web}/RegularTest.java |   2 +-
 .../org/apache/openmeetings/web/TestCalendar.java  |   4 +-
 .../org/apache/openmeetings/web/TestMainAreas.java |   4 +-
 .../org/apache/openmeetings/web/TestMainMenu.java  |   4 +-
 .../openmeetings/web/app/TestApplication.java      |   2 +-
 .../web/app/TestApplicationMocked.java             |   2 +-
 .../web/app/TestOmAuthenticationStrategy.java      |   2 +-
 .../web/app/TestUserManagerMocked.java             |   2 +-
 .../openmeetings/web/app/TestWebSession.java       |   2 +-
 .../{ => web}/backup/AbstractTestImport.java       |   5 +-
 .../openmeetings/{ => web}/backup/TestExport.java  |   5 +-
 .../openmeetings/{ => web}/backup/TestImport.java  |   4 +-
 .../{ => web}/backup/TestImportCalendar.java       |   4 +-
 .../{ => web}/backup/TestImportConfig.java         |   4 +-
 .../{ => web}/backup/TestImportOld.java            |   4 +-
 .../{ => web}/backup/TestImportRoom.java           |   4 +-
 .../{ => web}/backup/TestImportUser.java           |   5 +-
 .../openmeetings/{ => web}/cli/TestAdmin.java      |  20 +-
 .../openmeetings/{ => web}/cli/TestPatcher.java    |   9 +-
 .../openmeetings/{ => web}/db/dao/TestFileDao.java |   4 +-
 .../{ => web}/db/dao/TestMessageDao.java           |   4 +-
 .../openmeetings/{ => web}/db/dao/TestRoomDao.java |   4 +-
 .../openmeetings/web/pages/TestHashPage.java       |   2 +-
 .../openmeetings/web/pages/auth/TestLoginUI.java   |   2 +-
 .../web/pages/install/TestInstall.java             |  22 +-
 .../service/mail/template/TestEmailTemplate.java   |  10 +-
 .../mail/template/subject/TestSubjTemplate.java    |  12 +-
 .../{ => web}/service/scheduler/TestJob.java       |   6 +-
 .../openmeetings/{ => web}/util/TestDateTime.java  |   4 +-
 .../{ => web}/util/TestStoredFile.java             |   5 +-
 .../webservice/AbstractWebServiceTest.java         |   8 +-
 .../webservice/CreateTomcatExtension.java          |   2 +-
 .../webservice/TestCalendarService.java            |  12 +-
 .../openmeetings/webservice/TestErrorService.java  |   2 +-
 .../openmeetings/webservice/TestFileService.java   |   6 +-
 .../openmeetings/webservice/TestGroupService.java  |   4 +-
 .../webservice/TestRecordingService.java           |   2 +-
 .../openmeetings/webservice/TestUserService.java   |  10 +-
 openmeetings-webservice/pom.xml                    |   4 +-
 .../src/main/java/module-info.java                 |  31 ++-
 .../java/module-info.test}                         |  36 ++-
 pom.xml                                            |  20 +-
 146 files changed, 673 insertions(+), 615 deletions(-)

diff --git a/LICENSE b/LICENSE
index 3fd7d6e20..dfbefde55 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1348,279 +1348,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 
-======================================================================================================================
-
-For javax.annotation-api-1.2.jar:
-	URL: http://jcp.org/en/jsr/detail?id=250
-
-COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
-
-1. Definitions.
-
-1.1. “Contributor” means each individual or entity that creates or contributes to the creation of Modifications.
-
-1.2. “Contributor Version” means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor.
-
-1.3. “Covered Software” means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof.
-
-1.4. “Executable” means the Covered Software in any form other than Source Code.
-
-1.5. “Initial Developer” means the individual or entity that first makes Original Software available under this License.
-
-1.6. “Larger Work” means a work which combines Covered Software or portions thereof with code not governed by the terms of this License.
-
-1.7. “License” means this document.
-
-1.8. “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein.
-
-1.9. “Modifications” means the Source Code and Executable form of any of the following:
-
-A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications;
-
-B. Any new file that contains any part of the Original Software or previous Modification; or
-
-C. Any new file that is contributed or otherwise made available under the terms of this License.
-
-1.10. “Original Software” means the Source Code and Executable form of computer software code that is originally released under this License.
-
-1.11. “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor.
-
-1.12. “Source Code” means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code.
-
-1.13. “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outsta [...]
-
-2. License Grants.
-
-2.1. The Initial Developer Grant.
-
-Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license:
-
-(a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and
-
-(b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof).
-
-(c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License.
-
-(d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices.
-
-2.2. Contributor Grant.
-
-Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license:
-
-(a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and
-
-(b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination).
-
-(c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party.
-
-(d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor.
-
-3. Distribution Obligations.
-
-3.1. Availability of Source Code.
-
-Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software i [...]
-
-3.2. Modifications.
-
-The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License.
-
-3.3. Required Notices.
-
-You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer.
-
-3.4. Application of Additional Terms.
-
-You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients’ rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such [...]
-
-3.5. Distribution of Executable Versions.
-
-You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient’s rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form u [...]
-
-3.6. Larger Works.
-
-You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software.
-
-4. Versions of the License.
-
-4.1. New Versions.
-
-Sun Microsystems, Inc. is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License.
-
-4.2. Effect of New Versions.
-
-You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which [...]
-
-4.3. Modified Versions.
-
-When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License.
-
-5. DISCLAIMER OF WARRANTY.
-
-COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE [...]
-
-6. TERMINATION.
-
-6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.
-
-6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as “Participant”) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights gr [...]
-
-6.3. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination.
-
-7. LIMITATION OF LIABILITY.
-
-UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL O [...]
-
-8. U.S. GOVERNMENT END USERS.
-
-The Covered Software is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” (as that term is defined at 48 C.F.R. § 252.227-7014(a)(1)) and “commercial computer software documentation” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth he [...]
-
-9. MISCELLANEOUS.
-
-This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction’s conflict-of-law provisions. Any litigation  [...]
-
-10. RESPONSIBILITY FOR CLAIMS.
-
-As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.
-
-NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)
-
-The code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California.
-
-The GNU General Public License (GPL) Version 2, June 1991
-
-Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
-
-Preamble
-
-The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library Genera [...]
-
-When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
-
-To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
-
-For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
-
-We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
-
-Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
-
-Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
-
-The precise terms and conditions for copying, distribution and modification follow.
-
-TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. ( [...]
-
-Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
-
-1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
-
-2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
-
-a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
-
-b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
-
-c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is i [...]
-
-These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose p [...]
-
-Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
-
-3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
-
-a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
-
-b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
-
-c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major co [...]
-
-If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
-
-4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
-
-5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works ba [...]
-
-6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
-
-7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not dist [...]
-
-If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/dono [...]
-
-This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
-
-8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
-
-9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
-
-10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
-
-NO WARRANTY
-
-11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  [...]
-
-12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO  [...]
-
-END OF TERMS AND CONDITIONS
-
-How to Apply These Terms to Your New Programs
-
-If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
-
-To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
-
-One line to give the program's name and a brief idea of what it does.
-
-Copyright (C)
-
-This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
-
-Gnomovision version 69, Copyright (C) year name of author
-Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:
-
-Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-signature of Ty Coon, 1 April 1989
-Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.
-
-"CLASSPATH" EXCEPTION TO THE GPL VERSION 2
-
-Certain source files distributed by Sun Microsystems, Inc. are subject to the following clarification and special exception to the GPL Version 2, but only where Sun has expressly included in the particular source file's header the words
-"Sun designates this particular file as subject to the "Classpath" exception as provided by Sun in the License file that accompanied this code."
-
-Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License Version 2 cover the whole combination.
-
-As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module.? An independent module is a module which is not derived from or based on th [...]
-
-
 ======================================================================================================================
 
 For javax.ws.rs-api-2.0.1.jar:
diff --git a/openmeetings-core/pom.xml b/openmeetings-core/pom.xml
index c7d997381..7b3e47fa1 100644
--- a/openmeetings-core/pom.xml
+++ b/openmeetings-core/pom.xml
@@ -34,7 +34,7 @@
 	</properties>
 	<build>
 		<plugins>
-			<plugin>
+			<!--plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-javadoc-plugin</artifactId>
 				<executions>
@@ -54,7 +54,7 @@
 						<phase>generate-resources</phase>
 					</execution>
 				</executions>
-			</plugin>
+			</plugin-->
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-jar-plugin</artifactId>
diff --git a/openmeetings-core/src/main/java/module-info.java b/openmeetings-core/src/main/java/module-info.java
index 9a17eeddd..e14c5ac26 100644
--- a/openmeetings-core/src/main/java/module-info.java
+++ b/openmeetings-core/src/main/java/module-info.java
@@ -27,19 +27,36 @@ module org.apache.openmeetings.core {
 	exports org.apache.openmeetings.core.sip;
 	exports org.apache.openmeetings.core.util;
 
-	requires transitive org.apache.openmeetings.db;
+	requires com.github.openjson;
 
-	requires transitive org.apache.commons.io;
-	requires transitive java.annotation;
-	requires transitive java.xml;
+	requires jakarta.annotation;
+	requires jakarta.inject;
+	requires jakarta.mail;
+
+	requires org.apache.commons.io;
+	requires org.apache.commons.lang3;
+
+	requires org.apache.tika.core;
+	requires org.apache.tika.parser.image;
+
+	requires org.apache.openmeetings.db;
+	requires org.apache.openmeetings.util;
+
+	requires org.apache.wicket.core;
+	requires org.apache.wicket.websocket.core;
+	requires org.apache.wicket.util;
+
+	requires java.xml;
 
 	requires xstream;
 
 	requires jodconverter.core;
 	requires jodconverter.local;
 	requires org.apache.directory.ldap.api.all;
-	requires javax.inject;
 	requires asterisk.java;
 	requires jain.sip.ri;
-	requires jakarta.mail;
+
+	requires spring.context;
+
+	requires org.slf4j;
 }
diff --git 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
index 896856bd1..57ebc1bd5 100644
--- 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,7 +28,7 @@ import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.stream.Stream;
 
-import javax.annotation.Nonnull;
+import jakarta.annotation.Nonnull;
 
 import org.apache.openmeetings.IApplication;
 import org.apache.openmeetings.core.util.ws.WsMessageAll;
diff --git a/openmeetings-core/src/main/java/module-info.java b/openmeetings-core/src/test/java/module-info.test
similarity index 69%
copy from openmeetings-core/src/main/java/module-info.java
copy to openmeetings-core/src/test/java/module-info.test
index 9a17eeddd..b76057d82 100644
--- a/openmeetings-core/src/main/java/module-info.java
+++ b/openmeetings-core/src/test/java/module-info.test
@@ -18,6 +18,7 @@
  */
 
 module org.apache.openmeetings.core {
+	// This one should be in-sync with module-info.java
 	exports org.apache.openmeetings.core.converter;
 	exports org.apache.openmeetings.core.data.file;
 	exports org.apache.openmeetings.core.ldap;
@@ -27,19 +28,40 @@ module org.apache.openmeetings.core {
 	exports org.apache.openmeetings.core.sip;
 	exports org.apache.openmeetings.core.util;
 
-	requires transitive org.apache.openmeetings.db;
+	requires com.github.openjson;
 
-	requires transitive org.apache.commons.io;
-	requires transitive java.annotation;
-	requires transitive java.xml;
+	requires jakarta.annotation;
+	requires jakarta.inject;
+	requires jakarta.mail;
+
+	requires org.apache.commons.io;
+	requires org.apache.commons.lang3;
+
+	requires org.apache.tika.core;
+	requires org.apache.tika.parser.image;
+
+	requires org.apache.openmeetings.db;
+	requires org.apache.openmeetings.util;
+
+	requires org.apache.wicket.core;
+	requires org.apache.wicket.websocket.core;
+	requires org.apache.wicket.util;
+
+	requires java.xml;
 
 	requires xstream;
 
 	requires jodconverter.core;
 	requires jodconverter.local;
 	requires org.apache.directory.ldap.api.all;
-	requires javax.inject;
 	requires asterisk.java;
 	requires jain.sip.ri;
-	requires jakarta.mail;
+
+	requires spring.context;
+
+	requires org.slf4j;
+
+	//tests
+	requires org.junit.jupiter.engine;
+	requires org.junit.jupiter.api;
 }
diff --git a/openmeetings-db/pom.xml b/openmeetings-db/pom.xml
index e82e7264b..416b02239 100644
--- a/openmeetings-db/pom.xml
+++ b/openmeetings-db/pom.xml
@@ -63,6 +63,10 @@
 			<groupId>jakarta.transaction</groupId>
 			<artifactId>jakarta.transaction-api</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>jakarta.annotation</groupId>
+			<artifactId>jakarta.annotation-api</artifactId>
+		</dependency>
 		<dependency>
 			<groupId>org.springframework</groupId>
 			<artifactId>spring-tx</artifactId>
@@ -118,7 +122,7 @@
 	</dependencies>
 	<build>
 		<plugins>
-			<plugin>
+			<!--plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-javadoc-plugin</artifactId>
 				<executions>
@@ -138,7 +142,7 @@
 						<phase>generate-resources</phase>
 					</execution>
 				</executions>
-			</plugin>
+			</plugin-->
 			<plugin>
 				<groupId>org.apache.openjpa</groupId>
 				<artifactId>openjpa-maven-plugin</artifactId>
diff --git a/openmeetings-db/src/main/java/module-info.java b/openmeetings-db/src/main/java/module-info.java
index f65ad04b8..b31f406ef 100644
--- a/openmeetings-db/src/main/java/module-info.java
+++ b/openmeetings-db/src/main/java/module-info.java
@@ -51,16 +51,32 @@ module org.apache.openmeetings.db {
 	exports org.apache.openmeetings.db.util;
 	exports org.apache.openmeetings.db.util.ws;
 
-	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 java.xml.bind;
-	requires transitive org.apache.openjpa;
-	requires transitive spring.beans;
-	requires transitive spring.web;
-	requires transitive spring.core;
+	requires com.github.openjson;
 
+	requires org.apache.commons.lang3;
+	requires org.apache.commons.text;
+
+	requires org.apache.openjpa;
+
+	requires org.apache.openmeetings.util;
+
+	requires org.apache.wicket.core;
+	requires org.apache.wicket.extensions;
+	requires org.apache.wicket.request;
+	requires org.apache.wicket.util;
+	requires org.apache.wicket.websocket.core;
+
+	requires spring.beans;
+	requires spring.web;
+	requires spring.core;
 	requires spring.tx;
-	requires javax.persistence;
+	requires spring.context;
+
+	requires jakarta.annotation;
+	requires jakarta.inject;
+	requires jakarta.persistence;
+	requires jakarta.servlet;
+	requires jakarta.xml.bind;
+
+	requires org.slf4j;
 }
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java b/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java
index fb0695fa1..53eecfeaf 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java
@@ -22,7 +22,7 @@ import java.util.Locale;
 import java.util.Set;
 import java.util.function.Supplier;
 
-import javax.annotation.Nonnull;
+import jakarta.annotation.Nonnull;
 import jakarta.servlet.ServletContext;
 
 import org.apache.openmeetings.db.entity.room.Invitation;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Client.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Client.java
index f1dbeacea..356f9b751 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Client.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Client.java
@@ -31,7 +31,7 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Stream;
 
-import javax.annotation.Nonnull;
+import jakarta.annotation.Nonnull;
 
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.IDataProviderEntity;
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/IWsClient.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/IWsClient.java
index 4770c42da..833011dec 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/IWsClient.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/IWsClient.java
@@ -20,7 +20,7 @@ package org.apache.openmeetings.db.entity.basic;
 
 import java.io.Serializable;
 
-import javax.annotation.Nonnull;
+import jakarta.annotation.Nonnull;
 
 /**
  * Necessary for temp clients being created on HashPage
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/WsClient.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/WsClient.java
index b3d7aba0f..54db5a55e 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/WsClient.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/WsClient.java
@@ -20,7 +20,7 @@ package org.apache.openmeetings.db.entity.basic;
 
 import static java.util.UUID.randomUUID;
 
-import javax.annotation.Nonnull;
+import jakarta.annotation.Nonnull;
 
 /**
  * Temporary class for test recording, will be unified
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/PrivateMessageFolder.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/PrivateMessageFolder.java
index 87bf1d081..e202f9d1f 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/PrivateMessageFolder.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/PrivateMessageFolder.java
@@ -27,6 +27,7 @@ import jakarta.persistence.Entity;
 import jakarta.persistence.GeneratedValue;
 import jakarta.persistence.GenerationType;
 import jakarta.persistence.Id;
+import jakarta.persistence.NamedQuery;
 import jakarta.persistence.Table;
 import jakarta.xml.bind.annotation.XmlAccessType;
 import jakarta.xml.bind.annotation.XmlAccessorType;
diff --git a/openmeetings-db/src/main/java/module-info.java b/openmeetings-db/src/test/java/module-info.test
similarity index 76%
copy from openmeetings-db/src/main/java/module-info.java
copy to openmeetings-db/src/test/java/module-info.test
index f65ad04b8..df483e26a 100644
--- a/openmeetings-db/src/main/java/module-info.java
+++ b/openmeetings-db/src/test/java/module-info.test
@@ -17,6 +17,7 @@
  * under the License.
  */
 module org.apache.openmeetings.db {
+	// This one should be in-sync with module-info.java
 	exports org.apache.openmeetings;
 	exports org.apache.openmeetings.db.bind;
 	exports org.apache.openmeetings.db.bind.adapter;
@@ -51,16 +52,36 @@ module org.apache.openmeetings.db {
 	exports org.apache.openmeetings.db.util;
 	exports org.apache.openmeetings.db.util.ws;
 
-	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 java.xml.bind;
-	requires transitive org.apache.openjpa;
-	requires transitive spring.beans;
-	requires transitive spring.web;
-	requires transitive spring.core;
+	requires com.github.openjson;
 
+	requires org.apache.commons.lang3;
+	requires org.apache.commons.text;
+
+	requires org.apache.openjpa;
+
+	requires org.apache.openmeetings.util;
+
+	requires org.apache.wicket.core;
+	requires org.apache.wicket.extensions;
+	requires org.apache.wicket.request;
+	requires org.apache.wicket.util;
+	requires org.apache.wicket.websocket.core;
+
+	requires spring.beans;
+	requires spring.web;
+	requires spring.core;
 	requires spring.tx;
-	requires javax.persistence;
+	requires spring.context;
+
+	requires jakarta.annotation;
+	requires jakarta.inject;
+	requires jakarta.persistence;
+	requires jakarta.servlet;
+	requires jakarta.xml.bind;
+
+	requires org.slf4j;
+
+	//tests
+	requires org.junit.jupiter.engine;
+	requires org.junit.jupiter.api;
 }
diff --git a/openmeetings-install/src/main/java/module-info.java b/openmeetings-install/src/main/java/module-info.java
index cb5c126f9..60729e6df 100644
--- a/openmeetings-install/src/main/java/module-info.java
+++ b/openmeetings-install/src/main/java/module-info.java
@@ -22,9 +22,32 @@ module org.apache.openmeetings.install {
 	exports org.apache.openmeetings.cli;
 	exports org.apache.openmeetings.installation;
 
-	requires transitive org.apache.openmeetings.core;
+	requires com.github.openjson;
+
+	requires org.apache.commons.io;
+	requires org.apache.commons.lang3;
+
+	requires org.apache.openjpa;
+
+	requires org.apache.openmeetings.core;
+	requires org.apache.openmeetings.db;
+	requires org.apache.openmeetings.util;
+
+	requires org.apache.wicket.core;
+	requires org.apache.wicket.request;
+	requires org.apache.wicket.util;
+
+	requires jakarta.inject;
+	requires jakarta.xml.bind;
+
+	requires spring.context;
+	requires spring.context.support;
+	requires spring.web;
+
 	requires java.desktop;
 	requires commons.cli;
-	requires spring.context.support;
 	requires quartz;
+	requires xstream;
+
+	requires org.slf4j;
 }
diff --git a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java
index fdc95b1eb..d5724d024 100644
--- a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java
+++ b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java
@@ -384,10 +384,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 --git a/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java b/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java
index 549d993ff..af06ca5b1 100644
--- 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 @@ public class Admin {
 	private File home;
 	private String step;
 
-	Admin() {
+	public Admin() {
 		cfg = new InstallationConfig();
 		opts = buildOptions();
 		step = "Initialization";
@@ -229,8 +229,7 @@ public class Admin {
 		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 --git a/openmeetings-install/src/main/java/module-info.java b/openmeetings-install/src/test/java/module-info.test
similarity index 62%
copy from openmeetings-install/src/main/java/module-info.java
copy to openmeetings-install/src/test/java/module-info.test
index cb5c126f9..6625f6c4d 100644
--- a/openmeetings-install/src/main/java/module-info.java
+++ b/openmeetings-install/src/test/java/module-info.test
@@ -18,13 +18,41 @@
  */
 
 module org.apache.openmeetings.install {
+	// This one should be in-sync with module-info.java
 	exports org.apache.openmeetings.backup;
 	exports org.apache.openmeetings.cli;
 	exports org.apache.openmeetings.installation;
 
-	requires transitive org.apache.openmeetings.core;
+	requires com.github.openjson;
+
+	requires org.apache.commons.io;
+	requires org.apache.commons.lang3;
+
+	requires org.apache.openjpa;
+
+	requires org.apache.openmeetings.core;
+	requires org.apache.openmeetings.db;
+	requires org.apache.openmeetings.util;
+
+	requires org.apache.wicket.core;
+	requires org.apache.wicket.request;
+	requires org.apache.wicket.util;
+
+	requires jakarta.inject;
+	requires jakarta.xml.bind;
+
+	requires spring.context;
+	requires spring.context.support;
+	requires spring.web;
+
 	requires java.desktop;
 	requires commons.cli;
-	requires spring.context.support;
 	requires quartz;
+	requires xstream;
+
+	requires org.slf4j;
+
+	//tests
+	requires org.junit.jupiter.engine;
+	requires org.junit.jupiter.api;
 }
diff --git a/openmeetings-mediaserver/pom.xml b/openmeetings-mediaserver/pom.xml
index dfe2c22fd..017679e2f 100644
--- a/openmeetings-mediaserver/pom.xml
+++ b/openmeetings-mediaserver/pom.xml
@@ -59,7 +59,7 @@
 	</dependencies>
 	<build>
 		<plugins>
-			<plugin>
+			<!--plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-javadoc-plugin</artifactId>
 				<executions>
@@ -79,7 +79,7 @@
 						<phase>generate-resources</phase>
 					</execution>
 				</executions>
-			</plugin>
+			</plugin-->
 		</plugins>
 	</build>
 </project>
diff --git a/openmeetings-mediaserver/src/main/java/module-info.java b/openmeetings-mediaserver/src/main/java/module-info.java
index 47ee94e67..42f766fac 100644
--- a/openmeetings-mediaserver/src/main/java/module-info.java
+++ b/openmeetings-mediaserver/src/main/java/module-info.java
@@ -20,12 +20,27 @@
 module org.apache.openmeetings.mediaserver {
 	exports org.apache.openmeetings.mediaserver;
 
-	requires transitive org.apache.openmeetings.core;
-	requires transitive org.apache.wicket.ioc;
+	requires com.github.openjson;
+
+	requires org.apache.commons.lang3;
+
+	requires org.apache.openmeetings.core;
+	requires org.apache.openmeetings.db;
+	requires org.apache.openmeetings.util;
+
+	requires org.apache.wicket.ioc;
+	requires org.apache.wicket.util;
+
+	requires jakarta.annotation;
+	requires jakarta.inject;
+
+	requires spring.beans;
+	requires spring.context;
 
 	requires kurento.client;
 	requires kurento.jsonrpc.client;
 	requires kurento.commons;
-	requires javax.inject;
 	requires com.google.gson;
+
+	requires org.slf4j;
 }
diff --git a/openmeetings-mediaserver/src/main/java/module-info.java b/openmeetings-mediaserver/src/test/java/module-info.test
similarity index 66%
copy from openmeetings-mediaserver/src/main/java/module-info.java
copy to openmeetings-mediaserver/src/test/java/module-info.test
index 47ee94e67..deaf32995 100644
--- a/openmeetings-mediaserver/src/main/java/module-info.java
+++ b/openmeetings-mediaserver/src/test/java/module-info.test
@@ -18,14 +18,34 @@
  */
 
 module org.apache.openmeetings.mediaserver {
+	// This one should be in-sync with module-info.java
 	exports org.apache.openmeetings.mediaserver;
 
-	requires transitive org.apache.openmeetings.core;
-	requires transitive org.apache.wicket.ioc;
+	requires com.github.openjson;
+
+	requires org.apache.commons.lang3;
+
+	requires org.apache.openmeetings.core;
+	requires org.apache.openmeetings.db;
+	requires org.apache.openmeetings.util;
+
+	requires org.apache.wicket.ioc;
+	requires org.apache.wicket.util;
+
+	requires jakarta.annotation;
+	requires jakarta.inject;
+
+	requires spring.beans;
+	requires spring.context;
 
 	requires kurento.client;
 	requires kurento.jsonrpc.client;
 	requires kurento.commons;
-	requires javax.inject;
 	requires com.google.gson;
+
+	requires org.slf4j;
+
+	//tests
+	requires org.junit.jupiter.engine;
+	requires org.junit.jupiter.api;
 }
diff --git a/openmeetings-service/src/main/java/module-info.java b/openmeetings-service/src/main/java/module-info.java
index 2969affec..b0f443fcf 100644
--- a/openmeetings-service/src/main/java/module-info.java
+++ b/openmeetings-service/src/main/java/module-info.java
@@ -18,17 +18,37 @@
  */
 
 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.openmeetings.core;
+	requires org.apache.commons.lang3;
 
-	requires transitive org.apache.wicket.spring;
+	requires org.apache.openmeetings.db;
+	requires org.apache.openmeetings.core;
+	requires org.apache.openmeetings.util;
+
+	requires jakarta.annotation;
+	requires jakarta.inject;
+	requires jakarta.servlet;
+
+	requires spring.context;
+
+	requires org.apache.wicket.core;
+	requires org.apache.wicket.request;
+	requires org.apache.wicket.spring;
+	requires org.apache.wicket.util;
 
 	requires org.apache.httpcomponents.httpcore;
 	requires org.apache.httpcomponents.httpclient;
-	requires jackrabbit.webdav;
+	requires jackrabbit.webdav.jakarta;
 	requires caldav4j;
+	requires java.xml;
+	requires org.mnode.ical4j.core;
+
+	requires org.slf4j;
 }
diff --git 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
index 08149d8ca..04dc2de2f 100644
--- 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 @@ public class AppointmentReminderTemplate extends AppointmentTemplate {
 	}
 
 	@Override
-	String getPrefix() {
+	public String getPrefix() {
 		return app.getOmString("1158", locale);
 	}
 }
diff --git 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
index 8f40f5fb7..d2ab5d823 100644
--- 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 @@ public abstract class AppointmentTemplate extends SubjectEmailTemplate {
 		add(new Label("end", format(a.getEnd())));
 	}
 
-	abstract String getPrefix();
+	public abstract String getPrefix();
 
 	@Override
 	Fragment getSubjectFragment() {
diff --git 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
index ebf807b0c..fd32229cf 100644
--- 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 @@ public class CanceledAppointmentTemplate extends InvitedAppointmentTemplate {
 	}
 
 	@Override
-	String getPrefix() {
+	public String getPrefix() {
 		return app.getOmString("1157", locale);
 	}
 }
diff --git 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
index 161d10fba..627b34e58 100644
--- 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 @@ public class CreatedAppointmentTemplate extends InvitedAppointmentTemplate {
 	}
 
 	@Override
-	String getPrefix() {
+	public String getPrefix() {
 		return app.getOmString("1151", locale);
 	}
 }
diff --git 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
index 7f0b00d26..ac4823e81 100644
--- 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 @@ public abstract class InvitedAppointmentTemplate extends AppointmentTemplate {
 	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 --git 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
index cb9b31549..f6231d073 100644
--- 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 @@ public class UpdatedAppointmentTemplate extends InvitedAppointmentTemplate {
 	}
 
 	@Override
-	String getPrefix() {
+	public String getPrefix() {
 		return app.getOmString("1155", locale);
 	}
 }
diff --git a/openmeetings-util/src/main/java/module-info.java b/openmeetings-util/src/main/java/module-info.java
index 3e307dab1..72e073b16 100644
--- a/openmeetings-util/src/main/java/module-info.java
+++ b/openmeetings-util/src/main/java/module-info.java
@@ -24,19 +24,24 @@ module org.apache.openmeetings.util {
 	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.lang3;
-	requires transitive com.github.openjson;
-	requires transitive org.slf4j;
-	requires transitive javax.servlet.api;
-	requires transitive org.apache.tika.core;
-	requires transitive spring.context;
-	requires transitive org.apache.commons.codec;
+	requires jakarta.activation;
+	requires jakarta.servlet;
+
+	requires com.github.openjson;
+
+	requires org.apache.commons.codec;
+	requires org.apache.commons.lang3;
+
+	requires org.apache.tika.core;
+
+	requires org.apache.wicket.util;
+	requires org.apache.wicket.core;
+	requires org.apache.wicket.extensions;
+
+	requires org.slf4j;
+	requires spring.context;
 
 	requires org.bouncycastle.provider;
-	requires jakarta.activation;
 	requires org.mnode.ical4j.core;
 	requires org.aspectj.tools;
 	requires org.dom4j;
diff --git a/openmeetings-util/src/test/java/module-info.test b/openmeetings-util/src/test/java/module-info.test
index 579e840ad..c064884ae 100644
--- a/openmeetings-util/src/test/java/module-info.test
+++ b/openmeetings-util/src/test/java/module-info.test
@@ -25,19 +25,24 @@ open module org.apache.openmeetings.util {
 	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.lang3;
-	requires transitive com.github.openjson;
-	requires transitive org.slf4j;
-	requires transitive javax.servlet.api;
-	requires transitive org.apache.tika.core;
-	requires transitive spring.context;
-	requires transitive org.apache.commons.codec;
+	requires jakarta.activation;
+	requires jakarta.servlet;
+
+	requires com.github.openjson;
+
+	requires org.apache.commons.codec;
+	requires org.apache.commons.lang3;
+
+	requires org.apache.tika.core;
+
+	requires org.apache.wicket.util;
+	requires org.apache.wicket.core;
+	requires org.apache.wicket.extensions;
+
+	requires org.slf4j;
+	requires spring.context;
 
 	requires org.bouncycastle.provider;
-	requires jakarta.activation;
 	requires org.mnode.ical4j.core;
 	requires org.aspectj.tools;
 	requires org.dom4j;
diff --git a/openmeetings-web/pom.xml b/openmeetings-web/pom.xml
index 85fcd5966..ee8ad5190 100644
--- a/openmeetings-web/pom.xml
+++ b/openmeetings-web/pom.xml
@@ -494,8 +494,8 @@
 			<scope>test</scope>
 		</dependency>
 		<dependency>
-			<groupId>javax.websocket</groupId>
-			<artifactId>javax.websocket-api</artifactId>
+			<groupId>jakarta.websocket</groupId>
+			<artifactId>jakarta.websocket-client-api</artifactId>
 		</dependency>
 		<dependency>
 			<groupId>org.apache.tomcat.embed</groupId>
diff --git a/openmeetings-web/src/main/java/module-info.java b/openmeetings-web/src/main/java/module-info.java
index 346ccc2c1..e793d828e 100644
--- a/openmeetings-web/src/main/java/module-info.java
+++ b/openmeetings-web/src/main/java/module-info.java
@@ -18,12 +18,35 @@
  */
 
 module org.apache.openmeetings.web {
+	requires org.apache.openmeetings.core;
+	requires org.apache.openmeetings.db;
 	requires org.apache.openmeetings.install;
 	requires org.apache.openmeetings.mediaserver;
+	requires org.apache.openmeetings.service;
+	requires org.apache.openmeetings.util;
 	requires org.apache.openmeetings.webservice;
 
+	requires com.github.openjson;
+
+	requires totp;
+
+	requires org.apache.commons.io;
+	requires org.apache.commons.fileupload2.core;
+	requires org.apache.commons.fileupload2.jakarta;
+	requires org.apache.commons.lang3;
+
+	requires org.apache.httpcomponents.httpclient;
+
 	requires org.apache.wicket.auth.roles;
+	requires org.apache.wicket.core;
 	requires org.apache.wicket.devutils;
+	requires org.apache.wicket.extensions;
+	requires org.apache.wicket.ioc;
+	requires org.apache.wicket.request;
+	requires org.apache.wicket.spring;
+	requires org.apache.wicket.util;
+	requires org.apache.wicket.websocket.core;
+
 	requires wicketstuff.dashboard.core;
 	requires wicketstuff.datastore.hazelcast;
 	requires wicketstuff.select2;
@@ -39,12 +62,25 @@ module org.apache.openmeetings.web {
 	requires wicket.jquery.ui.core;
 	requires wicket.jquery.ui.plugins;
 
+	requires jakarta.annotation;
+	requires jakarta.inject;
+	requires jakarta.servlet;
+	requires jakarta.websocket.client;
+	requires jakarta.ws.rs;
+
 	requires java.net.http;
+	requires java.management;
 	requires java.sql;
-	requires javax.websocket.api;
+
 	requires com.hazelcast.core;
 	requires org.danekja.jdk.serializable.functional;
+	requires simpleclient.servlet.jakarta;
+	requires xstream;
+
+	requires spring.beans;
+	requires spring.context;
 	requires spring.orm;
-	requires java.management;
-	requires simpleclient.servlet;
+	requires spring.web;
+
+	requires org.slf4j;
 }
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java
index e9a5c19bc..0f9dbefb1 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java
@@ -18,11 +18,11 @@
  */
 package org.apache.openmeetings.web.admin.configurations;
 
+import static org.apache.openmeetings.web.common.BasePanel.EVT_CHANGE;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_PATH_FFMPEG;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_PATH_IMAGEMAGIC;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_PATH_OFFICE;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_PATH_SOX;
-import static org.apache.openmeetings.web.common.BasePanel.EVT_CHANGE;
 import static org.apache.wicket.validation.validator.StringValidator.maximumLength;
 
 import java.nio.file.InvalidPathException;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
index 6c313514c..aa53bd37d 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
@@ -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.ConfirmationHelper.newOkCancelConfirm;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java
index a56f17c71..59eab4b9f 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java
@@ -19,12 +19,12 @@
 package org.apache.openmeetings.web.admin.groups;
 
 import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
-import static org.apache.openmeetings.util.OmFileHelper.getGroupLogo;
-import static org.apache.openmeetings.util.OmFileHelper.getGroupLogoDir;
 import static org.apache.openmeetings.web.app.WebSession.getRights;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.apache.openmeetings.web.common.BasePanel.EVT_CHANGE;
 import static org.apache.openmeetings.web.util.GroupLogoResourceReference.getUrl;
+import static org.apache.openmeetings.util.OmFileHelper.getGroupLogo;
+import static org.apache.openmeetings.util.OmFileHelper.getGroupLogoDir;
 
 import java.io.File;
 import java.nio.file.Files;
@@ -36,10 +36,10 @@ 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.StoredFile;
 import org.apache.openmeetings.web.admin.AdminBaseForm;
 import org.apache.openmeetings.web.admin.AdminUserChoiceProvider;
 import org.apache.openmeetings.web.common.UploadableImagePanel;
+import org.apache.openmeetings.util.StoredFile;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java
index a72f18f52..53e64fe37 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java
@@ -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 --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.java
index 93060889d..f3367e400 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.java
@@ -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.wicket.request.resource.ContentDisposition.ATTACHMENT;
 
 import java.io.IOException;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
index 0eeac1703..f5055cba2 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
@@ -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.ConfirmationHelper.newOkCancelDangerConfirm;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.isRecordingsEnabled;
 import static org.apache.wicket.validation.validator.StringValidator.maximumLength;
 
 import java.util.ArrayList;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
index 1245920ea..2f38131f2 100644
--- 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,11 +23,11 @@ import static org.apache.openmeetings.db.dao.user.UserDao.getNewUserInstance;
 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.util.OpenmeetingsVariables.isOtpEnabled;
 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.isOtpEnabled;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.isSendRegisterEmail;
 import static org.apache.wicket.validation.validator.StringValidator.minimumLength;
 
 import java.util.ArrayList;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
index 820d12a05..94ffd72cd 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
@@ -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 --git 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
index 3a1b8d0ac..9b90e162e 100644
--- 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
@@ -18,6 +18,9 @@
  */
 package org.apache.openmeetings.web.app;
 
+import static org.apache.openmeetings.web.pages.HashPage.INVITATION_HASH;
+import static org.apache.openmeetings.web.user.rooms.RoomEnterBehavior.getRoomUrlFragment;
+import static org.apache.openmeetings.web.util.OmUrlFragment.PROFILE_MESSAGES;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_EXT_PROCESS_TTL;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getApplicationName;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getBaseUrl;
@@ -28,9 +31,6 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.isInitComplete;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.setExtProcessTtl;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.setInitComplete;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.setWicketApplicationName;
-import static org.apache.openmeetings.web.pages.HashPage.INVITATION_HASH;
-import static org.apache.openmeetings.web.user.rooms.RoomEnterBehavior.getRoomUrlFragment;
-import static org.apache.openmeetings.web.util.OmUrlFragment.PROFILE_MESSAGES;
 import static org.wicketstuff.dashboard.DashboardContextInitializer.DASHBOARD_CONTEXT_KEY;
 
 import java.io.File;
@@ -44,8 +44,8 @@ import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import javax.annotation.Nonnull;
-import javax.websocket.WebSocketContainer;
+import jakarta.annotation.Nonnull;
+import jakarta.websocket.WebSocketContainer;
 
 import org.apache.openmeetings.IApplication;
 import org.apache.openmeetings.core.sip.SipManager;
@@ -71,8 +71,6 @@ import org.apache.openmeetings.db.entity.user.User.Type;
 import org.apache.openmeetings.db.util.ApplicationHelper;
 import org.apache.openmeetings.db.util.ws.RoomMessage;
 import org.apache.openmeetings.db.util.ws.TextRoomMessage;
-import org.apache.openmeetings.util.OmFileHelper;
-import org.apache.openmeetings.util.OmVersion;
 import org.apache.openmeetings.util.ws.IClusterWsMessage;
 import org.apache.openmeetings.web.admin.backup.BackupUploadResourceReference;
 import org.apache.openmeetings.web.common.PingResourceReference;
@@ -100,6 +98,8 @@ import org.apache.openmeetings.web.user.dashboard.admin.AdminWidgetDescriptor;
 import org.apache.openmeetings.web.user.record.Mp4RecordingResourceReference;
 import org.apache.openmeetings.web.user.record.PngRecordingResourceReference;
 import org.apache.openmeetings.web.util.GroupLogoResourceReference;
+import org.apache.openmeetings.util.OmFileHelper;
+import org.apache.openmeetings.util.OmVersion;
 import org.apache.openmeetings.web.util.ProfileImageResourceReference;
 import org.apache.openmeetings.web.util.UserDashboardPersister;
 import org.apache.wicket.DefaultPageManagerProvider;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/OtpManager.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/OtpManager.java
index c8f1d07c2..620833ce2 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/OtpManager.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/OtpManager.java
@@ -20,14 +20,13 @@
 package org.apache.openmeetings.web.app;
 
 import static dev.samstevens.totp.util.Utils.getDataUriForImage;
+import static org.apache.openmeetings.util.OmFileHelper.PNG_MIME_TYPE;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getApplicationName;
 
 import java.net.UnknownHostException;
 
 import jakarta.annotation.PostConstruct;
 
-import static org.apache.openmeetings.util.OmFileHelper.PNG_MIME_TYPE;
-
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/UserManager.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/UserManager.java
index 6b2034e14..a88f8727d 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/UserManager.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/UserManager.java
@@ -22,6 +22,7 @@ import static java.nio.charset.StandardCharsets.UTF_8;
 import static java.util.UUID.randomUUID;
 import static org.apache.openmeetings.db.dao.user.UserDao.getNewUserInstance;
 import static org.apache.openmeetings.db.util.TimezoneUtil.getTimeZone;
+import static org.apache.openmeetings.web.app.Application.urlForPage;
 import static org.apache.openmeetings.util.OmException.UNKNOWN;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_IGNORE_BAD_SSL;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getBaseUrl;
@@ -30,7 +31,6 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.getDefaultLang;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getMinLoginLength;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.isAllowRegisterFrontend;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.isSendVerificationEmail;
-import static org.apache.openmeetings.web.app.Application.urlForPage;
 
 import java.io.IOException;
 import java.net.URI;
@@ -69,10 +69,10 @@ import org.apache.openmeetings.db.entity.user.User.Right;
 import org.apache.openmeetings.db.entity.user.User.Type;
 import org.apache.openmeetings.db.manager.IClientManager;
 import org.apache.openmeetings.service.mail.EmailManager;
-import org.apache.openmeetings.util.OmException;
 import org.apache.openmeetings.util.crypt.CryptProvider;
 import org.apache.openmeetings.util.crypt.ICrypt;
 import org.apache.openmeetings.web.pages.auth.SignInPage;
+import org.apache.openmeetings.util.OmException;
 import org.apache.wicket.IConverterLocator;
 import org.apache.wicket.core.util.lang.PropertyResolver;
 import org.apache.wicket.core.util.lang.PropertyResolverConverter;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
index 434e959da..3ceb92044 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
@@ -20,15 +20,15 @@ package org.apache.openmeetings.web.app;
 
 import static org.apache.openmeetings.db.dao.user.UserDao.getNewUserInstance;
 import static org.apache.openmeetings.db.util.TimezoneUtil.getTimeZone;
+import static org.apache.openmeetings.web.app.Application.getAuthenticationStrategy;
+import static org.apache.openmeetings.web.app.Application.getDashboardContext;
+import static org.apache.openmeetings.web.app.Application.isInvaldSession;
+import static org.apache.openmeetings.web.app.Application.removeInvalidSession;
 import static org.apache.openmeetings.util.CalendarPatterns.ISO8601_FULL_FORMAT_STRING;
 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.util.OpenmeetingsVariables.getDefaultLang;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.isMyRoomsEnabled;
-import static org.apache.openmeetings.web.app.Application.getAuthenticationStrategy;
-import static org.apache.openmeetings.web.app.Application.getDashboardContext;
-import static org.apache.openmeetings.web.app.Application.isInvaldSession;
-import static org.apache.openmeetings.web.app.Application.removeInvalidSession;
 
 import java.util.Calendar;
 import java.util.Collections;
diff --git 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
index fff4fb376..cf4d22423 100644
--- 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 @@ 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.List;
 import java.util.Map;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
index 728191b4c..e8a9a4df0 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
@@ -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 --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
index f0c3a0b46..80e0dd21c 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
@@ -19,11 +19,11 @@
 package org.apache.openmeetings.web.common;
 
 import static java.util.UUID.randomUUID;
-import static org.apache.openmeetings.util.CalendarHelper.getDate;
 import static org.apache.openmeetings.web.app.Application.getInvitationLink;
 import static org.apache.openmeetings.web.app.WebSession.AVAILABLE_TIMEZONES;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.apache.openmeetings.web.common.BasePanel.EVT_CHANGE;
+import static org.apache.openmeetings.util.CalendarHelper.getDate;
 import static org.apache.openmeetings.web.util.CalendarWebHelper.getZoneId;
 
 import java.time.LocalDateTime;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
index 7e1e88fab..67da86a67 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
@@ -20,14 +20,14 @@ package org.apache.openmeetings.web.common;
 
 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.PARAM_USER_ID;
-import static org.apache.openmeetings.util.OpenmeetingsVariables.isMyRoomsEnabled;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.apache.openmeetings.web.common.confirmation.ConfirmationHelper.newOkCancelConfirm;
 import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
 import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getParam;
 import static org.apache.openmeetings.web.util.OmUrlFragment.CHILD_ID;
 import static org.apache.openmeetings.web.util.OmUrlFragment.getPanel;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.PARAM_USER_ID;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.isMyRoomsEnabled;
 import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
 
 import java.io.IOException;
@@ -43,7 +43,6 @@ import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.user.PrivateMessage;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Right;
-import org.apache.openmeetings.util.OpenmeetingsVariables;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.ClientManager;
 import org.apache.openmeetings.web.app.WebSession;
@@ -60,6 +59,7 @@ import org.apache.openmeetings.web.user.rooms.RoomEnterBehavior;
 import org.apache.openmeetings.web.util.ContactsHelper;
 import org.apache.openmeetings.web.util.ExtendedClientProperties;
 import org.apache.openmeetings.web.util.OmUrlFragment;
+import org.apache.openmeetings.util.OpenmeetingsVariables;
 import org.apache.openmeetings.web.util.OmUrlFragment.MenuActions;
 import org.apache.openmeetings.web.util.ProfileImageResourceReference;
 import org.apache.wicket.AttributeModifier;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/UploadableImagePanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/UploadableImagePanel.java
index 08db1f867..f6f9e76b1 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/UploadableImagePanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/UploadableImagePanel.java
@@ -18,8 +18,8 @@
  */
 package org.apache.openmeetings.web.common;
 
-import static org.apache.openmeetings.util.OpenmeetingsVariables.getMaxUploadSize;
 import static org.apache.openmeetings.web.common.confirmation.ConfirmationHelper.newOkCancelConfirm;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.getMaxUploadSize;
 
 import java.io.File;
 import java.nio.file.Files;
diff --git 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
index c60d25889..f77068bb6 100644
--- 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,16 +21,16 @@ package org.apache.openmeetings.web.common.tree;
 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 java.io.File;
 import java.nio.file.Path;
@@ -45,8 +45,8 @@ import org.apache.openmeetings.db.entity.file.BaseFileItem;
 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.util.OmFileHelper;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AjaxEventBehavior;
diff --git 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
index e2f055aca..0af461b91 100644
--- 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 @@
 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 --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java
index 189e7a182..2f54cf985 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java
@@ -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 --git 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
index d921aa4fe..e37481dea 100644
--- 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 @@
 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 --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java
index 223ad9292..962bd8d2d 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java
@@ -18,12 +18,12 @@
  */
 package org.apache.openmeetings.web.pages.auth;
 
-import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_LDAP_ID;
-import static org.apache.openmeetings.util.OpenmeetingsVariables.isOtpEnabled;
 import static org.apache.openmeetings.web.app.Application.getAuthenticationStrategy;
 import static org.apache.openmeetings.web.app.UserManager.showAuth;
 import static org.apache.openmeetings.web.pages.HashPage.APP;
 import static org.apache.openmeetings.web.pages.HashPage.APP_TYPE_NETWORK;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_LDAP_ID;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.isOtpEnabled;
 
 import java.util.List;
 
@@ -35,14 +35,14 @@ import org.apache.openmeetings.db.entity.server.LdapConfig;
 import org.apache.openmeetings.db.entity.server.OAuthServer;
 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.util.OpenmeetingsVariables;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.OmAuthenticationStrategy;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.OmAjaxClientInfoBehavior;
 import org.apache.openmeetings.web.pages.HashPage;
 import org.apache.openmeetings.web.pages.PrivacyPage;
+import org.apache.openmeetings.util.OmException;
+import org.apache.openmeetings.util.OpenmeetingsVariables;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
 import org.apache.wicket.RestartResponseException;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
index 14644728e..2b74d339f 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
@@ -27,13 +27,13 @@ import org.apache.openmeetings.db.dao.server.OAuth2Dao;
 import org.apache.openmeetings.db.entity.server.OAuthServer;
 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.UserManager;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.OmModalCloseButton;
 import org.apache.openmeetings.web.pages.BaseInitedPage;
 import org.apache.openmeetings.web.room.IconTextModal;
+import org.apache.openmeetings.util.OmException;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.head.IHeaderResponse;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java
index ac6ba1e44..c544135d6 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java
@@ -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,15 +45,15 @@ import org.apache.openmeetings.db.dao.label.LabelDao;
 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.ConnectionProperties.DbType;
+import org.apache.openmeetings.util.OmFileHelper;
 import org.apache.openmeetings.web.util.OmTooltipBehavior;
 import org.apache.openmeetings.web.util.ThreadHelper;
 import org.apache.wicket.Component;
diff --git 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
index 347dce303..90830cb7a 100644
--- 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
@@ -22,10 +22,10 @@ import static de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal.BUTT
 import static java.time.Duration.ZERO;
 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.VideoSettings.VIDEO_SETTINGS_JS;
+import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_PDF;
 
 import java.io.IOException;
 import java.nio.file.Files;
@@ -53,7 +53,6 @@ import org.apache.openmeetings.db.util.AuthLevelUtil;
 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;
@@ -68,6 +67,7 @@ import org.apache.openmeetings.web.room.wb.InterviewWbPanel;
 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 --git 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
index d9ae8cc85..44d4a06bc 100644
--- 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 @@
 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 --git 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
index c7cca66ac..e979cedf3 100644
--- 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 @@
  */
 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 --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
index 2dcc1deb7..4569a4aba 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
@@ -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 --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java
index 8423d9548..18d69db87 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java
@@ -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 --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomUploadForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomUploadForm.java
index 99eb8606e..8039f0427 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomUploadForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomUploadForm.java
@@ -18,11 +18,11 @@
  */
 package org.apache.openmeetings.web.room.sidebar;
 
-import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_VALUE;
 import static org.apache.openmeetings.web.room.sidebar.RoomFileUploadResourceReference.PARAM_LAST_SELECTED_GROUP;
 import static org.apache.openmeetings.web.room.sidebar.RoomFileUploadResourceReference.PARAM_LAST_SELECTED_ID;
 import static org.apache.openmeetings.web.room.sidebar.RoomFileUploadResourceReference.PARAM_LAST_SELECTED_OWNER;
 import static org.apache.openmeetings.web.room.sidebar.RoomFileUploadResourceReference.PARAM_LAST_SELECTED_ROOM;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_VALUE;
 
 import org.apache.openmeetings.db.entity.file.BaseFileItem;
 import org.apache.openmeetings.web.common.upload.UploadForm;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
index adeb3cb03..be6765205 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
@@ -28,10 +28,10 @@ import static org.apache.openmeetings.db.dto.room.Whiteboard.ATTR_TYPE;
 import static org.apache.openmeetings.db.dto.room.Whiteboard.ATTR_WIDTH;
 import static org.apache.openmeetings.db.dto.room.Whiteboard.ATTR_ZOOM;
 import static org.apache.openmeetings.db.dto.room.Whiteboard.ITEMS_KEY;
-import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
-import static org.apache.openmeetings.util.OpenmeetingsVariables.PARAM_STATUS;
 import static org.apache.openmeetings.web.room.wb.WbWebSocketHelper.getObjWbJson;
 import static org.apache.openmeetings.web.room.wb.WbWebSocketHelper.getWbJson;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.PARAM_STATUS;
 import static org.apache.wicket.AttributeModifier.append;
 
 import java.io.BufferedReader;
@@ -58,19 +58,17 @@ import org.apache.openmeetings.db.entity.file.FileItem;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.Room.Right;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
-import org.apache.openmeetings.util.NullStringer;
-import org.apache.openmeetings.util.OmFileHelper;
 import org.apache.openmeetings.web.app.WhiteboardManager;
 import org.apache.openmeetings.web.common.NameDialog;
 import org.apache.openmeetings.web.room.RoomPanel;
+import org.apache.openmeetings.util.NullStringer;
+import org.apache.openmeetings.util.OmFileHelper;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.request.resource.JavaScriptResourceReference;
-import org.apache.wicket.request.resource.ResourceReference;
 
 import org.apache.wicket.util.string.Strings;
 import org.danekja.java.util.function.serializable.SerializableBiConsumer;
diff --git 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
index 45a46696b..ecb0a2719 100644
--- 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 @@ 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 --git 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
index 6c8018ef4..6d226d2f3 100644
--- 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 @@
  */
 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 --git 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
index b3c7212c6..2051f4897 100644
--- 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 @@
 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 --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/AboutDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/AboutDialog.java
index 28548cd28..2ad932c50 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/AboutDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/AboutDialog.java
@@ -18,10 +18,10 @@
  */
 package org.apache.openmeetings.web.user;
 
-import static org.apache.openmeetings.util.OpenmeetingsVariables.getApplicationName;
 import static org.apache.openmeetings.util.OmVersion.getBuildDate;
 import static org.apache.openmeetings.util.OmVersion.getRevision;
 import static org.apache.openmeetings.util.OmVersion.getVersion;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.getApplicationName;
 
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.model.ResourceModel;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
index 750fc5a0f..65a4c946f 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
@@ -20,12 +20,12 @@ package org.apache.openmeetings.web.user;
 
 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.util.OpenmeetingsVariables.isMyRoomsEnabled;
 import static org.apache.openmeetings.web.app.Application.getContactsLink;
 import static org.apache.openmeetings.web.app.Application.getInvitationLink;
 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.util.CalendarWebHelper.getZoneId;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.isMyRoomsEnabled;
 
 import java.time.LocalDateTime;
 import java.time.ZonedDateTime;
@@ -49,12 +49,12 @@ import org.apache.openmeetings.db.entity.user.PrivateMessage;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Type;
 import org.apache.openmeetings.db.manager.IInvitationManager;
-import org.apache.openmeetings.util.CalendarHelper;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.OmModalCloseButton;
 import org.apache.openmeetings.web.common.datetime.OmDateTimePicker;
 import org.apache.openmeetings.web.user.calendar.AppointmentDialog;
+import org.apache.openmeetings.util.CalendarHelper;
 import org.apache.openmeetings.web.util.CalendarWebHelper;
 import org.apache.openmeetings.web.util.RoomTypeDropDown;
 import org.apache.openmeetings.web.util.UserMultiChoice;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
index 4403bd667..e2f28d16b 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
@@ -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.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 --git 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
index ef3882a4b..f6d526043 100644
--- 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 @@ package org.apache.openmeetings.web.user.chat;
 
 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;
 
@@ -55,7 +55,6 @@ import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
 import org.apache.wicket.markup.head.PriorityHeaderItem;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.request.cycle.RequestCycle;
-import org.apache.wicket.request.resource.JavaScriptResourceReference;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/admin/AdminCleanupInfoDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/admin/AdminCleanupInfoDialog.java
index b5fd1e2fa..19f337f5a 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/admin/AdminCleanupInfoDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/dashboard/admin/AdminCleanupInfoDialog.java
@@ -23,10 +23,10 @@ import static org.apache.openmeetings.cli.CleanupHelper.getFileUnit;
 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.ConfirmationHelper.newOkCancelDangerConfirm;
 
 import org.apache.openmeetings.cli.CleanupEntityUnit;
 import org.apache.openmeetings.cli.CleanupUnit;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/InvitationsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/InvitationsPanel.java
index 76bcd1bd0..9f599f1f2 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/InvitationsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/InvitationsPanel.java
@@ -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 --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessagesContactsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessagesContactsPanel.java
index a231adbc9..a44951231 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessagesContactsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessagesContactsPanel.java
@@ -21,11 +21,11 @@ package org.apache.openmeetings.web.user.profile;
 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.util.OpenmeetingsVariables.ATTR_VALUE;
 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.ConfirmationHelper.newOkCancelDangerConfirm;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_VALUE;
 
 import java.util.ArrayList;
 import java.util.HashSet;
diff --git 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
index 6d20f4441..1621178f7 100644
--- 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 @@
 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.Collections;
 import java.util.Iterator;
diff --git 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
index 2c7160cd8..8e1322281 100644
--- 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 @@
 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 --git 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
index a98a39521..0811a5090 100644
--- 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 @@
  */
 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 --git 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
index 0507b73eb..fdab17da1 100644
--- 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 @@
  */
 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 --git 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
index cee177c5c..6e6275bd4 100644
--- 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
@@ -27,9 +27,9 @@ import org.apache.openmeetings.db.dao.room.RoomDao;
 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 --git 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
index f27116fed..db2d18565 100644
--- 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,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 --git 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
index 6cdee3776..4dd72328d 100644
--- 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 @@
 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 --git 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
index 8b3f45b69..34397c17e 100644
--- 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 @@ package org.apache.openmeetings.web.util;
 
 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;
@@ -35,14 +35,15 @@ import org.slf4j.LoggerFactory;
 
 import jakarta.inject.Inject;
 import jakarta.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 --git 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
index 5b468ede9..71274b924 100644
--- 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 @@
 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 --git a/openmeetings-web/src/main/java/module-info.java b/openmeetings-web/src/test/java/module-info.test
similarity index 59%
copy from openmeetings-web/src/main/java/module-info.java
copy to openmeetings-web/src/test/java/module-info.test
index 346ccc2c1..2873bcb6b 100644
--- a/openmeetings-web/src/main/java/module-info.java
+++ b/openmeetings-web/src/test/java/module-info.test
@@ -18,12 +18,38 @@
  */
 
 module org.apache.openmeetings.web {
+	// This one should be in-sync with module-info.java
+	requires org.apache.openmeetings.core;
+	requires org.apache.openmeetings.db;
 	requires org.apache.openmeetings.install;
 	requires org.apache.openmeetings.mediaserver;
+	requires org.apache.openmeetings.service;
+	requires org.apache.openmeetings.util;
 	requires org.apache.openmeetings.webservice;
 
+	requires com.github.openjson;
+
+	requires totp;
+
+	requires org.apache.commons.io;
+	requires org.apache.commons.fileupload2.core;
+	requires org.apache.commons.fileupload2.jakarta;
+	requires org.apache.commons.lang3;
+
+	requires org.apache.openjpa;
+
+	requires org.apache.httpcomponents.httpclient;
+
 	requires org.apache.wicket.auth.roles;
+	requires org.apache.wicket.core;
 	requires org.apache.wicket.devutils;
+	requires org.apache.wicket.extensions;
+	requires org.apache.wicket.ioc;
+	requires org.apache.wicket.request;
+	requires org.apache.wicket.spring;
+	requires org.apache.wicket.util;
+	requires org.apache.wicket.websocket.core;
+
 	requires wicketstuff.dashboard.core;
 	requires wicketstuff.datastore.hazelcast;
 	requires wicketstuff.select2;
@@ -39,12 +65,29 @@ module org.apache.openmeetings.web {
 	requires wicket.jquery.ui.core;
 	requires wicket.jquery.ui.plugins;
 
+	requires jakarta.annotation;
+	requires jakarta.inject;
+	requires jakarta.servlet;
+	requires jakarta.websocket.client;
+	requires jakarta.ws.rs;
+
 	requires java.net.http;
+	requires java.management;
 	requires java.sql;
-	requires javax.websocket.api;
+
 	requires com.hazelcast.core;
 	requires org.danekja.jdk.serializable.functional;
+	requires simpleclient.servlet.jakarta;
+	requires xstream;
+
+	requires spring.beans;
+	requires spring.context;
 	requires spring.orm;
-	requires java.management;
-	requires simpleclient.servlet;
+	requires spring.web;
+
+	requires org.slf4j;
+
+	//tests
+	requires org.junit.jupiter.engine;
+	requires org.junit.jupiter.api;
 }
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestAppointmentAddAppointment.java b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestAppointmentAddAppointment.java
index 796085cab..cd639d3ad 100644
--- 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 @@ import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
 
-import org.apache.openmeetings.AbstractWicketTesterTest;
+import org.apache.openmeetings.web.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;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestAppointmentSchedulerTask.java b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestAppointmentSchedulerTask.java
index ec8ad9b45..565b2280b 100644
--- 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,7 +23,7 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.getBaseUrl;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.setBaseUrl;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import org.apache.openmeetings.AbstractOmServerTest;
+import org.apache.openmeetings.web.AbstractOmServerTest;
 import org.apache.openmeetings.db.entity.basic.Configuration;
 import org.apache.openmeetings.service.calendar.AppointmentLogic;
 import org.junit.jupiter.api.Test;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestDatabaseStructureAppointment.java b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestDatabaseStructureAppointment.java
index 85a615328..ed6cc6df2 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestDatabaseStructureAppointment.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestDatabaseStructureAppointment.java
@@ -26,7 +26,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.TimeZone;
 
-import org.apache.openmeetings.AbstractOmServerTest;
+import org.apache.openmeetings.web.AbstractOmServerTest;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
 import org.apache.openmeetings.util.CalendarHelper;
 import org.junit.jupiter.api.Test;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestDatabaseStructureGetAppointmentByRange.java b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestDatabaseStructureGetAppointmentByRange.java
index 33f9a5766..28c5dc22a 100644
--- 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,7 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import java.util.ArrayList;
 import java.util.Calendar;
 
-import org.apache.openmeetings.AbstractOmServerTest;
+import org.apache.openmeetings.web.AbstractOmServerTest;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
 import org.apache.openmeetings.db.entity.calendar.MeetingMember;
 import org.junit.jupiter.api.Test;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestGetAppointment.java b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestGetAppointment.java
index 33acec44b..aff1d1af6 100644
--- 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,7 +24,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 import java.util.Calendar;
 import java.util.Date;
 
-import org.apache.openmeetings.AbstractOmServerTest;
+import org.apache.openmeetings.web.AbstractOmServerTest;
 import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
 import org.junit.jupiter.api.Test;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestOmCalendar.java b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestOmCalendar.java
index 99b11c02c..2d1ca639e 100644
--- 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,7 +21,7 @@ package org.apache.openmeetings.calendar;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import org.apache.openmeetings.AbstractOmServerTest;
+import org.apache.openmeetings.web.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;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestSendIcalMessage.java b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestSendIcalMessage.java
index eecb2f388..7b402f609 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestSendIcalMessage.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestSendIcalMessage.java
@@ -27,7 +27,7 @@ import java.util.Calendar;
 import java.util.Date;
 import java.util.TimeZone;
 
-import org.apache.openmeetings.AbstractOmServerTest;
+import org.apache.openmeetings.web.AbstractOmServerTest;
 import org.apache.openmeetings.core.mail.MailHandler;
 import org.apache.openmeetings.util.mail.ByteArrayDataSource;
 import org.apache.openmeetings.util.mail.IcalHandler;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/config/TestConfig.java b/openmeetings-web/src/test/java/org/apache/openmeetings/config/TestConfig.java
index 56bce75c9..67711e434 100644
--- 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,7 +24,7 @@ import static org.junit.jupiter.api.Assertions.assertNull;
 
 import java.util.List;
 
-import org.apache.openmeetings.AbstractOmServerTest;
+import org.apache.openmeetings.web.AbstractOmServerTest;
 import org.apache.openmeetings.db.entity.basic.Configuration;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
diff --git 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
index f68796405..b25ee254c 100644
--- 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,7 +28,7 @@ import java.io.FileInputStream;
 import java.io.InputStream;
 import java.util.Optional;
 
-import org.apache.openmeetings.AbstractOmServerTest;
+import org.apache.openmeetings.web.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;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/domain/TestAddGroup.java b/openmeetings-web/src/test/java/org/apache/openmeetings/domain/TestAddGroup.java
index 18bc5c023..a0498ade7 100644
--- 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,7 +20,7 @@ package org.apache.openmeetings.domain;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.apache.openmeetings.AbstractOmServerTest;
+import org.apache.openmeetings.web.AbstractOmServerTest;
 import org.apache.openmeetings.db.entity.user.Group;
 import org.apache.openmeetings.db.entity.user.User;
 import org.junit.jupiter.api.Test;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/domain/TestUserGroupAggregation.java b/openmeetings-web/src/test/java/org/apache/openmeetings/domain/TestUserGroupAggregation.java
index 3aec7e8ad..c15b7cad1 100644
--- 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,7 +21,7 @@ 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.AbstractOmServerTest;
+import org.apache.openmeetings.web.AbstractOmServerTest;
 import org.apache.openmeetings.db.entity.user.GroupUser;
 import org.apache.openmeetings.db.entity.user.User;
 import org.junit.jupiter.api.Test;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/invitiation/TestInvitation.java b/openmeetings-web/src/test/java/org/apache/openmeetings/invitiation/TestInvitation.java
index 8c7803447..3c6732038 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/invitiation/TestInvitation.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/invitiation/TestInvitation.java
@@ -25,7 +25,7 @@ import static org.junit.jupiter.api.Assertions.assertNull;
 import java.time.LocalDateTime;
 import java.util.Date;
 
-import org.apache.openmeetings.AbstractWicketTesterTest;
+import org.apache.openmeetings.web.AbstractWicketTesterTest;
 import org.apache.openmeetings.db.dao.room.InvitationDao;
 import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/ldap/TestLdap.java b/openmeetings-web/src/test/java/org/apache/openmeetings/ldap/TestLdap.java
index 177a917c2..016ea74af 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/ldap/TestLdap.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/ldap/TestLdap.java
@@ -55,13 +55,13 @@ import org.apache.directory.server.core.api.DirectoryService;
 import org.apache.directory.server.core.integ.ApacheDSTestExtension;
 import org.apache.directory.server.ldap.LdapServer;
 import org.apache.directory.server.protocol.shared.transport.Transport;
-import org.apache.openmeetings.AbstractWicketTesterTest;
+import org.apache.openmeetings.web.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.util.OmException;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/smoke/TestSmokeBasic.java b/openmeetings-web/src/test/java/org/apache/openmeetings/smoke/TestSmokeBasic.java
index 073daec9d..462daf3c6 100644
--- 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,7 +20,7 @@ package org.apache.openmeetings.smoke;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.apache.openmeetings.AbstractOmServerTest;
+import org.apache.openmeetings.web.AbstractOmServerTest;
 import org.junit.jupiter.api.Test;
 
 class TestSmokeBasic extends AbstractOmServerTest {
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserContact.java b/openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserContact.java
index 28316994b..29274a63a 100644
--- 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 @@
 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,7 +29,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.List;
 
-import org.apache.openmeetings.AbstractWicketTesterTest;
+import org.apache.openmeetings.web.AbstractWicketTesterTest;
 import org.apache.openmeetings.db.entity.user.User;
 import org.junit.jupiter.api.Test;
 
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserCount.java b/openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserCount.java
index 73957e21c..2a3b5a4e9 100644
--- 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,7 +23,7 @@ import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import org.apache.openmeetings.AbstractWicketTesterTest;
+import org.apache.openmeetings.web.AbstractWicketTesterTest;
 import org.apache.openmeetings.db.entity.user.Group;
 import org.apache.openmeetings.db.entity.user.User;
 import org.junit.jupiter.api.Test;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserGroup.java b/openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserGroup.java
index 8a8cc6bf4..b99704520 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserGroup.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserGroup.java
@@ -30,7 +30,7 @@ import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import org.apache.openmeetings.AbstractOmServerTest;
+import org.apache.openmeetings.web.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;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/userdata/TestAuth.java b/openmeetings-web/src/test/java/org/apache/openmeetings/userdata/TestAuth.java
index 749d49c6c..2b6716163 100644
--- 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,7 +22,7 @@ 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.AbstractOmServerTest;
+import org.apache.openmeetings.web.AbstractOmServerTest;
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
 import org.apache.openmeetings.db.entity.server.Sessiondata;
 import org.junit.jupiter.api.Test;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/userdata/TestLogin.java b/openmeetings-web/src/test/java/org/apache/openmeetings/userdata/TestLogin.java
index 5b905b546..3a080f80a 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/userdata/TestLogin.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/userdata/TestLogin.java
@@ -23,7 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 import java.util.Locale;
 
-import org.apache.openmeetings.AbstractOmServerTest;
+import org.apache.openmeetings.web.AbstractOmServerTest;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.util.OmException;
 import org.junit.jupiter.api.Test;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/AbstractOmServerTest.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/AbstractOmServerTest.java
similarity index 99%
rename from openmeetings-web/src/test/java/org/apache/openmeetings/AbstractOmServerTest.java
rename to openmeetings-web/src/test/java/org/apache/openmeetings/web/AbstractOmServerTest.java
index 9c471535e..fbe47be24 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/AbstractOmServerTest.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/AbstractOmServerTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings;
+package org.apache.openmeetings.web;
 
 import static java.util.UUID.randomUUID;
 import static org.apache.openmeetings.db.util.ApplicationHelper.ensureApplication;
@@ -41,8 +41,8 @@ import org.apache.openmeetings.db.entity.user.Address;
 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;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/AbstractWicketTesterTest.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/AbstractWicketTesterTest.java
similarity index 99%
rename from openmeetings-web/src/test/java/org/apache/openmeetings/AbstractWicketTesterTest.java
rename to openmeetings-web/src/test/java/org/apache/openmeetings/web/AbstractWicketTesterTest.java
index 3f2da25c9..1338fb00d 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/AbstractWicketTesterTest.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/AbstractWicketTesterTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings;
+package org.apache.openmeetings.web;
 
 import static org.apache.openmeetings.db.util.ApplicationHelper.ensureApplication;
 import static org.apache.openmeetings.web.common.OmWebSocketPanel.CONNECTED_MSG;
@@ -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 --git a/openmeetings-web/src/test/java/org/apache/openmeetings/IsolatedTest.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/IsolatedTest.java
similarity index 96%
rename from openmeetings-web/src/test/java/org/apache/openmeetings/IsolatedTest.java
rename to openmeetings-web/src/test/java/org/apache/openmeetings/web/IsolatedTest.java
index 85a526a8e..01cd846e0 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/IsolatedTest.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/IsolatedTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings;
+package org.apache.openmeetings.web;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/RegularTest.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/RegularTest.java
similarity index 96%
rename from openmeetings-web/src/test/java/org/apache/openmeetings/RegularTest.java
rename to openmeetings-web/src/test/java/org/apache/openmeetings/web/RegularTest.java
index 73a8e948e..3766a307c 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/RegularTest.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/RegularTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings;
+package org.apache.openmeetings.web;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestCalendar.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestCalendar.java
index 31d8026d3..aa41ad9c2 100644
--- 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 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 import java.time.LocalDateTime;
 import java.util.List;
 
-import org.apache.openmeetings.AbstractWicketTesterTest;
+import org.apache.openmeetings.web.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.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 --git a/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestMainAreas.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestMainAreas.java
index 09855380c..0f189264e 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestMainAreas.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestMainAreas.java
@@ -40,8 +40,7 @@ import static org.junit.jupiter.api.Assertions.fail;
 
 import java.util.function.Consumer;
 
-import org.apache.openmeetings.AbstractWicketTesterTest;
-import org.apache.openmeetings.util.OmException;
+import org.apache.openmeetings.web.AbstractWicketTesterTest;
 import org.apache.openmeetings.web.admin.backup.BackupPanel;
 import org.apache.openmeetings.web.admin.configurations.ConfigsPanel;
 import org.apache.openmeetings.web.admin.connection.ConnectionsPanel;
@@ -66,6 +65,7 @@ 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 --git a/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestMainMenu.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestMainMenu.java
index eb9cf4ebc..bd2be7d93 100644
--- 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,7 @@ package org.apache.openmeetings.web;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.apache.openmeetings.AbstractWicketTesterTest;
-import org.apache.openmeetings.util.OmException;
+import org.apache.openmeetings.web.AbstractWicketTesterTest;
 import org.apache.openmeetings.web.admin.backup.BackupPanel;
 import org.apache.openmeetings.web.admin.configurations.ConfigsPanel;
 import org.apache.openmeetings.web.admin.connection.ConnectionsPanel;
@@ -42,6 +41,7 @@ import org.apache.openmeetings.web.user.profile.UserSearchPanel;
 import org.apache.openmeetings.web.user.profile.WidgetsPanel;
 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 --git 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
index 23c477889..fe62bd0eb 100644
--- 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
@@ -28,7 +28,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map.Entry;
 
-import org.apache.openmeetings.AbstractOmServerTest;
+import org.apache.openmeetings.web.AbstractOmServerTest;
 import org.apache.openmeetings.db.dao.label.LabelDao;
 import org.junit.jupiter.api.Test;
 
diff --git 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
index c3c487caf..6b3de9c23 100644
--- 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
@@ -21,7 +21,7 @@ package org.apache.openmeetings.web.app;
 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.RegularTest;
 import org.apache.wicket.request.Url;
 import org.junit.jupiter.api.Test;
 
diff --git 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
index 66929f191..de3565101 100644
--- 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,7 +25,7 @@ import static org.junit.jupiter.api.Assertions.assertNull;
 
 import jakarta.servlet.http.Cookie;
 
-import org.apache.openmeetings.AbstractWicketTesterTest;
+import org.apache.openmeetings.web.AbstractWicketTesterTest;
 import org.apache.openmeetings.db.entity.user.User;
 import org.junit.jupiter.api.Test;
 
diff --git 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
index 6ac16bc39..a08977497 100644
--- 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
@@ -36,7 +36,7 @@ import java.io.IOException;
 import java.net.http.HttpRequest;
 import java.security.NoSuchAlgorithmException;
 
-import org.apache.openmeetings.RegularTest;
+import org.apache.openmeetings.web.RegularTest;
 import org.apache.openmeetings.db.dao.user.GroupDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.server.OAuthServer;
diff --git 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
index 0c1ab7b0c..24f5af187 100644
--- 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,7 +22,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
 
-import org.apache.openmeetings.AbstractWicketTesterTest;
+import org.apache.openmeetings.web.AbstractWicketTesterTest;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.util.OmException;
 import org.junit.jupiter.api.Test;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/AbstractTestImport.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/AbstractTestImport.java
similarity index 93%
rename from openmeetings-web/src/test/java/org/apache/openmeetings/backup/AbstractTestImport.java
rename to openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/AbstractTestImport.java
index 0b3b076f6..9b23cb45b 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/AbstractTestImport.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/AbstractTestImport.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.backup;
+package org.apache.openmeetings.web.backup;
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_CRYPT;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_PATH_FFMPEG;
@@ -26,8 +26,9 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_PATH_SOX
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getCryptClassName;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.apache.openmeetings.AbstractOmServerTest;
+import org.apache.openmeetings.backup.BackupImport;
 import org.apache.openmeetings.db.entity.basic.Configuration;
+import org.apache.openmeetings.web.AbstractOmServerTest;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestExport.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/TestExport.java
similarity index 95%
rename from openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestExport.java
rename to openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/TestExport.java
index 877c26431..8513ecb8c 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestExport.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/TestExport.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.backup;
+package org.apache.openmeetings.web.backup;
 
 import static java.util.UUID.randomUUID;
 import static org.apache.openmeetings.db.bind.Constants.FILE_LIST_NODE;
@@ -34,7 +34,8 @@ import jakarta.inject.Inject;
 import jakarta.xml.bind.JAXBContext;
 import jakarta.xml.bind.Marshaller;
 
-import org.apache.openmeetings.AbstractOmServerTest;
+import org.apache.openmeetings.web.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;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImport.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/TestImport.java
similarity index 97%
rename from openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImport.java
rename to openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/TestImport.java
index b5b125884..6ffc85f12 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImport.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/TestImport.java
@@ -16,13 +16,15 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.backup;
+package org.apache.openmeetings.web.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;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportCalendar.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/TestImportCalendar.java
similarity index 95%
rename from openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportCalendar.java
rename to openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/TestImportCalendar.java
index 8c8f36167..6fa6bfd07 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportCalendar.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/TestImportCalendar.java
@@ -16,9 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.backup;
+package org.apache.openmeetings.web.backup;
 
-import static org.apache.openmeetings.backup.TestImport.BACKUP_ROOT;
+import static org.apache.openmeetings.web.backup.TestImport.BACKUP_ROOT;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.io.File;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportConfig.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/TestImportConfig.java
similarity index 96%
rename from openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportConfig.java
rename to openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/TestImportConfig.java
index cedb67562..2f35410fb 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportConfig.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/TestImportConfig.java
@@ -16,9 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.backup;
+package org.apache.openmeetings.web.backup;
 
-import static org.apache.openmeetings.backup.TestImport.BACKUP_ROOT;
+import static org.apache.openmeetings.web.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;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportOld.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/TestImportOld.java
similarity index 97%
rename from openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportOld.java
rename to openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/TestImportOld.java
index a8a4d4363..3f4921000 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportOld.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/TestImportOld.java
@@ -16,9 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.backup;
+package org.apache.openmeetings.web.backup;
 
-import static org.apache.openmeetings.backup.TestImport.BACKUP_ROOT;
+import static org.apache.openmeetings.web.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 --git a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportRoom.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/TestImportRoom.java
similarity index 94%
rename from openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportRoom.java
rename to openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/TestImportRoom.java
index 60006b7e4..abe80b614 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportRoom.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/TestImportRoom.java
@@ -16,9 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.backup;
+package org.apache.openmeetings.web.backup;
 
-import static org.apache.openmeetings.backup.TestImport.BACKUP_ROOT;
+import static org.apache.openmeetings.web.backup.TestImport.BACKUP_ROOT;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportUser.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/TestImportUser.java
similarity index 95%
rename from openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportUser.java
rename to openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/TestImportUser.java
index 8b0270700..568e1c966 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImportUser.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/backup/TestImportUser.java
@@ -16,9 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.backup;
+package org.apache.openmeetings.web.backup;
 
-import static org.apache.openmeetings.backup.TestImport.BACKUP_ROOT;
+import static org.apache.openmeetings.web.backup.TestImport.BACKUP_ROOT;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
@@ -28,6 +28,7 @@ import java.util.List;
 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.backup.BackupException;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/cli/TestAdmin.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/cli/TestAdmin.java
similarity index 89%
rename from openmeetings-web/src/test/java/org/apache/openmeetings/cli/TestAdmin.java
rename to openmeetings-web/src/test/java/org/apache/openmeetings/web/cli/TestAdmin.java
index c7ddeefe4..5e6acdd85 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/cli/TestAdmin.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/cli/TestAdmin.java
@@ -16,23 +16,23 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.cli;
+package org.apache.openmeetings.web.cli;
 
 import static org.apache.commons.io.FileUtils.deleteQuietly;
-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.web.AbstractOmServerTest.adminUsername;
+import static org.apache.openmeetings.web.AbstractOmServerTest.email;
+import static org.apache.openmeetings.web.AbstractOmServerTest.group;
+import static org.apache.openmeetings.web.AbstractOmServerTest.setOmHome;
+import static org.apache.openmeetings.web.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.web.pages.install.TestInstall.resetH2Home;
+import static org.apache.openmeetings.web.pages.install.TestInstall.setH2Home;
 import static org.apache.openmeetings.util.OmFileHelper.getOmHome;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.DEFAULT_CONTEXT_NAME;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getWicketApplicationName;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.setInitComplete;
 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.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
 
@@ -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.IsolatedTest;
 import org.apache.wicket.Application;
 import org.apache.wicket.protocol.http.WebApplication;
 import org.junit.jupiter.api.AfterEach;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/cli/TestPatcher.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/cli/TestPatcher.java
similarity index 91%
rename from openmeetings-web/src/test/java/org/apache/openmeetings/cli/TestPatcher.java
rename to openmeetings-web/src/test/java/org/apache/openmeetings/web/cli/TestPatcher.java
index 194572cb3..d2f67459d 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/cli/TestPatcher.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/cli/TestPatcher.java
@@ -16,19 +16,20 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.cli;
+package org.apache.openmeetings.web.cli;
 
-import static org.apache.openmeetings.AbstractOmServerTest.setOmHome;
+import static org.apache.openmeetings.web.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.web.IsolatedTest;
 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.wicket.request.Url;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.mapper.parameter.PageParametersEncoder;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/db/dao/TestFileDao.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/db/dao/TestFileDao.java
similarity index 95%
rename from openmeetings-web/src/test/java/org/apache/openmeetings/db/dao/TestFileDao.java
rename to openmeetings-web/src/test/java/org/apache/openmeetings/web/db/dao/TestFileDao.java
index db8d0fb45..2edb021fb 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/db/dao/TestFileDao.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/db/dao/TestFileDao.java
@@ -16,14 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.db.dao;
+package org.apache.openmeetings.web.db.dao;
 
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 import java.util.List;
 
-import org.apache.openmeetings.AbstractOmServerTest;
+import org.apache.openmeetings.web.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;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/db/dao/TestMessageDao.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/db/dao/TestMessageDao.java
similarity index 94%
rename from openmeetings-web/src/test/java/org/apache/openmeetings/db/dao/TestMessageDao.java
rename to openmeetings-web/src/test/java/org/apache/openmeetings/web/db/dao/TestMessageDao.java
index 67a0e8b66..35625acd0 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/db/dao/TestMessageDao.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/db/dao/TestMessageDao.java
@@ -16,13 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.db.dao;
+package org.apache.openmeetings.web.db.dao;
 
 import static org.junit.jupiter.api.Assertions.assertFalse;
 
 import java.util.List;
 
-import org.apache.openmeetings.AbstractOmServerTest;
+import org.apache.openmeetings.web.AbstractOmServerTest;
 import org.apache.openmeetings.db.dao.user.PrivateMessageFolderDao;
 import org.apache.openmeetings.db.entity.user.PrivateMessageFolder;
 import org.apache.openmeetings.db.entity.user.User;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/db/dao/TestRoomDao.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/db/dao/TestRoomDao.java
similarity index 96%
rename from openmeetings-web/src/test/java/org/apache/openmeetings/db/dao/TestRoomDao.java
rename to openmeetings-web/src/test/java/org/apache/openmeetings/web/db/dao/TestRoomDao.java
index ee24c2ec4..72eaa5ff3 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/db/dao/TestRoomDao.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/db/dao/TestRoomDao.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.db.dao;
+package org.apache.openmeetings.web.db.dao;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -26,7 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import java.util.HashSet;
 import java.util.Set;
 
-import org.apache.openmeetings.AbstractOmServerTest;
+import org.apache.openmeetings.web.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;
diff --git 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
index c1e09c739..c7be79a20 100644
--- 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
@@ -30,7 +30,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import java.util.Date;
 import java.util.UUID;
 
-import org.apache.openmeetings.AbstractWicketTesterTest;
+import org.apache.openmeetings.web.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;
diff --git 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
index 7d943b116..9bccde6c8 100644
--- 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,7 +32,7 @@ import java.lang.reflect.Method;
 import java.util.List;
 import java.util.Locale;
 
-import org.apache.openmeetings.AbstractWicketTesterTest;
+import org.apache.openmeetings.web.AbstractWicketTesterTest;
 import org.apache.openmeetings.db.entity.basic.Configuration;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.web.app.WebSession;
diff --git 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
index a2f5d4155..1dc7dddf5 100644
--- 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,14 +19,14 @@
 package org.apache.openmeetings.web.pages.install;
 
 import static org.apache.commons.io.FileUtils.deleteQuietly;
-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.web.AbstractOmServerTest.adminUsername;
+import static org.apache.openmeetings.web.AbstractOmServerTest.email;
+import static org.apache.openmeetings.web.AbstractOmServerTest.group;
+import static org.apache.openmeetings.web.AbstractOmServerTest.setOmHome;
+import static org.apache.openmeetings.web.AbstractOmServerTest.userpass;
+import static org.apache.openmeetings.web.AbstractWicketTesterTest.checkErrors;
+import static org.apache.openmeetings.web.AbstractWicketTesterTest.countErrors;
+import static org.apache.openmeetings.web.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;
@@ -42,13 +42,13 @@ import java.util.Locale;
 import java.util.Random;
 import java.util.TimeZone;
 
-import org.apache.openmeetings.AbstractWicketTesterTest;
-import org.apache.openmeetings.IsolatedTest;
+import org.apache.openmeetings.web.AbstractWicketTesterTest;
+import org.apache.openmeetings.web.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.util.ConnectionProperties.DbType;
 import org.apache.wicket.ajax.AjaxClientInfoBehavior;
 import org.apache.wicket.behavior.AbstractAjaxBehavior;
 import org.apache.wicket.extensions.wizard.WizardButton;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/service/mail/template/TestEmailTemplate.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/service/mail/template/TestEmailTemplate.java
similarity index 80%
rename from openmeetings-web/src/test/java/org/apache/openmeetings/service/mail/template/TestEmailTemplate.java
rename to openmeetings-web/src/test/java/org/apache/openmeetings/web/service/mail/template/TestEmailTemplate.java
index 1476a8ba5..591176318 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/service/mail/template/TestEmailTemplate.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/service/mail/template/TestEmailTemplate.java
@@ -16,14 +16,20 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.service.mail.template;
+package org.apache.openmeetings.web.service.mail.template;
 
 import static org.junit.jupiter.api.Assertions.assertFalse;
 
-import org.apache.openmeetings.AbstractWicketTesterTest;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.UserContact;
 import org.apache.wicket.util.string.Strings;
+import org.apache.openmeetings.service.mail.template.InvitationTemplate;
+import org.apache.openmeetings.service.mail.template.FeedbackTemplate;
+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.AbstractWicketTesterTest;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/service/mail/template/subject/TestSubjTemplate.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/service/mail/template/subject/TestSubjTemplate.java
similarity index 80%
rename from openmeetings-web/src/test/java/org/apache/openmeetings/service/mail/template/subject/TestSubjTemplate.java
rename to openmeetings-web/src/test/java/org/apache/openmeetings/web/service/mail/template/subject/TestSubjTemplate.java
index e7ed63470..2bfb744fc 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/service/mail/template/subject/TestSubjTemplate.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/service/mail/template/subject/TestSubjTemplate.java
@@ -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.template.subject;
 
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -29,11 +29,19 @@ import java.util.Locale;
 import java.util.TimeZone;
 import java.util.function.Consumer;
 
-import org.apache.openmeetings.AbstractWicketTesterTest;
+import org.apache.openmeetings.web.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.SubjectEmailTemplate;
+import org.apache.openmeetings.service.mail.template.subject.CreatedAppointmentTemplate;
+import org.apache.openmeetings.service.mail.template.subject.CanceledAppointmentTemplate;
+import org.apache.openmeetings.service.mail.template.subject.UpdatedAppointmentTemplate;
+import org.apache.openmeetings.service.mail.template.subject.AppointmentReminderTemplate;
+import org.apache.openmeetings.service.mail.template.subject.RecordingExpiringTemplate;
+import org.apache.openmeetings.service.mail.template.subject.NewGroupUsersNotificationTemplate;
+import org.apache.openmeetings.service.mail.template.subject.InvitedAppointmentTemplate;
 import org.apache.wicket.util.string.Strings;
 import org.junit.jupiter.api.Test;
 
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/service/scheduler/TestJob.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/service/scheduler/TestJob.java
similarity index 95%
rename from openmeetings-web/src/test/java/org/apache/openmeetings/service/scheduler/TestJob.java
rename to openmeetings-web/src/test/java/org/apache/openmeetings/web/service/scheduler/TestJob.java
index 626c00d2e..8acbe8d21 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/service/scheduler/TestJob.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/service/scheduler/TestJob.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.service.scheduler;
+package org.apache.openmeetings.web.service.scheduler;
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_RSS;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.setInitComplete;
@@ -32,12 +32,14 @@ import java.time.ZoneId;
 import java.util.Date;
 import java.util.List;
 
-import org.apache.openmeetings.AbstractWicketTesterTest;
+import org.apache.openmeetings.web.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.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.InjectMocks;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/util/TestDateTime.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/util/TestDateTime.java
similarity index 97%
rename from openmeetings-web/src/test/java/org/apache/openmeetings/util/TestDateTime.java
rename to openmeetings-web/src/test/java/org/apache/openmeetings/web/util/TestDateTime.java
index 397d06cd5..12c619f77 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/util/TestDateTime.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/util/TestDateTime.java
@@ -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.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -29,7 +29,7 @@ import java.util.Calendar;
 import java.util.Date;
 import java.util.Locale;
 
-import org.apache.openmeetings.RegularTest;
+import org.apache.openmeetings.web.RegularTest;
 import org.apache.openmeetings.web.common.datetime.AbstractOmDateTimePicker;
 import org.junit.jupiter.api.Test;
 
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/util/TestStoredFile.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/util/TestStoredFile.java
similarity index 91%
rename from openmeetings-web/src/test/java/org/apache/openmeetings/util/TestStoredFile.java
rename to openmeetings-web/src/test/java/org/apache/openmeetings/web/util/TestStoredFile.java
index 4529a418f..f91ee9dc3 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/util/TestStoredFile.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/util/TestStoredFile.java
@@ -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,7 +25,8 @@ import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 
-import org.apache.openmeetings.AbstractOmServerTest;
+import org.apache.openmeetings.web.AbstractOmServerTest;
+import org.apache.openmeetings.util.StoredFile;
 import org.junit.jupiter.api.Test;
 
 class TestStoredFile extends AbstractOmServerTest {
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/AbstractWebServiceTest.java b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/AbstractWebServiceTest.java
index 3e40e1a2a..a05a69f92 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/AbstractWebServiceTest.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/AbstractWebServiceTest.java
@@ -19,10 +19,10 @@
 package org.apache.openmeetings.webservice;
 
 import static java.util.UUID.randomUUID;
-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.web.AbstractOmServerTest.createPass;
+import static org.apache.openmeetings.web.AbstractOmServerTest.ensureSchema;
+import static org.apache.openmeetings.web.AbstractOmServerTest.soapUsername;
+import static org.apache.openmeetings.web.AbstractOmServerTest.userpass;
 import static org.apache.openmeetings.db.util.ApplicationHelper.ensureApplication;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/CreateTomcatExtension.java b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/CreateTomcatExtension.java
index b3bc92743..b327dd57c 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
@@ -28,7 +28,7 @@ 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.AbstractOmServerTest;
 import org.junit.jupiter.api.extension.BeforeAllCallback;
 import org.junit.jupiter.api.extension.ExtensionContext;
 
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestCalendarService.java b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestCalendarService.java
index c4f6420f3..515460c4c 100644
--- 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 @@
 package org.apache.openmeetings.webservice;
 
 import static java.util.UUID.randomUUID;
-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.AbstractOmServerTest.ONE_HOUR;
+import static org.apache.openmeetings.web.AbstractOmServerTest.createPass;
+import static org.apache.openmeetings.web.AbstractOmServerTest.createUser;
+import static org.apache.openmeetings.web.AbstractOmServerTest.getAppointment;
+import static org.apache.openmeetings.web.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 @@ import java.util.List;
 import jakarta.ws.rs.core.Form;
 import jakarta.ws.rs.core.Response;
 
-import org.apache.openmeetings.AbstractOmServerTest;
+import org.apache.openmeetings.web.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;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestErrorService.java b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestErrorService.java
index 02e27cdbd..956e56e0c 100644
--- 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 @@
 package org.apache.openmeetings.webservice;
 
 import static java.util.UUID.randomUUID;
-import static org.apache.openmeetings.AbstractOmServerTest.rnd;
+import static org.apache.openmeetings.web.AbstractOmServerTest.rnd;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestFileService.java b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestFileService.java
index 2a0c97341..3b827d0da 100644
--- 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,9 +20,9 @@ package org.apache.openmeetings.webservice;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static java.util.UUID.randomUUID;
-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.apache.openmeetings.web.AbstractOmServerTest.UNIT_TEST_ARAB_EXT_TYPE;
+import static org.apache.openmeetings.web.AbstractOmServerTest.createUser;
+import static org.apache.openmeetings.web.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.assertNotNull;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestGroupService.java b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestGroupService.java
index 1c2ff2127..6df7df769 100644
--- 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 @@
  */
 package org.apache.openmeetings.webservice;
 
-import static org.apache.openmeetings.AbstractOmServerTest.adminUsername;
-import static org.apache.openmeetings.AbstractOmServerTest.userpass;
+import static org.apache.openmeetings.web.AbstractOmServerTest.adminUsername;
+import static org.apache.openmeetings.web.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 --git a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestRecordingService.java b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestRecordingService.java
index e3f7ffe21..421b8d8e8 100644
--- 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 @@
 package org.apache.openmeetings.webservice;
 
 import static java.util.UUID.randomUUID;
-import static org.apache.openmeetings.AbstractOmServerTest.getUser;
+import static org.apache.openmeetings.web.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 --git a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestUserService.java b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestUserService.java
index 932eceb94..433920b11 100644
--- 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,10 +20,10 @@ package org.apache.openmeetings.webservice;
 
 import static java.util.UUID.randomUUID;
 import static jakarta.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED;
-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.web.AbstractOmServerTest.adminUsername;
+import static org.apache.openmeetings.web.AbstractOmServerTest.createPass;
+import static org.apache.openmeetings.web.AbstractOmServerTest.rnd;
+import static org.apache.openmeetings.web.AbstractOmServerTest.userpass;
 import static org.apache.openmeetings.db.util.ApplicationHelper.ensureApplication;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -46,8 +46,8 @@ import org.apache.openmeetings.db.dto.user.ExternalUserDTO;
 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 --git a/openmeetings-webservice/pom.xml b/openmeetings-webservice/pom.xml
index fedb97db1..d1758e1e7 100644
--- a/openmeetings-webservice/pom.xml
+++ b/openmeetings-webservice/pom.xml
@@ -34,7 +34,7 @@
 	</properties>
 	<build>
 		<plugins>
-			<plugin>
+			<!--plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-javadoc-plugin</artifactId>
 				<executions>
@@ -54,7 +54,7 @@
 						<phase>generate-resources</phase>
 					</execution>
 				</executions>
-			</plugin>
+			</plugin-->
 			<plugin>
 				<groupId>io.openapitools.swagger</groupId>
 				<artifactId>swagger-maven-plugin</artifactId>
diff --git a/openmeetings-webservice/src/main/java/module-info.java b/openmeetings-webservice/src/main/java/module-info.java
index 9fa9d844d..3d62da8ca 100644
--- a/openmeetings-webservice/src/main/java/module-info.java
+++ b/openmeetings-webservice/src/main/java/module-info.java
@@ -18,15 +18,36 @@
  */
 
 module org.apache.openmeetings.webservice {
-	requires transitive org.apache.openmeetings.service;
+	exports org.apache.openmeetings.webservice.util;
 
-	requires transitive java.ws.rs;
+	requires org.apache.openmeetings.core;
+	requires org.apache.openmeetings.db;
+	requires org.apache.openmeetings.service;
+	requires org.apache.openmeetings.util;
+
+	requires org.apache.commons.lang3;
+
+	requires jakarta.annotation;
+	requires jakarta.inject;
+	requires jakarta.jws;
+	requires jakarta.servlet;
+	requires jakarta.xml.ws;
+	requires jakarta.ws.rs;
 
-	requires java.jws;
 	requires org.apache.cxf.core;
-	requires io.swagger.v3.oas.annotations;
 	requires org.apache.cxf.frontend.jaxrs;
+
 	requires org.apache.pdfbox;
+
+	requires org.apache.wicket.core;
+	requires org.apache.wicket.extensions;
+	requires org.apache.wicket.util;
+
+	requires io.swagger.v3.oas.annotations;
 	requires java.desktop;
-	requires java.xml.ws;
+
+	requires spring.beans;
+	requires spring.context;
+
+	requires org.slf4j;
 }
diff --git a/openmeetings-webservice/src/main/java/module-info.java b/openmeetings-webservice/src/test/java/module-info.test
similarity index 58%
copy from openmeetings-webservice/src/main/java/module-info.java
copy to openmeetings-webservice/src/test/java/module-info.test
index 9fa9d844d..a64ca3edc 100644
--- a/openmeetings-webservice/src/main/java/module-info.java
+++ b/openmeetings-webservice/src/test/java/module-info.test
@@ -18,15 +18,41 @@
  */
 
 module org.apache.openmeetings.webservice {
-	requires transitive org.apache.openmeetings.service;
+	// This one should be in-sync with module-info.java
+	exports org.apache.openmeetings.webservice.util;
 
-	requires transitive java.ws.rs;
+	requires org.apache.openmeetings.core;
+	requires org.apache.openmeetings.db;
+	requires org.apache.openmeetings.service;
+	requires org.apache.openmeetings.util;
+
+	requires org.apache.commons.lang3;
+
+	requires jakarta.annotation;
+	requires jakarta.inject;
+	requires jakarta.jws;
+	requires jakarta.servlet;
+	requires jakarta.xml.ws;
+	requires jakarta.ws.rs;
 
-	requires java.jws;
 	requires org.apache.cxf.core;
-	requires io.swagger.v3.oas.annotations;
 	requires org.apache.cxf.frontend.jaxrs;
+
 	requires org.apache.pdfbox;
+
+	requires org.apache.wicket.core;
+	requires org.apache.wicket.extensions;
+	requires org.apache.wicket.util;
+
+	requires io.swagger.v3.oas.annotations;
 	requires java.desktop;
-	requires java.xml.ws;
+
+	requires spring.beans;
+	requires spring.context;
+
+	requires org.slf4j;
+
+	//tests
+	requires org.junit.jupiter.engine;
+	requires org.junit.jupiter.api;
 }
diff --git a/pom.xml b/pom.xml
index 7b5a179e2..db407e748 100644
--- a/pom.xml
+++ b/pom.xml
@@ -82,7 +82,6 @@
 		<plexus-utils.version>3.5.1</plexus-utils.version>
 
 		<!-- dependency versions -->
-<<<<<<< HEAD
 		<junit.version>5.10.1</junit.version>
 		<wicket.version>10.0.0-M2</wicket.version>
 		<wicket-jquery-ui.version>10.0.0-M1</wicket-jquery-ui.version>
@@ -92,17 +91,6 @@
 		<tomcat.version>10.1.17</tomcat.version>
 		<ical4j.version>4.0.0-rc1</ical4j.version>
 		<cxf.version>4.0.3</cxf.version>
-=======
-		<junit.version>5.10.0</junit.version>
-		<wicket.version>10.0.0-M2-SNAPSHOT</wicket.version>
-		<wicket-jquery-ui.version>10.0.0-M1</wicket-jquery-ui.version>
-		<wicketstuff.version>10.0.0-M1</wicketstuff.version>
-		<wicket-bootstrap.version>7.0.0-SNAPSHOT</wicket-bootstrap.version>
-		<spring.version>6.0.11</spring.version>
-		<tomcat.version>10.1.11</tomcat.version>
-		<ical4j.version>4.0.0-beta9</ical4j.version>
-		<cxf.version>4.0.2</cxf.version>
->>>>>>> 6626e0888 ([OPENMEETINGS-2756] build is fixed; code clean-up some dependencies are updated)
 		<io.prometheus.version>0.16.0</io.prometheus.version>
 		<aspectjtools.version>1.9.21</aspectjtools.version>
 		<simple-xml.version>2.7.1</simple-xml.version>
@@ -115,6 +103,7 @@
 		<jakarta.persistence.version>3.1.0</jakarta.persistence.version>
 		<jakarta.transaction.version>2.0.1</jakarta.transaction.version>
 		<jakarta.annotation.version>2.1.1</jakarta.annotation.version>
+		<jakarta.websocket-api.version>2.1.1</jakarta.websocket-api.version>
 		<asterisk-java.version>3.39.0</asterisk-java.version>
 		<commons-lang3.version>3.14.0</commons-lang3.version>
 		<commons-dbcp.version>2.11.0</commons-dbcp.version>
@@ -668,6 +657,7 @@
 				<artifactId>wicketstuff-datastore-hazelcast</artifactId>
 				<version>${wicketstuff.version}</version>
 			</dependency>
+			<dependency>
 				<groupId>jakarta.servlet</groupId>
 				<artifactId>jakarta.servlet-api</artifactId>
 				<version>${jakarta.servlet-api.version}</version>
@@ -736,9 +726,9 @@
 				<version>${tika-parsers.version}</version>
 			</dependency>
 			<dependency>
-				<groupId>javax.websocket</groupId>
-				<artifactId>javax.websocket-api</artifactId>
-				<version>1.1</version>
+				<groupId>jakarta.websocket</groupId>
+				<artifactId>jakarta.websocket-client-api</artifactId>
+				<version>${jakarta.websocket-api.version}</version>
 				<scope>provided</scope>
 			</dependency>
 			<dependency>


(openmeetings) 27/29: [OPENMEETINGS-2756] module-info is corrected

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

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

commit d9e694f7f8c7efeea5c8a5ccdf5ca03f4f00bfd7
Author: Maxim Solodovnik <so...@apache.org>
AuthorDate: Fri Oct 13 08:30:15 2023 +0700

    [OPENMEETINGS-2756] module-info is corrected
---
 openmeetings-webservice/src/main/java/module-info.java | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/openmeetings-webservice/src/main/java/module-info.java b/openmeetings-webservice/src/main/java/module-info.java
index 54d68cb7c..8ce3aff07 100644
--- a/openmeetings-webservice/src/main/java/module-info.java
+++ b/openmeetings-webservice/src/main/java/module-info.java
@@ -26,6 +26,8 @@ module org.apache.openmeetings.webservice {
 	requires org.apache.openmeetings.util;
 
 	requires com.github.openjson;
+	requires org.apache.commons.codec;
+	requires org.apache.commons.io;
 	requires org.apache.commons.lang3;
 
 	requires jakarta.annotation;


(openmeetings) 15/29: javax.annotation -> jakarta.annotation

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

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

commit d07833f7e19eaf373c2a11cc19d561b290b00563
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Fri Jan 13 23:08:00 2023 +0700

    javax.annotation -> jakarta.annotation
---
 openmeetings-core/pom.xml                                           | 4 ++++
 .../src/main/java/org/apache/openmeetings/core/sip/SipManager.java  | 4 ++--
 .../java/org/apache/openmeetings/mediaserver/KurentoHandler.java    | 4 ++--
 .../openmeetings/service/calendar/caldav/AppointmentManager.java    | 2 +-
 .../java/org/apache/openmeetings/service/notifier/MailNotifier.java | 2 +-
 .../java/org/apache/openmeetings/service/notifier/TextNotifier.java | 2 +-
 .../src/main/java/org/apache/openmeetings/web/app/OtpManager.java   | 2 +-
 .../src/main/java/org/apache/openmeetings/web/app/TimerService.java | 2 +-
 .../java/org/apache/openmeetings/web/pages/auth/SignInPage.java     | 1 +
 .../src/main/webapp/WEB-INF/classes/applicationContext.xml          | 2 +-
 .../java/org/apache/openmeetings/webservice/NetTestWebService.java  | 2 +-
 pom.xml                                                             | 6 ++++++
 12 files changed, 22 insertions(+), 11 deletions(-)

diff --git a/openmeetings-core/pom.xml b/openmeetings-core/pom.xml
index 95ab8775b..5c3f80689 100644
--- a/openmeetings-core/pom.xml
+++ b/openmeetings-core/pom.xml
@@ -69,6 +69,10 @@
 		</plugins>
 	</build>
 	<dependencies>
+		<dependency>
+			<groupId>jakarta.annotation</groupId>
+			<artifactId>jakarta.annotation-api</artifactId>
+		</dependency>
 		<dependency>
 			<groupId>org.apache.openmeetings</groupId>
 			<artifactId>openmeetings-db</artifactId>
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/sip/SipManager.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/sip/SipManager.java
index 68358aa16..ef1a61d27 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/sip/SipManager.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/sip/SipManager.java
@@ -25,8 +25,8 @@ import java.util.BitSet;
 import java.util.Optional;
 import java.util.function.Function;
 
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
+import jakarta.annotation.PostConstruct;
+import jakarta.annotation.PreDestroy;
 
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.user.User;
diff --git a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KurentoHandler.java b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KurentoHandler.java
index 33fd09c0f..957d33abe 100644
--- a/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KurentoHandler.java
+++ b/openmeetings-mediaserver/src/main/java/org/apache/openmeetings/mediaserver/KurentoHandler.java
@@ -36,8 +36,8 @@ import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
 
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
+import jakarta.annotation.PostConstruct;
+import jakarta.annotation.PreDestroy;
 import javax.crypto.Mac;
 import javax.crypto.spec.SecretKeySpec;
 
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/AppointmentManager.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/AppointmentManager.java
index c425eb90f..f90eb26b9 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/AppointmentManager.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/AppointmentManager.java
@@ -27,7 +27,7 @@ import java.util.Collection;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
-import javax.annotation.PreDestroy;
+import jakarta.annotation.PreDestroy;
 
 import org.apache.http.HttpResponse;
 import org.apache.http.auth.AuthScope;
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/notifier/MailNotifier.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/notifier/MailNotifier.java
index 131e786f5..9649e2042 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/notifier/MailNotifier.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/notifier/MailNotifier.java
@@ -22,7 +22,7 @@ import static org.apache.openmeetings.db.util.TimezoneUtil.getTimeZone;
 
 import java.util.TimeZone;
 
-import javax.annotation.PostConstruct;
+import jakarta.annotation.PostConstruct;
 
 import org.apache.openmeetings.core.notifier.INotifier;
 import org.apache.openmeetings.core.notifier.NotifierService;
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/notifier/TextNotifier.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/notifier/TextNotifier.java
index 0dded20c0..9eea5728e 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/notifier/TextNotifier.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/notifier/TextNotifier.java
@@ -20,7 +20,7 @@ package org.apache.openmeetings.service.notifier;
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REMINDER_MESSAGE;
 
-import javax.annotation.PostConstruct;
+import jakarta.annotation.PostConstruct;
 
 import org.apache.openmeetings.core.notifier.INotifier;
 import org.apache.openmeetings.core.notifier.NotifierService;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/OtpManager.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/OtpManager.java
index 0c6abfe50..c8f1d07c2 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/OtpManager.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/OtpManager.java
@@ -24,7 +24,7 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.getApplicationN
 
 import java.net.UnknownHostException;
 
-import javax.annotation.PostConstruct;
+import jakarta.annotation.PostConstruct;
 
 import static org.apache.openmeetings.util.OmFileHelper.PNG_MIME_TYPE;
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/TimerService.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/TimerService.java
index 6b460fe3f..7e6f9bfca 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/TimerService.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/TimerService.java
@@ -27,7 +27,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Predicate;
 
-import javax.annotation.PostConstruct;
+import jakarta.annotation.PostConstruct;
 
 import org.apache.openmeetings.core.sip.SipManager;
 import org.apache.openmeetings.core.util.WebSocketHelper;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
index e3808b841..90d958acf 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
@@ -108,6 +108,7 @@ public class SignInPage extends BaseInitedPage {
 	};
 	RegisterDialog r = new RegisterDialog("register");
 	private final OtpDialog otpDialog = new OtpDialog("otpDialog", Model.of());
+
 	@Inject
 	private ConfigurationDao cfgDao;
 	@Inject
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml
index 1c50a99e0..a069c52cd 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml
@@ -39,10 +39,10 @@
 	<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
 
 	<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
-	<context:annotation-config />
 	<!-- Start annotation Prometheus metrics
 	<aop:aspectj-autoproxy/>
 	End annotation -->
+	<context:annotation-config />
 	<context:component-scan base-package="org.apache.openmeetings" />
 
 	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/NetTestWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/NetTestWebService.java
index 1db37f87c..f7a4cfb0f 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/NetTestWebService.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/NetTestWebService.java
@@ -34,7 +34,7 @@ import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.Response.Status;
 
-import javax.annotation.PostConstruct;
+import jakarta.annotation.PostConstruct;
 
 import org.apache.openmeetings.webservice.util.RateLimited;
 import org.slf4j.Logger;
diff --git a/pom.xml b/pom.xml
index 9c4832404..0d85ced06 100644
--- a/pom.xml
+++ b/pom.xml
@@ -102,6 +102,7 @@
 		<openjpa.version>3.2.2</openjpa.version>
 		<jakarta.persistence.version>3.1.0</jakarta.persistence.version>
 		<jakarta.transaction.version>2.0.1</jakarta.transaction.version>
+		<jakarta.annotation.version>2.1.1</jakarta.annotation.version>
 		<asterisk-java.version>3.39.0</asterisk-java.version>
 		<commons-lang3.version>3.14.0</commons-lang3.version>
 		<commons-dbcp.version>2.11.0</commons-dbcp.version>
@@ -833,6 +834,11 @@
 				<artifactId>jakarta.transaction-api</artifactId>
 				<version>${jakarta.transaction.version}</version>
 			</dependency>
+			<dependency>
+				<groupId>jakarta.annotation</groupId>
+				<artifactId>jakarta.annotation-api</artifactId>
+				<version>${jakarta.annotation.version}</version>
+			</dependency>
 			<dependency>
 				<groupId>org.apache.commons</groupId>
 				<artifactId>commons-dbcp2</artifactId>


(openmeetings) 23/29: Build is green

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

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

commit 8ed585358f18766ccd57684256b84bc58378facb
Author: Maxim Solodovnik <so...@apache.org>
AuthorDate: Thu Sep 28 12:28:16 2023 +0700

    Build is green
---
 openmeetings-core/src/test/java/module-info.test   |  3 +-
 openmeetings-db/src/main/java/module-info.java     |  1 +
 .../apache/openmeetings/db/dao/user/UserDao.java   |  2 +-
 openmeetings-db/src/test/java/module-info.test     |  4 +--
 .../src/test/java/module-info.test                 |  3 +-
 .../src/test/java/module-info.test                 |  3 +-
 openmeetings-util/src/test/java/module-info.test   |  4 +--
 openmeetings-web/pom.xml                           |  4 +++
 openmeetings-web/src/test/java/module-info.test    |  3 +-
 .../src/main/java/module-info.java                 |  1 +
 .../src/test/java/module-info.test                 |  4 +--
 pom.xml                                            | 37 ++++++----------------
 12 files changed, 27 insertions(+), 42 deletions(-)

diff --git a/openmeetings-core/src/test/java/module-info.test b/openmeetings-core/src/test/java/module-info.test
index b76057d82..fb0ceeb30 100644
--- a/openmeetings-core/src/test/java/module-info.test
+++ b/openmeetings-core/src/test/java/module-info.test
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-module org.apache.openmeetings.core {
+open module org.apache.openmeetings.core {
 	// This one should be in-sync with module-info.java
 	exports org.apache.openmeetings.core.converter;
 	exports org.apache.openmeetings.core.data.file;
@@ -62,6 +62,5 @@ module org.apache.openmeetings.core {
 	requires org.slf4j;
 
 	//tests
-	requires org.junit.jupiter.engine;
 	requires org.junit.jupiter.api;
 }
diff --git a/openmeetings-db/src/main/java/module-info.java b/openmeetings-db/src/main/java/module-info.java
index b31f406ef..622b7a9b0 100644
--- a/openmeetings-db/src/main/java/module-info.java
+++ b/openmeetings-db/src/main/java/module-info.java
@@ -78,5 +78,6 @@ module org.apache.openmeetings.db {
 	requires jakarta.servlet;
 	requires jakarta.xml.bind;
 
+	requires org.dom4j;
 	requires org.slf4j;
 }
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
index 9b2a51cc8..64212363e 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
@@ -598,7 +598,7 @@ public class UserDao implements IGroupAdminDataProviderDao<User> {
 	/**
 	 * login logic
 	 *
-	 * @param userOrEmail - login or email of the user being tested
+	 * @param _userOrEmail - login or email of the user being tested
 	 * @param userpass - password of the user being tested
 	 * @return User object in case of successful login
 	 * @throws OmException in case of any issue
diff --git a/openmeetings-db/src/test/java/module-info.test b/openmeetings-db/src/test/java/module-info.test
index df483e26a..fd9ed1196 100644
--- a/openmeetings-db/src/test/java/module-info.test
+++ b/openmeetings-db/src/test/java/module-info.test
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-module org.apache.openmeetings.db {
+open module org.apache.openmeetings.db {
 	// This one should be in-sync with module-info.java
 	exports org.apache.openmeetings;
 	exports org.apache.openmeetings.db.bind;
@@ -79,9 +79,9 @@ module org.apache.openmeetings.db {
 	requires jakarta.servlet;
 	requires jakarta.xml.bind;
 
+	requires org.dom4j;
 	requires org.slf4j;
 
 	//tests
-	requires org.junit.jupiter.engine;
 	requires org.junit.jupiter.api;
 }
diff --git a/openmeetings-install/src/test/java/module-info.test b/openmeetings-install/src/test/java/module-info.test
index 6625f6c4d..7841b5f3c 100644
--- a/openmeetings-install/src/test/java/module-info.test
+++ b/openmeetings-install/src/test/java/module-info.test
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-module org.apache.openmeetings.install {
+open module org.apache.openmeetings.install {
 	// This one should be in-sync with module-info.java
 	exports org.apache.openmeetings.backup;
 	exports org.apache.openmeetings.cli;
@@ -53,6 +53,5 @@ module org.apache.openmeetings.install {
 	requires org.slf4j;
 
 	//tests
-	requires org.junit.jupiter.engine;
 	requires org.junit.jupiter.api;
 }
diff --git a/openmeetings-mediaserver/src/test/java/module-info.test b/openmeetings-mediaserver/src/test/java/module-info.test
index 5f839623c..3234ebb9b 100644
--- a/openmeetings-mediaserver/src/test/java/module-info.test
+++ b/openmeetings-mediaserver/src/test/java/module-info.test
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-module org.apache.openmeetings.mediaserver {
+open module org.apache.openmeetings.mediaserver {
 	// This one should be in-sync with module-info.java
 	exports org.apache.openmeetings.mediaserver;
 
@@ -47,6 +47,5 @@ module org.apache.openmeetings.mediaserver {
 	requires org.slf4j;
 
 	//tests
-	requires org.junit.jupiter.engine;
 	requires org.junit.jupiter.api;
 }
diff --git a/openmeetings-util/src/test/java/module-info.test b/openmeetings-util/src/test/java/module-info.test
index c064884ae..3ea1b258b 100644
--- a/openmeetings-util/src/test/java/module-info.test
+++ b/openmeetings-util/src/test/java/module-info.test
@@ -51,6 +51,6 @@ open module org.apache.openmeetings.util {
 	requires ch.qos.logback.core;
 
 	//tests
-	requires org.junit.jupiter.engine;
-	requires org.junit.jupiter.api;
+	requires transitive org.junit.jupiter.engine;
+	requires transitive org.junit.jupiter.api;
 }
diff --git a/openmeetings-web/pom.xml b/openmeetings-web/pom.xml
index dda3a619f..5cc6c4d42 100644
--- a/openmeetings-web/pom.xml
+++ b/openmeetings-web/pom.xml
@@ -493,6 +493,10 @@
 			<artifactId>cxf-rt-rs-client</artifactId>
 			<scope>test</scope>
 		</dependency>
+		<dependency>
+			<groupId>jakarta.annotation</groupId>
+			<artifactId>jakarta.annotation-api</artifactId>
+		</dependency>
 		<dependency>
 			<groupId>jakarta.websocket</groupId>
 			<artifactId>jakarta.websocket-client-api</artifactId>
diff --git a/openmeetings-web/src/test/java/module-info.test b/openmeetings-web/src/test/java/module-info.test
index 2873bcb6b..428ba6791 100644
--- a/openmeetings-web/src/test/java/module-info.test
+++ b/openmeetings-web/src/test/java/module-info.test
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-module org.apache.openmeetings.web {
+open module org.apache.openmeetings.web {
 	// This one should be in-sync with module-info.java
 	requires org.apache.openmeetings.core;
 	requires org.apache.openmeetings.db;
@@ -88,6 +88,5 @@ module org.apache.openmeetings.web {
 	requires org.slf4j;
 
 	//tests
-	requires org.junit.jupiter.engine;
 	requires org.junit.jupiter.api;
 }
diff --git a/openmeetings-webservice/src/main/java/module-info.java b/openmeetings-webservice/src/main/java/module-info.java
index 3d62da8ca..54d68cb7c 100644
--- a/openmeetings-webservice/src/main/java/module-info.java
+++ b/openmeetings-webservice/src/main/java/module-info.java
@@ -25,6 +25,7 @@ module org.apache.openmeetings.webservice {
 	requires org.apache.openmeetings.service;
 	requires org.apache.openmeetings.util;
 
+	requires com.github.openjson;
 	requires org.apache.commons.lang3;
 
 	requires jakarta.annotation;
diff --git a/openmeetings-webservice/src/test/java/module-info.test b/openmeetings-webservice/src/test/java/module-info.test
index a64ca3edc..d1c1fe2b3 100644
--- a/openmeetings-webservice/src/test/java/module-info.test
+++ b/openmeetings-webservice/src/test/java/module-info.test
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-module org.apache.openmeetings.webservice {
+open module org.apache.openmeetings.webservice {
 	// This one should be in-sync with module-info.java
 	exports org.apache.openmeetings.webservice.util;
 
@@ -26,6 +26,7 @@ module org.apache.openmeetings.webservice {
 	requires org.apache.openmeetings.service;
 	requires org.apache.openmeetings.util;
 
+	requires com.github.openjson;
 	requires org.apache.commons.lang3;
 
 	requires jakarta.annotation;
@@ -53,6 +54,5 @@ module org.apache.openmeetings.webservice {
 	requires org.slf4j;
 
 	//tests
-	requires org.junit.jupiter.engine;
 	requires org.junit.jupiter.api;
 }
diff --git a/pom.xml b/pom.xml
index 79623a2c3..814637c1d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -463,8 +463,8 @@
 				<version>${spring.version}</version>
 				<exclusions>
 					<exclusion>
-						<groupId>commons-logging</groupId>
-						<artifactId>commons-logging</artifactId>
+						<groupId>org.springframework</groupId>
+						<artifactId>spring-jcl</artifactId>
 					</exclusion>
 				</exclusions>
 			</dependency>
@@ -472,45 +472,21 @@
 				<groupId>org.springframework</groupId>
 				<artifactId>spring-context</artifactId>
 				<version>${spring.version}</version>
-				<exclusions>
-					<exclusion>
-						<groupId>commons-logging</groupId>
-						<artifactId>commons-logging</artifactId>
-					</exclusion>
-				</exclusions>
 			</dependency>
 			<dependency>
 				<groupId>org.springframework</groupId>
 				<artifactId>spring-context-support</artifactId>
 				<version>${spring.version}</version>
-				<exclusions>
-					<exclusion>
-						<groupId>commons-logging</groupId>
-						<artifactId>commons-logging</artifactId>
-					</exclusion>
-				</exclusions>
 			</dependency>
 			<dependency>
 				<groupId>org.springframework</groupId>
 				<artifactId>spring-orm</artifactId>
 				<version>${spring.version}</version>
-				<exclusions>
-					<exclusion>
-						<groupId>commons-logging</groupId>
-						<artifactId>commons-logging</artifactId>
-					</exclusion>
-				</exclusions>
 			</dependency>
 			<dependency>
 				<groupId>org.springframework</groupId>
 				<artifactId>spring-aop</artifactId>
 				<version>${spring.version}</version>
-				<exclusions>
-					<exclusion>
-						<groupId>commons-logging</groupId>
-						<artifactId>commons-logging</artifactId>
-					</exclusion>
-				</exclusions>
 			</dependency>
 			<dependency>
 				<groupId>org.springframework</groupId>
@@ -531,6 +507,12 @@
 				<groupId>org.mnode.ical4j</groupId>
 				<artifactId>ical4j</artifactId>
 				<version>${ical4j.version}</version>
+				<exclusions>
+					<exclusion>
+						<groupId>commons-logging</groupId>
+						<artifactId>commons-logging</artifactId>
+					</exclusion>
+				</exclusions>
 			</dependency>
 			<dependency>
 				<groupId>org.apache.cxf</groupId>
@@ -1285,7 +1267,6 @@
 					<configuration>
 						<forkCount>1</forkCount>
 						<reuseForks>true</reuseForks>
-						<useModulePath>false</useModulePath>
 						<excludedGroups>${excluded.test.groups}</excludedGroups>
 						<includes>
 							<include>**/Test*.java</include>
@@ -1293,6 +1274,8 @@
 						<excludes>
 							<exclude/>
 						</excludes>
+						<useModulePath>false</useModulePath>
+						<!--argLine>-Xint ${argLine}</argLine-->
 						<argLine>@{argLine} --add-modules java.se --add-exports java.base/jdk.internal.ref=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.management/sun.management=ALL-UNNAMED --add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens=java.base/sun.security.util=ALL-UNNAMED --add-opens=java.base/sun.security.x509=A [...]
 					</configuration>
 				</plugin>