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/24 03:07:44 UTC

(openmeetings) branch master updated: [OPENMEETINGS-2756] Moving to Tomcat 10, Jetty 11, Spring 6 etc. (#191)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new e438264c2 [OPENMEETINGS-2756] Moving to Tomcat 10, Jetty 11, Spring 6 etc. (#191)
e438264c2 is described below

commit e438264c2c9baa8f34f882e8a4445fc997e3d08e
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Sun Dec 24 10:07:38 2023 +0700

    [OPENMEETINGS-2756] Moving to Tomcat 10, Jetty 11, Spring 6 etc. (#191)
    
    * no jira: project is partially converted to use java11 modules
    
    * Simple-xml is dropped
    
    * OpenJpa modules were changed
    
    * some compilation errors are resolved
    
    * Another attempt to fix the build
    
    * Some more work on modules
    
    * The build is green
    
    * Code clean-up
    
    * Build fixed
    
    * More work on JPMS
    
    * no jira: unmerged file is fixed
    
    * Some minor (incomplete) JPMS changes
    
    * [OPENMEETINGS-2756] spring, cxf, tomcat, wicket
    
    * Project is compilable, tests are RED
    
    * javax.annotation -> jakarta.annotation
    
    * [OPENMEETINGS-2756] build is green for me; trublemakers so far: wicket-ioc, prometheus, jackrabbit-webdav
    
    * [OPENMEETINGS-2756] prometheus is back, code clean-up
    
    * [OPENMEETINGS-2756] jackrabbit-webdav maven coordinates are updated, bcprov is updated
    
    * [OPENMEETINGS-2756] build is fixed; code clean-up some dependencies are updated
    
    * [OPENMEETINGS-2756] JPMS branch is merged into this one
    
    * [OPENMEETINGS-2756] property name is updated
    
    * [OPENMEETINGS-2756] audio/video is fixed; version is bumped
    
    * Build is green
    
    * [OPENMEETINGS-2756] custom-mimetypes.xml is moved to be searchable by Tika-3
    
    * [OPENMEETINGS-2756] modules are restructured to remove 'test-jar'; Prometheus is updated to 1.0.0
    
    * [OPENMEETINGS-2756] javadocs are fixed
    
    * [OPENMEETINGS-2756] module-info is corrected
    
    * [OPENMEETINGS-2756] dependencies are aligned to wicket-M2
    
    * [OPENMEETINGS-2756] the build seems to be fixed
---
 LICENSE                                            |  397 -----
 openmeetings-core/pom.xml                          |   40 +-
 openmeetings-core/src/main/java/module-info.java   |   62 +
 .../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 +-
 .../apache/openmeetings/core/sip/SipManager.java   |    4 +-
 .../openmeetings/core/util/WebSocketHelper.java    |    2 +-
 openmeetings-db/pom.xml                            |   30 +-
 openmeetings-db/src/main/java/module-info.java     |   83 ++
 .../java/org/apache/openmeetings/IApplication.java |    4 +-
 .../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 +-
 .../apache/openmeetings/db/dao/label/LabelDao.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   |   18 +-
 .../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 +-
 .../openmeetings/db/entity/basic/Client.java       |    2 +-
 .../db/entity/basic/Configuration.java             |   38 +-
 .../openmeetings/db/entity/basic/IWsClient.java    |    2 +-
 .../openmeetings/db/entity/basic/MailMessage.java  |   20 +-
 .../openmeetings/db/entity/basic/WsClient.java     |    2 +-
 .../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       |   26 +-
 .../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 +-
 .../openmeetings/db/util/ApplicationHelper.java    |   12 +-
 .../org/apache/openmeetings/db/util/DaoHelper.java |   20 +-
 openmeetings-install/pom.xml                       |   16 +-
 .../src/main/java/module-info.java                 |   54 +-
 .../apache/openmeetings/backup/BackupExport.java   |   46 +-
 .../apache/openmeetings/backup/BackupImport.java   |   91 +-
 .../apache/openmeetings/backup/BackupVersion.java  |   10 +-
 .../java/org/apache/openmeetings/cli/Admin.java    |    5 +-
 .../installation/ImportInitvalues.java             |   16 +-
 openmeetings-mediaserver/pom.xml                   |   11 +-
 .../src/main/java/module-info.java                 |   42 +-
 .../org/apache/openmeetings/mediaserver/KRoom.java |    4 +-
 .../apache/openmeetings/mediaserver/KStream.java   |    2 +-
 .../openmeetings/mediaserver/KTestStream.java      |    2 +-
 .../openmeetings/mediaserver/KurentoHandler.java   |   58 +-
 .../openmeetings/mediaserver/StreamProcessor.java  |   36 +-
 .../mediaserver/StreamProcessorActions.java        |   15 +-
 .../mediaserver/TestStreamProcessor.java           |   15 +-
 .../openmeetings/mediaserver/BaseMockedTest.java   |    2 +-
 openmeetings-screenshare/pom.xml                   |    4 +-
 openmeetings-server/pom.xml                        |    4 +-
 .../src/main/assembly/conf/context.xml             |    5 +-
 .../src/main/assembly/conf/server.xml              |   50 +-
 openmeetings-server/src/main/assembly/conf/web.xml |   27 +-
 .../src/site/xdoc/BuildInstructions.xml            |    6 +-
 openmeetings-service/pom.xml                       |    7 +-
 .../src/main/java/module-info.java                 |   61 +
 .../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 +
 .../service/calendar/AppointmentLogic.java         |   10 +-
 .../calendar/caldav/AppointmentManager.java        |   16 +-
 .../service/calendar/caldav/IcalUtils.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/service/mail/EmailManager.java    |    6 +-
 .../mail/template/AbstractTemplatePage.java        |    5 +-
 .../subject/AppointmentReminderTemplate.java       |    2 +-
 .../mail/template/subject/AppointmentTemplate.java |    2 +-
 .../subject/CanceledAppointmentTemplate.java       |    2 +-
 .../subject/CreatedAppointmentTemplate.java        |    2 +-
 .../subject/InvitedAppointmentTemplate.java        |    2 +-
 .../subject/RecordingExpiringTemplate.java         |    5 +-
 .../subject/UpdatedAppointmentTemplate.java        |    2 +-
 .../service/notifier/MailNotifier.java             |   10 +-
 .../service/notifier/TextNotifier.java             |   12 +-
 .../service/room/InvitationManager.java            |    8 +-
 .../service/scheduler/AbstractJob.java             |    8 +-
 .../openmeetings/service/scheduler/CleanupJob.java |   10 +-
 .../service/scheduler/ReminderJob.java             |   18 +-
 .../apache/jackrabbit/webdav/statuscode.properties |   62 +
 .../pom.xml                                        |   30 +-
 .../src/main/java/module-info.java                 |    7 +-
 .../apache/openmeetings/test/NonJenkinsTest.java   |    0
 openmeetings-util/pom.xml                          |   21 +-
 openmeetings-util/src/main/java/module-info.java   |   53 +
 .../openmeetings/util/OMContextListener.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/process/ProcessHelper.java   |    2 +-
 .../apache/tika/mime => }/custom-mimetypes.xml     |    0
 openmeetings-web/pom.xml                           |   35 +-
 openmeetings-web/src/main/java/module-info.java    |   90 ++
 .../web/admin/AdminUserChoiceProvider.java         |    6 +-
 .../openmeetings/web/admin/backup/BackupPanel.java |    4 +-
 .../backup/BackupUploadResourceReference.java      |   16 +-
 .../web/admin/configurations/ConfigForm.java       |    8 +-
 .../web/admin/configurations/ConfigsPanel.java     |    5 +-
 .../web/admin/connection/ConnectionsPanel.java     |    9 +-
 .../openmeetings/web/admin/email/EmailForm.java    |    5 +-
 .../openmeetings/web/admin/extra/ExtraForm.java    |    7 +-
 .../openmeetings/web/admin/extra/ExtraPanel.java   |    2 +-
 .../openmeetings/web/admin/groups/GroupForm.java   |   16 +-
 .../web/admin/groups/GroupUsersPanel.java          |    5 +-
 .../openmeetings/web/admin/groups/GroupsPanel.java |    2 +-
 .../openmeetings/web/admin/labels/LangPanel.java   |    2 +-
 .../openmeetings/web/admin/ldaps/LdapForm.java     |    6 +-
 .../openmeetings/web/admin/oauth/OAuthForm.java    |    4 +-
 .../openmeetings/web/admin/rooms/RoomForm.java     |   15 +-
 .../openmeetings/web/admin/rooms/RoomsPanel.java   |    6 +-
 .../web/admin/users/PasswordDialog.java            |    5 +-
 .../openmeetings/web/admin/users/UserForm.java     |   17 +-
 .../openmeetings/web/admin/users/UsersPanel.java   |    7 +-
 .../apache/openmeetings/web/app/Application.java   |   36 +-
 .../apache/openmeetings/web/app/ClientManager.java |   11 +-
 .../apache/openmeetings/web/app/OtpManager.java    |    5 +-
 .../apache/openmeetings/web/app/TimerService.java  |   14 +-
 .../apache/openmeetings/web/app/UserManager.java   |   18 +-
 .../apache/openmeetings/web/app/WebSession.java    |   29 +-
 .../openmeetings/web/app/WhiteboardManager.java    |    8 +-
 .../openmeetings/web/common/GeneralUserForm.java   |   10 +-
 .../web/common/GroupChoiceProvider.java            |    8 +-
 .../openmeetings/web/common/InvitationForm.java    |   10 +-
 .../apache/openmeetings/web/common/MainPanel.java  |   14 +-
 .../openmeetings/web/common/OmWebSocketPanel.java  |    6 +-
 .../openmeetings/web/common/ProfileImagePanel.java |    6 +-
 .../web/common/UploadableImagePanel.java           |    2 +-
 .../web/common/UploadableProfileImagePanel.java    |    8 +-
 .../web/common/tree/ConvertingErrorsDialog.java    |    4 +-
 .../web/common/tree/FileItemPanel.java             |    6 +-
 .../web/common/tree/FileTreePanel.java             |   18 +-
 .../openmeetings/web/common/tree/FolderPanel.java  |    8 +-
 .../web/common/tree/OmTreeProvider.java            |   12 +-
 .../web/common/upload/UploadResourceReference.java |    8 +-
 .../openmeetings/web/pages/ActivatePage.java       |    6 +-
 .../apache/openmeetings/web/pages/BasePage.java    |    2 +-
 .../apache/openmeetings/web/pages/HashPage.java    |    7 +-
 .../apache/openmeetings/web/pages/ResetPage.java   |    5 +-
 .../web/pages/auth/ForgetPasswordDialog.java       |    9 +-
 .../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  |   20 +-
 .../openmeetings/web/pages/auth/SignInPage.java    |    8 +-
 .../web/pages/install/InstallWizard.java           |   13 +-
 .../web/room/GroupCustomCssResourceReference.java  |    2 +-
 .../openmeetings/web/room/NicknameDialog.java      |    6 +-
 .../apache/openmeetings/web/room/RoomPanel.java    |   23 +-
 .../web/room/RoomResourceReference.java            |   13 +-
 .../web/room/activities/ActivitiesPanel.java       |    7 +-
 .../openmeetings/web/room/menu/ActionsSubMenu.java |    9 +-
 .../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  |   24 +-
 .../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            |   11 +-
 .../sidebar/RoomFileUploadResourceReference.java   |   19 +-
 .../openmeetings/web/room/sidebar/RoomSidebar.java |    6 +-
 .../web/room/sidebar/RoomUploadForm.java           |    2 +-
 .../openmeetings/web/room/wb/InterviewWbPanel.java |    7 +-
 .../apache/openmeetings/web/room/wb/WbPanel.java   |   17 +-
 .../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 +-
 .../web/user/InviteUserMessageDialog.java          |    8 +-
 .../web/user/InviteUserToRoomDialog.java           |    8 +-
 .../openmeetings/web/user/MessageDialog.java       |   20 +-
 .../openmeetings/web/user/UserInfoDialog.java      |    8 +-
 .../web/user/calendar/AppointmentDialog.java       |   16 +-
 .../web/user/calendar/CalendarDialog.java          |    8 +-
 .../web/user/calendar/CalendarPanel.java           |    9 +-
 .../apache/openmeetings/web/user/chat/Chat.java    |   16 +-
 .../openmeetings/web/user/chat/ChatForm.java       |   12 +-
 .../openmeetings/web/user/chat/ChatToolbar.java    |    9 +-
 .../web/user/dashboard/MyRoomsWidgetView.java      |    7 +-
 .../web/user/dashboard/RecentRoomsWidgetView.java  |    7 +-
 .../web/user/dashboard/WelcomeWidgetView.java      |    9 +-
 .../dashboard/admin/AdminCleanupInfoDialog.java    |   12 +-
 .../web/user/profile/ChangePasswordDialog.java     |    6 +-
 .../web/user/profile/EditProfileForm.java          |    5 +-
 .../web/user/profile/InvitationDetails.java        |    6 +-
 .../web/user/profile/InvitationsPanel.java         |    2 +-
 .../web/user/profile/MessagesContactsPanel.java    |   16 +-
 .../web/user/profile/ToggleOtpDialog.java          |    7 +-
 .../web/user/profile/UserProfilePanel.java         |    9 +-
 .../web/user/profile/UserSearchPanel.java          |   12 +-
 .../web/user/profile/WidgetsPanel.java             |   11 +-
 .../web/user/record/RecordingInvitationForm.java   |    7 +-
 .../user/record/RecordingResourceReference.java    |   11 +-
 .../web/user/record/RecordingsPanel.java           |   13 +-
 .../openmeetings/web/user/record/VideoInfo.java    |    7 +-
 .../openmeetings/web/user/rooms/RoomListPanel.java |    8 +-
 .../openmeetings/web/user/rooms/RoomsPanel.java    |   13 +-
 .../web/user/rooms/RoomsSelectorPanel.java         |   11 +-
 .../web/user/rooms/RoomsTabbedPanel.java           |    8 +-
 .../web/util/FileItemResourceReference.java        |    8 +-
 .../web/util/GroupLogoResourceReference.java       |   14 +-
 .../web/util/ProfileImageResourceReference.java    |   16 +-
 .../openmeetings/web/util/UserChoiceProvider.java  |    7 +-
 .../web/util/UserDashboardPersister.java           |    2 +-
 .../util/logging/OpenMeetingsMetricsServlet.java   |   20 +-
 .../web/util/logging/TomcatGenericExports.java     |  324 ----
 .../openmeetings/web/util/logging/TomcatStats.java |  314 ++++
 .../WEB-INF/classes/META-INF/h2_persistence.xml    |    4 +-
 .../webapp/WEB-INF/classes/applicationContext.xml  |    4 +-
 openmeetings-web/src/main/webapp/WEB-INF/web.xml   |   56 +-
 .../calendar/TestAppointmentAddAppointment.java    |   10 +-
 .../calendar/TestAppointmentSchedulerTask.java     |    8 +-
 .../calendar/TestDatabaseStructureAppointment.java |    2 +-
 ...TestDatabaseStructureGetAppointmentByRange.java |    2 +-
 .../openmeetings/calendar/TestGetAppointment.java  |    8 +-
 .../openmeetings/calendar/TestOmCalendar.java      |    8 +-
 .../openmeetings/calendar/TestSendIcalMessage.java |    7 +-
 .../org/apache/openmeetings/config/TestConfig.java |    2 +-
 .../openmeetings/core/file/TestFileProcessor.java  |    8 +-
 .../apache/openmeetings/domain/TestAddGroup.java   |    2 +-
 .../domain/TestUserGroupAggregation.java           |    2 +-
 .../openmeetings/invitiation/TestInvitation.java   |   12 +-
 .../org/apache/openmeetings/ldap/TestLdap.java     |    9 +-
 .../apache/openmeetings/smoke/TestSmokeBasic.java  |    2 +-
 .../apache/openmeetings/user/TestUserContact.java  |    4 +-
 .../apache/openmeetings/user/TestUserCount.java    |    2 +-
 .../apache/openmeetings/user/TestUserGroup.java    |    8 +-
 .../org/apache/openmeetings/userdata/TestAuth.java |    8 +-
 .../apache/openmeetings/userdata/TestLogin.java    |    2 +-
 .../{ => web}/AbstractOmServerTest.java            |   20 +-
 .../{ => web}/AbstractWicketTesterTest.java        |    6 +-
 .../openmeetings/{ => web}/IsolatedTest.java       |    2 +-
 .../apache/openmeetings/{ => web}/RegularTest.java |    2 +-
 .../org/apache/openmeetings/web/TestCalendar.java  |    3 +-
 .../org/apache/openmeetings/web/TestMainAreas.java |    3 +-
 .../org/apache/openmeetings/web/TestMainMenu.java  |    3 +-
 .../openmeetings/web/app/TestApplication.java      |    2 +-
 .../web/app/TestApplicationMocked.java             |    2 +-
 .../web/app/TestOmAuthenticationStrategy.java      |    4 +-
 .../web/app/TestUserManagerMocked.java             |    2 +-
 .../openmeetings/web/app/TestWebSession.java       |    2 +-
 .../{ => web}/backup/AbstractTestImport.java       |   11 +-
 .../openmeetings/{ => web}/backup/TestExport.java  |   23 +-
 .../openmeetings/{ => web}/backup/TestImport.java  |   20 +-
 .../{ => web}/backup/TestImportCalendar.java       |   12 +-
 .../{ => web}/backup/TestImportConfig.java         |    4 +-
 .../{ => web}/backup/TestImportOld.java            |   14 +-
 .../{ => web}/backup/TestImportRoom.java           |   10 +-
 .../{ => web}/backup/TestImportUser.java           |   11 +-
 .../openmeetings/{ => web}/cli/TestAdmin.java      |   20 +-
 .../openmeetings/{ => web}/cli/TestPatcher.java    |    9 +-
 .../openmeetings/{ => web}/db/dao/TestFileDao.java |   12 +-
 .../{ => web}/db/dao/TestMessageDao.java           |    4 +-
 .../openmeetings/{ => web}/db/dao/TestRoomDao.java |   10 +-
 .../openmeetings/web/pages/TestHashPage.java       |   13 +-
 .../openmeetings/web/pages/auth/TestLoginUI.java   |    2 +-
 .../web/pages/install/TestInstall.java             |   22 +-
 .../service/mail/template/TestEmailTemplate.java   |   10 +-
 .../mail/template/subject/TestSubjTemplate.java    |   14 +-
 .../{ => web}/service/scheduler/TestJob.java       |   14 +-
 .../openmeetings/{ => web}/util/TestDateTime.java  |    4 +-
 .../{ => web}/util/TestStoredFile.java             |    5 +-
 .../webservice/AbstractWebServiceTest.java         |   19 +-
 .../webservice/CreateTomcatExtension.java          |    2 +-
 .../webservice/TestCalendarService.java            |   16 +-
 .../openmeetings/webservice/TestErrorService.java  |    4 +-
 .../openmeetings/webservice/TestFileService.java   |    6 +-
 .../openmeetings/webservice/TestGroupService.java  |   12 +-
 .../webservice/TestRecordingService.java           |    2 +-
 .../openmeetings/webservice/TestUserService.java   |   16 +-
 openmeetings-web/src/test/jetty/web.xml            |    6 +-
 openmeetings-webservice/pom.xml                    |   16 +-
 .../src/main/java/module-info.java                 |   56 +
 .../openmeetings/webservice/BaseWebService.java    |   12 +-
 .../webservice/CalendarWebService.java             |   31 +-
 .../openmeetings/webservice/ErrorWebService.java   |   20 +-
 .../openmeetings/webservice/FileWebService.java    |   29 +-
 .../openmeetings/webservice/GroupWebService.java   |   29 +-
 .../openmeetings/webservice/InfoWebService.java    |   12 +-
 .../openmeetings/webservice/NetTestWebService.java |   21 +-
 .../webservice/RecordingWebService.java            |   25 +-
 .../openmeetings/webservice/RoomWebService.java    |   37 +-
 .../openmeetings/webservice/UserWebService.java    |   35 +-
 .../openmeetings/webservice/WbWebService.java      |   30 +-
 .../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                                            |  271 ++--
 584 files changed, 29727 insertions(+), 2906 deletions(-)

diff --git a/LICENSE b/LICENSE
index 036575ded..dfbefde55 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:
 
@@ -1472,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 ee4621d5a..2339024c3 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>
@@ -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>
@@ -52,24 +51,16 @@
 						<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>
 		</plugins>
 	</build>
 	<dependencies>
+		<dependency>
+			<groupId>jakarta.annotation</groupId>
+			<artifactId>jakarta.annotation-api</artifactId>
+		</dependency>
 		<dependency>
 			<groupId>org.apache.openmeetings</groupId>
 			<artifactId>openmeetings-db</artifactId>
@@ -90,10 +81,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>
@@ -114,27 +101,10 @@
 			<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>
-		<dependency>
-			<groupId>javax.annotation</groupId>
-			<artifactId>javax.annotation-api</artifactId>
-		</dependency>
 		<!-- Test dependencies -->
 		<dependency>
 			<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/main/java/module-info.java b/openmeetings-core/src/main/java/module-info.java
new file mode 100644
index 000000000..2bf323ec7
--- /dev/null
+++ b/openmeetings-core/src/main/java/module-info.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.
+ */
+
+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 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 transitive org.apache.openmeetings.db;
+	requires transitive 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;
+}
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-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-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-db/pom.xml b/openmeetings-db/pom.xml
index 5a6d49460..dc4227624 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>
@@ -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>
@@ -43,13 +42,30 @@
 			<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>jakarta.annotation</groupId>
