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 2018/11/07 12:38:50 UTC

[syncope] branch master updated: [SYNCOPE-1392] Removal of ReflectionToStringBuilder and reflection-based EqualsBuilder and HashCodeBuilder from Common Lib and Console

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 1fd1ffd  [SYNCOPE-1392] Removal of ReflectionToStringBuilder and reflection-based EqualsBuilder and HashCodeBuilder from Common Lib and Console
1fd1ffd is described below

commit 1fd1ffdfc1ada531ed190e404c7d883099169b71
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Wed Nov 7 13:32:30 2018 +0100

    [SYNCOPE-1392] Removal of ReflectionToStringBuilder and reflection-based EqualsBuilder and HashCodeBuilder from Common Lib and Console
---
 .../client/console/commons/status/StatusBean.java  | 44 +++++++++++++---
 .../client/console/panels/AbstractLogsPanel.java   |  4 +-
 .../client/console/panels/HistoryConfList.java     |  4 +-
 .../client/console/panels/TypesDirectoryPanel.java |  4 +-
 .../client/console/panels/search/SearchClause.java | 41 ++++++++++++---
 .../syncope/client/console/status/StatusModal.java |  4 +-
 .../client/console/widgets/reconciliation/Any.java |  4 +-
 .../console/widgets/reconciliation/Anys.java       |  4 +-
 .../console/widgets/reconciliation/Missing.java    |  5 +-
 .../reconciliation/ReconciliationReport.java       |  4 +-
 .../wizards/resources/AbstractConnConfPanel.java   |  4 +-
 .../syncope/common/lib/AbstractBaseBean.java       | 55 --------------------
 .../syncope/common/lib/info/JavaImplInfo.java      |  5 +-
 .../syncope/common/lib/info/NumbersInfo.java       | 56 ++++++++++++++++++--
 .../syncope/common/lib/info/PlatformInfo.java      |  4 +-
 .../apache/syncope/common/lib/info/SystemInfo.java |  6 +--
 .../syncope/common/lib/log/EventCategory.java      |  4 +-
 .../apache/syncope/common/lib/log/LogAppender.java |  5 +-
 .../syncope/common/lib/log/LogStatement.java       |  4 +-
 .../apache/syncope/common/lib/log/LoggerTO.java    | 32 +++++++++++-
 .../syncope/common/lib/patch/AbstractPatch.java    | 29 ++++++++++-
 .../common/lib/patch/AbstractPatchItem.java        | 28 ++++++++++
 .../common/lib/patch/AbstractReplacePatchItem.java |  1 -
 .../syncope/common/lib/patch/AnyObjectPatch.java   | 31 +++++++++++
 .../apache/syncope/common/lib/patch/AnyPatch.java  | 42 ++++++++++++++-
 .../syncope/common/lib/patch/AssociationPatch.java | 30 +++++++++++
 .../apache/syncope/common/lib/patch/AttrPatch.java | 28 ++++++++++
 .../common/lib/patch/BooleanReplacePatchItem.java  |  1 -
 .../common/lib/patch/DeassociationPatch.java       |  4 +-
 .../syncope/common/lib/patch/GroupPatch.java       | 37 +++++++++++++
 .../syncope/common/lib/patch/LongPatchItem.java    |  1 -
 .../syncope/common/lib/patch/MembershipPatch.java  | 32 ++++++++++++
 .../syncope/common/lib/patch/PasswordPatch.java    | 29 +++++++++++
 .../common/lib/patch/RelationshipPatch.java        | 27 ++++++++++
 .../lib/patch/ResourceDeassociationPatch.java      |  4 +-
 .../syncope/common/lib/patch/StatusPatch.java      | 31 +++++++++++
 .../syncope/common/lib/patch/StringPatchItem.java  |  1 -
 .../common/lib/patch/StringReplacePatchItem.java   |  1 -
 .../apache/syncope/common/lib/patch/UserPatch.java | 41 +++++++++++++++
 .../common/lib/policy/AbstractAccountRuleConf.java |  4 +-
 .../lib/policy/AbstractCorrelationRuleConf.java    |  4 +-
 .../lib/policy/AbstractPasswordRuleConf.java       |  4 +-
 .../apache/syncope/common/lib/policy/PolicyTO.java |  3 +-
 .../common/lib/report/AbstractReportletConf.java   |  4 +-
 .../common/lib/to/AbstractAnnotatedBean.java       | 34 +++++++++++-
 .../syncope/common/lib/to/AbstractHistoryConf.java |  4 +-
 .../common/lib/to/AbstractStartEndBean.java        | 32 +++++++++++-
 .../syncope/common/lib/to/AccessTokenTO.java       |  3 +-
 .../apache/syncope/common/lib/to/AnyObjectTO.java  | 34 ++++++++++++
 .../org/apache/syncope/common/lib/to/AnyTO.java    | 45 ++++++++++++++++
 .../syncope/common/lib/to/AnyTypeClassTO.java      |  3 +-
 .../apache/syncope/common/lib/to/AnyTypeTO.java    |  3 +-
 .../syncope/common/lib/to/ApplicationTO.java       |  3 +-
 .../org/apache/syncope/common/lib/to/AttrTO.java   | 32 +++++++++++-
 .../apache/syncope/common/lib/to/ConnBundleTO.java |  4 +-
 .../syncope/common/lib/to/ConnIdObjectClassTO.java |  4 +-
 .../syncope/common/lib/to/ConnInstanceTO.java      |  3 +-
 .../apache/syncope/common/lib/to/ConnObjectTO.java | 30 ++++++++++-
 .../syncope/common/lib/to/ConnPoolConfTO.java      |  4 +-
 .../apache/syncope/common/lib/to/DerSchemaTO.java  | 28 ++++++++++
 .../org/apache/syncope/common/lib/to/DomainTO.java |  3 +-
 .../apache/syncope/common/lib/to/DynRealmTO.java   |  3 +-
 .../org/apache/syncope/common/lib/to/ErrorTO.java  |  4 +-
 .../org/apache/syncope/common/lib/to/ExecTO.java   | 38 ++++++++++++++
 .../org/apache/syncope/common/lib/to/GroupTO.java  | 37 +++++++++++++
 .../syncope/common/lib/to/ImplementationTO.java    | 34 +++++++++++-
 .../org/apache/syncope/common/lib/to/ItemTO.java   |  3 +-
 .../org/apache/syncope/common/lib/to/JobTO.java    |  4 +-
 .../syncope/common/lib/to/MailTemplateTO.java      |  3 +-
 .../apache/syncope/common/lib/to/MappingTO.java    |  4 +-
 .../apache/syncope/common/lib/to/MembershipTO.java | 38 +++++++++++++-
 .../syncope/common/lib/to/NotificationTO.java      | 53 ++++++++++++++++++-
 .../syncope/common/lib/to/NotificationTaskTO.java  | 46 +++++++++++++++++
 .../apache/syncope/common/lib/to/OrgUnitTO.java    |  3 +-
 .../common/lib/to/PagedConnObjectTOResult.java     | 37 ++++++++++++-
 .../apache/syncope/common/lib/to/PagedResult.java  | 40 ++++++++++++++-
 .../syncope/common/lib/to/PlainSchemaTO.java       | 49 ++++++++++++++++++
 .../apache/syncope/common/lib/to/PrivilegeTO.java  |  3 +-
 .../syncope/common/lib/to/PropagationStatus.java   | 38 +++++++++++++-
 .../syncope/common/lib/to/PropagationTaskTO.java   | 44 ++++++++++++++++
 .../apache/syncope/common/lib/to/ProvisionTO.java  |  3 +-
 .../syncope/common/lib/to/ProvisioningResult.java  | 34 ++++++++++--
 .../syncope/common/lib/to/ProvisioningTaskTO.java  | 42 +++++++++++++++
 .../apache/syncope/common/lib/to/PullTaskTO.java   | 33 ++++++++++++
 .../apache/syncope/common/lib/to/PushTaskTO.java   | 30 +++++++++++
 .../org/apache/syncope/common/lib/to/RealmTO.java  |  3 +-
 .../apache/syncope/common/lib/to/ReconStatus.java  |  4 +-
 .../syncope/common/lib/to/RelationshipTO.java      | 36 ++++++++++++-
 .../syncope/common/lib/to/RelationshipTypeTO.java  |  3 +-
 .../syncope/common/lib/to/RemediationTO.java       |  4 +-
 .../org/apache/syncope/common/lib/to/ReportTO.java | 45 ++++++++++++++++
 .../syncope/common/lib/to/ReportTemplateTO.java    |  3 +-
 .../common/lib/to/ResourceHistoryConfTO.java       |  1 -
 .../apache/syncope/common/lib/to/ResourceTO.java   |  3 +-
 .../org/apache/syncope/common/lib/to/RoleTO.java   |  3 +-
 .../apache/syncope/common/lib/to/SchedTaskTO.java  | 42 +++++++++++++++
 .../org/apache/syncope/common/lib/to/SchemaTO.java | 35 ++++++++++++-
 .../syncope/common/lib/to/SecurityQuestionTO.java  | 30 ++++++++++-
 .../org/apache/syncope/common/lib/to/TaskTO.java   | 34 ++++++++++++
 .../syncope/common/lib/to/TypeExtensionTO.java     | 31 ++++++++++-
 .../org/apache/syncope/common/lib/to/UserTO.java   | 60 +++++++++++++++++++++-
 .../apache/syncope/common/lib/to/VirSchemaTO.java  | 33 ++++++++++++
 .../syncope/common/lib/types/AuditLoggerName.java  | 38 +++++++++++++-
 .../common/lib/types/ConnConfPropSchema.java       | 42 +++++++--------
 .../syncope/common/lib/types/ConnConfProperty.java | 34 +++++++++++-
 .../org/apache/syncope/common/lib/JAXBTest.java    |  2 +-
 .../syncope/common/rest/api/LoggerWrapper.java     | 13 +++--
 .../common/rest/api/batch/BatchPayloadLine.java    | 24 +++++++--
 .../common/rest/api/beans/AbstractQuery.java       |  4 +-
 .../rest/api/beans/ConnObjectTOListQuery.java      | 19 -------
 .../common/rest/api/beans/ExecDeleteQuery.java     |  4 +-
 .../common/rest/api/beans/ExecuteQuery.java        |  4 +-
 .../syncope/common/rest/api/beans/SchemaQuery.java |  4 +-
 .../core/logic/AbstractExecutableLogic.java        |  4 +-
 .../syncope/core/logic/AbstractJobLogic.java       |  4 +-
 .../apache/syncope/core/logic/AbstractLogic.java   |  4 +-
 .../core/logic/AbstractTransactionalLogic.java     |  4 +-
 .../syncope/core/logic/ConfigurationLogic.java     |  5 +-
 .../org/apache/syncope/core/logic/LoggerLogic.java |  5 +-
 .../syncope/core/logic/ReconciliationLogic.java    |  6 +--
 .../apache/syncope/core/logic/SyncopeLogic.java    |  7 ++-
 .../jpa/entity/AbstractPlainAttrValue.java         | 13 +++--
 .../api/pushpull/ProvisioningReport.java           | 13 +++--
 .../syncope/core/provisioning/java/AuditEntry.java |  4 +-
 .../core/rest/cxf/service/AbstractServiceImpl.java | 11 ++--
 .../apache/syncope/common/lib/to/CamelMetrics.java |  6 +--
 .../apache/syncope/common/lib/to/CamelRouteTO.java |  3 +-
 .../apache/syncope/common/lib/to/BpmnProcess.java  |  3 +-
 .../apache/syncope/common/lib/to/UserRequest.java  |  4 +-
 .../syncope/common/lib/to/UserRequestForm.java     |  4 +-
 .../common/lib/to/UserRequestFormProperty.java     |  4 +-
 .../apache/syncope/common/lib/to/WorkflowTask.java |  4 +-
 .../common/lib/to/WorkflowTaskExecInput.java       |  4 +-
 .../syncope/core/logic/UserRequestLogic.java       |  5 +-
 .../syncope/core/logic/UserWorkflowTaskLogic.java  |  6 +--
 .../syncope/common/lib/to/OIDCLoginRequestTO.java  |  4 +-
 .../syncope/common/lib/to/OIDCLoginResponseTO.java |  4 +-
 .../syncope/common/lib/to/OIDCLogoutRequestTO.java |  5 +-
 .../syncope/common/lib/to/OIDCProviderTO.java      |  3 +-
 .../apache/syncope/core/logic/OIDCClientLogic.java |  6 +--
 .../apache/syncope/common/lib/to/SAML2IdPTO.java   |  3 +-
 .../common/lib/to/SAML2LoginResponseTO.java        |  4 +-
 .../common/lib/to/SAML2ReceivedResponseTO.java     |  4 +-
 .../syncope/common/lib/to/SAML2RequestTO.java      |  4 +-
 .../syncope/core/logic/AbstractSAML2Logic.java     |  4 +-
 .../apache/syncope/core/logic/SAML2SPLogic.java    |  6 +--
 .../org/apache/syncope/core/logic/SCIMLogic.java   |  7 ++-
 147 files changed, 1966 insertions(+), 371 deletions(-)

diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusBean.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusBean.java
index fc834b5..3a5c766 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusBean.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusBean.java
@@ -21,8 +21,7 @@ package org.apache.syncope.client.console.commons.status;
 import java.io.Serializable;
 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.commons.lang3.builder.ToStringBuilder;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.GroupTO;
@@ -98,17 +97,48 @@ public class StatusBean implements Serializable {
     }
 
     @Override
-    public String toString() {
-        return ReflectionToStringBuilder.toString(this, ToStringStyle.JSON_STYLE);
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(key).
+                append(name).
+                append(resource).
+                append(connObjectLink).
+                append(status).
+                append(linked).
+                build();
     }
 
     @Override
     public boolean equals(final Object obj) {
-        return EqualsBuilder.reflectionEquals(this, obj);
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        final StatusBean other = (StatusBean) obj;
+        return new EqualsBuilder().
+                append(key, other.key).
+                append(name, other.name).
+                append(resource, other.resource).
+                append(connObjectLink, other.connObjectLink).
+                append(status, other.status).
+                append(linked, other.linked).
+                build();
     }
 
     @Override
-    public int hashCode() {
-        return HashCodeBuilder.reflectionHashCode(this);
+    public String toString() {
+        return new ToStringBuilder(this).
+                append(key).
+                append(name).
+                append(resource).
+                append(connObjectLink).
+                append(status).
+                append(linked).
+                build();
     }
 }
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractLogsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractLogsPanel.java
index 5246509..58e1a4e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractLogsPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractLogsPanel.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.client.console.panels;
 
+import java.io.Serializable;
 import java.util.Arrays;
 import java.util.List;
 import org.apache.commons.lang3.StringUtils;
@@ -26,7 +27,6 @@ import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.wicket.ajax.form.IndicatorAjaxFormComponentUpdatingBehavior;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.log.LoggerTO;
 import org.apache.syncope.common.lib.types.LoggerLevel;
