You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2020/06/04 13:48:20 UTC

[syncope] branch master updated: [SYNCOPE-1565] Remove JAXB in favor of Jackson Dataformat XML + enabling Travis CI f… (#192)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new ae9f6c8  [SYNCOPE-1565] Remove JAXB in favor of Jackson Dataformat XML + enabling Travis CI f… (#192)
ae9f6c8 is described below

commit ae9f6c8cfd6603d34860811833b6b043b3143f46
Author: Francesco Chicchiriccò <il...@users.noreply.github.com>
AuthorDate: Thu Jun 4 15:48:11 2020 +0200

    [SYNCOPE-1565] Remove JAXB in favor of Jackson Dataformat XML + enabling Travis CI f… (#192)
---
 .travis.yml                                        |   6 +-
 .../resources/archetype-resources/core/pom.xml     |   6 -
 client/idrepo/lib/pom.xml                          |   4 +
 .../client/lib/SyncopeClientFactoryBean.java       |  75 ++--
 common/am/lib/pom.xml                              |   5 -
 .../common/lib/auth/AbstractAuthModuleConf.java    |  11 +-
 .../syncope/common/lib/auth/AuthModuleConf.java    |   8 +-
 .../common/lib/auth/GoogleMfaAuthModuleConf.java   |   5 -
 .../common/lib/auth/JDBCAuthModuleConf.java        |  13 +-
 .../common/lib/auth/JaasAuthModuleConf.java        |   5 -
 .../common/lib/auth/LDAPAuthModuleConf.java        |  12 -
 .../common/lib/auth/OIDCAuthModuleConf.java        |  15 +-
 .../common/lib/auth/RadiusAuthModuleConf.java      |   5 -
 .../common/lib/auth/SAML2IdPAuthModuleConf.java    |  20 -
 .../common/lib/auth/StaticAuthModuleConf.java      |  14 -
 .../common/lib/auth/SyncopeAuthModuleConf.java     |   5 -
 .../syncope/common/lib/auth/U2FAuthModuleConf.java |   5 -
 .../syncope/common/lib/auth/package-info.java      |  30 --
 .../lib/policy/AbstractAccessPolicyConf.java       |  39 +-
 .../lib/policy/AbstractAttrReleasePolicyConf.java  |   8 +-
 .../common/lib/policy/AbstractAuthPolicyConf.java  |   8 +-
 .../lib/policy/AbstractAuthPolicyCriteriaConf.java |   8 +-
 .../common/lib/policy/AccessPolicyConf.java        |   6 +-
 .../syncope/common/lib/policy/AccessPolicyTO.java  |  12 +-
 .../lib/policy/AllowedAttrReleasePolicyConf.java   |  10 -
 .../common/lib/policy/AttrReleasePolicyConf.java   |   6 +-
 .../common/lib/policy/AttrReleasePolicyTO.java     |  12 +-
 .../syncope/common/lib/policy/AuthPolicyConf.java  |   6 +-
 .../common/lib/policy/AuthPolicyCriteriaConf.java  |   6 +-
 .../syncope/common/lib/policy/AuthPolicyTO.java    |  12 +-
 .../common/lib/policy/DefaultAccessPolicyConf.java |   6 +-
 .../common/lib/policy/DefaultAuthPolicyConf.java   |  10 -
 .../lib/policy/DefaultAuthPolicyCriteriaConf.java  |   5 -
 .../syncope/common/lib/policy/package-info.java    |  30 --
 .../apache/syncope/common/lib/to/AuthModuleTO.java |  13 +-
 .../syncope/common/lib/to/AuthProfileTO.java       |  25 +-
 .../syncope/common/lib/to/GatewayRouteTO.java      |  13 -
 .../syncope/common/lib/to/SAML2IdPMetadataTO.java  |   8 +-
 .../syncope/common/lib/to/SAML2SPKeystoreTO.java   |  33 +-
 .../syncope/common/lib/to/SAML2SPMetadataTO.java   |  34 +-
 .../syncope/common/lib/to/client/ClientAppTO.java  |  20 +-
 .../syncope/common/lib/to/client/OIDCRPTO.java     |  27 +-
 .../syncope/common/lib/to/client/SAML2SPTO.java    |  12 +-
 .../syncope/common/lib/to/client/package-info.java |  30 --
 .../apache/syncope/common/lib/to/package-info.java |  30 --
 .../syncope/common/lib/types/ClientAppType.java    |   3 -
 .../syncope/common/lib/types/FilterFactory.java    |   3 -
 .../common/lib/types/GatewayRouteFilter.java       |   8 +-
 .../common/lib/types/GatewayRoutePredicate.java    |   8 +-
 .../common/lib/types/GatewayRouteStatus.java       |   3 -
 .../common/lib/types/GoogleMfaAuthToken.java       |  54 ++-
 .../syncope/common/lib/types/OIDCSubjectType.java  |   3 -
 .../syncope/common/lib/types/PredicateCond.java    |   3 -
 .../syncope/common/lib/types/PredicateFactory.java |   3 -
 .../syncope/common/lib/types/SAML2SPNameId.java    |   3 -
 .../apache/syncope/common/lib/wa/WAClientApp.java  |   4 +-
 .../apache/syncope/common/lib/wa/package-info.java |  30 --
 .../org/apache/syncope/common/lib/JSONTest.java}   |  21 +-
 .../syncope/common/lib/SerializationTest.java      |  52 +++
 .../org/apache/syncope/common/lib/XMLTest.java}    |  31 +-
 .../org/apache/syncope/common/lib/YAMLTest.java}   |  20 +-
 .../api/service/wa/GoogleMfaAuthTokenService.java  |  12 +-
 common/idm/lib/pom.xml                             |  11 -
 .../apache/syncope/common/lib/to/ConnBundleTO.java |  18 +-
 .../syncope/common/lib/to/ConnIdObjectClassTO.java |  18 +-
 .../syncope/common/lib/to/ConnInstanceTO.java      |  19 +-
 .../syncope/common/lib/to/ConnPoolConfTO.java      |   8 +-
 .../apache/syncope/common/lib/to/MappingTO.java    |  27 +-
 .../apache/syncope/common/lib/to/OrgUnitTO.java    |  19 +-
 .../common/lib/to/PagedConnObjectTOResult.java     |  18 +-
 .../apache/syncope/common/lib/to/ProvisionTO.java  |  19 +-
 .../syncope/common/lib/to/ProvisioningReport.java  |  10 +-
 .../apache/syncope/common/lib/to/ReconStatus.java  |   8 +-
 .../syncope/common/lib/to/RemediationTO.java       |   8 +-
 .../apache/syncope/common/lib/to/ResourceTO.java   |  19 -
 .../common/lib/types/ConnConfPropSchema.java       |  18 +-
 .../syncope/common/lib/types/ConnConfProperty.java |  18 +-
 .../common/lib/types/ConnectorCapability.java      |   3 -
 .../org/apache/syncope/common/lib/JAXBTest.java    |  64 ----
 .../org/apache/syncope/common/lib/JSONTest.java    |  62 ---
 common/idrepo/lib/pom.xml                          |  13 +-
 .../java/org/apache/syncope/common/lib/Attr.java   |  18 +-
 .../org/apache/syncope/common/lib/BaseBean.java    |  13 +-
 .../syncope/common/lib/SyncopeConstants.java       |   4 -
 .../syncope/common/lib/info/JavaImplInfo.java      |  18 +-
 .../syncope/common/lib/info/NumbersInfo.java       |  28 +-
 .../syncope/common/lib/info/PlatformInfo.java      |  65 ++--
 .../apache/syncope/common/lib/info/SystemInfo.java |  19 +-
 .../syncope/common/lib/info/package-info.java      |  32 --
 .../syncope/common/lib/jaxb/DateAdapter.java       |  38 --
 .../syncope/common/lib/jaxb/EntityTOType.java      |  63 ---
 .../common/lib/jaxb/GenericMapEntryType.java       |  56 ---
 .../syncope/common/lib/jaxb/GenericMapType.java    |  44 ---
 .../common/lib/jaxb/XmlEntityTOAdapter.java        |  65 ----
 .../common/lib/jaxb/XmlGenericMapAdapter.java      |  47 ---
 .../syncope/common/lib/jaxb/package-info.java      |  31 --
 .../apache/syncope/common/lib/log/AuditEntry.java  |  16 +-
 .../syncope/common/lib/log/EventCategory.java      |  19 +-
 .../apache/syncope/common/lib/log/LogAppender.java |   4 +-
 .../syncope/common/lib/log/LogStatement.java       |   8 +-
 .../apache/syncope/common/lib/log/LoggerTO.java    |   8 +-
 .../syncope/common/lib/log/package-info.java       |  32 --
 .../common/lib/policy/AbstractAccountRuleConf.java |   8 +-
 .../lib/policy/AbstractCorrelationRuleConf.java    |   8 +-
 .../lib/policy/AbstractPasswordRuleConf.java       |   8 +-
 .../syncope/common/lib/policy/AccountPolicyTO.java |  25 +-
 .../common/lib/policy/ComposablePolicy.java        |   4 +-
 .../common/lib/policy/DefaultAccountRuleConf.java  |  29 +-
 .../common/lib/policy/DefaultPasswordRuleConf.java |  29 +-
 .../lib/policy/DefaultPullCorrelationRuleConf.java |  14 +-
 .../lib/policy/DefaultPushCorrelationRuleConf.java |  14 +-
 .../lib/policy/HaveIBeenPwnedPasswordRuleConf.java |   5 -
 .../common/lib/policy/PasswordPolicyTO.java        |  20 +-
 .../apache/syncope/common/lib/policy/PolicyTO.java |  34 +-
 .../common/lib/policy/ProvisioningPolicyTO.java    |  10 -
 .../syncope/common/lib/policy/PullPolicyTO.java    |  14 +-
 .../syncope/common/lib/policy/PushPolicyTO.java    |  14 +-
 .../apache/syncope/common/lib/policy/RuleConf.java |   6 +-
 .../syncope/common/lib/policy/package-info.java    |  32 --
 .../lib/report/AbstractAnyReportletConf.java       |   3 -
 .../common/lib/report/AbstractReportletConf.java   |  10 +-
 .../common/lib/report/AuditReportletConf.java      |   6 -
 .../common/lib/report/GroupReportletConf.java      |  32 +-
 .../lib/report/ReconciliationReportletConf.java    |  19 +-
 .../syncope/common/lib/report/ReportletConf.java   |   6 +-
 .../common/lib/report/StaticReportletConf.java     |  15 +-
 .../common/lib/report/UserReportletConf.java       |  33 +-
 .../syncope/common/lib/report/package-info.java    |  32 --
 .../syncope/common/lib/request/AbstractPatch.java  |   8 +-
 .../common/lib/request/AbstractPatchItem.java      |   6 -
 .../lib/request/AbstractReplacePatchItem.java      |   4 -
 .../apache/syncope/common/lib/request/AnyCR.java   |  45 +--
 .../syncope/common/lib/request/AnyObjectCR.java    |  27 +-
 .../syncope/common/lib/request/AnyObjectUR.java    |  24 +-
 .../apache/syncope/common/lib/request/AnyUR.java   |  46 +--
 .../syncope/common/lib/request/AttrPatch.java      |   4 -
 .../lib/request/BooleanReplacePatchItem.java       |   5 -
 .../apache/syncope/common/lib/request/GroupCR.java |  25 +-
 .../apache/syncope/common/lib/request/GroupUR.java |  22 +-
 .../common/lib/request/LinkedAccountUR.java        |   4 -
 .../syncope/common/lib/request/LongPatchItem.java  |   5 -
 .../syncope/common/lib/request/MembershipUR.java   |  20 +-
 .../syncope/common/lib/request/PasswordPatch.java  |  16 +-
 .../syncope/common/lib/request/RelationshipUR.java |   4 -
 .../syncope/common/lib/request/ResourceAR.java     |   4 -
 .../syncope/common/lib/request/ResourceDR.java     |  18 +-
 .../apache/syncope/common/lib/request/StatusR.java |   4 -
 .../common/lib/request/StringPatchItem.java        |   5 -
 .../common/lib/request/StringReplacePatchItem.java |   7 -
 .../apache/syncope/common/lib/request/UserCR.java  |  36 +-
 .../apache/syncope/common/lib/request/UserUR.java  |  33 +-
 .../syncope/common/lib/request/package-info.java   |  32 --
 .../search/AbstractFiqlSearchConditionBuilder.java |   4 +-
 .../syncope/common/lib/search/package-info.java    |  32 --
 .../common/lib/to/AbstractStartEndBean.java        |   6 +-
 .../syncope/common/lib/to/AccessTokenTO.java       |   8 +-
 .../apache/syncope/common/lib/to/AnyObjectTO.java  |  30 +-
 .../org/apache/syncope/common/lib/to/AnyTO.java    |  52 +--
 .../syncope/common/lib/to/AnyTypeClassTO.java      |  30 +-
 .../apache/syncope/common/lib/to/AnyTypeTO.java    |  14 +-
 .../syncope/common/lib/to/ApplicationTO.java       |  15 +-
 .../apache/syncope/common/lib/to/ConnObjectTO.java |  18 +-
 .../apache/syncope/common/lib/to/DerSchemaTO.java  |  12 +-
 .../apache/syncope/common/lib/to/DynRealmTO.java   |   9 -
 .../org/apache/syncope/common/lib/to/EntityTO.java |   4 +-
 .../org/apache/syncope/common/lib/to/ErrorTO.java  |  19 +-
 .../org/apache/syncope/common/lib/to/ExecTO.java   |   4 -
 .../org/apache/syncope/common/lib/to/GroupTO.java  |  24 +-
 .../syncope/common/lib/to/ImplementationTO.java    |   4 -
 .../syncope/common/lib/to/ItemContainerTO.java     |   3 +-
 .../org/apache/syncope/common/lib/to/ItemTO.java   |  14 +-
 .../org/apache/syncope/common/lib/to/JobTO.java    |  10 +-
 .../syncope/common/lib/to/LinkedAccountTO.java     |  19 +-
 .../syncope/common/lib/to/MailTemplateTO.java      |   4 -
 .../apache/syncope/common/lib/to/MembershipTO.java |  34 +-
 .../syncope/common/lib/to/NotificationTO.java      |  23 +-
 .../syncope/common/lib/to/NotificationTaskTO.java  |  20 +-
 .../apache/syncope/common/lib/to/PagedResult.java  |  19 +-
 .../syncope/common/lib/to/PlainSchemaTO.java       |  13 +-
 .../apache/syncope/common/lib/to/PrivilegeTO.java  |   4 -
 .../syncope/common/lib/to/PropagationStatus.java   |   8 +-
 .../syncope/common/lib/to/PropagationTaskTO.java   |  21 +-
 .../syncope/common/lib/to/ProvisioningResult.java  |  26 +-
 .../syncope/common/lib/to/ProvisioningTaskTO.java  |  18 +-
 .../apache/syncope/common/lib/to/PullTaskTO.java   |  22 +-
 .../apache/syncope/common/lib/to/PushTaskTO.java   |  20 +-
 .../org/apache/syncope/common/lib/to/RealmTO.java  |  26 +-
 .../syncope/common/lib/to/RelationshipTO.java      |   8 +-
 .../syncope/common/lib/to/RelationshipTypeTO.java  |   5 -
 .../org/apache/syncope/common/lib/to/ReportTO.java |  22 +-
 .../syncope/common/lib/to/ReportTemplateTO.java    |   4 -
 .../org/apache/syncope/common/lib/to/RoleTO.java   |  29 +-
 .../apache/syncope/common/lib/to/SchedTaskTO.java  |  19 +-
 .../org/apache/syncope/common/lib/to/SchemaTO.java |  26 +-
 .../syncope/common/lib/to/SecurityQuestionTO.java  |   4 -
 .../org/apache/syncope/common/lib/to/TaskTO.java   |  30 +-
 .../syncope/common/lib/to/TemplatableTO.java       |   4 +-
 .../syncope/common/lib/to/TypeExtensionTO.java     |  18 +-
 .../org/apache/syncope/common/lib/to/UserTO.java   |  49 +--
 .../apache/syncope/common/lib/to/VirSchemaTO.java  |  10 +-
 .../apache/syncope/common/lib/to/package-info.java |  32 --
 .../syncope/common/lib/types/AnyTypeKind.java      |   2 -
 .../syncope/common/lib/types/AttrSchemaType.java   |   2 -
 .../syncope/common/lib/types/AuditElements.java    |   7 +-
 .../syncope/common/lib/types/AuditLoggerName.java  |   5 +-
 .../syncope/common/lib/types/CipherAlgorithm.java  |   3 -
 .../common/lib/types/ConflictResolutionAction.java |   3 -
 .../common/lib/types/EntityViolationType.java      |   3 -
 .../syncope/common/lib/types/ExecStatus.java       |   2 -
 .../common/lib/types/ImplementationEngine.java     |   4 -
 .../apache/syncope/common/lib/types/JobAction.java |   3 -
 .../apache/syncope/common/lib/types/JobType.java   |   3 -
 .../syncope/common/lib/types/LoggerLevel.java      |   2 -
 .../syncope/common/lib/types/LoggerType.java       |   2 -
 .../common/lib/types/MailTemplateFormat.java       |   3 -
 .../apache/syncope/common/lib/types/MatchType.java |   3 -
 .../syncope/common/lib/types/MatchingRule.java     |   5 +-
 .../syncope/common/lib/types/PatchOperation.java   |   3 -
 .../syncope/common/lib/types/PolicyType.java       |   3 -
 .../syncope/common/lib/types/ProvisionAction.java  |   3 -
 .../apache/syncope/common/lib/types/PullMode.java  |   3 -
 .../common/lib/types/ReportExecExportFormat.java   |   3 -
 .../syncope/common/lib/types/ReportExecStatus.java |   3 -
 .../common/lib/types/ReportTemplateFormat.java     |   3 -
 .../lib/types/ResourceAssociationAction.java       |   3 -
 .../lib/types/ResourceDeassociationAction.java     |   3 -
 .../common/lib/types/ResourceOperation.java        |   3 -
 .../syncope/common/lib/types/SchemaType.java       |   2 -
 .../syncope/common/lib/types/StatusRType.java      |   3 -
 .../apache/syncope/common/lib/types/TaskType.java  |   2 -
 .../syncope/common/lib/types/TraceLevel.java       |   3 -
 .../syncope/common/lib/types/UnmatchingRule.java   |   3 -
 .../syncope/common/lib/types/package-info.java     |  32 --
 .../org/apache/syncope/common/lib/JAXBTest.java    | 110 ------
 .../org/apache/syncope/common/lib/JSONTest.java    |  54 +--
 .../syncope/common/lib/SerializationTest.java      | 127 +++++++
 .../org/apache/syncope/common/lib/XMLTest.java}    |  33 +-
 .../org/apache/syncope/common/lib/YAMLTest.java}   |  20 +-
 .../core/logic/GoogleMfaAuthTokenLogic.java        | 121 +++---
 .../service/wa/GoogleMfaAuthTokenServiceImpl.java  |  42 +-
 core/idrepo/rest-cxf/pom.xml                       |  21 +-
 .../syncope/core/rest/cxf/RESTCXFContext.java      |  55 +--
 .../core/rest/cxf/SyncopeOpenApiCustomizer.java    |   2 +-
 .../syncope/core/rest/cxf/SyncopeXmlMapper.java    |  43 +++
 .../syncope/core/rest/cxf/WADLInitializer.java     |  42 --
 .../apache/syncope/core/rest/cxf/WADLServlet.java  | 116 ------
 .../syncope/core/rest/cxf/WadlGenerator.java       | 130 -------
 .../src/main/resources/META-INF/spring.factories   |   3 +-
 .../src/main/resources/wadl2html/index.xsl         | 423 ---------------------
 .../src/main/resources/wadl2html/schema.xsl        | 148 -------
 .../rest/cxf/service/AnyObjectServiceTest.java     |  38 +-
 .../core/rest/cxf/service/RESTCXFTestContext.java  |  33 +-
 .../src/main/resources/domains/MasterContent.xml   |   4 +-
 .../src/test/resources/domains/MasterContent.xml   |  82 ++--
 .../src/main/resources/domains/MasterContent.xml   |   2 +-
 .../jpa/inner/AbstractClientAppTest.java           |   3 +-
 .../core/persistence/jpa/inner/PolicyTest.java     |   3 +-
 .../src/test/resources/domains/MasterContent.xml   |  82 ++--
 core/starter/pom.xml                               |  52 +++
 .../core/starter}/SwaggerUIInitializer.java        |   4 +-
 .../main/resources/META-INF/resources}/index.html  |   2 +-
 docker/core/pom.xml                                |   6 -
 .../apache/syncope/common/lib/to/CamelMetrics.java |  17 +-
 .../apache/syncope/common/lib/to/CamelRouteTO.java |   4 -
 .../common/ui/panels/UserRequestFormPanel.java     |  19 +-
 ext/flowable/common-lib/pom.xml                    |   6 +
 .../apache/syncope/common/lib/to/BpmnProcess.java  |   5 -
 .../apache/syncope/common/lib/to/UserRequest.java  |  58 ++-
 .../syncope/common/lib/to/UserRequestForm.java     |  91 +++--
 .../common/lib/to/UserRequestFormProperty.java     |  73 +++-
 .../lib/to/UserRequestFormPropertyValue.java       |  42 +-
 .../apache/syncope/common/lib/to/WorkflowTask.java |   4 -
 .../common/lib/to/WorkflowTaskExecInput.java       |   9 -
 .../common/lib/types/BpmnProcessFormat.java        |  15 +-
 .../lib/types/UserRequestFormPropertyType.java     |   3 -
 .../syncope/common/lib/types/WorkflowTasks.java    |   2 -
 .../org/apache/syncope/common/lib/to/JSONTest.java |  11 +-
 .../syncope/common/lib/to/SerializationTest.java   |  80 ++++
 .../org/apache/syncope/common/lib/to/XMLTest.java  |  31 +-
 .../org/apache/syncope/common/lib/to/YAMLTest.java |  16 +-
 .../flowable/impl/FlowableUserRequestHandler.java  |   9 +-
 .../rest/cxf/service/BpmnProcessServiceImpl.java   |   3 +-
 .../syncope/common/lib/to/OIDCLoginRequestTO.java  |   4 -
 .../syncope/common/lib/to/OIDCLoginResponseTO.java |  15 +-
 .../syncope/common/lib/to/OIDCLogoutRequestTO.java |   4 -
 .../syncope/common/lib/to/OIDCProviderTO.java      |  24 +-
 ext/pom.xml                                        |   1 -
 .../apache/syncope/common/lib/to/SAML2IdPTO.java   |  27 +-
 .../common/lib/to/SAML2LoginResponseTO.java        |  14 +-
 .../common/lib/to/SAML2ReceivedResponseTO.java     |   5 -
 .../syncope/common/lib/to/SAML2RequestTO.java      |   5 -
 .../syncope/common/lib/types/SAML2BindingType.java |   3 -
 .../common/lib/types/SignatureAlgorithm.java       |   1 -
 .../syncope/ext/scimv2/cxf/RESTSCIMCXFContext.java |  22 +-
 .../self/keymaster/cxf/SelfKeymasterContext.java   |  26 +-
 ext/swagger-ui/pom.xml                             | 133 -------
 .../src/main/resources/META-INF/spring.factories   |  19 -
 fit/build-tools/pom.xml                            |   4 +-
 fit/console-reference/pom.xml                      |   2 +-
 fit/core-reference/pom.xml                         |  19 +-
 .../org/apache/syncope/fit/AbstractITCase.java     |   5 +-
 .../org/apache/syncope/fit/core/BatchITCase.java   |  31 +-
 .../syncope/fit/core/GoogleMfaAuthTokenITCase.java |  16 +-
 .../org/apache/syncope/fit/core/PolicyITCase.java  |  13 +-
 .../org/apache/syncope/fit/core/RealmITCase.java   |   2 +-
 .../org/apache/syncope/fit/core/SAML2ITCase.java   |   7 +-
 .../org/apache/syncope/fit/core/UserITCase.java    |   7 -
 fit/enduser-reference/pom.xml                      |   2 +-
 fit/wa-reference/pom.xml                           |   2 +-
 pom.xml                                            |  40 +-
 src/main/asciidoc/getting-started/obtain.adoc      |   6 -
 .../reference-guide/architecture/core.adoc         |   3 -
 .../reference-guide/concepts/extensions.adoc       |  26 --
 .../workingwithapachesyncope/customization.adoc    |  14 -
 .../workingwithapachesyncope/restfulservices.adoc  |   3 -
 .../SyncopeWAGoogleMfaAuthTokenRepository.java     |  61 ++-
 .../wa/starter/SyncopeCoreTestingServer.java       |  48 +--
 .../wa/starter/SyncopeServiceRegistryTest.java     |   2 +-
 318 files changed, 1825 insertions(+), 4842 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 4a58937..428e276 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -83,9 +83,9 @@ jobs:
     - stage: fit
       name: "Integration Tests: Tomcat / H2 / JSON Content-Type"
       script: mvn -f fit/core-reference/pom.xml verify -Dinvoker.streamLogs=true -Dmodernizer.skip=true -Dianal.skip=true -Drat.skip=true -Dcheckstyle.skip=true -Djacoco.skip=true
-      #- stage: fit
-      #name: "Integration Tests: Tomcat / H2 / XML Content-Type"
-      #script: mvn -f fit/core-reference/pom.xml verify -Djaxrs.content.type=application/xml -Dinvoker.streamLogs=true -Dmodernizer.skip=true -Dianal.skip=true -Drat.skip=true -Dcheckstyle.skip=true -Djacoco.skip=true
+    - stage: fit
+      name: "Integration Tests: Tomcat / H2 / XML Content-Type"
+      script: mvn -f fit/core-reference/pom.xml verify -Djaxrs.content.type=application/xml -Dit.test=org.apache.syncope.fit.core.*ITCase -Dinvoker.streamLogs=true -Dmodernizer.skip=true -Dianal.skip=true -Drat.skip=true -Dcheckstyle.skip=true -Djacoco.skip=true
     - stage: fit
       name: "Integration Tests: Tomcat / H2 / YAML Content-Type"
       script: mvn -f fit/core-reference/pom.xml verify -Djaxrs.content.type=application/yaml -Dit.test=org.apache.syncope.fit.core.*ITCase -Dinvoker.streamLogs=true -Dmodernizer.skip=true -Dianal.skip=true -Drat.skip=true -Dcheckstyle.skip=true -Djacoco.skip=true
diff --git a/archetype/src/main/resources/archetype-resources/core/pom.xml b/archetype/src/main/resources/archetype-resources/core/pom.xml
index 77f8f59..18f03a2 100644
--- a/archetype/src/main/resources/archetype-resources/core/pom.xml
+++ b/archetype/src/main/resources/archetype-resources/core/pom.xml
@@ -170,12 +170,6 @@ under the License.
           <artifactId>syncope-ext-scimv2-scim-rest-cxf</artifactId>
           <version>${syncope.version}</version>
         </dependency>
-
-        <dependency>
-          <groupId>org.apache.syncope.ext</groupId>
-          <artifactId>syncope-ext-swagger-ui</artifactId>
-          <version>${syncope.version}</version>
-        </dependency>
       </dependencies>
       
       <build>        
diff --git a/client/idrepo/lib/pom.xml b/client/idrepo/lib/pom.xml
index 52dc00d..6062661 100644
--- a/client/idrepo/lib/pom.xml
+++ b/client/idrepo/lib/pom.xml
@@ -57,6 +57,10 @@ under the License.
     </dependency>
     <dependency>
       <groupId>com.fasterxml.jackson.jaxrs</groupId>
+      <artifactId>jackson-jaxrs-xml-provider</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.jaxrs</groupId>
       <artifactId>jackson-jaxrs-yaml-provider</artifactId>
     </dependency>
 
diff --git a/client/idrepo/lib/src/main/java/org/apache/syncope/client/lib/SyncopeClientFactoryBean.java b/client/idrepo/lib/src/main/java/org/apache/syncope/client/lib/SyncopeClientFactoryBean.java
index ee1fdf4..bec3941 100644
--- a/client/idrepo/lib/src/main/java/org/apache/syncope/client/lib/SyncopeClientFactoryBean.java
+++ b/client/idrepo/lib/src/main/java/org/apache/syncope/client/lib/SyncopeClientFactoryBean.java
@@ -18,25 +18,26 @@
  */
 package org.apache.syncope.client.lib;
 
+import com.fasterxml.jackson.annotation.JsonSetter;
+import com.fasterxml.jackson.annotation.Nulls;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.dataformat.xml.XmlMapper;
 import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
 import com.fasterxml.jackson.datatype.joda.JodaModule;
-import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
-import com.fasterxml.jackson.jaxrs.yaml.JacksonJaxbYAMLProvider;
+import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
+import com.fasterxml.jackson.jaxrs.xml.JacksonXMLProvider;
+import com.fasterxml.jackson.jaxrs.yaml.JacksonYAMLProvider;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.Set;
 import javax.ws.rs.core.MediaType;
-import javax.xml.bind.Marshaller;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.cxf.configuration.jsse.TLSClientParameters;
 import org.apache.cxf.ext.logging.LoggingFeature;
 import org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean;
-import org.apache.cxf.jaxrs.provider.JAXBElementProvider;
-import org.apache.cxf.staxutils.DocumentDepthProperties;
-import org.apache.syncope.common.lib.policy.PolicyTO;
 import org.apache.syncope.common.rest.api.DateParamConverterProvider;
 import org.apache.syncope.common.rest.api.RESTHeaders;
 
@@ -71,11 +72,11 @@ public class SyncopeClientFactoryBean {
         }
     }
 
-    private JacksonJaxbJsonProvider jsonProvider;
+    private JacksonJsonProvider jsonProvider;
 
-    private JAXBElementProvider<?> jaxbProvider;
+    private JacksonXMLProvider xmlProvider;
 
-    private JacksonJaxbYAMLProvider yamlProvider;
+    private JacksonYAMLProvider yamlProvider;
 
     private RestClientExceptionMapper exceptionMapper;
 