+			<artifactId>jakarta.annotation-api</artifactId>
 		</dependency>
 		<dependency>
 			<groupId>org.springframework</groupId>
@@ -96,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>
@@ -123,7 +132,6 @@
 						<goals>
 							<goal>javadoc-no-fork</goal>
 						</goals>
-						<phase>generate-resources</phase>
 					</execution>
 				</executions>
 			</plugin>
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..592e04f20
--- /dev/null
+++ b/openmeetings-db/src/main/java/module-info.java
@@ -0,0 +1,83 @@
+/*
+ * 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.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;
+	exports org.apache.openmeetings.db.dao.file;
+	exports org.apache.openmeetings.db.dao.label;
+	exports org.apache.openmeetings.db.dao.log;
+	exports org.apache.openmeetings.db.dao.record;
+	exports org.apache.openmeetings.db.dao.room;
+	exports org.apache.openmeetings.db.dao.server;
+	exports org.apache.openmeetings.db.dao.user;
+	exports org.apache.openmeetings.db.dto.basic;
+	exports org.apache.openmeetings.db.dto.calendar;
+	exports org.apache.openmeetings.db.dto.file;
+	exports org.apache.openmeetings.db.dto.record;
+	exports org.apache.openmeetings.db.dto.room;
+	exports org.apache.openmeetings.db.dto.user;
+	exports org.apache.openmeetings.db.entity;
+	exports org.apache.openmeetings.db.entity.basic;
+	exports org.apache.openmeetings.db.entity.calendar;
+	exports org.apache.openmeetings.db.entity.file;
+	exports org.apache.openmeetings.db.entity.label;
+	exports org.apache.openmeetings.db.entity.log;
+	exports org.apache.openmeetings.db.entity.record;
+	exports org.apache.openmeetings.db.entity.room;
+	exports org.apache.openmeetings.db.entity.server;
+	exports org.apache.openmeetings.db.entity.user;
+	exports org.apache.openmeetings.db.manager;
+	exports org.apache.openmeetings.db.mapper;
+	exports org.apache.openmeetings.db.util;
+	exports org.apache.openmeetings.db.util.ws;
+
+	requires transitive com.github.openjson;
+
+	requires org.apache.commons.lang3;
+	requires org.apache.commons.text;
+
+	requires org.apache.openjpa;
+
+	requires transitive 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 transitive jakarta.persistence;
+	requires jakarta.servlet;
+	requires jakarta.xml.bind;
+
+	requires org.dom4j;
+	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 d078f2945..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,8 +22,8 @@ import java.util.Locale;
 import java.util.Set;
 import java.util.function.Supplier;
 
-import javax.annotation.Nonnull;
-import javax.servlet.ServletContext;
+import jakarta.annotation.Nonnull;
+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/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/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-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..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
@@ -44,14 +44,14 @@ 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.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;
@@ -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/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/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/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/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/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/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/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..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
@@ -22,19 +22,19 @@ 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.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.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/ApplicationHelper.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ApplicationHelper.java
index d63c6c20a..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;
@@ -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-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/pom.xml b/openmeetings-install/pom.xml
index fd53d4ad0..4b563bab0 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>
@@ -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>
@@ -54,18 +53,5 @@
 			<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>
-			<version>${project.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
 	</dependencies>
 </project>
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/basic/Info.java b/openmeetings-install/src/main/java/module-info.java
similarity index 50%
copy from openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/basic/Info.java
copy to openmeetings-install/src/main/java/module-info.java
index cd31c4a24..2ee926d43 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/basic/Info.java
+++ b/openmeetings-install/src/main/java/module-info.java
@@ -16,39 +16,39 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.db.dto.basic;
 
-import java.io.Serializable;
+module org.apache.openmeetings.install {
+	exports org.apache.openmeetings.backup;
+	exports org.apache.openmeetings.cli;
+	exports org.apache.openmeetings.installation;
 
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlRootElement;
+	requires com.github.openjson;
 
-import org.apache.openmeetings.util.OmVersion;
+	requires org.apache.commons.cli;
+	requires org.apache.commons.io;
+	requires org.apache.commons.lang3;
+	requires org.apache.commons.text;
 
-@XmlRootElement
-@XmlAccessorType(XmlAccessType.FIELD)
-public class Info implements Serializable {
-	private static final long serialVersionUID = 1L;
-	private final String version;
-	private final String revision;
-	private final String buildDate;
+	requires org.apache.openjpa;
 
-	public Info() {
-		version = OmVersion.getVersion();
-		revision = OmVersion.getRevision();
-		buildDate = OmVersion.getBuildDate();
-	}
+	requires org.apache.openmeetings.core;
+	requires transitive org.apache.openmeetings.db;
+	requires org.apache.openmeetings.util;
 
-	public String getVersion() {
-		return version;
-	}
+	requires org.apache.wicket.core;
+	requires org.apache.wicket.request;
+	requires org.apache.wicket.util;
 
-	public String getRevision() {
-		return revision;
-	}
+	requires jakarta.inject;
+	requires jakarta.xml.bind;
 
-	public String getBuildDate() {
-		return buildDate;
-	}
+	requires spring.context;
+	requires spring.context.support;
+	requires spring.web;
+
+	requires java.desktop;
+	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 c47267b1f..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
@@ -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 {
@@ -383,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/backup/BackupImport.java b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
index 6ec134772..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<>();
@@ -506,7 +507,7 @@ public class BackupImport {
 		}
 	}
 
-	void cleanup() {
+	public void cleanup() {
 		ldapMap.clear();
 		oauthMap.clear();
 		userMap.clear();
@@ -523,7 +524,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 +534,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 +598,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 +612,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 +636,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 +682,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 +747,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 +783,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 +813,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 +837,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 +856,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 +892,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 +983,12 @@ public class BackupImport {
 		remain.entrySet().forEach(e -> log.warn("Doungling file/recording: {}", e.getValue()));
 		tree.process(f -> isInvalidFile(f, folders), save);
 	}
+
 	/*
 	 * ##################### Import Recordings
 	 */
