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/05/26 10:24:22 UTC

[syncope] branch 2_0_X updated: [SYNCOPE-1565] Fix JAXB

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

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


The following commit(s) were added to refs/heads/2_0_X by this push:
     new 9dd15ce  [SYNCOPE-1565] Fix JAXB
9dd15ce is described below

commit 9dd15ced2455457c75b76849c8ea0e73ee57829e
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Mon May 25 16:25:03 2020 +0200

    [SYNCOPE-1565] Fix JAXB
---
 .../apache/syncope/client/console/pages/Audit.java |  28 +--
 .../syncope/common/lib/AbstractBaseBean.java       |   5 +-
 .../apache/syncope/common/lib/info/SystemInfo.java |   1 -
 .../apache/syncope/common/lib/log/LogAppender.java |   5 +-
 .../syncope/common/lib/patch/AnyObjectPatch.java   |  31 ++++
 .../apache/syncope/common/lib/patch/AnyPatch.java  |  44 ++++-
 .../syncope/common/lib/patch/GroupPatch.java       |  37 ++++
 .../apache/syncope/common/lib/patch/UserPatch.java |  41 +++++
 .../lib/policy/AbstractPasswordRuleConf.java       |   2 +-
 .../apache/syncope/common/lib/policy/PolicyTO.java |   1 -
 .../org/apache/syncope/common/lib/to/ErrorTO.java  |   5 +-
 .../org/apache/syncope/common/lib/to/SchemaTO.java |   1 -
 .../syncope/common/lib/types/AuditLoggerName.java  | 196 ++++++++++++++-------
 .../apache/syncope/core/logic/SyncopeLogic.java    |   1 -
 .../syncope/core/logic/init/LoggerLoader.java      |   4 +-
 .../syncope/core/provisioning/java/AuditEntry.java | 154 +++++++++-------
 .../provisioning/java/DefaultAuditManager.java     |  72 ++++++--
 .../java/job/report/AuditReportlet.java            |   8 +-
 .../syncope/core/rest/cxf/OpenApiFilter.java       |  77 ++++++++
 .../core/rest/cxf/RestServiceExceptionMapper.java  |  15 +-
 .../SyncopeSwaggerToOpenApiConversionFilter.java   | 114 ------------
 .../core/rest/cxf/service/WorkflowServiceImpl.java |   3 +-
 .../src/main/resources/META-INF/web-fragment.xml   |   8 +
 .../rest-cxf/src/main/resources/restCXFContext.xml |   2 -
 .../workflow/api/WorkflowDefinitionFormat.java     |  15 +-
 .../apache/syncope/common/lib/scim/SCIMConf.java   |   1 -
 .../syncope/common/lib/scim/SCIMGeneralConf.java   |   1 -
 .../syncope/common/lib/scim/SCIMUserConf.java      |   1 -
 .../syncope/common/lib/scim/SCIMUserNameConf.java  |   5 +-
 fit/core-reference/pom.xml                         |  10 ++
 .../core/reference/SyslogRewriteAuditAppender.java |  36 ++--
 .../fit/core/reference/TestFileAuditAppender.java  |  24 ++-
 .../reference/TestFileRewriteAuditAppender.java    |  16 +-
 .../src/main/resources/jboss/restCXFContext.xml    |   2 -
 .../syncope/fit/core/AuthenticationITCase.java     |   6 +-
 .../apache/syncope/fit/core/DerSchemaITCase.java   |   1 +
 .../org/apache/syncope/fit/core/LoggerITCase.java  |  33 ++--
 .../apache/syncope/fit/core/PullTaskITCase.java    |   1 -
 .../org/apache/syncope/fit/core/ReportITCase.java  |  11 +-
 .../org/apache/syncope/fit/core/SCIMITCase.java    |  36 +---
 .../apache/syncope/fit/core/SchedTaskITCase.java   |   7 +-
 .../apache/syncope/fit/core/UserSelfITCase.java    |  19 +-
 .../syncope/fit/core/UserWorkflowITCase.java       |  22 ++-
 43 files changed, 683 insertions(+), 419 deletions(-)

diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Audit.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Audit.java
index 33df05a..d6e11ad 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/Audit.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Audit.java
@@ -93,13 +93,13 @@ public class Audit extends BasePage {
                         Pair<EventCategoryTO, AuditElements.Result> eventCategory =
                                 AuditLoggerName.parseEventCategory(toBeRemoved);
 
-                        AuditLoggerName auditLoggerName = new AuditLoggerName(
-                                eventCategory.getKey().getType(),
-                                eventCategory.getKey().getCategory(),
-                                eventCategory.getKey().getSubcategory(),
-                                CollectionUtils.isEmpty(eventCategory.getKey().getEvents())
-                                ? null : eventCategory.getKey().getEvents().iterator().next(),
-                                eventCategory.getValue());
+                        AuditLoggerName auditLoggerName = new AuditLoggerName.Builder().
+                                type(eventCategory.getKey().getType()).
+                                category(eventCategory.getKey().getCategory()).
+                                subcategory(eventCategory.getKey().getSubcategory()).
+                                event(CollectionUtils.isEmpty(eventCategory.getKey().getEvents())
+                                        ? null : eventCategory.getKey().getEvents().iterator().next()).
+                                result(eventCategory.getValue()).build();
 
                         loggerRestClient.disableAudit(auditLoggerName);
                     }
@@ -108,13 +108,13 @@ public class Audit extends BasePage {
                         Pair<EventCategoryTO, AuditElements.Result> eventCategory =
                                 AuditLoggerName.parseEventCategory(toBeAdded);
 
-                        AuditLoggerName auditLoggerName = new AuditLoggerName(
-                                eventCategory.getKey().getType(),
-                                eventCategory.getKey().getCategory(),
-                                eventCategory.getKey().getSubcategory(),
-                                CollectionUtils.isEmpty(eventCategory.getKey().getEvents())
-                                ? null : eventCategory.getKey().getEvents().iterator().next(),
-                                eventCategory.getValue());
+                        AuditLoggerName auditLoggerName = new AuditLoggerName.Builder().
+                                type(eventCategory.getKey().getType()).
+                                category(eventCategory.getKey().getCategory()).
+                                subcategory(eventCategory.getKey().getSubcategory()).
+                                event(CollectionUtils.isEmpty(eventCategory.getKey().getEvents())
+                                        ? null : eventCategory.getKey().getEvents().iterator().next()).
+                                result(eventCategory.getValue()).build();
 
                         loggerRestClient.enableAudit(auditLoggerName);
                     }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/AbstractBaseBean.java b/common/lib/src/main/java/org/apache/syncope/common/lib/AbstractBaseBean.java
index 4562f70..0481a65 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/AbstractBaseBean.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/AbstractBaseBean.java
@@ -25,15 +25,18 @@ import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
+import org.apache.syncope.common.lib.policy.PolicyTO;
 import org.apache.syncope.common.lib.to.TaskTO;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.to.ReportTO;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.UserTO;
+import org.apache.syncope.common.lib.to.WorkflowFormTO;
 
 @XmlType
 // Reporting here only classes used via PagedResult
-@XmlSeeAlso({ TaskTO.class, ReportTO.class, GroupTO.class, UserTO.class, AnyObjectTO.class })
+@XmlSeeAlso({ TaskTO.class, ReportTO.class, GroupTO.class, UserTO.class, AnyObjectTO.class,
+    PolicyTO.class, WorkflowFormTO.class })
 public abstract class AbstractBaseBean implements Serializable {
 
     private static final long serialVersionUID = 3119542005279892164L;
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/info/SystemInfo.java b/common/lib/src/main/java/org/apache/syncope/common/lib/info/SystemInfo.java
index 2a0f1f4..6023b1d 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/info/SystemInfo.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/info/SystemInfo.java
@@ -148,5 +148,4 @@ public class SystemInfo extends AbstractBaseBean {
             this.maxMemory = maxMemory;
         }
     }
-
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/log/LogAppender.java b/common/lib/src/main/java/org/apache/syncope/common/lib/log/LogAppender.java
index 317ed59..5d8b68d 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/log/LogAppender.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/log/LogAppender.java
@@ -19,7 +19,11 @@
 package org.apache.syncope.common.lib.log;
 
 import org.apache.syncope.common.lib.AbstractBaseBean;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
 
+@XmlRootElement(name = "logAppender")
+@XmlType
 public class LogAppender extends AbstractBaseBean {
 
     private static final long serialVersionUID = 5975199884460548302L;
@@ -33,5 +37,4 @@ public class LogAppender extends AbstractBaseBean {
     public void setName(final String name) {
         this.name = name;
     }
-
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AnyObjectPatch.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AnyObjectPatch.java
index 19794a1..0de3cd3 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AnyObjectPatch.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AnyObjectPatch.java
@@ -27,6 +27,8 @@ 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 = "anyObjectPatch")
 @XmlType
@@ -75,4 +77,33 @@ public class AnyObjectPatch extends AnyPatch {
         return super.isEmpty() && name == null && relationships.isEmpty() && memberships.isEmpty();
     }
 
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(name).
+                append(relationships).
+                append(memberships).
+                build();
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        final AnyObjectPatch other = (AnyObjectPatch) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(name, other.name).
+                append(relationships, other.relationships).
+                append(memberships, other.memberships).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AnyPatch.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AnyPatch.java
index 0ab8551..3200ffc 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AnyPatch.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AnyPatch.java
@@ -24,6 +24,7 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
 import java.util.HashSet;
 import java.util.Set;
 import javax.ws.rs.PathParam;
@@ -32,7 +33,8 @@ 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.syncope.common.lib.AbstractBaseBean;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.to.AttrTO;
 
 @XmlType
@@ -40,7 +42,7 @@ import org.apache.syncope.common.lib.to.AttrTO;
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "@class")
 @JsonPropertyOrder(value = { "@class", "key" })
 @ApiModel(subTypes = { UserPatch.class, GroupPatch.class, AnyObjectPatch.class }, discriminator = "@class")