@@ -91,37 +92,28 @@ public class SyncopeClientFactoryBean {
 
     private JAXRSClientFactoryBean restClientFactoryBean;
 
-    protected static JacksonJaxbJsonProvider defaultJsonProvider() {
+    protected static JacksonJsonProvider defaultJsonProvider() {
         ObjectMapper objectMapper = new ObjectMapper();
         objectMapper.registerModule(new JodaModule());
         objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
-        return new JacksonJaxbJsonProvider(objectMapper, JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS);
+        return new JacksonJsonProvider(objectMapper);
     }
 
-    @SuppressWarnings({ "rawtypes" })
-    protected static JAXBElementProvider<?> defaultJAXBProvider() {
-        JAXBElementProvider<?> defaultJAXBProvider = new JAXBElementProvider();
-
-        DocumentDepthProperties depthProperties = new DocumentDepthProperties();
-        depthProperties.setInnerElementCountThreshold(500);
-        defaultJAXBProvider.setDepthProperties(depthProperties);
-
-        Map<String, Object> marshallerProperties = new HashMap<>();
-        marshallerProperties.put(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
-        defaultJAXBProvider.setMarshallerProperties(marshallerProperties);
-
-        Map<String, String> collectionWrapperMap = new HashMap<>();
-        collectionWrapperMap.put(PolicyTO.class.getName(), "policies");
-        defaultJAXBProvider.setCollectionWrapperMap(collectionWrapperMap);
-
-        return defaultJAXBProvider;
+    protected static JacksonXMLProvider defaultXmlProvider() {
+        XmlMapper xmlMapper = new XmlMapper();
+        xmlMapper.registerModule(new JodaModule());
+        xmlMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+        xmlMapper.configOverride(List.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY));
+        xmlMapper.configOverride(Set.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY));
+        xmlMapper.configOverride(Map.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY));
+        return new JacksonXMLProvider(xmlMapper);
     }
 
-    protected static JacksonJaxbYAMLProvider defaultYamlProvider() {
+    protected static JacksonYAMLProvider defaultYamlProvider() {
         YAMLMapper yamlMapper = new YAMLMapper();
         yamlMapper.registerModule(new JodaModule());
         yamlMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
-        return new JacksonJaxbYAMLProvider(yamlMapper, JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS);
+        return new JacksonYAMLProvider(yamlMapper);
     }
 
     protected static RestClientExceptionMapper defaultExceptionMapper() {
@@ -149,39 +141,38 @@ public class SyncopeClientFactoryBean {
         defaultRestClientFactoryBean.setProviders(List.of(
                 new DateParamConverterProvider(),
                 getJsonProvider(),
-                getJaxbProvider(),
+                getXmlProvider(),
                 getYamlProvider(),
                 getExceptionMapper()));
 
         return defaultRestClientFactoryBean;
     }
 
-    public JacksonJaxbJsonProvider getJsonProvider() {
+    public JacksonJsonProvider getJsonProvider() {
         return Optional.ofNullable(jsonProvider).orElseGet(SyncopeClientFactoryBean::defaultJsonProvider);
     }
 
-    public void setJsonProvider(final JacksonJaxbJsonProvider jsonProvider) {
+    public void setJsonProvider(final JacksonJsonProvider jsonProvider) {
         this.jsonProvider = jsonProvider;
     }
 
-    public JAXBElementProvider<?> getJaxbProvider() {
-        return jaxbProvider == null
-                ? defaultJAXBProvider()
-                : jaxbProvider;
+    public JacksonXMLProvider getXmlProvider() {
+        return xmlProvider == null
+                ? defaultXmlProvider()
+                : xmlProvider;
     }
 
-    public SyncopeClientFactoryBean setJaxbProvider(final JAXBElementProvider<?> jaxbProvider) {
-        this.jaxbProvider = jaxbProvider;
-        return this;
+    public void setXmlProvider(final JacksonXMLProvider xmlProvider) {
+        this.xmlProvider = xmlProvider;
     }
 
-    public JacksonJaxbYAMLProvider getYamlProvider() {
+    public JacksonYAMLProvider getYamlProvider() {
         return yamlProvider == null
                 ? defaultYamlProvider()
                 : yamlProvider;
     }
 
-    public void setYamlProvider(final JacksonJaxbYAMLProvider yamlProvider) {
+    public void setYamlProvider(final JacksonYAMLProvider yamlProvider) {
         this.yamlProvider = yamlProvider;
     }
 
diff --git a/common/am/lib/pom.xml b/common/am/lib/pom.xml
index 2f01ca1..b3ebdde 100644
--- a/common/am/lib/pom.xml
+++ b/common/am/lib/pom.xml
@@ -45,11 +45,6 @@ under the License.
     </dependency>
 
     <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-databind</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
       <groupId>org.junit.jupiter</groupId>
       <artifactId>junit-jupiter</artifactId>
       <scope>test</scope>
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/AbstractAuthModuleConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/AbstractAuthModuleConf.java
index a4399d6..089d24c 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/AbstractAuthModuleConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/AbstractAuthModuleConf.java
@@ -18,15 +18,9 @@
  */
 package org.apache.syncope.common.lib.auth;
 
-import java.io.Serializable;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
+import org.apache.syncope.common.lib.BaseBean;
 
-@XmlType
-@XmlSeeAlso({ JaasAuthModuleConf.class, StaticAuthModuleConf.class, LDAPAuthModuleConf.class,
-    OIDCAuthModuleConf.class, GoogleMfaAuthModuleConf.class, SAML2IdPAuthModuleConf.class, U2FAuthModuleConf.class,
-    JDBCAuthModuleConf.class, SyncopeAuthModuleConf.class, RadiusAuthModuleConf.class })
-public abstract class AbstractAuthModuleConf implements Serializable, AuthModuleConf {
+public abstract class AbstractAuthModuleConf implements BaseBean, AuthModuleConf {
 
     private static final long serialVersionUID = 4153200197344709778L;
 
@@ -44,5 +38,4 @@ public abstract class AbstractAuthModuleConf implements Serializable, AuthModule
     public final void setName(final String name) {
         this.name = name;
     }
-
 }
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/AuthModuleConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/AuthModuleConf.java
index 28c1357..35be339 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/AuthModuleConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/AuthModuleConf.java
@@ -19,12 +19,10 @@
 package org.apache.syncope.common.lib.auth;
 
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import java.io.Serializable;
-import javax.xml.bind.annotation.XmlTransient;
+import org.apache.syncope.common.lib.BaseBean;
 
-@XmlTransient
-@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
-public interface AuthModuleConf extends Serializable {
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "_class")
+public interface AuthModuleConf extends BaseBean {
 
     /**
      * Given name of related authentication module instance.
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/GoogleMfaAuthModuleConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/GoogleMfaAuthModuleConf.java
index a2e4168..4912fcc 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/GoogleMfaAuthModuleConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/GoogleMfaAuthModuleConf.java
@@ -18,11 +18,6 @@
  */
 package org.apache.syncope.common.lib.auth;
 
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlRootElement(name = "googleMfaAuthModuleConf")
-@XmlType
 public class GoogleMfaAuthModuleConf extends AbstractAuthModuleConf {
 
     private static final long serialVersionUID = -7883257599139312426L;
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/JDBCAuthModuleConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/JDBCAuthModuleConf.java
index 16bd704..658a3c3 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/JDBCAuthModuleConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/JDBCAuthModuleConf.java
@@ -18,17 +18,9 @@
  */
 package org.apache.syncope.common.lib.auth;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-import javax.xml.bind.annotation.XmlType;
 import java.util.ArrayList;
 import java.util.List;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlRootElement;
 
-@XmlRootElement(name = "jdbcAuthModuleConf")
-@XmlType
 public class JDBCAuthModuleConf extends AbstractAuthModuleConf {
 
     private static final long serialVersionUID = 8383233437907219385L;
@@ -68,7 +60,7 @@ public class JDBCAuthModuleConf extends AbstractAuthModuleConf {
      * The database connection URL.
      */
     private String url = "jdbc:h2:tcp://localhost:9092/mem:authdb;DB_CLOSE_DELAY=-1";
-    
+
     /**
      * The database user.
      * <p>
@@ -119,9 +111,6 @@ public class JDBCAuthModuleConf extends AbstractAuthModuleConf {
         this.fieldDisabled = fieldDisabled;
     }
 
-    @XmlElementWrapper(name = "principalAttributeList")
-    @XmlElement(name = "principalAttributeList")
-    @JsonProperty("principalAttributeList")
     public List<String> getPrincipalAttributeList() {
         return principalAttributeList;
     }
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/JaasAuthModuleConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/JaasAuthModuleConf.java
index b8627ab..7291b8e 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/JaasAuthModuleConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/JaasAuthModuleConf.java
@@ -18,11 +18,6 @@
  */
 package org.apache.syncope.common.lib.auth;
 
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlRootElement(name = "jaasAuthModuleConf")
-@XmlType
 public class JaasAuthModuleConf extends AbstractAuthModuleConf {
 
     private static final long serialVersionUID = -7775771400318503131L;
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/LDAPAuthModuleConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/LDAPAuthModuleConf.java
index 55260bc..97e4c26 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/LDAPAuthModuleConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/LDAPAuthModuleConf.java
@@ -18,18 +18,9 @@
  */
 package org.apache.syncope.common.lib.auth;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-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 java.util.ArrayList;
 import java.util.List;
 
-@XmlRootElement(name = "ldapAuthModuleConf")
-@XmlType
 public class LDAPAuthModuleConf extends AbstractAuthModuleConf {
 
     private static final long serialVersionUID = -471527731042579422L;
@@ -135,9 +126,6 @@ public class LDAPAuthModuleConf extends AbstractAuthModuleConf {
         this.baseDn = baseDn;
     }
 
-    @XmlElementWrapper(name = "principalAttributeList")
-    @XmlElement(name = "principalAttributeList")
-    @JsonProperty("principalAttributeList")
     public List<String> getPrincipalAttributeList() {
         return principalAttributeList;
     }
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/OIDCAuthModuleConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/OIDCAuthModuleConf.java
index d59b34d..cd6b008 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/OIDCAuthModuleConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/OIDCAuthModuleConf.java
@@ -18,18 +18,9 @@
  */
 package org.apache.syncope.common.lib.auth;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import javax.xml.bind.annotation.XmlType;
 import java.util.HashMap;
 import java.util.Map;
-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 org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
-
-@XmlRootElement(name = "oidcAuthModuleConf")
-@XmlType
+
 public class OIDCAuthModuleConf extends AbstractAuthModuleConf {
 
     private static final long serialVersionUID = -471527731042579422L;
@@ -78,7 +69,6 @@ public class OIDCAuthModuleConf extends AbstractAuthModuleConf {
     /**
      * Custom parameters to send along in authZ requests, etc.
      */
-    @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
     private final Map<String, String> customParams = new HashMap<>(0);
 
     /**
@@ -157,9 +147,6 @@ public class OIDCAuthModuleConf extends AbstractAuthModuleConf {
         this.maxClockSkew = maxClockSkew;
     }
 
-    @XmlElementWrapper(name = "customParams")
-    @XmlElement(name = "customParam")
-    @JsonProperty("customParams")
     public Map<String, String> getCustomParams() {
         return customParams;
     }
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/RadiusAuthModuleConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/RadiusAuthModuleConf.java
index 7cd543c..46f4eb2 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/RadiusAuthModuleConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/RadiusAuthModuleConf.java
@@ -18,11 +18,6 @@
  */
 package org.apache.syncope.common.lib.auth;
 
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlRootElement(name = "radiusAuthModuleConf")
-@XmlType
 public class RadiusAuthModuleConf extends AbstractAuthModuleConf {
 
     private static final long serialVersionUID = -2235771400318503131L;
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/SAML2IdPAuthModuleConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/SAML2IdPAuthModuleConf.java
index 32079b4..43bf7c3 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/SAML2IdPAuthModuleConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/SAML2IdPAuthModuleConf.java
@@ -18,16 +18,9 @@
  */
 package org.apache.syncope.common.lib.auth;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
 import java.util.ArrayList;
 import java.util.List;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 
-@XmlRootElement(name = "saml2IdPAuthModuleConf")
-@XmlType
 public class SAML2IdPAuthModuleConf extends AbstractAuthModuleConf {
 
     private static final long serialVersionUID = -471527731042579422L;
@@ -55,7 +48,6 @@ public class SAML2IdPAuthModuleConf extends AbstractAuthModuleConf {
      */
     private String privateKeyPassword;
 
-
     /**
      * The metadata location of the identity provider that is to handle authentications.
      */
@@ -279,9 +271,6 @@ public class SAML2IdPAuthModuleConf extends AbstractAuthModuleConf {
         this.nameIdPolicyAllowCreate = nameIdPolicyAllowCreate;
     }
 
-    @XmlElementWrapper(name = "authnContextClassRefs")
-    @XmlElement(name = "authnContextClassRef")
-    @JsonProperty("authnContextClassRefs")
     public List<String> getAuthnContextClassRefs() {
         return authnContextClassRefs;
     }
@@ -366,23 +355,14 @@ public class SAML2IdPAuthModuleConf extends AbstractAuthModuleConf {
         this.signServiceProviderLogoutRequest = signServiceProviderLogoutRequest;
     }
 
-    @XmlElementWrapper(name = "blackListedSignatureSigningAlgorithms")
-    @XmlElement(name = "blackListedSignatureSigningAlgorithm")
-    @JsonProperty("blackListedSignatureSigningAlgorithms")
     public List<String> getBlackListedSignatureSigningAlgorithms() {
         return blackListedSignatureSigningAlgorithms;
     }
 
-    @XmlElementWrapper(name = "signatureAlgorithms")
-    @XmlElement(name = "signatureAlgorithm")
-    @JsonProperty("signatureAlgorithms")
     public List<String> getSignatureAlgorithms() {
         return signatureAlgorithms;
     }
 
-    @XmlElementWrapper(name = "signatureReferenceDigestMethods")
-    @XmlElement(name = "signatureReferenceDigestMethod")
-    @JsonProperty("signatureReferenceDigestMethods")
     public List<String> getSignatureReferenceDigestMethods() {
         return signatureReferenceDigestMethods;
     }
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/StaticAuthModuleConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/StaticAuthModuleConf.java
index 60d2751..d73b347 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/StaticAuthModuleConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/StaticAuthModuleConf.java
@@ -18,30 +18,16 @@
  */
 package org.apache.syncope.common.lib.auth;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import javax.xml.bind.annotation.XmlType;
 import java.util.HashMap;
 import java.util.Map;
-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 org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 
-@XmlRootElement(name = "staticAuthModuleConf")
-@XmlType
 public class StaticAuthModuleConf extends AbstractAuthModuleConf {
 
     private static final long serialVersionUID = -7775771400318503131L;
 
-    @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
     private final Map<String, String> users = new HashMap<>();
 
-    @XmlElementWrapper(name = "users")
-    @XmlElement(name = "user")
-    @JsonProperty("users")
     public Map<String, String> getUsers() {
         return users;
     }
-
 }
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/SyncopeAuthModuleConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/SyncopeAuthModuleConf.java
index 2ac2192..f83ae24 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/SyncopeAuthModuleConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/SyncopeAuthModuleConf.java
@@ -18,11 +18,6 @@
  */
 package org.apache.syncope.common.lib.auth;
 
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlRootElement(name = "syncopeAuthModuleConf")
-@XmlType
 public class SyncopeAuthModuleConf extends AbstractAuthModuleConf {
 
     private static final long serialVersionUID = -3334329948161152222L;
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/U2FAuthModuleConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/U2FAuthModuleConf.java
index cc127da..e7a84c0 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/U2FAuthModuleConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/U2FAuthModuleConf.java
@@ -18,11 +18,6 @@
  */
 package org.apache.syncope.common.lib.auth;
 
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlRootElement(name = "u2fAuthModuleConf")
-@XmlType
 public class U2FAuthModuleConf extends AbstractAuthModuleConf {
 
     private static final long serialVersionUID = -1235771400318503131L;
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/package-info.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/package-info.java
deleted file mode 100644
index e3765a0..0000000
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/package-info.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-@XmlSchema(namespace = SyncopeConstants.NS)
-@XmlJavaTypeAdapters({ @XmlJavaTypeAdapter(type = Date.class, value = DateAdapter.class), })
-package org.apache.syncope.common.lib.auth;
-
-import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.jaxb.DateAdapter;
-
-import javax.xml.bind.annotation.XmlSchema;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
-
-import java.util.Date;
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractAccessPolicyConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractAccessPolicyConf.java
index 5152d95..f5ebb4e 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractAccessPolicyConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractAccessPolicyConf.java
@@ -18,21 +18,20 @@
  */
 package org.apache.syncope.common.lib.policy;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
-import java.io.Serializable;
-import java.util.LinkedHashMap;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
+import java.util.stream.Collectors;
+import org.apache.syncope.common.lib.Attr;
+import org.apache.syncope.common.lib.BaseBean;
 
-@XmlType
-@XmlSeeAlso({ DefaultAccessPolicyConf.class })
-public abstract class AbstractAccessPolicyConf implements Serializable, AccessPolicyConf {
+public abstract class AbstractAccessPolicyConf implements BaseBean, AccessPolicyConf {
 
     private static final long serialVersionUID = 1153200197344709778L;
 
@@ -42,8 +41,10 @@ public abstract class AbstractAccessPolicyConf implements Serializable, AccessPo
 
     private boolean ssoEnabled = true;
 
-    @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
-    private final Map<String, Set<String>> requiredAttrs = new LinkedHashMap<>();
+    @JacksonXmlElementWrapper(localName = "requiredAttrs")
+    @JacksonXmlProperty(localName = "requiredAttr")
+    @JsonProperty("requiredAttrs")
+    private final List<Attr> requiredAttrList = new ArrayList<>();
 
     public AbstractAccessPolicyConf() {
         setName(getClass().getName());
@@ -76,11 +77,15 @@ public abstract class AbstractAccessPolicyConf implements Serializable, AccessPo
         this.ssoEnabled = ssoEnabled;
     }
 
-    @XmlElementWrapper(name = "requiredAttrs")
-    @XmlElement(name = "requiredAttr")
-    @JsonProperty("requiredAttrs")
+    @JsonIgnore
     @Override
     public Map<String, Set<String>> getRequiredAttrs() {
-        return requiredAttrs;
+        return requiredAttrList.stream().
+                collect(Collectors.toUnmodifiableMap(Attr::getSchema, attr -> new HashSet<>(attr.getValues())));
+    }
+
+    public void addRequiredAttr(final String key, final Set<String> values) {
+        requiredAttrList.removeIf(attr -> attr.getSchema().equals(key));
+        requiredAttrList.add(new Attr.Builder(key).values(values).build());
     }
 }
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractAttrReleasePolicyConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractAttrReleasePolicyConf.java
index e3a8206..5013c4b 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractAttrReleasePolicyConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractAttrReleasePolicyConf.java
@@ -18,13 +18,9 @@
  */
 package org.apache.syncope.common.lib.policy;
 
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
-import java.io.Serializable;
+import org.apache.syncope.common.lib.BaseBean;
 
-@XmlType
-@XmlSeeAlso({ AllowedAttrReleasePolicyConf.class })
-public abstract class AbstractAttrReleasePolicyConf implements Serializable, AttrReleasePolicyConf {
+public abstract class AbstractAttrReleasePolicyConf implements BaseBean, AttrReleasePolicyConf {
 
     private static final long serialVersionUID = 1153200197344709778L;
 
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractAuthPolicyConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractAuthPolicyConf.java
index ac19f37..1a66800 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractAuthPolicyConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractAuthPolicyConf.java
@@ -18,13 +18,9 @@
  */
 package org.apache.syncope.common.lib.policy;
 
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
-import java.io.Serializable;
+import org.apache.syncope.common.lib.BaseBean;
 
-@XmlType
-@XmlSeeAlso({ DefaultAuthPolicyConf.class })
-public abstract class AbstractAuthPolicyConf implements Serializable, AuthPolicyConf {
+public abstract class AbstractAuthPolicyConf implements BaseBean, AuthPolicyConf {
 
     private static final long serialVersionUID = 9185127128182430142L;
 
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractAuthPolicyCriteriaConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractAuthPolicyCriteriaConf.java
index a25438f..8f9bd14 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractAuthPolicyCriteriaConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractAuthPolicyCriteriaConf.java
@@ -18,13 +18,7 @@
  */
 package org.apache.syncope.common.lib.policy;
 
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
-import java.io.Serializable;
-
-@XmlType
-@XmlSeeAlso({ DefaultAuthPolicyCriteriaConf.class })
-public abstract class AbstractAuthPolicyCriteriaConf implements AuthPolicyCriteriaConf, Serializable {
+public abstract class AbstractAuthPolicyCriteriaConf implements AuthPolicyCriteriaConf {
 
     private static final long serialVersionUID = -6882164291962510245L;
 
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AccessPolicyConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AccessPolicyConf.java
index 9587418..da2e53c 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AccessPolicyConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AccessPolicyConf.java
@@ -19,12 +19,12 @@
 package org.apache.syncope.common.lib.policy;
 
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import java.io.Serializable;
 import java.util.Map;
 import java.util.Set;
+import org.apache.syncope.common.lib.BaseBean;
 
-@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
-public interface AccessPolicyConf extends Serializable {
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "_class")
+public interface AccessPolicyConf extends BaseBean {
 
     /**
      * Give name of related access policy.
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AccessPolicyTO.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AccessPolicyTO.java
index 34c500d..093ca7a 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AccessPolicyTO.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AccessPolicyTO.java
@@ -20,22 +20,18 @@
 package org.apache.syncope.common.lib.policy;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
 
-@XmlRootElement(name = "accessPolicy")
-@XmlType
 public class AccessPolicyTO extends PolicyTO {
 
     private static final long serialVersionUID = -6711411162433533300L;
 
     private AccessPolicyConf conf;
 
-    @XmlTransient
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.policy.AccessPolicyTO")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.policy.AccessPolicyTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AllowedAttrReleasePolicyConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AllowedAttrReleasePolicyConf.java
index d0174ff..889c302 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AllowedAttrReleasePolicyConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AllowedAttrReleasePolicyConf.java
@@ -18,16 +18,9 @@
  */
 package org.apache.syncope.common.lib.policy;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 import java.util.ArrayList;
 import java.util.List;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
 
-@XmlRootElement(name = "allowedAttrReleasePolicyConf")
-@XmlType
 public class AllowedAttrReleasePolicyConf extends AbstractAttrReleasePolicyConf implements AttrReleasePolicyConf {
 
     private static final long serialVersionUID = -1969836661359025380L;
@@ -38,9 +31,6 @@ public class AllowedAttrReleasePolicyConf extends AbstractAttrReleasePolicyConf
      */
     private final List<String> allowedAttrs = new ArrayList<>();
 
-    @XmlElementWrapper(name = "allowedAttrs")
-    @XmlElement(name = "allowedAttr")
-    @JsonProperty("allowedAttrs")
     public List<String> getAllowedAttrs() {
         return allowedAttrs;
     }
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AttrReleasePolicyConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AttrReleasePolicyConf.java
index 0a3e1d1..fbd8c2e 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AttrReleasePolicyConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AttrReleasePolicyConf.java
@@ -19,10 +19,10 @@
 package org.apache.syncope.common.lib.policy;
 
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import java.io.Serializable;
+import org.apache.syncope.common.lib.BaseBean;
 
-@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
-public interface AttrReleasePolicyConf extends Serializable {
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "_class")
+public interface AttrReleasePolicyConf extends BaseBean {
 
     /**
      * Give name of related attr release policy.
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AttrReleasePolicyTO.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AttrReleasePolicyTO.java
index 1d7f050..5e43b9a 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AttrReleasePolicyTO.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AttrReleasePolicyTO.java
@@ -19,22 +19,18 @@
 package org.apache.syncope.common.lib.policy;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
 
-@XmlRootElement(name = "attrReleasePolicy")
-@XmlType
 public class AttrReleasePolicyTO extends PolicyTO {
 
     private static final long serialVersionUID = -1432411162433533300L;
 
     private AttrReleasePolicyConf conf;
 
-    @XmlTransient
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.policy.AttrReleasePolicyTO")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.policy.AttrReleasePolicyTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AuthPolicyConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AuthPolicyConf.java
index 7740d3c..e8a0945 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AuthPolicyConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AuthPolicyConf.java
@@ -19,10 +19,10 @@
 package org.apache.syncope.common.lib.policy;
 
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import java.io.Serializable;
+import org.apache.syncope.common.lib.BaseBean;
 
-@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
-public interface AuthPolicyConf extends Serializable {
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "_class")
+public interface AuthPolicyConf extends BaseBean {
 
     /**
      * Give name of related authentication policy instance.
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AuthPolicyCriteriaConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AuthPolicyCriteriaConf.java
index 4ba54bb..6597368 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AuthPolicyCriteriaConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AuthPolicyCriteriaConf.java
@@ -19,7 +19,7 @@
 package org.apache.syncope.common.lib.policy;
 
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import java.io.Serializable;
+import org.apache.syncope.common.lib.BaseBean;
 
 /**
  * Determine the criteria by which the authentication policy
@@ -29,8 +29,8 @@ import java.io.Serializable;
  * or "any module can validate the user" before the policy can consider it
  * a success.
  */
-@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
-public interface AuthPolicyCriteriaConf extends Serializable {
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "_class")
+public interface AuthPolicyCriteriaConf extends BaseBean {
 
     /**
      * Describe the name of the authentication policy criteria.
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AuthPolicyTO.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AuthPolicyTO.java
index 8301d69..f54e1b2 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AuthPolicyTO.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AuthPolicyTO.java
@@ -19,22 +19,18 @@
 package org.apache.syncope.common.lib.policy;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
 
-@XmlRootElement(name = "authPolicy")
-@XmlType
 public class AuthPolicyTO extends PolicyTO {
 
     private static final long serialVersionUID = -6711411162433533300L;
 
     private AuthPolicyConf conf;
 
-    @XmlTransient
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.policy.AuthPolicyTO")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.policy.AuthPolicyTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultAccessPolicyConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultAccessPolicyConf.java
index df2315c..490f311 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultAccessPolicyConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultAccessPolicyConf.java
@@ -18,12 +18,8 @@
  */
 package org.apache.syncope.common.lib.policy;
 
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlRootElement(name = "defaultAccessPolicyConf")
-@XmlType
 public class DefaultAccessPolicyConf extends AbstractAccessPolicyConf implements AccessPolicyConf {
 
     private static final long serialVersionUID = -1969836600059025380L;
+
 }
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultAuthPolicyConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultAuthPolicyConf.java
index ce1507b..1c70592 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultAuthPolicyConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultAuthPolicyConf.java
@@ -18,25 +18,15 @@
  */
 package org.apache.syncope.common.lib.policy;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 import java.util.ArrayList;
 import java.util.List;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
 
-@XmlRootElement(name = "defaultAuthPolicyConf")
-@XmlType
 public class DefaultAuthPolicyConf extends AbstractAuthPolicyConf implements AuthPolicyConf {
 
     private static final long serialVersionUID = -2969836600059025380L;
 
     private final List<String> authModules = new ArrayList<>();
 
-    @XmlElementWrapper(name = "authModules")
-    @XmlElement(name = "authModule")
-    @JsonProperty("authModules")
     public List<String> getAuthModules() {
         return authModules;
     }
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultAuthPolicyCriteriaConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultAuthPolicyCriteriaConf.java
index 96b17ca..4d0f4b6 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultAuthPolicyCriteriaConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultAuthPolicyCriteriaConf.java
@@ -18,11 +18,6 @@
  */
 package org.apache.syncope.common.lib.policy;
 
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlRootElement(name = "defaultAuthPolicyCriteriaConf")
-@XmlType
 public class DefaultAuthPolicyCriteriaConf extends AbstractAuthPolicyCriteriaConf {
 
     private static final long serialVersionUID = 3928807032588105869L;
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/package-info.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/package-info.java
deleted file mode 100644
index d3c7ee7..0000000
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/package-info.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-@XmlSchema(namespace = SyncopeConstants.NS)
-@XmlJavaTypeAdapters({ @XmlJavaTypeAdapter(type = Date.class, value = DateAdapter.class), })
-package org.apache.syncope.common.lib.policy;
-
-import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.jaxb.DateAdapter;
-
-import javax.xml.bind.annotation.XmlSchema;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
-
-import java.util.Date;
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/AuthModuleTO.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/AuthModuleTO.java
index 3f499bd..9d4d7f6 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/AuthModuleTO.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/AuthModuleTO.java
@@ -18,23 +18,15 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
 import javax.ws.rs.PathParam;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.syncope.common.lib.BaseBean;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.syncope.common.lib.auth.AuthModuleConf;
 
-@XmlRootElement(name = "authModule")
-@XmlType
-public class AuthModuleTO extends BaseBean implements EntityTO {
+public class AuthModuleTO implements EntityTO {
 
     private static final long serialVersionUID = -7490425997956703057L;
 
@@ -83,9 +75,6 @@ public class AuthModuleTO extends BaseBean implements EntityTO {
         this.conf = conf;
     }
 
-    @XmlElementWrapper(name = "items")
-    @XmlElement(name = "item")
-    @JsonProperty("items")
     public List<ItemTO> getItems() {
         return items;
     }
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/AuthProfileTO.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/AuthProfileTO.java
index 4c35578..dc4cb2d 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/AuthProfileTO.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/AuthProfileTO.java
@@ -18,24 +18,16 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.syncope.common.lib.BaseBean;
-import org.apache.syncope.common.lib.types.GoogleMfaAuthToken;
-
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import javax.ws.rs.PathParam;
-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 java.util.ArrayList;
 import java.util.List;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.syncope.common.lib.types.GoogleMfaAuthToken;
 
-@XmlRootElement(name = "authProfile")
-@XmlType
-public class AuthProfileTO extends BaseBean implements EntityTO {
+public class AuthProfileTO implements EntityTO {
 
     private static final long serialVersionUID = -6543425997956703057L;
 
@@ -64,9 +56,8 @@ public class AuthProfileTO extends BaseBean implements EntityTO {
         this.owner = owner;
     }
 
-    @XmlElementWrapper(name = "googleMfaAuthTokens")
-    @XmlElement(name = "googleMfaAuthTokens")
-    @JsonProperty("googleMfaAuthTokens")
+    @JacksonXmlElementWrapper(localName = "googleMfaAuthTokens")
+    @JacksonXmlProperty(localName = "googleMfaAuthToken")
     public List<GoogleMfaAuthToken> getGoogleMfaAuthTokens() {
         return googleMfaAuthTokens;
     }
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/GatewayRouteTO.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/GatewayRouteTO.java
index aeb8e2d..fe8d987 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/GatewayRouteTO.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/GatewayRouteTO.java
@@ -18,23 +18,16 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.List;
 import javax.ws.rs.PathParam;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.GatewayRouteFilter;
 import org.apache.syncope.common.lib.types.GatewayRoutePredicate;
 import org.apache.syncope.common.lib.types.GatewayRouteStatus;
 
-@XmlRootElement(name = "gatewayRoute")
-@XmlType
 public class GatewayRouteTO implements NamedEntityTO {
 
     private static final long serialVersionUID = 4044528284951757870L;
@@ -90,16 +83,10 @@ public class GatewayRouteTO implements NamedEntityTO {
         this.target = target;
     }
 
-    @XmlElementWrapper(name = "filters")
-    @XmlElement(name = "filter")
-    @JsonProperty("filters")
     public List<GatewayRouteFilter> getFilters() {
         return filters;
     }
 
-    @XmlElementWrapper(name = "predicates")
-    @XmlElement(name = "predicate")
-    @JsonProperty("predicates")
     public List<GatewayRoutePredicate> getPredicates() {
         return predicates;
     }
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/SAML2IdPMetadataTO.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/SAML2IdPMetadataTO.java
index 54c0030..e6263b5 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/SAML2IdPMetadataTO.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/SAML2IdPMetadataTO.java
@@ -21,13 +21,8 @@ package org.apache.syncope.common.lib.to;
 import javax.ws.rs.PathParam;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.syncope.common.lib.BaseBean;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 
-@XmlRootElement(name = "saml2idpMetadata")
-@XmlType
-public class SAML2IdPMetadataTO extends BaseBean implements EntityTO {
+public class SAML2IdPMetadataTO implements EntityTO {
 
     private static final long serialVersionUID = 7215073386484048953L;
 
@@ -178,5 +173,4 @@ public class SAML2IdPMetadataTO extends BaseBean implements EntityTO {
                 append(appliesTo).
                 build();
     }
-
 }
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/SAML2SPKeystoreTO.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/SAML2SPKeystoreTO.java
index c3cd496..d2c1fb4 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/SAML2SPKeystoreTO.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/SAML2SPKeystoreTO.java
@@ -21,15 +21,9 @@ package org.apache.syncope.common.lib.to;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.syncope.common.lib.BaseBean;
-
 import javax.ws.rs.PathParam;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 
-@XmlRootElement(name = "saml2spMetadataKeystore")
-@XmlType
-public class SAML2SPKeystoreTO extends BaseBean implements EntityTO {
+public class SAML2SPKeystoreTO implements EntityTO {
 
     private static final long serialVersionUID = 3211073386484148953L;
 
@@ -69,10 +63,10 @@ public class SAML2SPKeystoreTO extends BaseBean implements EntityTO {
     @Override
     public int hashCode() {
         return new HashCodeBuilder().
-            append(key).
-            append(keystore).
-            append(owner).
-            build();
+                append(key).
+                append(keystore).
+                append(owner).
+                build();
     }
 
     @Override
@@ -88,19 +82,19 @@ public class SAML2SPKeystoreTO extends BaseBean implements EntityTO {
         }
         SAML2SPKeystoreTO other = (SAML2SPKeystoreTO) obj;
         return new EqualsBuilder().
-            append(key, other.key).
-            append(keystore, other.keystore).
-            append(owner, other.owner).
-            build();
+                append(key, other.key).
+                append(keystore, other.keystore).
+                append(owner, other.owner).
+                build();
     }
 
     @Override
     public String toString() {
         return new ToStringBuilder(this)
-            .appendSuper(super.toString())
-            .append("key", key)
-            .append("owner", owner)
-            .toString();
+                .appendSuper(super.toString())
+                .append("key", key)
+                .append("owner", owner)
+                .toString();
     }
 
     public static class Builder {
@@ -121,5 +115,4 @@ public class SAML2SPKeystoreTO extends BaseBean implements EntityTO {
             return instance;
         }
     }
-
 }
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/SAML2SPMetadataTO.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/SAML2SPMetadataTO.java
index 104b90f..07ae1b7 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/SAML2SPMetadataTO.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/SAML2SPMetadataTO.java
@@ -21,15 +21,9 @@ package org.apache.syncope.common.lib.to;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.syncope.common.lib.BaseBean;
-
 import javax.ws.rs.PathParam;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 
-@XmlRootElement(name = "saml2spMetadata")
-@XmlType
-public class SAML2SPMetadataTO extends BaseBean implements EntityTO {
+public class SAML2SPMetadataTO implements EntityTO {
 
     private static final long serialVersionUID = 6215073386484048953L;
 
@@ -69,10 +63,10 @@ public class SAML2SPMetadataTO extends BaseBean implements EntityTO {
     @Override
     public int hashCode() {
         return new HashCodeBuilder().
-            append(key).
-            append(metadata).
-            append(owner).
-            build();
+                append(key).
+                append(metadata).
+                append(owner).
+                build();
     }
 
     @Override
@@ -88,22 +82,21 @@ public class SAML2SPMetadataTO extends BaseBean implements EntityTO {
         }
         SAML2SPMetadataTO other = (SAML2SPMetadataTO) obj;
         return new EqualsBuilder().
-            append(key, other.key).
-            append(metadata, other.metadata).
-            append(owner, other.owner).
-            build();
+                append(key, other.key).
+                append(metadata, other.metadata).
+                append(owner, other.owner).
+                build();
     }
 
     @Override
     public String toString() {
         return new ToStringBuilder(this)
-            .appendSuper(super.toString())
-            .append("key", key)
-            .append("owner", owner)
-            .toString();
+                .appendSuper(super.toString())
+                .append("key", key)
+                .append("owner", owner)
+                .toString();
     }
 
-
     public static class Builder {
 
         private final SAML2SPMetadataTO instance = new SAML2SPMetadataTO();
@@ -122,5 +115,4 @@ public class SAML2SPMetadataTO extends BaseBean implements EntityTO {
             return instance;
         }
     }
-
 }
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/client/ClientAppTO.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/client/ClientAppTO.java
index 465b9e7..8700c8c 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/client/ClientAppTO.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/client/ClientAppTO.java
@@ -21,28 +21,22 @@ package org.apache.syncope.common.lib.to.client;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import javax.ws.rs.PathParam;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.to.EntityTO;
 
-@XmlRootElement(name = "clientApp")
-@XmlType
-@XmlSeeAlso({ OIDCRPTO.class, SAML2SPTO.class })
-@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "@class")
-@JsonPropertyOrder(value = { "@class", "key", "description" })
-@Schema(subTypes = { OIDCRPTO.class, SAML2SPTO.class }, discriminatorProperty = "@class")
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "_class")
+@JsonPropertyOrder(value = { "_class", "key", "description" })
+@Schema(subTypes = { OIDCRPTO.class, SAML2SPTO.class }, discriminatorProperty = "_class")
 public abstract class ClientAppTO implements EntityTO {
 
     private static final long serialVersionUID = 6577639976115661357L;
 
-    @XmlTransient
-    @JsonProperty("@class")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
     private String discriminator;
 
     private String key;
@@ -59,7 +53,7 @@ public abstract class ClientAppTO implements EntityTO {
 
     private String attrReleasePolicy;
 
-    @Schema(name = "@class", required = true)
+    @Schema(name = "_class", required = true)
     public abstract String getDiscriminator();
 
     public void setDiscriminator(final String discriminator) {
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/client/OIDCRPTO.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/client/OIDCRPTO.java
index e5e92ee..fbecde7 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/client/OIDCRPTO.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/client/OIDCRPTO.java
@@ -19,22 +19,16 @@
 package org.apache.syncope.common.lib.to.client;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.ArrayList;
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.OIDCSubjectType;
 
-@XmlRootElement(name = "oidcrp")
-@XmlType
 @Schema(allOf = { ClientAppTO.class })
 public class OIDCRPTO extends ClientAppTO {
 
@@ -56,9 +50,9 @@ public class OIDCRPTO extends ClientAppTO {
 
     private final Set<String> supportedResponseTypes = new HashSet<>();
 
-    @XmlTransient
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.to.client.OIDCRPTO")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.client.OIDCRPTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
@@ -80,23 +74,14 @@ public class OIDCRPTO extends ClientAppTO {
         this.clientSecret = clientSecret;
     }
 
-    @XmlElementWrapper(name = "redirectUris")
-    @XmlElement(name = "redirectUri")
-    @JsonProperty("redirectUris")
     public List<String> getRedirectUris() {
         return redirectUris;
     }
 
-    @XmlElementWrapper(name = "supportedGrantTypes")
-    @XmlElement(name = "supportedGrantType")
-    @JsonProperty("supportedGrantTypes")
     public Set<String> getSupportedGrantTypes() {
         return supportedGrantTypes;
     }
 
-    @XmlElementWrapper(name = "supportedResponseTypes")
-    @XmlElement(name = "supportedResponseType")
-    @JsonProperty("supportedResponseTypes")
     public Set<String> getSupportedResponseTypes() {
         return supportedResponseTypes;
     }
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/client/SAML2SPTO.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/client/SAML2SPTO.java
index 955222a..cdedf9e 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/client/SAML2SPTO.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/client/SAML2SPTO.java
@@ -19,16 +19,12 @@
 package org.apache.syncope.common.lib.to.client;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
-import javax.xml.bind.annotation.XmlRootElement;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.syncope.common.lib.types.SAML2SPNameId;
 
-@XmlRootElement(name = "saml2SP")
-@XmlType
 @Schema(allOf = { ClientAppTO.class })
 public class SAML2SPTO extends ClientAppTO {
 
@@ -60,9 +56,9 @@ public class SAML2SPTO extends ClientAppTO {
 
     private String serviceProviderNameIdQualifier;
 
-    @XmlTransient
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.to.client.SAML2SPTO")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.client.SAML2SPTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/client/package-info.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/client/package-info.java
deleted file mode 100644
index 503eff0..0000000
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/client/package-info.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-@XmlSchema(namespace = SyncopeConstants.NS)
-@XmlJavaTypeAdapters({ @XmlJavaTypeAdapter(type = Date.class, value = DateAdapter.class), })
-package org.apache.syncope.common.lib.to.client;
-
-import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.jaxb.DateAdapter;
-
-import javax.xml.bind.annotation.XmlSchema;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
-
-import java.util.Date;
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/package-info.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/package-info.java
deleted file mode 100644
index 54e71ba..0000000
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/package-info.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-@XmlSchema(namespace = SyncopeConstants.NS)
-@XmlJavaTypeAdapters({ @XmlJavaTypeAdapter(type = Date.class, value = DateAdapter.class), })
-package org.apache.syncope.common.lib.to;
-
-import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.jaxb.DateAdapter;
-
-import javax.xml.bind.annotation.XmlSchema;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
-
-import java.util.Date;
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/ClientAppType.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/ClientAppType.java
index 7f90159..3bf730e 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/ClientAppType.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/ClientAppType.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum ClientAppType {
     SAML2SP,
     OIDCRP;
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/FilterFactory.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/FilterFactory.java
index e7fd117..5d71698 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/FilterFactory.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/FilterFactory.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum FilterFactory {
     ADD_REQUEST_HEADER,
     ADD_REQUEST_PARAMETER,
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/GatewayRouteFilter.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/GatewayRouteFilter.java
index 1b103a5..687b11b 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/GatewayRouteFilter.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/GatewayRouteFilter.java
@@ -18,15 +18,11 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import java.io.Serializable;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.syncope.common.lib.BaseBean;
 
-@XmlRootElement(name = "gatewayRouteFilter")
-@XmlType
-public class GatewayRouteFilter implements Serializable {
+public class GatewayRouteFilter implements BaseBean {
 
     private static final long serialVersionUID = -635785645207375128L;
 
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/GatewayRoutePredicate.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/GatewayRoutePredicate.java
index 9f26bbe..2c0c3c7 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/GatewayRoutePredicate.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/GatewayRoutePredicate.java
@@ -18,15 +18,11 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import java.io.Serializable;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.syncope.common.lib.BaseBean;
 
-@XmlRootElement(name = "gatewayRoutePredicate")
-@XmlType
-public class GatewayRoutePredicate implements Serializable {
+public class GatewayRoutePredicate implements BaseBean {
 
     private static final long serialVersionUID = -635785645207375128L;
 
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/GatewayRouteStatus.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/GatewayRouteStatus.java
index ab199e9..5155a1d 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/GatewayRouteStatus.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/GatewayRouteStatus.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum GatewayRouteStatus {
     DRAFT,
     STAGING,
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/GoogleMfaAuthToken.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/GoogleMfaAuthToken.java
index 5812756..8d3ec83 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/GoogleMfaAuthToken.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/GoogleMfaAuthToken.java
@@ -16,23 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 package org.apache.syncope.common.lib.types;
 
+import java.util.Date;
+import java.util.Optional;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.syncope.common.lib.BaseBean;
 
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
+public class GoogleMfaAuthToken implements BaseBean {
 
-import java.io.Serializable;
-import java.util.Date;
-import java.util.Optional;
-
-@XmlRootElement(name = "googleMfaAuthToken")
-@XmlType
-public class GoogleMfaAuthToken implements Serializable {
     private static final long serialVersionUID = 2185073386484048953L;
 
     private String key;
@@ -69,23 +63,23 @@ public class GoogleMfaAuthToken implements Serializable {
 
     public Date getIssueDate() {
         return Optional.ofNullable(this.issueDate).
-            map(date -> new Date(date.getTime())).orElse(null);
+                map(date -> new Date(date.getTime())).orElse(null);
     }
 
     public void setIssueDate(final Date issueDate) {
         this.issueDate = Optional.ofNullable(issueDate).
-            map(date -> new Date(date.getTime())).orElse(null);
+                map(date -> new Date(date.getTime())).orElse(null);
     }
 
     @Override
     public int hashCode() {
         return new HashCodeBuilder()
-            .appendSuper(super.hashCode())
-            .append(key)
-            .append(token)
-            .append(owner)
-            .append(issueDate)
-            .toHashCode();
+                .appendSuper(super.hashCode())
+                .append(key)
+                .append(token)
+                .append(owner)
+                .append(issueDate)
+                .toHashCode();
     }
 
     @Override
@@ -101,24 +95,24 @@ public class GoogleMfaAuthToken implements Serializable {
         }
         GoogleMfaAuthToken rhs = (GoogleMfaAuthToken) obj;
         return new EqualsBuilder()
-            .appendSuper(super.equals(obj))
-            .append(this.key, rhs.key)
-            .append(this.token, rhs.token)
-            .append(this.owner, rhs.owner)
-            .append(this.issueDate, rhs.issueDate)
-            .isEquals();
+                .appendSuper(super.equals(obj))
+                .append(this.key, rhs.key)
+                .append(this.token, rhs.token)
+                .append(this.owner, rhs.owner)
+                .append(this.issueDate, rhs.issueDate)
+                .isEquals();
     }
 
     @Override
     public String toString() {
         return new ToStringBuilder(this)
-            .append("key", key)
-            .append("token", token)
-            .append("owner", owner)
-            .append("issueDate", issueDate)
-            .toString();
+                .append("key", key)
+                .append("token", token)
+                .append("owner", owner)
+                .append("issueDate", issueDate)
+                .toString();
     }
-    
+
     public static class Builder {
 
         private final GoogleMfaAuthToken instance = new GoogleMfaAuthToken();
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCSubjectType.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCSubjectType.java
index 93966a5..9a1caec 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCSubjectType.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCSubjectType.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum OIDCSubjectType {
     PAIRWISE,
     PUBLIC
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/PredicateCond.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/PredicateCond.java
index 12d2704..c62ff78 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/PredicateCond.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/PredicateCond.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum PredicateCond {
     AND,
     OR
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/PredicateFactory.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/PredicateFactory.java
index c1e431f..3c343a2 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/PredicateFactory.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/PredicateFactory.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum PredicateFactory {
     AFTER,
     BEFORE,
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/SAML2SPNameId.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/SAML2SPNameId.java
index d75a68d..a7b60b9 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/SAML2SPNameId.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/SAML2SPNameId.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum SAML2SPNameId {
 
     EMAIL_ADDRESS("urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"),
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/wa/WAClientApp.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/wa/WAClientApp.java
index 82ab76e..6c2a55f 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/wa/WAClientApp.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/wa/WAClientApp.java
@@ -18,15 +18,15 @@
  */
 package org.apache.syncope.common.lib.wa;
 
-import java.io.Serializable;
 import java.util.HashMap;
 import java.util.Map;
+import org.apache.syncope.common.lib.BaseBean;
 import org.apache.syncope.common.lib.policy.AccessPolicyConf;
 import org.apache.syncope.common.lib.policy.AttrReleasePolicyConf;
 import org.apache.syncope.common.lib.policy.AuthPolicyConf;
 import org.apache.syncope.common.lib.to.client.ClientAppTO;
 
-public class WAClientApp implements Serializable {
+public class WAClientApp implements BaseBean {
 
     private static final long serialVersionUID = 6633251825655119506L;
 
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/wa/package-info.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/wa/package-info.java
deleted file mode 100644
index 988e450..0000000
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/wa/package-info.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-@XmlSchema(namespace = SyncopeConstants.NS)
-@XmlJavaTypeAdapters({ @XmlJavaTypeAdapter(type = Date.class, value = DateAdapter.class), })
-package org.apache.syncope.common.lib.wa;
-
-import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.jaxb.DateAdapter;
-
-import javax.xml.bind.annotation.XmlSchema;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
-
-import java.util.Date;
diff --git a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/types/ConnectorCapability.java b/common/am/lib/src/test/java/org/apache/syncope/common/lib/JSONTest.java
similarity index 72%
copy from common/idm/lib/src/main/java/org/apache/syncope/common/lib/types/ConnectorCapability.java
copy to common/am/lib/src/test/java/org/apache/syncope/common/lib/JSONTest.java
index 41b1e4a..14d547d 100644
--- a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/types/ConnectorCapability.java
+++ b/common/am/lib/src/test/java/org/apache/syncope/common/lib/JSONTest.java
@@ -16,21 +16,16 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.syncope.common.lib.types;
+package org.apache.syncope.common.lib;
 
-import javax.xml.bind.annotation.XmlEnum;
+import com.fasterxml.jackson.databind.ObjectMapper;
 
-/**
- * Enum of all possible capabilities that a connector instance can expose.
- */
-@XmlEnum
-public enum ConnectorCapability {
+public class JSONTest extends SerializationTest {
 
-    AUTHENTICATE,
-    CREATE,
-    UPDATE,
-    DELETE,
-    SEARCH,
-    SYNC;
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
 
+    @Override
+    protected ObjectMapper objectMapper() {
+        return OBJECT_MAPPER;
+    }
 }
diff --git a/common/am/lib/src/test/java/org/apache/syncope/common/lib/SerializationTest.java b/common/am/lib/src/test/java/org/apache/syncope/common/lib/SerializationTest.java
new file mode 100644
index 0000000..28ac120
--- /dev/null
+++ b/common/am/lib/src/test/java/org/apache/syncope/common/lib/SerializationTest.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.common.lib;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.Set;
+import org.apache.syncope.common.lib.policy.AccessPolicyTO;
+import org.apache.syncope.common.lib.policy.DefaultAccessPolicyConf;
+import org.junit.jupiter.api.Test;
+
+public abstract class SerializationTest {
+
+    protected abstract ObjectMapper objectMapper();
+
+    @Test
+    public void accessPolicyConf() throws IOException {
+        AccessPolicyTO policy = new AccessPolicyTO();
+        policy.setDescription("Test Access policy");
+
+        DefaultAccessPolicyConf conf = new DefaultAccessPolicyConf();
+        conf.setEnabled(true);
+        conf.setName("TestAccessPolicyConf");
+        conf.addRequiredAttr("cn", Set.of("admin", "Admin", "TheAdmin"));
+        policy.setConf(conf);
+
+        StringWriter writer = new StringWriter();
+        objectMapper().writeValue(writer, policy);
+
+        AccessPolicyTO actual = objectMapper().readValue(writer.toString(), AccessPolicyTO.class);
+        assertEquals(policy, actual);
+    }
+}
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/package-info.java b/common/am/lib/src/test/java/org/apache/syncope/common/lib/XMLTest.java
similarity index 50%
rename from common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/package-info.java
rename to common/am/lib/src/test/java/org/apache/syncope/common/lib/XMLTest.java
index 9b680ce..25f2a2a 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/package-info.java
+++ b/common/am/lib/src/test/java/org/apache/syncope/common/lib/XMLTest.java
@@ -16,12 +16,29 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-@XmlSchema(namespace = SyncopeConstants.NS)
-@XmlJavaTypeAdapters({ @XmlJavaTypeAdapter(type = Date.class, value = DateAdapter.class), })
 package org.apache.syncope.common.lib;
 
-import java.util.Date;
-import javax.xml.bind.annotation.XmlSchema;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
-import org.apache.syncope.common.lib.jaxb.DateAdapter;
+import com.fasterxml.jackson.annotation.JsonSetter;
+import com.fasterxml.jackson.annotation.Nulls;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.xml.XmlMapper;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class XMLTest extends SerializationTest {
+
+    private static final XmlMapper XML_MAPPER;
+
+    static {
+        XML_MAPPER = new XmlMapper();
+        XML_MAPPER.configOverride(List.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY));
+        XML_MAPPER.configOverride(Set.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY));
+        XML_MAPPER.configOverride(Map.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY));
+    }
+
+    @Override
+    protected ObjectMapper objectMapper() {
+        return XML_MAPPER;
+    }
+}
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/LogAppender.java b/common/am/lib/src/test/java/org/apache/syncope/common/lib/YAMLTest.java
similarity index 69%
copy from common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/LogAppender.java
copy to common/am/lib/src/test/java/org/apache/syncope/common/lib/YAMLTest.java
index 85c3d28..5ff4900 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/LogAppender.java
+++ b/common/am/lib/src/test/java/org/apache/syncope/common/lib/YAMLTest.java
@@ -16,21 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.syncope.common.lib.log;
+package org.apache.syncope.common.lib;
 
-import java.io.Serializable;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
 
-public class LogAppender implements Serializable {
+public class YAMLTest extends SerializationTest {
 
-    private static final long serialVersionUID = 5975199884460548302L;
+    private static final YAMLMapper YAML_MAPPER = new YAMLMapper();
 
-    private String name;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(final String name) {
-        this.name = name;
+    @Override
+    protected ObjectMapper objectMapper() {
+        return YAML_MAPPER;
     }
 }
diff --git a/common/am/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/wa/GoogleMfaAuthTokenService.java b/common/am/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/wa/GoogleMfaAuthTokenService.java
index 88e8fba..f8fdfe6 100644
--- a/common/am/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/wa/GoogleMfaAuthTokenService.java
+++ b/common/am/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/wa/GoogleMfaAuthTokenService.java
@@ -30,7 +30,6 @@ import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import java.util.Date;
-import java.util.List;
 import io.swagger.v3.oas.annotations.headers.Header;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
@@ -38,6 +37,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses;
 import io.swagger.v3.oas.annotations.security.SecurityRequirement;
 import io.swagger.v3.oas.annotations.security.SecurityRequirements;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import org.apache.syncope.common.lib.to.PagedResult;
 import org.apache.syncope.common.lib.types.GoogleMfaAuthToken;
 import org.apache.syncope.common.rest.api.RESTHeaders;
 import org.apache.syncope.common.rest.api.service.JAXRSService;
@@ -103,7 +103,7 @@ public interface GoogleMfaAuthTokenService extends JAXRSService {
     @Consumes({ MediaType.APPLICATION_JSON, RESTHeaders.APPLICATION_YAML, MediaType.APPLICATION_XML })
     @Produces({ MediaType.APPLICATION_JSON, RESTHeaders.APPLICATION_YAML, MediaType.APPLICATION_XML })
     @Path("tokens/owners/${owner}")
-    List<GoogleMfaAuthToken> findTokensFor(@NotNull @PathParam("owner") String owner);
+    PagedResult<GoogleMfaAuthToken> findTokensFor(@NotNull @PathParam("owner") String owner);
 
     @GET
     @Path("tokens/{key}")
@@ -114,12 +114,6 @@ public interface GoogleMfaAuthTokenService extends JAXRSService {
     @GET
     @Consumes({ MediaType.APPLICATION_JSON, RESTHeaders.APPLICATION_YAML, MediaType.APPLICATION_XML })
     @Produces({ MediaType.APPLICATION_JSON, RESTHeaders.APPLICATION_YAML, MediaType.APPLICATION_XML })
-    @Path("tokens/${owner}/count")
-    long countTokensForOwner(@NotNull @PathParam("owner") String owner);
-
-    @GET
-    @Consumes({ MediaType.APPLICATION_JSON, RESTHeaders.APPLICATION_YAML, MediaType.APPLICATION_XML })
-    @Produces({ MediaType.APPLICATION_JSON, RESTHeaders.APPLICATION_YAML, MediaType.APPLICATION_XML })
     @Path("tokens/count")
-    long countTokens();
+    PagedResult<GoogleMfaAuthToken> countTokens();
 }
diff --git a/common/idm/lib/pom.xml b/common/idm/lib/pom.xml
index 6d778d3..c3b9d03 100644
--- a/common/idm/lib/pom.xml
+++ b/common/idm/lib/pom.xml
@@ -43,17 +43,6 @@ under the License.
       <artifactId>syncope-common-idrepo-lib</artifactId>
       <version>${project.version}</version>
     </dependency>
-
-    <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-databind</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.junit.jupiter</groupId>
-      <artifactId>junit-jupiter</artifactId>
-      <scope>test</scope>
-    </dependency>
   </dependencies>
   
   <build>
diff --git a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ConnBundleTO.java b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ConnBundleTO.java
index 0809960..0b0911b 100644
--- a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ConnBundleTO.java
+++ b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ConnBundleTO.java
@@ -18,19 +18,14 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.io.Serializable;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.List;
-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 org.apache.syncope.common.lib.BaseBean;
 import org.apache.syncope.common.lib.types.ConnConfPropSchema;
 
-@XmlRootElement(name = "connectorBundle")
-@XmlType
-public class ConnBundleTO implements Serializable {
+public class ConnBundleTO implements BaseBean {
 
     private static final long serialVersionUID = 7215115961910138005L;
 
@@ -78,9 +73,8 @@ public class ConnBundleTO implements Serializable {
         this.connectorName = connectorName;
     }
 
-    @XmlElementWrapper(name = "properties")
-    @XmlElement(name = "connConfPropSchema")
-    @JsonProperty("properties")
+    @JacksonXmlElementWrapper(localName = "properties")
+    @JacksonXmlProperty(localName = "connConfPropSchema")
     public List<ConnConfPropSchema> getProperties() {
         return properties;
     }
diff --git a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ConnIdObjectClassTO.java b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ConnIdObjectClassTO.java
index feba9d0..93b4a4f 100644
--- a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ConnIdObjectClassTO.java
+++ b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ConnIdObjectClassTO.java
@@ -18,21 +18,16 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.io.Serializable;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.List;
-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 org.apache.syncope.common.lib.BaseBean;
 
 /**
  * Metadata description of ConnId ObjectClass.
  */
-@XmlRootElement(name = "connIdObjectClass")
-@XmlType
-public class ConnIdObjectClassTO implements Serializable {
+public class ConnIdObjectClassTO implements BaseBean {
 
     private static final long serialVersionUID = -3719658595689434648L;
 
@@ -68,9 +63,8 @@ public class ConnIdObjectClassTO implements Serializable {
         this.auxiliary = auxiliary;
     }
 
-    @XmlElementWrapper(name = "attributes")
-    @XmlElement(name = "attribute")
-    @JsonProperty("attributes")
+    @JacksonXmlElementWrapper(localName = "attributes")
+    @JacksonXmlProperty(localName = "attribute")
     public List<PlainSchemaTO> getAttributes() {
         return attributes;
     }
diff --git a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceTO.java b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceTO.java
index d2724f0..08f93ad 100644
--- a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceTO.java
+++ b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceTO.java
@@ -19,24 +19,19 @@
 package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.EnumSet;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 import javax.ws.rs.PathParam;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.common.lib.types.ConnectorCapability;
 
-@XmlRootElement(name = "connInstance")
-@XmlType
 public class ConnInstanceTO implements EntityTO {
 
     private static final long serialVersionUID = 2707778645445168671L;
@@ -114,9 +109,8 @@ public class ConnInstanceTO implements EntityTO {
         this.version = version;
     }
 
-    @XmlElementWrapper(name = "conf")
-    @XmlElement(name = "property")
-    @JsonProperty("conf")
+    @JacksonXmlElementWrapper(localName = "conf")
+    @JacksonXmlProperty(localName = "property")
     public List<ConnConfProperty> getConf() {
         return this.conf;
     }
@@ -126,9 +120,8 @@ public class ConnInstanceTO implements EntityTO {
         return conf.stream().filter(property -> property.getSchema().getName().equals(schemaName)).findFirst();
     }
 
-    @XmlElementWrapper(name = "capabilities")
-    @XmlElement(name = "capability")
-    @JsonProperty("capabilities")
+    @JacksonXmlElementWrapper(localName = "capabilities")
+    @JacksonXmlProperty(localName = "capability")
     public Set<ConnectorCapability> getCapabilities() {
         return capabilities;
     }
diff --git a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ConnPoolConfTO.java b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ConnPoolConfTO.java
index d77bcf0..3ac8231 100644
--- a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ConnPoolConfTO.java
+++ b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ConnPoolConfTO.java
@@ -18,15 +18,11 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import java.io.Serializable;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.syncope.common.lib.BaseBean;
 
-@XmlRootElement(name = "connPoolConf")
-@XmlType
-public class ConnPoolConfTO implements Serializable {
+public class ConnPoolConfTO implements BaseBean {
 
     private static final long serialVersionUID = -214360178113476623L;
 
diff --git a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/MappingTO.java b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/MappingTO.java
index 3fe44e7..c29246a 100644
--- a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/MappingTO.java
+++ b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/MappingTO.java
@@ -18,22 +18,15 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.io.Serializable;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
-
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 
-@XmlRootElement(name = "mapping")
-@XmlType
-public class MappingTO implements ItemContainerTO, Serializable {
+public class MappingTO implements ItemContainerTO {
 
     private static final long serialVersionUID = 8447688036282611118L;
 
@@ -66,12 +59,11 @@ public class MappingTO implements ItemContainerTO, Serializable {
     @Override
     public boolean setConnObjectKeyItem(final ItemTO connObjectKeyItem) {
         return Optional.ofNullable(connObjectKeyItem)
-            .map(this::addConnObjectKeyItem).orElseGet(() -> remove(getConnObjectKeyItem()));
+                .map(this::addConnObjectKeyItem).orElseGet(() -> remove(getConnObjectKeyItem()));
     }
 
-    @XmlElementWrapper(name = "items")
-    @XmlElement(name = "item")
-    @JsonProperty("items")
+    @JacksonXmlElementWrapper(localName = "items")
+    @JacksonXmlProperty(localName = "item")
     @Override
     public List<ItemTO> getItems() {
         return items;
@@ -80,16 +72,15 @@ public class MappingTO implements ItemContainerTO, Serializable {
     @Override
     public boolean add(final ItemTO item) {
         return Optional.ofNullable(item)
-            .filter(itemTO -> this.items.contains(itemTO) || this.items.add(itemTO)).isPresent();
+                .filter(itemTO -> this.items.contains(itemTO) || this.items.add(itemTO)).isPresent();
     }
 
     public boolean remove(final ItemTO item) {
         return this.items.remove(item);
     }
 
-    @XmlElementWrapper(name = "linkingItems")
-    @XmlElement(name = "item")
-    @JsonProperty("linkingItems")
+    @JacksonXmlElementWrapper(localName = "linkingItems")
+    @JacksonXmlProperty(localName = "linkingItem")
     public List<ItemTO> getLinkingItems() {
         return linkingItems;
     }
diff --git a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/OrgUnitTO.java b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/OrgUnitTO.java
index 758f28d..29cf761 100644
--- a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/OrgUnitTO.java
+++ b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/OrgUnitTO.java
@@ -18,20 +18,14 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
-
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 
-@XmlRootElement(name = "orgUnit")
-@XmlType
 public class OrgUnitTO implements EntityTO, ItemContainerTO {
 
     private static final long serialVersionUID = -1868877794174953177L;
@@ -105,12 +99,11 @@ public class OrgUnitTO implements EntityTO, ItemContainerTO {
     @Override
     public boolean setConnObjectKeyItem(final ItemTO connObjectKeyItem) {
         return Optional.ofNullable(connObjectKeyItem)
-            .map(this::addConnObjectKeyItem).orElseGet(() -> remove(getConnObjectKeyItem()));
+                .map(this::addConnObjectKeyItem).orElseGet(() -> remove(getConnObjectKeyItem()));
     }
 
-    @XmlElementWrapper(name = "items")
-    @XmlElement(name = "item")
-    @JsonProperty("items")
+    @JacksonXmlElementWrapper(localName = "items")
+    @JacksonXmlProperty(localName = "item")
     @Override
     public List<ItemTO> getItems() {
         return items;
@@ -119,7 +112,7 @@ public class OrgUnitTO implements EntityTO, ItemContainerTO {
     @Override
     public boolean add(final ItemTO item) {
         return Optional.ofNullable(item)
-            .filter(itemTO -> this.items.contains(itemTO) || this.items.add(itemTO)).isPresent();
+                .filter(itemTO -> this.items.contains(itemTO) || this.items.add(itemTO)).isPresent();
     }
 
     public boolean remove(final ItemTO item) {
diff --git a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/PagedConnObjectTOResult.java b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/PagedConnObjectTOResult.java
index 8aece80..57e2d1f 100644
--- a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/PagedConnObjectTOResult.java
+++ b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/PagedConnObjectTOResult.java
@@ -18,21 +18,16 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.io.Serializable;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.List;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.syncope.common.lib.BaseBean;
 
-@XmlRootElement(name = "pagedConnObjectResult")
-@XmlType
-public class PagedConnObjectTOResult implements Serializable {
+public class PagedConnObjectTOResult implements BaseBean {
 
     private static final long serialVersionUID = -2832908019064402976L;
 
@@ -112,9 +107,8 @@ public class PagedConnObjectTOResult implements Serializable {
         this.allResultsReturned = allResultsReturned;
     }
 
-    @XmlElementWrapper(name = "result")
-    @XmlElement(name = "item")
-    @JsonProperty("result")
+    @JacksonXmlElementWrapper(localName = "result")
+    @JacksonXmlProperty(localName = "item")
     public List<ConnObjectTO> getResult() {
         return result;
     }
diff --git a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisionTO.java b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisionTO.java
index 2e57792..fb1190e 100644
--- a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisionTO.java
+++ b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisionTO.java
@@ -18,18 +18,13 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.List;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 
-@XmlRootElement(name = "provision")
-@XmlType
 public class ProvisionTO implements EntityTO {
 
     private static final long serialVersionUID = 8298910216218007927L;
@@ -78,9 +73,8 @@ public class ProvisionTO implements EntityTO {
         this.objectClass = objectClass;
     }
 
-    @XmlElementWrapper(name = "auxClasses")
-    @XmlElement(name = "class")
-    @JsonProperty("auxClasses")
+    @JacksonXmlElementWrapper(localName = "auxClasses")
+    @JacksonXmlProperty(localName = "class")
     public List<String> getAuxClasses() {
         return auxClasses;
     }
@@ -117,9 +111,8 @@ public class ProvisionTO implements EntityTO {
         this.mapping = mapping;
     }
 
-    @XmlElementWrapper(name = "virSchemas")
-    @XmlElement(name = "virSchema")
-    @JsonProperty("virSchemas")
+    @JacksonXmlElementWrapper(localName = "virSchemas")
+    @JacksonXmlProperty(localName = "virSchema")
     public List<String> getVirSchemas() {
         return virSchemas;
     }
diff --git a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisioningReport.java b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisioningReport.java
index a23745a..7ca1a57 100644
--- a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisioningReport.java
+++ b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisioningReport.java
@@ -18,23 +18,17 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import java.io.Serializable;
 import java.util.Collection;
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.syncope.common.lib.BaseBean;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.common.lib.types.TraceLevel;
 
-@XmlRootElement(name = "provisioningReport")
-@XmlType
-public class ProvisioningReport implements Serializable {
+public class ProvisioningReport implements BaseBean {
 
     private static final long serialVersionUID = 9201119472070963385L;
 
-    @XmlEnum
     public enum Status {
 
         SUCCESS,
diff --git a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ReconStatus.java b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ReconStatus.java
index a78f4b2..eb4bd15 100644
--- a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ReconStatus.java
+++ b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ReconStatus.java
@@ -19,18 +19,14 @@
 package org.apache.syncope.common.lib.to;
 
 import io.swagger.v3.oas.annotations.media.Schema;
-import java.io.Serializable;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
+import org.apache.syncope.common.lib.BaseBean;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.MatchType;
 
 /**
  * Reconciliation status.
  */
-@XmlRootElement(name = "reconStatus")
-@XmlType
-public class ReconStatus implements Serializable {
+public class ReconStatus implements BaseBean {
 
     private static final long serialVersionUID = -8516345256596521490L;
 
diff --git a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/RemediationTO.java b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/RemediationTO.java
index 0cdd033..8f7528a 100644
--- a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/RemediationTO.java
+++ b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/RemediationTO.java
@@ -21,18 +21,12 @@ package org.apache.syncope.common.lib.to;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.Date;
 import java.util.Optional;
-
 import javax.ws.rs.PathParam;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.BaseBean;
 import org.apache.syncope.common.lib.request.AnyCR;
 import org.apache.syncope.common.lib.request.AnyUR;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 
-@XmlRootElement(name = "remediation")
-@XmlType
-public class RemediationTO extends BaseBean implements EntityTO {
+public class RemediationTO implements EntityTO {
 
     private static final long serialVersionUID = 3983540425142284975L;
 
diff --git a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceTO.java b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceTO.java
index 945ab80..344b0a6 100644
--- a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceTO.java
+++ b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceTO.java
@@ -19,25 +19,18 @@
 package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
 import java.util.ArrayList;
 import java.util.EnumSet;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 import javax.ws.rs.PathParam;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.common.lib.types.ConnectorCapability;
 import org.apache.syncope.common.lib.types.TraceLevel;
 
-@XmlRootElement(name = "resource")
-@XmlType
 public class ResourceTO implements EntityTO {
 
     private static final long serialVersionUID = -9193551354041698963L;
@@ -232,9 +225,6 @@ public class ResourceTO implements EntityTO {
                 findFirst();
     }
 
-    @XmlElementWrapper(name = "provisions")
-    @XmlElement(name = "provision")
-    @JsonProperty("provisions")
     public List<ProvisionTO> getProvisions() {
         return provisions;
     }
@@ -247,9 +237,6 @@ public class ResourceTO implements EntityTO {
         this.orgUnit = orgUnit;
     }
 
-    @XmlElementWrapper(name = "confOverride")
-    @XmlElement(name = "property")
-    @JsonProperty("confOverride")
     public List<ConnConfProperty> getConfOverride() {
         return confOverride;
     }
@@ -262,9 +249,6 @@ public class ResourceTO implements EntityTO {
         this.overrideCapabilities = overrideCapabilities;
     }
 
-    @XmlElementWrapper(name = "capabilitiesOverride")
-    @XmlElement(name = "capability")
-    @JsonProperty("capabilitiesOverride")
     public Set<ConnectorCapability> getCapabilitiesOverride() {
         return capabilitiesOverride;
     }
@@ -277,9 +261,6 @@ public class ResourceTO implements EntityTO {
         this.provisioningTraceLevel = provisioningTraceLevel;
     }
 
-    @XmlElementWrapper(name = "propagationActions")
-    @XmlElement(name = "propagationAction")
-    @JsonProperty("propagationActions")
     public List<String> getPropagationActions() {
         return propagationActions;
     }
diff --git a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/types/ConnConfPropSchema.java b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/types/ConnConfPropSchema.java
index 7bdcbbd..e2c7a2e 100644
--- a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/types/ConnConfPropSchema.java
+++ b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/types/ConnConfPropSchema.java
@@ -18,20 +18,15 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.io.Serializable;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.List;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.syncope.common.lib.BaseBean;
 
-@XmlRootElement
-@XmlType
-public class ConnConfPropSchema implements Serializable, Comparable<ConnConfPropSchema> {
+public class ConnConfPropSchema implements BaseBean, Comparable<ConnConfPropSchema> {
 
     private static final long serialVersionUID = -1976365781005801296L;
 
@@ -107,9 +102,8 @@ public class ConnConfPropSchema implements Serializable, Comparable<ConnConfProp
         this.confidential = confidential;
     }
 
-    @XmlElementWrapper(name = "defaultValues")
-    @XmlElement(name = "defaultValue")
-    @JsonProperty("defaultValues")
+    @JacksonXmlElementWrapper(localName = "defaultValues")
+    @JacksonXmlProperty(localName = "defaultValue")
     public List<Object> getDefaultValues() {
         return defaultValues;
     }
diff --git a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/types/ConnConfProperty.java b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/types/ConnConfProperty.java
index 111d4a1..b9a931d 100644
--- a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/types/ConnConfProperty.java
+++ b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/types/ConnConfProperty.java
@@ -18,21 +18,16 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.io.Serializable;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.List;
-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 org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.syncope.common.lib.BaseBean;
 
-@XmlRootElement
-@XmlType
-public class ConnConfProperty implements Serializable, Comparable<ConnConfProperty> {
+public class ConnConfProperty implements BaseBean, Comparable<ConnConfProperty> {
 
     private static final long serialVersionUID = -8391413960221862238L;
 
@@ -50,9 +45,8 @@ public class ConnConfProperty implements Serializable, Comparable<ConnConfProper
         this.schema = schema;
     }
 
-    @XmlElementWrapper(name = "values")
-    @XmlElement(name = "value")
-    @JsonProperty("values")
+    @JacksonXmlElementWrapper(localName = "values")
+    @JacksonXmlProperty(localName = "value")
     public List<Object> getValues() {
         return values;
     }
diff --git a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/types/ConnectorCapability.java b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/types/ConnectorCapability.java
index 41b1e4a..1abf35f 100644
--- a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/types/ConnectorCapability.java
+++ b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/types/ConnectorCapability.java
@@ -18,12 +18,9 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
 /**
  * Enum of all possible capabilities that a connector instance can expose.
  */
-@XmlEnum
 public enum ConnectorCapability {
 
     AUTHENTICATE,
diff --git a/common/idm/lib/src/test/java/org/apache/syncope/common/lib/JAXBTest.java b/common/idm/lib/src/test/java/org/apache/syncope/common/lib/JAXBTest.java
deleted file mode 100644
index 3efa2a2..0000000
--- a/common/idm/lib/src/test/java/org/apache/syncope/common/lib/JAXBTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.common.lib;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.util.UUID;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.Unmarshaller;
-import org.apache.syncope.common.lib.to.ConnObjectTO;
-import org.apache.syncope.common.lib.to.GroupTO;
-import org.apache.syncope.common.lib.to.PropagationStatus;
-import org.apache.syncope.common.lib.to.ProvisioningResult;
-import org.junit.jupiter.api.Test;
-
-public class JAXBTest {
-
-    @Test
-    public void provisioningResult() throws JAXBException {
-        JAXBContext context = JAXBContext.newInstance(ProvisioningResult.class);
-        Marshaller marshaller = context.createMarshaller();
-        Unmarshaller unmarshaller = context.createUnmarshaller();
-
-        GroupTO group = new GroupTO();
-        group.setName(UUID.randomUUID().toString());
-        group.setRealm(SyncopeConstants.ROOT_REALM);
-        group.getVirAttrs().add(new Attr.Builder("rvirtualdata").value("rvirtualvalue").build());
-        group.getADynMembershipConds().put("USER", "username==a*");
-
-        ProvisioningResult<GroupTO> original = new ProvisioningResult<>();
-        original.setEntity(group);
-
-        PropagationStatus status = new PropagationStatus();
-        status.setFailureReason("failed");
-        status.setBeforeObj(new ConnObjectTO());
-        original.getPropagationStatuses().add(status);
-
-        StringWriter writer = new StringWriter();
-        marshaller.marshal(original, writer);
-
-        Object actual = unmarshaller.unmarshal(new StringReader(writer.toString()));
-        assertEquals(original, actual);
-    }
-}
diff --git a/common/idm/lib/src/test/java/org/apache/syncope/common/lib/JSONTest.java b/common/idm/lib/src/test/java/org/apache/syncope/common/lib/JSONTest.java
deleted file mode 100644
index ec2e89b..0000000
--- a/common/idm/lib/src/test/java/org/apache/syncope/common/lib/JSONTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.common.lib;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.util.UUID;
-import org.apache.syncope.common.lib.to.ConnObjectTO;
-import org.apache.syncope.common.lib.to.GroupTO;
-import org.apache.syncope.common.lib.to.PropagationStatus;
-import org.apache.syncope.common.lib.to.ProvisioningResult;
-import org.junit.jupiter.api.Test;
-
-public class JSONTest {
-
-    @Test
-    public void provisioningResult() throws IOException {
-        GroupTO group = new GroupTO();
-        group.setName(UUID.randomUUID().toString());
-        group.setRealm(SyncopeConstants.ROOT_REALM);
-        group.getVirAttrs().add(new Attr.Builder("rvirtualdata").value("rvirtualvalue").build());
-        group.getADynMembershipConds().put("USER", "username==a*");
-
-        ProvisioningResult<GroupTO> original = new ProvisioningResult<>();
-        original.setEntity(group);
-
-        PropagationStatus status = new PropagationStatus();
-        status.setFailureReason("failed");
-        status.setBeforeObj(new ConnObjectTO());
-        original.getPropagationStatuses().add(status);
-
-        ObjectMapper mapper = new ObjectMapper();
-
-        StringWriter writer = new StringWriter();
-        mapper.writeValue(writer, original);
-
-        ProvisioningResult<GroupTO> actual = mapper.readValue(writer.toString(),
-                new TypeReference<ProvisioningResult<GroupTO>>() {
-        });
-        assertEquals(original, actual);
-    }
-}
diff --git a/common/idrepo/lib/pom.xml b/common/idrepo/lib/pom.xml
index 6057ed3..8c57f6b 100644
--- a/common/idrepo/lib/pom.xml
+++ b/common/idrepo/lib/pom.xml
@@ -51,12 +51,14 @@ under the License.
     <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-annotations</artifactId>
-    </dependency>
-    
+    </dependency>    
     <dependency>
       <groupId>com.fasterxml.jackson.dataformat</groupId>
       <artifactId>jackson-dataformat-yaml</artifactId>
-      <version>${jackson.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.dataformat</groupId>
+      <artifactId>jackson-dataformat-xml</artifactId>
     </dependency>
 
     <dependency>
@@ -74,11 +76,6 @@ under the License.
     </dependency>
     
     <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-databind</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
       <groupId>org.junit.jupiter</groupId>
       <artifactId>junit-jupiter</artifactId>
       <scope>test</scope>
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/Attr.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/Attr.java
index 88ec261..a555bff 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/Attr.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/Attr.java
@@ -19,21 +19,16 @@
 package org.apache.syncope.common.lib;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
-import java.io.Serializable;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import javax.ws.rs.PathParam;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 
-@XmlRootElement(name = "attr")
-@XmlType
-public class Attr implements Serializable {
+public class Attr implements BaseBean {
 
     private static final long serialVersionUID = 4941691338796323623L;
 
@@ -79,7 +74,6 @@ public class Attr implements Serializable {
      * @return the name of the schema that this attribute is referring to
      */
     @JsonProperty(required = true)
-    @XmlElement(required = true)
     public String getSchema() {
         return schema;
     }
@@ -96,9 +90,9 @@ public class Attr implements Serializable {
     /**
      * @return attribute values as strings
      */
-    @XmlElementWrapper(name = "values", required = true)
-    @XmlElement(name = "value", required = true)
-    @JsonProperty(value = "values", required = true)
+    @JacksonXmlElementWrapper(localName = "values")
+    @JacksonXmlProperty(localName = "value")
+    @JsonProperty(required = true)
     public List<String> getValues() {
         return values;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/BaseBean.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/BaseBean.java
index f3d603b..3ff56bd 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/BaseBean.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/BaseBean.java
@@ -19,18 +19,7 @@
 package org.apache.syncope.common.lib;
 
 import java.io.Serializable;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.log.AuditEntry;
-import org.apache.syncope.common.lib.to.AbstractStartEndBean;
-import org.apache.syncope.common.lib.to.AccessTokenTO;
-import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.common.lib.to.RealmTO;
 
-@XmlType
-@XmlSeeAlso({ AbstractStartEndBean.class, AccessTokenTO.class, AuditEntry.class, AnyTO.class, RealmTO.class })
-public abstract class BaseBean implements Serializable {
-
-    private static final long serialVersionUID = 8243277089603485380L;
+public interface BaseBean extends Serializable {
 
 }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/SyncopeConstants.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/SyncopeConstants.java
index d0db694..6f5843a 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/SyncopeConstants.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/SyncopeConstants.java
@@ -23,10 +23,6 @@ import java.util.regex.Pattern;
 
 public final class SyncopeConstants {
 
-    public static final String NS_PREFIX = "syncope30";
-
-    public static final String NS = "http://syncope.apache.org/3.0";
-
     public static final String MASTER_DOMAIN = "Master";
 
     public static final String ROOT_REALM = "/";
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/info/JavaImplInfo.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/info/JavaImplInfo.java
index df5579a..379df8c 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/info/JavaImplInfo.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/info/JavaImplInfo.java
@@ -18,18 +18,13 @@
  */
 package org.apache.syncope.common.lib.info;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.io.Serializable;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.HashSet;
 import java.util.Set;
-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 org.apache.syncope.common.lib.BaseBean;
 
-@XmlRootElement(name = "javaImplInfo")
-@XmlType
-public class JavaImplInfo implements Serializable {
+public class JavaImplInfo implements BaseBean {
 
     private static final long serialVersionUID = 4036793959111794959L;
 
@@ -45,9 +40,8 @@ public class JavaImplInfo implements Serializable {
         this.type = type;
     }
 
-    @XmlElementWrapper(name = "classes")
-    @XmlElement(name = "class")
-    @JsonProperty("classes")
+    @JacksonXmlElementWrapper(localName = "classes")
+    @JacksonXmlProperty(localName = "class")
     public Set<String> getClasses() {
         return classes;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/info/NumbersInfo.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/info/NumbersInfo.java
index 4ed088f..a2a0874 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/info/NumbersInfo.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/info/NumbersInfo.java
@@ -18,26 +18,16 @@
  */
 package org.apache.syncope.common.lib.info;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.io.Serializable;
 import java.util.HashMap;
 import java.util.Map;
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
+import org.apache.syncope.common.lib.BaseBean;
 
-@XmlRootElement(name = "numbersInfo")
-@XmlType
-public class NumbersInfo implements Serializable {
+public class NumbersInfo implements BaseBean {
 
     private static final long serialVersionUID = 7691187370598649583L;
 
-    @XmlEnum
-    @XmlType(name = "confItem")
     public enum ConfItem {
 
         RESOURCE(20),
@@ -67,8 +57,6 @@ public class NumbersInfo implements Serializable {
         }
     }
 
-    @XmlRootElement(name = "taskExecutorInfo")
-    @XmlType
     public class TaskExecutorInfo {
 
         private int size;
@@ -144,36 +132,30 @@ public class NumbersInfo implements Serializable {
 
     private int totalUsers;
 
-    @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
     private final Map<String, Integer> usersByRealm = new HashMap<>();
 
-    @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
     private final Map<String, Integer> usersByStatus = new HashMap<>();
 
     private int totalGroups;
 
-    @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
     private final Map<String, Integer> groupsByRealm = new HashMap<>();
 
     private String anyType1;
 
     private Integer totalAny1;
 
-    @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
     private final Map<String, Integer> any1ByRealm = new HashMap<>();
 
     private String anyType2;
 
     private Integer totalAny2;
 
-    @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
     private final Map<String, Integer> any2ByRealm = new HashMap<>();
 
     private int totalResources;
 
     private int totalRoles;
 
-    @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
     private final Map<String, Boolean> confCompleteness = new HashMap<>();
 
     private final TaskExecutorInfo asyncConnectorExecutor = new TaskExecutorInfo();
@@ -244,32 +226,26 @@ public class NumbersInfo implements Serializable {
         this.totalRoles = totalRoles;
     }
 
-    @JsonProperty
     public Map<String, Integer> getUsersByRealm() {
         return usersByRealm;
     }
 
-    @JsonProperty
     public Map<String, Integer> getUsersByStatus() {
         return usersByStatus;
     }
 
-    @JsonProperty
     public Map<String, Integer> getGroupsByRealm() {
         return groupsByRealm;
     }
 
-    @JsonProperty
     public Map<String, Integer> getAny1ByRealm() {
         return any1ByRealm;
     }
 
-    @JsonProperty
     public Map<String, Integer> getAny2ByRealm() {
         return any2ByRealm;
     }
 
-    @JsonProperty
     public Map<String, Boolean> getConfCompleteness() {
         return confCompleteness;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/info/PlatformInfo.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/info/PlatformInfo.java
index c67e280..380fd28 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/info/PlatformInfo.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/info/PlatformInfo.java
@@ -19,27 +19,20 @@
 package org.apache.syncope.common.lib.info;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.io.Serializable;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
-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 org.apache.syncope.common.lib.BaseBean;
 
-@XmlRootElement(name = "platformInfo")
-@XmlType
-public class PlatformInfo implements Serializable {
+public class PlatformInfo implements BaseBean {
 
     private static final long serialVersionUID = -7941853999417673827L;
 
-    @XmlRootElement(name = "provisioningInfo")
-    @XmlType
-    public static class ProvisioningInfo implements Serializable {
+    public static class ProvisioningInfo implements BaseBean {
 
         private static final long serialVersionUID = 533340357732839568L;
 
@@ -114,9 +107,7 @@ public class PlatformInfo implements Serializable {
         }
     }
 
-    @XmlRootElement(name = "workflowInfo")
-    @XmlType
-    public static class WorkflowInfo implements Serializable {
+    public static class WorkflowInfo implements BaseBean {
 
         private static final long serialVersionUID = 6736937721099195324L;
 
@@ -151,9 +142,7 @@ public class PlatformInfo implements Serializable {
         }
     }
 
-    @XmlRootElement(name = "persistenceInfo")
-    @XmlType
-    public static class PersistenceInfo implements Serializable {
+    public static class PersistenceInfo implements BaseBean {
 
         private static final long serialVersionUID = 2902980556801069487L;
 
@@ -316,9 +305,8 @@ public class PlatformInfo implements Serializable {
         return pwdResetRequiringSecurityQuestions;
     }
 
-    @XmlElementWrapper(name = "connIdLocations")
-    @XmlElement(name = "connIdLocation")
-    @JsonProperty("connIdLocations")
+    @JacksonXmlElementWrapper(localName = "connIdLocations")
+    @JacksonXmlProperty(localName = "connIdLocation")
     public Set<String> getConnIdLocations() {
         return connIdLocations;
     }
@@ -331,44 +319,38 @@ public class PlatformInfo implements Serializable {
         this.passwordGenerator = passwordGenerator;
     }
 
-    @XmlElementWrapper(name = "anyTypes")
-    @XmlElement(name = "anyType")
-    @JsonProperty("anyTypes")
+    @JacksonXmlElementWrapper(localName = "anyTypes")
+    @JacksonXmlProperty(localName = "anyType")
     public List<String> getAnyTypes() {
         return anyTypes;
     }
 
-    @XmlElementWrapper(name = "userClasses")
-    @XmlElement(name = "userClass")
-    @JsonProperty("userClasses")
+    @JacksonXmlElementWrapper(localName = "userClasses")
+    @JacksonXmlProperty(localName = "userClass")
     public List<String> getUserClasses() {
         return userClasses;
     }
 
-    @XmlElementWrapper(name = "anyTypeClasses")
-    @XmlElement(name = "anyTypeClass")
-    @JsonProperty("anyTypeClasses")
+    @JacksonXmlElementWrapper(localName = "anyTypeClasses")
+    @JacksonXmlProperty(localName = "anyTypeClass")
     public List<String> getAnyTypeClasses() {
         return anyTypeClasses;
     }
 
-    @XmlElementWrapper(name = "resources")
-    @XmlElement(name = "resource")
-    @JsonProperty("resources")
+    @JacksonXmlElementWrapper(localName = "resources")
+    @JacksonXmlProperty(localName = "resource")
     public List<String> getResources() {
         return resources;
     }
 
-    @XmlElementWrapper(name = "entitlements")
-    @XmlElement(name = "entitlement")
-    @JsonProperty("entitlements")
+    @JacksonXmlElementWrapper(localName = "entitlements")
+    @JacksonXmlProperty(localName = "entitlement")
     public Set<String> getEntitlements() {
         return entitlements;
     }
 
-    @XmlElementWrapper(name = "implementationTypes")
-    @XmlElement(name = "implementationType")
-    @JsonProperty("implementationTypes")
+    @JacksonXmlElementWrapper(localName = "implementationTypes")
+    @JacksonXmlProperty(localName = "implementationType")
     public Set<String> getImplementationTypes() {
         return implementationTypes;
     }
@@ -378,9 +360,8 @@ public class PlatformInfo implements Serializable {
         return javaImplInfos.stream().filter(javaImplInfo -> javaImplInfo.getType().equals(type)).findFirst();
     }
 
-    @XmlElementWrapper(name = "javaImplInfos")
-    @XmlElement(name = "javaImplInfo")
-    @JsonProperty("javaImplInfos")
+    @JacksonXmlElementWrapper(localName = "javaImplInfos")
+    @JacksonXmlProperty(localName = "javaImplInfo")
     public Set<JavaImplInfo> getJavaImplInfos() {
         return javaImplInfos;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/info/SystemInfo.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/info/SystemInfo.java
index 5d12ad1..2f44796 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/info/SystemInfo.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/info/SystemInfo.java
@@ -18,18 +18,11 @@
  */
 package org.apache.syncope.common.lib.info;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.io.Serializable;
 import java.util.Queue;
-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 org.apache.syncope.common.lib.BaseBean;
 import org.apache.syncope.common.lib.collections.CircularFifoQueue;
 
-@XmlRootElement(name = "systemInfo")
-@XmlType
-public class SystemInfo implements Serializable {
+public class SystemInfo implements BaseBean {
 
     private static final long serialVersionUID = -352727968865892499L;
 
@@ -85,16 +78,11 @@ public class SystemInfo implements Serializable {
         this.startTime = startTime;
     }
 
-    @XmlElementWrapper(name = "load")
-    @XmlElement(name = "instant")
-    @JsonProperty("load")
     public Queue<LoadInstant> getLoad() {
         return load;
     }
 
-    @XmlRootElement(name = "loadInstant")
-    @XmlType
-    public static class LoadInstant implements Serializable {
+    public static class LoadInstant implements BaseBean {
 
         private static final long serialVersionUID = 1700788373758716478L;
 
@@ -148,5 +136,4 @@ public class SystemInfo implements Serializable {
             this.maxMemory = maxMemory;
         }
     }
-
 }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/info/package-info.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/info/package-info.java
deleted file mode 100644
index 4093ba3..0000000
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/info/package-info.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-@XmlSchema(
-        namespace = SyncopeConstants.NS,
-        xmlns = { @XmlNs(prefix = SyncopeConstants.NS_PREFIX,
-                    namespaceURI = SyncopeConstants.NS) })
-@XmlJavaTypeAdapters({ @XmlJavaTypeAdapter(type = Date.class, value = DateAdapter.class), })
-package org.apache.syncope.common.lib.info;
-
-import java.util.Date;
-import javax.xml.bind.annotation.XmlNs;
-import javax.xml.bind.annotation.XmlSchema;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
-import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.jaxb.DateAdapter;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/DateAdapter.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/DateAdapter.java
deleted file mode 100644
index f6d481d..0000000
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/DateAdapter.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.common.lib.jaxb;
-
-import java.util.Date;
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-import org.apache.commons.lang3.time.FastDateFormat;
-
-public class DateAdapter extends XmlAdapter<String, Date> {
-
-    private static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
-
-    @Override
-    public Date unmarshal(final String value) throws Exception {
-        return FastDateFormat.getInstance(DATE_FORMAT).parse(value);
-    }
-
-    @Override
-    public String marshal(final Date value) throws Exception {
-        return FastDateFormat.getInstance(DATE_FORMAT).format(value);
-    }
-}
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/EntityTOType.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/EntityTOType.java
deleted file mode 100644
index 95ad262..0000000
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/EntityTOType.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.common.lib.jaxb;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import org.apache.syncope.common.lib.to.AnyObjectTO;
-import org.apache.syncope.common.lib.to.GroupTO;
-import org.apache.syncope.common.lib.to.RealmTO;
-import org.apache.syncope.common.lib.to.UserTO;
-
-@XmlSeeAlso({ UserTO.class, GroupTO.class, AnyObjectTO.class, RealmTO.class })
-@XmlAccessorType(XmlAccessType.PROPERTY)
-public class EntityTOType {
-
-    @XmlEnum
-    public enum Type {
-        USER,
-        GROUP,
-        ANY_OBJECT,
-        REALM
-
-    }
-
-    private Type type;
-
-    private Object value;
-
-    public Type getType() {
-        return type;
-    }
-
-    public void setType(final Type type) {
-        this.type = type;
-    }
-
-    public Object getValue() {
-        return value;
-    }
-
-    public void setValue(final Object value) {
-        this.value = value;
-    }
-
-}
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/GenericMapEntryType.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/GenericMapEntryType.java
deleted file mode 100644
index a418837..0000000
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/GenericMapEntryType.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2011 John Yeary <jy...@bluelotussoftware.com>.
- * Copyright 2011 Bluelotus Software, LLC.
- *
- * Licensed 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.syncope.common.lib.jaxb;
-
-import java.util.Map;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-
-@XmlAccessorType(XmlAccessType.PROPERTY)
-public class GenericMapEntryType<K, V> {
-
-    private K key;
-
-    private V value;
-
-    public GenericMapEntryType() {
-    }
-
-    public GenericMapEntryType(final Map.Entry<K, V> e) {
-        key = e.getKey();
-        value = e.getValue();
-    }
-
-    @XmlElement
-    public K getKey() {
-        return key;
-    }
-
-    public void setKey(final K key) {
-        this.key = key;
-    }
-
-    @XmlElement
-    public V getValue() {
-        return value;
-    }
-
-    public void setValue(final V value) {
-        this.value = value;
-    }
-}
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/GenericMapType.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/GenericMapType.java
deleted file mode 100644
index 48dca0b..0000000
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/GenericMapType.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2011 John Yeary <jy...@bluelotussoftware.com>.
- * Copyright 2011 Bluelotus Software, LLC.
- *
- * Licensed 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.syncope.common.lib.jaxb;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-public class GenericMapType<K, V> {
-
-    private final List<GenericMapEntryType<K, V>> entry = new ArrayList<>();
-
-    public GenericMapType() {
-    }
-
-    public GenericMapType(final Map<K, V> map) {
-        map.entrySet().forEach(e -> entry.add(new GenericMapEntryType<>(e)));
-    }
-
-    public List<GenericMapEntryType<K, V>> getEntry() {
-        return entry;
-    }
-
-    public void setEntry(final List<GenericMapEntryType<K, V>> entry) {
-        this.entry.clear();
-        if (entry != null) {
-            this.entry.addAll(entry);
-        }
-    }
-}
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/XmlEntityTOAdapter.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/XmlEntityTOAdapter.java
deleted file mode 100644
index 99400fd..0000000
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/XmlEntityTOAdapter.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.common.lib.jaxb;
-
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-import org.apache.syncope.common.lib.to.AnyObjectTO;
-import org.apache.syncope.common.lib.to.EntityTO;
-import org.apache.syncope.common.lib.to.GroupTO;
-import org.apache.syncope.common.lib.to.RealmTO;
-import org.apache.syncope.common.lib.to.UserTO;
-
-public class XmlEntityTOAdapter<E extends EntityTO> extends XmlAdapter<EntityTOType, E> {
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public E unmarshal(final EntityTOType v) throws Exception {
-        E result = null;
-
-        switch (v.getType()) {
-            case USER:
-            case GROUP:
-            case ANY_OBJECT:
-            case REALM:
-                result = (E) v.getValue();
-                break;
-
-            default:
-        }
-
-        return result;
-    }
-
-    @Override
-    public EntityTOType marshal(final E v) throws Exception {
-        EntityTOType result = new EntityTOType();
-        if (v instanceof UserTO) {
-            result.setType(EntityTOType.Type.USER);
-        } else if (v instanceof GroupTO) {
-            result.setType(EntityTOType.Type.GROUP);
-        } else if (v instanceof AnyObjectTO) {
-            result.setType(EntityTOType.Type.ANY_OBJECT);
-        } else if (v instanceof RealmTO) {
-            result.setType(EntityTOType.Type.REALM);
-        }
-        result.setValue(v);
-
-        return result;
-    }
-}
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/XmlGenericMapAdapter.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/XmlGenericMapAdapter.java
deleted file mode 100644
index 63d6825..0000000
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/XmlGenericMapAdapter.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2011 John Yeary <jy...@bluelotussoftware.com>.
- * Copyright 2011 Bluelotus Software, LLC.
- *
- * Licensed 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.syncope.common.lib.jaxb;
-
-import java.util.HashMap;
-import java.util.Map;
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-
-public class XmlGenericMapAdapter<K, V> extends XmlAdapter<GenericMapType<K, V>, Map<K, V>> {
-
-    @Override
-    public Map<K, V> unmarshal(final GenericMapType<K, V> v) throws Exception {
-        Map<K, V> map = new HashMap<>();
-
-        v.getEntry().forEach(mapEntryType -> map.put(mapEntryType.getKey(), mapEntryType.getValue()));
-
-        return map;
-    }
-
-    @Override
-    public GenericMapType<K, V> marshal(final Map<K, V> v) throws Exception {
-        GenericMapType<K, V> mapType = new GenericMapType<>();
-
-        v.entrySet().stream().map(entry -> {
-            GenericMapEntryType<K, V> mapEntryType = new GenericMapEntryType<>();
-            mapEntryType.setKey(entry.getKey());
-            mapEntryType.setValue(entry.getValue());
-            return mapEntryType;
-        }).forEachOrdered(mapEntryType -> mapType.getEntry().add(mapEntryType));
-
-        return mapType;
-    }
-}
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/package-info.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/package-info.java
deleted file mode 100644
index 53754c9..0000000
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/package-info.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-@XmlSchema(
-        namespace = SyncopeConstants.NS,
-        xmlns = { @XmlNs(prefix = SyncopeConstants.NS_PREFIX,
-                    namespaceURI = SyncopeConstants.NS) })
-@XmlJavaTypeAdapters({ @XmlJavaTypeAdapter(type = Date.class, value = DateAdapter.class), })
-package org.apache.syncope.common.lib.jaxb;
-
-import java.util.Date;
-import javax.xml.bind.annotation.XmlNs;
-import javax.xml.bind.annotation.XmlSchema;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
-import org.apache.syncope.common.lib.SyncopeConstants;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/AuditEntry.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/AuditEntry.java
index 47f5acf..ab50384 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/AuditEntry.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/AuditEntry.java
@@ -18,23 +18,18 @@
  */
 package org.apache.syncope.common.lib.log;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.BaseBean;
 import org.apache.syncope.common.lib.types.AuditLoggerName;
 
-@XmlRootElement(name = "auditEntry")
-@XmlType
-public class AuditEntry extends BaseBean {
+public class AuditEntry implements BaseBean {
 
     private static final long serialVersionUID = 1215115961911228005L;
 
@@ -88,9 +83,8 @@ public class AuditEntry extends BaseBean {
         return before;
     }
 
-    @XmlElementWrapper(name = "inputs")
-    @XmlElement(name = "input")
-    @JsonProperty("inputs")
+    @JacksonXmlElementWrapper(localName = "inputs")
+    @JacksonXmlProperty(localName = "input")
     @Schema(accessMode = Schema.AccessMode.READ_ONLY)
     public List<String> getInputs() {
         return inputs;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/EventCategory.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/EventCategory.java
index cc90447..cf49f98 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/EventCategory.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/EventCategory.java
@@ -18,21 +18,15 @@
  */
 package org.apache.syncope.common.lib.log;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.io.Serializable;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
-
-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 org.apache.syncope.common.lib.BaseBean;
 import org.apache.syncope.common.lib.types.AuditElements;
 
-@XmlRootElement(name = "eventCategory")
-@XmlType
-public class EventCategory implements Serializable {
+public class EventCategory implements BaseBean {
 
     private static final long serialVersionUID = -4340060002701633401L;
 
@@ -85,9 +79,8 @@ public class EventCategory implements Serializable {
         this.subcategory = subcategory;
     }
 
-    @XmlElementWrapper(name = "events")
-    @XmlElement(name = "event")
-    @JsonProperty("events")
+    @JacksonXmlElementWrapper(localName = "events")
+    @JacksonXmlProperty(localName = "event")
     public List<String> getEvents() {
         return events;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/LogAppender.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/LogAppender.java
index 85c3d28..1d07589 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/LogAppender.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/LogAppender.java
@@ -18,9 +18,9 @@
  */
 package org.apache.syncope.common.lib.log;
 
-import java.io.Serializable;
+import org.apache.syncope.common.lib.BaseBean;
 
-public class LogAppender implements Serializable {
+public class LogAppender implements BaseBean {
 
     private static final long serialVersionUID = 5975199884460548302L;
 
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/LogStatement.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/LogStatement.java
index f6dc3a3..64ba4cd 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/LogStatement.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/LogStatement.java
@@ -18,14 +18,10 @@
  */
 package org.apache.syncope.common.lib.log;
 
-import java.io.Serializable;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
+import org.apache.syncope.common.lib.BaseBean;
 import org.apache.syncope.common.lib.types.LoggerLevel;
 
-@XmlRootElement(name = "logStatement")
-@XmlType
-public class LogStatement implements Serializable {
+public class LogStatement implements BaseBean {
 
     private static final long serialVersionUID = -2931205859104653385L;
 
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/LoggerTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/LoggerTO.java
index a18860f..5646fe0 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/LoggerTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/LoggerTO.java
@@ -18,17 +18,13 @@
  */
 package org.apache.syncope.common.lib.log;
 
-import java.io.Serializable;
 import javax.ws.rs.PathParam;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.syncope.common.lib.BaseBean;
 import org.apache.syncope.common.lib.types.LoggerLevel;
 
-@XmlRootElement(name = "logger")
-@XmlType
-public class LoggerTO implements Serializable {
+public class LoggerTO implements BaseBean {
 
     private static final long serialVersionUID = -7794833835668648505L;
 
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/package-info.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/package-info.java
deleted file mode 100644
index 0f71579..0000000
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/package-info.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-@XmlSchema(
-        namespace = SyncopeConstants.NS,
-        xmlns = { @XmlNs(prefix = SyncopeConstants.NS_PREFIX,
-                    namespaceURI = SyncopeConstants.NS) })
-@XmlJavaTypeAdapters({ @XmlJavaTypeAdapter(type = Date.class, value = DateAdapter.class), })
-package org.apache.syncope.common.lib.log;
-
-import java.util.Date;
-import javax.xml.bind.annotation.XmlNs;
-import javax.xml.bind.annotation.XmlSchema;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
-import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.jaxb.DateAdapter;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractAccountRuleConf.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractAccountRuleConf.java
index 9509b02..881423a 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractAccountRuleConf.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractAccountRuleConf.java
@@ -18,14 +18,10 @@
  */
 package org.apache.syncope.common.lib.policy;
 
-import java.io.Serializable;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.common.lib.BaseBean;
 
-@XmlType
-@XmlSeeAlso({ DefaultAccountRuleConf.class })
-public abstract class AbstractAccountRuleConf implements Serializable, AccountRuleConf {
+public abstract class AbstractAccountRuleConf implements BaseBean, AccountRuleConf {
 
     private static final long serialVersionUID = -4080475005967851092L;
 
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractCorrelationRuleConf.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractCorrelationRuleConf.java
index 147d06a..e88c840 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractCorrelationRuleConf.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractCorrelationRuleConf.java
@@ -18,14 +18,10 @@
  */
 package org.apache.syncope.common.lib.policy;
 
-import java.io.Serializable;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.common.lib.BaseBean;
 
-@XmlType
-@XmlSeeAlso({ DefaultPullCorrelationRuleConf.class, DefaultPushCorrelationRuleConf.class })
-public abstract class AbstractCorrelationRuleConf implements Serializable, RuleConf {
+public abstract class AbstractCorrelationRuleConf implements BaseBean, RuleConf {
 
     private static final long serialVersionUID = -4080475005967851092L;
 
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractPasswordRuleConf.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractPasswordRuleConf.java
index fec3921..83e2f20 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractPasswordRuleConf.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractPasswordRuleConf.java
@@ -18,14 +18,10 @@
  */
 package org.apache.syncope.common.lib.policy;
 
-import java.io.Serializable;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.common.lib.BaseBean;
 
-@XmlType
-@XmlSeeAlso({ DefaultPasswordRuleConf.class })
-public abstract class AbstractPasswordRuleConf implements Serializable, PasswordRuleConf {
+public abstract class AbstractPasswordRuleConf implements BaseBean, PasswordRuleConf {
 
     private static final long serialVersionUID = -5814018872387142339L;
 
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/AccountPolicyTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/AccountPolicyTO.java
index 95c6433..fee5590 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/AccountPolicyTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/AccountPolicyTO.java
@@ -19,17 +19,12 @@
 package org.apache.syncope.common.lib.policy;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.ArrayList;
 import java.util.List;
-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;
 
-@XmlRootElement(name = "accountPolicy")
-@XmlType
 @Schema(allOf = { PolicyTO.class })
 public class AccountPolicyTO extends PolicyTO implements ComposablePolicy {
 
@@ -43,9 +38,9 @@ public class AccountPolicyTO extends PolicyTO implements ComposablePolicy {
 
     private final List<String> passthroughResources = new ArrayList<>();
 
-    @XmlTransient
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.policy.AccountPolicyTO")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.policy.AccountPolicyTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
@@ -67,17 +62,15 @@ public class AccountPolicyTO extends PolicyTO implements ComposablePolicy {
         this.maxAuthenticationAttempts = maxAuthenticationAttempts;
     }
 
-    @XmlElementWrapper(name = "rules")
-    @XmlElement(name = "rule")
-    @JsonProperty("rules")
+    @JacksonXmlElementWrapper(localName = "rules")
+    @JacksonXmlProperty(localName = "rule")
     @Override
     public List<String> getRules() {
         return rules;
     }
 
-    @XmlElementWrapper(name = "passthroughResources")
-    @XmlElement(name = "passthroughResource")
-    @JsonProperty("passthroughResources")
+    @JacksonXmlElementWrapper(localName = "passthroughResources")
+    @JacksonXmlProperty(localName = "passthroughResource")
     public List<String> getPassthroughResources() {
         return passthroughResources;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/ComposablePolicy.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/ComposablePolicy.java
index 5307f67..ba877f7 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/ComposablePolicy.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/ComposablePolicy.java
@@ -18,11 +18,11 @@
  */
 package org.apache.syncope.common.lib.policy;
 
-import java.io.Serializable;
 import java.util.List;
+import org.apache.syncope.common.lib.BaseBean;
 
 @FunctionalInterface
-public interface ComposablePolicy extends Serializable {
+public interface ComposablePolicy extends BaseBean {
 
     /**
      * Return policy rules.
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultAccountRuleConf.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultAccountRuleConf.java
index 81b86c2..7d0dfa5 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultAccountRuleConf.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultAccountRuleConf.java
@@ -18,19 +18,14 @@
  */
 package org.apache.syncope.common.lib.policy;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.List;
-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 org.apache.syncope.common.lib.Schema;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.SchemaType;
 
-@XmlRootElement(name = "defaultAccountRuleConf")
-@XmlType
 public class DefaultAccountRuleConf extends AbstractAccountRuleConf implements AccountRuleConf {
 
     private static final long serialVersionUID = 3259256974414758406L;
@@ -122,30 +117,26 @@ public class DefaultAccountRuleConf extends AbstractAccountRuleConf implements A
         this.pattern = pattern;
     }
 
-    @XmlElementWrapper(name = "wordsNotPermitted")
-    @XmlElement(name = "word")
-    @JsonProperty("wordsNotPermitted")
+    @JacksonXmlElementWrapper(localName = "wordsNotPermitted")
+    @JacksonXmlProperty(localName = "word")
     public List<String> getWordsNotPermitted() {
         return wordsNotPermitted;
     }
 
-    @XmlElementWrapper(name = "prefixesNotPermitted")
-    @XmlElement(name = "prefix")
-    @JsonProperty("prefixesNotPermitted")
+    @JacksonXmlElementWrapper(localName = "prefixesNotPermitted")
+    @JacksonXmlProperty(localName = "prefix")
     public List<String> getPrefixesNotPermitted() {
         return prefixesNotPermitted;
     }
 
-    @XmlElementWrapper(name = "schemasNotPermitted")
-    @XmlElement(name = "schema")
-    @JsonProperty("schemasNotPermitted")
+    @JacksonXmlElementWrapper(localName = "schemasNotPermitted")
+    @JacksonXmlProperty(localName = "schema")
     public List<String> getSchemasNotPermitted() {
         return schemasNotPermitted;
     }
 
-    @XmlElementWrapper(name = "suffixesNotPermitted")
-    @XmlElement(name = "suffix")
-    @JsonProperty("suffixesNotPermitted")
+    @JacksonXmlElementWrapper(localName = "suffixesNotPermitted")
+    @JacksonXmlProperty(localName = "suffix")
     public List<String> getSuffixesNotPermitted() {
         return suffixesNotPermitted;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultPasswordRuleConf.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultPasswordRuleConf.java
index 71e7488..b56d7ef 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultPasswordRuleConf.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultPasswordRuleConf.java
@@ -18,19 +18,14 @@
  */
 package org.apache.syncope.common.lib.policy;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.List;
-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 org.apache.syncope.common.lib.Schema;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.SchemaType;
 
-@XmlRootElement(name = "defaultPasswordRuleConf")
-@XmlType
 public class DefaultPasswordRuleConf extends AbstractPasswordRuleConf {
 
     private static final long serialVersionUID = -7988778083915548547L;
@@ -317,30 +312,26 @@ public class DefaultPasswordRuleConf extends AbstractPasswordRuleConf {
         this.usernameAllowed = usernameAllowed;
     }
 
-    @XmlElementWrapper(name = "wordsNotPermitted")
-    @XmlElement(name = "word")
-    @JsonProperty("wordsNotPermitted")
+    @JacksonXmlElementWrapper(localName = "wordsNotPermitted")
+    @JacksonXmlProperty(localName = "word")
     public List<String> getWordsNotPermitted() {
         return wordsNotPermitted;
     }
 
-    @XmlElementWrapper(name = "prefixesNotPermitted")
-    @XmlElement(name = "prefix")
-    @JsonProperty("prefixesNotPermitted")
+    @JacksonXmlElementWrapper(localName = "prefixesNotPermitted")
+    @JacksonXmlProperty(localName = "prefix")
     public List<String> getPrefixesNotPermitted() {
         return prefixesNotPermitted;
     }
 
-    @XmlElementWrapper(name = "schemasNotPermitted")
-    @XmlElement(name = "schema")
-    @JsonProperty("schemasNotPermitted")
+    @JacksonXmlElementWrapper(localName = "schemasNotPermitted")
+    @JacksonXmlProperty(localName = "schema")
     public List<String> getSchemasNotPermitted() {
         return schemasNotPermitted;
     }
 
-    @XmlElementWrapper(name = "suffixesNotPermitted")
-    @XmlElement(name = "suffix")
-    @JsonProperty("suffixesNotPermitted")
+    @JacksonXmlElementWrapper(localName = "suffixesNotPermitted")
+    @JacksonXmlProperty(localName = "suffix")
     public List<String> getSuffixesNotPermitted() {
         return suffixesNotPermitted;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultPullCorrelationRuleConf.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultPullCorrelationRuleConf.java
index 9bda1a6..e19003e 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultPullCorrelationRuleConf.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultPullCorrelationRuleConf.java
@@ -18,16 +18,11 @@
  */
 package org.apache.syncope.common.lib.policy;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.List;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 
-@XmlRootElement(name = "defaultPullCorrelationRuleConf")
-@XmlType
 public class DefaultPullCorrelationRuleConf extends AbstractCorrelationRuleConf implements PullCorrelationRuleConf {
 
     private static final long serialVersionUID = 429126085793346273L;
@@ -44,9 +39,8 @@ public class DefaultPullCorrelationRuleConf extends AbstractCorrelationRuleConf
         this.orSchemas = orSchemas;
     }
 
-    @XmlElementWrapper(name = "schemas")
-    @XmlElement(name = "schema")
-    @JsonProperty("schemas")
+    @JacksonXmlElementWrapper(localName = "schemas")
+    @JacksonXmlProperty(localName = "schema")
     public List<String> getSchemas() {
         return schemas;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultPushCorrelationRuleConf.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultPushCorrelationRuleConf.java
index a909208..b8a7974 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultPushCorrelationRuleConf.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultPushCorrelationRuleConf.java
@@ -18,16 +18,11 @@
  */
 package org.apache.syncope.common.lib.policy;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.List;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 
-@XmlRootElement(name = "defaultPushCorrelationRuleConf")
-@XmlType
 public class DefaultPushCorrelationRuleConf extends AbstractCorrelationRuleConf implements PushCorrelationRuleConf {
 
     private static final long serialVersionUID = 429126085793346273L;
@@ -44,9 +39,8 @@ public class DefaultPushCorrelationRuleConf extends AbstractCorrelationRuleConf
         this.orSchemas = orSchemas;
     }
 
-    @XmlElementWrapper(name = "schemas")
-    @XmlElement(name = "schema")
-    @JsonProperty("schemas")
+    @JacksonXmlElementWrapper(localName = "schemas")
+    @JacksonXmlProperty(localName = "schema")
     public List<String> getSchemas() {
         return schemas;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/HaveIBeenPwnedPasswordRuleConf.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/HaveIBeenPwnedPasswordRuleConf.java
index 60eb62c..ec38b31 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/HaveIBeenPwnedPasswordRuleConf.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/HaveIBeenPwnedPasswordRuleConf.java
@@ -18,11 +18,6 @@
  */
 package org.apache.syncope.common.lib.policy;
 
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlRootElement(name = "haveIBeenPwnedPasswordRuleConf")
-@XmlType
 public class HaveIBeenPwnedPasswordRuleConf extends AbstractPasswordRuleConf {
 
     private static final long serialVersionUID = -8962889598888347921L;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PasswordPolicyTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PasswordPolicyTO.java
index ea2e4a7..7f2ef4f 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PasswordPolicyTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PasswordPolicyTO.java
@@ -19,19 +19,14 @@
 package org.apache.syncope.common.lib.policy;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.List;
-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 io.swagger.v3.oas.annotations.media.Schema;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 
-@XmlRootElement(name = "passwordPolicy")
-@XmlType
 @Schema(allOf = { PolicyTO.class })
 public class PasswordPolicyTO extends PolicyTO implements ComposablePolicy {
 
@@ -43,9 +38,9 @@ public class PasswordPolicyTO extends PolicyTO implements ComposablePolicy {
 
     private final List<String> rules = new ArrayList<>();
 
-    @XmlTransient
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.policy.PasswordPolicyTO")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.policy.PasswordPolicyTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
@@ -67,9 +62,8 @@ public class PasswordPolicyTO extends PolicyTO implements ComposablePolicy {
         this.historyLength = historyLength;
     }
 
-    @XmlElementWrapper(name = "rules")
-    @XmlElement(name = "rule")
-    @JsonProperty("rules")
+    @JacksonXmlElementWrapper(localName = "rules")
+    @JacksonXmlProperty(localName = "rule")
     @Override
     public List<String> getRules() {
         return rules;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PolicyTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PolicyTO.java
index 0028a13..fc303d0 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PolicyTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PolicyTO.java
@@ -21,34 +21,27 @@ package org.apache.syncope.common.lib.policy;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.ArrayList;
 import java.util.List;
 import javax.ws.rs.PathParam;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.to.EntityTO;
 
-@XmlRootElement(name = "policy")
-@XmlType
-@XmlSeeAlso({ AccountPolicyTO.class, PasswordPolicyTO.class, ProvisioningPolicyTO.class })
-@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "@class")
-@JsonPropertyOrder(value = { "@class", "key", "description" })
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "_class")
+@JsonPropertyOrder(value = { "_class", "key", "description" })
 @Schema(
         subTypes = { AccountPolicyTO.class, PasswordPolicyTO.class, PullPolicyTO.class },
-        discriminatorProperty = "@class")
+        discriminatorProperty = "_class")
 public abstract class PolicyTO implements EntityTO {
 
     private static final long serialVersionUID = -2903888572649721035L;
 
-    @XmlTransient
-    @JsonProperty("@class")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
     private String discriminator;
 
     private String key;
@@ -59,7 +52,7 @@ public abstract class PolicyTO implements EntityTO {
 
     private final List<String> usedByRealms = new ArrayList<>();
 
-    @Schema(name = "@class", required = true)
+    @Schema(name = "_class", required = true)
     public abstract String getDiscriminator();
 
     public void setDiscriminator(final String discriminator) {
@@ -79,7 +72,6 @@ public abstract class PolicyTO implements EntityTO {
     }
 
     @JsonProperty(required = true)
-    @XmlElement(required = true)
     public String getDescription() {
         return description;
     }
@@ -89,17 +81,15 @@ public abstract class PolicyTO implements EntityTO {
     }
 
     @Schema(accessMode = Schema.AccessMode.READ_ONLY)
-    @XmlElementWrapper(name = "usedByResources")
-    @XmlElement(name = "resource")
-    @JsonProperty("usedByResources")
+    @JacksonXmlElementWrapper(localName = "usedByResources")
+    @JacksonXmlProperty(localName = "resource")
     public List<String> getUsedByResources() {
         return usedByResources;
     }
 
     @Schema(accessMode = Schema.AccessMode.READ_ONLY)
-    @XmlElementWrapper(name = "usedByRealms")
-    @XmlElement(name = "group")
-    @JsonProperty("usedByRealms")
+    @JacksonXmlElementWrapper(localName = "usedByRealms")
+    @JacksonXmlProperty(localName = "group")
     public List<String> getUsedByRealms() {
         return usedByRealms;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/ProvisioningPolicyTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/ProvisioningPolicyTO.java
index a494c13..548a402 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/ProvisioningPolicyTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/ProvisioningPolicyTO.java
@@ -18,20 +18,12 @@
  */
 package org.apache.syncope.common.lib.policy;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
-
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 import org.apache.syncope.common.lib.types.ConflictResolutionAction;
 
-@XmlType
-@XmlSeeAlso({ PullPolicyTO.class, PushPolicyTO.class })
 @Schema(allOf = { PolicyTO.class })
 public abstract class ProvisioningPolicyTO extends PolicyTO {
 
@@ -39,7 +31,6 @@ public abstract class ProvisioningPolicyTO extends PolicyTO {
 
     private ConflictResolutionAction conflictResolutionAction;
 
-    @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
     private final Map<String, String> correlationRules = new HashMap<>();
 
     public ConflictResolutionAction getConflictResolutionAction() {
@@ -50,7 +41,6 @@ public abstract class ProvisioningPolicyTO extends PolicyTO {
         this.conflictResolutionAction = conflictResolutionAction;
     }
 
-    @JsonProperty
     public Map<String, String> getCorrelationRules() {
         return correlationRules;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PullPolicyTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PullPolicyTO.java
index aee16cd..1cd2939 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PullPolicyTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PullPolicyTO.java
@@ -19,21 +19,17 @@
 package org.apache.syncope.common.lib.policy;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
 
-@XmlRootElement(name = "pullPolicy")
-@XmlType
-@Schema(allOf = { ProvisioningPolicyTO.class, PolicyTO.class })
+@Schema(allOf = { ProvisioningPolicyTO.class })
 public class PullPolicyTO extends ProvisioningPolicyTO {
 
     private static final long serialVersionUID = 993024634238024242L;
 
-    @XmlTransient
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.policy.PullPolicyTO")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.policy.PullPolicyTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PushPolicyTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PushPolicyTO.java
index a2eca14..8b958d4 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PushPolicyTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PushPolicyTO.java
@@ -19,21 +19,17 @@
 package org.apache.syncope.common.lib.policy;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
 
-@XmlRootElement(name = "pushPolicy")
-@XmlType
-@Schema(allOf = { ProvisioningPolicyTO.class, PolicyTO.class })
+@Schema(allOf = { ProvisioningPolicyTO.class })
 public class PushPolicyTO extends ProvisioningPolicyTO {
 
     private static final long serialVersionUID = 993024634238024242L;
 
-    @XmlTransient
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.policy.PushPolicyTO")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.policy.PushPolicyTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/RuleConf.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/RuleConf.java
index 56e3c5c..795c0bb 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/RuleConf.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/RuleConf.java
@@ -19,11 +19,11 @@
 package org.apache.syncope.common.lib.policy;
 
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import java.io.Serializable;
+import org.apache.syncope.common.lib.BaseBean;
 
 @FunctionalInterface
-@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
-public interface RuleConf extends Serializable {
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "_class")
+public interface RuleConf extends BaseBean {
 
     /**
      * Give name of related rule instance.
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/package-info.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/package-info.java
deleted file mode 100644
index 1850d20..0000000
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/package-info.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-@XmlSchema(
-        namespace = SyncopeConstants.NS,
-        xmlns = { @XmlNs(prefix = SyncopeConstants.NS_PREFIX,
-                    namespaceURI = SyncopeConstants.NS) })
-@XmlJavaTypeAdapters({ @XmlJavaTypeAdapter(type = Date.class, value = DateAdapter.class), })
-package org.apache.syncope.common.lib.policy;
-
-import java.util.Date;
-import javax.xml.bind.annotation.XmlNs;
-import javax.xml.bind.annotation.XmlSchema;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
-import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.jaxb.DateAdapter;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/AbstractAnyReportletConf.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/AbstractAnyReportletConf.java
index 5e95102..11026aa 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/AbstractAnyReportletConf.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/AbstractAnyReportletConf.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.report;
 
-import javax.xml.bind.annotation.XmlType;
-
-@XmlType
 public abstract class AbstractAnyReportletConf extends AbstractReportletConf {
 
     private static final long serialVersionUID = -5388597116592877789L;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/AbstractReportletConf.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/AbstractReportletConf.java
index 0818e41..975fb70 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/AbstractReportletConf.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/AbstractReportletConf.java
@@ -18,16 +18,10 @@
  */
 package org.apache.syncope.common.lib.report;
 
-import java.io.Serializable;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.common.lib.BaseBean;
 
-@XmlType
-@XmlSeeAlso({
-    StaticReportletConf.class, UserReportletConf.class, GroupReportletConf.class,
-    AuditReportletConf.class, ReconciliationReportletConf.class })
-public abstract class AbstractReportletConf implements Serializable, ReportletConf {
+public abstract class AbstractReportletConf implements BaseBean, ReportletConf {
 
     private static final long serialVersionUID = -6130008602014516608L;
 
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/AuditReportletConf.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/AuditReportletConf.java
index 96e49d0..e248bb5 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/AuditReportletConf.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/AuditReportletConf.java
@@ -18,11 +18,6 @@
  */
 package org.apache.syncope.common.lib.report;
 
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlRootElement(name = "auditReportletConf")
-@XmlType
 public class AuditReportletConf extends AbstractReportletConf {
 
     private static final long serialVersionUID = -4814950086361753689L;
@@ -44,5 +39,4 @@ public class AuditReportletConf extends AbstractReportletConf {
     public void setSize(final int size) {
         this.size = size;
     }
-
 }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/GroupReportletConf.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/GroupReportletConf.java
index 69b2c45..ad0aec3 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/GroupReportletConf.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/GroupReportletConf.java
@@ -18,26 +18,18 @@
  */
 package org.apache.syncope.common.lib.report;
 
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import org.apache.syncope.common.lib.Schema;
-import com.fasterxml.jackson.annotation.JsonProperty;
 import java.util.ArrayList;
 import java.util.List;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.SchemaType;
 
-@XmlRootElement(name = "groupReportletConf")
-@XmlType
 public class GroupReportletConf extends AbstractAnyReportletConf {
 
     private static final long serialVersionUID = -8488503068032439699L;
 
-    @XmlEnum
-    @XmlType(name = "groupReportletConfFeature")
     public enum Feature {
 
         key,
@@ -71,23 +63,20 @@ public class GroupReportletConf extends AbstractAnyReportletConf {
         this.matchingCond = matchingCond;
     }
 
-    @XmlElementWrapper(name = "plainAttrs")
-    @XmlElement(name = "attribute")
-    @JsonProperty("plainAttrs")
+    @JacksonXmlElementWrapper(localName = "plainAttrs")
+    @JacksonXmlProperty(localName = "plainAttr")
     public List<String> getPlainAttrs() {
         return plainAttrs;
     }
 
-    @XmlElementWrapper(name = "derAttrs")
-    @XmlElement(name = "attribute")
-    @JsonProperty("derAttrs")
+    @JacksonXmlElementWrapper(localName = "derAttrs")
+    @JacksonXmlProperty(localName = "derAttr")
     public List<String> getDerAttrs() {
         return derAttrs;
     }
 
-    @XmlElementWrapper(name = "virAttrs")
-    @XmlElement(name = "attribute")
-    @JsonProperty("virAttrs")
+    @JacksonXmlElementWrapper(localName = "virAttrs")
+    @JacksonXmlProperty(localName = "virAttr")
     public List<String> getVirAttrs() {
         return virAttrs;
     }
@@ -100,9 +89,8 @@ public class GroupReportletConf extends AbstractAnyReportletConf {
         super(name);
     }
 
-    @XmlElementWrapper(name = "features")
-    @XmlElement(name = "feature")
-    @JsonProperty("features")
+    @JacksonXmlElementWrapper(localName = "features")
+    @JacksonXmlProperty(localName = "feature")
     public List<Feature> getFeatures() {
         return features;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/ReconciliationReportletConf.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/ReconciliationReportletConf.java
index 6d43e1f..e2fb8f4 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/ReconciliationReportletConf.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/ReconciliationReportletConf.java
@@ -18,23 +18,15 @@
  */
 package org.apache.syncope.common.lib.report;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.List;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlRootElement(name = "reconciliationReportletConf")
-@XmlType
+
 public class ReconciliationReportletConf extends AbstractReportletConf {
 
     private static final long serialVersionUID = 6602717600064602764L;
 
-    @XmlEnum
-    @XmlType(name = "reconciliationReportletConfFeature")
     public enum Feature {
 
         key,
@@ -92,9 +84,8 @@ public class ReconciliationReportletConf extends AbstractReportletConf {
         this.anyObjectMatchingCond = anyObjectMatchingCond;
     }
 
-    @XmlElementWrapper(name = "features")
-    @XmlElement(name = "feature")
-    @JsonProperty("features")
+    @JacksonXmlElementWrapper(localName = "features")
+    @JacksonXmlProperty(localName = "feature")
     public List<Feature> getFeatures() {
         return features;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/ReportletConf.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/ReportletConf.java
index 9eb50e2..0f3777f 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/ReportletConf.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/ReportletConf.java
@@ -19,11 +19,11 @@
 package org.apache.syncope.common.lib.report;
 
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import java.io.Serializable;
+import org.apache.syncope.common.lib.BaseBean;
 
 @FunctionalInterface
-@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
-public interface ReportletConf extends Serializable {
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "_class")
+public interface ReportletConf extends BaseBean {
 
     /**
      * Give name of related reportlet instance.
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/StaticReportletConf.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/StaticReportletConf.java
index 68158c0..23adbea 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/StaticReportletConf.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/StaticReportletConf.java
@@ -18,20 +18,14 @@
  */
 package org.apache.syncope.common.lib.report;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Optional;
-
-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 org.apache.syncope.common.lib.types.TraceLevel;
 
-@XmlRootElement(name = "staticReportletConf")
-@XmlType
 public class StaticReportletConf extends AbstractReportletConf {
 
     private static final long serialVersionUID = -4814950086361753689L;
@@ -72,9 +66,8 @@ public class StaticReportletConf extends AbstractReportletConf {
         this.doubleField = doubleField;
     }
 
-    @XmlElementWrapper(name = "listField")
-    @XmlElement(name = "field")
-    @JsonProperty("listField")
+    @JacksonXmlElementWrapper(localName = "listField")
+    @JacksonXmlProperty(localName = "field")
     public List<String> getListField() {
         return listField;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/UserReportletConf.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/UserReportletConf.java
index 8f364ec..1c50bf3 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/UserReportletConf.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/UserReportletConf.java
@@ -18,20 +18,14 @@
  */
 package org.apache.syncope.common.lib.report;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.List;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.syncope.common.lib.Schema;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.SchemaType;
 
-@XmlRootElement(name = "userReportletConf")
-@XmlType
 public class UserReportletConf extends AbstractAnyReportletConf {
 
     private static final long serialVersionUID = 6602717600064602764L;
@@ -45,8 +39,6 @@ public class UserReportletConf extends AbstractAnyReportletConf {
     @Schema(anyTypeKind = AnyTypeKind.USER, type = { SchemaType.VIRTUAL })
     private final List<String> virAttrs = new ArrayList<>();
 
-    @XmlEnum
-    @XmlType(name = "userReportletConfFeature")
     public enum Feature {
 
         key,
@@ -69,23 +61,20 @@ public class UserReportletConf extends AbstractAnyReportletConf {
     @SearchCondition(type = "USER")
     protected String matchingCond;
 
-    @XmlElementWrapper(name = "plainAttrs")
-    @XmlElement(name = "attribute")
-    @JsonProperty("plainAttrs")
+    @JacksonXmlElementWrapper(localName = "plainAttrs")
+    @JacksonXmlProperty(localName = "plainAttr")
     public List<String> getPlainAttrs() {
         return plainAttrs;
     }
 
-    @XmlElementWrapper(name = "derAttrs")
-    @XmlElement(name = "attribute")
-    @JsonProperty("derAttrs")
+    @JacksonXmlElementWrapper(localName = "derAttrs")
+    @JacksonXmlProperty(localName = "derAttr")
     public List<String> getDerAttrs() {
         return derAttrs;
     }
 
-    @XmlElementWrapper(name = "virAttrs")
-    @XmlElement(name = "attribute")
-    @JsonProperty("virAttrs")
+    @JacksonXmlElementWrapper(localName = "virAttrs")
+    @JacksonXmlProperty(localName = "virAttr")
     public List<String> getVirAttrs() {
         return virAttrs;
     }
@@ -108,11 +97,9 @@ public class UserReportletConf extends AbstractAnyReportletConf {
         this.matchingCond = matchingCond;
     }
 
-    @XmlElementWrapper(name = "features")
-    @XmlElement(name = "feature")
-    @JsonProperty("features")
+    @JacksonXmlElementWrapper(localName = "features")
+    @JacksonXmlProperty(localName = "feature")
     public List<Feature> getFeatures() {
         return features;
     }
-
 }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/package-info.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/package-info.java
deleted file mode 100644
index cd2f367..0000000
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/report/package-info.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-@XmlSchema(
-        namespace = SyncopeConstants.NS,
-        xmlns = { @XmlNs(prefix = SyncopeConstants.NS_PREFIX,
-                    namespaceURI = SyncopeConstants.NS) })
-@XmlJavaTypeAdapters({ @XmlJavaTypeAdapter(type = Date.class, value = DateAdapter.class), })
-package org.apache.syncope.common.lib.report;
-
-import java.util.Date;
-import javax.xml.bind.annotation.XmlNs;
-import javax.xml.bind.annotation.XmlSchema;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
-import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.jaxb.DateAdapter;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AbstractPatch.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AbstractPatch.java
index 357f92f..00a118d 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AbstractPatch.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AbstractPatch.java
@@ -18,16 +18,12 @@
  */
 package org.apache.syncope.common.lib.request;
 
-import java.io.Serializable;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.syncope.common.lib.BaseBean;
 import org.apache.syncope.common.lib.types.PatchOperation;
 
-@XmlType
-@XmlSeeAlso({ AbstractPatchItem.class, AttrPatch.class, MembershipUR.class, RelationshipUR.class })
-public abstract class AbstractPatch implements Serializable {
+public abstract class AbstractPatch implements BaseBean {
 
     private static final long serialVersionUID = -4729181508529829580L;
 
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AbstractPatchItem.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AbstractPatchItem.java
index be918ac..2ef7138 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AbstractPatchItem.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AbstractPatchItem.java
@@ -19,14 +19,9 @@
 package org.apache.syncope.common.lib.request;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 
-@XmlType
-@XmlSeeAlso({ AbstractReplacePatchItem.class, LongPatchItem.class, StringPatchItem.class })
 public abstract class AbstractPatchItem<T> extends AbstractPatch {
 
     private static final long serialVersionUID = -8889326446009942028L;
@@ -44,7 +39,6 @@ public abstract class AbstractPatchItem<T> extends AbstractPatch {
     private T value;
 
     @JsonProperty(required = true)
-    @XmlElement(required = true)
     public T getValue() {
         return value;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AbstractReplacePatchItem.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AbstractReplacePatchItem.java
index 672ef27..1183298 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AbstractReplacePatchItem.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AbstractReplacePatchItem.java
@@ -18,8 +18,6 @@
  */
 package org.apache.syncope.common.lib.request;
 
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.syncope.common.lib.types.PatchOperation;
 
 /**
@@ -29,8 +27,6 @@ import org.apache.syncope.common.lib.types.PatchOperation;
  *
  * @param <T> {@code String}, {@code Boolean}
  */
-@XmlType
-@XmlSeeAlso({ BooleanReplacePatchItem.class, StringReplacePatchItem.class })
 public abstract class AbstractReplacePatchItem<T> extends AbstractPatchItem<T> {
 
     private static final long serialVersionUID = 2027599764019829563L;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyCR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyCR.java
index 26ea898..7b65838 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyCR.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyCR.java
@@ -22,29 +22,24 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
-import java.io.Serializable;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.Attr;
+import org.apache.syncope.common.lib.BaseBean;
 import org.apache.syncope.common.lib.RealmMember;
 
-@XmlType
-@XmlSeeAlso({ UserUR.class, GroupUR.class, AnyObjectUR.class })
-@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "@class")
-@JsonPropertyOrder(value = { "@class" })
-@Schema(subTypes = { UserCR.class, GroupCR.class, AnyObjectCR.class }, discriminatorProperty = "@class")
-public abstract class AnyCR implements Serializable, RealmMember {
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "_class")
+@JsonPropertyOrder(value = { "_class" })
+@Schema(subTypes = { UserCR.class, GroupCR.class, AnyObjectCR.class }, discriminatorProperty = "_class")
+public abstract class AnyCR implements BaseBean, RealmMember {
 
     private static final long serialVersionUID = -1180587903919947455L;
 
@@ -142,8 +137,8 @@ public abstract class AnyCR implements Serializable, RealmMember {
         }
     }
 
-    @XmlTransient
-    @JsonProperty("@class")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
     private String discriminator;
 
     private String realm;
@@ -156,7 +151,7 @@ public abstract class AnyCR implements Serializable, RealmMember {
 
     private final Set<String> resources = new HashSet<>();
 
-    @Schema(name = "@class", required = true)
+    @Schema(name = "_class", required = true)
     public abstract String getDiscriminator();
 
     public void setDiscriminator(final String discriminator) {
@@ -164,7 +159,6 @@ public abstract class AnyCR implements Serializable, RealmMember {
     }
 
     @JsonProperty(required = true)
-    @XmlElement(required = true)
     @Override
     public String getRealm() {
         return realm;
@@ -175,9 +169,6 @@ public abstract class AnyCR implements Serializable, RealmMember {
         this.realm = realm;
     }
 
-    @XmlElementWrapper(name = "auxClasses")
-    @XmlElement(name = "class")
-    @JsonProperty("auxClasses")
     @Override
     public Set<String> getAuxClasses() {
         return auxClasses;
@@ -189,9 +180,8 @@ public abstract class AnyCR implements Serializable, RealmMember {
         return plainAttrs.stream().filter(attr -> attr.getSchema().equals(schema)).findFirst();
     }
 
-    @XmlElementWrapper(name = "plainAttrs")
-    @XmlElement(name = "attribute")
-    @JsonProperty("plainAttrs")
+    @JacksonXmlElementWrapper(localName = "plainAttrs")
+    @JacksonXmlProperty(localName = "plainAttr")
     @Override
     public Set<Attr> getPlainAttrs() {
         return plainAttrs;
@@ -203,7 +193,6 @@ public abstract class AnyCR implements Serializable, RealmMember {
         return Optional.empty();
     }
 
-    @XmlTransient
     @JsonIgnore
     @Override
     public Set<Attr> getDerAttrs() {
@@ -216,17 +205,15 @@ public abstract class AnyCR implements Serializable, RealmMember {
         return virAttrs.stream().filter(attr -> attr.getSchema().equals(schema)).findFirst();
     }
 
-    @XmlElementWrapper(name = "virAttrs")
-    @XmlElement(name = "attribute")
-    @JsonProperty("virAttrs")
+    @JacksonXmlElementWrapper(localName = "virAttrs")
+    @JacksonXmlProperty(localName = "virAttr")
     @Override
     public Set<Attr> getVirAttrs() {
         return virAttrs;
     }
 
-    @XmlElementWrapper(name = "resources")
-    @XmlElement(name = "resource")
-    @JsonProperty("resources")
+    @JacksonXmlElementWrapper(localName = "resources")
+    @JacksonXmlProperty(localName = "resource")
     @Override
     public Set<String> getResources() {
         return resources;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyObjectCR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyObjectCR.java
index ef89554..7d80f39 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyObjectCR.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyObjectCR.java
@@ -21,24 +21,20 @@ package org.apache.syncope.common.lib.request;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Optional;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.to.GroupableRelatableTO;
 import org.apache.syncope.common.lib.to.MembershipTO;
 import org.apache.syncope.common.lib.to.RelationshipTO;
 
-@XmlRootElement(name = "anyObjectCR")
-@XmlType
-@JsonPropertyOrder(value = { "@class", "name" })
+@JsonPropertyOrder(value = { "_class", "name" })
 @Schema(allOf = { AnyCR.class })
 public class AnyObjectCR extends AnyCR implements GroupableRelatableTO {
 
@@ -96,15 +92,15 @@ public class AnyObjectCR extends AnyCR implements GroupableRelatableTO {
 
     private final List<MembershipTO> memberships = new ArrayList<>();
 
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.request.AnyObjectCR")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.request.AnyObjectCR")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
     }
 
     @JsonProperty(required = true)
-    @XmlElement(required = true)
     public String getType() {
         return type;
     }
@@ -114,7 +110,6 @@ public class AnyObjectCR extends AnyCR implements GroupableRelatableTO {
     }
 
     @JsonProperty(required = true)
-    @XmlElement(required = true)
     public String getName() {
         return name;
     }
@@ -131,9 +126,8 @@ public class AnyObjectCR extends AnyCR implements GroupableRelatableTO {
                 findFirst();
     }
 
-    @XmlElementWrapper(name = "relationships")
-    @XmlElement(name = "relationship")
-    @JsonProperty("relationships")
+    @JacksonXmlElementWrapper(localName = "relationships")
+    @JacksonXmlProperty(localName = "relationship")
     @Override
     public List<RelationshipTO> getRelationships() {
         return relationships;
@@ -145,9 +139,8 @@ public class AnyObjectCR extends AnyCR implements GroupableRelatableTO {
         return memberships.stream().filter(membership -> groupKey.equals(membership.getGroupKey())).findFirst();
     }
 
-    @XmlElementWrapper(name = "memberships")
-    @XmlElement(name = "membership")
-    @JsonProperty("memberships")
+    @JacksonXmlElementWrapper(localName = "memberships")
+    @JacksonXmlProperty(localName = "membership")
     @Override
     public List<MembershipTO> getMemberships() {
         return memberships;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyObjectUR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyObjectUR.java
index e9a2b5e..893852e 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyObjectUR.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyObjectUR.java
@@ -19,21 +19,16 @@
 package org.apache.syncope.common.lib.request;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
-
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 
-@XmlRootElement(name = "anyObjectUR")
-@XmlType
 @Schema(allOf = { AnyUR.class })
 public class AnyObjectUR extends AnyUR {
 
@@ -92,8 +87,9 @@ public class AnyObjectUR extends AnyUR {
 
     private final Set<MembershipUR> memberships = new HashSet<>();
 
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.request.AnyObjectUR")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.request.AnyObjectUR")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
@@ -107,16 +103,14 @@ public class AnyObjectUR extends AnyUR {
         this.name = name;
     }
 
-    @XmlElementWrapper(name = "relationships")
-    @XmlElement(name = "relationship")
-    @JsonProperty("relationships")
+    @JacksonXmlElementWrapper(localName = "relationships")
+    @JacksonXmlProperty(localName = "relationship")
     public Set<RelationshipUR> getRelationships() {
         return relationships;
     }
 
-    @XmlElementWrapper(name = "memberships")
-    @XmlElement(name = "membership")
-    @JsonProperty("memberships")
+    @JacksonXmlElementWrapper(localName = "memberships")
+    @JacksonXmlProperty(localName = "membership")
     public Set<MembershipUR> getMemberships() {
         return memberships;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyUR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyUR.java
index 531b345..cf92b34 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyUR.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyUR.java
@@ -22,28 +22,23 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
-import java.io.Serializable;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import javax.ws.rs.PathParam;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.Attr;
+import org.apache.syncope.common.lib.BaseBean;
 
-@XmlType
-@XmlSeeAlso({ UserUR.class, GroupUR.class, AnyObjectUR.class })
-@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "@class")
-@JsonPropertyOrder(value = { "@class", "key" })
-@Schema(subTypes = { UserUR.class, GroupUR.class, AnyObjectUR.class }, discriminatorProperty = "@class")
-public abstract class AnyUR implements Serializable {
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "_class")
+@JsonPropertyOrder(value = { "_class", "key" })
+@Schema(subTypes = { UserUR.class, GroupUR.class, AnyObjectUR.class }, discriminatorProperty = "_class")
+public abstract class AnyUR implements BaseBean {
 
     private static final long serialVersionUID = -7445489774552440544L;
 
@@ -147,8 +142,8 @@ public abstract class AnyUR implements Serializable {
         }
     }
 
-    @XmlTransient
-    @JsonProperty("@class")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
     private String discriminator;
 
     private String key;
@@ -163,7 +158,7 @@ public abstract class AnyUR implements Serializable {
 
     private final Set<StringPatchItem> resources = new HashSet<>();
 
-    @Schema(name = "@class", required = true)
+    @Schema(name = "_class", required = true)
     public abstract String getDiscriminator();
 
     public void setDiscriminator(final String discriminator) {
@@ -171,7 +166,6 @@ public abstract class AnyUR implements Serializable {
     }
 
     @JsonProperty(required = true)
-    @XmlElement(required = true)
     public String getKey() {
         return key;
     }
@@ -189,30 +183,26 @@ public abstract class AnyUR implements Serializable {
         this.realm = realm;
     }
 
-    @XmlElementWrapper(name = "auxClasses")
-    @XmlElement(name = "auxClass")
-    @JsonProperty("auxClasses")
+    @JacksonXmlElementWrapper(localName = "auxClasses")
+    @JacksonXmlProperty(localName = "auxClass")
     public Set<StringPatchItem> getAuxClasses() {
         return auxClasses;
     }
 
-    @XmlElementWrapper(name = "plainAttrs")
-    @XmlElement(name = "attribute")
-    @JsonProperty("plainAttrs")
+    @JacksonXmlElementWrapper(localName = "plainAttrs")
+    @JacksonXmlProperty(localName = "plainAttr")
     public Set<AttrPatch> getPlainAttrs() {
         return plainAttrs;
     }
 
-    @XmlElementWrapper(name = "virAttrs")
-    @XmlElement(name = "attribute")
-    @JsonProperty("virAttrs")
+    @JacksonXmlElementWrapper(localName = "virAttrs")
+    @JacksonXmlProperty(localName = "virAttr")
     public Set<Attr> getVirAttrs() {
         return virAttrs;
     }
 
-    @XmlElementWrapper(name = "resources")
-    @XmlElement(name = "resource")
-    @JsonProperty("resources")
+    @JacksonXmlElementWrapper(localName = "resources")
+    @JacksonXmlProperty(localName = "resource")
     public Set<StringPatchItem> getResources() {
         return resources;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AttrPatch.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AttrPatch.java
index d832880..1da239d 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AttrPatch.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AttrPatch.java
@@ -19,14 +19,10 @@
 package org.apache.syncope.common.lib.request;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.Attr;
 
-@XmlRootElement(name = "attrPatch")
-@XmlType
 public class AttrPatch extends AbstractPatch {
 
     private static final long serialVersionUID = 6881634224246176673L;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/BooleanReplacePatchItem.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/BooleanReplacePatchItem.java
index bbc5842..f0a3fb3 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/BooleanReplacePatchItem.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/BooleanReplacePatchItem.java
@@ -18,11 +18,6 @@
  */
 package org.apache.syncope.common.lib.request;
 
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlRootElement(name = "booleanReplacePatchItem")
-@XmlType
 public class BooleanReplacePatchItem extends AbstractReplacePatchItem<Boolean> {
 
     private static final long serialVersionUID = 4013349284181583101L;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/GroupCR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/GroupCR.java
index 88e162c..c47edbb 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/GroupCR.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/GroupCR.java
@@ -20,25 +20,19 @@ package org.apache.syncope.common.lib.request;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 import org.apache.syncope.common.lib.to.TypeExtensionTO;
 
-@XmlRootElement(name = "groupCR")
-@XmlType
-@JsonPropertyOrder(value = { "@class", "name" })
+@JsonPropertyOrder(value = { "_class", "name" })
 @Schema(allOf = { AnyCR.class })
 public class GroupCR extends AnyCR {
 
@@ -100,20 +94,19 @@ public class GroupCR extends AnyCR {
 
     private String udynMembershipCond;
 
-    @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
     private final Map<String, String> adynMembershipConds = new HashMap<>();
 
     private final List<TypeExtensionTO> typeExtensions = new ArrayList<>();
 
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.request.GroupCR")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.request.GroupCR")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
     }
 
     @JsonProperty(required = true)
-    @XmlElement(required = true)
     public String getName() {
         return name;
     }
@@ -146,14 +139,12 @@ public class GroupCR extends AnyCR {
         this.udynMembershipCond = uDynMembershipCond;
     }
 
-    @JsonProperty
     public Map<String, String> getADynMembershipConds() {
         return adynMembershipConds;
     }
 
-    @XmlElementWrapper(name = "typeExtensions")
-    @XmlElement(name = "typeExtension")
-    @JsonProperty("typeExtensions")
+    @JacksonXmlElementWrapper(localName = "typeExtensions")
+    @JacksonXmlProperty(localName = "typeExtension")
     public List<TypeExtensionTO> getTypeExtensions() {
         return typeExtensions;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/GroupUR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/GroupUR.java
index 1e12a1b..34cc36a 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/GroupUR.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/GroupUR.java
@@ -20,6 +20,8 @@ package org.apache.syncope.common.lib.request;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -27,18 +29,10 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 import org.apache.syncope.common.lib.to.TypeExtensionTO;
 
-@XmlRootElement(name = "groupUR")
-@XmlType
 @Schema(allOf = { AnyUR.class })
 public class GroupUR extends AnyUR {
 
@@ -104,13 +98,13 @@ public class GroupUR extends AnyUR {
 
     private String udynMembershipCond;
 
-    @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
     private final Map<String, String> adynMembershipConds = new HashMap<>();
 
     private final List<TypeExtensionTO> typeExtensions = new ArrayList<>();
 
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.request.GroupUR")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.request.GroupUR")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
@@ -148,7 +142,6 @@ public class GroupUR extends AnyUR {
         this.udynMembershipCond = udynMembershipCond;
     }
 
-    @JsonProperty
     public Map<String, String> getADynMembershipConds() {
         return adynMembershipConds;
     }
@@ -159,9 +152,8 @@ public class GroupUR extends AnyUR {
                 typeExtension -> anyType != null && anyType.equals(typeExtension.getAnyType())).findFirst();
     }
 
-    @XmlElementWrapper(name = "typeExtensions")
-    @XmlElement(name = "typeExtension")
-    @JsonProperty("typeExtensions")
+    @JacksonXmlElementWrapper(localName = "typeExtensions")
+    @JacksonXmlProperty(localName = "typeExtension")
     public List<TypeExtensionTO> getTypeExtensions() {
         return typeExtensions;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/LinkedAccountUR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/LinkedAccountUR.java
index 2ccb596..6156001 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/LinkedAccountUR.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/LinkedAccountUR.java
@@ -18,14 +18,10 @@
  */
 package org.apache.syncope.common.lib.request;
 
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.to.LinkedAccountTO;
 
-@XmlRootElement(name = "linkedAccountPatch")
-@XmlType
 public class LinkedAccountUR extends AbstractPatch {
 
     private static final long serialVersionUID = 7848357705991620487L;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/LongPatchItem.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/LongPatchItem.java
index 078b368..56609cd 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/LongPatchItem.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/LongPatchItem.java
@@ -18,11 +18,6 @@
  */
 package org.apache.syncope.common.lib.request;
 
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlRootElement(name = "stringPatchItem")
-@XmlType
 public class LongPatchItem extends AbstractPatchItem<Long> {
 
     private static final long serialVersionUID = 7308597905137875993L;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/MembershipUR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/MembershipUR.java
index fb57caa..2ec0c7f 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/MembershipUR.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/MembershipUR.java
@@ -18,22 +18,16 @@
  */
 package org.apache.syncope.common.lib.request;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.Attr;
 
-@XmlRootElement(name = "membershipUR")
-@XmlType
 public class MembershipUR extends AbstractPatch {
 
     private static final long serialVersionUID = -6783121761221554433L;
@@ -95,16 +89,14 @@ public class MembershipUR extends AbstractPatch {
         this.group = group;
     }
 
-    @XmlElementWrapper(name = "plainAttrs")
-    @XmlElement(name = "attribute")
-    @JsonProperty("plainAttrs")
+    @JacksonXmlElementWrapper(localName = "plainAttrs")
+    @JacksonXmlProperty(localName = "plainAttr")
     public Set<Attr> getPlainAttrs() {
         return plainAttrs;
     }
 
-    @XmlElementWrapper(name = "virAttrs")
-    @XmlElement(name = "attribute")
-    @JsonProperty("virAttrs")
+    @JacksonXmlElementWrapper(localName = "virAttrs")
+    @JacksonXmlProperty(localName = "virAttr")
     public Set<Attr> getVirAttrs() {
         return virAttrs;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/PasswordPatch.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/PasswordPatch.java
index 4d67f14..c681ede 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/PasswordPatch.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/PasswordPatch.java
@@ -18,21 +18,14 @@
  */
 package org.apache.syncope.common.lib.request;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 
-@XmlRootElement(name = "passwordPatch")
-@XmlType
-@XmlSeeAlso({ ResourceAR.class, StatusR.class })
 public class PasswordPatch extends StringReplacePatchItem {
 
     private static final long serialVersionUID = 961023537479513071L;
@@ -88,9 +81,8 @@ public class PasswordPatch extends StringReplacePatchItem {
         this.onSyncope = onSyncope;
     }
 
-    @XmlElementWrapper(name = "resources")
-    @XmlElement(name = "resource")
-    @JsonProperty("resources")
+    @JacksonXmlElementWrapper(localName = "resources")
+    @JacksonXmlProperty(localName = "resource")
     public List<String> getResources() {
         return resources;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/RelationshipUR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/RelationshipUR.java
index 4e14d3b..45da77a 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/RelationshipUR.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/RelationshipUR.java
@@ -18,14 +18,10 @@
  */
 package org.apache.syncope.common.lib.request;
 
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.to.RelationshipTO;
 
-@XmlRootElement(name = "relationshipUR")
-@XmlType
 public class RelationshipUR extends AbstractPatch {
 
     private static final long serialVersionUID = 1314175521205206511L;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/ResourceAR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/ResourceAR.java
index 052bab0..1caad4d 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/ResourceAR.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/ResourceAR.java
@@ -20,8 +20,6 @@ package org.apache.syncope.common.lib.request;
 
 import java.util.Collection;
 import javax.ws.rs.PathParam;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.ResourceAssociationAction;
@@ -29,8 +27,6 @@ import org.apache.syncope.common.lib.types.ResourceAssociationAction;
 /**
  * Resource Association Request.
  */
-@XmlRootElement(name = "resourceAR")
-@XmlType
 public class ResourceAR extends PasswordPatch {
 
     private static final long serialVersionUID = 6295778399633883767L;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/ResourceDR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/ResourceDR.java
index 2e1edaa..481742f 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/ResourceDR.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/ResourceDR.java
@@ -18,24 +18,19 @@
  */
 package org.apache.syncope.common.lib.request;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.io.Serializable;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import javax.ws.rs.PathParam;
-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 org.apache.syncope.common.lib.BaseBean;
 import org.apache.syncope.common.lib.types.ResourceDeassociationAction;
 
 /**
  * Resource De-association Request.
  */
-@XmlRootElement(name = "resourceDR")
-@XmlType
-public class ResourceDR implements Serializable {
+public class ResourceDR implements BaseBean {
 
     private static final long serialVersionUID = 6295778399633883767L;
 
@@ -105,9 +100,8 @@ public class ResourceDR implements Serializable {
         this.action = action;
     }
 
-    @XmlElementWrapper(name = "resources")
-    @XmlElement(name = "resource")
-    @JsonProperty("resources")
+    @JacksonXmlElementWrapper(localName = "resources")
+    @JacksonXmlProperty(localName = "resource")
     public List<String> getResources() {
         return resources;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/StatusR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/StatusR.java
index f4c7acf..ea68c49 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/StatusR.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/StatusR.java
@@ -20,14 +20,10 @@ package org.apache.syncope.common.lib.request;
 
 import java.util.Collection;
 import javax.ws.rs.PathParam;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.StatusRType;
 
-@XmlRootElement(name = "statusR")
-@XmlType
 public class StatusR extends PasswordPatch {
 
     private static final long serialVersionUID = 99309988426922612L;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/StringPatchItem.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/StringPatchItem.java
index 98494a7..c5ade29 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/StringPatchItem.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/StringPatchItem.java
@@ -18,11 +18,6 @@
  */
 package org.apache.syncope.common.lib.request;
 
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlRootElement(name = "stringPatchItem")
-@XmlType
 public class StringPatchItem extends AbstractPatchItem<String> {
 
     private static final long serialVersionUID = -4956965404796800689L;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/StringReplacePatchItem.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/StringReplacePatchItem.java
index 9a60b9c..dcf363e 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/StringReplacePatchItem.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/StringReplacePatchItem.java
@@ -18,13 +18,6 @@
  */
 package org.apache.syncope.common.lib.request;
 
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlRootElement(name = "stringReplacePatchItem")
-@XmlType
-@XmlSeeAlso({ PasswordPatch.class })
 public class StringReplacePatchItem extends AbstractReplacePatchItem<String> {
 
     private static final long serialVersionUID = -5631052324901928363L;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserCR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserCR.java
index 0ce2eee..e8ba7a9 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserCR.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserCR.java
@@ -21,6 +21,8 @@ package org.apache.syncope.common.lib.request;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -28,10 +30,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.to.GroupableRelatableTO;
@@ -39,9 +37,7 @@ import org.apache.syncope.common.lib.to.LinkedAccountTO;
 import org.apache.syncope.common.lib.to.MembershipTO;
 import org.apache.syncope.common.lib.to.RelationshipTO;
 
-@XmlRootElement(name = "userCR")
-@XmlType
-@JsonPropertyOrder(value = { "@class", "username" })
+@JsonPropertyOrder(value = { "_class", "username" })
 @Schema(allOf = { AnyCR.class })
 public class UserCR extends AnyCR implements GroupableRelatableTO {
 
@@ -165,15 +161,15 @@ public class UserCR extends AnyCR implements GroupableRelatableTO {
 
     private final List<LinkedAccountTO> linkedAccounts = new ArrayList<>();
 
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.request.UserCR")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.request.UserCR")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
     }
 
     @JsonProperty(required = true)
-    @XmlElement(required = true)
     public String getUsername() {
         return username;
     }
@@ -230,9 +226,8 @@ public class UserCR extends AnyCR implements GroupableRelatableTO {
                 findFirst();
     }
 
-    @XmlElementWrapper(name = "relationships")
-    @XmlElement(name = "relationship")
-    @JsonProperty("relationships")
+    @JacksonXmlElementWrapper(localName = "relationships")
+    @JacksonXmlProperty(localName = "relationship")
     @Override
     public List<RelationshipTO> getRelationships() {
         return relationships;
@@ -244,9 +239,8 @@ public class UserCR extends AnyCR implements GroupableRelatableTO {
         return memberships.stream().filter(membership -> groupKey.equals(membership.getGroupKey())).findFirst();
     }
 
-    @XmlElementWrapper(name = "memberships")
-    @XmlElement(name = "membership")
-    @JsonProperty("memberships")
+    @JacksonXmlElementWrapper(localName = "memberships")
+    @JacksonXmlProperty(localName = "membership")
     @Override
     public List<MembershipTO> getMemberships() {
         return memberships;
@@ -257,16 +251,14 @@ public class UserCR extends AnyCR implements GroupableRelatableTO {
         return List.of();
     }
 
-    @XmlElementWrapper(name = "roles")
-    @XmlElement(name = "role")
-    @JsonProperty("roles")
+    @JacksonXmlElementWrapper(localName = "roles")
+    @JacksonXmlProperty(localName = "role")
     public Set<String> getRoles() {
         return roles;
     }
 
-    @XmlElementWrapper(name = "linkedAccounts")
-    @XmlElement(name = "linkedAccount")
-    @JsonProperty("linkedAccounts")
+    @JacksonXmlElementWrapper(localName = "linkedAccounts")
+    @JacksonXmlProperty(localName = "linkedAccount")
     public List<LinkedAccountTO> getLinkedAccounts() {
         return linkedAccounts;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserUR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserUR.java
index a9689fb..3fa32da 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserUR.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserUR.java
@@ -19,21 +19,17 @@
 package org.apache.syncope.common.lib.request;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.Collection;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 
-@XmlRootElement(name = "userUR")
-@XmlType
 @Schema(allOf = { AnyUR.class })
 public class UserUR extends AnyUR {
 
@@ -139,8 +135,9 @@ public class UserUR extends AnyUR {
 
     private final List<LinkedAccountUR> linkedAccounts = new ArrayList<>();
 
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.request.UserUR")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.request.UserUR")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
@@ -186,30 +183,26 @@ public class UserUR extends AnyUR {
         this.mustChangePassword = mustChangePassword;
     }
 
-    @XmlElementWrapper(name = "relationships")
-    @XmlElement(name = "relationship")
-    @JsonProperty("relationships")
+    @JacksonXmlElementWrapper(localName = "relationships")
+    @JacksonXmlProperty(localName = "relationship")
     public Set<RelationshipUR> getRelationships() {
         return relationships;
     }
 
-    @XmlElementWrapper(name = "memberships")
-    @XmlElement(name = "membership")
-    @JsonProperty("memberships")
+    @JacksonXmlElementWrapper(localName = "memberships")
+    @JacksonXmlProperty(localName = "membership")
     public Set<MembershipUR> getMemberships() {
         return memberships;
     }
 
-    @XmlElementWrapper(name = "roles")
-    @XmlElement(name = "role")
-    @JsonProperty("roles")
+    @JacksonXmlElementWrapper(localName = "roles")
+    @JacksonXmlProperty(localName = "role")
     public Set<StringPatchItem> getRoles() {
         return roles;
     }
 
-    @XmlElementWrapper(name = "linkedAccounts")
-    @XmlElement(name = "linkedAccount")
-    @JsonProperty("linkedAccounts")
+    @JacksonXmlElementWrapper(localName = "linkedAccounts")
+    @JacksonXmlProperty(localName = "linkedAccount")
     public List<LinkedAccountUR> getLinkedAccounts() {
         return linkedAccounts;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/package-info.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/package-info.java
deleted file mode 100644
index 4f2bccf..0000000
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/package-info.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-@XmlSchema(
-        namespace = SyncopeConstants.NS,
-        xmlns = { @XmlNs(prefix = SyncopeConstants.NS_PREFIX,
-                    namespaceURI = SyncopeConstants.NS) })
-@XmlJavaTypeAdapters({ @XmlJavaTypeAdapter(type = Date.class, value = DateAdapter.class), })
-package org.apache.syncope.common.lib.request;
-
-import java.util.Date;
-import javax.xml.bind.annotation.XmlNs;
-import javax.xml.bind.annotation.XmlSchema;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
-import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.jaxb.DateAdapter;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/search/AbstractFiqlSearchConditionBuilder.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/search/AbstractFiqlSearchConditionBuilder.java
index b16d652..6ddeaf8 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/search/AbstractFiqlSearchConditionBuilder.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/search/AbstractFiqlSearchConditionBuilder.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.common.lib.search;
 
-import java.io.Serializable;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -26,12 +25,13 @@ import org.apache.cxf.jaxrs.ext.search.SearchUtils;
 import org.apache.cxf.jaxrs.ext.search.client.CompleteCondition;
 import org.apache.cxf.jaxrs.ext.search.client.FiqlSearchConditionBuilder;
 import org.apache.cxf.jaxrs.ext.search.fiql.FiqlParser;
+import org.apache.syncope.common.lib.BaseBean;
 
 public abstract class AbstractFiqlSearchConditionBuilder<
         P extends SyncopeProperty<C>,
         PA extends SyncopePartialCondition<P, C>, 
         C extends SyncopeCompleteCondition<PA, P>>
-        extends FiqlSearchConditionBuilder implements Serializable {
+        extends FiqlSearchConditionBuilder implements BaseBean {
 
     private static final long serialVersionUID = 9043884238032703381L;
 
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/search/package-info.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/search/package-info.java
deleted file mode 100644
index e510f6f..0000000
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/search/package-info.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-@XmlSchema(
-        namespace = SyncopeConstants.NS,
-        xmlns = { @XmlNs(prefix = SyncopeConstants.NS_PREFIX,
-                    namespaceURI = SyncopeConstants.NS) })
-@XmlJavaTypeAdapters({ @XmlJavaTypeAdapter(type = Date.class, value = DateAdapter.class), })
-package org.apache.syncope.common.lib.search;
-
-import java.util.Date;
-import javax.xml.bind.annotation.XmlNs;
-import javax.xml.bind.annotation.XmlSchema;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
-import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.jaxb.DateAdapter;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractStartEndBean.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractStartEndBean.java
index aad8578..5a36ebb 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractStartEndBean.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractStartEndBean.java
@@ -21,15 +21,11 @@ package org.apache.syncope.common.lib.to;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.Date;
 import java.util.Optional;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.BaseBean;
 
-@XmlType
-@XmlSeeAlso({ ExecTO.class, ReportTO.class, TaskTO.class })
-public class AbstractStartEndBean extends BaseBean {
+public class AbstractStartEndBean implements BaseBean {
 
     private static final long serialVersionUID = 2399577415544539917L;
 
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AccessTokenTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AccessTokenTO.java
index 54a9318..c8e0784 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AccessTokenTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AccessTokenTO.java
@@ -20,16 +20,10 @@ package org.apache.syncope.common.lib.to;
 
 import java.util.Date;
 import java.util.Optional;
-
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.syncope.common.lib.BaseBean;
 
-@XmlRootElement(name = "accessToken")
-@XmlType
-public class AccessTokenTO extends BaseBean implements EntityTO {
+public class AccessTokenTO implements EntityTO {
 
     private static final long serialVersionUID = 6577639976115661357L;
 
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyObjectTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyObjectTO.java
index a2973f9..affa167 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyObjectTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyObjectTO.java
@@ -20,20 +20,15 @@ package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 
-@XmlRootElement(name = "anyObject")
-@XmlType
 @Schema(allOf = { AnyTO.class })
 public class AnyObjectTO extends AnyTO implements GroupableRelatableTO {
 
@@ -47,9 +42,9 @@ public class AnyObjectTO extends AnyTO implements GroupableRelatableTO {
 
     private final List<MembershipTO> dynMemberships = new ArrayList<>();
 
-    @XmlTransient
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.to.AnyObjectTO")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.AnyObjectTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
@@ -71,9 +66,8 @@ public class AnyObjectTO extends AnyTO implements GroupableRelatableTO {
                 findFirst();
     }
 
-    @XmlElementWrapper(name = "relationships")
-    @XmlElement(name = "relationship")
-    @JsonProperty("relationships")
+    @JacksonXmlElementWrapper(localName = "relationships")
+    @JacksonXmlProperty(localName = "relationship")
     @Override
     public List<RelationshipTO> getRelationships() {
         return relationships;
@@ -85,17 +79,15 @@ public class AnyObjectTO extends AnyTO implements GroupableRelatableTO {
         return memberships.stream().filter(membership -> groupKey.equals(membership.getGroupKey())).findFirst();
     }
 
-    @XmlElementWrapper(name = "memberships")
-    @XmlElement(name = "membership")
-    @JsonProperty("memberships")
+    @JacksonXmlElementWrapper(localName = "memberships")
+    @JacksonXmlProperty(localName = "membership")
     @Override
     public List<MembershipTO> getMemberships() {
         return memberships;
     }
 
-    @XmlElementWrapper(name = "dynMemberships")
-    @XmlElement(name = "dynMembership")
-    @JsonProperty("dynMemberships")
+    @JacksonXmlElementWrapper(localName = "dynMemberships")
+    @JacksonXmlProperty(localName = "dynMembership")
     @Override
     public List<MembershipTO> getDynMemberships() {
         return dynMemberships;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java
index 5eef16c..942ffc0 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java
@@ -23,6 +23,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.ArrayList;
 import java.util.Date;
@@ -30,28 +32,20 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.syncope.common.lib.BaseBean;
 import org.apache.syncope.common.lib.RealmMember;
 
-@XmlType
-@XmlSeeAlso({ UserTO.class, GroupTO.class, AnyObjectTO.class })
-@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "@class")
-@JsonPropertyOrder(value = { "@class", "key", "type", "realm", "username", "name" })
-@Schema(subTypes = { UserTO.class, GroupTO.class, AnyObjectTO.class }, discriminatorProperty = "@class")
-public abstract class AnyTO extends BaseBean implements EntityTO, RealmMember {
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "_class")
+@JsonPropertyOrder(value = { "_class", "key", "type", "realm", "username", "name" })
+@Schema(subTypes = { UserTO.class, GroupTO.class, AnyObjectTO.class }, discriminatorProperty = "_class")
+public abstract class AnyTO implements EntityTO, RealmMember {
 
     private static final long serialVersionUID = -754311920679872084L;
 
-    @XmlTransient
-    @JsonProperty("@class")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
     private String discriminator;
 
     /**
@@ -98,7 +92,7 @@ public abstract class AnyTO extends BaseBean implements EntityTO, RealmMember {
 
     private final Set<String> resources = new HashSet<>();
 
-    @Schema(name = "@class", required = true)
+    @Schema(name = "_class", required = true)
     public abstract String getDiscriminator();
 
     public void setDiscriminator(final String discriminator) {
@@ -188,9 +182,8 @@ public abstract class AnyTO extends BaseBean implements EntityTO, RealmMember {
         this.realm = realm;
     }
 
-    @XmlElementWrapper(name = "dynRealms")
-    @XmlElement(name = "dynRealmF")
-    @JsonProperty("dynRealms")
+    @JacksonXmlElementWrapper(localName = "dynRealms")
+    @JacksonXmlProperty(localName = "dynRealmF")
     public List<String> getDynRealms() {
         return dynRealms;
     }
@@ -203,17 +196,15 @@ public abstract class AnyTO extends BaseBean implements EntityTO, RealmMember {
         this.status = status;
     }
 
-    @XmlElementWrapper(name = "auxClasses")
-    @XmlElement(name = "class")
-    @JsonProperty("auxClasses")
+    @JacksonXmlElementWrapper(localName = "auxClasses")
+    @JacksonXmlProperty(localName = "class")
     @Override
     public Set<String> getAuxClasses() {
         return auxClasses;
     }
 
-    @XmlElementWrapper(name = "plainAttrs")
-    @XmlElement(name = "attribute")
-    @JsonProperty("plainAttrs")
+    @JacksonXmlElementWrapper(localName = "plainAttrs")
+    @JacksonXmlProperty(localName = "plainAttr")
     @Override
     public Set<Attr> getPlainAttrs() {
         return plainAttrs;
@@ -225,9 +216,8 @@ public abstract class AnyTO extends BaseBean implements EntityTO, RealmMember {
         return plainAttrs.stream().filter(attr -> attr.getSchema().equals(schema)).findFirst();
     }
 
-    @XmlElementWrapper(name = "derAttrs")
-    @XmlElement(name = "attribute")
-    @JsonProperty("derAttrs")
+    @JacksonXmlElementWrapper(localName = "derAttrs")
+    @JacksonXmlProperty(localName = "derAttr")
     @Override
     public Set<Attr> getDerAttrs() {
         return derAttrs;
@@ -239,9 +229,8 @@ public abstract class AnyTO extends BaseBean implements EntityTO, RealmMember {
         return derAttrs.stream().filter(attr -> attr.getSchema().equals(schema)).findFirst();
     }
 
-    @XmlElementWrapper(name = "virAttrs")
-    @XmlElement(name = "attribute")
-    @JsonProperty("virAttrs")
+    @JacksonXmlElementWrapper(localName = "virAttrs")
+    @JacksonXmlProperty(localName = "virAttr")
     @Override
     public Set<Attr> getVirAttrs() {
         return virAttrs;
@@ -253,9 +242,6 @@ public abstract class AnyTO extends BaseBean implements EntityTO, RealmMember {
         return virAttrs.stream().filter(attr -> attr.getSchema().equals(schema)).findFirst();
     }
 
-    @XmlElementWrapper(name = "resources")
-    @XmlElement(name = "resource")
-    @JsonProperty("resources")
     @Override
     public Set<String> getResources() {
         return resources;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTypeClassTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTypeClassTO.java
index dd3166c..40615bf 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTypeClassTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTypeClassTO.java
@@ -18,17 +18,12 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.List;
 import javax.ws.rs.PathParam;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 
-@XmlRootElement(name = "anyTypeClass")
-@XmlType
 public class AnyTypeClassTO implements EntityTO {
 
     private static final long serialVersionUID = -591757688607551266L;
@@ -54,32 +49,27 @@ public class AnyTypeClassTO implements EntityTO {
         this.key = key;
     }
 
-    @XmlElementWrapper(name = "plainSchemas")
-    @XmlElement(name = "schema")
-    @JsonProperty("plainSchemas")
+    @JacksonXmlElementWrapper(localName = "plainSchemas")
+    @JacksonXmlProperty(localName = "plainSchema")
     public List<String> getPlainSchemas() {
         return plainSchemas;
     }
 
-    @XmlElementWrapper(name = "derSchemas")
-    @XmlElement(name = "schema")
-    @JsonProperty("derSchemas")
+    @JacksonXmlElementWrapper(localName = "derSchemas")
+    @JacksonXmlProperty(localName = "derSchema")
     public List<String> getDerSchemas() {
         return derSchemas;
     }
 
-    @XmlElementWrapper(name = "virSchemas")
-    @XmlElement(name = "schema")
-    @JsonProperty("virSchemas")
+    @JacksonXmlElementWrapper(localName = "virSchemas")
+    @JacksonXmlProperty(localName = "virSchema")
     public List<String> getVirSchemas() {
         return virSchemas;
     }
 
-    @XmlElementWrapper(name = "inUseByTypes")
-    @XmlElement(name = "anyTypeClass")
-    @JsonProperty("inUseByTypes")
+    @JacksonXmlElementWrapper(localName = "inUseByTypes")
+    @JacksonXmlProperty(localName = "inUseByType")
     public List<String> getInUseByTypes() {
         return inUseByTypes;
     }
-
 }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTypeTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTypeTO.java
index 53c9e66..94dd6ff 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTypeTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTypeTO.java
@@ -18,20 +18,15 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.List;
 import javax.ws.rs.PathParam;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 
-@XmlRootElement(name = "anyType")
-@XmlType
 public class AnyTypeTO implements EntityTO {
 
     private static final long serialVersionUID = 6771657557616874373L;
@@ -61,9 +56,8 @@ public class AnyTypeTO implements EntityTO {
         this.kind = kind;
     }
 
-    @XmlElementWrapper(name = "classes")
-    @XmlElement(name = "class")
-    @JsonProperty("classes")
+    @JacksonXmlElementWrapper(localName = "classes")
+    @JacksonXmlProperty(localName = "class")
     public List<String> getClasses() {
         return classes;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ApplicationTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ApplicationTO.java
index 7283386..f9c3732 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ApplicationTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ApplicationTO.java
@@ -18,17 +18,12 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.List;
 import javax.ws.rs.PathParam;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 
-@XmlRootElement(name = "application")
-@XmlType
 public class ApplicationTO implements EntityTO {
 
     private static final long serialVersionUID = -4117796727736925215L;
@@ -58,11 +53,9 @@ public class ApplicationTO implements EntityTO {
         this.description = description;
     }
 
-    @XmlElementWrapper(name = "privileges")
-    @XmlElement(name = "privilege")
-    @JsonProperty("privileges")
+    @JacksonXmlElementWrapper(localName = "privileges")
+    @JacksonXmlProperty(localName = "privilege")
     public List<PrivilegeTO> getPrivileges() {
         return privileges;
     }
-
 }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ConnObjectTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ConnObjectTO.java
index fa5db9d..fc1158f 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ConnObjectTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ConnObjectTO.java
@@ -19,30 +19,24 @@
 package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.io.Serializable;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.LinkedHashSet;
 import java.util.Optional;
 import java.util.Set;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.Attr;
+import org.apache.syncope.common.lib.BaseBean;
 
-@XmlRootElement(name = "connObject")
-@XmlType
-public class ConnObjectTO implements Serializable {
+public class ConnObjectTO implements BaseBean {
 
     private static final long serialVersionUID = 5139554911265442497L;
 
     private final Set<Attr> attrs = new LinkedHashSet<>();
 
-    @XmlElementWrapper(name = "attrs")
-    @XmlElement(name = "attribute")
-    @JsonProperty("attrs")
+    @JacksonXmlElementWrapper(localName = "attrs")
+    @JacksonXmlProperty(localName = "attr")
     public Set<Attr> getAttrs() {
         return attrs;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/DerSchemaTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/DerSchemaTO.java
index 5477fca..b467ce2 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/DerSchemaTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/DerSchemaTO.java
@@ -19,15 +19,11 @@
 package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 
-@XmlRootElement(name = "derSchema")
-@XmlType
 @Schema(allOf = { SchemaTO.class })
 public class DerSchemaTO extends SchemaTO {
 
@@ -35,9 +31,9 @@ public class DerSchemaTO extends SchemaTO {
 
     private String expression;
 
-    @XmlTransient
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.to.DerSchemaTO")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.DerSchemaTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/DynRealmTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/DynRealmTO.java
index ee5d5bc..e8a3033 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/DynRealmTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/DynRealmTO.java
@@ -18,24 +18,16 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
 import java.util.HashMap;
 import java.util.Map;
 import javax.ws.rs.PathParam;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 
-@XmlRootElement(name = "dynRealm")
-@XmlType
 public class DynRealmTO implements EntityTO {
 
     private static final long serialVersionUID = 4560822655754800031L;
 
     private String key;
 
-    @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
     private final Map<String, String> dynMembershipConds = new HashMap<>();
 
     @Override
@@ -49,7 +41,6 @@ public class DynRealmTO implements EntityTO {
         this.key = key;
     }
 
-    @JsonProperty
     public Map<String, String> getDynMembershipConds() {
         return dynMembershipConds;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/EntityTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/EntityTO.java
index c07749f..e2d158f 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/EntityTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/EntityTO.java
@@ -18,9 +18,9 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import java.io.Serializable;
+import org.apache.syncope.common.lib.BaseBean;
 
-public interface EntityTO extends Serializable {
+public interface EntityTO extends BaseBean {
 
     String getKey();
 
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ErrorTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ErrorTO.java
index 378b814..4460ae1 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ErrorTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ErrorTO.java
@@ -18,19 +18,14 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.io.Serializable;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.List;
-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 org.apache.syncope.common.lib.BaseBean;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 
-@XmlRootElement(name = "error")
-@XmlType
-public class ErrorTO implements Serializable {
+public class ErrorTO implements BaseBean {
 
     private static final long serialVersionUID = 2435764161719225927L;
 
@@ -56,11 +51,9 @@ public class ErrorTO implements Serializable {
         this.type = type;
     }
 
-    @XmlElementWrapper(name = "elements")
-    @XmlElement(name = "element")
-    @JsonProperty("elements")
+    @JacksonXmlElementWrapper(localName = "elements")
+    @JacksonXmlProperty(localName = "element")
     public List<String> getElements() {
         return elements;
     }
-
 }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ExecTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ExecTO.java
index 1f98a5d..80eb0f8 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ExecTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ExecTO.java
@@ -18,14 +18,10 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.JobType;
 
-@XmlRootElement(name = "exec")
-@XmlType()
 public class ExecTO extends AbstractStartEndBean implements EntityTO {
 
     private static final long serialVersionUID = -4621191979198357081L;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/GroupTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/GroupTO.java
index a7247d9..c0a1005 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/GroupTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/GroupTO.java
@@ -20,25 +20,18 @@ package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 
-@XmlRootElement(name = "group")
-@XmlType
 @Schema(allOf = { AnyTO.class })
 public class GroupTO extends AnyTO {
 
@@ -60,14 +53,13 @@ public class GroupTO extends AnyTO {
 
     private int dynamicAnyObjectMembershipCount;
 
-    @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
     private final Map<String, String> adynMembershipConds = new HashMap<>();
 
     private final List<TypeExtensionTO> typeExtensions = new ArrayList<>();
 
-    @XmlTransient
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.to.GroupTO")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.GroupTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
@@ -147,7 +139,6 @@ public class GroupTO extends AnyTO {
         this.dynamicAnyObjectMembershipCount = dynamicAnyObjectMembershipCount;
     }
 
-    @JsonProperty
     public Map<String, String> getADynMembershipConds() {
         return adynMembershipConds;
     }
@@ -159,9 +150,8 @@ public class GroupTO extends AnyTO {
                 findFirst();
     }
 
-    @XmlElementWrapper(name = "typeExtensions")
-    @XmlElement(name = "typeExtension")
-    @JsonProperty("typeExtensions")
+    @JacksonXmlElementWrapper(localName = "typeExtensions")
+    @JacksonXmlProperty(localName = "typeExtension")
     public List<TypeExtensionTO> getTypeExtensions() {
         return typeExtensions;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ImplementationTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ImplementationTO.java
index c68bf5c..a328a4b 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ImplementationTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ImplementationTO.java
@@ -19,14 +19,10 @@
 package org.apache.syncope.common.lib.to;
 
 import javax.ws.rs.PathParam;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.ImplementationEngine;
 
-@XmlRootElement(name = "implementation")
-@XmlType
 public class ImplementationTO implements EntityTO {
 
     private static final long serialVersionUID = 2703397698393060586L;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ItemContainerTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ItemContainerTO.java
index a76fe10..a8b3ff3 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ItemContainerTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ItemContainerTO.java
@@ -19,8 +19,9 @@
 package org.apache.syncope.common.lib.to;
 
 import java.util.List;
+import org.apache.syncope.common.lib.BaseBean;
 
-public interface ItemContainerTO {
+public interface ItemContainerTO extends BaseBean {
 
     ItemTO getConnObjectKeyItem();
 
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ItemTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ItemTO.java
index 37b397d..2bd53ca 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ItemTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ItemTO.java
@@ -18,19 +18,14 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.List;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.MappingPurpose;
 
-@XmlRootElement(name = "item")
-@XmlType
 public class ItemTO implements EntityTO {
 
     private static final long serialVersionUID = 2983498836767176862L;
@@ -154,9 +149,8 @@ public class ItemTO implements EntityTO {
         this.pullJEXLTransformer = pullJEXLTransformer;
     }
 
-    @XmlElementWrapper(name = "transformers")
-    @XmlElement(name = "transformer")
-    @JsonProperty("transformers")
+    @JacksonXmlElementWrapper(localName = "transformers")
+    @JacksonXmlProperty(localName = "transformer")
     public List<String> getTransformers() {
         return transformers;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/JobTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/JobTO.java
index 66ceed9..58d9fce 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/JobTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/JobTO.java
@@ -18,17 +18,12 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import java.io.Serializable;
 import java.util.Date;
 import java.util.Optional;
-
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
+import org.apache.syncope.common.lib.BaseBean;
 import org.apache.syncope.common.lib.types.JobType;
 
-@XmlRootElement(name = "job")
-@XmlType
-public class JobTO implements Serializable {
+public class JobTO implements BaseBean {
 
     private static final long serialVersionUID = -7254450981751326711L;
 
@@ -101,5 +96,4 @@ public class JobTO implements Serializable {
     public void setStatus(final String status) {
         this.status = status;
     }
-
 }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/LinkedAccountTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/LinkedAccountTO.java
index 4697cd1..72dd158 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/LinkedAccountTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/LinkedAccountTO.java
@@ -19,20 +19,15 @@
 package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.HashSet;
 import java.util.Optional;
 import java.util.Set;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.Attr;
 
-@XmlRootElement(name = "linkedAccount")
-@XmlType
 public class LinkedAccountTO implements EntityTO {
 
     private static final long serialVersionUID = 7396929732310559535L;
@@ -137,9 +132,8 @@ public class LinkedAccountTO implements EntityTO {
         this.suspended = suspended;
     }
 
-    @XmlElementWrapper(name = "plainAttrs")
-    @XmlElement(name = "attribute")
-    @JsonProperty("plainAttrs")
+    @JacksonXmlElementWrapper(localName = "plainAttrs")
+    @JacksonXmlProperty(localName = "plainAttr")
     public Set<Attr> getPlainAttrs() {
         return plainAttrs;
     }
@@ -149,9 +143,8 @@ public class LinkedAccountTO implements EntityTO {
         return plainAttrs.stream().filter(attr -> attr.getSchema().equals(schema)).findFirst();
     }
 
-    @XmlElementWrapper(name = "privileges")
-    @XmlElement(name = "privilege")
-    @JsonProperty("privileges")
+    @JacksonXmlElementWrapper(localName = "privileges")
+    @JacksonXmlProperty(localName = "privilege")
     public Set<String> getPrivileges() {
         return privileges;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/MailTemplateTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/MailTemplateTO.java
index d93bce3..72fdce1 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/MailTemplateTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/MailTemplateTO.java
@@ -19,13 +19,9 @@
 package org.apache.syncope.common.lib.to;
 
 import javax.ws.rs.PathParam;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 
-@XmlRootElement(name = "mailTemplate")
-@XmlType
 public class MailTemplateTO implements EntityTO {
 
     private static final long serialVersionUID = 8389755049666062735L;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/MembershipTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/MembershipTO.java
index 6625654..d129b21 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/MembershipTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/MembershipTO.java
@@ -23,23 +23,18 @@ import org.apache.commons.lang3.builder.ToStringStyle;
 import org.apache.syncope.common.lib.Attr;
 import org.apache.syncope.common.lib.Attributable;
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.io.Serializable;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.syncope.common.lib.BaseBean;
 
-@XmlRootElement(name = "membership")
-@XmlType
-public class MembershipTO implements Serializable, Attributable {
+public class MembershipTO implements BaseBean, Attributable {
 
     private static final long serialVersionUID = 5992828670273935861L;
 
@@ -117,9 +112,8 @@ public class MembershipTO implements Serializable, Attributable {
         this.groupName = groupName;
     }
 
-    @XmlElementWrapper(name = "plainAttrs")
-    @XmlElement(name = "attribute")
-    @JsonProperty("plainAttrs")
+    @JacksonXmlElementWrapper(localName = "plainAttrs")
+    @JacksonXmlProperty(localName = "plainAttr")
     @Override
     public Set<Attr> getPlainAttrs() {
         return plainAttrs;
@@ -131,9 +125,8 @@ public class MembershipTO implements Serializable, Attributable {
         return plainAttrs.stream().filter(attr -> attr.getSchema().equals(schema)).findFirst();
     }
 
-    @XmlElementWrapper(name = "derAttrs")
-    @XmlElement(name = "attribute")
-    @JsonProperty("derAttrs")
+    @JacksonXmlElementWrapper(localName = "derAttrs")
+    @JacksonXmlProperty(localName = "derAttr")
     @Override
     public Set<Attr> getDerAttrs() {
         return derAttrs;
@@ -145,9 +138,8 @@ public class MembershipTO implements Serializable, Attributable {
         return derAttrs.stream().filter(attr -> attr.getSchema().equals(schema)).findFirst();
     }
 
-    @XmlElementWrapper(name = "virAttrs")
-    @XmlElement(name = "attribute")
-    @JsonProperty("virAttrs")
+    @JacksonXmlElementWrapper(localName = "virAttrs")
+    @JacksonXmlProperty(localName = "virAttr")
     @Override
     public Set<Attr> getVirAttrs() {
         return virAttrs;
@@ -194,8 +186,8 @@ public class MembershipTO implements Serializable, Attributable {
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.SIMPLE_STYLE).
-            append(this.groupKey).
-            append(this.groupName).
-            build();
+                append(this.groupKey).
+                append(this.groupName).
+                build();
     }
 }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTO.java
index f421459..2fbf123 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTO.java
@@ -18,24 +18,17 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import javax.ws.rs.PathParam;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 import org.apache.syncope.common.lib.types.TraceLevel;
 
-@XmlRootElement(name = "notification")
-@XmlType
 public class NotificationTO implements EntityTO {
 
     private static final long serialVersionUID = -6145117115632592612L;
@@ -44,7 +37,6 @@ public class NotificationTO implements EntityTO {
 
     private final List<String> events = new ArrayList<>();
 
-    @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
     private final Map<String, String> abouts = new HashMap<>();
 
     private String recipientsFIQL;
@@ -67,21 +59,18 @@ public class NotificationTO implements EntityTO {
 
     private boolean active;
 
-    @JsonProperty
     public Map<String, String> getAbouts() {
         return abouts;
     }
 
-    @XmlElementWrapper(name = "events")
-    @XmlElement(name = "event")
-    @JsonProperty("events")
+    @JacksonXmlElementWrapper(localName = "events")
+    @JacksonXmlProperty(localName = "event")
     public List<String> getEvents() {
         return events;
     }
 
-    @XmlElementWrapper(name = "staticRecipients")
-    @XmlElement(name = "staticRecipient")
-    @JsonProperty("staticRecipients")
+    @JacksonXmlElementWrapper(localName = "staticRecipients")
+    @JacksonXmlProperty(localName = "staticRecipient")
     public List<String> getStaticRecipients() {
         return staticRecipients;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTaskTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTaskTO.java
index 5ea6618..18bc4ad 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTaskTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTaskTO.java
@@ -19,21 +19,16 @@
 package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.HashSet;
 import java.util.Set;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.TraceLevel;
 
-@XmlRootElement(name = "notificationTask")
-@XmlType
 @Schema(allOf = { TaskTO.class })
 public class NotificationTaskTO extends TaskTO {
 
@@ -59,9 +54,9 @@ public class NotificationTaskTO extends TaskTO {
 
     private TraceLevel traceLevel;
 
-    @XmlTransient
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.to.NotificationTaskTO")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.NotificationTaskTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
@@ -95,9 +90,8 @@ public class NotificationTaskTO extends TaskTO {
     }
 
     @Schema(accessMode = Schema.AccessMode.READ_ONLY)
-    @XmlElementWrapper(name = "recipients")
-    @XmlElement(name = "recipient")
-    @JsonProperty("recipients")
+    @JacksonXmlElementWrapper(localName = "recipients")
+    @JacksonXmlProperty(localName = "recipient")
     public Set<String> getRecipients() {
         return recipients;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PagedResult.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PagedResult.java
index 27401d6..b098076 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PagedResult.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PagedResult.java
@@ -18,23 +18,16 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import java.io.Serializable;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.List;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.BaseBean;
 
-@XmlRootElement(name = "pagedResult")
-@XmlType
-public class PagedResult<T extends BaseBean> implements Serializable {
+public class PagedResult<T extends BaseBean> implements BaseBean {
 
     private static final long serialVersionUID = 3472875885259250934L;
 
@@ -66,10 +59,8 @@ public class PagedResult<T extends BaseBean> implements Serializable {
         this.next = next;
     }
 
-    @XmlElementWrapper(name = "result")
-    @XmlElement(name = "item")
-    @JsonProperty("result")
-    @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
+    @JacksonXmlElementWrapper(localName = "result")
+    @JacksonXmlProperty(localName = "item")
     public List<T> getResult() {
         return result;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PlainSchemaTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PlainSchemaTO.java
index 338b642..5525b5b 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PlainSchemaTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PlainSchemaTO.java
@@ -19,19 +19,14 @@
 package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
-
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.AttrSchemaType;
 import org.apache.syncope.common.lib.types.CipherAlgorithm;
 
-@XmlRootElement(name = "plainSchema")
-@XmlType
 @Schema(allOf = { SchemaTO.class })
 public class PlainSchemaTO extends SchemaTO {
 
@@ -61,9 +56,9 @@ public class PlainSchemaTO extends SchemaTO {
 
     private String mimeType;
 
-    @XmlTransient
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.to.PlainSchemaTO")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.PlainSchemaTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PrivilegeTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PrivilegeTO.java
index 228bc99..946f91a 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PrivilegeTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PrivilegeTO.java
@@ -19,11 +19,7 @@
 package org.apache.syncope.common.lib.to;
 
 import io.swagger.v3.oas.annotations.media.Schema;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 
-@XmlRootElement(name = "privilege")
-@XmlType
 public class PrivilegeTO implements EntityTO {
 
     private static final long serialVersionUID = 5461846770586031758L;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PropagationStatus.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PropagationStatus.java
index c6d1e0e..e41b447 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PropagationStatus.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PropagationStatus.java
@@ -18,19 +18,15 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import java.io.Serializable;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.syncope.common.lib.BaseBean;
 import org.apache.syncope.common.lib.types.ExecStatus;
 
 /**
  * Single propagation status.
  */
-@XmlRootElement(name = "propagationStatus")
-@XmlType
-public class PropagationStatus implements Serializable {
+public class PropagationStatus implements BaseBean {
 
     private static final long serialVersionUID = 3921498450222857690L;
 
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PropagationTaskTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PropagationTaskTO.java
index 5b06fcc..ecf8f5a 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PropagationTaskTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PropagationTaskTO.java
@@ -19,18 +19,13 @@
 package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 
-@XmlRootElement(name = "propagationTask")
-@XmlType
 @Schema(allOf = { TaskTO.class })
 public class PropagationTaskTO extends TaskTO {
 
@@ -54,16 +49,15 @@ public class PropagationTaskTO extends TaskTO {
 
     private String entityKey;
 
-    @XmlTransient
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.to.PropagationTaskTO")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.PropagationTaskTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
     }
 
     @JsonProperty(required = true)
-    @XmlElement(required = true)
     public String getConnObjectKey() {
         return connObjectKey;
     }
@@ -81,7 +75,6 @@ public class PropagationTaskTO extends TaskTO {
     }
 
     @JsonProperty(required = true)
-    @XmlElement(required = true)
     public String getResource() {
         return resource;
     }
@@ -91,7 +84,6 @@ public class PropagationTaskTO extends TaskTO {
     }
 
     @JsonProperty(required = true)
-    @XmlElement(required = true)
     public ResourceOperation getOperation() {
         return operation;
     }
@@ -101,7 +93,6 @@ public class PropagationTaskTO extends TaskTO {
     }
 
     @JsonProperty(required = true)
-    @XmlElement(required = true)
     public String getAttributes() {
         return attributes;
     }
@@ -111,7 +102,6 @@ public class PropagationTaskTO extends TaskTO {
     }
 
     @JsonProperty(required = true)
-    @XmlElement(required = true)
     public String getObjectClassName() {
         return objectClassName;
     }
@@ -121,7 +111,6 @@ public class PropagationTaskTO extends TaskTO {
     }
 
     @JsonProperty(required = true)
-    @XmlElement(required = true)
     public AnyTypeKind getAnyTypeKind() {
         return anyTypeKind;
     }
@@ -131,7 +120,6 @@ public class PropagationTaskTO extends TaskTO {
     }
 
     @JsonProperty(required = true)
-    @XmlElement(required = true)
     public String getAnyType() {
         return anyType;
     }
@@ -141,7 +129,6 @@ public class PropagationTaskTO extends TaskTO {
     }
 
     @JsonProperty(required = true)
-    @XmlElement(required = true)
     public String getEntityKey() {
         return entityKey;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisioningResult.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisioningResult.java
index 09bae8a..9470284 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisioningResult.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisioningResult.java
@@ -18,35 +18,22 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import java.io.Serializable;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.List;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.syncope.common.lib.jaxb.XmlEntityTOAdapter;
+import org.apache.syncope.common.lib.BaseBean;
 
-@XmlRootElement(name = "provisioningResult")
-@XmlType
-public class ProvisioningResult<E extends EntityTO> implements Serializable {
+public class ProvisioningResult<E extends EntityTO> implements BaseBean {
 
     private static final long serialVersionUID = 351317476398082746L;
 
-    @XmlJavaTypeAdapter(XmlEntityTOAdapter.class)
     private E entity;
 
     private final List<PropagationStatus> propagationStatuses = new ArrayList<>();
 
-    @XmlTransient
-    @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
-    @JsonProperty
     public E getEntity() {
         return entity;
     }
@@ -55,9 +42,8 @@ public class ProvisioningResult<E extends EntityTO> implements Serializable {
         this.entity = entity;
     }
 
-    @XmlElementWrapper(name = "propagationStatuses")
-    @XmlElement(name = "propagationStatus")
-    @JsonProperty("propagationStatuses")
+    @JacksonXmlElementWrapper(localName = "propagationStatuses")
+    @JacksonXmlProperty(localName = "propagationStatus")
     public List<PropagationStatus> getPropagationStatuses() {
         return propagationStatuses;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisioningTaskTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisioningTaskTO.java
index c1f8540..2632cdf 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisioningTaskTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisioningTaskTO.java
@@ -19,24 +19,18 @@
 package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.ArrayList;
 import java.util.List;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.MatchingRule;
 import org.apache.syncope.common.lib.types.UnmatchingRule;
 
-@XmlRootElement(name = "provisioningTask")
-@XmlType
-@XmlSeeAlso({ PushTaskTO.class, PullTaskTO.class })
 @Schema(allOf = { SchedTaskTO.class },
-        subTypes = { PushTaskTO.class, PullTaskTO.class }, discriminatorProperty = "@class")
+        subTypes = { PushTaskTO.class, PullTaskTO.class }, discriminatorProperty = "_class")
 public abstract class ProvisioningTaskTO extends SchedTaskTO {
 
     private static final long serialVersionUID = -5722284116974636425L;
@@ -58,7 +52,6 @@ public abstract class ProvisioningTaskTO extends SchedTaskTO {
     private final List<String> actions = new ArrayList<>();
 
     @JsonProperty(required = true)
-    @XmlElement(required = true)
     public String getResource() {
         return resource;
     }
@@ -99,9 +92,8 @@ public abstract class ProvisioningTaskTO extends SchedTaskTO {
         this.syncStatus = syncStatus;
     }
 
-    @XmlElementWrapper(name = "actions")
-    @XmlElement(name = "action")
-    @JsonProperty("actions")
+    @JacksonXmlElementWrapper(localName = "actions")
+    @JacksonXmlProperty(localName = "action")
     public List<String> getActions() {
         return actions;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PullTaskTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PullTaskTO.java
index f32b554..425eb28 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PullTaskTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PullTaskTO.java
@@ -19,50 +19,37 @@
 package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.HashMap;
 import java.util.Map;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 import org.apache.syncope.common.lib.types.PullMode;
 
-@XmlRootElement(name = "pullTask")
-@XmlType
-@XmlAccessorType(XmlAccessType.FIELD)
 @Schema(allOf = { ProvisioningTaskTO.class })
 public class PullTaskTO extends ProvisioningTaskTO implements TemplatableTO {
 
     private static final long serialVersionUID = -2143537546915809017L;
 
     @JsonProperty(required = true)
-    @XmlElement(required = true)
     private PullMode pullMode;
 
     private String reconFilterBuilder;
 
     @JsonProperty(required = true)
-    @XmlElement(required = true)
     private String destinationRealm;
 
     private boolean remediation;
 
-    @XmlTransient
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.to.PullTaskTO")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.PullTaskTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
     }
 
-    @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
     private final Map<String, AnyTO> templates = new HashMap<>();
 
     public PullMode getPullMode() {
@@ -89,7 +76,6 @@ public class PullTaskTO extends ProvisioningTaskTO implements TemplatableTO {
         this.destinationRealm = destinationRealm;
     }
 
-    @JsonProperty
     @Override
     public Map<String, AnyTO> getTemplates() {
         return templates;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PushTaskTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PushTaskTO.java
index a1eaf11..6c41491 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PushTaskTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PushTaskTO.java
@@ -19,38 +19,26 @@
 package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.HashMap;
 import java.util.Map;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 
-@XmlRootElement(name = "pushTask")
-@XmlType
-@XmlAccessorType(XmlAccessType.FIELD)
 @Schema(allOf = { ProvisioningTaskTO.class })
 public class PushTaskTO extends ProvisioningTaskTO {
 
     private static final long serialVersionUID = -2143537546915809018L;
 
     @JsonProperty(required = true)
-    @XmlElement(required = true)
     private String sourceRealm;
 
-    @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
     private final Map<String, String> filters = new HashMap<>();
 
-    @XmlTransient
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.to.PushTaskTO")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.PushTaskTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/RealmTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/RealmTO.java
index 037f782..6e7158f 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/RealmTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/RealmTO.java
@@ -18,7 +18,8 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -26,19 +27,10 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import javax.ws.rs.PathParam;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.syncope.common.lib.BaseBean;
-import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 
-@XmlRootElement(name = "realm")
-@XmlType
-public class RealmTO extends BaseBean implements NamedEntityTO, TemplatableTO {
+public class RealmTO implements NamedEntityTO, TemplatableTO {
 
     private static final long serialVersionUID = 516330662956254391L;
 
@@ -62,7 +54,6 @@ public class RealmTO extends BaseBean implements NamedEntityTO, TemplatableTO {
 
     private final List<String> actions = new ArrayList<>();
 
-    @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
     private final Map<String, AnyTO> templates = new HashMap<>();
 
     private final Set<String> resources = new HashSet<>();
@@ -144,22 +135,19 @@ public class RealmTO extends BaseBean implements NamedEntityTO, TemplatableTO {
         this.attrReleasePolicy = attrReleasePolicy;
     }
 
-    @XmlElementWrapper(name = "actions")
-    @XmlElement(name = "action")
-    @JsonProperty("actions")
+    @JacksonXmlElementWrapper(localName = "actions")
+    @JacksonXmlProperty(localName = "action")
     public List<String> getActions() {
         return actions;
     }
 
-    @JsonProperty
     @Override
     public Map<String, AnyTO> getTemplates() {
         return templates;
     }
 
-    @XmlElementWrapper(name = "resources")
-    @XmlElement(name = "resource")
-    @JsonProperty("resources")
+    @JacksonXmlElementWrapper(localName = "resources")
+    @JacksonXmlProperty(localName = "resource")
     public Set<String> getResources() {
         return resources;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/RelationshipTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/RelationshipTO.java
index efc9d76..fd491ce 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/RelationshipTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/RelationshipTO.java
@@ -18,15 +18,11 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import java.io.Serializable;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.syncope.common.lib.BaseBean;
 
-@XmlRootElement(name = "relationship")
-@XmlType
-public class RelationshipTO implements Serializable {
+public class RelationshipTO implements BaseBean {
 
     private static final long serialVersionUID = 360672942026613929L;
 
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/RelationshipTypeTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/RelationshipTypeTO.java
index 5db2ac4..0475ee2 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/RelationshipTypeTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/RelationshipTypeTO.java
@@ -19,11 +19,7 @@
 package org.apache.syncope.common.lib.to;
 
 import javax.ws.rs.Path;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 
-@XmlRootElement(name = "relationshipType")
-@XmlType
 public class RelationshipTypeTO implements EntityTO {
 
     private static final long serialVersionUID = -1884088415277925817L;
@@ -50,5 +46,4 @@ public class RelationshipTypeTO implements EntityTO {
     public void setDescription(final String description) {
         this.description = description;
     }
-
 }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ReportTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ReportTO.java
index 2c034ff..364ea00 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ReportTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ReportTO.java
@@ -18,22 +18,16 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Optional;
-
 import javax.ws.rs.PathParam;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 
-@XmlRootElement(name = "report")
-@XmlType
 public class ReportTO extends AbstractStartEndBean implements NamedEntityTO {
 
     private static final long serialVersionUID = 5274568072084814410L;
@@ -59,7 +53,7 @@ public class ReportTO extends AbstractStartEndBean implements NamedEntityTO {
     private String template;
 
     private String lastExecutor;
-    
+
     @Override
     public String getKey() {
         return key;
@@ -81,9 +75,8 @@ public class ReportTO extends AbstractStartEndBean implements NamedEntityTO {
         this.name = name;
     }
 
-    @XmlElementWrapper(name = "reportlets")
-    @XmlElement(name = "reportlets")
-    @JsonProperty("reportlets")
+    @JacksonXmlElementWrapper(localName = "reportlets")
+    @JacksonXmlProperty(localName = "reportlets")
     public List<String> getReportlets() {
         return reportlets;
     }
@@ -96,9 +89,8 @@ public class ReportTO extends AbstractStartEndBean implements NamedEntityTO {
         this.cronExpression = cronExpression;
     }
 
-    @XmlElementWrapper(name = "executions")
-    @XmlElement(name = "execution")
-    @JsonProperty("executions")
+    @JacksonXmlElementWrapper(localName = "executions")
+    @JacksonXmlProperty(localName = "execution")
     public List<ExecTO> getExecutions() {
         return executions;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ReportTemplateTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ReportTemplateTO.java
index 8a7d8e6..03aaa9e 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ReportTemplateTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/ReportTemplateTO.java
@@ -19,11 +19,7 @@
 package org.apache.syncope.common.lib.to;
 
 import javax.ws.rs.PathParam;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 
-@XmlRootElement(name = "reportTemplate")
-@XmlType
 public class ReportTemplateTO implements EntityTO {
 
     private static final long serialVersionUID = 7776679004906244896L;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/RoleTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/RoleTO.java
index 97a764f..3be4d55 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/RoleTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/RoleTO.java
@@ -18,21 +18,16 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import javax.ws.rs.PathParam;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 
-@XmlRootElement(name = "role")
-@XmlType
 public class RoleTO implements EntityTO {
 
     private static final long serialVersionUID = 4560822655754800031L;
@@ -60,23 +55,20 @@ public class RoleTO implements EntityTO {
         this.key = key;
     }
 
-    @XmlElementWrapper(name = "entitlements")
-    @XmlElement(name = "entitlement")
-    @JsonProperty("entitlements")
+    @JacksonXmlElementWrapper(localName = "entitlements")
+    @JacksonXmlProperty(localName = "entitlement")
     public Set<String> getEntitlements() {
         return entitlements;
     }
 
-    @XmlElementWrapper(name = "realms")
-    @XmlElement(name = "realm")
-    @JsonProperty("realms")
+    @JacksonXmlElementWrapper(localName = "realms")
+    @JacksonXmlProperty(localName = "realm")
     public List<String> getRealms() {
         return realms;
     }
 
-    @XmlElementWrapper(name = "dynRealms")
-    @XmlElement(name = "dynRealm")
-    @JsonProperty("dynRealms")
+    @JacksonXmlElementWrapper(localName = "dynRealms")
+    @JacksonXmlProperty(localName = "dynRealm")
     public List<String> getDynRealms() {
         return dynRealms;
     }
@@ -89,9 +81,8 @@ public class RoleTO implements EntityTO {
         this.dynMembershipCond = dynMembershipCond;
     }
 
-    @XmlElementWrapper(name = "privileges")
-    @XmlElement(name = "privilege")
-    @JsonProperty("privileges")
+    @JacksonXmlElementWrapper(localName = "privileges")
+    @JacksonXmlProperty(localName = "privilege")
     public Set<String> getPrivileges() {
         return privileges;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/SchedTaskTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/SchedTaskTO.java
index 3bb8162..75d7b40 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/SchedTaskTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/SchedTaskTO.java
@@ -19,22 +19,14 @@
 package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.Date;
 import java.util.Optional;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 
-@XmlRootElement(name = "schedTask")
-@XmlType
-@XmlSeeAlso({ ProvisioningTaskTO.class })
-@Schema(allOf = { TaskTO.class }, subTypes = { ProvisioningTaskTO.class }, discriminatorProperty = "@class")
+@Schema(allOf = { TaskTO.class }, subTypes = { ProvisioningTaskTO.class }, discriminatorProperty = "_class")
 public class SchedTaskTO extends TaskTO implements NamedEntityTO {
 
     private static final long serialVersionUID = -5722284116974636425L;
@@ -55,9 +47,9 @@ public class SchedTaskTO extends TaskTO implements NamedEntityTO {
 
     private boolean active = true;
 
-    @XmlTransient
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.to.SchedTaskTO")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.SchedTaskTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
@@ -119,7 +111,6 @@ public class SchedTaskTO extends TaskTO implements NamedEntityTO {
     }
 
     @JsonProperty(required = true)
-    @XmlElement(required = true)
     @Override
     public void setName(final String name) {
         this.name = name;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/SchemaTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/SchemaTO.java
index 2d5f752..ed102c7 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/SchemaTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/SchemaTO.java
@@ -22,42 +22,33 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
 import javax.ws.rs.PathParam;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
-
-@XmlRootElement(name = "schema")
-@XmlType
-@XmlSeeAlso({ PlainSchemaTO.class, DerSchemaTO.class, VirSchemaTO.class })
-@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "@class")
-@JsonPropertyOrder(value = { "@class", "key" })
-@Schema(subTypes = { PlainSchemaTO.class, DerSchemaTO.class, VirSchemaTO.class }, discriminatorProperty = "@class")
+
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "_class")
+@JsonPropertyOrder(value = { "_class", "key" })
+@Schema(subTypes = { PlainSchemaTO.class, DerSchemaTO.class, VirSchemaTO.class }, discriminatorProperty = "_class")
 public abstract class SchemaTO implements EntityTO {
 
     private static final long serialVersionUID = 4088388951694301759L;
 
-    @XmlTransient
-    @JsonProperty("@class")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
     private String discriminator;
 
     private String key;
 
     private String anyTypeClass;
 
-    @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
     private final Map<Locale, String> labels = new HashMap<>();
 
-    @Schema(name = "@class", required = true)
+    @Schema(name = "_class", required = true)
     public abstract String getDiscriminator();
 
     public void setDiscriminator(final String discriminator) {
@@ -88,7 +79,6 @@ public abstract class SchemaTO implements EntityTO {
         return labels.getOrDefault(locale, key);
     }
 
-    @JsonProperty
     public Map<Locale, String> getLabels() {
         return labels;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/SecurityQuestionTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/SecurityQuestionTO.java
index 9a6cf8b..7bc8c20 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/SecurityQuestionTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/SecurityQuestionTO.java
@@ -19,13 +19,9 @@
 package org.apache.syncope.common.lib.to;
 
 import javax.ws.rs.PathParam;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 
-@XmlRootElement(name = "securityQuestion")
-@XmlType
 public class SecurityQuestionTO implements EntityTO {
 
     private static final long serialVersionUID = 5969810939993556530L;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/TaskTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/TaskTO.java
index 6dd9d35..f10b0ca 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/TaskTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/TaskTO.java
@@ -21,33 +21,26 @@ package org.apache.syncope.common.lib.to;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.ArrayList;
 import java.util.List;
 import javax.ws.rs.PathParam;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 
-@XmlRootElement(name = "task")
-@XmlType
-@XmlSeeAlso({ PropagationTaskTO.class, ProvisioningTaskTO.class, NotificationTaskTO.class })
-@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "@class")
-@JsonPropertyOrder(value = { "@class", "key" })
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "_class")
+@JsonPropertyOrder(value = { "_class", "key" })
 @Schema(
         subTypes = { PropagationTaskTO.class, ProvisioningTaskTO.class, NotificationTaskTO.class },
-        discriminatorProperty = "@class")
+        discriminatorProperty = "_class")
 public abstract class TaskTO extends AbstractStartEndBean implements EntityTO {
 
     private static final long serialVersionUID = 386450127003321197L;
 
-    @XmlTransient
-    @JsonProperty("@class")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
     private String discriminator;
 
     private String key;
@@ -58,7 +51,7 @@ public abstract class TaskTO extends AbstractStartEndBean implements EntityTO {
 
     private final List<ExecTO> executions = new ArrayList<>();
 
-    @Schema(name = "@class", required = true)
+    @Schema(name = "_class", required = true)
     public abstract String getDiscriminator();
 
     public void setDiscriminator(final String discriminator) {
@@ -94,11 +87,10 @@ public abstract class TaskTO extends AbstractStartEndBean implements EntityTO {
     public void setLastExecutor(final String lastExecutor) {
         this.lastExecutor = lastExecutor;
     }
-    
+
     @Schema(accessMode = Schema.AccessMode.READ_ONLY)
-    @XmlElementWrapper(name = "executions")
-    @XmlElement(name = "execution")
-    @JsonProperty("executions")
+    @JacksonXmlElementWrapper(localName = "executions")
+    @JacksonXmlProperty(localName = "execution")
     public List<ExecTO> getExecutions() {
         return executions;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/TemplatableTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/TemplatableTO.java
index 2e77d1e..08e0850 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/TemplatableTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/TemplatableTO.java
@@ -18,11 +18,11 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import java.io.Serializable;
 import java.util.Map;
+import org.apache.syncope.common.lib.BaseBean;
 
 @FunctionalInterface
-public interface TemplatableTO extends Serializable {
+public interface TemplatableTO extends BaseBean {
 
     Map<String, AnyTO> getTemplates();
 }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/TypeExtensionTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/TypeExtensionTO.java
index 3707221..0f35fe1 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/TypeExtensionTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/TypeExtensionTO.java
@@ -18,20 +18,15 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.io.Serializable;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
 import java.util.List;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.syncope.common.lib.BaseBean;
 
-@XmlRootElement(name = "typeExtension")
-@XmlType
-public class TypeExtensionTO implements Serializable {
+public class TypeExtensionTO implements BaseBean {
 
     private static final long serialVersionUID = -5422809645030924811L;
 
@@ -47,9 +42,8 @@ public class TypeExtensionTO implements Serializable {
         this.anyType = anyType;
     }
 
-    @XmlElementWrapper(name = "auxClasses")
-    @XmlElement(name = "class")
-    @JsonProperty("auxClasses")
+    @JacksonXmlElementWrapper(localName = "auxClasses")
+    @JacksonXmlProperty(localName = "class")
     public List<String> getAuxClasses() {
         return auxClasses;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/UserTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/UserTO.java
index f7e823b..2711b80 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/UserTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/UserTO.java
@@ -20,6 +20,8 @@ package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.ArrayList;
 import java.util.Date;
@@ -27,16 +29,10 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
-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 org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 
-@XmlRootElement(name = "user")
-@XmlType
 @Schema(allOf = { AnyTO.class })
 public class UserTO extends AnyTO implements GroupableRelatableTO {
 
@@ -78,8 +74,9 @@ public class UserTO extends AnyTO implements GroupableRelatableTO {
 
     private final List<LinkedAccountTO> linkedAccounts = new ArrayList<>();
 
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.to.UserTO")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.UserTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
@@ -127,7 +124,6 @@ public class UserTO extends AnyTO implements GroupableRelatableTO {
     }
 
     @JsonProperty(required = true)
-    @XmlElement(required = true)
     public String getUsername() {
         return username;
     }
@@ -214,9 +210,8 @@ public class UserTO extends AnyTO implements GroupableRelatableTO {
                 findFirst();
     }
 
-    @XmlElementWrapper(name = "relationships")
-    @XmlElement(name = "relationship")
-    @JsonProperty("relationships")
+    @JacksonXmlElementWrapper(localName = "relationships")
+    @JacksonXmlProperty(localName = "relationship")
     @Override
     public List<RelationshipTO> getRelationships() {
         return relationships;
@@ -228,46 +223,40 @@ public class UserTO extends AnyTO implements GroupableRelatableTO {
         return memberships.stream().filter(membership -> groupKey.equals(membership.getGroupKey())).findFirst();
     }
 
-    @XmlElementWrapper(name = "memberships")
-    @XmlElement(name = "membership")
-    @JsonProperty("memberships")
+    @JacksonXmlElementWrapper(localName = "memberships")
+    @JacksonXmlProperty(localName = "membership")
     @Override
     public List<MembershipTO> getMemberships() {
         return memberships;
     }
 
-    @XmlElementWrapper(name = "dynMemberships")
-    @XmlElement(name = "dynMembership")
-    @JsonProperty("dynMemberships")
+    @JacksonXmlElementWrapper(localName = "dynMemberships")
+    @JacksonXmlProperty(localName = "dynMembership")
     @Override
     public List<MembershipTO> getDynMemberships() {
         return dynMemberships;
     }
 
-    @XmlElementWrapper(name = "roles")
-    @XmlElement(name = "role")
-    @JsonProperty("roles")
+    @JacksonXmlElementWrapper(localName = "roles")
+    @JacksonXmlProperty(localName = "role")
     public List<String> getRoles() {
         return roles;
     }
 
-    @XmlElementWrapper(name = "dynRoles")
-    @XmlElement(name = "role")
-    @JsonProperty("dynRoles")
+    @JacksonXmlElementWrapper(localName = "dynRoles")
+    @JacksonXmlProperty(localName = "dynRole")
     public List<String> getDynRoles() {
         return dynRoles;
     }
 
-    @XmlElementWrapper(name = "privileges")
-    @XmlElement(name = "privilege")
-    @JsonProperty("privileges")
+    @JacksonXmlElementWrapper(localName = "privileges")
+    @JacksonXmlProperty(localName = "privilege")
     public Set<String> getPrivileges() {
         return privileges;
     }
 
-    @XmlElementWrapper(name = "linkedAccounts")
-    @XmlElement(name = "linkedAccount")
-    @JsonProperty("linkedAccounts")
+    @JacksonXmlElementWrapper(localName = "linkedAccounts")
+    @JacksonXmlProperty(localName = "linkedAccount")
     public List<LinkedAccountTO> getLinkedAccounts() {
         return linkedAccounts;
     }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/VirSchemaTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/VirSchemaTO.java
index 7f6dac6..7150ff3 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/VirSchemaTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/VirSchemaTO.java
@@ -19,13 +19,11 @@
 package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 
-@XmlRootElement(name = "virSchema")
 @Schema(allOf = { SchemaTO.class })
 public class VirSchemaTO extends SchemaTO {
 
@@ -39,9 +37,9 @@ public class VirSchemaTO extends SchemaTO {
 
     private String extAttrName;
 
-    @XmlTransient
-    @JsonProperty("@class")
-    @Schema(name = "@class", required = true, example = "org.apache.syncope.common.lib.to.VirSchemaTO")
+    @JacksonXmlProperty(localName = "_class", isAttribute = true)
+    @JsonProperty("_class")
+    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.VirSchemaTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/package-info.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/package-info.java
deleted file mode 100644
index aff9f18..0000000
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/package-info.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-@XmlSchema(
-        namespace = SyncopeConstants.NS,
-        xmlns = { @XmlNs(prefix = SyncopeConstants.NS_PREFIX,
-                    namespaceURI = SyncopeConstants.NS) })
-@XmlJavaTypeAdapters({ @XmlJavaTypeAdapter(type = Date.class, value = DateAdapter.class), })
-package org.apache.syncope.common.lib.to;
-
-import java.util.Date;
-import javax.xml.bind.annotation.XmlNs;
-import javax.xml.bind.annotation.XmlSchema;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
-import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.jaxb.DateAdapter;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/AnyTypeKind.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/AnyTypeKind.java
index 9971f13..168ac49 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/AnyTypeKind.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/AnyTypeKind.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
 import org.apache.syncope.common.lib.request.AnyCR;
 import org.apache.syncope.common.lib.request.AnyObjectCR;
 import org.apache.syncope.common.lib.request.AnyObjectUR;
@@ -32,7 +31,6 @@ import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.UserTO;
 
-@XmlEnum
 public enum AnyTypeKind {
 
     USER(UserTO.class, UserCR.class, UserUR.class),
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/AttrSchemaType.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/AttrSchemaType.java
index be78979..b8e162d 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/AttrSchemaType.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/AttrSchemaType.java
@@ -19,9 +19,7 @@
 package org.apache.syncope.common.lib.types;
 
 import java.util.Date;
-import javax.xml.bind.annotation.XmlEnum;
 
-@XmlEnum
 public enum AttrSchemaType {
 
     String(String.class),
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/AuditElements.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/AuditElements.java
index e1116bd..d978bc7 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/AuditElements.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/AuditElements.java
@@ -18,10 +18,9 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import java.io.Serializable;
-import javax.xml.bind.annotation.XmlEnum;
+import org.apache.syncope.common.lib.BaseBean;
 
-public final class AuditElements implements Serializable {
+public final class AuditElements implements BaseBean {
 
     private static final long serialVersionUID = -4385059255522273254L;
 
@@ -29,7 +28,6 @@ public final class AuditElements implements Serializable {
 
     public static final String LOGIN_EVENT = "login";
 
-    @XmlEnum
     public enum EventCategoryType {
 
         LOGIC("LOGIC"),
@@ -52,7 +50,6 @@ public final class AuditElements implements Serializable {
         }
     }
 
-    @XmlEnum
     public enum Result {
 
         SUCCESS,
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/AuditLoggerName.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/AuditLoggerName.java
index 1c2a05a..4298ead 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/AuditLoggerName.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/AuditLoggerName.java
@@ -20,20 +20,19 @@ package org.apache.syncope.common.lib.types;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import java.io.Serializable;
 import java.text.ParseException;
 import java.util.Map;
 import java.util.Optional;
-
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.commons.lang3.tuple.Pair;
+import org.apache.syncope.common.lib.BaseBean;
 import org.apache.syncope.common.lib.log.EventCategory;
 import org.apache.syncope.common.lib.types.AuditElements.EventCategoryType;
 import org.apache.syncope.common.lib.types.AuditElements.Result;
 
-public class AuditLoggerName implements Serializable {
+public class AuditLoggerName implements BaseBean {
 
     private static final long serialVersionUID = -647989486671786839L;
 
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/CipherAlgorithm.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/CipherAlgorithm.java
index 6f88e65..f03ca78 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/CipherAlgorithm.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/CipherAlgorithm.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum CipherAlgorithm {
 
     SHA("SHA-1", false),
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ConflictResolutionAction.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ConflictResolutionAction.java
index 2064e91..59ed582 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ConflictResolutionAction.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ConflictResolutionAction.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum ConflictResolutionAction {
 
     /**
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/EntityViolationType.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/EntityViolationType.java
index 462ee5f..7dc9345 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/EntityViolationType.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/EntityViolationType.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum EntityViolationType {
 
     Standard(""),
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ExecStatus.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ExecStatus.java
index 8b25c5e..2319ff1 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ExecStatus.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ExecStatus.java
@@ -19,12 +19,10 @@
 package org.apache.syncope.common.lib.types;
 
 import javax.ws.rs.core.Response;
-import javax.xml.bind.annotation.XmlEnum;
 
 /**
  * Status of some execution.
  */
-@XmlEnum
 public enum ExecStatus {
 
     CREATED(Response.Status.CREATED.getStatusCode()),
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ImplementationEngine.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ImplementationEngine.java
index 36baddd..15b4443 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ImplementationEngine.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ImplementationEngine.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum ImplementationEngine {
 
     JAVA("application/java"),
@@ -35,5 +32,4 @@ public enum ImplementationEngine {
     public String getMimeType() {
         return mimeType;
     }
-
 }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/JobAction.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/JobAction.java
index dbf000b..36911fc 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/JobAction.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/JobAction.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum JobAction {
 
     START,
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/JobType.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/JobType.java
index bc2657a..8ab73e3 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/JobType.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/JobType.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum JobType {
     NOTIFICATION,
     REPORT,
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/LoggerLevel.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/LoggerLevel.java
index 01f7d2e..dd54348 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/LoggerLevel.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/LoggerLevel.java
@@ -18,10 +18,8 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
 import org.apache.logging.log4j.Level;
 
-@XmlEnum
 public enum LoggerLevel {
 
     OFF(Level.OFF),
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/LoggerType.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/LoggerType.java
index f129a7d..c696d6e 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/LoggerType.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/LoggerType.java
@@ -18,10 +18,8 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
 import org.apache.commons.lang3.StringUtils;
 
-@XmlEnum
 public enum LoggerType {
 
     /**
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/MailTemplateFormat.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/MailTemplateFormat.java
index fdf8429..5f29484 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/MailTemplateFormat.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/MailTemplateFormat.java
@@ -19,9 +19,7 @@
 package org.apache.syncope.common.lib.types;
 
 import javax.ws.rs.core.MediaType;
-import javax.xml.bind.annotation.XmlEnum;
 
-@XmlEnum
 public enum MailTemplateFormat {
 
     HTML(MediaType.TEXT_HTML_TYPE),
@@ -36,5 +34,4 @@ public enum MailTemplateFormat {
     public MediaType getMediaType() {
         return mediaType;
     }
-
 }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/MatchType.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/MatchType.java
index 0885aac..1eace45 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/MatchType.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/MatchType.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum MatchType {
     ANY,
     LINKED_ACCOUNT;
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/MatchingRule.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/MatchingRule.java
index e7ec427..f0bfa58 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/MatchingRule.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/MatchingRule.java
@@ -18,12 +18,9 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
 /**
- * Sync/Push task matching rule.
+ * Pull/Push task matching rule.
  */
-@XmlEnum
 public enum MatchingRule {
 
     /**
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/PatchOperation.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/PatchOperation.java
index 9872cbf..19c7752 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/PatchOperation.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/PatchOperation.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum PatchOperation {
 
     ADD_REPLACE,
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/PolicyType.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/PolicyType.java
index 44b2667..3272e79 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/PolicyType.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/PolicyType.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum PolicyType {
 
     /**
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ProvisionAction.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ProvisionAction.java
index 1644bce..f1120ce 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ProvisionAction.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ProvisionAction.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum ProvisionAction {
 
     PROVISION,
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/PullMode.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/PullMode.java
index 522c30d..26933f9 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/PullMode.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/PullMode.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum PullMode {
     FULL_RECONCILIATION,
     FILTERED_RECONCILIATION,
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ReportExecExportFormat.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ReportExecExportFormat.java
index fdac43d..9b95af2 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ReportExecExportFormat.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ReportExecExportFormat.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum ReportExecExportFormat {
 
     XML,
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ReportExecStatus.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ReportExecStatus.java
index 6421086..2cbece1 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ReportExecStatus.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ReportExecStatus.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum ReportExecStatus {
 
     STARTED,
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ReportTemplateFormat.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ReportTemplateFormat.java
index 17ebf91..cd91e07 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ReportTemplateFormat.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ReportTemplateFormat.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum ReportTemplateFormat {
 
     FO,
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ResourceAssociationAction.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ResourceAssociationAction.java
index efbe0ef..f17b6ec 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ResourceAssociationAction.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ResourceAssociationAction.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum ResourceAssociationAction {
 
     /**
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ResourceDeassociationAction.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ResourceDeassociationAction.java
index c8d78ec..cabedcf 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ResourceDeassociationAction.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ResourceDeassociationAction.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum ResourceDeassociationAction {
 
     /**
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ResourceOperation.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ResourceOperation.java
index b399b17..dee3d71 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ResourceOperation.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ResourceOperation.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum ResourceOperation {
 
     CREATE,
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/SchemaType.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/SchemaType.java
index 82f17ee..3f75868 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/SchemaType.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/SchemaType.java
@@ -18,13 +18,11 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
 import org.apache.syncope.common.lib.to.SchemaTO;
 import org.apache.syncope.common.lib.to.DerSchemaTO;
 import org.apache.syncope.common.lib.to.PlainSchemaTO;
 import org.apache.syncope.common.lib.to.VirSchemaTO;
 
-@XmlEnum
 public enum SchemaType {
 
     /**
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/StatusRType.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/StatusRType.java
index 1731ec7..3c7b2d9 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/StatusRType.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/StatusRType.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum StatusRType {
 
     ACTIVATE,
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/TaskType.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/TaskType.java
index 0d444f2..97d79df 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/TaskType.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/TaskType.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
 import org.apache.syncope.common.lib.to.NotificationTaskTO;
 import org.apache.syncope.common.lib.to.PropagationTaskTO;
 import org.apache.syncope.common.lib.to.PullTaskTO;
@@ -26,7 +25,6 @@ import org.apache.syncope.common.lib.to.PushTaskTO;
 import org.apache.syncope.common.lib.to.SchedTaskTO;
 import org.apache.syncope.common.lib.to.TaskTO;
 
-@XmlEnum
 public enum TaskType {
 
     PROPAGATION(PropagationTaskTO.class),
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/TraceLevel.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/TraceLevel.java
index e8232b8..2de1500 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/TraceLevel.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/TraceLevel.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
 public enum TraceLevel {
 
     /**
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/UnmatchingRule.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/UnmatchingRule.java
index 838f9af..f286812 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/UnmatchingRule.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/UnmatchingRule.java
@@ -18,12 +18,9 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import javax.xml.bind.annotation.XmlEnum;
-
 /**
  * Pull/Push task un-matching rule.
  */
-@XmlEnum
 public enum UnmatchingRule {
 
     /**
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/package-info.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/package-info.java
deleted file mode 100644
index 2a43129..0000000
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/package-info.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-@XmlSchema(
-        namespace = SyncopeConstants.NS,
-        xmlns = { @XmlNs(prefix = SyncopeConstants.NS_PREFIX,
-                    namespaceURI = SyncopeConstants.NS) })
-@XmlJavaTypeAdapters({ @XmlJavaTypeAdapter(type = Date.class, value = DateAdapter.class), })
-package org.apache.syncope.common.lib.types;
-
-import java.util.Date;
-import javax.xml.bind.annotation.XmlNs;
-import javax.xml.bind.annotation.XmlSchema;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
-import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.jaxb.DateAdapter;
diff --git a/common/idrepo/lib/src/test/java/org/apache/syncope/common/lib/JAXBTest.java b/common/idrepo/lib/src/test/java/org/apache/syncope/common/lib/JAXBTest.java
deleted file mode 100644
index cc6aa4f..0000000
--- a/common/idrepo/lib/src/test/java/org/apache/syncope/common/lib/JAXBTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.common.lib;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
-
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.util.Calendar;
-import java.util.Date;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.Unmarshaller;
-import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.apache.syncope.common.lib.info.NumbersInfo;
-import org.apache.syncope.common.lib.request.UserUR;
-import org.apache.syncope.common.lib.report.UserReportletConf;
-import org.apache.syncope.common.lib.to.ExecTO;
-import org.apache.syncope.common.lib.to.UserTO;
-import org.junit.jupiter.api.Test;
-
-public class JAXBTest {
-
-    @Test
-    public void marshal() {
-        try {
-            JAXBContext context = JAXBContext.newInstance(UserTO.class, UserUR.class, UserReportletConf.class);
-            Marshaller marshaller = context.createMarshaller();
-            marshaller.marshal(new UserTO(), new StringWriter());
-            marshaller.marshal(new UserUR(), new StringWriter());
-        } catch (JAXBException e) {
-            fail(() -> ExceptionUtils.getStackTrace(e));
-        }
-    }
-
-    @Test
-    public void numbersInfo() throws JAXBException {
-        JAXBContext context = JAXBContext.newInstance(NumbersInfo.class);
-        Marshaller marshaller = context.createMarshaller();
-        Unmarshaller unmarshaller = context.createUnmarshaller();
-
-        NumbersInfo original = new NumbersInfo();
-        original.setTotalUsers(5);
-        original.getUsersByRealm().put("/", 4);
-        original.getUsersByRealm().put("/even", 1);
-        original.getUsersByStatus().put("active", 5);
-        original.setTotalGroups(16);
-        original.getGroupsByRealm().put("/", 14);
-        original.getGroupsByRealm().put("/even", 1);
-        original.getGroupsByRealm().put("/odd", 1);
-        original.setAnyType1("PRINTER");
-        original.setTotalAny1(3);
-        original.getAny1ByRealm().put("/", 2);
-        original.getAny1ByRealm().put("/even/two", 1);
-        original.setTotalResources(21);
-        original.setTotalRoles(4);
-        original.getConfCompleteness().put(NumbersInfo.ConfItem.ANY_TYPE.name(), Boolean.TRUE);
-        original.getConfCompleteness().put(NumbersInfo.ConfItem.PULL_TASK.name(), Boolean.TRUE);
-        original.getConfCompleteness().put(NumbersInfo.ConfItem.ROLE.name(), Boolean.TRUE);
-        original.getConfCompleteness().put(NumbersInfo.ConfItem.NOTIFICATION.name(), Boolean.TRUE);
-        original.getConfCompleteness().put(NumbersInfo.ConfItem.PASSWORD_POLICY.name(), Boolean.TRUE);
-        original.getConfCompleteness().put(NumbersInfo.ConfItem.ACCOUNT_POLICY.name(), Boolean.TRUE);
-        original.getConfCompleteness().put(NumbersInfo.ConfItem.RESOURCE.name(), Boolean.TRUE);
-        original.getConfCompleteness().put(NumbersInfo.ConfItem.VIR_SCHEMA.name(), Boolean.TRUE);
-        original.getConfCompleteness().put(NumbersInfo.ConfItem.SECURITY_QUESTION.name(), Boolean.TRUE);
-
-        StringWriter writer = new StringWriter();
-        marshaller.marshal(original, writer);
-
-        Object actual = unmarshaller.unmarshal(new StringReader(writer.toString()));
-        assertEquals(original, actual);
-    }
-
-    @Test
-    public void issueSYNCOPE1541() throws JAXBException {
-        JAXBContext context = JAXBContext.newInstance(ExecTO.class);
-        Marshaller marshaller = context.createMarshaller();
-
-        Calendar cal = Calendar.getInstance();
-        cal.setTime(new Date());
-        cal.set(Calendar.MILLISECOND, 0);
-
-        ExecTO exec = new ExecTO();
-        exec.setStart(cal.getTime());
-
-        StringWriter writer = new StringWriter();
-        marshaller.marshal(exec, writer);
-
-        assertTrue(writer.toString().contains(".000"));
-    }
-}
diff --git a/common/idrepo/lib/src/test/java/org/apache/syncope/common/lib/JSONTest.java b/common/idrepo/lib/src/test/java/org/apache/syncope/common/lib/JSONTest.java
index 37d3a55..14d547d 100644
--- a/common/idrepo/lib/src/test/java/org/apache/syncope/common/lib/JSONTest.java
+++ b/common/idrepo/lib/src/test/java/org/apache/syncope/common/lib/JSONTest.java
@@ -18,58 +18,14 @@
  */
 package org.apache.syncope.common.lib;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-
 import com.fasterxml.jackson.databind.ObjectMapper;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.util.UUID;
-import org.apache.syncope.common.lib.request.GroupUR;
-import org.apache.syncope.common.lib.request.PasswordPatch;
-import org.apache.syncope.common.lib.request.StringPatchItem;
-import org.apache.syncope.common.lib.request.StringReplacePatchItem;
-import org.apache.syncope.common.lib.request.UserUR;
-import org.apache.syncope.common.lib.types.PatchOperation;
-import org.junit.jupiter.api.Test;
-
-public class JSONTest {
-
-    @Test
-    public void map() throws IOException {
-        GroupUR prop = new GroupUR();
-        prop.getADynMembershipConds().put("key1", "value1");
-        prop.getADynMembershipConds().put("key2", "value2");
-
-        ObjectMapper mapper = new ObjectMapper();
-
-        StringWriter writer = new StringWriter();
-        mapper.writeValue(writer, prop);
-
-        GroupUR unserializedProp = mapper.readValue(writer.toString(), GroupUR.class);
-        assertEquals(prop, unserializedProp);
-    }
-
-    @Test
-    public void patch() throws IOException {
-        UserUR req = new UserUR();
-        req.setKey(UUID.randomUUID().toString());
-        req.setUsername(new StringReplacePatchItem.Builder().value("newusername").build());
-        assertNotNull(req.getUsername().getValue());
-        req.setPassword(new PasswordPatch.Builder().
-                onSyncope(false).
-                resource("ext1").resource("ext2").
-                value("newpassword").
-                build());
-        assertNotNull(req.getPassword().getValue());
-        req.getRoles().add(new StringPatchItem.Builder().operation(PatchOperation.DELETE).value("role").build());
 
-        ObjectMapper mapper = new ObjectMapper();
+public class JSONTest extends SerializationTest {
 
-        StringWriter writer = new StringWriter();
-        mapper.writeValue(writer, req);
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
 
-        UserUR actual = mapper.readValue(writer.toString(), UserUR.class);
-        assertEquals(req, actual);
+    @Override
+    protected ObjectMapper objectMapper() {
+        return OBJECT_MAPPER;
     }
 }
diff --git a/common/idrepo/lib/src/test/java/org/apache/syncope/common/lib/SerializationTest.java b/common/idrepo/lib/src/test/java/org/apache/syncope/common/lib/SerializationTest.java
new file mode 100644
index 0000000..09db8ab
--- /dev/null
+++ b/common/idrepo/lib/src/test/java/org/apache/syncope/common/lib/SerializationTest.java
@@ -0,0 +1,127 @@
+/*
+ * 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.syncope.common.lib;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.UUID;
+import org.apache.syncope.common.lib.request.GroupUR;
+import org.apache.syncope.common.lib.request.PasswordPatch;
+import org.apache.syncope.common.lib.request.StringPatchItem;
+import org.apache.syncope.common.lib.request.StringReplacePatchItem;
+import org.apache.syncope.common.lib.request.UserUR;
+import org.apache.syncope.common.lib.to.ConnObjectTO;
+import org.apache.syncope.common.lib.to.GroupTO;
+import org.apache.syncope.common.lib.to.PagedResult;
+import org.apache.syncope.common.lib.to.PropagationStatus;
+import org.apache.syncope.common.lib.to.ProvisioningResult;
+import org.apache.syncope.common.lib.types.PatchOperation;
+import org.junit.jupiter.api.Test;
+
+public abstract class SerializationTest {
+
+    protected abstract ObjectMapper objectMapper();
+
+    @Test
+    public void map() throws IOException {
+        GroupUR req = new GroupUR();
+        req.setKey(UUID.randomUUID().toString());
+        req.getADynMembershipConds().put("key1", "value1");
+        req.getADynMembershipConds().put("key2", "value2");
+
+        StringWriter writer = new StringWriter();
+        objectMapper().writeValue(writer, req);
+
+        GroupUR actual = objectMapper().readValue(writer.toString(), GroupUR.class);
+        assertEquals(req, actual);
+    }
+
+    @Test
+    public void patch() throws IOException {
+        UserUR req = new UserUR();
+        req.setKey(UUID.randomUUID().toString());
+        req.setUsername(new StringReplacePatchItem.Builder().value("newusername").build());
+        assertNotNull(req.getUsername().getValue());
+        req.setPassword(new PasswordPatch.Builder().
+                onSyncope(false).
+                resource("ext1").resource("ext2").
+                value("newpassword").
+                build());
+        assertNotNull(req.getPassword().getValue());
+        req.getRoles().add(new StringPatchItem.Builder().operation(PatchOperation.DELETE).value("role").build());
+
+        StringWriter writer = new StringWriter();
+        objectMapper().writeValue(writer, req);
+
+        UserUR actual = objectMapper().readValue(writer.toString(), UserUR.class);
+        assertEquals(req, actual);
+    }
+
+    @Test
+    public void pagedResult() throws IOException {
+        GroupTO group = new GroupTO();
+        group.setName(UUID.randomUUID().toString());
+        group.setRealm(SyncopeConstants.ROOT_REALM);
+        group.getPlainAttrs().add(new Attr.Builder("style").value("cool").value("great").build());
+        group.getADynMembershipConds().put("USER", "username==a*");
+
+        PagedResult<GroupTO> original = new PagedResult<>();
+        original.getResult().add(group);
+        original.setSize(1);
+        original.setTotalCount(1);
+
+        StringWriter writer = new StringWriter();
+        objectMapper().writeValue(writer, original);
+
+        PagedResult<GroupTO> actual = objectMapper().readValue(writer.toString(),
+                new TypeReference<PagedResult<GroupTO>>() {
+        });
+        assertEquals(original, actual);
+    }
+
+    @Test
+    public void provisioningResult() throws IOException {
+        GroupTO group = new GroupTO();
+        group.setName(UUID.randomUUID().toString());
+        group.setRealm(SyncopeConstants.ROOT_REALM);
+        group.getVirAttrs().add(new Attr.Builder("rvirtualdata").value("rvirtualvalue").build());
+        group.getADynMembershipConds().put("USER", "username==a*");
+
+        ProvisioningResult<GroupTO> original = new ProvisioningResult<>();
+        original.setEntity(group);
+
+        PropagationStatus status = new PropagationStatus();
+        status.setFailureReason("failed");
+        status.setBeforeObj(new ConnObjectTO());
+        original.getPropagationStatuses().add(status);
+
+        StringWriter writer = new StringWriter();
+        objectMapper().writeValue(writer, original);
+
+        ProvisioningResult<GroupTO> actual = objectMapper().readValue(writer.toString(),
+                new TypeReference<ProvisioningResult<GroupTO>>() {
+        });
+        assertEquals(original, actual);
+    }
+}
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AccessPolicyConf.java b/common/idrepo/lib/src/test/java/org/apache/syncope/common/lib/XMLTest.java
similarity index 50%
copy from common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AccessPolicyConf.java
copy to common/idrepo/lib/src/test/java/org/apache/syncope/common/lib/XMLTest.java
index 9587418..25f2a2a 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AccessPolicyConf.java
+++ b/common/idrepo/lib/src/test/java/org/apache/syncope/common/lib/XMLTest.java
@@ -16,26 +16,29 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.syncope.common.lib.policy;
+package org.apache.syncope.common.lib;
 
-import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonSetter;
+import com.fasterxml.jackson.annotation.Nulls;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.xml.XmlMapper;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
-public interface AccessPolicyConf extends Serializable {
+public class XMLTest extends SerializationTest {
 
-    /**
-     * Give name of related access policy.
-     *
-     * @return name of this access policy
-     */
-    String getName();
+    private static final XmlMapper XML_MAPPER;
 
-    boolean isEnabled();
+    static {
+        XML_MAPPER = new XmlMapper();
+        XML_MAPPER.configOverride(List.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY));
+        XML_MAPPER.configOverride(Set.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY));
+        XML_MAPPER.configOverride(Map.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY));
+    }
 
-    boolean isSsoEnabled();
-
-    Map<String, Set<String>> getRequiredAttrs();
+    @Override
+    protected ObjectMapper objectMapper() {
+        return XML_MAPPER;
+    }
 }
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/LogAppender.java b/common/idrepo/lib/src/test/java/org/apache/syncope/common/lib/YAMLTest.java
similarity index 69%
copy from common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/LogAppender.java
copy to common/idrepo/lib/src/test/java/org/apache/syncope/common/lib/YAMLTest.java
index 85c3d28..5ff4900 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/log/LogAppender.java
+++ b/common/idrepo/lib/src/test/java/org/apache/syncope/common/lib/YAMLTest.java
@@ -16,21 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.syncope.common.lib.log;
+package org.apache.syncope.common.lib;
 
-import java.io.Serializable;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
 
-public class LogAppender implements Serializable {
+public class YAMLTest extends SerializationTest {
 
-    private static final long serialVersionUID = 5975199884460548302L;
+    private static final YAMLMapper YAML_MAPPER = new YAMLMapper();
 
-    private String name;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(final String name) {
-        this.name = name;
+    @Override
+    protected ObjectMapper objectMapper() {
+        return YAML_MAPPER;
     }
 }
diff --git a/core/am/logic/src/main/java/org/apache/syncope/core/logic/GoogleMfaAuthTokenLogic.java b/core/am/logic/src/main/java/org/apache/syncope/core/logic/GoogleMfaAuthTokenLogic.java
index 84b10b4..7599c8d 100644
--- a/core/am/logic/src/main/java/org/apache/syncope/core/logic/GoogleMfaAuthTokenLogic.java
+++ b/core/am/logic/src/main/java/org/apache/syncope/core/logic/GoogleMfaAuthTokenLogic.java
@@ -16,9 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 package org.apache.syncope.core.logic;
 
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+import java.util.function.Predicate;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.syncope.common.lib.to.AuthProfileTO;
 import org.apache.syncope.common.lib.types.AMEntitlement;
@@ -34,15 +39,9 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.UUID;
-import java.util.function.Predicate;
-
 @Component
 public class GoogleMfaAuthTokenLogic extends AbstractTransactionalLogic<AuthProfileTO> {
+
     @Autowired
     private AuthProfileDAO authProfileDAO;
 
@@ -53,24 +52,24 @@ public class GoogleMfaAuthTokenLogic extends AbstractTransactionalLogic<AuthProf
     private AuthProfileDataBinder authProfileDataBinder;
 
     @PreAuthorize("hasRole('" + AMEntitlement.GOOGLE_MFA_DELETE_TOKEN + "') "
-        + "or hasRole('" + IdRepoEntitlement.ANONYMOUS + "')")
+            + "or hasRole('" + IdRepoEntitlement.ANONYMOUS + "')")
     public void delete(final Date expirationDate) {
         authProfileDAO.
-            findAll().
-            forEach(profile -> removeTokenAndSave(profile,
+                findAll().
+                forEach(profile -> removeTokenAndSave(profile,
                 token -> token.getIssueDate().compareTo(expirationDate) >= 0));
     }
 
     @PreAuthorize("hasRole('" + AMEntitlement.GOOGLE_MFA_DELETE_TOKEN + "') "
-        + "or hasRole('" + IdRepoEntitlement.ANONYMOUS + "')")
+            + "or hasRole('" + IdRepoEntitlement.ANONYMOUS + "')")
     public void delete(final String owner, final Integer otp) {
         authProfileDAO.findByOwner(owner).
-            ifPresent(profile -> removeTokenAndSave(profile,
+                ifPresent(profile -> removeTokenAndSave(profile,
                 token -> token.getToken().equals(otp)));
     }
 
     @PreAuthorize("hasRole('" + AMEntitlement.GOOGLE_MFA_DELETE_TOKEN + "') "
-        + "or hasRole('" + IdRepoEntitlement.ANONYMOUS + "')")
+            + "or hasRole('" + IdRepoEntitlement.ANONYMOUS + "')")
     public void delete(final String owner) {
         authProfileDAO.findByOwner(owner).ifPresent(profile -> {
             profile.setGoogleMfaAuthTokens(List.of());
@@ -79,32 +78,32 @@ public class GoogleMfaAuthTokenLogic extends AbstractTransactionalLogic<AuthProf
     }
 
     @PreAuthorize("hasRole('" + AMEntitlement.GOOGLE_MFA_DELETE_TOKEN + "') "
-        + "or hasRole('" + IdRepoEntitlement.ANONYMOUS + "')")
+            + "or hasRole('" + IdRepoEntitlement.ANONYMOUS + "')")
     public void delete(final Integer otp) {
         authProfileDAO.findAll().
-            forEach(profile -> removeTokenAndSave(profile,
+                forEach(profile -> removeTokenAndSave(profile,
                 token -> token.getToken().equals(otp)));
     }
 
     @PreAuthorize("hasRole('" + AMEntitlement.GOOGLE_MFA_DELETE_TOKEN + "') "
-        + "or hasRole('" + IdRepoEntitlement.ANONYMOUS + "')")
+            + "or hasRole('" + IdRepoEntitlement.ANONYMOUS + "')")
     public void deleteAll() {
         authProfileDAO.findAll().
-            forEach(profile -> {
-                profile.setGoogleMfaAuthTokens(List.of());
-                authProfileDAO.save(profile);
-            });
+                forEach(profile -> {
+                    profile.setGoogleMfaAuthTokens(List.of());
+                    authProfileDAO.save(profile);
+                });
     }
 
     @PreAuthorize("hasRole('" + AMEntitlement.GOOGLE_MFA_SAVE_TOKEN + "') "
-        + "or hasRole('" + IdRepoEntitlement.ANONYMOUS + "')")
+            + "or hasRole('" + IdRepoEntitlement.ANONYMOUS + "')")
     public GoogleMfaAuthToken save(final GoogleMfaAuthToken token) {
         AuthProfile profile = authProfileDAO.findByOwner(token.getOwner()).
-            orElseGet(() -> {
-                final AuthProfile authProfile = entityFactory.newEntity(AuthProfile.class);
-                authProfile.setOwner(token.getOwner());
-                return authProfile;
-            });
+                orElseGet(() -> {
+                    final AuthProfile authProfile = entityFactory.newEntity(AuthProfile.class);
+                    authProfile.setOwner(token.getOwner());
+                    return authProfile;
+                });
 
         if (token.getKey() == null) {
             token.setKey(UUID.randomUUID().toString());
@@ -112,66 +111,56 @@ public class GoogleMfaAuthTokenLogic extends AbstractTransactionalLogic<AuthProf
         profile.add(token);
         profile = authProfileDAO.save(profile);
         return profile.getGoogleMfaAuthTokens().
-            stream().
-            filter(t -> t.getToken().equals(token.getToken())).
-            findFirst().
-            orElse(null);
+                stream().
+                filter(t -> t.getToken().equals(token.getToken())).
+                findFirst().
+                orElse(null);
 
     }
 
     @PreAuthorize("hasRole('" + AMEntitlement.GOOGLE_MFA_READ_TOKEN + "') "
-        + "or hasRole('" + IdRepoEntitlement.ANONYMOUS + "')")
+            + "or hasRole('" + IdRepoEntitlement.ANONYMOUS + "')")
     @Transactional(readOnly = true)
     public GoogleMfaAuthToken read(final String owner, final Integer otp) {
         return authProfileDAO.findByOwner(owner).
-            stream().
-            map(AuthProfile::getGoogleMfaAuthTokens).
-            flatMap(List::stream).
-            filter(token -> token.getToken().equals(otp)).
-            findFirst().
-            orElseThrow(() -> new NotFoundException("Could not find token for Owner " + owner + " and otp " + otp));
+                stream().
+                map(AuthProfile::getGoogleMfaAuthTokens).
+                flatMap(List::stream).
+                filter(token -> token.getToken().equals(otp)).
+                findFirst().
+                orElseThrow(() -> new NotFoundException("Could not find token for Owner " + owner + " and otp " + otp));
     }
 
     @PreAuthorize("hasRole('" + AMEntitlement.GOOGLE_MFA_READ_TOKEN + "') "
-        + "or hasRole('" + IdRepoEntitlement.ANONYMOUS + "')")
+            + "or hasRole('" + IdRepoEntitlement.ANONYMOUS + "')")
     @Transactional(readOnly = true)
     public GoogleMfaAuthToken read(final String key) {
         return authProfileDAO.findAll().
-            stream().
-            map(AuthProfile::getGoogleMfaAuthTokens).
-            flatMap(List::stream).
-            filter(token -> token.getKey().equals(key)).
-            findFirst().
-            orElse(null);
-    }
-
-    @PreAuthorize("hasRole('" + AMEntitlement.GOOGLE_MFA_COUNT_TOKEN + "') "
-        + "or hasRole('" + IdRepoEntitlement.ANONYMOUS + "')")
-    @Transactional(readOnly = true)
-    public long countTokensFor(final String owner) {
-        return authProfileDAO.findByOwner(owner).
-            stream().
-            mapToLong(profile -> profile.getGoogleMfaAuthTokens().size()).
-            sum();
+                stream().
+                map(AuthProfile::getGoogleMfaAuthTokens).
+                flatMap(List::stream).
+                filter(token -> token.getKey().equals(key)).
+                findFirst().
+                orElse(null);
     }
 
     @PreAuthorize("hasRole('" + AMEntitlement.GOOGLE_MFA_COUNT_TOKEN + "') "
-        + "or hasRole('" + IdRepoEntitlement.ANONYMOUS + "')")
+            + "or hasRole('" + IdRepoEntitlement.ANONYMOUS + "')")
     @Transactional(readOnly = true)
-    public long countAll() {
+    public int countAll() {
         return authProfileDAO.findAll().
-            stream().
-            mapToLong(profile -> profile.getGoogleMfaAuthTokens().size()).
-            sum();
+                stream().
+                mapToInt(profile -> profile.getGoogleMfaAuthTokens().size()).
+                sum();
     }
 
     @PreAuthorize("hasRole('" + AMEntitlement.GOOGLE_MFA_READ_TOKEN + "') "
-        + "or hasRole('" + IdRepoEntitlement.ANONYMOUS + "')")
+            + "or hasRole('" + IdRepoEntitlement.ANONYMOUS + "')")
     @Transactional(readOnly = true)
     public List<GoogleMfaAuthToken> findTokensFor(final String owner) {
         return authProfileDAO.findByOwner(owner).
-            map(profile -> new ArrayList<>(profile.getGoogleMfaAuthTokens())).
-            orElse(new ArrayList<>(0));
+                map(profile -> new ArrayList<>(profile.getGoogleMfaAuthTokens())).
+                orElse(new ArrayList<>(0));
     }
 
     private void removeTokenAndSave(final AuthProfile profile, final Predicate<GoogleMfaAuthToken> criteria) {
@@ -185,7 +174,7 @@ public class GoogleMfaAuthTokenLogic extends AbstractTransactionalLogic<AuthProf
 
     @Override
     protected AuthProfileTO resolveReference(final Method method, final Object... args)
-        throws UnresolvedReferenceException {
+            throws UnresolvedReferenceException {
         String key = null;
         if (ArrayUtils.isNotEmpty(args)) {
             for (int i = 0; key == null && i < args.length; i++) {
@@ -200,8 +189,8 @@ public class GoogleMfaAuthTokenLogic extends AbstractTransactionalLogic<AuthProf
         if (key != null) {
             try {
                 return authProfileDAO.findByKey(key).
-                    map(authProfileDataBinder::getAuthProfileTO).
-                    orElseThrow();
+                        map(authProfileDataBinder::getAuthProfileTO).
+                        orElseThrow();
             } catch (Throwable ignore) {
                 LOG.debug("Unresolved reference", ignore);
                 throw new UnresolvedReferenceException(ignore);
diff --git a/core/am/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/wa/GoogleMfaAuthTokenServiceImpl.java b/core/am/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/wa/GoogleMfaAuthTokenServiceImpl.java
index 96a0411..90ef78f 100644
--- a/core/am/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/wa/GoogleMfaAuthTokenServiceImpl.java
+++ b/core/am/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/wa/GoogleMfaAuthTokenServiceImpl.java
@@ -16,9 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 package org.apache.syncope.core.rest.cxf.service.wa;
 
+import java.net.URI;
+import java.util.Date;
+import java.util.List;
+import javax.ws.rs.core.Response;
+import org.apache.syncope.common.lib.to.PagedResult;
 import org.apache.syncope.common.lib.types.GoogleMfaAuthToken;
 import org.apache.syncope.common.rest.api.RESTHeaders;
 import org.apache.syncope.common.rest.api.service.wa.GoogleMfaAuthTokenService;
@@ -27,14 +31,9 @@ import org.apache.syncope.core.rest.cxf.service.AbstractServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import javax.ws.rs.core.Response;
-
-import java.net.URI;
-import java.util.Date;
-import java.util.List;
-
 @Service
 public class GoogleMfaAuthTokenServiceImpl extends AbstractServiceImpl implements GoogleMfaAuthTokenService {
+
     @Autowired
     private GoogleMfaAuthTokenLogic logic;
 
@@ -73,8 +72,8 @@ public class GoogleMfaAuthTokenServiceImpl extends AbstractServiceImpl implement
         final GoogleMfaAuthToken token = logic.save(tokenTO);
         URI location = uriInfo.getAbsolutePathBuilder().path(token.getKey()).build();
         return Response.created(location).
-            header(RESTHeaders.RESOURCE_KEY, token.getKey()).
-            build();
+                header(RESTHeaders.RESOURCE_KEY, token.getKey()).
+                build();
     }
 
     @Override
@@ -83,8 +82,17 @@ public class GoogleMfaAuthTokenServiceImpl extends AbstractServiceImpl implement
     }
 
     @Override
-    public List<GoogleMfaAuthToken> findTokensFor(final String owner) {
-        return logic.findTokensFor(owner);
+    public PagedResult<GoogleMfaAuthToken> findTokensFor(final String owner) {
+        List<GoogleMfaAuthToken> tokens = logic.findTokensFor(owner);
+
+        PagedResult<GoogleMfaAuthToken> result = new PagedResult<>();
+        result.getResult().addAll(tokens);
+
+        result.setPage(1);
+        result.setSize(result.getResult().size());
+        result.setTotalCount(result.getSize());
+
+        return result;
     }
 
     @Override
@@ -93,12 +101,12 @@ public class GoogleMfaAuthTokenServiceImpl extends AbstractServiceImpl implement
     }
 
     @Override
-    public long countTokensForOwner(final String owner) {
-        return logic.countTokensFor(owner);
-    }
+    public PagedResult<GoogleMfaAuthToken> countTokens() {
+        PagedResult<GoogleMfaAuthToken> result = new PagedResult<>();
 
-    @Override
-    public long countTokens() {
-        return logic.countAll();
+        result.setSize(logic.countAll());
+        result.setTotalCount(result.getSize());
+
+        return result;
     }
 }
diff --git a/core/idrepo/rest-cxf/pom.xml b/core/idrepo/rest-cxf/pom.xml
index f1028e6..108b211 100644
--- a/core/idrepo/rest-cxf/pom.xml
+++ b/core/idrepo/rest-cxf/pom.xml
@@ -69,6 +69,10 @@ under the License.
     </dependency>
     <dependency>
       <groupId>com.fasterxml.jackson.jaxrs</groupId>
+      <artifactId>jackson-jaxrs-xml-provider</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.jaxrs</groupId>
       <artifactId>jackson-jaxrs-yaml-provider</artifactId>
     </dependency>
     <dependency>
@@ -118,23 +122,6 @@ under the License.
       <artifactId>syncope-common-idrepo-rest-api</artifactId>
       <version>${project.version}</version>
     </dependency>
-            
-    <dependency>
-      <groupId>org.webjars</groupId>
-      <artifactId>jquery</artifactId>
-    </dependency>    
-    <dependency>
-      <groupId>org.webjars</groupId>
-      <artifactId>jquery-ui</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.webjars</groupId>
-      <artifactId>jquery-ui-themes</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.webjars</groupId>
-      <artifactId>highlightjs</artifactId>
-    </dependency>
 
     <!-- TEST -->
     <dependency>
diff --git a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/RESTCXFContext.java b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/RESTCXFContext.java
index eb2f55d..c2b9c6d 100644
--- a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/RESTCXFContext.java
+++ b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/RESTCXFContext.java
@@ -18,10 +18,10 @@
  */
 package org.apache.syncope.core.rest.cxf;
 
-import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
-import com.fasterxml.jackson.jaxrs.yaml.JacksonJaxbYAMLProvider;
+import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
+import com.fasterxml.jackson.jaxrs.xml.JacksonXMLProvider;
+import com.fasterxml.jackson.jaxrs.yaml.JacksonYAMLProvider;
 import io.swagger.v3.oas.models.security.SecurityScheme;
-
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -35,14 +35,11 @@ import org.apache.cxf.jaxrs.ext.search.SearchContextImpl;
 import org.apache.cxf.jaxrs.ext.search.SearchContextProvider;
 import org.apache.cxf.jaxrs.ext.search.SearchUtils;
 import org.apache.cxf.jaxrs.openapi.OpenApiFeature;
-import org.apache.cxf.jaxrs.provider.JAXBElementProvider;
 import org.apache.cxf.jaxrs.spring.JAXRSServerFactoryBeanDefinitionParser.SpringJAXRSServerFactoryBean;
 import org.apache.cxf.jaxrs.validation.JAXRSBeanValidationInInterceptor;
-import org.apache.cxf.staxutils.DocumentDepthProperties;
 import org.apache.cxf.transport.common.gzip.GZIPInInterceptor;
 import org.apache.cxf.transport.common.gzip.GZIPOutInterceptor;
 import org.apache.cxf.validation.BeanValidationProvider;
-import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.search.SyncopeFiqlParser;
 import org.apache.syncope.common.rest.api.DateParamConverterProvider;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -83,29 +80,22 @@ public class RESTCXFContext {
     }
 
     @Bean
-    public JAXBElementProvider<?> jaxbProvider() {
-        JAXBElementProvider<?> jaxbProvider = new JAXBElementProvider<>();
-        jaxbProvider.setNamespacePrefixes(Map.of(SyncopeConstants.NS, SyncopeConstants.NS_PREFIX));
-
-        DocumentDepthProperties documentDepthProperties = new DocumentDepthProperties();
-        documentDepthProperties.setInnerElementCountThreshold(500);
-        jaxbProvider.setDepthProperties(documentDepthProperties);
-
-        jaxbProvider.setCollectionWrapperMap(Map.of("org.apache.syncope.common.lib.policy.PolicyTO", "policies"));
-
-        return jaxbProvider;
+    public JacksonJsonProvider jsonProvider() {
+        JacksonJsonProvider jsonProvider = new JacksonJsonProvider();
+        jsonProvider.setMapper(new SyncopeObjectMapper());
+        return jsonProvider;
     }
 
     @Bean
-    public JacksonJaxbJsonProvider jsonProvider() {
-        JacksonJaxbJsonProvider jsonProvider = new JacksonJaxbJsonProvider();
-        jsonProvider.setMapper(new SyncopeObjectMapper());
-        return jsonProvider;
+    public JacksonXMLProvider xmlProvider() {
+        JacksonXMLProvider xmlProvider = new JacksonXMLProvider();
+        xmlProvider.setMapper(new SyncopeXmlMapper());
+        return xmlProvider;
     }
 
     @Bean
-    public JacksonJaxbYAMLProvider yamlProvider() {
-        JacksonJaxbYAMLProvider yamlProvider = new JacksonJaxbYAMLProvider();
+    public JacksonYAMLProvider yamlProvider() {
+        JacksonYAMLProvider yamlProvider = new JacksonYAMLProvider();
         yamlProvider.setMapper(new SyncopeYAMLMapper());
         return yamlProvider;
     }
@@ -161,20 +151,6 @@ public class RESTCXFContext {
     }
 
     @Bean
-    public WadlGenerator wadlGenerator() {
-        WadlGenerator wadlGenerator = new WadlGenerator();
-        wadlGenerator.setApplicationTitle("Apache Syncope " + version);
-        wadlGenerator.setNamespacePrefix(SyncopeConstants.NS_PREFIX);
-        wadlGenerator.setIncrementNamespacePrefix(false);
-        wadlGenerator.setLinkAnyMediaTypeToXmlSchema(true);
-        wadlGenerator.setUseJaxbContextForQnames(true);
-        wadlGenerator.setAddResourceAndMethodIds(true);
-        wadlGenerator.setIgnoreMessageWriters(true);
-        wadlGenerator.setUsePathParamsToCompareOperations(false);
-        return wadlGenerator;
-    }
-
-    @Bean
     public OpenApiFeature openapiFeature() {
         OpenApiFeature openapiFeature = new OpenApiFeature();
         openapiFeature.setTitle("Apache Syncope");
@@ -224,15 +200,14 @@ public class RESTCXFContext {
 
         restContainer.setProviders(List.of(
                 dateParamConverterProvider(),
-                jaxbProvider(),
                 jsonProvider(),
+                xmlProvider(),
                 yamlProvider(),
                 restServiceExceptionMapper(),
                 searchContextProvider(),
                 checkDomainFilter(),
                 addDomainFilter(),
-                addETagFilter(),
-                wadlGenerator()));
+                addETagFilter()));
 
... 4260 lines suppressed ...