-	void importRecordings(File base) {
+	// public for testing
+	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 -> {
@@ -1016,7 +1031,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 +1177,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-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/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/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/pom.xml b/openmeetings-mediaserver/pom.xml
index aeebd7592..1a2758a1d 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>
@@ -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>
@@ -50,13 +49,6 @@
 			<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>
@@ -77,7 +69,6 @@
 						<goals>
 							<goal>javadoc-no-fork</goal>
 						</goals>
-						<phase>generate-resources</phase>
 					</execution>
 				</executions>
 			</plugin>
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/UserParamConverter.java b/openmeetings-mediaserver/src/main/java/module-info.java
similarity index 56%
copy from openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/UserParamConverter.java
copy to openmeetings-mediaserver/src/main/java/module-info.java
index 9ffde2ebc..13752f047 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/UserParamConverter.java
+++ b/openmeetings-mediaserver/src/main/java/module-info.java
@@ -16,32 +16,32 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.webservice.util;
 
-import javax.ws.rs.ext.ParamConverter;
+module org.apache.openmeetings.mediaserver {
+	exports org.apache.openmeetings.mediaserver;
 
-import org.apache.openmeetings.db.dto.user.UserDTO;
+	requires com.github.openjson;
 
-import com.github.openjson.JSONObject;
+	requires org.apache.commons.lang3;
 
-public class UserParamConverter implements ParamConverter<UserDTO> {
-	public static final String ROOT = "userDTO";
+	requires org.apache.openmeetings.core;
+	requires transitive org.apache.openmeetings.db;
+	requires org.apache.openmeetings.util;
 
-	@Override
-	public UserDTO fromString(String val) {
-		JSONObject o = new JSONObject(val);
-		if (o.has(ROOT)) {
-			o = o.getJSONObject(ROOT);
-		}
-		return UserDTO.get(o);
-	}
+	requires org.apache.wicket.ioc;
+	requires org.apache.wicket.util;
 
-	public static JSONObject json(UserDTO val) {
-		return new JSONObject(val);
-	}
+	requires jakarta.annotation;
+	requires jakarta.inject;
 
-	@Override
-	public String toString(UserDTO val) {
-		return json(val).toString();
-	}
+	requires spring.beans;
+	requires spring.context;
+	requires spring.core;
+
+	requires transitive kurento.client;
+	requires kurento.jsonrpc.client;
+	requires kurento.commons;
+	requires com.google.gson;
+
+	requires org.slf4j;
 }
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..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
@@ -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;
@@ -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/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..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
@@ -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;
 
@@ -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,14 +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.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
 
 import com.github.openjson.JSONArray;
 import com.github.openjson.JSONObject;
 
-@Component
+import jakarta.inject.Inject;
+import jakarta.inject.Named;
+import jakarta.inject.Singleton;
+
+@Singleton
+@Named
 public class KurentoHandler {
 	private static final Logger log = LoggerFactory.getLogger(KurentoHandler.class);
 	public static final String PARAM_ICE = "iceServers";
@@ -113,17 +117,19 @@ 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<>();
 
-	@Autowired
+	@Inject
 	private IClientManager cm;
-	@Autowired
+	@Inject
 	private RoomDao roomDao;
-	@Autowired
+	@Inject
 	private TestStreamProcessor testProcessor;
-	@Autowired
+	@Inject
 	private StreamProcessor streamProcessor;
 
 	boolean isConnected() {
@@ -136,6 +142,7 @@ public class KurentoHandler {
 
 	@PostConstruct
 	public void init() {
+		log.trace("KurentoHandler::PostConstruct");
 		Runnable check = () -> {
 			try {
 				if (client != null) {
@@ -176,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) {
@@ -202,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");
 				}
@@ -302,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;
 		});
 	}
 
@@ -380,7 +396,7 @@ public class KurentoHandler {
 		this.certificateType = CertificateKeyType.valueOf(certificateType);
 	}
 
-	public CertificateKeyType getCertificateType() {
+	CertificateKeyType getCertificateType() {
 		return certificateType;
 	}
 
@@ -410,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
@@ -418,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 4738d69b1..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;
@@ -50,33 +50,37 @@ 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;
 
-@Component
-public class StreamProcessor implements IStreamProcessor {
+import jakarta.inject.Inject;
+import jakarta.inject.Named;
+import jakarta.inject.Singleton;
+
+@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<>();
 
-	@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
@@ -463,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) {
@@ -478,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 eafe4cae4..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
@@ -34,20 +34,23 @@ 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;
 
-@Component
+import jakarta.inject.Inject;
+import jakarta.inject.Named;
+import jakarta.inject.Singleton;
+
+@Singleton
+@Named
 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..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
@@ -31,16 +31,19 @@ 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;
 
-@Component
-class TestStreamProcessor implements IStreamProcessor {
+import jakarta.inject.Inject;
+import jakarta.inject.Named;
+import jakarta.inject.Singleton;
+
+@Singleton
+@Named
+class TestStreamProcessor {
 	private final Map<String, KTestStream> streamByUid = new ConcurrentHashMap<>();
 
-	@Autowired
+	@Inject
 	private KurentoHandler kHandler;
 
 	void onMessage(IWsClient c, final String cmdId, JSONObject msg) {
@@ -99,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/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-screenshare/pom.xml b/openmeetings-screenshare/pom.xml
index 31589b853..a36ccdac5 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>
@@ -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>
@@ -215,4 +214,3 @@
 		</plugins>
 	</build>
 </project>
-
diff --git a/openmeetings-server/pom.xml b/openmeetings-server/pom.xml
index 6308dc322..e56f3c043 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>
@@ -40,7 +40,7 @@
 		<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>
+		<automatic-module-name>org.apache.openmeetings.server</automatic-module-name>
 	</properties>
 	<url>https://openmeetings.apache.org</url>
 	<scm>
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-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-service/pom.xml b/openmeetings-service/pom.xml
index 9484861b8..4384c2e72 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>
@@ -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>
@@ -54,5 +53,9 @@
 			<groupId>com.github.caldav4j</groupId>
 			<artifactId>caldav4j</artifactId>
 		</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</artifactId>
+		</dependency-->
 	</dependencies>
 </project>
diff --git a/openmeetings-service/src/main/java/module-info.java b/openmeetings-service/src/main/java/module-info.java
new file mode 100644
index 000000000..e2e2ededb
--- /dev/null
+++ b/openmeetings-service/src/main/java/module-info.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.
+ */
+
+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;
+
+	//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;
+	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; 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;
+
+	requires org.slf4j;
+}
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;
... 32520 lines suppressed ...