-public abstract class AnyPatch extends AbstractBaseBean implements AttributablePatch {
+public abstract class AnyPatch implements Serializable, AttributablePatch {
 
     private static final long serialVersionUID = -7445489774552440544L;
 
@@ -60,7 +62,7 @@ public abstract class AnyPatch extends AbstractBaseBean implements AttributableP
 
     private final Set<StringPatchItem> resources = new HashSet<>();
 
-    @ApiModelProperty(name = "@class", required = true, readOnly = false)
+    @ApiModelProperty(name = "@class", required = true)
     public abstract String getDiscriminator();
 
     public void setDiscriminator(final String discriminator) {
@@ -126,4 +128,40 @@ public abstract class AnyPatch extends AbstractBaseBean implements AttributableP
                 && plainAttrs.isEmpty() && virAttrs.isEmpty()
                 && resources.isEmpty();
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(discriminator).
+                append(key).
+                append(realm).
+                append(auxClasses).
+                append(plainAttrs).
+                append(virAttrs).
+                append(resources).
+                build();
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        final AnyPatch other = (AnyPatch) obj;
+        return new EqualsBuilder().
+                append(discriminator, other.discriminator).
+                append(key, other.key).
+                append(realm, other.realm).
+                append(auxClasses, other.auxClasses).
+                append(plainAttrs, other.plainAttrs).
+                append(virAttrs, other.virAttrs).
+                append(resources, other.resources).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/GroupPatch.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/GroupPatch.java
index 575012c..b14d9ff 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/GroupPatch.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/GroupPatch.java
@@ -33,6 +33,8 @@ import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.collections4.Predicate;
+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;
 
@@ -124,4 +126,39 @@ public class GroupPatch extends AnyPatch {
                 && name == null && userOwner == null && groupOwner == null;
     }
 
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(name).
+                append(userOwner).
+                append(groupOwner).
+                append(udynMembershipCond).
+                append(adynMembershipConds).
+                append(typeExtensions).
+                build();
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        final GroupPatch other = (GroupPatch) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(name, other.name).
+                append(userOwner, other.userOwner).
+                append(groupOwner, other.groupOwner).
+                append(udynMembershipCond, other.udynMembershipCond).
+                append(adynMembershipConds, other.adynMembershipConds).
+                append(typeExtensions, other.typeExtensions).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/UserPatch.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/UserPatch.java
index 7fbb3a3..b1f0d02 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/UserPatch.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/UserPatch.java
@@ -27,6 +27,8 @@ 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 = "userPatch")
 @XmlType
@@ -125,4 +127,43 @@ public class UserPatch extends AnyPatch {
                 && username == null && password == null && securityQuestion == null && securityAnswer == null
                 && mustChangePassword == null && relationships.isEmpty() && memberships.isEmpty() && roles.isEmpty();
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(username).
+                append(password).
+                append(securityQuestion).
+                append(securityAnswer).
+                append(mustChangePassword).
+                append(relationships).
+                append(memberships).
+                append(roles).
+                build();
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        final UserPatch other = (UserPatch) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(username, other.username).
+                append(securityQuestion, other.securityQuestion).
+                append(securityAnswer, other.securityAnswer).
+                append(mustChangePassword, other.mustChangePassword).
+                append(relationships, other.relationships).
+                append(memberships, other.memberships).
+                append(roles, other.roles).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractPasswordRuleConf.java b/common/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractPasswordRuleConf.java
index 6d35abd..33031c1 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractPasswordRuleConf.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractPasswordRuleConf.java
@@ -24,7 +24,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.AbstractBaseBean;
 
 @XmlType
-@XmlSeeAlso({ DefaultPasswordRuleConf.class })
+@XmlSeeAlso({ DefaultPasswordRuleConf.class, HaveIBeenPwnedPasswordRuleConf.class })
 public abstract class AbstractPasswordRuleConf extends AbstractBaseBean implements PasswordRuleConf {
 
     private static final long serialVersionUID = -5814018872387142339L;
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/policy/PolicyTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/policy/PolicyTO.java
index cff315e..a647af0 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/policy/PolicyTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/policy/PolicyTO.java
@@ -101,5 +101,4 @@ public abstract class PolicyTO extends AbstractBaseBean implements EntityTO {
     public List<String> getUsedByRealms() {
         return usedByRealms;
     }
-
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ErrorTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ErrorTO.java
index f643b88..055ebf7 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ErrorTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ErrorTO.java
@@ -19,18 +19,18 @@
 package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
 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.AbstractBaseBean;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 
 @XmlRootElement(name = "error")
 @XmlType
-public class ErrorTO extends AbstractBaseBean {
+public class ErrorTO implements Serializable {
 
     private static final long serialVersionUID = 2435764161719225927L;
 
@@ -62,5 +62,4 @@ public class ErrorTO extends AbstractBaseBean {
     public List<String> getElements() {
         return elements;
     }
-
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/SchemaTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/SchemaTO.java
index b5ff3aa..f0999f3 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/SchemaTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/SchemaTO.java
@@ -73,5 +73,4 @@ public abstract class SchemaTO extends AbstractBaseBean implements EntityTO {
     public void setAnyTypeClass(final String anyTypeClass) {
         this.anyTypeClass = anyTypeClass;
     }
-
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/types/AuditLoggerName.java b/common/lib/src/main/java/org/apache/syncope/common/lib/types/AuditLoggerName.java
index 31622ec..b3f5863 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/types/AuditLoggerName.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/types/AuditLoggerName.java
@@ -18,17 +18,21 @@
  */
 package org.apache.syncope.common.lib.types;
 
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
 import java.text.ParseException;
 import java.util.Map;
+import javax.xml.bind.annotation.XmlRootElement;
+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.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.log.EventCategoryTO;
 import org.apache.syncope.common.lib.types.AuditElements.EventCategoryType;
 import org.apache.syncope.common.lib.types.AuditElements.Result;
 
+@XmlRootElement(name = "auditLoggerName")
+@XmlType
 public class AuditLoggerName extends AbstractBaseBean {
 
     private static final long serialVersionUID = -647989486671786839L;
@@ -41,58 +45,6 @@ public class AuditLoggerName extends AbstractBaseBean {
         return domain + "." + loggerName;
     }
 
-    private final AuditElements.EventCategoryType type;
-
-    private final String category;
-
-    private final String subcategory;
-
-    private final String event;
-
-    private final Result result;
-
-    @JsonCreator
-    public AuditLoggerName(
-            @JsonProperty("type") final AuditElements.EventCategoryType type,
-            @JsonProperty("category") final String category,
-            @JsonProperty("subcategory") final String subcategory,
-            @JsonProperty("event") final String event,
-            @JsonProperty("result") final Result result) {
-
-        super();
-
-        this.type = type == null ? AuditElements.EventCategoryType.CUSTOM : type;
-        this.category = category;
-        this.subcategory = subcategory;
-        this.event = event;
-        this.result = result == null ? Result.SUCCESS : result;
-    }
-
-    public AuditElements.EventCategoryType getType() {
-        return type;
-    }
-
-    public String getEvent() {
-        return event;
-    }
-
-    public String getCategory() {
-        return category;
-    }
-
-    public Result getResult() {
-        return result;
-    }
-
-    public String getSubcategory() {
-        return subcategory;
-    }
-
-    public String toLoggerName() {
-        return new StringBuilder().append(LoggerType.AUDIT.getPrefix()).append('.').
-                append(buildEvent(type, category, subcategory, event, result)).toString();
-    }
-
     public static AuditLoggerName fromLoggerName(final String loggerName)
             throws ParseException {
 
@@ -107,13 +59,14 @@ public class AuditLoggerName extends AbstractBaseBean {
         final Map.Entry<EventCategoryTO, Result> eventCategory = parseEventCategory(
                 loggerName.replaceAll(LoggerType.AUDIT.getPrefix() + ".", ""));
 
-        return new AuditLoggerName(
-                eventCategory.getKey().getType(),
-                eventCategory.getKey().getCategory(),
-                eventCategory.getKey().getSubcategory(),
-                eventCategory.getKey().getEvents().isEmpty()
-                ? StringUtils.EMPTY : eventCategory.getKey().getEvents().iterator().next(),
-                eventCategory.getValue());
+        return new AuditLoggerName.Builder().
+                type(eventCategory.getKey().getType()).
+                category(eventCategory.getKey().getCategory()).
+                subcategory(eventCategory.getKey().getSubcategory()).
+                event(eventCategory.getKey().getEvents().isEmpty()
+                        ? StringUtils.EMPTY : eventCategory.getKey().getEvents().iterator().next()).
+                result(eventCategory.getValue()).
+                build();
     }
 
     public static Pair<EventCategoryTO, Result> parseEventCategory(final String event) {
@@ -209,4 +162,125 @@ public class AuditLoggerName extends AbstractBaseBean {
 
         return eventBuilder.toString();
     }
+
+    public static class Builder {
+
+        private final AuditLoggerName instance = new AuditLoggerName();
+
+        public Builder type(final AuditElements.EventCategoryType type) {
+            instance.type = type;
+            return this;
+        }
+
+        public Builder category(final String category) {
+            instance.category = category;
+            return this;
+        }
+
+        public Builder subcategory(final String subcategory) {
+            instance.subcategory = subcategory;
+            return this;
+        }
+
+        public Builder event(final String event) {
+            instance.event = event;
+            return this;
+        }
+
+        public Builder result(final Result result) {
+            instance.result = result;
+            return this;
+        }
+
+        public AuditLoggerName build() {
+            return instance;
+        }
+    }
+
+    private EventCategoryType type = AuditElements.EventCategoryType.CUSTOM;
+
+    private String category;
+
+    private String subcategory;
+
+    private String event;
+
+    private Result result = Result.SUCCESS;
+
+    public EventCategoryType getType() {
+        return type;
+    }
+
+    public void setType(final EventCategoryType type) {
+        this.type = type;
+    }
+
+    public String getCategory() {
+        return category;
+    }
+
+    public void setCategory(final String category) {
+        this.category = category;
+    }
+
+    public String getSubcategory() {
+        return subcategory;
+    }
+
+    public void setSubcategory(final String subcategory) {
+        this.subcategory = subcategory;
+    }
+
+    public String getEvent() {
+        return event;
+    }
+
+    public void setEvent(final String event) {
+        this.event = event;
+    }
+
+    public Result getResult() {
+        return result;
+    }
+
+    public void setResult(final Result result) {
+        this.result = result;
+    }
+
+    public String toLoggerName() {
+        return new StringBuilder().append(LoggerType.AUDIT.getPrefix()).append('.').
+                append(buildEvent(type, category, subcategory, event, result)).toString();
+    }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(type).
+                append(category).
+                append(subcategory).
+                append(event).
+                append(result).
+                build();
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        final AuditLoggerName other = (AuditLoggerName) obj;
+        return new EqualsBuilder().
+                append(type, other.type).
+                append(category, other.category).
+                append(subcategory, other.subcategory).
+                append(event, other.event).
+                append(result, other.result).
+                build();
+    }
 }
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
index 55cf16f..c7dd791 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
@@ -469,5 +469,4 @@ public class SyncopeLogic extends AbstractLogic<AbstractBaseBean> {
 
         throw new UnresolvedReferenceException();
     }
-
 }
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerLoader.java b/core/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerLoader.java
index bc9f7b9..333ad89 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerLoader.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerLoader.java
@@ -97,8 +97,8 @@ public class LoggerLoader implements SyncopeLoader {
             Appender appender = ctx.getConfiguration().getAppender("audit_for_" + entry.getKey());
             if (appender == null) {
                 appender = JdbcAppender.newBuilder().
-                        withName("audit_for_" + entry.getKey()).
-                        withIgnoreExceptions(false).
+                        setName("audit_for_" + entry.getKey()).
+                        setIgnoreExceptions(false).
                         setConnectionSource(new DataSourceConnectionSource(entry.getKey(), entry.getValue())).
                         setBufferSize(0).
                         setTableName("SYNCOPEAUDIT").
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/AuditEntry.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/AuditEntry.java
index 35d5297..b0d77f2 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/AuditEntry.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/AuditEntry.java
@@ -3,106 +3,138 @@
  * 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
+ * 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;
+ * 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
+ * "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.core.provisioning.java;
 
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.SerializationUtils;
-import org.apache.syncope.common.lib.AbstractBaseBean;
-import org.apache.syncope.common.lib.patch.UserPatch;
-import org.apache.syncope.common.lib.to.UserTO;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+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.AuditLoggerName;
 
-public class AuditEntry extends AbstractBaseBean {
+public class AuditEntry implements Serializable {
 
-    private static final long serialVersionUID = -2299082316063743582L;
+    private static final long serialVersionUID = 1215115961911228005L;
 
-    private static final String MASKED_VALUE = "<MASKED>";
+    private String who;
 
-    private final String who;
+    private Date date;
 
-    private final AuditLoggerName logger;
+    private AuditLoggerName logger;
 
-    private final Object before;
+    private String before;
 
-    private final Object output;
+    private final List<String> inputs = new ArrayList<>();
 
-    private final Object[] input;
+    private String output;
 
-    @JsonCreator
-    public AuditEntry(
-            @JsonProperty("who") final String who,
-            @JsonProperty("logger") final AuditLoggerName logger,
-            @JsonProperty("before") final Object before,
-            @JsonProperty("output") final Object output,
-            @JsonProperty("input") final Object[] input) {
+    private String throwable;
 
-        super();
+    public String getWho() {
+        return who;
+    }
 
+    public void setWho(final String who) {
         this.who = who;
-        this.logger = logger;
-        this.before = maskSensitive(before);
-        this.output = maskSensitive(output);
-        this.input = ArrayUtils.clone(input);
-        if (this.input != null) {
-            for (int i = 0; i < this.input.length; i++) {
-                this.input[i] = maskSensitive(this.input[i]);
-            }
-        }
     }
 
-    private Object maskSensitive(final Object object) {
-        Object filtered;
-
-        if (object instanceof UserTO) {
-            filtered = SerializationUtils.clone((UserTO) object);
-            if (((UserTO) filtered).getPassword() != null) {
-                ((UserTO) filtered).setPassword(MASKED_VALUE);
-            }
-            if (((UserTO) filtered).getSecurityAnswer() != null) {
-                ((UserTO) filtered).setSecurityAnswer(MASKED_VALUE);
-            }
-        } else if (object instanceof UserPatch && ((UserPatch) object).getPassword() != null) {
-            filtered = SerializationUtils.clone((UserPatch) object);
-            ((UserPatch) filtered).getPassword().setValue(MASKED_VALUE);
-        } else {
-            filtered = object;
-        }
-
-        return filtered;
+    public Date getDate() {
+        return date == null
+                ? null
+                : new Date(date.getTime());
     }
 
-    public String getWho() {
-        return who;
+    public void setDate(final Date date) {
+        this.date = date == null
+                ? null
+                : new Date(date.getTime());
     }
 
     public AuditLoggerName getLogger() {
         return logger;
     }
 
-    public Object getBefore() {
+    public void setLogger(final AuditLoggerName logger) {
+        this.logger = logger;
+    }
+
+    public String getBefore() {
         return before;
     }
 
-    public Object getOutput() {
+    public List<String> getInputs() {
+        return inputs;
+    }
+
+    public void setBefore(final String before) {
+        this.before = before;
+    }
+
+    public String getOutput() {
         return output;
     }
 
-    public Object[] getInput() {
-        return input;
+    public void setOutput(final String output) {
+        this.output = output;
+    }
+
+    public String getThrowable() {
+        return throwable;
+    }
+
+    public void setThrowable(final String throwable) {
+        this.throwable = throwable;
+    }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(who).
+                append(date).
+                append(logger).
+                append(before).
+                append(inputs).
+                append(output).
+                append(throwable).
+                build();
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        final AuditEntry other = (AuditEntry) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(who, other.who).
+                append(date, other.date).
+                append(logger, other.logger).
+                append(before, other.before).
+                append(inputs, other.inputs).
+                append(output, other.output).
+                append(throwable, other.throwable).
+                build();
     }
 }
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAuditManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAuditManager.java
index 05225fa..a785188 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAuditManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAuditManager.java
@@ -18,6 +18,10 @@
  */
 package org.apache.syncope.core.provisioning.java;
 
+import java.util.Date;
+import org.apache.commons.lang3.SerializationUtils;
+import org.apache.syncope.common.lib.patch.UserPatch;
+import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.core.provisioning.api.AuditManager;
 import org.apache.syncope.common.lib.types.AuditElements;
 import org.apache.syncope.common.lib.types.AuditElements.Result;
@@ -26,6 +30,7 @@ import org.apache.syncope.common.lib.types.LoggerLevel;
 import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
 import org.apache.syncope.core.persistence.api.dao.LoggerDAO;
 import org.apache.syncope.core.provisioning.api.event.AfterHandlingEvent;
+import org.apache.syncope.core.provisioning.api.utils.ExceptionUtils2;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -35,6 +40,29 @@ import org.springframework.transaction.annotation.Transactional;
 @Transactional(readOnly = true)
 public class DefaultAuditManager implements AuditManager {
 
+    private static final String MASKED_VALUE = "<MASKED>";
+
+    private static Object maskSensitive(final Object object) {
+        Object masked;
+
+        if (object instanceof UserTO) {
+            masked = SerializationUtils.clone((UserTO) object);
+            if (((UserTO) masked).getPassword() != null) {
+                ((UserTO) masked).setPassword(MASKED_VALUE);
+            }
+            if (((UserTO) masked).getSecurityAnswer() != null) {
+                ((UserTO) masked).setSecurityAnswer(MASKED_VALUE);
+            }
+        } else if (object instanceof UserPatch && ((UserPatch) object).getPassword() != null) {
+            masked = SerializationUtils.clone((UserPatch) object);
+            ((UserPatch) masked).getPassword().setValue(MASKED_VALUE);
+        } else {
+            masked = object;
+        }
+
+        return masked;
+    }
+
     @Autowired
     private LoggerDAO loggerDAO;
 
@@ -46,12 +74,12 @@ public class DefaultAuditManager implements AuditManager {
             final String subcategory,
             final String event) {
 
-        AuditEntry auditEntry = new AuditEntry(
-                who,
-                new AuditLoggerName(type, category, subcategory, event, Result.SUCCESS),
-                null,
-                null,
-                null);
+        AuditEntry auditEntry = new AuditEntry();
+        auditEntry.setWho(who);
+        auditEntry.setLogger(new AuditLoggerName.Builder().
+                type(type).category(category).subcategory(subcategory).event(event).result(Result.SUCCESS).build());
+        auditEntry.setDate(new Date());
+
         org.apache.syncope.core.persistence.api.entity.Logger syncopeLogger =
                 loggerDAO.find(auditEntry.getLogger().toLoggerName());
         boolean auditRequested = syncopeLogger != null && syncopeLogger.getLevel() == LoggerLevel.DEBUG;
@@ -60,12 +88,9 @@ public class DefaultAuditManager implements AuditManager {
             return true;
         }
 
-        auditEntry = new AuditEntry(
-                who,
-                new AuditLoggerName(type, category, subcategory, event, Result.FAILURE),
-                null,
-                null,
-                null);
+        auditEntry.setLogger(new AuditLoggerName.Builder().
+                type(type).category(category).subcategory(subcategory).event(event).result(Result.FAILURE).build());
+
         syncopeLogger = loggerDAO.find(auditEntry.getLogger().toLoggerName());
         auditRequested = syncopeLogger != null && syncopeLogger.getLevel() == LoggerLevel.DEBUG;
 
@@ -103,12 +128,23 @@ public class DefaultAuditManager implements AuditManager {
             throwable = (Throwable) output;
         }
 
-        AuditEntry auditEntry = new AuditEntry(
-                who,
-                new AuditLoggerName(type, category, subcategory, event, condition),
-                before,
-                throwable == null ? output : throwable.getMessage(),
-                input);
+        AuditEntry auditEntry = new AuditEntry();
+        auditEntry.setWho(who);
+        auditEntry.setLogger(new AuditLoggerName.Builder().
+                type(type).category(category).subcategory(subcategory).event(event).result(condition).build());
+        auditEntry.setDate(new Date());
+        auditEntry.setBefore(POJOHelper.serialize((maskSensitive(before))));
+        if (throwable == null) {
+            auditEntry.setOutput(POJOHelper.serialize((maskSensitive(output))));
+        } else {
+            auditEntry.setOutput(throwable.getMessage());
+            auditEntry.setThrowable(ExceptionUtils2.getFullStackTrace(throwable));
+        }
+        if (input != null) {
+            for (Object obj : input) {
+                auditEntry.getInputs().add(POJOHelper.serialize(obj));
+            }
+        }
 
         org.apache.syncope.core.persistence.api.entity.Logger syncopeLogger =
                 loggerDAO.find(auditEntry.getLogger().toLoggerName());
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/AuditReportlet.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/AuditReportlet.java
index 6ba9a53..7576875 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/AuditReportlet.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/AuditReportlet.java
@@ -95,13 +95,11 @@ public class AuditReportlet extends AbstractReportlet {
                 handler.endElement("", "", "before");
             }
 
-            if (auditEntry.getInput() != null) {
+            if (!auditEntry.getInputs().isEmpty()) {
                 handler.startElement("", "", "inputs", null);
-                for (Object inputObj : auditEntry.getInput()) {
-                    char[] input = ToStringBuilder.reflectionToString(
-                            inputObj, ToStringStyle.JSON_STYLE).toCharArray();
+                for (String input : auditEntry.getInputs()) {
                     handler.startElement("", "", "input", null);
-                    handler.characters(input, 0, input.length);
+                    handler.characters(input.toCharArray(), 0, input.length());
                     handler.endElement("", "", "input");
                 }
                 handler.endElement("", "", "inputs");
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/OpenApiFilter.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/OpenApiFilter.java
new file mode 100644
index 0000000..381b676
--- /dev/null
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/OpenApiFilter.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.core.rest.cxf;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.Collections;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.cxf.jaxrs.json.basic.JsonMapObject;
+import org.apache.cxf.jaxrs.json.basic.JsonMapObjectReaderWriter;
+import org.apache.cxf.jaxrs.swagger.openapi.SwaggerToOpenApiConversionUtils;
+
+public class OpenApiFilter implements Filter {
+
+    @Override
+    public void init(final FilterConfig config) throws ServletException {
+        // nothing to do
+    }
+
+    @Override
+    public void doFilter(
+            final ServletRequest request,
+            final ServletResponse response,
+            final FilterChain chain) throws IOException, ServletException {
+
+        HttpServletRequest httpReq = (HttpServletRequest) request;
+        Response swagger = WebClient.create(
+                StringUtils.substringBeforeLast(httpReq.getRequestURL().toString(), "/") + "/swagger.json").
+                accept(MediaType.APPLICATION_JSON_TYPE).get();
+
+        String swaggerJson = IOUtils.toString((InputStream) swagger.getEntity(), StandardCharsets.UTF_8);
+        String openApiJson = SwaggerToOpenApiConversionUtils.getOpenApiFromSwaggerJson(swaggerJson);
+
+        JsonMapObjectReaderWriter readerWriter = new JsonMapObjectReaderWriter();
+        JsonMapObject openapi = readerWriter.fromJsonToJsonObject(openApiJson);
+
+        String basePath = StringUtils.substringBeforeLast(httpReq.getRequestURI(), "/");
+        openapi.setProperty("servers", Arrays.asList(Collections.singletonMap("url", basePath)));
+
+        response.setContentType(MediaType.APPLICATION_JSON);
+        response.getOutputStream().write(readerWriter.toJson(openapi).getBytes(StandardCharsets.UTF_8));
+    }
+
+    @Override
+    public void destroy() {
+        // nothing to do
+    }
+}
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/RestServiceExceptionMapper.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/RestServiceExceptionMapper.java
index 2e77b37..149f298 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/RestServiceExceptionMapper.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/RestServiceExceptionMapper.java
@@ -75,13 +75,15 @@ public class RestServiceExceptionMapper implements ExceptionMapper<Exception> {
     @Autowired
     private Environment env;
 
+    private static final String UNIQUE_MSG_KEY = "UniqueConstraintViolation";
+
     private static final Map<String, String> EXCEPTION_CODE_MAP = new HashMap<String, String>() {
 
         private static final long serialVersionUID = -7688359318035249200L;
 
         {
-            put("23000", "UniqueConstraintViolation");
-            put("23505", "UniqueConstraintViolation");
+            put("23000", UNIQUE_MSG_KEY);
+            put("23505", UNIQUE_MSG_KEY);
         }
     };
 
@@ -107,9 +109,9 @@ public class RestServiceExceptionMapper implements ExceptionMapper<Exception> {
                 || ex instanceof PersistenceException && ex.getCause() instanceof EntityExistsException) {
 
             builder = builder(ClientExceptionType.EntityExists,
-                    getJPAMessage(ex instanceof PersistenceException ? ex.getCause() : ex));
+                    getPersistenceErrorMessage(ex instanceof PersistenceException ? ex.getCause() : ex));
         } else if (ex instanceof DataIntegrityViolationException || ex instanceof JpaSystemException) {
-            builder = builder(ClientExceptionType.DataIntegrityViolation, getJPAMessage(ex));
+            builder = builder(ClientExceptionType.DataIntegrityViolation, getPersistenceErrorMessage(ex));
         } else if (ex instanceof ConnectorException) {
             builder = builder(ClientExceptionType.ConnectorException, ExceptionUtils.getRootCauseMessage(ex));
         } else if (ex instanceof NotFoundException) {
@@ -303,14 +305,17 @@ public class RestServiceExceptionMapper implements ExceptionMapper<Exception> {
         return builder;
     }
 
-    private String getJPAMessage(final Throwable ex) {
+    private String getPersistenceErrorMessage(final Throwable ex) {
         Throwable throwable = ExceptionUtils.getRootCause(ex);
+
         String message = null;
         if (throwable instanceof SQLException) {
             String messageKey = EXCEPTION_CODE_MAP.get(((SQLException) throwable).getSQLState());
             if (messageKey != null) {
                 message = env.getProperty("errMessage." + messageKey);
             }
+        } else if (throwable instanceof EntityExistsException || throwable instanceof DuplicateException) {
+            message = env.getProperty("errMessage." + UNIQUE_MSG_KEY);
         }
 
         return message == null
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SyncopeSwaggerToOpenApiConversionFilter.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SyncopeSwaggerToOpenApiConversionFilter.java
deleted file mode 100644
index 44aaabd..0000000
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SyncopeSwaggerToOpenApiConversionFilter.java
+++ /dev/null
@@ -1,114 +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.core.rest.cxf;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.net.URI;
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Objects;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.container.ContainerRequestContext;
-import javax.ws.rs.container.ContainerRequestFilter;
-import javax.ws.rs.container.PreMatching;
-import javax.ws.rs.ext.Provider;
-import javax.ws.rs.ext.WriterInterceptor;
-import javax.ws.rs.ext.WriterInterceptorContext;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.cxf.io.CachedOutputStream;
-import org.apache.cxf.jaxrs.ext.MessageContext;
-import org.apache.cxf.jaxrs.json.basic.JsonMapObject;
-import org.apache.cxf.jaxrs.json.basic.JsonMapObjectReaderWriter;
-import org.apache.cxf.jaxrs.swagger.openapi.OpenApiConfiguration;
-import org.apache.cxf.jaxrs.swagger.openapi.SwaggerToOpenApiConversionUtils;
-import org.apache.cxf.jaxrs.utils.JAXRSUtils;
-
-@Provider
-@PreMatching
-public final class SyncopeSwaggerToOpenApiConversionFilter implements ContainerRequestFilter, WriterInterceptor {
-
-    private static final String SWAGGER_PATH = "swagger.json";
-
-    private static final String OPEN_API_PATH = "openapi.json";
-
-    private static final String OPEN_API_PROPERTY = "openapi";
-
-    private OpenApiConfiguration openApiConfig;
-
-    private String openApiJsonPath = OPEN_API_PATH;
-
-    @Override
-    public void filter(final ContainerRequestContext reqCtx) throws IOException {
-        String path = reqCtx.getUriInfo().getPath();
-        if (path.endsWith(openApiJsonPath)) {
-            reqCtx.setRequestUri(URI.create(SWAGGER_PATH));
-            JAXRSUtils.getCurrentMessage().getExchange().put(OPEN_API_PROPERTY, Boolean.TRUE);
-        }
-    }
-
-    public OpenApiConfiguration getOpenApiConfig() {
-        return openApiConfig;
-    }
-
-    public void setOpenApiConfig(final OpenApiConfiguration openApiConfig) {
-        this.openApiConfig = openApiConfig;
-    }
-
-    @Override
-    public void aroundWriteTo(final WriterInterceptorContext context) throws IOException, WebApplicationException {
-        if (isOpenApiRequested()) {
-            OutputStream os = context.getOutputStream();
-            CachedOutputStream cos = new CachedOutputStream();
-
-            context.setOutputStream(cos);
-            context.proceed();
-
-            MessageContext ctx = createMessageContext();
-            String swaggerJson = IOUtils.toString(cos.getInputStream(), StandardCharsets.UTF_8);
-            String openApiJson = SwaggerToOpenApiConversionUtils.getOpenApiFromSwaggerJson(
-                    ctx, swaggerJson, openApiConfig);
-
-            JsonMapObjectReaderWriter readerWriter = new JsonMapObjectReaderWriter();
-            JsonMapObject openapi = readerWriter.fromJsonToJsonObject(openApiJson);
-
-            String basePath = StringUtils.substringBeforeLast(ctx.getHttpServletRequest().getRequestURI(), "/");
-            openapi.setProperty("servers", Arrays.asList(Collections.singletonMap("url", basePath)));
-
-            os.write(readerWriter.toJson(openapi).getBytes(StandardCharsets.UTF_8));
-            os.flush();
-        } else {
-            context.proceed();
-        }
-    }
-
-    private MessageContext createMessageContext() {
-        return JAXRSUtils.createContextValue(JAXRSUtils.getCurrentMessage(), null, MessageContext.class);
-    }
-
-    private boolean isOpenApiRequested() {
-        return Objects.equals(Boolean.TRUE, JAXRSUtils.getCurrentMessage().getExchange().get(OPEN_API_PROPERTY));
-    }
-
-    public void setOpenApiJsonPath(final String openApiJsonPath) {
-        this.openApiJsonPath = openApiJsonPath;
-    }
-}
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/WorkflowServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/WorkflowServiceImpl.java
index 2642853..462f1d5 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/WorkflowServiceImpl.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/WorkflowServiceImpl.java
@@ -59,8 +59,7 @@ public class WorkflowServiceImpl extends AbstractServiceImpl implements Workflow
         };
 
         return Response.ok(sout).
-                type(format == WorkflowDefinitionFormat.JSON
-                        ? MediaType.APPLICATION_JSON_TYPE : MediaType.APPLICATION_XHTML_XML_TYPE).
+                type(format.getMediaType()).
                 build();
     }
 
diff --git a/core/rest-cxf/src/main/resources/META-INF/web-fragment.xml b/core/rest-cxf/src/main/resources/META-INF/web-fragment.xml
index 9e75b2d..6704150 100644
--- a/core/rest-cxf/src/main/resources/META-INF/web-fragment.xml
+++ b/core/rest-cxf/src/main/resources/META-INF/web-fragment.xml
@@ -65,6 +65,10 @@ under the License.
     <filter-name>springSecurityFilterChain</filter-name>
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
   </filter>
+  <filter>
+    <filter-name>openapiFilter</filter-name>
+    <filter-class>org.apache.syncope.core.rest.cxf.OpenApiFilter</filter-class>
+  </filter>
 
   <filter-mapping>
     <filter-name>encodingFilter</filter-name>
@@ -74,5 +78,9 @@ under the License.
     <filter-name>springSecurityFilterChain</filter-name>
     <url-pattern>/*</url-pattern>
   </filter-mapping>
+  <filter-mapping>
+    <filter-name>openapiFilter</filter-name>
+    <url-pattern>/rest/openapi.json</url-pattern>
+  </filter-mapping>
 
 </web-fragment>
diff --git a/core/rest-cxf/src/main/resources/restCXFContext.xml b/core/rest-cxf/src/main/resources/restCXFContext.xml
index 45fb5cb..db7a3f4 100644
--- a/core/rest-cxf/src/main/resources/restCXFContext.xml
+++ b/core/rest-cxf/src/main/resources/restCXFContext.xml
@@ -131,7 +131,6 @@ under the License.
       </map>
     </property>
   </bean>
-  <bean id="sw2OpenAPI" class="org.apache.syncope.core.rest.cxf.SyncopeSwaggerToOpenApiConversionFilter"/>
 
   <jaxrs:server id="restContainer" address="/"
                 basePackages="org.apache.syncope.common.rest.api.service, org.apache.syncope.core.rest.cxf.service" 
@@ -160,7 +159,6 @@ under the License.
       <ref bean="addDomainFilter"/>
       <ref bean="addETagFilter"/>
       <ref bean="wadlGenerator"/>
-      <ref bean="sw2OpenAPI"/>
     </jaxrs:providers>
     <jaxrs:features>
       <ref bean="swagger2Feature"/>
diff --git a/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/WorkflowDefinitionFormat.java b/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/WorkflowDefinitionFormat.java
index f7d67f2..03de2f8 100644
--- a/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/WorkflowDefinitionFormat.java
+++ b/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/WorkflowDefinitionFormat.java
@@ -18,12 +18,23 @@
  */
 package org.apache.syncope.core.workflow.api;
 
+import javax.ws.rs.core.MediaType;
+
 /**
  * Format for import / export of workflow definition.
  */
 public enum WorkflowDefinitionFormat {
 
-    XML,
-    JSON
+    XML(MediaType.APPLICATION_XML_TYPE),
+    JSON(MediaType.APPLICATION_JSON_TYPE);
+
+    private final MediaType mediaType;
+
+    WorkflowDefinitionFormat(final MediaType mediaType) {
+        this.mediaType = mediaType;
+    }
 
+    public MediaType getMediaType() {
+        return mediaType;
+    }
 }
diff --git a/ext/scimv2/common-lib/src/main/java/org/apache/syncope/common/lib/scim/SCIMConf.java b/ext/scimv2/common-lib/src/main/java/org/apache/syncope/common/lib/scim/SCIMConf.java
index 1875eba..d6161cb 100644
--- a/ext/scimv2/common-lib/src/main/java/org/apache/syncope/common/lib/scim/SCIMConf.java
+++ b/ext/scimv2/common-lib/src/main/java/org/apache/syncope/common/lib/scim/SCIMConf.java
@@ -55,5 +55,4 @@ public class SCIMConf implements Serializable {
     public void setEnterpriseUserConf(final SCIMEnterpriseUserConf enterpriseUserConf) {
         this.enterpriseUserConf = enterpriseUserConf;
     }
-
 }
diff --git a/ext/scimv2/common-lib/src/main/java/org/apache/syncope/common/lib/scim/SCIMGeneralConf.java b/ext/scimv2/common-lib/src/main/java/org/apache/syncope/common/lib/scim/SCIMGeneralConf.java
index cf9bc71..fe29e94 100644
--- a/ext/scimv2/common-lib/src/main/java/org/apache/syncope/common/lib/scim/SCIMGeneralConf.java
+++ b/ext/scimv2/common-lib/src/main/java/org/apache/syncope/common/lib/scim/SCIMGeneralConf.java
@@ -100,5 +100,4 @@ public class SCIMGeneralConf implements Serializable {
     public void setFilterMaxResults(final int filterMaxResults) {
         this.filterMaxResults = filterMaxResults;
     }
-
 }
diff --git a/ext/scimv2/common-lib/src/main/java/org/apache/syncope/common/lib/scim/SCIMUserConf.java b/ext/scimv2/common-lib/src/main/java/org/apache/syncope/common/lib/scim/SCIMUserConf.java
index c2c0d15..1ed62a9 100644
--- a/ext/scimv2/common-lib/src/main/java/org/apache/syncope/common/lib/scim/SCIMUserConf.java
+++ b/ext/scimv2/common-lib/src/main/java/org/apache/syncope/common/lib/scim/SCIMUserConf.java
@@ -191,5 +191,4 @@ public class SCIMUserConf implements Serializable {
     public List<String> getX509Certificates() {
         return x509Certificates;
     }
-
 }
diff --git a/ext/scimv2/common-lib/src/main/java/org/apache/syncope/common/lib/scim/SCIMUserNameConf.java b/ext/scimv2/common-lib/src/main/java/org/apache/syncope/common/lib/scim/SCIMUserNameConf.java
index 2af8005..1f632f0 100644
--- a/ext/scimv2/common-lib/src/main/java/org/apache/syncope/common/lib/scim/SCIMUserNameConf.java
+++ b/ext/scimv2/common-lib/src/main/java/org/apache/syncope/common/lib/scim/SCIMUserNameConf.java
@@ -23,7 +23,11 @@ import java.io.Serializable;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
 
+@XmlRootElement(name = "scimUserNameConf")
+@XmlType
 public class SCIMUserNameConf implements Serializable {
 
     private static final long serialVersionUID = -2256008193008290376L;
@@ -113,5 +117,4 @@ public class SCIMUserNameConf implements Serializable {
     public void setHonorificSuffix(final String honorificSuffix) {
         this.honorificSuffix = honorificSuffix;
     }
-
 }
diff --git a/fit/core-reference/pom.xml b/fit/core-reference/pom.xml
index a4d0f51..6776d05 100644
--- a/fit/core-reference/pom.xml
+++ b/fit/core-reference/pom.xml
@@ -266,6 +266,16 @@ under the License.
       <!-- By default, only core IT cases are run, use the 'full-it' profile for running all IT cases -->
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <inherited>true</inherited>
+        <configuration>
+          <systemPropertyVariables>
+            <jaxrsContentType>${jaxrs.content.type}</jaxrsContentType>
+          </systemPropertyVariables>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-failsafe-plugin</artifactId>
         <inherited>true</inherited>
         <configuration>
diff --git a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/SyslogRewriteAuditAppender.java b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/SyslogRewriteAuditAppender.java
index 0f9fa20..7f16967 100644
--- a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/SyslogRewriteAuditAppender.java
+++ b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/SyslogRewriteAuditAppender.java
@@ -35,27 +35,21 @@ public class SyslogRewriteAuditAppender extends DefaultRewriteAuditAppender {
     @Override
     public Set<AuditLoggerName> getEvents() {
         Set<AuditLoggerName> events = new HashSet<>();
-        events.add(
-                new AuditLoggerName(
-                        AuditElements.EventCategoryType.LOGIC,
-                        ResourceLogic.class.getSimpleName(),
-                        null,
-                        "update",
-                        AuditElements.Result.SUCCESS));
-        events.add(
-                new AuditLoggerName(
-                        AuditElements.EventCategoryType.LOGIC,
-                        ConnectorLogic.class.getSimpleName(),
-                        null,
-                        "update",
-                        AuditElements.Result.SUCCESS));
-        events.add(
-                new AuditLoggerName(
-                        AuditElements.EventCategoryType.LOGIC,
-                        ResourceLogic.class.getSimpleName(),
-                        null,
-                        "delete",
-                        AuditElements.Result.SUCCESS));
+        events.add(new AuditLoggerName.Builder().
+                type(AuditElements.EventCategoryType.LOGIC).
+                category(ResourceLogic.class.getSimpleName()).
+                event("update").
+                result(AuditElements.Result.SUCCESS).build());
+        events.add(new AuditLoggerName.Builder().
+                type(AuditElements.EventCategoryType.LOGIC).
+                category(ConnectorLogic.class.getSimpleName()).
+                event("update").
+                result(AuditElements.Result.SUCCESS).build());
+        events.add(new AuditLoggerName.Builder().
+                type(AuditElements.EventCategoryType.LOGIC).
+                category(ResourceLogic.class.getSimpleName()).
+                event("delete").
+                result(AuditElements.Result.SUCCESS).build());
         return events;
     }
 
diff --git a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestFileAuditAppender.java b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestFileAuditAppender.java
index cc9cd3e..44b54e5 100644
--- a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestFileAuditAppender.java
+++ b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestFileAuditAppender.java
@@ -38,20 +38,16 @@ public class TestFileAuditAppender extends DefaultAuditAppender {
     @Override
     public Set<AuditLoggerName> getEvents() {
         Set<AuditLoggerName> events = new HashSet<>();
-        events.add(
-                new AuditLoggerName(
-                        AuditElements.EventCategoryType.LOGIC,
-                        ResourceLogic.class.getSimpleName(),
-                        null,
-                        "create",
-                        AuditElements.Result.SUCCESS));
-        events.add(
-                new AuditLoggerName(
-                        AuditElements.EventCategoryType.LOGIC,
-                        ConnectorLogic.class.getSimpleName(),
-                        null,
-                        "update",
-                        AuditElements.Result.SUCCESS));
+        events.add(new AuditLoggerName.Builder().
+                type(AuditElements.EventCategoryType.LOGIC).
+                category(ResourceLogic.class.getSimpleName()).
+                event("create").
+                result(AuditElements.Result.SUCCESS).build());
+        events.add(new AuditLoggerName.Builder().
+                type(AuditElements.EventCategoryType.LOGIC).
+                category(ConnectorLogic.class.getSimpleName()).
+                event("update").
+                result(AuditElements.Result.SUCCESS).build());
         return events;
     }
 
diff --git a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestFileRewriteAuditAppender.java b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestFileRewriteAuditAppender.java
index 8ce0d99..0816ff2 100644
--- a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestFileRewriteAuditAppender.java
+++ b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestFileRewriteAuditAppender.java
@@ -18,7 +18,7 @@
  */
 package org.apache.syncope.fit.core.reference;
 
-import java.util.HashSet;
+import java.util.Collections;
 import java.util.Set;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.logging.log4j.LogManager;
@@ -36,15 +36,11 @@ public class TestFileRewriteAuditAppender extends DefaultRewriteAuditAppender {
 
     @Override
     public Set<AuditLoggerName> getEvents() {
-        Set<AuditLoggerName> events = new HashSet<>();
-        events.add(
-                new AuditLoggerName(
-                        AuditElements.EventCategoryType.LOGIC,
-                        ResourceLogic.class.getSimpleName(),
-                        null,
-                        "update",
-                        AuditElements.Result.SUCCESS));
-        return events;
+        return Collections.singleton(new AuditLoggerName.Builder().
+                type(AuditElements.EventCategoryType.LOGIC).
+                category(ResourceLogic.class.getSimpleName()).
+                event("update").
+                result(AuditElements.Result.SUCCESS).build());
     }
 
     @Override
diff --git a/fit/core-reference/src/main/resources/jboss/restCXFContext.xml b/fit/core-reference/src/main/resources/jboss/restCXFContext.xml
index 89fbd19..59dcdd3 100644
--- a/fit/core-reference/src/main/resources/jboss/restCXFContext.xml
+++ b/fit/core-reference/src/main/resources/jboss/restCXFContext.xml
@@ -145,7 +145,6 @@ under the License.
       </map>
     </property>
   </bean>
-  <bean id="sw2OpenAPI" class="org.apache.syncope.core.rest.cxf.SyncopeSwaggerToOpenApiConversionFilter"/>
 
   <jaxrs:server id="restContainer" address="/"
                 basePackages="org.apache.syncope.common.rest.api.service, org.apache.syncope.core.rest.cxf.service" 
@@ -174,7 +173,6 @@ under the License.
       <ref bean="addDomainFilter"/>
       <ref bean="addETagFilter"/>
       <ref bean="wadlGenerator"/>
-      <ref bean="sw2OpenAPI"/>
     </jaxrs:providers>
     <jaxrs:features>
       <ref bean="swagger2Feature"/>
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuthenticationITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuthenticationITCase.java
index 0c64d12..5e10fe1 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuthenticationITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuthenticationITCase.java
@@ -23,6 +23,8 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeFalse;
+import static org.junit.Assume.assumeTrue;
 
 import java.security.AccessControlException;
 import java.util.HashSet;
@@ -40,6 +42,7 @@ import org.apache.syncope.client.lib.AnonymousAuthenticationHandler;
 import org.apache.syncope.client.lib.BasicAuthenticationHandler;
 import org.apache.syncope.client.lib.SyncopeClient;
 import org.apache.syncope.common.lib.EntityTOUtils;
+import org.apache.syncope.client.lib.SyncopeClientFactoryBean;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.patch.DeassociationPatch;
@@ -498,7 +501,8 @@ public class AuthenticationITCase extends AbstractITCase {
 
     @Test
     public void issueSYNCOPE434() {
-        Assume.assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
+        assumeFalse(clientFactory.getContentType() == SyncopeClientFactoryBean.ContentType.XML);
+        assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
 
         // 1. create user with group 'groupForWorkflowApproval' 
         // (users with group groupForWorkflowApproval are defined in workflow as subject to approval)
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/DerSchemaITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/DerSchemaITCase.java
index f1dc795..e1858a4 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/DerSchemaITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/DerSchemaITCase.java
@@ -28,6 +28,7 @@ import java.util.List;
 import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.DerSchemaTO;
+import org.apache.syncope.common.lib.to.SchemaTO;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.lib.types.EntityViolationType;
 import org.apache.syncope.common.lib.types.SchemaType;
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java
index 7e79efe..564633f 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java
@@ -136,12 +136,11 @@ public class LoggerITCase extends AbstractITCase {
 
     @Test
     public void enableDisableAudit() {
-        AuditLoggerName auditLoggerName = new AuditLoggerName(
-                EventCategoryType.LOGIC,
-                ReportLogic.class.getSimpleName(),
-                null,
-                "deleteExecution",
-                AuditElements.Result.FAILURE);
+        AuditLoggerName auditLoggerName = new AuditLoggerName.Builder().
+                type(EventCategoryType.LOGIC).
+                category(ReportLogic.class.getSimpleName()).
+                event("deleteExecution").
+                result(AuditElements.Result.FAILURE).build();
 
         List<AuditLoggerName> audits = LoggerWrapper.wrap(loggerService.list(LoggerType.AUDIT));
         assertNotNull(audits);
@@ -275,21 +274,19 @@ public class LoggerITCase extends AbstractITCase {
 
     @Test
     public void customAuditAppender() throws IOException, InterruptedException {
-        AuditLoggerName auditLoggerResUpd = new AuditLoggerName(
-                EventCategoryType.LOGIC,
-                ResourceLogic.class.getSimpleName(),
-                null,
-                "update",
-                AuditElements.Result.SUCCESS);
+        AuditLoggerName auditLoggerResUpd = new AuditLoggerName.Builder().
+                type(EventCategoryType.LOGIC).
+                category(ResourceLogic.class.getSimpleName()).
+                event("update").
+                result(AuditElements.Result.SUCCESS).build();
         LoggerTO resUpd = new LoggerTO();
         resUpd.setKey(auditLoggerResUpd.toLoggerName());
 
-        AuditLoggerName auditLoggerConnUpd = new AuditLoggerName(
-                EventCategoryType.LOGIC,
-                ConnectorLogic.class.getSimpleName(),
-                null,
-                "update",
-                AuditElements.Result.SUCCESS);
+        AuditLoggerName auditLoggerConnUpd = new AuditLoggerName.Builder().
+                type(EventCategoryType.LOGIC).
+                category(ConnectorLogic.class.getSimpleName()).
+                event("update").
+                result(AuditElements.Result.SUCCESS).build();
         LoggerTO connUpd = new LoggerTO();
         connUpd.setKey(auditLoggerConnUpd.toLoggerName());
 
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
index ae9ab69..13b268a 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
@@ -80,7 +80,6 @@ import org.apache.syncope.common.rest.api.beans.AnyQuery;
 import org.apache.syncope.common.rest.api.beans.TaskQuery;
 import org.apache.syncope.common.rest.api.service.ConnectorService;
 import org.apache.syncope.common.rest.api.service.TaskService;
-import org.apache.syncope.core.provisioning.api.pushpull.ProvisioningReport;
 import org.apache.syncope.core.provisioning.java.pushpull.DBPasswordPullActions;
 import org.apache.syncope.core.provisioning.java.pushpull.LDAPPasswordPullActions;
 import org.apache.syncope.core.spring.security.Encryptor;
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ReportITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ReportITCase.java
index ea4bef5..fa29d48 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ReportITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ReportITCase.java
@@ -251,12 +251,11 @@ public class ReportITCase extends AbstractITCase {
 
     @Test
     public void auditReport() throws IOException {
-        AuditLoggerName auditLoggerName = new AuditLoggerName(
-                AuditElements.EventCategoryType.LOGIC,
-                "UserLogic",
-                null,
-                "selfRead",
-                AuditElements.Result.SUCCESS);
+        AuditLoggerName auditLoggerName = new AuditLoggerName.Builder().
+                type(AuditElements.EventCategoryType.LOGIC).
+                category("UserLogic").
+                event("selfRead").
+                result(AuditElements.Result.SUCCESS).build();
 
         try {
             LoggerTO loggerTO = new LoggerTO();
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SCIMITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SCIMITCase.java
index 693c85b..ae37b46 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SCIMITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SCIMITCase.java
@@ -23,6 +23,7 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.node.ArrayNode;
@@ -39,6 +40,7 @@ import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.Response;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.syncope.client.lib.SyncopeClientFactoryBean;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.scim.SCIMComplexConf;
 import org.apache.syncope.common.lib.scim.SCIMConf;
@@ -65,7 +67,7 @@ import org.apache.syncope.ext.scimv2.api.type.Resource;
 import org.apache.syncope.ext.scimv2.cxf.JacksonSCIMJsonProvider;
 import org.apache.syncope.fit.AbstractITCase;
 import org.apache.syncope.fit.SCIMDetector;
-import org.junit.Assume;
+import org.junit.Before;
 import org.junit.Test;
 
 public class SCIMITCase extends AbstractITCase {
@@ -112,10 +114,14 @@ public class SCIMITCase extends AbstractITCase {
                 header(HttpHeaders.AUTHORIZATION, "Bearer " + adminClient.getJWT());
     }
 
+    @Before
+    public void check() {
+        assumeTrue(clientFactory.getContentType() == SyncopeClientFactoryBean.ContentType.JSON);
+        assumeTrue(SCIMDetector.isSCIMAvailable(webClient()));
+    }
+
     @Test
     public void serviceProviderConfig() {
-        Assume.assumeTrue(SCIMDetector.isSCIMAvailable(webClient()));
-
         Response response = webClient().path("ServiceProviderConfig").get();
         assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
         assertEquals(
@@ -133,8 +139,6 @@ public class SCIMITCase extends AbstractITCase {
 
     @Test
     public void resourceTypes() {
-        Assume.assumeTrue(SCIMDetector.isSCIMAvailable(webClient()));
-
         Response response = webClient().path("ResourceTypes").get();
         assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
         assertEquals(
@@ -157,8 +161,6 @@ public class SCIMITCase extends AbstractITCase {
 
     @Test
     public void schemas() {
-        Assume.assumeTrue(SCIMDetector.isSCIMAvailable(webClient()));
-
         Response response = webClient().path("Schemas").get();
         assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
         assertEquals(
@@ -182,8 +184,6 @@ public class SCIMITCase extends AbstractITCase {
 
     @Test
     public void read() throws IOException {
-        Assume.assumeTrue(SCIMDetector.isSCIMAvailable(webClient()));
-
         Response response = webClient().path("Users").path("missing").get();
         assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatus());
 
@@ -220,8 +220,6 @@ public class SCIMITCase extends AbstractITCase {
 
     @Test
     public void conf() {
-        Assume.assumeTrue(SCIMDetector.isSCIMAvailable(webClient()));
-
         SCIMConf conf = scimConfService.get();
         assertNotNull(conf);
 
@@ -240,8 +238,6 @@ public class SCIMITCase extends AbstractITCase {
 
     @Test
     public void list() throws IOException {
-        Assume.assumeTrue(SCIMDetector.isSCIMAvailable(webClient()));
-
         Response response = webClient().path("Groups").query("count", 1100000).get();
         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus());
         SCIMError error = response.readEntity(SCIMError.class);
@@ -271,8 +267,6 @@ public class SCIMITCase extends AbstractITCase {
 
     @Test
     public void search() {
-        Assume.assumeTrue(SCIMDetector.isSCIMAvailable(webClient()));
-
         // invalid filter
         Response response = webClient().path("Groups").query("filter", "invalid").get();
         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus());
@@ -359,8 +353,6 @@ public class SCIMITCase extends AbstractITCase {
 
     @Test
     public void createUser() throws JsonProcessingException {
-        Assume.assumeTrue(SCIMDetector.isSCIMAvailable(webClient()));
-
         scimConfService.set(CONF);
 
         SCIMUser user = getSampleUser(UUID.randomUUID().toString());
@@ -389,8 +381,6 @@ public class SCIMITCase extends AbstractITCase {
 
     @Test
     public void replaceUser() {
-        Assume.assumeTrue(SCIMDetector.isSCIMAvailable(webClient()));
-
         scimConfService.set(CONF);
 
         SCIMUser user = getSampleUser(UUID.randomUUID().toString());
@@ -412,8 +402,6 @@ public class SCIMITCase extends AbstractITCase {
 
     @Test
     public void deleteUser() {
-        Assume.assumeTrue(SCIMDetector.isSCIMAvailable(webClient()));
-
         scimConfService.set(CONF);
 
         SCIMUser user = getSampleUser(UUID.randomUUID().toString());
@@ -436,8 +424,6 @@ public class SCIMITCase extends AbstractITCase {
 
     @Test
     public void createGroup() {
-        Assume.assumeTrue(SCIMDetector.isSCIMAvailable(webClient()));
-
         String displayName = UUID.randomUUID().toString();
 
         SCIMGroup group = new SCIMGroup(null, null, displayName);
@@ -470,8 +456,6 @@ public class SCIMITCase extends AbstractITCase {
 
     @Test
     public void replaceGroup() {
-        Assume.assumeTrue(SCIMDetector.isSCIMAvailable(webClient()));
-
         SCIMGroup group = new SCIMGroup(null, null, UUID.randomUUID().toString());
         group.getMembers().add(new Member("b3cbc78d-32e6-4bd4-92e0-bbe07566a2ee", null, null));
         Response response = webClient().path("Groups").post(group);
@@ -505,8 +489,6 @@ public class SCIMITCase extends AbstractITCase {
 
     @Test
     public void deleteGroup() {
-        Assume.assumeTrue(SCIMDetector.isSCIMAvailable(webClient()));
-
         SCIMGroup group = new SCIMGroup(null, null, UUID.randomUUID().toString());
         Response response = webClient().path("Groups").post(group);
         assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatus());
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SchedTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SchedTaskITCase.java
index ec1fe71..216a854 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SchedTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SchedTaskITCase.java
@@ -24,6 +24,8 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeFalse;
+import static org.junit.Assume.assumeTrue;
 
 import java.util.Date;
 import java.util.List;
@@ -32,6 +34,7 @@ import javax.ws.rs.core.Response;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.time.DateUtils;
+import org.apache.syncope.client.lib.SyncopeClientFactoryBean;
 import org.apache.syncope.common.lib.to.JobTO;
 import org.apache.syncope.common.lib.to.PagedResult;
 import org.apache.syncope.common.lib.to.PushTaskTO;
@@ -50,7 +53,6 @@ import org.apache.syncope.common.rest.api.beans.WorkflowFormQuery;
 import org.apache.syncope.common.rest.api.service.TaskService;
 import org.apache.syncope.fit.ActivitiDetector;
 import org.apache.syncope.fit.core.reference.TestSampleJobDelegate;
-import org.junit.Assume;
 import org.junit.Test;
 
 public class SchedTaskITCase extends AbstractTaskITCase {
@@ -135,7 +137,8 @@ public class SchedTaskITCase extends AbstractTaskITCase {
 
     @Test
     public void recertification() {
-        Assume.assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
+        assumeFalse(clientFactory.getContentType() == SyncopeClientFactoryBean.ContentType.XML);
+        assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
 
         execTask(taskService, TaskType.SCHEDULED, "e95555d2-1b09-42c8-b25b-f4c4ec598989", "JOB_FIRED", 50, false);
 
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserSelfITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserSelfITCase.java
index cb4678e..4cdc7ba 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserSelfITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserSelfITCase.java
@@ -18,8 +18,6 @@
  */
 package org.apache.syncope.fit.core;
 
-import org.apache.syncope.fit.ActivitiDetector;
-
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
@@ -27,6 +25,8 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeFalse;
+import static org.junit.Assume.assumeTrue;
 
 import java.util.Map;
 import java.util.Set;
@@ -37,6 +37,7 @@ import javax.ws.rs.core.Response;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.lib.SyncopeClient;
+import org.apache.syncope.client.lib.SyncopeClientFactoryBean;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.patch.BooleanReplacePatchItem;
 import org.apache.syncope.common.lib.patch.MembershipPatch;
@@ -57,8 +58,8 @@ import org.apache.syncope.common.rest.api.service.AccessTokenService;
 import org.apache.syncope.common.rest.api.service.UserSelfService;
 import org.apache.syncope.common.rest.api.service.UserService;
 import org.apache.syncope.fit.AbstractITCase;
+import org.apache.syncope.fit.ActivitiDetector;
 import org.apache.syncope.fit.ElasticsearchDetector;
-import org.junit.Assume;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -80,7 +81,8 @@ public class UserSelfITCase extends AbstractITCase {
 
     @Test
     public void create() {
-        Assume.assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
+        assumeFalse(clientFactory.getContentType() == SyncopeClientFactoryBean.ContentType.XML);
+        assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
 
         // 1. self-registration as admin: failure
         try {
@@ -102,7 +104,8 @@ public class UserSelfITCase extends AbstractITCase {
 
     @Test
     public void createAndApprove() {
-        Assume.assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
+        assumeFalse(clientFactory.getContentType() == SyncopeClientFactoryBean.ContentType.XML);
+        assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
 
         // 1. self-create user with membership: goes 'createApproval' with resources and membership but no propagation
         UserTO userTO = UserITCase.getUniqueSampleTO("anonymous@syncope.apache.org");
@@ -139,7 +142,8 @@ public class UserSelfITCase extends AbstractITCase {
 
     @Test
     public void createAndUnclaim() {
-        Assume.assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
+        assumeFalse(clientFactory.getContentType() == SyncopeClientFactoryBean.ContentType.XML);
+        assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
 
         // 1. self-create user with membership: goes 'createApproval' with resources and membership but no propagation
         UserTO userTO = UserITCase.getUniqueSampleTO("anonymous@syncope.apache.org");
@@ -238,7 +242,8 @@ public class UserSelfITCase extends AbstractITCase {
 
     @Test
     public void updateWithApproval() {
-        Assume.assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
+        assumeFalse(clientFactory.getContentType() == SyncopeClientFactoryBean.ContentType.XML);
+        assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
 
         // 1. create user as admin
         UserTO created = createUser(UserITCase.getUniqueSampleTO("anonymous@syncope.apache.org")).getEntity();
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java
index cbbce1f..6520433 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java
@@ -26,6 +26,8 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeFalse;
+import static org.junit.Assume.assumeTrue;
 
 import java.util.Collections;
 import java.util.List;
@@ -35,6 +37,7 @@ import javax.ws.rs.core.Response;
 import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.client.lib.SyncopeClient;
+import org.apache.syncope.client.lib.SyncopeClientFactoryBean;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.patch.MembershipPatch;
 import org.apache.syncope.common.lib.patch.PasswordPatch;
@@ -53,7 +56,6 @@ import org.apache.syncope.common.rest.api.beans.WorkflowFormQuery;
 import org.apache.syncope.common.rest.api.service.UserSelfService;
 import org.apache.syncope.common.rest.api.service.UserWorkflowService;
 import org.apache.syncope.fit.AbstractITCase;
-import org.junit.Assume;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -71,7 +73,8 @@ public class UserWorkflowITCase extends AbstractITCase {
 
     @Test
     public void createWithReject() {
-        Assume.assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
+        assumeFalse(clientFactory.getContentType() == SyncopeClientFactoryBean.ContentType.XML);
+        assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
 
         UserTO userTO = UserITCase.getUniqueSampleTO("createWithReject@syncope.apache.org");
         userTO.getResources().add(RESOURCE_NAME_TESTDB);
@@ -157,7 +160,8 @@ public class UserWorkflowITCase extends AbstractITCase {
 
     @Test
     public void createWithApproval() {
-        Assume.assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
+        assumeFalse(clientFactory.getContentType() == SyncopeClientFactoryBean.ContentType.XML);
+        assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
 
         // read forms *before* any operation
         PagedResult<WorkflowFormTO> forms =
@@ -242,7 +246,8 @@ public class UserWorkflowITCase extends AbstractITCase {
 
     @Test
     public void createAndUnclaim() {
-        Assume.assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
+        assumeFalse(clientFactory.getContentType() == SyncopeClientFactoryBean.ContentType.XML);
+        assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
 
         // read forms *before* any operation
         PagedResult<WorkflowFormTO> forms =
@@ -353,7 +358,8 @@ public class UserWorkflowITCase extends AbstractITCase {
 
     @Test
     public void updateApproval() {
-        Assume.assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
+        assumeFalse(clientFactory.getContentType() == SyncopeClientFactoryBean.ContentType.XML);
+        assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
 
         // read forms *before* any operation
         PagedResult<WorkflowFormTO> forms = userWorkflowService.getForms(
@@ -410,7 +416,8 @@ public class UserWorkflowITCase extends AbstractITCase {
 
     @Test
     public void availableTasks() {
-        Assume.assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
+        assumeFalse(clientFactory.getContentType() == SyncopeClientFactoryBean.ContentType.XML);
+        assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
 
         UserTO user = createUser(UserITCase.getUniqueSampleTO("availableTasks@apache.org")).getEntity();
         assertEquals("active", user.getStatus());
@@ -442,7 +449,8 @@ public class UserWorkflowITCase extends AbstractITCase {
 
     @Test
     public void issueSYNCOPE15() {
-        Assume.assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
+        assumeFalse(clientFactory.getContentType() == SyncopeClientFactoryBean.ContentType.XML);
+        assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
 
         // read forms *before* any operation
         PagedResult<WorkflowFormTO> forms = userWorkflowService.getForms(