@@ -42,7 +42,7 @@ import org.apache.wicket.model.util.ListModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public abstract class AbstractLogsPanel<T extends AbstractBaseBean> extends Panel {
+public abstract class AbstractLogsPanel<T extends Serializable> extends Panel {
 
     private static final Logger LOG = LoggerFactory.getLogger(AbstractLogsPanel.class);
 
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/HistoryConfList.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/HistoryConfList.java
index aa6880d..5848b7a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/HistoryConfList.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/HistoryConfList.java
@@ -20,10 +20,10 @@ package org.apache.syncope.client.console.panels;
 
 import java.io.Serializable;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.ConnInstanceHistoryConfTO;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.ResourceHistoryConfTO;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -38,7 +38,7 @@ public class HistoryConfList<T extends Serializable> extends Panel implements Mo
             final BaseModal<?> baseModal,
             final String entityKey,
             final PageReference pageReference,
-            final AbstractBaseBean modelObj) {
+            final EntityTO modelObj) {
 
         super(BaseModal.CONTENT_ID);
 
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/TypesDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/TypesDirectoryPanel.java
index 8aa4b80..8e4a0f4 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/TypesDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/TypesDirectoryPanel.java
@@ -21,11 +21,11 @@ package org.apache.syncope.client.console.panels;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import org.apache.syncope.client.console.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.rest.RestClient;
-import org.apache.syncope.common.lib.AbstractBaseBean;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.wicket.PageReference;
 
 public abstract class TypesDirectoryPanel<
-        T extends AbstractBaseBean, DP extends DirectoryDataProvider<T>, E extends RestClient>
+        T extends EntityTO, DP extends DirectoryDataProvider<T>, E extends RestClient>
         extends DirectoryPanel<T, T, DP, E> {
 
     private static final long serialVersionUID = 7890071604330629259L;
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClause.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClause.java
index 8d20abc..2953787 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClause.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClause.java
@@ -21,8 +21,7 @@ package org.apache.syncope.client.console.panels.search;
 import java.io.Serializable;
 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.commons.lang3.builder.ToStringBuilder;
 
 public final class SearchClause implements Serializable {
 
@@ -116,17 +115,45 @@ public final class SearchClause implements Serializable {
     }
 
     @Override
-    public boolean equals(final Object obj) {
-        return EqualsBuilder.reflectionEquals(this, obj);
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(operator).
+                append(type).
+                append(property).
+                append(comparator).
+                append(value).
+                build();
     }
 
     @Override
-    public int hashCode() {
-        return HashCodeBuilder.reflectionHashCode(this);
+    public boolean equals(final Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        final SearchClause other = (SearchClause) obj;
+        return new EqualsBuilder().
+                append(operator, other.operator).
+                append(type, other.type).
+                append(property, other.property).
+                append(comparator, other.comparator).
+                append(value, other.value).
+                build();
     }
 
     @Override
     public String toString() {
-        return ReflectionToStringBuilder.toString(this, ToStringStyle.JSON_STYLE);
+        return new ToStringBuilder(this).
+                append(operator).
+                append(type).
+                append(property).
+                append(comparator).
+                append(value).
+                build();
     }
 }
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/status/StatusModal.java b/client/console/src/main/java/org/apache/syncope/client/console/status/StatusModal.java
index d1387e0..50b14cd 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/status/StatusModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/status/StatusModal.java
@@ -25,11 +25,11 @@ import org.apache.syncope.client.console.panels.ModalPanel;
 import org.apache.syncope.client.console.panels.MultilevelPanel;
 import org.apache.syncope.client.console.rest.AbstractAnyRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
-import org.apache.syncope.common.lib.AbstractBaseBean;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.markup.html.panel.Panel;
 
-public abstract class StatusModal<T extends AbstractBaseBean> extends Panel implements ModalPanel {
+public abstract class StatusModal<T extends EntityTO> extends Panel implements ModalPanel {
 
     private static final long serialVersionUID = 1066124171682570080L;
 
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/reconciliation/Any.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/reconciliation/Any.java
index f0fde29..8c461dd 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/widgets/reconciliation/Any.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/reconciliation/Any.java
@@ -18,11 +18,11 @@
  */
 package org.apache.syncope.client.console.widgets.reconciliation;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 
-public class Any extends AbstractBaseBean {
+public class Any implements Serializable {
 
     private static final long serialVersionUID = 2421645848049271898L;
 
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/reconciliation/Anys.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/reconciliation/Anys.java
index 3c58515..2d35e14 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/widgets/reconciliation/Anys.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/reconciliation/Anys.java
@@ -18,11 +18,11 @@
  */
 package org.apache.syncope.client.console.widgets.reconciliation;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 
-public class Anys extends AbstractBaseBean {
+public class Anys implements Serializable {
 
     private static final long serialVersionUID = -2482591351364634179L;
 
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/reconciliation/Missing.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/reconciliation/Missing.java
index 2d0254a..175d9de 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/widgets/reconciliation/Missing.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/reconciliation/Missing.java
@@ -18,9 +18,9 @@
  */
 package org.apache.syncope.client.console.widgets.reconciliation;
 
-import org.apache.syncope.common.lib.AbstractBaseBean;
+import java.io.Serializable;
 
-public class Missing extends AbstractBaseBean {
+public class Missing implements Serializable {
 
     private static final long serialVersionUID = -4779715117027316991L;
 
@@ -40,5 +40,4 @@ public class Missing extends AbstractBaseBean {
     public String getConnObjectKeyValue() {
         return connObjectKeyValue;
     }
-
 }
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/reconciliation/ReconciliationReport.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/reconciliation/ReconciliationReport.java
index a178863..696d807 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/widgets/reconciliation/ReconciliationReport.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/reconciliation/ReconciliationReport.java
@@ -18,12 +18,12 @@
  */
 package org.apache.syncope.client.console.widgets.reconciliation;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 
-public class ReconciliationReport extends AbstractBaseBean {
+public class ReconciliationReport implements Serializable {
 
     private static final long serialVersionUID = 931063230006747313L;
 
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/AbstractConnConfPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/AbstractConnConfPanel.java
index 662272f..da3162e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/AbstractConnConfPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/AbstractConnConfPanel.java
@@ -24,7 +24,7 @@ import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.wicket.markup.html.list.ConnConfPropertyListView;
-import org.apache.syncope.common.lib.AbstractBaseBean;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
@@ -36,7 +36,7 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.LoadableDetachableModel;
 import org.apache.wicket.model.ResourceModel;
 
-public abstract class AbstractConnConfPanel<T extends AbstractBaseBean> extends WizardStep implements ICondition {
+public abstract class AbstractConnConfPanel<T extends EntityTO> extends WizardStep implements ICondition {
 
     private static final long serialVersionUID = -2025535531121434050L;
 
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
deleted file mode 100644
index 4562f70..0000000
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/AbstractBaseBean.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.common.lib;
-
-import java.io.Serializable;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-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;
-
-@XmlType
-// Reporting here only classes used via PagedResult
-@XmlSeeAlso({ TaskTO.class, ReportTO.class, GroupTO.class, UserTO.class, AnyObjectTO.class })
-public abstract class AbstractBaseBean implements Serializable {
-
-    private static final long serialVersionUID = 3119542005279892164L;
-
-    @Override
-    public boolean equals(final Object obj) {
-        return EqualsBuilder.reflectionEquals(this, obj);
-    }
-
-    @Override
-    public int hashCode() {
-        return HashCodeBuilder.reflectionHashCode(this);
-    }
-
-    @Override
-    public String toString() {
-        return ReflectionToStringBuilder.toString(this, ToStringStyle.JSON_STYLE);
-    }
-}
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/info/JavaImplInfo.java b/common/lib/src/main/java/org/apache/syncope/common/lib/info/JavaImplInfo.java
index 82cd73b..8ba3b4a 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/info/JavaImplInfo.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/info/JavaImplInfo.java
@@ -19,18 +19,18 @@
 package org.apache.syncope.common.lib.info;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
 import java.util.HashSet;
 import java.util.Set;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.types.ImplementationType;
 
 @XmlRootElement(name = "javaImplInfo")
 @XmlType
-public class JavaImplInfo extends AbstractBaseBean {
+public class JavaImplInfo implements Serializable {
 
     private static final long serialVersionUID = 4036793959111794959L;
 
@@ -52,5 +52,4 @@ public class JavaImplInfo extends AbstractBaseBean {
     public Set<String> getClasses() {
         return classes;
     }
-
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/info/NumbersInfo.java b/common/lib/src/main/java/org/apache/syncope/common/lib/info/NumbersInfo.java
index c12f1a3..b7cb814 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/info/NumbersInfo.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/info/NumbersInfo.java
@@ -19,18 +19,20 @@
 package org.apache.syncope.common.lib.info;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
 import java.util.HashMap;
 import java.util.Map;
 import javax.xml.bind.annotation.XmlEnum;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import org.apache.syncope.common.lib.AbstractBaseBean;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 
 @XmlRootElement(name = "numbersInfo")
 @XmlType
-public class NumbersInfo extends AbstractBaseBean {
+public class NumbersInfo implements Serializable {
 
     private static final long serialVersionUID = 7691187370598649583L;
 
@@ -63,7 +65,6 @@ public class NumbersInfo extends AbstractBaseBean {
             }
             return score;
         }
-
     }
 
     private int totalUsers;
@@ -194,4 +195,53 @@ public class NumbersInfo extends AbstractBaseBean {
         return confCompleteness;
     }
 
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(totalUsers).
+                append(usersByRealm).
+                append(usersByStatus).
+                append(totalGroups).
+                append(groupsByRealm).
+                append(anyType1).
+                append(totalAny1).
+                append(any1ByRealm).
+                append(anyType2).
+                append(totalAny2).
+                append(any2ByRealm).
+                append(totalResources).
+                append(totalRoles).
+                append(confCompleteness).
+                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 NumbersInfo other = (NumbersInfo) obj;
+        return new EqualsBuilder().
+                append(totalUsers, other.totalUsers).
+                append(totalGroups, other.totalGroups).
+                append(totalResources, other.totalResources).
+                append(totalRoles, other.totalRoles).
+                append(anyType1, other.anyType1).
+                append(anyType2, other.anyType2).
+                append(usersByRealm, other.usersByRealm).
+                append(usersByStatus, other.usersByStatus).
+                append(groupsByRealm, other.groupsByRealm).
+                append(totalAny1, other.totalAny1).
+                append(any1ByRealm, other.any1ByRealm).
+                append(totalAny2, other.totalAny2).
+                append(any2ByRealm, other.any2ByRealm).
+                append(confCompleteness, other.confCompleteness).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/info/PlatformInfo.java b/common/lib/src/main/java/org/apache/syncope/common/lib/info/PlatformInfo.java
index 2854259..6ea0e93 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/info/PlatformInfo.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/info/PlatformInfo.java
@@ -20,6 +20,7 @@ package org.apache.syncope.common.lib.info;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -29,12 +30,11 @@ 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.ImplementationType;
 
 @XmlRootElement(name = "platformInfo")
 @XmlType
-public class PlatformInfo extends AbstractBaseBean {
+public class PlatformInfo implements Serializable {
 
     private static final long serialVersionUID = -7941853999417673827L;
 
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 216316b..5d12ad1 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
@@ -19,17 +19,17 @@
 package org.apache.syncope.common.lib.info;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
 import java.util.Queue;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.collections.CircularFifoQueue;
 
 @XmlRootElement(name = "systemInfo")
 @XmlType
-public class SystemInfo extends AbstractBaseBean {
+public class SystemInfo implements Serializable {
 
     private static final long serialVersionUID = -352727968865892499L;
 
@@ -94,7 +94,7 @@ public class SystemInfo extends AbstractBaseBean {
 
     @XmlRootElement(name = "loadInstant")
     @XmlType
-    public static class LoadInstant extends AbstractBaseBean {
+    public static class LoadInstant implements Serializable {
 
         private static final long serialVersionUID = 1700788373758716478L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/log/EventCategory.java b/common/lib/src/main/java/org/apache/syncope/common/lib/log/EventCategory.java
index cf7d7a5..7836a76 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/log/EventCategory.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/log/EventCategory.java
@@ -19,18 +19,18 @@
 package org.apache.syncope.common.lib.log;
 
 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.AuditElements;
 
 @XmlRootElement(name = "eventCategory")
 @XmlType
-public class EventCategory extends AbstractBaseBean {
+public class EventCategory implements Serializable {
 
     private static final long serialVersionUID = -4340060002701633401L;
 
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..85c3d28 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
@@ -18,9 +18,9 @@
  */
 package org.apache.syncope.common.lib.log;
 
-import org.apache.syncope.common.lib.AbstractBaseBean;
+import java.io.Serializable;
 
-public class LogAppender extends AbstractBaseBean {
+public class LogAppender implements Serializable {
 
     private static final long serialVersionUID = 5975199884460548302L;
 
@@ -33,5 +33,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/log/LogStatement.java b/common/lib/src/main/java/org/apache/syncope/common/lib/log/LogStatement.java
index 7c80a9d..f6dc3a3 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/log/LogStatement.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/log/LogStatement.java
@@ -18,14 +18,14 @@
  */
 package org.apache.syncope.common.lib.log;
 
+import java.io.Serializable;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.types.LoggerLevel;
 
 @XmlRootElement(name = "logStatement")
 @XmlType
-public class LogStatement extends AbstractBaseBean {
+public class LogStatement implements Serializable {
 
     private static final long serialVersionUID = -2931205859104653385L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/log/LoggerTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/log/LoggerTO.java
index f908d2b..a18860f 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/log/LoggerTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/log/LoggerTO.java
@@ -18,15 +18,17 @@
  */
 package org.apache.syncope.common.lib.log;
 
+import java.io.Serializable;
 import javax.ws.rs.PathParam;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.AbstractBaseBean;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.LoggerLevel;
 
 @XmlRootElement(name = "logger")
 @XmlType
-public class LoggerTO extends AbstractBaseBean {
+public class LoggerTO implements Serializable {
 
     private static final long serialVersionUID = -7794833835668648505L;
 
@@ -50,4 +52,30 @@ public class LoggerTO extends AbstractBaseBean {
     public void setKey(final String key) {
         this.key = key;
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(key).
+                append(level).
+                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 LoggerTO other = (LoggerTO) obj;
+        return new EqualsBuilder().
+                append(key, other.key).
+                append(level, other.level).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AbstractPatch.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AbstractPatch.java
index bb881a7..522f2d9 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AbstractPatch.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AbstractPatch.java
@@ -18,14 +18,16 @@
  */
 package org.apache.syncope.common.lib.patch;
 
+import java.io.Serializable;
 import javax.xml.bind.annotation.XmlSeeAlso;
 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.types.PatchOperation;
 
 @XmlType
 @XmlSeeAlso({ AbstractPatchItem.class, AttrPatch.class, MembershipPatch.class, RelationshipPatch.class })
-public abstract class AbstractPatch extends AbstractBaseBean {
+public abstract class AbstractPatch implements Serializable {
 
     private static final long serialVersionUID = -4729181508529829580L;
 
@@ -66,4 +68,27 @@ public abstract class AbstractPatch extends AbstractBaseBean {
         this.operation = operation;
     }
 
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(operation).
+                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 AbstractPatch other = (AbstractPatch) obj;
+        return new EqualsBuilder().
+                append(operation, other.operation).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AbstractPatchItem.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AbstractPatchItem.java
index 6f72065..84e24d5 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AbstractPatchItem.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AbstractPatchItem.java
@@ -22,6 +22,8 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlSeeAlso;
 import javax.xml.bind.annotation.XmlType;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 
 @XmlType
 @XmlSeeAlso({ AbstractReplacePatchItem.class, LongPatchItem.class, StringPatchItem.class })
@@ -51,4 +53,30 @@ public abstract class AbstractPatchItem<T> extends AbstractPatch {
         this.value = value;
     }
 
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(value).
+                build();
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        @SuppressWarnings("unchecked")
+        final AbstractPatchItem<T> other = (AbstractPatchItem<T>) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(value, other.value).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AbstractReplacePatchItem.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AbstractReplacePatchItem.java
index 8282427..febdfee 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AbstractReplacePatchItem.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AbstractReplacePatchItem.java
@@ -44,5 +44,4 @@ public abstract class AbstractReplacePatchItem<T> extends AbstractPatchItem<T> {
     public void setOperation(final PatchOperation operation) {
         // fixed
     }
-
 }
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 8b0bff2..50965a1 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
@@ -26,6 +26,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
@@ -74,4 +76,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 f9b0a7f..d91c5a2 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
@@ -23,6 +23,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import io.swagger.v3.oas.annotations.media.Schema;
+import java.io.Serializable;
 import java.util.HashSet;
 import java.util.Set;
 import javax.ws.rs.PathParam;
@@ -31,7 +32,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
@@ -39,7 +41,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" })
 @Schema(subTypes = { UserPatch.class, GroupPatch.class, AnyObjectPatch.class }, discriminatorProperty = "@class")
-public abstract class AnyPatch extends AbstractBaseBean implements AttributablePatch {
+public abstract class AnyPatch implements Serializable, AttributablePatch {
 
     private static final long serialVersionUID = -7445489774552440544L;
 
@@ -125,4 +127,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/AssociationPatch.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AssociationPatch.java
index e445aac..b5b343d 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AssociationPatch.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AssociationPatch.java
@@ -22,6 +22,8 @@ import java.util.Collection;
 import javax.ws.rs.PathParam;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.ResourceAssociationAction;
 
 @XmlRootElement(name = "associationPatch")
@@ -104,4 +106,32 @@ public class AssociationPatch extends PasswordPatch {
     public void setAction(final ResourceAssociationAction action) {
         this.action = action;
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(key).
+                append(action).
+                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 AssociationPatch other = (AssociationPatch) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(key, other.key).
+                append(action, other.action).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AttrPatch.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AttrPatch.java
index f41a054..f22937d 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AttrPatch.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/AttrPatch.java
@@ -21,6 +21,8 @@ package org.apache.syncope.common.lib.patch;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.to.AttrTO;
 
 @XmlRootElement(name = "attrPatch")
@@ -57,4 +59,30 @@ public class AttrPatch extends AbstractPatch {
     public boolean isEmpty() {
         return attrTO == null || attrTO.getValues().isEmpty();
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(attrTO).
+                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 AttrPatch other = (AttrPatch) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(attrTO, other.attrTO).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/BooleanReplacePatchItem.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/BooleanReplacePatchItem.java
index 9cf1097..aeea67a 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/BooleanReplacePatchItem.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/BooleanReplacePatchItem.java
@@ -33,6 +33,5 @@ public class BooleanReplacePatchItem extends AbstractReplacePatchItem<Boolean> {
         protected BooleanReplacePatchItem newInstance() {
             return new BooleanReplacePatchItem();
         }
-
     }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/DeassociationPatch.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/DeassociationPatch.java
index 74248c8..518d145 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/DeassociationPatch.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/DeassociationPatch.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.common.lib.patch;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -28,12 +29,11 @@ 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.ResourceDeassociationAction;
 
 @XmlRootElement(name = "deassociationPatch")
 @XmlType
-public class DeassociationPatch extends AbstractBaseBean {
+public class DeassociationPatch implements Serializable {
 
     private static final long serialVersionUID = 6295778399633883767L;
 
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 2ff1ebb..ab12e87 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
@@ -31,6 +31,8 @@ import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 import org.apache.syncope.common.lib.to.TypeExtensionTO;
 
@@ -117,4 +119,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/LongPatchItem.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/LongPatchItem.java
index 96c6050..c1e0ca5 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/LongPatchItem.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/LongPatchItem.java
@@ -33,6 +33,5 @@ public class LongPatchItem extends AbstractPatchItem<Long> {
         protected LongPatchItem newInstance() {
             return new LongPatchItem();
         }
-
     }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/MembershipPatch.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/MembershipPatch.java
index f2dcab5..000da10 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/MembershipPatch.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/MembershipPatch.java
@@ -25,6 +25,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;
 import org.apache.syncope.common.lib.to.AttrTO;
 
 @XmlRootElement(name = "membershipPatch")
@@ -73,4 +75,34 @@ public class MembershipPatch extends AbstractPatch {
     public Set<AttrTO> getVirAttrs() {
         return virAttrs;
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(group).
+                append(plainAttrs).
+                append(virAttrs).
+                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 MembershipPatch other = (MembershipPatch) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(group, other.group).
+                append(plainAttrs, other.plainAttrs).
+                append(virAttrs, other.virAttrs).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/PasswordPatch.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/PasswordPatch.java
index af989e4..5bdd5ff 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/PasswordPatch.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/PasswordPatch.java
@@ -28,6 +28,8 @@ import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlSeeAlso;
 import javax.xml.bind.annotation.XmlType;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 
 @XmlRootElement(name = "passwordPatch")
 @XmlType
@@ -94,4 +96,31 @@ public class PasswordPatch extends StringReplacePatchItem {
         return resources;
     }
 
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(onSyncope).
+                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 PasswordPatch other = (PasswordPatch) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(onSyncope, other.onSyncope).
+                append(resources, other.resources).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/RelationshipPatch.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/RelationshipPatch.java
index f7925e9..8cdf925 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/RelationshipPatch.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/RelationshipPatch.java
@@ -20,6 +20,8 @@ package org.apache.syncope.common.lib.patch;
 
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.to.RelationshipTO;
 
 @XmlRootElement(name = "relationshipPatch")
@@ -51,4 +53,29 @@ public class RelationshipPatch extends AbstractPatch {
         this.relationshipTO = relationshipTO;
     }
 
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(relationshipTO).
+                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 RelationshipPatch other = (RelationshipPatch) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(relationshipTO, other.relationshipTO).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/ResourceDeassociationPatch.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/ResourceDeassociationPatch.java
index 233d5bd..6c4dbc5 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/ResourceDeassociationPatch.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/ResourceDeassociationPatch.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.common.lib.patch;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 import javax.ws.rs.PathParam;
@@ -26,12 +27,11 @@ 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.ResourceDeassociationAction;
 
 @XmlRootElement(name = "resourceDeassociationPatch")
 @XmlType
-public class ResourceDeassociationPatch extends AbstractBaseBean {
+public class ResourceDeassociationPatch implements Serializable {
 
     private static final long serialVersionUID = -9116268525079837276L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/StatusPatch.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/StatusPatch.java
index 9c94dc7..fe4277a 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/StatusPatch.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/StatusPatch.java
@@ -22,6 +22,8 @@ import java.util.Collection;
 import javax.ws.rs.PathParam;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.StatusPatchType;
 
 @XmlRootElement(name = "statusPatch")
@@ -120,4 +122,33 @@ public class StatusPatch extends PasswordPatch {
         this.token = token;
     }
 
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(key).
+                append(type).
+                append(token).
+                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 StatusPatch other = (StatusPatch) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(key, other.key).
+                append(type, other.type).
+                append(token, other.token).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/StringPatchItem.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/StringPatchItem.java
index d9aacf8..6ed2ea3 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/StringPatchItem.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/StringPatchItem.java
@@ -33,6 +33,5 @@ public class StringPatchItem extends AbstractPatchItem<String> {
         protected StringPatchItem newInstance() {
             return new StringPatchItem();
         }
-
     }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/StringReplacePatchItem.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/StringReplacePatchItem.java
index b924484..7c1f551 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/StringReplacePatchItem.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/StringReplacePatchItem.java
@@ -35,6 +35,5 @@ public class StringReplacePatchItem extends AbstractReplacePatchItem<String> {
         protected StringReplacePatchItem newInstance() {
             return new StringReplacePatchItem();
         }
-
     }
 }
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 79795ae..fe1e34a 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
@@ -26,6 +26,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
@@ -124,4 +126,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/AbstractAccountRuleConf.java b/common/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractAccountRuleConf.java
index 8820779..9509b02 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractAccountRuleConf.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractAccountRuleConf.java
@@ -18,14 +18,14 @@
  */
 package org.apache.syncope.common.lib.policy;
 
+import java.io.Serializable;
 import javax.xml.bind.annotation.XmlSeeAlso;
 import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 
 @XmlType
 @XmlSeeAlso({ DefaultAccountRuleConf.class })
-public abstract class AbstractAccountRuleConf extends AbstractBaseBean implements AccountRuleConf {
+public abstract class AbstractAccountRuleConf implements Serializable, AccountRuleConf {
 
     private static final long serialVersionUID = -4080475005967851092L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractCorrelationRuleConf.java b/common/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractCorrelationRuleConf.java
index 0f7d4d6..147d06a 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractCorrelationRuleConf.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractCorrelationRuleConf.java
@@ -18,14 +18,14 @@
  */
 package org.apache.syncope.common.lib.policy;
 
+import java.io.Serializable;
 import javax.xml.bind.annotation.XmlSeeAlso;
 import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 
 @XmlType
 @XmlSeeAlso({ DefaultPullCorrelationRuleConf.class, DefaultPushCorrelationRuleConf.class })
-public abstract class AbstractCorrelationRuleConf extends AbstractBaseBean implements RuleConf {
+public abstract class AbstractCorrelationRuleConf implements Serializable, RuleConf {
 
     private static final long serialVersionUID = -4080475005967851092L;
 
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..fec3921 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
@@ -18,14 +18,14 @@
  */
 package org.apache.syncope.common.lib.policy;
 
+import java.io.Serializable;
 import javax.xml.bind.annotation.XmlSeeAlso;
 import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 
 @XmlType
 @XmlSeeAlso({ DefaultPasswordRuleConf.class })
-public abstract class AbstractPasswordRuleConf extends AbstractBaseBean implements PasswordRuleConf {
+public abstract class AbstractPasswordRuleConf implements Serializable, 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 472d194..624b640 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
@@ -31,7 +31,6 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlSeeAlso;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.to.EntityTO;
 
 @XmlRootElement(name = "policy")
@@ -42,7 +41,7 @@ import org.apache.syncope.common.lib.to.EntityTO;
 @Schema(
         subTypes = { AccountPolicyTO.class, PasswordPolicyTO.class, PullPolicyTO.class },
         discriminatorProperty = "@class")
-public abstract class PolicyTO extends AbstractBaseBean implements EntityTO {
+public abstract class PolicyTO implements EntityTO {
 
     private static final long serialVersionUID = -2903888572649721035L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/report/AbstractReportletConf.java b/common/lib/src/main/java/org/apache/syncope/common/lib/report/AbstractReportletConf.java
index f590067..0818e41 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/report/AbstractReportletConf.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/report/AbstractReportletConf.java
@@ -18,16 +18,16 @@
  */
 package org.apache.syncope.common.lib.report;
 
+import java.io.Serializable;
 import javax.xml.bind.annotation.XmlSeeAlso;
 import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 
 @XmlType
 @XmlSeeAlso({
     StaticReportletConf.class, UserReportletConf.class, GroupReportletConf.class,
     AuditReportletConf.class, ReconciliationReportletConf.class })
-public abstract class AbstractReportletConf extends AbstractBaseBean implements ReportletConf {
+public abstract class AbstractReportletConf implements Serializable, ReportletConf {
 
     private static final long serialVersionUID = -6130008602014516608L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractAnnotatedBean.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractAnnotatedBean.java
index 92529bc..741083c 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractAnnotatedBean.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractAnnotatedBean.java
@@ -18,18 +18,19 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import org.apache.syncope.common.lib.AbstractBaseBean;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import io.swagger.v3.oas.annotations.media.Schema;
 import java.util.Date;
 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;
 
 /**
  * Abstract wrapper for common system information.
  */
 @XmlType
-public class AbstractAnnotatedBean extends AbstractBaseBean {
+public abstract class AbstractAnnotatedBean implements EntityTO {
 
     private static final long serialVersionUID = -930797879027642457L;
 
@@ -122,6 +123,35 @@ public class AbstractAnnotatedBean extends AbstractBaseBean {
         return etagDate == null
                 ? StringUtils.EMPTY
                 : String.valueOf(etagDate.getTime());
+    }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(creator).
+                append(creationDate).
+                append(lastModifier).
+                append(lastChangeDate).
+                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 AbstractAnnotatedBean other = (AbstractAnnotatedBean) obj;
+        return new EqualsBuilder().
+                append(creator, other.creator).
+                append(creationDate, other.creationDate).
+                append(lastModifier, other.lastModifier).
+                append(lastChangeDate, other.lastChangeDate).
+                build();
     }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractHistoryConf.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractHistoryConf.java
index a410a73..08c2293 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractHistoryConf.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractHistoryConf.java
@@ -23,12 +23,11 @@ import javax.ws.rs.PathParam;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlSeeAlso;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 
 @XmlRootElement(name = "abstractHistoryConf")
 @XmlType
 @XmlSeeAlso({ ConnInstanceHistoryConfTO.class, ResourceHistoryConfTO.class })
-public abstract class AbstractHistoryConf extends AbstractBaseBean implements EntityTO {
+public abstract class AbstractHistoryConf implements EntityTO {
 
     private static final long serialVersionUID = -8001640160293506651L;
 
@@ -68,5 +67,4 @@ public abstract class AbstractHistoryConf extends AbstractBaseBean implements En
                 ? null
                 : new Date(creation.getTime());
     }
-
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractStartEndBean.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractStartEndBean.java
index efdec0c..f6fb7aa 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractStartEndBean.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractStartEndBean.java
@@ -19,12 +19,14 @@
 package org.apache.syncope.common.lib.to;
 
 import io.swagger.v3.oas.annotations.media.Schema;
+import java.io.Serializable;
 import java.util.Date;
 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;
 
 @XmlType
-public class AbstractStartEndBean extends AbstractBaseBean {
+public class AbstractStartEndBean implements Serializable {
 
     private static final long serialVersionUID = 2399577415544539917L;
 
@@ -57,4 +59,30 @@ public class AbstractStartEndBean extends AbstractBaseBean {
                 ? null
                 : new Date(end.getTime());
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(start).
+                append(end).
+                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 AbstractStartEndBean other = (AbstractStartEndBean) obj;
+        return new EqualsBuilder().
+                append(start, other.start).
+                append(end, other.end).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AccessTokenTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AccessTokenTO.java
index a07ef4e..6dd39b3 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AccessTokenTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AccessTokenTO.java
@@ -21,11 +21,10 @@ package org.apache.syncope.common.lib.to;
 import java.util.Date;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 
 @XmlRootElement(name = "accessToken")
 @XmlType
-public class AccessTokenTO extends AbstractBaseBean implements EntityTO {
+public class AccessTokenTO implements EntityTO {
 
     private static final long serialVersionUID = 6577639976115661357L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyObjectTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyObjectTO.java
index 3d903b1..a2b6a44 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyObjectTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyObjectTO.java
@@ -29,6 +29,8 @@ import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 
 @XmlRootElement(name = "anyObject")
 @XmlType
@@ -99,4 +101,36 @@ public class AnyObjectTO extends AnyTO implements GroupableRelatableTO {
     public List<MembershipTO> getDynMemberships() {
         return dynMemberships;
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(name).
+                append(relationships).
+                append(memberships).
+                append(dynMemberships).
+                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 AnyObjectTO other = (AnyObjectTO) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(name, other.name).
+                append(relationships, other.relationships).
+                append(memberships, other.memberships).
+                append(dynMemberships, other.dynMemberships).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java
index 727092f..d8bd896 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java
@@ -33,6 +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.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 
 @XmlType
 @XmlSeeAlso({ UserTO.class, GroupTO.class, AnyObjectTO.class })
@@ -175,4 +177,47 @@ public abstract class AnyTO extends AbstractAnnotatedBean implements EntityTO, A
         return resources;
     }
 
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(key).
+                append(type).
+                append(realm).
+                append(dynRealms).
+                append(status).
+                append(auxClasses).
+                append(plainAttrs).
+                append(derAttrs).
+                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 AnyTO other = (AnyTO) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(key, other.key).
+                append(type, other.type).
+                append(realm, other.realm).
+                append(dynRealms, other.dynRealms).
+                append(status, other.status).
+                append(auxClasses, other.auxClasses).
+                append(plainAttrs, other.plainAttrs).
+                append(derAttrs, other.derAttrs).
+                append(virAttrs, other.virAttrs).
+                append(resources, other.resources).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTypeClassTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTypeClassTO.java
index d68a7fe..dd3166c 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTypeClassTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTypeClassTO.java
@@ -26,11 +26,10 @@ 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;
 
 @XmlRootElement(name = "anyTypeClass")
 @XmlType
-public class AnyTypeClassTO extends AbstractBaseBean implements EntityTO {
+public class AnyTypeClassTO implements EntityTO {
 
     private static final long serialVersionUID = -591757688607551266L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTypeTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTypeTO.java
index 07827cb..5537535 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTypeTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTypeTO.java
@@ -26,12 +26,11 @@ 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.AnyTypeKind;
 
 @XmlRootElement(name = "anyType")
 @XmlType
-public class AnyTypeTO extends AbstractBaseBean implements EntityTO {
+public class AnyTypeTO implements EntityTO {
 
     private static final long serialVersionUID = 6771657557616874373L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ApplicationTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ApplicationTO.java
index 798c0be..7283386 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ApplicationTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ApplicationTO.java
@@ -26,11 +26,10 @@ 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;
 
 @XmlRootElement(name = "application")
 @XmlType
-public class ApplicationTO extends AbstractBaseBean implements EntityTO {
+public class ApplicationTO implements EntityTO {
 
     private static final long serialVersionUID = -4117796727736925215L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java
index b06b6b4..570d91f 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java
@@ -18,8 +18,8 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import org.apache.syncope.common.lib.AbstractBaseBean;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -29,10 +29,12 @@ 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 = "attribute")
 @XmlType
-public class AttrTO extends AbstractBaseBean {
+public class AttrTO implements Serializable {
 
     private static final long serialVersionUID = 4941691338796323623L;
 
@@ -102,4 +104,30 @@ public class AttrTO extends AbstractBaseBean {
     public List<String> getValues() {
         return values;
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(schema).
+                append(values).
+                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 AttrTO other = (AttrTO) obj;
+        return new EqualsBuilder().
+                append(schema, other.schema).
+                append(values, other.values).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnBundleTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnBundleTO.java
index b62c353..0809960 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnBundleTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnBundleTO.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.ConnConfPropSchema;
 
 @XmlRootElement(name = "connectorBundle")
 @XmlType
-public class ConnBundleTO extends AbstractBaseBean {
+public class ConnBundleTO implements Serializable {
 
     private static final long serialVersionUID = 7215115961910138005L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnIdObjectClassTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnIdObjectClassTO.java
index be1b6d6..5b9c0ee 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnIdObjectClassTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnIdObjectClassTO.java
@@ -19,20 +19,20 @@
 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;
 
 /**
  * Metadata description of ConnId ObjectClass.
  */
 @XmlRootElement(name = "connIdObjectClass")
 @XmlType
-public class ConnIdObjectClassTO extends AbstractBaseBean {
+public class ConnIdObjectClassTO implements Serializable {
 
     private static final long serialVersionUID = -3719658595689434648L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceTO.java
index 76424fe..3b5db38 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceTO.java
@@ -30,13 +30,12 @@ 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.ConnConfProperty;
 import org.apache.syncope.common.lib.types.ConnectorCapability;
 
 @XmlRootElement(name = "connInstance")
 @XmlType
-public class ConnInstanceTO extends AbstractBaseBean implements EntityTO {
+public class ConnInstanceTO implements EntityTO {
 
     private static final long serialVersionUID = 2707778645445168671L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnObjectTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnObjectTO.java
index 6086066..e6301b5 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnObjectTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnObjectTO.java
@@ -20,6 +20,7 @@ package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
 import java.util.LinkedHashSet;
 import java.util.Optional;
 import java.util.Set;
@@ -27,11 +28,12 @@ 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.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 
 @XmlRootElement(name = "connObject")
 @XmlType
-public class ConnObjectTO extends AbstractBaseBean {
+public class ConnObjectTO implements Serializable {
 
     private static final long serialVersionUID = 5139554911265442497L;
 
@@ -48,4 +50,28 @@ public class ConnObjectTO extends AbstractBaseBean {
     public Optional<AttrTO> getAttr(final String schema) {
         return attrs.stream().filter(attr -> attr.getSchema().equals(schema)).findFirst();
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(attrs).
+                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 ConnObjectTO other = (ConnObjectTO) obj;
+        return new EqualsBuilder().
+                append(attrs, other.attrs).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnPoolConfTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnPoolConfTO.java
index 9f455dc..f92709b 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnPoolConfTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnPoolConfTO.java
@@ -18,13 +18,13 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import org.apache.syncope.common.lib.AbstractBaseBean;
+import java.io.Serializable;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 
 @XmlRootElement(name = "connPoolConf")
 @XmlType
-public class ConnPoolConfTO extends AbstractBaseBean {
+public class ConnPoolConfTO implements Serializable {
 
     private static final long serialVersionUID = -214360178113476623L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/DerSchemaTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/DerSchemaTO.java
index 5508265..5477fca 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/DerSchemaTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/DerSchemaTO.java
@@ -23,6 +23,8 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 
 @XmlRootElement(name = "derSchema")
 @XmlType
@@ -48,4 +50,30 @@ public class DerSchemaTO extends SchemaTO {
     public void setExpression(final String expression) {
         this.expression = expression;
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(expression).
+                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 DerSchemaTO other = (DerSchemaTO) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(expression, other.expression).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/DomainTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/DomainTO.java
index 8994cf8..4e9c1d9 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/DomainTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/DomainTO.java
@@ -20,12 +20,11 @@ package org.apache.syncope.common.lib.to;
 
 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.CipherAlgorithm;
 
 @XmlRootElement(name = "domain")
 @XmlType
-public class DomainTO extends AbstractBaseBean implements EntityTO {
+public class DomainTO implements EntityTO {
 
     private static final long serialVersionUID = -7938075259986084934L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/DynRealmTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/DynRealmTO.java
index 675020f..ee5d5bc 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/DynRealmTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/DynRealmTO.java
@@ -25,12 +25,11 @@ import javax.ws.rs.PathParam;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 
 @XmlRootElement(name = "dynRealm")
 @XmlType
-public class DynRealmTO extends AbstractBaseBean implements EntityTO {
+public class DynRealmTO implements EntityTO {
 
     private static final long serialVersionUID = 4560822655754800031L;
 
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..378b814 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;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ExecTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ExecTO.java
index 323658e..7ff6e99 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ExecTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ExecTO.java
@@ -20,6 +20,8 @@ package org.apache.syncope.common.lib.to;
 
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.JobType;
 
 @XmlRootElement(name = "exec")
@@ -89,4 +91,40 @@ public class ExecTO extends AbstractStartEndBean implements EntityTO {
     public void setStatus(final String status) {
         this.status = status;
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(key).
+                append(jobType).
+                append(refKey).
+                append(refDesc).
+                append(status).
+                append(message).
+                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 ExecTO other = (ExecTO) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(key, other.key).
+                append(jobType, other.jobType).
+                append(refKey, other.refKey).
+                append(refDesc, other.refDesc).
+                append(status, other.status).
+                append(message, other.message).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupTO.java
index 95d234d..cc01eda 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupTO.java
@@ -32,6 +32,8 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 
@@ -168,4 +170,39 @@ public class GroupTO extends AnyTO {
         return typeExtensions;
     }
 
+    @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 GroupTO other = (GroupTO) 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/to/ImplementationTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ImplementationTO.java
index 842045e..cae2fb6 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ImplementationTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ImplementationTO.java
@@ -21,13 +21,14 @@ package org.apache.syncope.common.lib.to;
 import javax.ws.rs.PathParam;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.AbstractBaseBean;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.ImplementationEngine;
 import org.apache.syncope.common.lib.types.ImplementationType;
 
 @XmlRootElement(name = "implementation")
 @XmlType
-public class ImplementationTO extends AbstractBaseBean implements EntityTO {
+public class ImplementationTO implements EntityTO {
 
     private static final long serialVersionUID = 2703397698393060586L;
 
@@ -75,4 +76,33 @@ public class ImplementationTO extends AbstractBaseBean implements EntityTO {
         this.body = body;
     }
 
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(key).
+                append(engine).
+                append(type).
+                append(body).
+                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 ImplementationTO other = (ImplementationTO) obj;
+        return new EqualsBuilder().
+                append(key, other.key).
+                append(engine, other.engine).
+                append(type, other.type).
+                append(body, other.body).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ItemTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ItemTO.java
index 0bed627..27066be 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ItemTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ItemTO.java
@@ -25,12 +25,11 @@ 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.MappingPurpose;
 
 @XmlRootElement(name = "item")
 @XmlType
-public class ItemTO extends AbstractBaseBean implements EntityTO {
+public class ItemTO implements EntityTO {
 
     private static final long serialVersionUID = 2983498836767176862L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/JobTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/JobTO.java
index cee8db2..188c9cb 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/JobTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/JobTO.java
@@ -18,15 +18,15 @@
  */
 package org.apache.syncope.common.lib.to;
 
+import java.io.Serializable;
 import java.util.Date;
 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.JobType;
 
 @XmlRootElement(name = "job")
 @XmlType
-public class JobTO extends AbstractBaseBean {
+public class JobTO implements Serializable {
 
     private static final long serialVersionUID = -7254450981751326711L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/MailTemplateTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/MailTemplateTO.java
index bf25867..fcbb186 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/MailTemplateTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/MailTemplateTO.java
@@ -21,11 +21,10 @@ package org.apache.syncope.common.lib.to;
 import javax.ws.rs.PathParam;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 
 @XmlRootElement(name = "mailTemplate")
 @XmlType
-public class MailTemplateTO extends AbstractBaseBean implements EntityTO {
+public class MailTemplateTO implements EntityTO {
 
     private static final long serialVersionUID = 8389755049666062735L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/MappingTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/MappingTO.java
index 69500e8..cdad731 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/MappingTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/MappingTO.java
@@ -19,17 +19,17 @@
 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;
 
 @XmlRootElement(name = "mapping")
 @XmlType
-public class MappingTO extends AbstractBaseBean implements ItemContainerTO {
+public class MappingTO implements ItemContainerTO, Serializable {
 
     private static final long serialVersionUID = 8447688036282611118L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/MembershipTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/MembershipTO.java
index c606851..7696c08 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/MembershipTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/MembershipTO.java
@@ -20,6 +20,7 @@ package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
 import java.util.HashSet;
 import java.util.Optional;
 import java.util.Set;
@@ -27,11 +28,12 @@ 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.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 
 @XmlRootElement(name = "membership")
 @XmlType
-public class MembershipTO extends AbstractBaseBean implements AttributableTO {
+public class MembershipTO implements Serializable, AttributableTO {
 
     private static final long serialVersionUID = 5992828670273935861L;
 
@@ -122,4 +124,36 @@ public class MembershipTO extends AbstractBaseBean implements AttributableTO {
     public Optional<AttrTO> getVirAttr(final String schema) {
         return virAttrs.stream().filter(attr -> attr.getSchema().equals(schema)).findFirst();
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(groupKey).
+                append(groupName).
+                append(plainAttrs).
+                append(derAttrs).
+                append(virAttrs).
+                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 MembershipTO other = (MembershipTO) obj;
+        return new EqualsBuilder().
+                append(groupKey, other.groupKey).
+                append(groupName, other.groupName).
+                append(plainAttrs, other.plainAttrs).
+                append(derAttrs, other.derAttrs).
+                append(virAttrs, other.virAttrs).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTO.java
index 83fb7e8..f421459 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTO.java
@@ -29,13 +29,14 @@ import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import org.apache.syncope.common.lib.AbstractBaseBean;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 import org.apache.syncope.common.lib.types.TraceLevel;
 
 @XmlRootElement(name = "notification")
 @XmlType
-public class NotificationTO extends AbstractBaseBean implements EntityTO {
+public class NotificationTO implements EntityTO {
 
     private static final long serialVersionUID = -6145117115632592612L;
 
@@ -167,4 +168,52 @@ public class NotificationTO extends AbstractBaseBean implements EntityTO {
     public void setActive(final boolean active) {
         this.active = active;
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(key).
+                append(events).
+                append(abouts).
+                append(recipientsFIQL).
+                append(staticRecipients).
+                append(recipientAttrName).
+                append(selfAsRecipient).
+                append(recipientsProvider).
+                append(sender).
+                append(subject).
+                append(template).
+                append(traceLevel).
+                append(active).
+                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 NotificationTO other = (NotificationTO) obj;
+        return new EqualsBuilder().
+                append(key, other.key).
+                append(events, other.events).
+                append(abouts, other.abouts).
+                append(recipientsFIQL, other.recipientsFIQL).
+                append(staticRecipients, other.staticRecipients).
+                append(recipientAttrName, other.recipientAttrName).
+                append(selfAsRecipient, other.selfAsRecipient).
+                append(recipientsProvider, other.recipientsProvider).
+                append(sender, other.sender).
+                append(subject, other.subject).
+                append(template, other.template).
+                append(traceLevel, other.traceLevel).
+                append(active, other.active).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTaskTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTaskTO.java
index ddab19a..5ea6618 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTaskTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTaskTO.java
@@ -27,6 +27,8 @@ import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.TraceLevel;
 
@@ -153,4 +155,48 @@ public class NotificationTaskTO extends TaskTO {
     public void setTraceLevel(final TraceLevel traceLevel) {
         this.traceLevel = traceLevel;
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(notification).
+                append(anyTypeKind).
+                append(entityKey).
+                append(recipients).
+                append(sender).
+                append(subject).
+                append(textBody).
+                append(htmlBody).
+                append(executed).
+                append(traceLevel).
+                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 NotificationTaskTO other = (NotificationTaskTO) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(notification, other.notification).
+                append(anyTypeKind, other.anyTypeKind).
+                append(entityKey, other.entityKey).
+                append(recipients, other.recipients).
+                append(sender, other.sender).
+                append(subject, other.subject).
+                append(textBody, other.textBody).
+                append(htmlBody, other.htmlBody).
+                append(executed, other.executed).
+                append(traceLevel, other.traceLevel).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/OrgUnitTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/OrgUnitTO.java
index 8c4b8b1..950b78b 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/OrgUnitTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/OrgUnitTO.java
@@ -25,11 +25,10 @@ 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;
 
 @XmlRootElement(name = "orgUnit")
 @XmlType
-public class OrgUnitTO extends AbstractBaseBean implements EntityTO, ItemContainerTO {
+public class OrgUnitTO implements EntityTO, ItemContainerTO {
 
     private static final long serialVersionUID = -1868877794174953177L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/PagedConnObjectTOResult.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/PagedConnObjectTOResult.java
index 33e4c5d..15f7848 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/PagedConnObjectTOResult.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/PagedConnObjectTOResult.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.List;
@@ -26,11 +27,12 @@ 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.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 
 @XmlRootElement(name = "pagedConnObjectResult")
 @XmlType
-public class PagedConnObjectTOResult extends AbstractBaseBean {
+public class PagedConnObjectTOResult implements Serializable {
 
     private static final long serialVersionUID = -2832908019064402976L;
 
@@ -117,4 +119,35 @@ public class PagedConnObjectTOResult extends AbstractBaseBean {
         return result;
     }
 
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(next).
+                append(result).
+                append(pagedResultsCookie).
+                append(remainingPagedResults).
+                append(allResultsReturned).
+                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 PagedConnObjectTOResult other = (PagedConnObjectTOResult) obj;
+        return new EqualsBuilder().
+                append(next, other.next).
+                append(result, other.result).
+                append(pagedResultsCookie, other.pagedResultsCookie).
+                append(remainingPagedResults, other.remainingPagedResults).
+                append(allResultsReturned, other.allResultsReturned).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/PagedResult.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/PagedResult.java
index b17db6d..f5ec00f 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/PagedResult.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/PagedResult.java
@@ -20,6 +20,7 @@ package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import java.io.Serializable;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.List;
@@ -27,11 +28,12 @@ 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.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 
 @XmlRootElement(name = "pagedResult")
 @XmlType
-public class PagedResult<T extends AbstractBaseBean> extends AbstractBaseBean {
+public class PagedResult<T extends Serializable> implements Serializable {
 
     private static final long serialVersionUID = 3472875885259250934L;
 
@@ -95,4 +97,38 @@ public class PagedResult<T extends AbstractBaseBean> extends AbstractBaseBean {
         this.totalCount = totalCount;
     }
 
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(prev).
+                append(next).
+                append(result).
+                append(page).
+                append(size).
+                append(totalCount).
+                build();
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        @SuppressWarnings("unchecked")
+        final PagedResult<T> other = (PagedResult<T>) obj;
+        return new EqualsBuilder().
+                append(prev, other.prev).
+                append(next, other.next).
+                append(result, other.result).
+                append(page, other.page).
+                append(size, other.size).
+                append(totalCount, other.totalCount).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/PlainSchemaTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/PlainSchemaTO.java
index 7e5d3de..338b642 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/PlainSchemaTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/PlainSchemaTO.java
@@ -25,6 +25,8 @@ import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.AttrSchemaType;
 import org.apache.syncope.common.lib.types.CipherAlgorithm;
 
@@ -165,4 +167,51 @@ public class PlainSchemaTO extends SchemaTO {
         this.mimeType = mimeType;
     }
 
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(type).
+                append(mandatoryCondition).
+                append(multivalue).
+                append(uniqueConstraint).
+                append(readonly).
+                append(conversionPattern).
+                append(validator).
+                append(enumerationKeys).
+                append(enumerationValues).
+                append(secretKey).
+                append(cipherAlgorithm).
+                append(mimeType).
+                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 PlainSchemaTO other = (PlainSchemaTO) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(type, other.type).
+                append(mandatoryCondition, other.mandatoryCondition).
+                append(multivalue, other.multivalue).
+                append(uniqueConstraint, other.uniqueConstraint).
+                append(readonly, other.readonly).
+                append(conversionPattern, other.conversionPattern).
+                append(validator, other.validator).
+                append(enumerationKeys, other.enumerationKeys).
+                append(enumerationValues, other.enumerationValues).
+                append(secretKey, other.secretKey).
+                append(cipherAlgorithm, other.cipherAlgorithm).
+                append(mimeType, other.mimeType).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/PrivilegeTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/PrivilegeTO.java
index b4f94ec..228bc99 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/PrivilegeTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/PrivilegeTO.java
@@ -21,11 +21,10 @@ package org.apache.syncope.common.lib.to;
 import io.swagger.v3.oas.annotations.media.Schema;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 
 @XmlRootElement(name = "privilege")
 @XmlType
-public class PrivilegeTO extends AbstractBaseBean implements EntityTO {
+public class PrivilegeTO implements EntityTO {
 
     private static final long serialVersionUID = 5461846770586031758L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/PropagationStatus.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/PropagationStatus.java
index ee6f627..c6d1e0e 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/PropagationStatus.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/PropagationStatus.java
@@ -18,9 +18,11 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import org.apache.syncope.common.lib.AbstractBaseBean;
+import java.io.Serializable;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.ExecStatus;
 
 /**
@@ -28,7 +30,7 @@ import org.apache.syncope.common.lib.types.ExecStatus;
  */
 @XmlRootElement(name = "propagationStatus")
 @XmlType
-public class PropagationStatus extends AbstractBaseBean {
+public class PropagationStatus implements Serializable {
 
     private static final long serialVersionUID = 3921498450222857690L;
 
@@ -96,4 +98,36 @@ public class PropagationStatus extends AbstractBaseBean {
     public void setFailureReason(final String failureReason) {
         this.failureReason = failureReason;
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(beforeObj).
+                append(afterObj).
+                append(resource).
+                append(status).
+                append(failureReason).
+                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 PropagationStatus other = (PropagationStatus) obj;
+        return new EqualsBuilder().
+                append(beforeObj, other.beforeObj).
+                append(afterObj, other.afterObj).
+                append(resource, other.resource).
+                append(status, other.status).
+                append(failureReason, other.failureReason).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/PropagationTaskTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/PropagationTaskTO.java
index 5d6ee20..5b06fcc 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/PropagationTaskTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/PropagationTaskTO.java
@@ -24,6 +24,8 @@ import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 
@@ -147,4 +149,46 @@ public class PropagationTaskTO extends TaskTO {
     public void setEntityKey(final String entityKey) {
         this.entityKey = entityKey;
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(operation).
+                append(connObjectKey).
+                append(oldConnObjectKey).
+                append(attributes).
+                append(resource).
+                append(objectClassName).
+                append(anyTypeKind).
+                append(anyType).
+                append(entityKey).
+                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 PropagationTaskTO other = (PropagationTaskTO) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(operation, other.operation).
+                append(connObjectKey, other.connObjectKey).
+                append(oldConnObjectKey, other.oldConnObjectKey).
+                append(attributes, other.attributes).
+                append(resource, other.resource).
+                append(objectClassName, other.objectClassName).
+                append(anyTypeKind, other.anyTypeKind).
+                append(anyType, other.anyType).
+                append(entityKey, other.entityKey).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisionTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisionTO.java
index 12206c1..ec271e9 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisionTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisionTO.java
@@ -25,11 +25,10 @@ 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;
 
 @XmlRootElement(name = "provision")
 @XmlType
-public class ProvisionTO extends AbstractBaseBean implements EntityTO {
+public class ProvisionTO implements EntityTO {
 
     private static final long serialVersionUID = 8298910216218007927L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisioningResult.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisioningResult.java
index c36f97e..09bae8a 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisioningResult.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisioningResult.java
@@ -20,6 +20,7 @@ package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 import javax.xml.bind.annotation.XmlElement;
@@ -28,12 +29,13 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import org.apache.syncope.common.lib.AbstractBaseBean;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.jaxb.XmlEntityTOAdapter;
 
 @XmlRootElement(name = "provisioningResult")
 @XmlType
-public class ProvisioningResult<E extends EntityTO> extends AbstractBaseBean {
+public class ProvisioningResult<E extends EntityTO> implements Serializable {
 
     private static final long serialVersionUID = 351317476398082746L;
 
@@ -49,8 +51,8 @@ public class ProvisioningResult<E extends EntityTO> extends AbstractBaseBean {
         return entity;
     }
 
-    public void setEntity(final E any) {
-        this.entity = any;
+    public void setEntity(final E entity) {
+        this.entity = entity;
     }
 
     @XmlElementWrapper(name = "propagationStatuses")
@@ -60,4 +62,28 @@ public class ProvisioningResult<E extends EntityTO> extends AbstractBaseBean {
         return propagationStatuses;
     }
 
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(entity).
+                build();
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        @SuppressWarnings("unchecked")
+        final ProvisioningResult<E> other = (ProvisioningResult<E>) obj;
+        return new EqualsBuilder().
+                append(entity, other.entity).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisioningTaskTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisioningTaskTO.java
index cdef683..c1f8540 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisioningTaskTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisioningTaskTO.java
@@ -27,6 +27,8 @@ import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlSeeAlso;
 import javax.xml.bind.annotation.XmlType;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.MatchingRule;
 import org.apache.syncope.common.lib.types.UnmatchingRule;
 
@@ -119,4 +121,44 @@ public abstract class ProvisioningTaskTO extends SchedTaskTO {
     public void setMatchingRule(final MatchingRule matchigRule) {
         this.matchingRule = matchigRule;
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(resource).
+                append(performCreate).
+                append(performUpdate).
+                append(performDelete).
+                append(syncStatus).
+                append(unmatchingRule).
+                append(matchingRule).
+                append(actions).
+                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 ProvisioningTaskTO other = (ProvisioningTaskTO) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(resource, other.resource).
+                append(performCreate, other.performCreate).
+                append(performUpdate, other.performUpdate).
+                append(performDelete, other.performDelete).
+                append(syncStatus, other.syncStatus).
+                append(unmatchingRule, other.unmatchingRule).
+                append(matchingRule, other.matchingRule).
+                append(actions, other.actions).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/PullTaskTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/PullTaskTO.java
index 3981200..f32b554 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/PullTaskTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/PullTaskTO.java
@@ -29,6 +29,8 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 import org.apache.syncope.common.lib.types.PullMode;
 
@@ -101,4 +103,35 @@ public class PullTaskTO extends ProvisioningTaskTO implements TemplatableTO {
         this.remediation = remediation;
     }
 
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(pullMode).
+                append(reconFilterBuilder).
+                append(destinationRealm).
+                append(remediation).
+                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 PullTaskTO other = (PullTaskTO) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(pullMode, other.pullMode).
+                append(reconFilterBuilder, other.reconFilterBuilder).
+                append(destinationRealm, other.destinationRealm).
+                append(remediation, other.remediation).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/PushTaskTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/PushTaskTO.java
index d9f8d6e..a1eaf11 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/PushTaskTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/PushTaskTO.java
@@ -29,6 +29,8 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 
 @XmlRootElement(name = "pushTask")
@@ -66,4 +68,32 @@ public class PushTaskTO extends ProvisioningTaskTO {
     public Map<String, String> getFilters() {
         return filters;
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(sourceRealm).
+                append(filters).
+                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 PushTaskTO other = (PushTaskTO) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(sourceRealm, other.sourceRealm).
+                append(filters, other.filters).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/RealmTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/RealmTO.java
index fd368e6..c38fc85 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/RealmTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/RealmTO.java
@@ -31,12 +31,11 @@ import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 
 @XmlRootElement(name = "realm")
 @XmlType
-public class RealmTO extends AbstractBaseBean implements EntityTO, TemplatableTO {
+public class RealmTO implements EntityTO, TemplatableTO {
 
     private static final long serialVersionUID = 516330662956254391L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ReconStatus.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ReconStatus.java
index da601c0..04577c8 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ReconStatus.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ReconStatus.java
@@ -19,7 +19,7 @@
 package org.apache.syncope.common.lib.to;
 
 import io.swagger.v3.oas.annotations.media.Schema;
-import org.apache.syncope.common.lib.AbstractBaseBean;
+import java.io.Serializable;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 
@@ -28,7 +28,7 @@ import javax.xml.bind.annotation.XmlType;
  */
 @XmlRootElement(name = "reconStatus")
 @XmlType
-public class ReconStatus extends AbstractBaseBean {
+public class ReconStatus implements Serializable {
 
     private static final long serialVersionUID = -8516345256596521490L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/RelationshipTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/RelationshipTO.java
index 06dbd0d..efc9d76 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/RelationshipTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/RelationshipTO.java
@@ -18,13 +18,15 @@
  */
 package org.apache.syncope.common.lib.to;
 
+import java.io.Serializable;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.AbstractBaseBean;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 
 @XmlRootElement(name = "relationship")
 @XmlType
-public class RelationshipTO extends AbstractBaseBean {
+public class RelationshipTO implements Serializable {
 
     private static final long serialVersionUID = 360672942026613929L;
 
@@ -94,4 +96,34 @@ public class RelationshipTO extends AbstractBaseBean {
     public void setOtherEndName(final String otherEndName) {
         this.otherEndName = otherEndName;
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(type).
+                append(otherEndType).
+                append(otherEndKey).
+                append(otherEndName).
+                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 RelationshipTO other = (RelationshipTO) obj;
+        return new EqualsBuilder().
+                append(type, other.type).
+                append(otherEndType, other.otherEndType).
+                append(otherEndKey, other.otherEndKey).
+                append(otherEndName, other.otherEndName).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/RelationshipTypeTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/RelationshipTypeTO.java
index d5eba40..5db2ac4 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/RelationshipTypeTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/RelationshipTypeTO.java
@@ -21,11 +21,10 @@ package org.apache.syncope.common.lib.to;
 import javax.ws.rs.Path;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 
 @XmlRootElement(name = "relationshipType")
 @XmlType
-public class RelationshipTypeTO extends AbstractBaseBean implements EntityTO {
+public class RelationshipTypeTO implements EntityTO {
 
     private static final long serialVersionUID = -1884088415277925817L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/RemediationTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/RemediationTO.java
index 7561bb1..4354b55 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/RemediationTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/RemediationTO.java
@@ -23,13 +23,12 @@ import java.util.Date;
 import javax.ws.rs.PathParam;
 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.patch.AnyPatch;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 
 @XmlRootElement(name = "remediation")
 @XmlType
-public class RemediationTO extends AbstractBaseBean implements EntityTO {
+public class RemediationTO implements EntityTO {
 
     private static final long serialVersionUID = 3983540425142284975L;
 
@@ -160,5 +159,4 @@ public class RemediationTO extends AbstractBaseBean implements EntityTO {
     public void setRemoteName(final String remoteName) {
         this.remoteName = remoteName;
     }
-
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ReportTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ReportTO.java
index 636f3eb..3de4ad1 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ReportTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ReportTO.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 = "report")
 @XmlType
@@ -135,4 +137,47 @@ public class ReportTO extends AbstractStartEndBean implements EntityTO {
         this.template = template;
     }
 
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(key).
+                append(name).
+                append(reportlets).
+                append(cronExpression).
+                append(executions).
+                append(latestExecStatus).
+                append(lastExec).
+                append(nextExec).
+                append(active).
+                append(template).
+                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 ReportTO other = (ReportTO) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(key, other.key).
+                append(name, other.name).
+                append(reportlets, other.reportlets).
+                append(cronExpression, other.cronExpression).
+                append(executions, other.executions).
+                append(latestExecStatus, other.latestExecStatus).
+                append(lastExec, other.lastExec).
+                append(nextExec, other.nextExec).
+                append(active, other.active).
+                append(template, other.template).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ReportTemplateTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ReportTemplateTO.java
index 1731d4c..8a7d8e6 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ReportTemplateTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ReportTemplateTO.java
@@ -21,11 +21,10 @@ package org.apache.syncope.common.lib.to;
 import javax.ws.rs.PathParam;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 
 @XmlRootElement(name = "reportTemplate")
 @XmlType
-public class ReportTemplateTO extends AbstractBaseBean implements EntityTO {
+public class ReportTemplateTO implements EntityTO {
 
     private static final long serialVersionUID = 7776679004906244896L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceHistoryConfTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceHistoryConfTO.java
index 388b63c..5268299 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceHistoryConfTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceHistoryConfTO.java
@@ -36,5 +36,4 @@ public class ResourceHistoryConfTO extends AbstractHistoryConf {
     public void setResourceTO(final ResourceTO resourceTO) {
         this.resourceTO = resourceTO;
     }
-
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceTO.java
index d0061bb..b96a206 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceTO.java
@@ -30,14 +30,13 @@ 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.ConnConfProperty;
 import org.apache.syncope.common.lib.types.ConnectorCapability;
 import org.apache.syncope.common.lib.types.TraceLevel;
 
 @XmlRootElement(name = "resource")
 @XmlType
-public class ResourceTO extends AbstractBaseBean implements EntityTO {
+public class ResourceTO implements EntityTO {
 
     private static final long serialVersionUID = -9193551354041698963L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/RoleTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/RoleTO.java
index a474b6b..d9d3aee 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/RoleTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/RoleTO.java
@@ -28,11 +28,10 @@ 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;
 
 @XmlRootElement(name = "role")
 @XmlType
-public class RoleTO extends AbstractBaseBean implements EntityTO {
+public class RoleTO implements EntityTO {
 
     private static final long serialVersionUID = 4560822655754800031L;
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/SchedTaskTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/SchedTaskTO.java
index e0a35c6..0ad6af2 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/SchedTaskTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/SchedTaskTO.java
@@ -26,6 +26,8 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlSeeAlso;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 
 @XmlRootElement(name = "schedTask")
 @XmlType
@@ -126,4 +128,44 @@ public class SchedTaskTO extends TaskTO {
     public void setActive(final boolean active) {
         this.active = active;
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(startAt).
+                append(cronExpression).
+                append(jobDelegate).
+                append(name).
+                append(description).
+                append(lastExec).
+                append(nextExec).
+                append(active).
+                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 SchedTaskTO other = (SchedTaskTO) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(startAt, other.startAt).
+                append(cronExpression, other.cronExpression).
+                append(jobDelegate, other.jobDelegate).
+                append(name, other.name).
+                append(description, other.description).
+                append(lastExec, other.lastExec).
+                append(nextExec, other.nextExec).
+                append(active, other.active).
+                build();
+    }
 }
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 4659a65..2d5f752 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
@@ -32,7 +32,8 @@ import javax.xml.bind.annotation.XmlSeeAlso;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import org.apache.syncope.common.lib.AbstractBaseBean;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 
 @XmlRootElement(name = "schema")
@@ -41,7 +42,7 @@ import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "@class")
 @JsonPropertyOrder(value = { "@class", "key" })
 @Schema(subTypes = { PlainSchemaTO.class, DerSchemaTO.class, VirSchemaTO.class }, discriminatorProperty = "@class")
-public abstract class SchemaTO extends AbstractBaseBean implements EntityTO {
+public abstract class SchemaTO implements EntityTO {
 
     private static final long serialVersionUID = 4088388951694301759L;
 
@@ -91,4 +92,34 @@ public abstract class SchemaTO extends AbstractBaseBean implements EntityTO {
     public Map<Locale, String> getLabels() {
         return labels;
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(discriminator).
+                append(key).
+                append(anyTypeClass).
+                append(labels).
+                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 SchemaTO other = (SchemaTO) obj;
+        return new EqualsBuilder().
+                append(discriminator, other.discriminator).
+                append(key, other.key).
+                append(anyTypeClass, other.anyTypeClass).
+                append(labels, other.labels).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/SecurityQuestionTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/SecurityQuestionTO.java
index bf3d221..9a6cf8b 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/SecurityQuestionTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/SecurityQuestionTO.java
@@ -21,11 +21,12 @@ package org.apache.syncope.common.lib.to;
 import javax.ws.rs.PathParam;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.AbstractBaseBean;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 
 @XmlRootElement(name = "securityQuestion")
 @XmlType
-public class SecurityQuestionTO extends AbstractBaseBean implements EntityTO {
+public class SecurityQuestionTO implements EntityTO {
 
     private static final long serialVersionUID = 5969810939993556530L;
 
@@ -52,4 +53,29 @@ public class SecurityQuestionTO extends AbstractBaseBean implements EntityTO {
         this.content = content;
     }
 
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(key).
+                append(content).
+                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 SecurityQuestionTO other = (SecurityQuestionTO) obj;
+        return new EqualsBuilder().
+                append(key, other.key).
+                append(content, other.content).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/TaskTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/TaskTO.java
index 5c73c5c..51c7a6b 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/TaskTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/TaskTO.java
@@ -31,6 +31,8 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlSeeAlso;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 
 @XmlRootElement(name = "task")
 @XmlType
@@ -89,4 +91,36 @@ public abstract class TaskTO extends AbstractStartEndBean implements EntityTO {
     public List<ExecTO> getExecutions() {
         return executions;
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(key).
+                append(discriminator).
+                append(executions).
+                append(latestExecStatus).
+                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 TaskTO other = (TaskTO) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(key, other.key).
+                append(discriminator, other.discriminator).
+                append(executions, other.executions).
+                append(latestExecStatus, other.latestExecStatus).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/TypeExtensionTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/TypeExtensionTO.java
index f8dea41..3707221 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/TypeExtensionTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/TypeExtensionTO.java
@@ -19,17 +19,19 @@
 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.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 
 @XmlRootElement(name = "typeExtension")
 @XmlType
-public class TypeExtensionTO extends AbstractBaseBean {
+public class TypeExtensionTO implements Serializable {
 
     private static final long serialVersionUID = -5422809645030924811L;
 
@@ -52,4 +54,29 @@ public class TypeExtensionTO extends AbstractBaseBean {
         return auxClasses;
     }
 
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(anyType).
+                append(auxClasses).
+                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 TypeExtensionTO other = (TypeExtensionTO) obj;
+        return new EqualsBuilder().
+                append(anyType, other.anyType).
+                append(auxClasses, other.auxClasses).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/UserTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/UserTO.java
index b47f042..4d1da53 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/UserTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/UserTO.java
@@ -31,7 +31,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.ToStringExclude;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 
 @XmlRootElement(name = "user")
@@ -41,7 +42,6 @@ public class UserTO extends AnyTO implements GroupableRelatableTO {
 
     private static final long serialVersionUID = 7791304495192615740L;
 
-    @ToStringExclude
     private String password;
 
     private final List<String> roles = new ArrayList<>();
@@ -271,4 +271,60 @@ public class UserTO extends AnyTO implements GroupableRelatableTO {
     public List<MembershipTO> getDynMemberships() {
         return dynMemberships;
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(username).
+                append(roles).
+                append(dynRoles).
+                append(privileges).
+                append(token).
+                append(tokenExpireTime).
+                append(lastLoginDate).
+                append(changePwdDate).
+                append(failedLogins).
+                append(securityQuestion).
+                append(securityAnswer).
+                append(suspended).
+                append(mustChangePassword).
+                append(relationships).
+                append(memberships).
+                append(dynMemberships).
+                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 UserTO other = (UserTO) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(username, other.username).
+                append(roles, other.roles).
+                append(dynRoles, other.dynRoles).
+                append(privileges, other.privileges).
+                append(token, other.token).
+                append(tokenExpireTime, other.tokenExpireTime).
+                append(lastLoginDate, other.lastLoginDate).
+                append(changePwdDate, other.changePwdDate).
+                append(failedLogins, other.failedLogins).
+                append(securityQuestion, other.securityQuestion).
+                append(securityAnswer, other.securityAnswer).
+                append(suspended, other.suspended).
+                append(mustChangePassword, other.mustChangePassword).
+                append(relationships, other.relationships).
+                append(memberships, other.memberships).
+                append(dynMemberships, other.dynMemberships).
+                build();
+    }
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/VirSchemaTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/VirSchemaTO.java
index 300e129..7f6dac6 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/VirSchemaTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/VirSchemaTO.java
@@ -22,6 +22,8 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 
 @XmlRootElement(name = "virSchema")
 @Schema(allOf = { SchemaTO.class })
@@ -77,4 +79,35 @@ public class VirSchemaTO extends SchemaTO {
         this.extAttrName = extAttrName;
     }
 
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(readonly).
+                append(resource).
+                append(anyType).
+                append(extAttrName).
+                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 VirSchemaTO other = (VirSchemaTO) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(readonly, other.readonly).
+                append(resource, other.resource).
+                append(anyType, other.anyType).
+                append(extAttrName, other.extAttrName).
+                build();
+    }
 }
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 a8ad231..da30563 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
@@ -20,16 +20,18 @@ package org.apache.syncope.common.lib.types;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
 import java.text.ParseException;
 import java.util.Map;
 import 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.EventCategory;
 import org.apache.syncope.common.lib.types.AuditElements.EventCategoryType;
 import org.apache.syncope.common.lib.types.AuditElements.Result;
 
-public class AuditLoggerName extends AbstractBaseBean {
+public class AuditLoggerName implements Serializable {
 
     private static final long serialVersionUID = -647989486671786839L;
 
@@ -93,6 +95,38 @@ public class AuditLoggerName extends AbstractBaseBean {
                 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();
+    }
+
     public static AuditLoggerName fromLoggerName(final String loggerName)
             throws ParseException {
 
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/types/ConnConfPropSchema.java b/common/lib/src/main/java/org/apache/syncope/common/lib/types/ConnConfPropSchema.java
index 1958dc6..7bdcbbd 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/types/ConnConfPropSchema.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/types/ConnConfPropSchema.java
@@ -19,18 +19,19 @@
 package org.apache.syncope.common.lib.types;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Objects;
 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.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 
 @XmlRootElement
 @XmlType
-public class ConnConfPropSchema extends AbstractBaseBean implements Comparable<ConnConfPropSchema> {
+public class ConnConfPropSchema implements Serializable, Comparable<ConnConfPropSchema> {
 
     private static final long serialVersionUID = -1976365781005801296L;
 
@@ -124,13 +125,13 @@ public class ConnConfPropSchema extends AbstractBaseBean implements Comparable<C
 
     @Override
     public int hashCode() {
-        int hash = 5;
-        hash = 53 * hash + Objects.hashCode(this.name);
-        hash = 53 * hash + Objects.hashCode(this.type);
-        hash = 53 * hash + (this.required ? 1 : 0);
-        hash = 53 * hash + this.order;
-        hash = 53 * hash + (this.confidential ? 1 : 0);
-        return hash;
+        return new HashCodeBuilder().
+                append(name).
+                append(type).
+                append(required).
+                append(order).
+                append(confidential).
+                build();
     }
 
     @Override
@@ -145,19 +146,12 @@ public class ConnConfPropSchema extends AbstractBaseBean implements Comparable<C
             return false;
         }
         final ConnConfPropSchema other = (ConnConfPropSchema) obj;
-        if (this.required != other.required) {
-            return false;
-        }
-        if (this.order != other.order) {
-            return false;
-        }
-        if (this.confidential != other.confidential) {
-            return false;
-        }
-        if (!Objects.equals(this.name, other.name)) {
-            return false;
-        }
-        return Objects.equals(this.type, other.type);
+        return new EqualsBuilder().
+                append(name, other.name).
+                append(type, other.type).
+                append(required, other.required).
+                append(order, other.order).
+                append(confidential, other.confidential).
+                build();
     }
-
 }
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/types/ConnConfProperty.java b/common/lib/src/main/java/org/apache/syncope/common/lib/types/ConnConfProperty.java
index f4d321b..111d4a1 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/types/ConnConfProperty.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/types/ConnConfProperty.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.common.lib.types;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 import javax.xml.bind.annotation.XmlElement;
@@ -26,11 +27,12 @@ import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.ObjectUtils;
-import org.apache.syncope.common.lib.AbstractBaseBean;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 
 @XmlRootElement
 @XmlType
-public class ConnConfProperty extends AbstractBaseBean implements Comparable<ConnConfProperty> {
+public class ConnConfProperty implements Serializable, Comparable<ConnConfProperty> {
 
     private static final long serialVersionUID = -8391413960221862238L;
 
@@ -67,4 +69,32 @@ public class ConnConfProperty extends AbstractBaseBean implements Comparable<Con
     public int compareTo(final ConnConfProperty connConfProperty) {
         return ObjectUtils.compare(this.getSchema(), connConfProperty.getSchema());
     }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(schema).
+                append(values).
+                append(overridable).
+                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 ConnConfProperty other = (ConnConfProperty) obj;
+        return new EqualsBuilder().
+                append(schema, other.schema).
+                append(values, other.values).
+                append(overridable, other.overridable).
+                build();
+    }
 }
diff --git a/common/lib/src/test/java/org/apache/syncope/common/lib/JAXBTest.java b/common/lib/src/test/java/org/apache/syncope/common/lib/JAXBTest.java
index 70d1479..3c4e87c 100644
--- a/common/lib/src/test/java/org/apache/syncope/common/lib/JAXBTest.java
+++ b/common/lib/src/test/java/org/apache/syncope/common/lib/JAXBTest.java
@@ -49,7 +49,7 @@ public class JAXBTest {
             Marshaller marshaller = context.createMarshaller();
             marshaller.marshal(new UserTO(), new StringWriter());
             marshaller.marshal(new UserPatch(), new StringWriter());
-        } catch (Exception e) {
+        } catch (JAXBException e) {
             fail(ExceptionUtils.getStackTrace(e));
         }
     }
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/LoggerWrapper.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/LoggerWrapper.java
index 99f3f9c..b48fbb5 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/LoggerWrapper.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/LoggerWrapper.java
@@ -21,6 +21,7 @@ package org.apache.syncope.common.rest.api;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.stream.Collectors;
 import org.apache.syncope.common.lib.log.LoggerTO;
 import org.apache.syncope.common.lib.types.AuditLoggerName;
 import org.apache.syncope.common.lib.types.LoggerLevel;
@@ -33,24 +34,22 @@ public final class LoggerWrapper {
 
     public static List<AuditLoggerName> wrap(final Collection<LoggerTO> logger) {
         List<AuditLoggerName> result = new ArrayList<>();
-        for (LoggerTO loggerTO : logger) {
+        logger.forEach(loggerTO -> {
             try {
                 result.add(AuditLoggerName.fromLoggerName(loggerTO.getKey()));
             } catch (Exception ignore) {
                 // ignore
             }
-        }
+        });
         return result;
     }
 
     public static List<LoggerTO> unwrap(final Collection<AuditLoggerName> auditNames) {
-        List<LoggerTO> result = new ArrayList<>();
-        for (AuditLoggerName name : auditNames) {
+        return auditNames.stream().map(name -> {
             LoggerTO loggerTO = new LoggerTO();
             loggerTO.setKey(name.toLoggerName());
             loggerTO.setLevel(LoggerLevel.DEBUG);
-            result.add(loggerTO);
-        }
-        return result;
+            return loggerTO;
+        }).collect(Collectors.toList());
     }
 }
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/batch/BatchPayloadLine.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/batch/BatchPayloadLine.java
index aa2cf41..3aa0503 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/batch/BatchPayloadLine.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/batch/BatchPayloadLine.java
@@ -42,12 +42,28 @@ public class BatchPayloadLine {
     }
 
     @Override
-    public boolean equals(final Object obj) {
-        return EqualsBuilder.reflectionEquals(this, obj);
+    public int hashCode() {
+        return new HashCodeBuilder().
+                append(lineNumber).
+                append(content).
+                build();
     }
 
     @Override
-    public int hashCode() {
-        return HashCodeBuilder.reflectionHashCode(this);
+    public boolean equals(final Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        final BatchPayloadLine other = (BatchPayloadLine) obj;
+        return new EqualsBuilder().
+                append(lineNumber, other.lineNumber).
+                append(content, other.content).
+                build();
     }
 }
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AbstractQuery.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AbstractQuery.java
index 73d0bb3..771e560 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AbstractQuery.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AbstractQuery.java
@@ -18,13 +18,13 @@
  */
 package org.apache.syncope.common.rest.api.beans;
 
+import java.io.Serializable;
 import javax.validation.constraints.Min;
 import javax.ws.rs.DefaultValue;
 import javax.ws.rs.QueryParam;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.rest.api.service.JAXRSService;
 
-public abstract class AbstractQuery extends AbstractBaseBean {
+public abstract class AbstractQuery implements Serializable {
 
     private static final long serialVersionUID = -371488230250055359L;
 
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ConnObjectTOListQuery.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ConnObjectTOListQuery.java
index 951c29d..17322ca 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ConnObjectTOListQuery.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ConnObjectTOListQuery.java
@@ -23,10 +23,6 @@ import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import javax.ws.rs.DefaultValue;
 import javax.ws.rs.QueryParam;
-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.rest.api.service.JAXRSService;
 
 public class ConnObjectTOListQuery implements Serializable {
@@ -99,19 +95,4 @@ public class ConnObjectTOListQuery implements Serializable {
     public void setOrderBy(final String orderBy) {
         this.orderBy = orderBy;
     }
-
-    @Override
-    public boolean equals(final Object obj) {
-        return EqualsBuilder.reflectionEquals(this, obj);
-    }
-
-    @Override
-    public int hashCode() {
-        return HashCodeBuilder.reflectionHashCode(this);
-    }
-
-    @Override
-    public String toString() {
-        return ReflectionToStringBuilder.toString(this, ToStringStyle.JSON_STYLE);
-    }
 }
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecDeleteQuery.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecDeleteQuery.java
index 680c926..664a705 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecDeleteQuery.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecDeleteQuery.java
@@ -18,13 +18,13 @@
  */
 package org.apache.syncope.common.rest.api.beans;
 
+import java.io.Serializable;
 import java.util.Date;
 import javax.validation.constraints.NotNull;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.QueryParam;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 
-public class ExecDeleteQuery extends AbstractBaseBean {
+public class ExecDeleteQuery implements Serializable {
 
     private static final long serialVersionUID = 3846547401120638351L;
 
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecuteQuery.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecuteQuery.java
index c1fe6ec..0a8504f 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecuteQuery.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecuteQuery.java
@@ -18,14 +18,14 @@
  */
 package org.apache.syncope.common.rest.api.beans;
 
+import java.io.Serializable;
 import java.util.Date;
 import javax.validation.constraints.NotNull;
 import javax.ws.rs.DefaultValue;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.QueryParam;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 
-public class ExecuteQuery extends AbstractBaseBean {
+public class ExecuteQuery implements Serializable {
 
     private static final long serialVersionUID = 3846547401120638351L;
 
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/SchemaQuery.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/SchemaQuery.java
index 2c0805a..b7fd623 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/SchemaQuery.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/SchemaQuery.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.common.rest.api.beans;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -25,10 +26,9 @@ import java.util.List;
 import javax.validation.constraints.NotNull;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.QueryParam;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.types.SchemaType;
 
-public class SchemaQuery extends AbstractBaseBean {
+public class SchemaQuery implements Serializable {
 
     private static final long serialVersionUID = -1863334226169614417L;
 
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractExecutableLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractExecutableLogic.java
index a25325d..aa69180 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractExecutableLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractExecutableLogic.java
@@ -21,14 +21,14 @@ package org.apache.syncope.core.logic;
 import java.util.Date;
 import java.util.List;
 import org.apache.commons.lang3.tuple.Pair;
-import org.apache.syncope.common.lib.AbstractBaseBean;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.ExecTO;
 import org.apache.syncope.common.lib.to.JobTO;
 import org.apache.syncope.common.lib.types.JobAction;
 import org.apache.syncope.common.rest.api.batch.BatchResponseItem;
 import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
 
-public abstract class AbstractExecutableLogic<T extends AbstractBaseBean> extends AbstractJobLogic<T> {
+public abstract class AbstractExecutableLogic<T extends EntityTO> extends AbstractJobLogic<T> {
 
     public abstract ExecTO execute(String key, Date startAt, boolean dryRun);
 
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractJobLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractJobLogic.java
index 38bb876..416d6c1 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractJobLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractJobLogic.java
@@ -21,7 +21,7 @@ package org.apache.syncope.core.logic;
 import java.util.ArrayList;
 import java.util.List;
 import org.apache.commons.lang3.tuple.Triple;
-import org.apache.syncope.common.lib.AbstractBaseBean;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.JobTO;
 import org.apache.syncope.common.lib.types.JobAction;
 import org.apache.syncope.common.lib.types.JobType;
@@ -42,7 +42,7 @@ import org.springframework.beans.factory.NoSuchBeanDefinitionException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.quartz.SchedulerFactoryBean;
 
-abstract class AbstractJobLogic<T extends AbstractBaseBean> extends AbstractTransactionalLogic<T> {
+abstract class AbstractJobLogic<T extends EntityTO> extends AbstractTransactionalLogic<T> {
 
     @Autowired
     protected JobManager jobManager;
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractLogic.java
index 1706c99..ccd34ed 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractLogic.java
@@ -19,7 +19,7 @@
 package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
-import org.apache.syncope.common.lib.AbstractBaseBean;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.transaction.annotation.Transactional;
@@ -29,7 +29,7 @@ import org.springframework.transaction.annotation.Transactional;
  *
  * @param <T> transfer object used for input / output
  */
-abstract class AbstractLogic<T extends AbstractBaseBean> {
+abstract class AbstractLogic<T extends EntityTO> {
 
     protected static final Logger LOG = LoggerFactory.getLogger(AbstractLogic.class);
 
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractTransactionalLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractTransactionalLogic.java
index 08f2069..287312f 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractTransactionalLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractTransactionalLogic.java
@@ -18,7 +18,7 @@
  */
 package org.apache.syncope.core.logic;
 
-import org.apache.syncope.common.lib.AbstractBaseBean;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.springframework.transaction.annotation.Transactional;
 
 /**
@@ -27,5 +27,5 @@ import org.springframework.transaction.annotation.Transactional;
  * @param <T> transfer object used for input / output
  */
 @Transactional(rollbackFor = { Throwable.class })
-abstract class AbstractTransactionalLogic<T extends AbstractBaseBean> extends AbstractLogic<T> {
+abstract class AbstractTransactionalLogic<T extends EntityTO> extends AbstractLogic<T> {
 }
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java
index cc7a4bd..e0cf3d8 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java
@@ -23,6 +23,7 @@ import java.lang.reflect.Method;
 import java.util.List;
 import java.util.Optional;
 import org.apache.syncope.common.lib.to.AttrTO;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.apache.syncope.core.persistence.api.content.ContentExporter;
@@ -41,7 +42,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
 @Component
-public class ConfigurationLogic extends AbstractTransactionalLogic<AttrTO> {
+public class ConfigurationLogic extends AbstractTransactionalLogic<EntityTO> {
 
     @Autowired
     private ConfDAO confDAO;
@@ -125,7 +126,7 @@ public class ConfigurationLogic extends AbstractTransactionalLogic<AttrTO> {
     }
 
     @Override
-    protected AttrTO resolveReference(final Method method, final Object... args)
+    protected EntityTO resolveReference(final Method method, final Object... args)
             throws UnresolvedReferenceException {
 
         throw new UnresolvedReferenceException();
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java
index 57e2007..c0f144a 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java
@@ -36,6 +36,7 @@ import org.apache.syncope.common.lib.log.EventCategory;
 import org.apache.syncope.common.lib.log.LogAppender;
 import org.apache.syncope.common.lib.log.LogStatement;
 import org.apache.syncope.common.lib.log.LoggerTO;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.types.AuditElements.EventCategoryType;
 import org.apache.syncope.common.lib.types.AuditLoggerName;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
@@ -72,7 +73,7 @@ import org.springframework.util.ClassUtils;
 import org.springframework.util.SystemPropertyUtils;
 
 @Component
-public class LoggerLogic extends AbstractTransactionalLogic<LoggerTO> {
+public class LoggerLogic extends AbstractTransactionalLogic<EntityTO> {
 
     @Autowired
     private LoggerLoader loggerLoader;
@@ -404,7 +405,7 @@ public class LoggerLogic extends AbstractTransactionalLogic<LoggerTO> {
     }
 
     @Override
-    protected LoggerTO resolveReference(final Method method, final Object... args)
+    protected EntityTO resolveReference(final Method method, final Object... args)
             throws UnresolvedReferenceException {
 
         throw new UnresolvedReferenceException();
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java
index 34b1409..36c594b 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java
@@ -24,11 +24,11 @@ import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.tuple.Pair;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.collections.IteratorChain;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.ConnObjectTO;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.PullTaskTO;
 import org.apache.syncope.common.lib.to.PushTaskTO;
 import org.apache.syncope.common.lib.to.ReconStatus;
@@ -64,7 +64,7 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Component;
 
 @Component
-public class ReconciliationLogic extends AbstractTransactionalLogic<AbstractBaseBean> {
+public class ReconciliationLogic extends AbstractTransactionalLogic<EntityTO> {
 
     @Autowired
     private AnyUtilsFactory anyUtilsFactory;
@@ -237,7 +237,7 @@ public class ReconciliationLogic extends AbstractTransactionalLogic<AbstractBase
     }
 
     @Override
-    protected AbstractBaseBean resolveReference(final Method method, final Object... os)
+    protected EntityTO resolveReference(final Method method, final Object... os)
             throws UnresolvedReferenceException {
 
         throw new UnresolvedReferenceException();
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 8aa7151..1c1a07f 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
@@ -35,12 +35,12 @@ import java.util.stream.Collectors;
 import javax.annotation.Resource;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.info.JavaImplInfo;
 import org.apache.syncope.common.lib.info.NumbersInfo;
 import org.apache.syncope.common.lib.info.SystemInfo;
 import org.apache.syncope.common.lib.info.PlatformInfo;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.TypeExtensionTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
@@ -96,7 +96,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 @Transactional(readOnly = true)
 @Component
-public class SyncopeLogic extends AbstractLogic<AbstractBaseBean> {
+public class SyncopeLogic extends AbstractLogic<EntityTO> {
 
     private static final Object MONITOR = new Object();
 
@@ -424,10 +424,9 @@ public class SyncopeLogic extends AbstractLogic<AbstractBaseBean> {
     }
 
     @Override
-    protected AbstractBaseBean resolveReference(final Method method, final Object... args)
+    protected EntityTO resolveReference(final Method method, final Object... args)
             throws UnresolvedReferenceException {
 
         throw new UnresolvedReferenceException();
     }
-
 }
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttrValue.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttrValue.java
index 39e382a..988ef58 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttrValue.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttrValue.java
@@ -26,8 +26,7 @@ import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
+import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.syncope.common.lib.types.AttrSchemaType;
 import org.apache.syncope.core.provisioning.api.utils.FormatUtils;
 import org.apache.syncope.core.persistence.api.attrvalue.validation.ParsingValidationException;
@@ -276,6 +275,14 @@ public abstract class AbstractPlainAttrValue extends AbstractGeneratedKeyEntity
 
     @Override
     public String toString() {
-        return ReflectionToStringBuilder.toString(this, ToStringStyle.JSON_STYLE);
+        return new ToStringBuilder(this).
+                append(getKey()).
+                append(stringValue).
+                append(dateValue).
+                append(booleanValue).
+                append(longValue).
+                append(doubleValue).
+                append(binaryValue).
+                build();
     }
 }
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/ProvisioningReport.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/ProvisioningReport.java
index 8e6903e..4f47eda 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/ProvisioningReport.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/ProvisioningReport.java
@@ -20,8 +20,7 @@ package org.apache.syncope.core.provisioning.api.pushpull;
 
 import java.util.Collection;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
+import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.common.lib.types.TraceLevel;
 
@@ -107,7 +106,15 @@ public class ProvisioningReport {
 
     @Override
     public String toString() {
-        return new ReflectionToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).toString();
+        return new ToStringBuilder(this).
+                append(message).
+                append(status).
+                append(anyType).
+                append(operation).
+                append(key).
+                append(name).
+                append(uidValue).
+                build();
     }
 
     /**
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 8d56f53..a462107 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
@@ -20,13 +20,13 @@ package org.apache.syncope.core.provisioning.java;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
 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.to.UserTO;
 import org.apache.syncope.common.lib.types.AuditLoggerName;
 
-public class AuditEntry extends AbstractBaseBean {
+public class AuditEntry implements Serializable {
 
     private static final long serialVersionUID = -2299082316063743582L;
 
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractServiceImpl.java
index 2e9a0c0..6f83b11 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractServiceImpl.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractServiceImpl.java
@@ -18,10 +18,10 @@
  */
 package org.apache.syncope.core.rest.cxf.service;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.util.Map;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.EntityTag;
 import javax.ws.rs.core.MultivaluedMap;
@@ -35,7 +35,6 @@ import org.apache.cxf.jaxrs.ext.MessageContext;
 import org.apache.cxf.jaxrs.ext.search.SearchBean;
 import org.apache.cxf.jaxrs.ext.search.SearchCondition;
 import org.apache.cxf.jaxrs.ext.search.SearchContext;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.PagedResult;
@@ -217,7 +216,7 @@ abstract class AbstractServiceImpl implements JAXRSService {
      * @param totalCount total result size (not considering pagination)
      * @return paged result
      */
-    protected <T extends AbstractBaseBean> PagedResult<T> buildPagedResult(
+    protected <T extends Serializable> PagedResult<T> buildPagedResult(
             final List<T> list, final int page, final int size, final int totalCount) {
 
         PagedResult<T> result = new PagedResult<>();
@@ -229,9 +228,9 @@ abstract class AbstractServiceImpl implements JAXRSService {
 
         UriBuilder builder = uriInfo.getAbsolutePathBuilder();
         MultivaluedMap<String, String> queryParams = uriInfo.getQueryParameters();
-        for (Map.Entry<String, List<String>> queryParam : queryParams.entrySet()) {
-            builder.queryParam(queryParam.getKey(), queryParam.getValue().toArray());
-        }
+        queryParams.forEach((key, value) -> {
+            builder.queryParam(key, value.toArray());
+        });
 
         if (result.getPage() > 1) {
             result.setPrev(builder.
diff --git a/ext/camel/common-lib/src/main/java/org/apache/syncope/common/lib/to/CamelMetrics.java b/ext/camel/common-lib/src/main/java/org/apache/syncope/common/lib/to/CamelMetrics.java
index 050c63c..6e11884 100644
--- a/ext/camel/common-lib/src/main/java/org/apache/syncope/common/lib/to/CamelMetrics.java
+++ b/ext/camel/common-lib/src/main/java/org/apache/syncope/common/lib/to/CamelMetrics.java
@@ -19,23 +19,23 @@
 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;
 
 @XmlRootElement(name = "camelMetrics")
 @XmlType
-public class CamelMetrics extends AbstractBaseBean {
+public class CamelMetrics implements Serializable {
 
     private static final long serialVersionUID = -391404198406614231L;
 
     @XmlRootElement(name = "meanRate")
     @XmlType
-    public static class MeanRate extends AbstractBaseBean {
+    public static class MeanRate implements Serializable {
 
         private static final long serialVersionUID = -233921226510124154L;
 
diff --git a/ext/camel/common-lib/src/main/java/org/apache/syncope/common/lib/to/CamelRouteTO.java b/ext/camel/common-lib/src/main/java/org/apache/syncope/common/lib/to/CamelRouteTO.java
index 2425450..086db7f 100644
--- a/ext/camel/common-lib/src/main/java/org/apache/syncope/common/lib/to/CamelRouteTO.java
+++ b/ext/camel/common-lib/src/main/java/org/apache/syncope/common/lib/to/CamelRouteTO.java
@@ -21,12 +21,11 @@ package org.apache.syncope.common.lib.to;
 import javax.ws.rs.PathParam;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 
 @XmlRootElement(name = "camelRoute")
 @XmlType
-public class CamelRouteTO extends AbstractBaseBean implements EntityTO {
+public class CamelRouteTO implements EntityTO {
 
     private static final long serialVersionUID = 6431992877435181674L;
 
diff --git a/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/BpmnProcess.java b/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/BpmnProcess.java
index 35a7883..d1e150d 100644
--- a/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/BpmnProcess.java
+++ b/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/BpmnProcess.java
@@ -20,11 +20,10 @@ package org.apache.syncope.common.lib.to;
 
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 
 @XmlRootElement(name = "bpmnProcess")
 @XmlType
-public class BpmnProcess extends AbstractBaseBean implements EntityTO {
+public class BpmnProcess implements EntityTO {
 
     private static final long serialVersionUID = -7044543391316529128L;
 
diff --git a/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/UserRequest.java b/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/UserRequest.java
index 9b65845..b3fbe23 100644
--- a/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/UserRequest.java
+++ b/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/UserRequest.java
@@ -18,14 +18,14 @@
  */
 package org.apache.syncope.common.lib.to;
 
+import java.io.Serializable;
 import java.util.Date;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 
 @XmlRootElement(name = "userRequest")
 @XmlType
-public class UserRequest extends AbstractBaseBean {
+public class UserRequest implements Serializable {
 
     private static final long serialVersionUID = -8430826310789942133L;
 
diff --git a/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/UserRequestForm.java b/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/UserRequestForm.java
index 22118b5..6e17e79 100644
--- a/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/UserRequestForm.java
+++ b/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/UserRequestForm.java
@@ -20,6 +20,7 @@ package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -28,12 +29,11 @@ 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.patch.UserPatch;
 
 @XmlRootElement(name = "userRequestForm")
 @XmlType
-public class UserRequestForm extends AbstractBaseBean {
+public class UserRequestForm implements Serializable {
 
     private static final long serialVersionUID = -7044543391316529128L;
 
diff --git a/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/UserRequestFormProperty.java b/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/UserRequestFormProperty.java
index 95f2fec..eca017f 100644
--- a/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/UserRequestFormProperty.java
+++ b/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/UserRequestFormProperty.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.HashMap;
 import java.util.Map;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 import org.apache.syncope.common.lib.types.UserRequestFormPropertyType;
 
 @XmlRootElement(name = "userRequestFormProperty")
 @XmlType
-public class UserRequestFormProperty extends AbstractBaseBean {
+public class UserRequestFormProperty implements Serializable {
 
     private static final long serialVersionUID = 9139969592634304261L;
 
diff --git a/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/WorkflowTask.java b/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/WorkflowTask.java
index 6b712ab..8437bdf 100644
--- a/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/WorkflowTask.java
+++ b/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/WorkflowTask.java
@@ -18,13 +18,13 @@
  */
 package org.apache.syncope.common.lib.to;
 
+import java.io.Serializable;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 
 @XmlRootElement(name = "workflowTask")
 @XmlType
-public class WorkflowTask extends AbstractBaseBean {
+public class WorkflowTask implements Serializable {
 
     private static final long serialVersionUID = -3095016727396210808L;
 
diff --git a/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/WorkflowTaskExecInput.java b/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/WorkflowTaskExecInput.java
index 0a7e2be..4018d24 100644
--- a/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/WorkflowTaskExecInput.java
+++ b/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/WorkflowTaskExecInput.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.HashMap;
 import java.util.Map;
 import javax.ws.rs.PathParam;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 
 @XmlRootElement(name = "workflowTaskExecInput")
 @XmlType
-public class WorkflowTaskExecInput extends AbstractBaseBean {
+public class WorkflowTaskExecInput implements Serializable {
 
     private static final long serialVersionUID = 8060283119070901756L;
 
diff --git a/ext/flowable/logic/src/main/java/org/apache/syncope/core/logic/UserRequestLogic.java b/ext/flowable/logic/src/main/java/org/apache/syncope/core/logic/UserRequestLogic.java
index 686677e..edff188 100644
--- a/ext/flowable/logic/src/main/java/org/apache/syncope/core/logic/UserRequestLogic.java
+++ b/ext/flowable/logic/src/main/java/org/apache/syncope/core/logic/UserRequestLogic.java
@@ -24,6 +24,7 @@ import org.apache.commons.io.output.NullOutputStream;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.patch.UserPatch;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.PropagationTaskTO;
 import org.apache.syncope.common.lib.to.UserRequest;
 import org.apache.syncope.common.lib.to.UserTO;
@@ -49,7 +50,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
 @Component
-public class UserRequestLogic extends AbstractTransactionalLogic<UserRequestForm> {
+public class UserRequestLogic extends AbstractTransactionalLogic<EntityTO> {
 
     @Autowired
     protected BpmnProcessManager bpmnProcessManager;
@@ -205,7 +206,7 @@ public class UserRequestLogic extends AbstractTransactionalLogic<UserRequestForm
     }
 
     @Override
-    protected UserRequestForm resolveReference(final Method method, final Object... args)
+    protected EntityTO resolveReference(final Method method, final Object... args)
             throws UnresolvedReferenceException {
 
         throw new UnresolvedReferenceException();
diff --git a/ext/flowable/logic/src/main/java/org/apache/syncope/core/logic/UserWorkflowTaskLogic.java b/ext/flowable/logic/src/main/java/org/apache/syncope/core/logic/UserWorkflowTaskLogic.java
index 8d73fae..76d4ad9 100644
--- a/ext/flowable/logic/src/main/java/org/apache/syncope/core/logic/UserWorkflowTaskLogic.java
+++ b/ext/flowable/logic/src/main/java/org/apache/syncope/core/logic/UserWorkflowTaskLogic.java
@@ -22,9 +22,9 @@ import java.lang.reflect.Method;
 import java.util.List;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.lib.patch.UserPatch;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.PropagationTaskTO;
 import org.apache.syncope.common.lib.to.UserTO;
-import org.apache.syncope.common.lib.to.UserRequestForm;
 import org.apache.syncope.common.lib.to.WorkflowTask;
 import org.apache.syncope.common.lib.to.WorkflowTaskExecInput;
 import org.apache.syncope.common.lib.types.FlowableEntitlement;
@@ -41,7 +41,7 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Component;
 
 @Component
-public class UserWorkflowTaskLogic extends AbstractTransactionalLogic<UserRequestForm> {
+public class UserWorkflowTaskLogic extends AbstractTransactionalLogic<EntityTO> {
 
     @Autowired
     private WorkflowTaskManager wfTaskManager;
@@ -83,7 +83,7 @@ public class UserWorkflowTaskLogic extends AbstractTransactionalLogic<UserReques
     }
 
     @Override
-    protected UserRequestForm resolveReference(final Method method, final Object... args)
+    protected EntityTO resolveReference(final Method method, final Object... args)
             throws UnresolvedReferenceException {
 
         throw new UnresolvedReferenceException();
diff --git a/ext/oidcclient/common-lib/src/main/java/org/apache/syncope/common/lib/to/OIDCLoginRequestTO.java b/ext/oidcclient/common-lib/src/main/java/org/apache/syncope/common/lib/to/OIDCLoginRequestTO.java
index 5d4dc31..8186d76 100644
--- a/ext/oidcclient/common-lib/src/main/java/org/apache/syncope/common/lib/to/OIDCLoginRequestTO.java
+++ b/ext/oidcclient/common-lib/src/main/java/org/apache/syncope/common/lib/to/OIDCLoginRequestTO.java
@@ -18,13 +18,13 @@
  */
 package org.apache.syncope.common.lib.to;
 
+import java.io.Serializable;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 
 @XmlRootElement(name = "oidcLoginRequest")
 @XmlType
-public class OIDCLoginRequestTO extends AbstractBaseBean {
+public class OIDCLoginRequestTO implements Serializable {
 
     private static final long serialVersionUID = -3509031322459942441L;
 
diff --git a/ext/oidcclient/common-lib/src/main/java/org/apache/syncope/common/lib/to/OIDCLoginResponseTO.java b/ext/oidcclient/common-lib/src/main/java/org/apache/syncope/common/lib/to/OIDCLoginResponseTO.java
index 78e4dd6..c767292 100644
--- a/ext/oidcclient/common-lib/src/main/java/org/apache/syncope/common/lib/to/OIDCLoginResponseTO.java
+++ b/ext/oidcclient/common-lib/src/main/java/org/apache/syncope/common/lib/to/OIDCLoginResponseTO.java
@@ -20,6 +20,7 @@ package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.Optional;
@@ -28,11 +29,10 @@ 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;
 
 @XmlRootElement(name = "oidcLoginResponse")
 @XmlType
-public class OIDCLoginResponseTO extends AbstractBaseBean {
+public class OIDCLoginResponseTO implements Serializable {
 
     private static final long serialVersionUID = -5971442076182154492L;
 
diff --git a/ext/oidcclient/common-lib/src/main/java/org/apache/syncope/common/lib/to/OIDCLogoutRequestTO.java b/ext/oidcclient/common-lib/src/main/java/org/apache/syncope/common/lib/to/OIDCLogoutRequestTO.java
index 80d83a1..611cdca 100644
--- a/ext/oidcclient/common-lib/src/main/java/org/apache/syncope/common/lib/to/OIDCLogoutRequestTO.java
+++ b/ext/oidcclient/common-lib/src/main/java/org/apache/syncope/common/lib/to/OIDCLogoutRequestTO.java
@@ -18,13 +18,13 @@
  */
 package org.apache.syncope.common.lib.to;
 
+import java.io.Serializable;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 
 @XmlRootElement(name = "oidcLogoutRequest")
 @XmlType
-public class OIDCLogoutRequestTO extends AbstractBaseBean {
+public class OIDCLogoutRequestTO implements Serializable {
 
     private static final long serialVersionUID = -4708360216757961537L;
 
@@ -37,5 +37,4 @@ public class OIDCLogoutRequestTO extends AbstractBaseBean {
     public void setEndSessionEndpoint(final String endSessionEndpoint) {
         this.endSessionEndpoint = endSessionEndpoint;
     }
-
 }
diff --git a/ext/oidcclient/common-lib/src/main/java/org/apache/syncope/common/lib/to/OIDCProviderTO.java b/ext/oidcclient/common-lib/src/main/java/org/apache/syncope/common/lib/to/OIDCProviderTO.java
index 7a3545f..60ecf41 100644
--- a/ext/oidcclient/common-lib/src/main/java/org/apache/syncope/common/lib/to/OIDCProviderTO.java
+++ b/ext/oidcclient/common-lib/src/main/java/org/apache/syncope/common/lib/to/OIDCProviderTO.java
@@ -28,11 +28,10 @@ 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;
 
 @XmlRootElement(name = "oidcprovider")
 @XmlType
-public class OIDCProviderTO extends AbstractBaseBean implements EntityTO, ItemContainerTO {
+public class OIDCProviderTO implements EntityTO, ItemContainerTO {
 
     private static final long serialVersionUID = -1229802774546135794L;
 
diff --git a/ext/oidcclient/logic/src/main/java/org/apache/syncope/core/logic/OIDCClientLogic.java b/ext/oidcclient/logic/src/main/java/org/apache/syncope/core/logic/OIDCClientLogic.java
index 5141c6f..9c9acbf 100644
--- a/ext/oidcclient/logic/src/main/java/org/apache/syncope/core/logic/OIDCClientLogic.java
+++ b/ext/oidcclient/logic/src/main/java/org/apache/syncope/core/logic/OIDCClientLogic.java
@@ -44,9 +44,9 @@ import org.apache.cxf.rs.security.oidc.common.IdToken;
 import org.apache.cxf.rs.security.oidc.common.UserInfo;
 import org.apache.cxf.rs.security.oidc.rp.IdTokenReader;
 import org.apache.cxf.rs.security.oidc.rp.UserInfoClient;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AttrTO;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.OIDCLoginRequestTO;
 import org.apache.syncope.common.lib.to.OIDCLoginResponseTO;
 import org.apache.syncope.common.lib.to.OIDCLogoutRequestTO;
@@ -71,7 +71,7 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Component;
 
 @Component
-public class OIDCClientLogic extends AbstractTransactionalLogic<AbstractBaseBean> {
+public class OIDCClientLogic extends AbstractTransactionalLogic<EntityTO> {
 
     private static final String JWT_CLAIM_OP_ENTITYID = "OP_ENTITYID";
 
@@ -437,7 +437,7 @@ public class OIDCClientLogic extends AbstractTransactionalLogic<AbstractBaseBean
     }
 
     @Override
-    protected AbstractBaseBean resolveReference(
+    protected EntityTO resolveReference(
             final Method method, final Object... args) throws UnresolvedReferenceException {
 
         throw new UnresolvedReferenceException();
diff --git a/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2IdPTO.java b/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2IdPTO.java
index 609f012..76b3259 100644
--- a/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2IdPTO.java
+++ b/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2IdPTO.java
@@ -26,12 +26,11 @@ 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.SAML2BindingType;
 
 @XmlRootElement(name = "saml2idp")
 @XmlType
-public class SAML2IdPTO extends AbstractBaseBean implements EntityTO, ItemContainerTO {
+public class SAML2IdPTO implements EntityTO, ItemContainerTO {
 
     private static final long serialVersionUID = 4426527052873779881L;
 
diff --git a/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2LoginResponseTO.java b/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2LoginResponseTO.java
index 177a3e5..b676257 100644
--- a/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2LoginResponseTO.java
+++ b/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2LoginResponseTO.java
@@ -20,6 +20,7 @@ package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.Optional;
@@ -28,11 +29,10 @@ 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;
 
 @XmlRootElement(name = "saml2LoginResponse")
 @XmlType
-public class SAML2LoginResponseTO extends AbstractBaseBean {
+public class SAML2LoginResponseTO implements Serializable {
 
     private static final long serialVersionUID = 794772343787258010L;
 
diff --git a/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2ReceivedResponseTO.java b/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2ReceivedResponseTO.java
index 556be9b..466ac8b 100644
--- a/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2ReceivedResponseTO.java
+++ b/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2ReceivedResponseTO.java
@@ -18,14 +18,14 @@
  */
 package org.apache.syncope.common.lib.to;
 
+import java.io.Serializable;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 
 @XmlRootElement(name = "saml2ReceivedResponse")
 @XmlType
-public class SAML2ReceivedResponseTO extends AbstractBaseBean {
+public class SAML2ReceivedResponseTO implements Serializable {
 
     private static final long serialVersionUID = 6102419133516694822L;
 
diff --git a/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2RequestTO.java b/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2RequestTO.java
index 143a1b3..a360181 100644
--- a/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2RequestTO.java
+++ b/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2RequestTO.java
@@ -18,14 +18,14 @@
  */
 package org.apache.syncope.common.lib.to;
 
+import java.io.Serializable;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.types.SAML2BindingType;
 
 @XmlRootElement(name = "saml2request")
 @XmlType
-public class SAML2RequestTO extends AbstractBaseBean {
+public class SAML2RequestTO implements Serializable {
 
     private static final long serialVersionUID = -2454209295007372086L;
 
diff --git a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/AbstractSAML2Logic.java b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/AbstractSAML2Logic.java
index 01c04ea..221cc44 100644
--- a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/AbstractSAML2Logic.java
+++ b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/AbstractSAML2Logic.java
@@ -18,11 +18,11 @@
  */
 package org.apache.syncope.core.logic;
 
-import org.apache.syncope.common.lib.AbstractBaseBean;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.core.logic.init.SAML2SPLoader;
 import org.springframework.beans.factory.annotation.Autowired;
 
-public abstract class AbstractSAML2Logic<T extends AbstractBaseBean> extends AbstractTransactionalLogic<T> {
+public abstract class AbstractSAML2Logic<T extends EntityTO> extends AbstractTransactionalLogic<T> {
 
     @Autowired
     protected SAML2SPLoader loader;
diff --git a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2SPLogic.java b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2SPLogic.java
index b660b27..f5e6ce1 100644
--- a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2SPLogic.java
+++ b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2SPLogic.java
@@ -34,9 +34,9 @@ import org.apache.commons.lang3.tuple.Pair;
 import org.apache.cxf.rs.security.jose.jws.JwsJwtCompactConsumer;
 import org.apache.cxf.rs.security.jose.jws.JwsSignatureVerifier;
 import org.apache.cxf.rs.security.saml.sso.SSOValidatorResponse;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AttrTO;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.SAML2RequestTO;
 import org.apache.syncope.common.lib.to.SAML2LoginResponseTO;
 import org.apache.syncope.common.lib.to.SAML2ReceivedResponseTO;
@@ -108,7 +108,7 @@ import org.springframework.beans.factory.support.AbstractBeanDefinition;
 import org.springframework.util.ResourceUtils;
 
 @Component
-public class SAML2SPLogic extends AbstractSAML2Logic<AbstractBaseBean> {
+public class SAML2SPLogic extends AbstractSAML2Logic<EntityTO> {
 
     private static final String IDP_INITIATED_RELAY_STATE = "idpInitiated";
 
@@ -700,7 +700,7 @@ public class SAML2SPLogic extends AbstractSAML2Logic<AbstractBaseBean> {
     }
 
     @Override
-    protected AbstractBaseBean resolveReference(
+    protected EntityTO resolveReference(
             final Method method, final Object... args) throws UnresolvedReferenceException {
 
         throw new UnresolvedReferenceException();
diff --git a/ext/scimv2/logic/src/main/java/org/apache/syncope/core/logic/SCIMLogic.java b/ext/scimv2/logic/src/main/java/org/apache/syncope/core/logic/SCIMLogic.java
index f09bdeb..8ddfcf7 100644
--- a/ext/scimv2/logic/src/main/java/org/apache/syncope/core/logic/SCIMLogic.java
+++ b/ext/scimv2/logic/src/main/java/org/apache/syncope/core/logic/SCIMLogic.java
@@ -29,8 +29,8 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import javax.ws.rs.core.UriBuilder;
-import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.scim.SCIMConf;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.core.logic.scim.SCIMConfManager;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.ext.scimv2.api.data.AuthenticationScheme;
@@ -47,7 +47,7 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Component;
 
 @Component
-public class SCIMLogic extends AbstractLogic<AbstractBaseBean> {
+public class SCIMLogic extends AbstractLogic<EntityTO> {
 
     private static final String SCHEMAS_JSON = "schemas.json";
 
@@ -191,10 +191,9 @@ public class SCIMLogic extends AbstractLogic<AbstractBaseBean> {
     }
 
     @Override
-    protected AbstractBaseBean resolveReference(final Method method, final Object... args)
+    protected EntityTO resolveReference(final Method method, final Object... args)
             throws UnresolvedReferenceException {
 
         throw new UnresolvedReferenceException();
     }
-
 }