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/06 16:16:12 UTC

[syncope] 02/02: [SYNCOPE-1392] Removing BeanUtils#copyProperties

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

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

commit d2524ead7102e38f6b490c3da792f43bcd81ae51
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Tue Nov 6 17:15:14 2018 +0100

    [SYNCOPE-1392] Removing BeanUtils#copyProperties
---
 .../org/apache/syncope/core/logic/LoggerLogic.java |  10 +-
 .../core/persistence/jpa/dao/AbstractAnyDAO.java   |  43 +----
 .../core/persistence/jpa/dao/JPAAnyObjectDAO.java  |  34 +---
 .../core/persistence/jpa/dao/JPADynRealmDAO.java   |  14 +-
 .../jpa/dao/JPAExternalResourceDAO.java            | 104 ++---------
 .../core/persistence/jpa/dao/JPAGroupDAO.java      |  60 ++-----
 .../persistence/jpa/dao/JPAPlainSchemaDAO.java     |  13 +-
 .../core/persistence/jpa/dao/JPARoleDAO.java       |  15 +-
 .../core/persistence/jpa/dao/JPAUserDAO.java       |  43 ++---
 .../core/persistence/jpa/dao/JPAVirSchemaDAO.java  |  14 +-
 .../java/data/AccessTokenDataBinderImpl.java       |   6 +-
 .../java/data/AnyObjectDataBinderImpl.java         |  16 +-
 .../java/data/ConnInstanceDataBinderImpl.java      |  28 ++-
 .../java/data/ImplementationDataBinderImpl.java    |  14 +-
 .../java/data/NotificationDataBinderImpl.java      |  29 +++-
 .../java/data/RemediationDataBinderImpl.java       |  12 +-
 .../java/data/ReportDataBinderImpl.java            |  22 ++-
 .../java/data/ResourceDataBinderImpl.java          |  39 ++++-
 .../java/data/SchemaDataBinderImpl.java            |  46 ++++-
 .../java/data/SecurityQuestionDataBinderImpl.java  |   7 +-
 .../provisioning/java/data/TaskDataBinderImpl.java | 114 +++++++-----
 .../provisioning/java/data/UserDataBinderImpl.java |  23 ++-
 .../org/apache/syncope/core/spring/BeanUtils.java  | 193 ---------------------
 .../camel/data/CamelRouteDataBinderImpl.java       |   7 +-
 .../flowable/impl/FlowableUserRequestHandler.java  |  23 ++-
 .../flowable/impl/FlowableUserWorkflowAdapter.java |   2 +-
 .../java/data/OIDCProviderDataBinderImpl.java      |  17 +-
 .../java/data/SAML2IdPDataBinderImpl.java          |  19 +-
 .../syncope/fit/core/NotificationITCase.java       |   7 +-
 .../apache/syncope/fit/core/PlainSchemaITCase.java |   4 +-
 .../apache/syncope/fit/core/PullTaskITCase.java    |   2 +-
 31 files changed, 374 insertions(+), 606 deletions(-)

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 b96a4a2..57e2007 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
@@ -55,7 +55,6 @@ import org.apache.syncope.core.persistence.api.dao.LoggerDAO;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
 import org.apache.syncope.core.persistence.api.entity.Logger;
-import org.apache.syncope.core.spring.BeanUtils;
 import org.apache.syncope.core.provisioning.java.pushpull.PushJobDelegate;
 import org.apache.syncope.core.provisioning.java.pushpull.PullJobDelegate;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
@@ -116,7 +115,8 @@ public class LoggerLogic extends AbstractTransactionalLogic<LoggerTO> {
     private List<LoggerTO> list(final LoggerType type) {
         return loggerDAO.findAll(type).stream().map(logger -> {
             LoggerTO loggerTO = new LoggerTO();
-            BeanUtils.copyProperties(logger, loggerTO);
+            loggerTO.setKey(logger.getKey());
+            loggerTO.setLevel(logger.getLevel());
             return loggerTO;
         }).collect(Collectors.toList());
     }
@@ -230,7 +230,8 @@ public class LoggerLogic extends AbstractTransactionalLogic<LoggerTO> {
         ctx.updateLoggers();
 
         LoggerTO result = new LoggerTO();
-        BeanUtils.copyProperties(syncopeLogger, result);
+        result.setKey(syncopeLogger.getKey());
+        result.setLevel(syncopeLogger.getLevel());
 
         return result;
     }
@@ -262,7 +263,8 @@ public class LoggerLogic extends AbstractTransactionalLogic<LoggerTO> {
         }
 
         LoggerTO loggerToDelete = new LoggerTO();
-        BeanUtils.copyProperties(syncopeLogger, loggerToDelete);
+        loggerToDelete.setKey(syncopeLogger.getKey());
+        loggerToDelete.setLevel(syncopeLogger.getLevel());
 
         // remove SyncopeLogger from local storage, so that LoggerLoader won't load this next time
         loggerDAO.delete(syncopeLogger);
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
index 3320bb6..568b007 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
@@ -58,7 +58,6 @@ import org.apache.syncope.core.persistence.api.entity.group.Group;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUser;
-import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.transaction.annotation.Propagation;
@@ -69,41 +68,17 @@ public abstract class AbstractAnyDAO<A extends Any<?>> extends AbstractDAO<A> im
     @Autowired
     protected ApplicationEventPublisher publisher;
 
+    @Autowired
     private PlainSchemaDAO plainSchemaDAO;
 
+    @Autowired
     private DerSchemaDAO derSchemaDAO;
 
-    private DynRealmDAO dynRealmDAO;
+    @Autowired
+    protected DynRealmDAO dynRealmDAO;
 
     private AnyUtils anyUtils;
 
-    private PlainSchemaDAO plainSchemaDAO() {
-        synchronized (this) {
-            if (plainSchemaDAO == null) {
-                plainSchemaDAO = ApplicationContextProvider.getApplicationContext().getBean(PlainSchemaDAO.class);
-            }
-        }
-        return plainSchemaDAO;
-    }
-
-    private DerSchemaDAO derSchemaDAO() {
-        synchronized (this) {
-            if (derSchemaDAO == null) {
-                derSchemaDAO = ApplicationContextProvider.getApplicationContext().getBean(DerSchemaDAO.class);
-            }
-        }
-        return derSchemaDAO;
-    }
-
-    protected DynRealmDAO dynRealmDAO() {
-        synchronized (this) {
-            if (dynRealmDAO == null) {
-                dynRealmDAO = ApplicationContextProvider.getApplicationContext().getBean(DynRealmDAO.class);
-            }
-        }
-        return dynRealmDAO;
-    }
-
     protected abstract AnyUtils init();
 
     protected AnyUtils anyUtils() {
@@ -197,7 +172,7 @@ public abstract class AbstractAnyDAO<A extends Any<?>> extends AbstractDAO<A> im
             final PlainAttrValue attrValue,
             final boolean ignoreCaseMatch) {
 
-        PlainSchema schema = plainSchemaDAO().find(schemaKey);
+        PlainSchema schema = plainSchemaDAO.find(schemaKey);
         if (schema == null) {
             LOG.error("Invalid schema '{}'", schemaKey);
             return Collections.<A>emptyList();
@@ -235,7 +210,7 @@ public abstract class AbstractAnyDAO<A extends Any<?>> extends AbstractDAO<A> im
             final PlainAttrValue attrUniqueValue,
             final boolean ignoreCaseMatch) {
 
-        PlainSchema schema = plainSchemaDAO().find(schemaKey);
+        PlainSchema schema = plainSchemaDAO.find(schemaKey);
         if (schema == null) {
             LOG.error("Invalid schema '{}'", schemaKey);
             return null;
@@ -334,7 +309,7 @@ public abstract class AbstractAnyDAO<A extends Any<?>> extends AbstractDAO<A> im
         for (int i = 0; i < identifiers.size(); i++) {
             if (!used.contains(identifiers.get(i))) {
                 // verify schema existence and get schema type
-                PlainSchema schema = plainSchemaDAO().find(identifiers.get(i));
+                PlainSchema schema = plainSchemaDAO.find(identifiers.get(i));
                 if (schema == null) {
                     LOG.error("Invalid schema '{}', ignoring", identifiers.get(i));
                 } else {
@@ -394,7 +369,7 @@ public abstract class AbstractAnyDAO<A extends Any<?>> extends AbstractDAO<A> im
 
     @Override
     public List<A> findByDerAttrValue(final String schemaKey, final String value, final boolean ignoreCaseMatch) {
-        DerSchema schema = derSchemaDAO().find(schemaKey);
+        DerSchema schema = derSchemaDAO.find(schemaKey);
         if (schema == null) {
             LOG.error("Invalid schema '{}'", schemaKey);
             return Collections.<A>emptyList();
@@ -541,7 +516,7 @@ public abstract class AbstractAnyDAO<A extends Any<?>> extends AbstractDAO<A> im
                 ? (String) ((Object[]) resultKey)[0]
                 : ((String) resultKey)).
                 forEachOrdered((actualKey) -> {
-                    DynRealm dynRealm = dynRealmDAO().find(actualKey.toString());
+                    DynRealm dynRealm = dynRealmDAO.find(actualKey.toString());
                     if (dynRealm == null) {
                         LOG.error("Could not find dynRealm with id {}, even though returned by the native query",
                                 actualKey);
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java
index a7211de..278434f 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java
@@ -55,7 +55,7 @@ import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAnyObject;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAURelationship;
 import org.apache.syncope.core.provisioning.api.event.AnyCreatedUpdatedEvent;
 import org.apache.syncope.core.provisioning.api.event.AnyDeletedEvent;
-import org.apache.syncope.core.spring.ApplicationContextProvider;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
@@ -63,28 +63,12 @@ import org.springframework.transaction.annotation.Transactional;
 @Repository
 public class JPAAnyObjectDAO extends AbstractAnyDAO<AnyObject> implements AnyObjectDAO {
 
+    @Autowired
     private UserDAO userDAO;
 
+    @Autowired
     private GroupDAO groupDAO;
 
-    private UserDAO userDAO() {
-        synchronized (this) {
-            if (userDAO == null) {
-                userDAO = ApplicationContextProvider.getApplicationContext().getBean(UserDAO.class);
-            }
-        }
-        return userDAO;
-    }
-
-    private GroupDAO groupDAO() {
-        synchronized (this) {
-            if (groupDAO == null) {
-                groupDAO = ApplicationContextProvider.getApplicationContext().getBean(GroupDAO.class);
-            }
-        }
-        return groupDAO;
-    }
-
     @Override
     protected AnyUtils init() {
         return new JPAAnyUtilsFactory().getInstance(AnyTypeKind.ANY_OBJECT);
@@ -211,8 +195,8 @@ public class JPAAnyObjectDAO extends AbstractAnyDAO<AnyObject> implements AnyObj
         AnyObject merged = super.save(anyObject);
         publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, merged, AuthContextUtils.getDomain()));
 
-        Pair<Set<String>, Set<String>> dynGroupMembs = groupDAO().refreshDynMemberships(merged);
-        dynRealmDAO().refreshDynMemberships(merged);
+        Pair<Set<String>, Set<String>> dynGroupMembs = groupDAO.refreshDynMemberships(merged);
+        dynRealmDAO.refreshDynMemberships(merged);
 
         return Pair.of(merged, dynGroupMembs);
     }
@@ -247,8 +231,8 @@ public class JPAAnyObjectDAO extends AbstractAnyDAO<AnyObject> implements AnyObj
 
     @Override
     public void delete(final AnyObject anyObject) {
-        groupDAO().removeDynMemberships(anyObject);
-        dynRealmDAO().removeDynMemberships(anyObject.getKey());
+        groupDAO.removeDynMemberships(anyObject);
+        dynRealmDAO.removeDynMemberships(anyObject.getKey());
 
         findARelationships(anyObject).forEach(relationship -> {
             relationship.getLeftEnd().getRelationships().remove(relationship);
@@ -258,7 +242,7 @@ public class JPAAnyObjectDAO extends AbstractAnyDAO<AnyObject> implements AnyObj
         });
         findURelationships(anyObject).forEach(relationship -> {
             relationship.getLeftEnd().getRelationships().remove(relationship);
-            userDAO().save(relationship.getLeftEnd());
+            userDAO.save(relationship.getLeftEnd());
 
             entityManager().remove(relationship);
         });
@@ -281,7 +265,7 @@ public class JPAAnyObjectDAO extends AbstractAnyDAO<AnyObject> implements AnyObj
                 ? (String) ((Object[]) resultKey)[0]
                 : ((String) resultKey)).
                 forEachOrdered(actualKey -> {
-                    Group group = groupDAO().find(actualKey.toString());
+                    Group group = groupDAO.find(actualKey.toString());
                     if (group == null) {
                         LOG.error("Could not find group with id {}, even though returned by the native query",
                                 actualKey);
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADynRealmDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADynRealmDAO.java
index b9d2f01..7fc9585 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADynRealmDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADynRealmDAO.java
@@ -47,24 +47,16 @@ public class JPADynRealmDAO extends AbstractDAO<DynRealm> implements DynRealmDAO
     @Autowired
     private ApplicationEventPublisher publisher;
 
+    @Autowired
     private AnySearchDAO searchDAO;
 
     private AnySearchDAO jpaAnySearchDAO;
 
-    private AnySearchDAO searchDAO() {
-        synchronized (this) {
-            if (searchDAO == null) {
-                searchDAO = ApplicationContextProvider.getApplicationContext().getBean(AnySearchDAO.class);
-            }
-        }
-        return searchDAO;
-    }
-
     private AnySearchDAO jpaAnySearchDAO() {
         synchronized (this) {
             if (jpaAnySearchDAO == null) {
-                if (AopUtils.getTargetClass(searchDAO()).equals(JPAAnySearchDAO.class)) {
-                    jpaAnySearchDAO = searchDAO();
+                if (AopUtils.getTargetClass(searchDAO).equals(JPAAnySearchDAO.class)) {
+                    jpaAnySearchDAO = searchDAO;
                 } else {
                     jpaAnySearchDAO = (AnySearchDAO) ApplicationContextProvider.getBeanFactory().
                             createBean(JPAAnySearchDAO.class, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, true);
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java
index 9c573fd..f684a15 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java
@@ -52,7 +52,6 @@ import org.apache.syncope.core.persistence.jpa.entity.resource.JPAExternalResour
 import org.apache.syncope.core.persistence.jpa.entity.resource.JPAMapping;
 import org.apache.syncope.core.persistence.jpa.entity.resource.JPAProvision;
 import org.apache.syncope.core.provisioning.api.ConnectorRegistry;
-import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.apache.syncope.core.spring.security.DelegatedAdministrationException;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -65,95 +64,30 @@ public class JPAExternalResourceDAO extends AbstractDAO<ExternalResource> implem
     @Autowired
     private ConnectorRegistry connRegistry;
 
+    @Autowired
     private TaskDAO taskDAO;
 
+    @Autowired
     private AnyObjectDAO anyObjectDAO;
 
+    @Autowired
     private UserDAO userDAO;
 
+    @Autowired
     private GroupDAO groupDAO;
 
+    @Autowired
     private PolicyDAO policyDAO;
 
+    @Autowired
     private VirSchemaDAO virSchemaDAO;
 
+    @Autowired
     private RealmDAO realmDAO;
 
+    @Autowired
     private ExternalResourceHistoryConfDAO externalResourceHistoryConfDAO;
 
-    private TaskDAO taskDAO() {
-        synchronized (this) {
-            if (taskDAO == null) {
-                taskDAO = ApplicationContextProvider.getApplicationContext().getBean(TaskDAO.class);
-            }
-        }
-        return taskDAO;
-    }
-
-    private AnyObjectDAO anyObjectDAO() {
-        synchronized (this) {
-            if (anyObjectDAO == null) {
-                anyObjectDAO = ApplicationContextProvider.getApplicationContext().getBean(AnyObjectDAO.class);
-            }
-        }
-        return anyObjectDAO;
-    }
-
-    private UserDAO userDAO() {
-        synchronized (this) {
-            if (userDAO == null) {
-                userDAO = ApplicationContextProvider.getApplicationContext().getBean(UserDAO.class);
-            }
-        }
-        return userDAO;
-    }
-
-    private GroupDAO groupDAO() {
-        synchronized (this) {
-            if (groupDAO == null) {
-                groupDAO = ApplicationContextProvider.getApplicationContext().getBean(GroupDAO.class);
-            }
-        }
-        return groupDAO;
-    }
-
-    private PolicyDAO policyDAO() {
-        synchronized (this) {
-            if (policyDAO == null) {
-                policyDAO = ApplicationContextProvider.getApplicationContext().getBean(PolicyDAO.class);
-            }
-        }
-        return policyDAO;
-    }
-
-    private VirSchemaDAO virSchemaDAO() {
-        synchronized (this) {
-            if (virSchemaDAO == null) {
-                virSchemaDAO = ApplicationContextProvider.getApplicationContext().getBean(VirSchemaDAO.class);
-            }
-        }
-        return virSchemaDAO;
-    }
-
-    private RealmDAO realmDAO() {
-        synchronized (this) {
-            if (realmDAO == null) {
-                realmDAO = ApplicationContextProvider.getApplicationContext().getBean(RealmDAO.class);
-            }
-        }
-        return realmDAO;
-    }
-
-    private ExternalResourceHistoryConfDAO externalResourceHistoryConfDAO() {
-        synchronized (this) {
-            if (externalResourceHistoryConfDAO == null) {
-                externalResourceHistoryConfDAO = ApplicationContextProvider.getApplicationContext().
-                        getBean(ExternalResourceHistoryConfDAO.class);
-            }
-        }
-        return externalResourceHistoryConfDAO;
-    }
-
     @Override
     public int count() {
         Query query = entityManager().createQuery(
@@ -302,19 +236,19 @@ public class JPAExternalResourceDAO extends AbstractDAO<ExternalResource> implem
             return;
         }
 
-        taskDAO().deleteAll(resource, TaskType.PROPAGATION);
-        taskDAO().deleteAll(resource, TaskType.PULL);
-        taskDAO().deleteAll(resource, TaskType.PUSH);
+        taskDAO.deleteAll(resource, TaskType.PROPAGATION);
+        taskDAO.deleteAll(resource, TaskType.PULL);
+        taskDAO.deleteAll(resource, TaskType.PUSH);
 
-        realmDAO().findByResource(resource).
+        realmDAO.findByResource(resource).
                 forEach(realm -> realm.getResources().remove(resource));
-        anyObjectDAO().findByResource(resource).
+        anyObjectDAO.findByResource(resource).
                 forEach(anyObject -> anyObject.getResources().remove(resource));
-        userDAO().findByResource(resource).
+        userDAO.findByResource(resource).
                 forEach(user -> user.getResources().remove(resource));
-        groupDAO().findByResource(resource).
+        groupDAO.findByResource(resource).
                 forEach(group -> group.getResources().remove(resource));
-        policyDAO().findByResource(resource).
+        policyDAO.findByResource(resource).
                 forEach(policy -> policy.getResources().remove(resource));
 
         resource.getProvisions().stream().
@@ -327,10 +261,10 @@ public class JPAExternalResourceDAO extends AbstractDAO<ExternalResource> implem
                     provision.setMapping(null);
                     provision.setResource(null);
                 }).
-                forEach(provision -> virSchemaDAO().findByProvision(provision).
-                forEach(schema -> virSchemaDAO().delete(schema.getKey())));
+                forEach(provision -> virSchemaDAO.findByProvision(provision).
+                forEach(schema -> virSchemaDAO.delete(schema.getKey())));
 
-        externalResourceHistoryConfDAO().deleteByEntity(resource);
+        externalResourceHistoryConfDAO.deleteByEntity(resource);
 
         if (resource.getConnector() != null && resource.getConnector().getResources() != null
                 && !resource.getConnector().getResources().isEmpty()) {
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
index cdb25918..b8125ef 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
@@ -86,46 +86,22 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
     @Autowired
     private PlainAttrDAO plainAttrDAO;
 
+    @Autowired
     private UserDAO userDAO;
 
+    @Autowired
     private AnyObjectDAO anyObjectDAO;
 
+    @Autowired
     private AnySearchDAO searchDAO;
 
     private AnySearchDAO jpaAnySearchDAO;
 
-    private UserDAO userDAO() {
-        synchronized (this) {
-            if (userDAO == null) {
-                userDAO = ApplicationContextProvider.getApplicationContext().getBean(UserDAO.class);
-            }
-        }
-        return userDAO;
-    }
-
-    private AnyObjectDAO anyObjectDAO() {
-        synchronized (this) {
-            if (anyObjectDAO == null) {
-                anyObjectDAO = ApplicationContextProvider.getApplicationContext().getBean(AnyObjectDAO.class);
-            }
-        }
-        return anyObjectDAO;
-    }
-
-    private AnySearchDAO searchDAO() {
-        synchronized (this) {
-            if (searchDAO == null) {
-                searchDAO = ApplicationContextProvider.getApplicationContext().getBean(AnySearchDAO.class);
-            }
-        }
-        return searchDAO;
-    }
-
     private AnySearchDAO jpaAnySearchDAO() {
         synchronized (this) {
             if (jpaAnySearchDAO == null) {
-                if (AopUtils.getTargetClass(searchDAO()).equals(JPAAnySearchDAO.class)) {
-                    jpaAnySearchDAO = searchDAO();
+                if (AopUtils.getTargetClass(searchDAO).equals(JPAAnySearchDAO.class)) {
+                    jpaAnySearchDAO = searchDAO;
                 } else {
                     jpaAnySearchDAO = (AnySearchDAO) ApplicationContextProvider.getBeanFactory().
                             createBean(JPAAnySearchDAO.class, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, true);
@@ -210,16 +186,16 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
     @Transactional(readOnly = true)
     @Override
     public List<Group> findOwnedByUser(final String userKey) {
-        User owner = userDAO().find(userKey);
+        User owner = userDAO.find(userKey);
         if (owner == null) {
             return Collections.<Group>emptyList();
         }
 
         StringBuilder queryString = new StringBuilder("SELECT e FROM ").append(JPAGroup.class.getSimpleName()).
                 append(" e WHERE e.userOwner=:owner ");
-        for (String groupKey : userDAO().findAllGroupKeys(owner)) {
+        userDAO.findAllGroupKeys(owner).forEach(groupKey -> {
             queryString.append("OR e.groupOwner.id='").append(groupKey).append("' ");
-        }
+        });
 
         TypedQuery<Group> query = entityManager().createQuery(queryString.toString(), Group.class);
         query.setParameter("owner", owner);
@@ -289,10 +265,10 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
         clearUDynMembers(merged);
         if (merged.getUDynMembership() != null) {
             SearchCond cond = buildDynMembershipCond(merged.getUDynMembership().getFIQLCond(), merged.getRealm());
-            int count = searchDAO().count(
+            int count = searchDAO.count(
                     Collections.<String>singleton(merged.getRealm().getFullPath()), cond, AnyTypeKind.USER);
             for (int page = 1; page <= (count / AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
-                List<User> matching = searchDAO().search(
+                List<User> matching = searchDAO.search(
                         Collections.<String>singleton(merged.getRealm().getFullPath()),
                         cond,
                         page,
@@ -313,10 +289,10 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
         clearADynMembers(merged);
         merged.getADynMemberships().stream().forEach(memb -> {
             SearchCond cond = buildDynMembershipCond(memb.getFIQLCond(), merged.getRealm());
-            int count = searchDAO().count(
+            int count = searchDAO.count(
                     Collections.<String>singleton(merged.getRealm().getFullPath()), cond, AnyTypeKind.ANY_OBJECT);
             for (int page = 1; page <= (count / AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
-                List<AnyObject> matching = searchDAO().search(
+                List<AnyObject> matching = searchDAO.search(
                         Collections.<String>singleton(merged.getRealm().getFullPath()),
                         cond,
                         page,
@@ -337,14 +313,14 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
             }
         });
 
-        dynRealmDAO().refreshDynMemberships(merged);
+        dynRealmDAO.refreshDynMemberships(merged);
 
         return merged;
     }
 
     @Override
     public void delete(final Group group) {
-        dynRealmDAO().removeDynMemberships(group.getKey());
+        dynRealmDAO.removeDynMemberships(group.getKey());
 
         findAMemberships(group).forEach(membership -> {
             AnyObject leftEnd = membership.getLeftEnd();
@@ -357,7 +333,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
                 return attr;
             }).forEachOrdered(attr -> plainAttrDAO.delete(attr));
 
-            anyObjectDAO().save(leftEnd);
+            anyObjectDAO.save(leftEnd);
             publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, leftEnd, AuthContextUtils.getDomain()));
         });
 
@@ -372,7 +348,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
                 return attr;
             }).forEachOrdered(attr -> plainAttrDAO.delete(attr));
 
-            userDAO().save(leftEnd);
+            userDAO.save(leftEnd);
             publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, leftEnd, AuthContextUtils.getDomain()));
         });
 
@@ -506,7 +482,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
 
     @Override
     public Set<String> removeDynMemberships(final AnyObject anyObject) {
-        List<Group> dynGroups = anyObjectDAO().findDynGroups(anyObject.getKey());
+        List<Group> dynGroups = anyObjectDAO.findDynGroups(anyObject.getKey());
 
         Query delete = entityManager().createNativeQuery("DELETE FROM " + ADYNMEMB_TABLE + " WHERE any_id=?");
         delete.setParameter(1, anyObject.getKey());
@@ -591,7 +567,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
 
     @Override
     public Set<String> removeDynMemberships(final User user) {
-        List<Group> dynGroups = userDAO().findDynGroups(user.getKey());
+        List<Group> dynGroups = userDAO.findDynGroups(user.getKey());
 
         Query delete = entityManager().createNativeQuery("DELETE FROM " + UDYNMEMB_TABLE + " WHERE any_id=?");
         delete.setParameter(1, user.getKey());
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
index 458cf41..ef569d7 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
@@ -33,7 +33,6 @@ import org.apache.syncope.core.persistence.api.entity.PlainAttr;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.jpa.entity.JPAAnyUtilsFactory;
 import org.apache.syncope.core.persistence.jpa.entity.JPAPlainSchema;
-import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;
 
@@ -43,17 +42,9 @@ public class JPAPlainSchemaDAO extends AbstractDAO<PlainSchema> implements Plain
     @Autowired
     private PlainAttrDAO plainAttrDAO;
 
+    @Autowired
     private ExternalResourceDAO resourceDAO;
 
-    private ExternalResourceDAO resourceDAO() {
-        synchronized (this) {
-            if (resourceDAO == null) {
-                resourceDAO = ApplicationContextProvider.getApplicationContext().getBean(ExternalResourceDAO.class);
-            }
-        }
-        return resourceDAO;
-    }
-
     @Override
     public PlainSchema find(final String key) {
         return entityManager().find(JPAPlainSchema.class, key);
@@ -132,7 +123,7 @@ public class JPAPlainSchemaDAO extends AbstractDAO<PlainSchema> implements Plain
                 plainAttrDAO.delete(attr.getKey(), anyUtils.plainAttrClass());
             });
 
-            resourceDAO().deleteMapping(key);
+            resourceDAO.deleteMapping(key);
         }
 
         if (schema.getAnyTypeClass() != null) {
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
index 453fb55..4e8295d 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
@@ -34,7 +34,6 @@ import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.persistence.jpa.entity.JPARole;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUser;
 import org.apache.syncope.core.provisioning.api.event.AnyCreatedUpdatedEvent;
-import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationEventPublisher;
@@ -49,17 +48,9 @@ public class JPARoleDAO extends AbstractDAO<Role> implements RoleDAO {
     @Autowired
     private ApplicationEventPublisher publisher;
 
+    @Autowired
     private AnySearchDAO searchDAO;
 
-    private AnySearchDAO searchDAO() {
-        synchronized (this) {
-            if (searchDAO == null) {
-                searchDAO = ApplicationContextProvider.getApplicationContext().getBean(AnySearchDAO.class);
-            }
-        }
-        return searchDAO;
-    }
-
     @Override
     public int count() {
         Query query = entityManager().createQuery(
@@ -108,7 +99,7 @@ public class JPARoleDAO extends AbstractDAO<Role> implements RoleDAO {
         // refresh dynamic memberships
         clearDynMembers(merged);
         if (merged.getDynMembership() != null) {
-            List<User> matching = searchDAO().search(
+            List<User> matching = searchDAO.search(
                     SearchCondConverter.convert(merged.getDynMembership().getFIQLCond()), AnyTypeKind.USER);
 
             matching.forEach((user) -> {
@@ -187,7 +178,7 @@ public class JPARoleDAO extends AbstractDAO<Role> implements RoleDAO {
             delete.setParameter(2, user.getKey());
             delete.executeUpdate();
 
-            if (searchDAO().matches(user, SearchCondConverter.convert(role.getDynMembership().getFIQLCond()))) {
+            if (searchDAO.matches(user, SearchCondConverter.convert(role.getDynMembership().getFIQLCond()))) {
                 Query insert = entityManager().createNativeQuery("INSERT INTO " + DYNMEMB_TABLE + " VALUES(?, ?)");
                 insert.setParameter(1, user.getKey());
                 insert.setParameter(2, role.getKey());
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java
index adc36f5..a86ee8e 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java
@@ -43,7 +43,6 @@ import org.apache.syncope.core.provisioning.api.utils.policy.AccountPolicyExcept
 import org.apache.syncope.core.provisioning.api.utils.policy.PasswordPolicyException;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.apache.syncope.core.spring.security.DelegatedAdministrationException;
-import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.attrvalue.validation.InvalidEntityException;
 import org.apache.syncope.core.persistence.api.dao.AccessTokenDAO;
 import org.apache.syncope.core.persistence.api.dao.AccountRule;
@@ -88,33 +87,17 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
     @Autowired
     private AccessTokenDAO accessTokenDAO;
 
-    @Resource(name = "adminUser")
-    private String adminUser;
-
-    @Resource(name = "anonymousUser")
-    private String anonymousUser;
-
+    @Autowired
     private RealmDAO realmDAO;
 
+    @Autowired
     private GroupDAO groupDAO;
 
-    private RealmDAO realmDAO() {
-        synchronized (this) {
-            if (realmDAO == null) {
-                realmDAO = ApplicationContextProvider.getApplicationContext().getBean(RealmDAO.class);
-            }
-        }
-        return realmDAO;
-    }
+    @Resource(name = "adminUser")
+    private String adminUser;
 
-    private GroupDAO groupDAO() {
-        synchronized (this) {
-            if (groupDAO == null) {
-                groupDAO = ApplicationContextProvider.getApplicationContext().getBean(GroupDAO.class);
-            }
-        }
-        return groupDAO;
-    }
+    @Resource(name = "anonymousUser")
+    private String anonymousUser;
 
     @Override
     protected AnyUtils init() {
@@ -244,7 +227,7 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
         }
 
         // add realm policies
-        for (Realm realm : realmDAO().findAncestors(user.getRealm())) {
+        for (Realm realm : realmDAO.findAncestors(user.getRealm())) {
             policy = realm.getPasswordPolicy();
             if (policy != null) {
                 policies.add(policy);
@@ -274,7 +257,7 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
                 forEachOrdered(policy -> policies.add(policy));
 
         // add realm policies
-        realmDAO().findAncestors(user.getRealm()).stream().
+        realmDAO.findAncestors(user.getRealm()).stream().
                 map(realm -> realm.getAccountPolicy()).
                 filter(policy -> policy != null).
                 forEachOrdered(policy -> policies.add(policy));
@@ -401,8 +384,8 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
         publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, merged, AuthContextUtils.getDomain()));
 
         roleDAO.refreshDynMemberships(merged);
-        Pair<Set<String>, Set<String>> dynGroupMembs = groupDAO().refreshDynMemberships(merged);
-        dynRealmDAO().refreshDynMemberships(merged);
+        Pair<Set<String>, Set<String>> dynGroupMembs = groupDAO.refreshDynMemberships(merged);
+        dynRealmDAO.refreshDynMemberships(merged);
 
         return Pair.of(merged, dynGroupMembs);
     }
@@ -420,8 +403,8 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
     @Override
     public void delete(final User user) {
         roleDAO.removeDynMemberships(user.getKey());
-        groupDAO().removeDynMemberships(user);
-        dynRealmDAO().removeDynMemberships(user.getKey());
+        groupDAO.removeDynMemberships(user);
+        dynRealmDAO.removeDynMemberships(user.getKey());
 
         AccessToken accessToken = accessTokenDAO.findByOwner(user.getUsername());
         if (accessToken != null) {
@@ -480,7 +463,7 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
                 ? (String) ((Object[]) resultKey)[0]
                 : ((String) resultKey)).
                 forEachOrdered(actualKey -> {
-                    Group group = groupDAO().find(actualKey.toString());
+                    Group group = groupDAO.find(actualKey.toString());
                     if (group == null) {
                         LOG.error("Could not find group with id {}, even though returned by the native query",
                                 actualKey);
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
index 65702a4..1d3043b 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
@@ -38,23 +38,15 @@ import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPullPolicy;
 import org.apache.syncope.core.persistence.jpa.entity.resource.JPAExternalResource;
 import org.apache.syncope.core.persistence.jpa.entity.resource.JPAMapping;
 import org.apache.syncope.core.persistence.jpa.entity.resource.JPAProvision;
-import org.apache.syncope.core.spring.ApplicationContextProvider;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;
 
 @Repository
 public class JPAVirSchemaDAO extends AbstractDAO<VirSchema> implements VirSchemaDAO {
 
+    @Autowired
     private ExternalResourceDAO resourceDAO;
 
-    private ExternalResourceDAO resourceDAO() {
-        synchronized (this) {
-            if (resourceDAO == null) {
-                resourceDAO = ApplicationContextProvider.getApplicationContext().getBean(ExternalResourceDAO.class);
-            }
-        }
-        return resourceDAO;
-    }
-
     @Override
     public VirSchema find(final String key) {
         return entityManager().find(JPAVirSchema.class, key);
@@ -137,7 +129,7 @@ public class JPAVirSchemaDAO extends AbstractDAO<VirSchema> implements VirSchema
 
         schema.getLabels().forEach(label -> label.setSchema(null));
 
-        resourceDAO().deleteMapping(key);
+        resourceDAO.deleteMapping(key);
 
         if (schema.getAnyTypeClass() != null) {
             schema.getAnyTypeClass().getVirSchemas().remove(schema);
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AccessTokenDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AccessTokenDataBinderImpl.java
index f6ec55f..9e1c8c9 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AccessTokenDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AccessTokenDataBinderImpl.java
@@ -34,7 +34,6 @@ import org.apache.syncope.core.persistence.api.dao.ConfDAO;
 import org.apache.syncope.core.persistence.api.entity.AccessToken;
 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
 import org.apache.syncope.core.provisioning.api.data.AccessTokenDataBinder;
-import org.apache.syncope.core.spring.BeanUtils;
 import org.apache.syncope.core.spring.security.DefaultCredentialChecker;
 import org.apache.syncope.core.spring.security.SecureRandomUtils;
 import org.apache.syncope.core.spring.security.jws.AccessTokenJwsSignatureProvider;
@@ -176,7 +175,10 @@ public class AccessTokenDataBinderImpl implements AccessTokenDataBinder {
     @Override
     public AccessTokenTO getAccessTokenTO(final AccessToken accessToken) {
         AccessTokenTO accessTokenTO = new AccessTokenTO();
-        BeanUtils.copyProperties(accessToken, accessTokenTO);
+        accessTokenTO.setKey(accessToken.getKey());
+        accessTokenTO.setBody(accessToken.getBody());
+        accessTokenTO.setExpiryTime(accessToken.getExpiryTime());
+        accessTokenTO.setOwner(accessToken.getOwner());
 
         return accessTokenTO;
     }
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
index 1dd6194..3bab7fe 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
@@ -40,7 +40,6 @@ import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.lib.types.PatchOperation;
 import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
-import org.apache.syncope.core.spring.BeanUtils;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.AnyUtils;
@@ -63,11 +62,6 @@ import org.springframework.transaction.annotation.Transactional;
 @Transactional(rollbackFor = { Throwable.class })
 public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements AnyObjectDataBinder {
 
-    private static final String[] IGNORE_PROPERTIES = {
-        "type", "realm", "auxClasses", "relationships", "memberships", "dynMemberships",
-        "plainAttrs", "derAttrs", "virAttrs", "resources"
-    };
-
     @Autowired
     private AnyTypeDAO anyTypeDAO;
 
@@ -80,9 +74,14 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An
     @Override
     public AnyObjectTO getAnyObjectTO(final AnyObject anyObject, final boolean details) {
         AnyObjectTO anyObjectTO = new AnyObjectTO();
+        anyObjectTO.setKey(anyObject.getKey());
+        anyObjectTO.setName(anyObject.getName());
         anyObjectTO.setType(anyObject.getType().getKey());
-
-        BeanUtils.copyProperties(anyObject, anyObjectTO, IGNORE_PROPERTIES);
+        anyObjectTO.setCreationDate(anyObject.getCreationDate());
+        anyObjectTO.setCreator(anyObject.getCreator());
+        anyObjectTO.setLastChangeDate(anyObject.getLastChangeDate());
+        anyObjectTO.setLastModifier(anyObject.getLastModifier());
+        anyObjectTO.setStatus(anyObject.getStatus());
 
         Map<VirSchema, List<String>> virAttrValues = details
                 ? virAttrHandler.getValues(anyObject)
@@ -471,5 +470,4 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An
 
         return propByRes;
     }
-
 }
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java
index 6cd5e8e..d08338f 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java
@@ -48,7 +48,6 @@ import org.apache.syncope.core.provisioning.api.utils.ConnPoolConfUtils;
 import org.identityconnectors.framework.api.ConfigurationProperties;
 import org.identityconnectors.framework.api.ConfigurationProperty;
 import org.identityconnectors.framework.impl.api.ConfigurationPropertyImpl;
-import org.apache.syncope.core.spring.BeanUtils;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.identityconnectors.framework.api.ConnectorInfo;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -57,8 +56,6 @@ import org.springframework.stereotype.Component;
 @Component
 public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
 
-    private static final String[] IGNORE_PROPERTIES = { "key", "poolConf", "location", "adminRealm", "conf" };
-
     @Autowired
     private ConnIdBundleManager connIdBundleManager;
 
@@ -103,7 +100,13 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
 
         ConnInstance connInstance = entityFactory.newEntity(ConnInstance.class);
 
-        BeanUtils.copyProperties(connInstanceTO, connInstance, IGNORE_PROPERTIES);
+        connInstance.setBundleName(connInstanceTO.getBundleName());
+        connInstance.setConnectorName(connInstanceTO.getConnectorName());
+        connInstance.setVersion(connInstanceTO.getVersion());
+        connInstance.setDisplayName(connInstanceTO.getDisplayName());
+        connInstance.setConnRequestTimeout(connInstanceTO.getConnRequestTimeout());
+        connInstance.getCapabilities().addAll(connInstanceTO.getCapabilities());
+
         if (connInstanceTO.getAdminRealm() != null) {
             connInstance.setAdminRealm(realmDAO.findByFullPath(connInstanceTO.getAdminRealm()));
         }
@@ -242,13 +245,18 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
 
     @Override
     public ConnInstanceTO getConnInstanceTO(final ConnInstance connInstance) {
-        ConnInstanceTO connInstanceTO = new ConnInstanceTO();
-
         Pair<URI, ConnectorInfo> info = connIdBundleManager.getConnectorInfo(connInstance);
-        BeanUtils.copyProperties(connInstance, connInstanceTO, IGNORE_PROPERTIES);
+
+        ConnInstanceTO connInstanceTO = new ConnInstanceTO();
         connInstanceTO.setKey(connInstance.getKey());
+        connInstanceTO.setBundleName(connInstance.getBundleName());
+        connInstanceTO.setConnectorName(connInstance.getConnectorName());
+        connInstanceTO.setVersion(connInstance.getVersion());
+        connInstanceTO.setDisplayName(connInstance.getDisplayName());
+        connInstanceTO.setConnRequestTimeout(connInstance.getConnRequestTimeout());
         connInstanceTO.setAdminRealm(connInstance.getAdminRealm().getFullPath());
         connInstanceTO.setLocation(info.getLeft().toASCIIString());
+        connInstanceTO.getCapabilities().addAll(connInstance.getCapabilities());
         connInstanceTO.getConf().addAll(connInstance.getConf());
         // refresh stored properties in the given connInstance with direct information from underlying connector
         ConfigurationProperties properties = connIdBundleManager.getConfigurationProperties(info.getRight());
@@ -273,7 +281,11 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
                 || connInstance.getPoolConf().getMinIdle() != null)) {
 
             ConnPoolConfTO poolConf = new ConnPoolConfTO();
-            BeanUtils.copyProperties(connInstance.getPoolConf(), poolConf);
+            poolConf.setMaxIdle(connInstance.getPoolConf().getMaxIdle());
+            poolConf.setMaxObjects(connInstance.getPoolConf().getMaxObjects());
+            poolConf.setMaxWait(connInstance.getPoolConf().getMaxWait());
+            poolConf.setMinEvictableIdleTimeMillis(connInstance.getPoolConf().getMinEvictableIdleTimeMillis());
+            poolConf.setMinIdle(connInstance.getPoolConf().getMinIdle());
             connInstanceTO.setPoolConf(poolConf);
         }
 
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ImplementationDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ImplementationDataBinderImpl.java
index 91df46f..1346a91 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ImplementationDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ImplementationDataBinderImpl.java
@@ -41,15 +41,14 @@ import org.apache.syncope.core.provisioning.api.propagation.PropagationActions;
 import org.apache.syncope.core.provisioning.api.pushpull.PullActions;
 import org.apache.syncope.core.persistence.api.dao.PullCorrelationRule;
 import org.apache.syncope.core.persistence.api.dao.PushCorrelationRule;
+import org.apache.syncope.core.provisioning.api.notification.RecipientsProvider;
 import org.apache.syncope.core.provisioning.api.pushpull.PushActions;
 import org.apache.syncope.core.provisioning.api.pushpull.ReconFilterBuilder;
 import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
-import org.apache.syncope.core.spring.BeanUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
-import org.apache.syncope.core.provisioning.api.notification.RecipientsProvider;
 
 @Component
 public class ImplementationDataBinderImpl implements ImplementationDataBinder {
@@ -80,7 +79,10 @@ public class ImplementationDataBinderImpl implements ImplementationDataBinder {
             throw sce;
         }
 
-        BeanUtils.copyProperties(implementationTO, implementation);
+        implementation.setKey(implementationTO.getKey());
+        implementation.setEngine(implementationTO.getEngine());
+        implementation.setType(implementationTO.getType());
+        implementation.setBody(implementationTO.getBody());
 
         if (implementation.getEngine() == ImplementationEngine.JAVA) {
             Class<?> base = null;
@@ -191,7 +193,11 @@ public class ImplementationDataBinderImpl implements ImplementationDataBinder {
     @Override
     public ImplementationTO getImplementationTO(final Implementation implementation) {
         ImplementationTO implementationTO = new ImplementationTO();
-        BeanUtils.copyProperties(implementation, implementationTO);
+        implementationTO.setKey(implementation.getKey());
+        implementationTO.setEngine(implementation.getEngine());
+        implementationTO.setType(implementation.getType());
+        implementationTO.setBody(implementation.getBody());
+
         return implementationTO;
     }
 }
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/NotificationDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/NotificationDataBinderImpl.java
index b4131ac..edbe242 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/NotificationDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/NotificationDataBinderImpl.java
@@ -29,7 +29,6 @@ import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
 import org.apache.syncope.core.persistence.api.entity.Notification;
-import org.apache.syncope.core.spring.BeanUtils;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.ImplementationDAO;
 import org.apache.syncope.core.persistence.api.dao.MailTemplateDAO;
@@ -48,8 +47,6 @@ public class NotificationDataBinderImpl implements NotificationDataBinder {
 
     private static final Logger LOG = LoggerFactory.getLogger(NotificationDataBinder.class);
 
-    private static final String[] IGNORE_PROPERTIES = { "key", "template", "abouts", "recipientsProvider" };
-
     @Autowired
     private MailTemplateDAO mailTemplateDAO;
 
@@ -70,8 +67,15 @@ public class NotificationDataBinderImpl implements NotificationDataBinder {
         NotificationTO notificationTO = new NotificationTO();
         notificationTO.setKey(notification.getKey());
         notificationTO.setTemplate(notification.getTemplate().getKey());
-
-        BeanUtils.copyProperties(notification, notificationTO, IGNORE_PROPERTIES);
+        notificationTO.getEvents().addAll(notification.getEvents());
+        notificationTO.setRecipientsFIQL(notification.getRecipientsFIQL());
+        notificationTO.getStaticRecipients().addAll(notification.getStaticRecipients());
+        notificationTO.setRecipientAttrName(notification.getRecipientAttrName());
+        notificationTO.setSelfAsRecipient(notification.isSelfAsRecipient());
+        notificationTO.setSender(notification.getSender());
+        notificationTO.setSubject(notification.getSubject());
+        notificationTO.setTraceLevel(notification.getTraceLevel());
+        notificationTO.setActive(notification.isActive());
 
         notification.getAbouts().forEach(about -> {
             notificationTO.getAbouts().put(about.getAnyType().getKey(), about.get());
@@ -93,7 +97,20 @@ public class NotificationDataBinderImpl implements NotificationDataBinder {
 
     @Override
     public void update(final Notification notification, final NotificationTO notificationTO) {
-        BeanUtils.copyProperties(notificationTO, notification, IGNORE_PROPERTIES);
+        notification.setRecipientsFIQL(notificationTO.getRecipientsFIQL());
+
+        notification.getStaticRecipients().clear();
+        notification.getStaticRecipients().addAll(notificationTO.getStaticRecipients());
+
+        notification.setRecipientAttrName(notificationTO.getRecipientAttrName());
+        notification.setSelfAsRecipient(notificationTO.isSelfAsRecipient());
+        notification.setSender(notificationTO.getSender());
+        notification.setSubject(notificationTO.getSubject());
+        notification.setTraceLevel(notificationTO.getTraceLevel());
+        notification.setActive(notificationTO.isActive());
+
+        notification.getEvents().clear();
+        notification.getEvents().addAll(notificationTO.getEvents());
 
         SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.RequiredValuesMissing);
 
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RemediationDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RemediationDataBinderImpl.java
index 36bac89..c445d93 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RemediationDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RemediationDataBinderImpl.java
@@ -21,20 +21,19 @@ package org.apache.syncope.core.provisioning.java.data;
 import org.apache.syncope.common.lib.to.RemediationTO;
 import org.apache.syncope.core.persistence.api.entity.Remediation;
 import org.apache.syncope.core.provisioning.api.data.RemediationDataBinder;
-import org.apache.syncope.core.spring.BeanUtils;
 import org.springframework.stereotype.Component;
 
 @Component
 public class RemediationDataBinderImpl implements RemediationDataBinder {
 
-    private static final String[] IGNORE_PROPERTIES = {
-        "anyType", "payload", "anyTOPayload", "anyPatchPayload", "keyPayload", "pullTask" };
-
     @Override
     public RemediationTO getRemediationTO(final Remediation remediation) {
         RemediationTO remediationTO = new RemediationTO();
-
-        BeanUtils.copyProperties(remediation, remediationTO);
+        remediationTO.setKey(remediation.getKey());
+        remediationTO.setOperation(remediation.getOperation());
+        remediationTO.setError(remediation.getError());
+        remediationTO.setInstant(remediation.getInstant());
+        remediationTO.setRemoteName(remediation.getRemoteName());
 
         switch (remediation.getOperation()) {
             case CREATE:
@@ -63,5 +62,4 @@ public class RemediationDataBinderImpl implements RemediationDataBinder {
 
         return remediationTO;
     }
-
 }
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ReportDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ReportDataBinderImpl.java
index ed1b3a2..f1d6537 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ReportDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ReportDataBinderImpl.java
@@ -31,7 +31,6 @@ import org.apache.syncope.core.persistence.api.dao.ReportExecDAO;
 import org.apache.syncope.core.persistence.api.entity.Report;
 import org.apache.syncope.core.persistence.api.entity.ReportExec;
 import org.apache.syncope.core.provisioning.api.job.JobNamer;
-import org.apache.syncope.core.spring.BeanUtils;
 import org.apache.syncope.core.persistence.api.dao.ReportTemplateDAO;
 import org.apache.syncope.core.persistence.api.entity.Entity;
 import org.apache.syncope.core.persistence.api.entity.Implementation;
@@ -51,10 +50,6 @@ public class ReportDataBinderImpl implements ReportDataBinder {
 
     private static final Logger LOG = LoggerFactory.getLogger(ReportDataBinder.class);
 
-    private static final String[] IGNORE_REPORT_PROPERTIES = { "key", "template", "reportlets", "executions" };
-
-    private static final String[] IGNORE_REPORT_EXECUTION_PROPERTIES = { "key", "report", "execResult" };
-
     @Autowired
     private ReportTemplateDAO reportTemplateDAO;
 
@@ -69,7 +64,9 @@ public class ReportDataBinderImpl implements ReportDataBinder {
 
     @Override
     public void getReport(final Report report, final ReportTO reportTO) {
-        BeanUtils.copyProperties(reportTO, report, IGNORE_REPORT_PROPERTIES);
+        report.setName(reportTO.getName());
+        report.setCronExpression(reportTO.getCronExpression());
+        report.setActive(reportTO.isActive());
 
         ReportTemplate template = reportTemplateDAO.find(reportTO.getTemplate());
         if (template == null) {
@@ -96,8 +93,9 @@ public class ReportDataBinderImpl implements ReportDataBinder {
         ReportTO reportTO = new ReportTO();
         reportTO.setKey(report.getKey());
         reportTO.setTemplate(report.getTemplate().getKey());
-
-        BeanUtils.copyProperties(report, reportTO, IGNORE_REPORT_PROPERTIES);
+        reportTO.setName(report.getName());
+        reportTO.setCronExpression(report.getCronExpression());
+        reportTO.setActive(report.isActive());
 
         reportTO.getReportlets().addAll(
                 report.getReportlets().stream().map(Entity::getKey).collect(Collectors.toList()));
@@ -142,13 +140,13 @@ public class ReportDataBinderImpl implements ReportDataBinder {
     public ExecTO getExecTO(final ReportExec execution) {
         ExecTO execTO = new ExecTO();
         execTO.setKey(execution.getKey());
-        BeanUtils.copyProperties(execution, execTO, IGNORE_REPORT_EXECUTION_PROPERTIES);
-        if (execution.getKey() != null) {
-            execTO.setKey(execution.getKey());
-        }
         execTO.setJobType(JobType.REPORT);
         execTO.setRefKey(execution.getReport().getKey());
         execTO.setRefDesc(buildRefDesc(execution.getReport()));
+        execTO.setStatus(execution.getStatus());
+        execTO.setMessage(execution.getMessage());
+        execTO.setStart(execution.getStart());
+        execTO.setEnd(execution.getEnd());
 
         return execTO;
     }
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
index b5a1ce9..c9f6eb0 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
@@ -51,7 +51,6 @@ import org.apache.syncope.core.persistence.api.entity.resource.Mapping;
 import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
 import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy;
 import org.apache.syncope.core.provisioning.java.jexl.JexlUtils;
-import org.apache.syncope.core.spring.BeanUtils;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.ConfDAO;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceHistoryConfDAO;
@@ -86,8 +85,6 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
 
     private static final Logger LOG = LoggerFactory.getLogger(ResourceDataBinder.class);
 
-    private static final String[] ITEM_IGNORE_PROPERTIES = { "key", "mapping", "transformers" };
-
     @Autowired
     private AnyTypeDAO anyTypeDAO;
 
@@ -337,7 +334,14 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
                         }
 
                         OrgUnitItem item = entityFactory.newEntity(OrgUnitItem.class);
-                        BeanUtils.copyProperties(itemTO, item, ITEM_IGNORE_PROPERTIES);
+                        item.setIntAttrName(itemTO.getIntAttrName());
+                        item.setExtAttrName(itemTO.getExtAttrName());
+                        item.setPurpose(itemTO.getPurpose());
+                        item.setMandatoryCondition(itemTO.getMandatoryCondition());
+                        item.setConnObjectKey(itemTO.isConnObjectKey());
+                        item.setPassword(itemTO.isPassword());
+                        item.setPropagationJEXLTransformer(itemTO.getPropagationJEXLTransformer());
+                        item.setPullJEXLTransformer(itemTO.getPullJEXLTransformer());
                         item.setOrgUnit(orgUnit);
                         if (item.isConnObjectKey()) {
                             orgUnit.setConnObjectKeyItem(item);
@@ -476,7 +480,14 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
                         }
 
                         MappingItem item = entityFactory.newEntity(MappingItem.class);
-                        BeanUtils.copyProperties(itemTO, item, ITEM_IGNORE_PROPERTIES);
+                        item.setIntAttrName(itemTO.getIntAttrName());
+                        item.setExtAttrName(itemTO.getExtAttrName());
+                        item.setPurpose(itemTO.getPurpose());
+                        item.setMandatoryCondition(itemTO.getMandatoryCondition());
+                        item.setConnObjectKey(itemTO.isConnObjectKey());
+                        item.setPassword(itemTO.isPassword());
+                        item.setPropagationJEXLTransformer(itemTO.getPropagationJEXLTransformer());
+                        item.setPullJEXLTransformer(itemTO.getPullJEXLTransformer());
                         item.setMapping(mapping);
 
                         if (item.isConnObjectKey()) {
@@ -581,7 +592,14 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
         items.forEach(item -> {
             ItemTO itemTO = new ItemTO();
             itemTO.setKey(item.getKey());
-            BeanUtils.copyProperties(item, itemTO, ITEM_IGNORE_PROPERTIES);
+            itemTO.setIntAttrName(item.getIntAttrName());
+            itemTO.setExtAttrName(item.getExtAttrName());
+            itemTO.setPurpose(item.getPurpose());
+            itemTO.setMandatoryCondition(item.getMandatoryCondition());
+            itemTO.setConnObjectKey(item.isConnObjectKey());
+            itemTO.setPassword(item.isPassword());
+            itemTO.setPropagationJEXLTransformer(item.getPropagationJEXLTransformer());
+            itemTO.setPullJEXLTransformer(item.getPullJEXLTransformer());
 
             if (itemTO.isConnObjectKey()) {
                 containerTO.setConnObjectKeyItem(itemTO);
@@ -635,7 +653,14 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
 
                 ItemTO itemTO = new ItemTO();
                 itemTO.setKey(linkingMappingItem.getKey());
-                BeanUtils.copyProperties(linkingMappingItem, itemTO, ITEM_IGNORE_PROPERTIES);
+                itemTO.setIntAttrName(linkingMappingItem.getIntAttrName());
+                itemTO.setExtAttrName(linkingMappingItem.getExtAttrName());
+                itemTO.setPurpose(linkingMappingItem.getPurpose());
+                itemTO.setMandatoryCondition(linkingMappingItem.getMandatoryCondition());
+                itemTO.setConnObjectKey(linkingMappingItem.isConnObjectKey());
+                itemTO.setPassword(linkingMappingItem.isPassword());
+                itemTO.setPropagationJEXLTransformer(linkingMappingItem.getPropagationJEXLTransformer());
+                itemTO.setPullJEXLTransformer(linkingMappingItem.getPullJEXLTransformer());
 
                 provisionTO.getMapping().getLinkingItems().add(itemTO);
             });
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
index f91378f..623c3df 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
@@ -33,7 +33,6 @@ import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
-import org.apache.syncope.core.spring.BeanUtils;
 import org.apache.syncope.core.provisioning.java.jexl.JexlUtils;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
@@ -62,8 +61,6 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
 
     private static final Logger LOG = LoggerFactory.getLogger(SchemaDataBinder.class);
 
-    private static final String[] IGNORE_PROPERTIES = { "anyTypeClass", "provision", "resource", "validator" };
-
     @Autowired
     private AnyTypeClassDAO anyTypeClassDAO;
 
@@ -119,7 +116,19 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
             throw sce;
         }
 
-        BeanUtils.copyProperties(schemaTO, schema, IGNORE_PROPERTIES);
+        schema.setKey(schemaTO.getKey());
+        schema.setType(schemaTO.getType());
+        schema.setCipherAlgorithm(schemaTO.getCipherAlgorithm());
+        schema.setConversionPattern(schemaTO.getConversionPattern());
+        schema.setEnumerationKeys(schemaTO.getEnumerationKeys());
+        schema.setEnumerationValues(schemaTO.getEnumerationValues());
+        schema.setMandatoryCondition(schemaTO.getMandatoryCondition());
+        schema.setMimeType(schemaTO.getMimeType());
+        schema.setMultivalue(schemaTO.isMultivalue());
+        schema.setReadonly(schemaTO.isReadonly());
+        schema.setSecretKey(schemaTO.getSecretKey());
+        schema.setUniqueConstraint(schemaTO.isUniqueConstraint());
+
         labels(schemaTO, schema);
 
         if (schemaTO.getValidator() == null) {
@@ -201,8 +210,19 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
         }
 
         PlainSchemaTO schemaTO = new PlainSchemaTO();
+        schemaTO.setKey(schema.getKey());
+        schemaTO.setType(schema.getType());
+        schemaTO.setCipherAlgorithm(schema.getCipherAlgorithm());
+        schemaTO.setConversionPattern(schema.getConversionPattern());
+        schemaTO.setEnumerationKeys(schema.getEnumerationKeys());
+        schemaTO.setEnumerationValues(schema.getEnumerationValues());
+        schemaTO.setMandatoryCondition(schema.getMandatoryCondition());
+        schemaTO.setMimeType(schema.getMimeType());
+        schemaTO.setMultivalue(schema.isMultivalue());
+        schemaTO.setReadonly(schema.isReadonly());
+        schemaTO.setSecretKey(schema.getSecretKey());
+        schemaTO.setUniqueConstraint(schema.isUniqueConstraint());
 
-        BeanUtils.copyProperties(schema, schemaTO, IGNORE_PROPERTIES);
         labels(schema, schemaTO);
 
         schemaTO.setAnyTypeClass(schema.getAnyTypeClass() == null ? null : schema.getAnyTypeClass().getKey());
@@ -234,7 +254,9 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
             throw scce;
         }
 
-        BeanUtils.copyProperties(schemaTO, schema, IGNORE_PROPERTIES);
+        schema.setKey(schemaTO.getKey());
+        schema.setExpression(schemaTO.getExpression());
+
         labels(schemaTO, schema);
 
         DerSchema merged = derSchemaDAO.save(schema);
@@ -277,8 +299,9 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
         }
 
         DerSchemaTO schemaTO = new DerSchemaTO();
+        schemaTO.setKey(schema.getKey());
+        schemaTO.setExpression(schema.getExpression());
 
-        BeanUtils.copyProperties(schema, schemaTO, IGNORE_PROPERTIES);
         labels(schema, schemaTO);
 
         schemaTO.setAnyTypeClass(schema.getAnyTypeClass() == null ? null : schema.getAnyTypeClass().getKey());
@@ -288,7 +311,10 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
 
     // --------------- VIRTUAL -----------------
     private VirSchema fill(final VirSchema schema, final VirSchemaTO schemaTO) {
-        BeanUtils.copyProperties(schemaTO, schema, IGNORE_PROPERTIES);
+        schema.setKey(schemaTO.getKey());
+        schema.setExtAttrName(schemaTO.getExtAttrName());
+        schema.setReadonly(schema.isReadonly());
+
         labels(schemaTO, schema);
 
         if (schemaTO.getAnyTypeClass() != null
@@ -350,8 +376,10 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
         }
 
         VirSchemaTO schemaTO = new VirSchemaTO();
+        schemaTO.setKey(schema.getKey());
+        schemaTO.setExtAttrName(schema.getExtAttrName());
+        schemaTO.setReadonly(schema.isReadonly());
 
-        BeanUtils.copyProperties(schema, schemaTO, IGNORE_PROPERTIES);
         labels(schema, schemaTO);
 
         schemaTO.setAnyTypeClass(schema.getAnyTypeClass() == null ? null : schema.getAnyTypeClass().getKey());
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SecurityQuestionDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SecurityQuestionDataBinderImpl.java
index ed971eb..a291baf 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SecurityQuestionDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SecurityQuestionDataBinderImpl.java
@@ -22,7 +22,6 @@ import org.apache.syncope.core.provisioning.api.data.SecurityQuestionDataBinder;
 import org.apache.syncope.common.lib.to.SecurityQuestionTO;
 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
 import org.apache.syncope.core.persistence.api.entity.user.SecurityQuestion;
-import org.apache.syncope.core.spring.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -35,8 +34,8 @@ public class SecurityQuestionDataBinderImpl implements SecurityQuestionDataBinde
     @Override
     public SecurityQuestionTO getSecurityQuestionTO(final SecurityQuestion securityQuestion) {
         SecurityQuestionTO securityQuestionTO = new SecurityQuestionTO();
-
-        BeanUtils.copyProperties(securityQuestion, securityQuestionTO);
+        securityQuestionTO.setKey(securityQuestion.getKey());
+        securityQuestionTO.setContent(securityQuestion.getContent());
 
         return securityQuestionTO;
     }
@@ -50,6 +49,6 @@ public class SecurityQuestionDataBinderImpl implements SecurityQuestionDataBinde
 
     @Override
     public void update(final SecurityQuestion securityQuestion, final SecurityQuestionTO securityQuestionTO) {
-        BeanUtils.copyProperties(securityQuestionTO, securityQuestion, "key");
+        securityQuestion.setContent(securityQuestionTO.getContent());
     }
 }
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java
index 6fcc05e..aae4c62 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.provisioning.java.data;
 
+import java.util.Objects;
 import java.util.stream.Collectors;
 import org.apache.syncope.core.provisioning.api.data.TaskDataBinder;
 import org.apache.commons.lang3.StringUtils;
@@ -50,7 +51,6 @@ import org.apache.syncope.core.persistence.api.entity.task.Task;
 import org.apache.syncope.core.persistence.api.entity.task.TaskExec;
 import org.apache.syncope.core.persistence.api.entity.task.TaskUtils;
 import org.apache.syncope.core.provisioning.api.job.JobNamer;
-import org.apache.syncope.core.spring.BeanUtils;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.ImplementationDAO;
 import org.apache.syncope.core.persistence.api.dao.RealmDAO;
@@ -80,12 +80,6 @@ public class TaskDataBinderImpl implements TaskDataBinder {
 
     private static final Logger LOG = LoggerFactory.getLogger(TaskDataBinder.class);
 
-    private static final String[] IGNORE_TASK_PROPERTIES = {
-        "destinationRealm", "templates", "filters", "executions", "resource", "matchingRule", "unmatchingRule",
-        "notification", "jobDelegate", "actions" };
-
-    private static final String[] IGNORE_TASK_EXECUTION_PROPERTIES = { "key", "task" };
-
     @Autowired
     private RealmDAO realmDAO;
 
@@ -113,10 +107,10 @@ public class TaskDataBinderImpl implements TaskDataBinder {
     @Autowired
     private TaskUtilsFactory taskUtilsFactory;
 
-    private void fill(final ProvisioningTask task, final ProvisioningTaskTO taskTO) {
-        if (task instanceof PushTask && taskTO instanceof PushTaskTO) {
-            PushTask pushTask = (PushTask) task;
-            PushTaskTO pushTaskTO = (PushTaskTO) taskTO;
+    private void fill(final ProvisioningTask provisioningTask, final ProvisioningTaskTO provisioningTaskTO) {
+        if (provisioningTask instanceof PushTask && provisioningTaskTO instanceof PushTaskTO) {
+            PushTask pushTask = (PushTask) provisioningTask;
+            PushTaskTO pushTaskTO = (PushTaskTO) provisioningTaskTO;
 
             Implementation jobDelegate = pushTaskTO.getJobDelegate() == null
                     ? implementationDAO.find(ImplementationType.TASKJOB_DELEGATE).stream().
@@ -158,9 +152,9 @@ public class TaskDataBinderImpl implements TaskDataBinder {
             // remove all filters not contained in the TO
             pushTask.getFilters().
                     removeIf(anyFilter -> !pushTaskTO.getFilters().containsKey(anyFilter.getAnyType().getKey()));
-        } else if (task instanceof PullTask && taskTO instanceof PullTaskTO) {
-            PullTask pullTask = (PullTask) task;
-            PullTaskTO pullTaskTO = (PullTaskTO) taskTO;
+        } else if (provisioningTask instanceof PullTask && provisioningTaskTO instanceof PullTaskTO) {
+            PullTask pullTask = (PullTask) provisioningTask;
+            PullTaskTO pullTaskTO = (PullTaskTO) provisioningTaskTO;
 
             Implementation jobDelegate = pullTaskTO.getJobDelegate() == null
                     ? implementationDAO.find(ImplementationType.TASKJOB_DELEGATE).stream().
@@ -224,21 +218,21 @@ public class TaskDataBinderImpl implements TaskDataBinder {
         }
 
         // 3. fill the remaining fields
-        task.setPerformCreate(taskTO.isPerformCreate());
-        task.setPerformUpdate(taskTO.isPerformUpdate());
-        task.setPerformDelete(taskTO.isPerformDelete());
-        task.setSyncStatus(taskTO.isSyncStatus());
+        provisioningTask.setPerformCreate(provisioningTaskTO.isPerformCreate());
+        provisioningTask.setPerformUpdate(provisioningTaskTO.isPerformUpdate());
+        provisioningTask.setPerformDelete(provisioningTaskTO.isPerformDelete());
+        provisioningTask.setSyncStatus(provisioningTaskTO.isSyncStatus());
 
-        taskTO.getActions().forEach(action -> {
+        provisioningTaskTO.getActions().forEach(action -> {
             Implementation implementation = implementationDAO.find(action);
             if (implementation == null) {
                 LOG.debug("Invalid " + Implementation.class.getSimpleName() + " {}, ignoring...", action);
             } else {
-                task.add(implementation);
+                provisioningTask.add(implementation);
             }
         });
         // remove all implementations not contained in the TO
-        task.getActions().removeIf(implementation -> !taskTO.getActions().contains(implementation.getKey()));
+        provisioningTask.getActions().removeIf(impl -> !provisioningTaskTO.getActions().contains(impl.getKey()));
     }
 
     @Override
@@ -313,11 +307,11 @@ public class TaskDataBinderImpl implements TaskDataBinder {
     @Override
     public ExecTO getExecTO(final TaskExec execution) {
         ExecTO execTO = new ExecTO();
-        BeanUtils.copyProperties(execution, execTO, IGNORE_TASK_EXECUTION_PROPERTIES);
-
-        if (execution.getKey() != null) {
-            execTO.setKey(execution.getKey());
-        }
+        execTO.setKey(execution.getKey());
+        execTO.setStatus(execution.getStatus());
+        execTO.setMessage(execution.getMessage());
+        execTO.setStart(execution.getStart());
+        execTO.setEnd(execution.getEnd());
 
         if (execution.getTask() != null && execution.getTask().getKey() != null) {
             execTO.setJobType(JobType.TASK);
@@ -328,26 +322,47 @@ public class TaskDataBinderImpl implements TaskDataBinder {
         return execTO;
     }
 
-    private void setExecTime(final SchedTaskTO taskTO, final Task task) {
-        taskTO.setLastExec(taskTO.getStart());
+    private void fill(final SchedTaskTO schedTaskTO, final SchedTask schedTask) {
+        schedTaskTO.setName(schedTask.getName());
+        schedTaskTO.setDescription(schedTask.getDescription());
+        schedTaskTO.setStart(schedTask.getStartAt());
+        schedTaskTO.setCronExpression(schedTask.getCronExpression());
+        schedTaskTO.setActive(schedTask.isActive());
 
-        String triggerName = JobNamer.getTriggerName(JobNamer.getJobKey(task).getName());
+        schedTaskTO.setLastExec(schedTaskTO.getStart());
+
+        String triggerName = JobNamer.getTriggerName(JobNamer.getJobKey(schedTask).getName());
         try {
             Trigger trigger = scheduler.getScheduler().getTrigger(new TriggerKey(triggerName, Scheduler.DEFAULT_GROUP));
 
             if (trigger != null) {
-                taskTO.setLastExec(trigger.getPreviousFireTime());
-                taskTO.setNextExec(trigger.getNextFireTime());
+                schedTaskTO.setLastExec(trigger.getPreviousFireTime());
+                schedTaskTO.setNextExec(trigger.getNextFireTime());
             }
         } catch (SchedulerException e) {
             LOG.warn("While trying to get to " + triggerName, e);
         }
+
+        if (schedTaskTO instanceof ProvisioningTaskTO && schedTask instanceof ProvisioningTask) {
+            ProvisioningTaskTO provisioningTaskTO = (ProvisioningTaskTO) schedTaskTO;
+            ProvisioningTask provisioningTask = (ProvisioningTask) schedTask;
+
+            provisioningTaskTO.setResource(provisioningTask.getResource().getKey());
+
+            provisioningTaskTO.getActions().addAll(
+                    provisioningTask.getActions().stream().map(Entity::getKey).collect(Collectors.toList()));
+
+            provisioningTaskTO.setPerformCreate(provisioningTask.isPerformCreate());
+            provisioningTaskTO.setPerformUpdate(provisioningTask.isPerformUpdate());
+            provisioningTaskTO.setPerformDelete(provisioningTask.isPerformDelete());
+            provisioningTaskTO.setSyncStatus(provisioningTask.isSyncStatus());
+        }
     }
 
     @Override
     public <T extends TaskTO> T getTaskTO(final Task task, final TaskUtils taskUtils, final boolean details) {
         T taskTO = taskUtils.newTaskTO();
-        BeanUtils.copyProperties(task, taskTO, IGNORE_TASK_PROPERTIES);
+        taskTO.setKey(task.getKey());
 
         TaskExec latestExec = taskExecDAO.findLatestStarted(task);
         if (latestExec == null) {
@@ -360,8 +375,8 @@ public class TaskDataBinderImpl implements TaskDataBinder {
 
         if (details) {
             task.getExecs().stream().
-                    filter(execution -> execution != null).
-                    forEachOrdered(execution -> taskTO.getExecutions().add(getExecTO(execution)));
+                    filter(Objects::nonNull).
+                    forEach(execution -> taskTO.getExecutions().add(getExecTO(execution)));
         }
 
         switch (taskUtils.getType()) {
@@ -369,17 +384,22 @@ public class TaskDataBinderImpl implements TaskDataBinder {
                 PropagationTask propagationTask = (PropagationTask) task;
                 PropagationTaskTO propagationTaskTO = (PropagationTaskTO) taskTO;
 
+                propagationTaskTO.setOperation(propagationTask.getOperation());
+                propagationTaskTO.setConnObjectKey(propagationTask.getConnObjectKey());
+                propagationTaskTO.setOldConnObjectKey(propagationTask.getOldConnObjectKey());
+                propagationTaskTO.setAttributes(propagationTask.getSerializedAttributes());
+                propagationTaskTO.setResource(propagationTask.getResource().getKey());
+                propagationTaskTO.setObjectClassName(propagationTask.getObjectClassName());
                 propagationTaskTO.setAnyTypeKind(propagationTask.getAnyTypeKind());
+                propagationTaskTO.setAnyType(propagationTask.getAnyType());
                 propagationTaskTO.setEntityKey(propagationTask.getEntityKey());
-                propagationTaskTO.setResource(propagationTask.getResource().getKey());
-                propagationTaskTO.setAttributes(propagationTask.getSerializedAttributes());
                 break;
 
             case SCHEDULED:
                 SchedTask schedTask = (SchedTask) task;
                 SchedTaskTO schedTaskTO = (SchedTaskTO) taskTO;
 
-                setExecTime(schedTaskTO, task);
+                fill(schedTaskTO, schedTask);
 
                 if (schedTask.getJobDelegate() != null) {
                     schedTaskTO.setJobDelegate(schedTask.getJobDelegate().getKey());
@@ -390,22 +410,19 @@ public class TaskDataBinderImpl implements TaskDataBinder {
                 PullTask pullTask = (PullTask) task;
                 PullTaskTO pullTaskTO = (PullTaskTO) taskTO;
 
-                setExecTime(pullTaskTO, task);
+                fill(pullTaskTO, pullTask);
 
                 pullTaskTO.setDestinationRealm(pullTask.getDestinatioRealm().getFullPath());
-                pullTaskTO.setResource(pullTask.getResource().getKey());
                 pullTaskTO.setMatchingRule(pullTask.getMatchingRule() == null
                         ? MatchingRule.UPDATE : pullTask.getMatchingRule());
                 pullTaskTO.setUnmatchingRule(pullTask.getUnmatchingRule() == null
                         ? UnmatchingRule.PROVISION : pullTask.getUnmatchingRule());
+                pullTaskTO.setPullMode(pullTask.getPullMode());
 
                 if (pullTask.getReconFilterBuilder() != null) {
                     pullTaskTO.setReconFilterBuilder(pullTask.getReconFilterBuilder().getKey());
                 }
 
-                pullTaskTO.getActions().addAll(
-                        pullTask.getActions().stream().map(Entity::getKey).collect(Collectors.toList()));
-
                 pullTask.getTemplates().forEach(template -> {
                     pullTaskTO.getTemplates().put(template.getAnyType().getKey(), template.get());
                 });
@@ -417,18 +434,14 @@ public class TaskDataBinderImpl implements TaskDataBinder {
                 PushTask pushTask = (PushTask) task;
                 PushTaskTO pushTaskTO = (PushTaskTO) taskTO;
 
-                setExecTime(pushTaskTO, task);
+                fill(pushTaskTO, pushTask);
 
                 pushTaskTO.setSourceRealm(pushTask.getSourceRealm().getFullPath());
-                pushTaskTO.setResource(pushTask.getResource().getKey());
                 pushTaskTO.setMatchingRule(pushTask.getMatchingRule() == null
                         ? MatchingRule.LINK : pushTask.getMatchingRule());
                 pushTaskTO.setUnmatchingRule(pushTask.getUnmatchingRule() == null
                         ? UnmatchingRule.ASSIGN : pushTask.getUnmatchingRule());
 
-                pushTaskTO.getActions().addAll(
-                        pushTask.getActions().stream().map(Entity::getKey).collect(Collectors.toList()));
-
                 pushTask.getFilters().forEach(filter -> {
                     pushTaskTO.getFilters().put(filter.getAnyType().getKey(), filter.getFIQLCond());
                 });
@@ -441,9 +454,16 @@ public class TaskDataBinderImpl implements TaskDataBinder {
                 notificationTaskTO.setNotification(notificationTask.getNotification().getKey());
                 notificationTaskTO.setAnyTypeKind(notificationTask.getAnyTypeKind());
                 notificationTaskTO.setEntityKey(notificationTask.getEntityKey());
+                notificationTaskTO.setSender(notificationTask.getSender());
+                notificationTaskTO.getRecipients().addAll(notificationTask.getRecipients());
+                notificationTaskTO.setSubject(notificationTask.getSubject());
+                notificationTaskTO.setHtmlBody(notificationTask.getHtmlBody());
+                notificationTaskTO.setTextBody(notificationTask.getTextBody());
+                notificationTaskTO.setExecuted(notificationTask.isExecuted());
                 if (notificationTask.isExecuted() && StringUtils.isBlank(taskTO.getLatestExecStatus())) {
                     taskTO.setLatestExecStatus("[EXECUTED]");
                 }
+                notificationTaskTO.setTraceLevel(notificationTask.getTraceLevel());
                 break;
 
             default:
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
index 58c2d7d..e50f59e 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
@@ -54,7 +54,6 @@ import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
-import org.apache.syncope.core.spring.BeanUtils;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.RoleDAO;
 import org.apache.syncope.core.persistence.api.entity.AccessToken;
@@ -79,11 +78,6 @@ import org.springframework.transaction.annotation.Transactional;
 @Transactional(rollbackFor = { Throwable.class })
 public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDataBinder {
 
-    private static final String[] IGNORE_PROPERTIES = {
-        "type", "realm", "auxClasses", "roles", "dynRoles", "relationships", "memberships", "dynMemberships",
-        "plainAttrs", "derAttrs", "virAttrs", "resources", "securityQuestion", "securityAnswer"
-    };
-
     @Autowired
     private RoleDAO roleDAO;
 
@@ -567,9 +561,22 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat
     @Override
     public UserTO getUserTO(final User user, final boolean details) {
         UserTO userTO = new UserTO();
-
-        BeanUtils.copyProperties(user, userTO, IGNORE_PROPERTIES);
+        userTO.setKey(user.getKey());
+        userTO.setUsername(user.getUsername());
+        userTO.setPassword(user.getPassword());
+        userTO.setType(user.getType().getKey());
+        userTO.setCreationDate(user.getCreationDate());
+        userTO.setCreator(user.getCreator());
+        userTO.setLastChangeDate(user.getLastChangeDate());
+        userTO.setLastModifier(user.getLastModifier());
+        userTO.setStatus(user.getStatus());
         userTO.setSuspended(BooleanUtils.isTrue(user.isSuspended()));
+        userTO.setChangePwdDate(user.getChangePwdDate());
+        userTO.setFailedLogins(user.getFailedLogins());
+        userTO.setLastLoginDate(user.getLastLoginDate());
+        userTO.setMustChangePassword(user.isMustChangePassword());
+        userTO.setToken(user.getToken());
+        userTO.setTokenExpireTime(user.getTokenExpireTime());
 
         if (user.getSecurityQuestion() != null) {
             userTO.setSecurityQuestion(user.getSecurityQuestion().getKey());
diff --git a/core/spring/src/main/java/org/apache/syncope/core/spring/BeanUtils.java b/core/spring/src/main/java/org/apache/syncope/core/spring/BeanUtils.java
deleted file mode 100644
index 980b022..0000000
--- a/core/spring/src/main/java/org/apache/syncope/core/spring/BeanUtils.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.spring;
-
-import static org.springframework.beans.BeanUtils.getPropertyDescriptor;
-import static org.springframework.beans.BeanUtils.getPropertyDescriptors;
-
-import java.beans.PropertyDescriptor;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import org.springframework.beans.FatalBeanException;
-import org.springframework.util.Assert;
-import org.springframework.util.ClassUtils;
-
-/**
- * Overrides Spring's BeanUtils not using collection setters but instead getters + addAll() / putAll(),
- * in a JAXB friendly way.
- *
- * Refer to <a href="https://issues.apache.org/jira/browse/SYNCOPE-246">SYNCOPE-246</a> for more information.
- *
- * @see org.springframework.beans.BeanUtils
- */
-public final class BeanUtils {
-
-    private BeanUtils() {
-        // Empty private constructor for static utility classes
-    }
-
-    /**
-     * Copy the property values of the given source bean into the target bean.
-     * <p>
-     * Note: The source and target classes do not have to match or even be derived
-     * from each other, as long as the properties match. Any bean properties that the
-     * source bean exposes but the target bean does not will silently be ignored.
-     * </p><p>
-     * This is just a convenience method. For more complex transfer needs,
-     * consider using a full BeanWrapper.
-     * </p>
-     *
-     * @param source the source bean
-     * @param target the target bean
-     * @see org.springframework.beans.BeanWrapper
-     */
-    public static void copyProperties(final Object source, final Object target) {
-        copyProperties(source, target, null, (String[]) null);
-    }
-
-    /**
-     * Copy the property values of the given source bean into the given target bean,
-     * only setting properties defined in the given "editable" class (or interface).
-     * <p>
-     * Note: The source and target classes do not have to match or even be derived
-     * from each other, as long as the properties match. Any bean properties that the
-     * source bean exposes but the target bean does not will silently be ignored.
-     * </p><p>
-     * This is just a convenience method. For more complex transfer needs,
-     * consider using a full BeanWrapper.
-     * </p>
-     *
-     * @param source the source bean
-     * @param target the target bean
-     * @param editable the class (or interface) to restrict property setting to
-     * @see org.springframework.beans.BeanWrapper
-     */
-    public static void copyProperties(final Object source, final Object target, final Class<?> editable) {
-        copyProperties(source, target, editable, (String[]) null);
-    }
-
-    /**
-     * Copy the property values of the given source bean into the given target bean,
-     * ignoring the given "ignoreProperties".
-     * <p>
-     * Note: The source and target classes do not have to match or even be derived
-     * from each other, as long as the properties match. Any bean properties that the
-     * source bean exposes but the target bean does not will silently be ignored.
-     * </p><p>
-     * This is just a convenience method. For more complex transfer needs,
-     * consider using a full BeanWrapper.
-     * </p>
-     *
-     * @param source the source bean
-     * @param target the target bean
-     * @param ignoreProperties array of property names to ignore
-     * @see org.springframework.beans.BeanWrapper
-     */
-    public static void copyProperties(final Object source, final Object target, final String... ignoreProperties) {
-        copyProperties(source, target, null, ignoreProperties);
-    }
-
-    /**
-     * Copy the property values of the given source bean into the given target bean.
-     * <p>
-     * Note: The source and target classes do not have to match or even be derived
-     * from each other, as long as the properties match. Any bean properties that the
-     * source bean exposes but the target bean does not will silently be ignored.
-     * </p>
-     *
-     * @param source the source bean
-     * @param target the target bean
-     * @param editable the class (or interface) to restrict property setting to
-     * @param ignoreProperties array of property names to ignore
-     * @see org.springframework.beans.BeanWrapper
-     */
-    @SuppressWarnings("unchecked")
-    private static void copyProperties(
-            final Object source, final Object target, final Class<?> editable, final String... ignoreProperties) {
-
-        Assert.notNull(source, "Source must not be null");
-        Assert.notNull(target, "Target must not be null");
-
-        Class<?> actualEditable = target.getClass();
-        if (editable != null) {
-            if (!editable.isInstance(target)) {
-                throw new IllegalArgumentException("Target class [" + target.getClass().getName()
-                        + "] not assignable to Editable class [" + editable.getName() + "]");
-            }
-            actualEditable = editable;
-        }
-        PropertyDescriptor[] targetPds = getPropertyDescriptors(actualEditable);
-        List<String> ignoreList = (ignoreProperties == null)
-                ? Collections.<String>emptyList() : Arrays.asList(ignoreProperties);
-
-        for (PropertyDescriptor targetPd : targetPds) {
-            if (ignoreProperties == null || (!ignoreList.contains(targetPd.getName()))) {
-                PropertyDescriptor sourcePd = getPropertyDescriptor(source.getClass(), targetPd.getName());
-                if (sourcePd != null) {
-                    Method readMethod = sourcePd.getReadMethod();
-                    if (readMethod != null) {
-                        Method writeMethod = targetPd.getWriteMethod();
-
-                        try {
-                            // Diverts from Spring's BeanUtils: if no write method is found and property is collection,
-                            // try to use addAll() / putAll().
-                            if (writeMethod == null) {
-                                Object value = readMethod.invoke(source);
-                                Method targetReadMethod = targetPd.getReadMethod();
-                                if (targetReadMethod != null) {
-                                    if (!Modifier.isPublic(targetReadMethod.getDeclaringClass().getModifiers())) {
-                                        targetReadMethod.setAccessible(true);
-                                    }
-                                    Object destValue = targetReadMethod.invoke(target);
-
-                                    if (value instanceof Collection && destValue instanceof Collection) {
-                                        ((Collection) destValue).clear();
-                                        ((Collection) destValue).addAll((Collection) value);
-                                    } else if (value instanceof Map && destValue instanceof Map) {
-                                        ((Map) destValue).clear();
-                                        ((Map) destValue).putAll((Map) value);
-                                    }
-                                }
-                            } else if (ClassUtils.isAssignable(
-                                    writeMethod.getParameterTypes()[0], readMethod.getReturnType())) {
-
-                                if (!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) {
-                                    readMethod.setAccessible(true);
-                                }
-                                Object value = readMethod.invoke(source);
-                                if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {
-                                    writeMethod.setAccessible(true);
-                                }
-                                writeMethod.invoke(target, value);
-                            }
-                        } catch (Throwable ex) {
-                            throw new FatalBeanException(
-                                    "Could not copy property '" + targetPd.getName() + "' from source to target", ex);
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/data/CamelRouteDataBinderImpl.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/data/CamelRouteDataBinderImpl.java
index 5e7190a..e96f7db 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/data/CamelRouteDataBinderImpl.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/data/CamelRouteDataBinderImpl.java
@@ -19,7 +19,6 @@
 package org.apache.syncope.core.provisioning.camel.data;
 
 import org.apache.syncope.common.lib.to.CamelRouteTO;
-import org.apache.syncope.core.spring.BeanUtils;
 import org.apache.syncope.core.persistence.api.dao.CamelRouteDAO;
 import org.apache.syncope.core.persistence.api.entity.CamelRoute;
 import org.apache.syncope.core.provisioning.api.data.CamelRouteDataBinder;
@@ -35,7 +34,10 @@ public class CamelRouteDataBinderImpl implements CamelRouteDataBinder {
     @Override
     public CamelRouteTO getRouteTO(final CamelRoute route) {
         CamelRouteTO routeTO = new CamelRouteTO();
-        BeanUtils.copyProperties(route, routeTO);
+        routeTO.setKey(route.getKey());
+        routeTO.setAnyTypeKind(route.getAnyTypeKind());
+        routeTO.setContent(route.getContent());
+
         return routeTO;
     }
 
@@ -44,5 +46,4 @@ public class CamelRouteDataBinderImpl implements CamelRouteDataBinder {
         route.setContent(routeTO.getContent());
         routeDAO.save(route);
     }
-
 }
diff --git a/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/impl/FlowableUserRequestHandler.java b/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/impl/FlowableUserRequestHandler.java
index c1d20b1..ac28126 100644
--- a/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/impl/FlowableUserRequestHandler.java
+++ b/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/impl/FlowableUserRequestHandler.java
@@ -51,7 +51,6 @@ import org.apache.syncope.core.provisioning.api.WorkflowResult;
 import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
 import org.apache.syncope.core.provisioning.api.event.AnyDeletedEvent;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
-import org.apache.syncope.core.spring.BeanUtils;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.apache.syncope.core.workflow.api.WorkflowException;
 import org.flowable.common.engine.api.FlowableException;
@@ -68,6 +67,7 @@ import org.flowable.task.api.TaskQuery;
 import org.flowable.task.api.history.HistoricTaskInstance;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
@@ -77,8 +77,6 @@ public class FlowableUserRequestHandler implements UserRequestHandler {
 
     protected static final Logger LOG = LoggerFactory.getLogger(UserRequestHandler.class);
 
-    protected static final String[] PROPERTY_IGNORE_PROPS = { "type" };
-
     @Autowired
     protected WorkflowTaskManager wfTaskManager;
 
@@ -308,7 +306,11 @@ public class FlowableUserRequestHandler implements UserRequestHandler {
     protected UserRequestForm getForm(final Task task, final TaskFormData fd) {
         UserRequestForm formTO =
                 getForm(task.getProcessInstanceId(), task.getId(), fd.getFormKey(), fd.getFormProperties());
-        BeanUtils.copyProperties(task, formTO);
+        formTO.setCreateTime(task.getCreateTime());
+        formTO.setDueDate(task.getDueDate());
+        formTO.setExecutionId(task.getExecutionId());
+        formTO.setFormKey(task.getFormKey());
+        formTO.setOwner(task.getOwner());
 
         return formTO;
     }
@@ -322,7 +324,11 @@ public class FlowableUserRequestHandler implements UserRequestHandler {
 
         UserRequestForm formTO = getHistoricFormTO(
                 task.getProcessInstanceId(), task.getId(), task.getFormKey(), props);
-        BeanUtils.copyProperties(task, formTO);
+        formTO.setCreateTime(task.getCreateTime());
+        formTO.setDueDate(task.getDueDate());
+        formTO.setExecutionId(task.getExecutionId());
+        formTO.setFormKey(task.getFormKey());
+        formTO.setOwner(task.getOwner());
 
         HistoricActivityInstance historicActivityInstance = engine.getHistoryService().
                 createHistoricActivityInstanceQuery().
@@ -408,7 +414,12 @@ public class FlowableUserRequestHandler implements UserRequestHandler {
 
         formTO.getProperties().addAll(props.stream().map(fProp -> {
             UserRequestFormProperty propertyTO = new UserRequestFormProperty();
-            BeanUtils.copyProperties(fProp, propertyTO, PROPERTY_IGNORE_PROPS);
+            propertyTO.setId(fProp.getId());
+            propertyTO.setName(fProp.getName());
+            propertyTO.setReadable(fProp.isReadable());
+            propertyTO.setRequired(fProp.isRequired());
+            propertyTO.setWritable(fProp.isWritable());
+            propertyTO.setValue(fProp.getValue());
             propertyTO.setType(fromFlowableFormType(fProp.getType()));
             switch (propertyTO.getType()) {
                 case Date:
diff --git a/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/impl/FlowableUserWorkflowAdapter.java b/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/impl/FlowableUserWorkflowAdapter.java
index f3f1880..24e765d 100644
--- a/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/impl/FlowableUserWorkflowAdapter.java
+++ b/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/impl/FlowableUserWorkflowAdapter.java
@@ -35,7 +35,6 @@ import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.flowable.api.UserRequestHandler;
 import org.apache.syncope.core.flowable.api.WorkflowTaskManager;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
-import org.apache.syncope.core.spring.BeanUtils;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.provisioning.api.WorkflowResult;
 import org.apache.syncope.core.flowable.support.DomainProcessEngine;
@@ -48,6 +47,7 @@ import org.flowable.bpmn.model.Process;
 import org.flowable.common.engine.api.FlowableException;
 import org.flowable.engine.runtime.ProcessInstance;
 import org.flowable.task.api.Task;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 
 public class FlowableUserWorkflowAdapter extends AbstractUserWorkflowAdapter implements WorkflowTaskManager {
diff --git a/ext/oidcclient/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/OIDCProviderDataBinderImpl.java b/ext/oidcclient/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/OIDCProviderDataBinderImpl.java
index 888d7a5..bf3c5bb 100644
--- a/ext/oidcclient/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/OIDCProviderDataBinderImpl.java
+++ b/ext/oidcclient/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/OIDCProviderDataBinderImpl.java
@@ -41,7 +41,6 @@ import org.apache.syncope.core.provisioning.api.IntAttrName;
 import org.apache.syncope.core.provisioning.api.data.OIDCProviderDataBinder;
 import org.apache.syncope.core.provisioning.java.IntAttrNameParser;
 import org.apache.syncope.core.provisioning.java.jexl.JexlUtils;
-import org.apache.syncope.core.spring.BeanUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -135,7 +134,13 @@ public class OIDCProviderDataBinderImpl implements OIDCProviderDataBinder {
                         }
 
                         OIDCProviderItem item = entityFactory.newEntity(OIDCProviderItem.class);
-                        BeanUtils.copyProperties(itemTO, item, ITEM_IGNORE_PROPERTIES);
+                        item.setIntAttrName(itemTO.getIntAttrName());
+                        item.setExtAttrName(itemTO.getExtAttrName());
+                        item.setMandatoryCondition(itemTO.getMandatoryCondition());
+                        item.setConnObjectKey(itemTO.isConnObjectKey());
+                        item.setPassword(itemTO.isPassword());
+                        item.setPropagationJEXLTransformer(itemTO.getPropagationJEXLTransformer());
+                        item.setPullJEXLTransformer(itemTO.getPullJEXLTransformer());
                         item.setOP(op);
                         item.setPurpose(MappingPurpose.NONE);
                         if (item.isConnObjectKey()) {
@@ -219,7 +224,13 @@ public class OIDCProviderDataBinderImpl implements OIDCProviderDataBinder {
         op.getItems().forEach(item -> {
             ItemTO itemTO = new ItemTO();
             itemTO.setKey(item.getKey());
-            BeanUtils.copyProperties(item, itemTO, ITEM_IGNORE_PROPERTIES);
+            itemTO.setIntAttrName(item.getIntAttrName());
+            itemTO.setExtAttrName(item.getExtAttrName());
+            itemTO.setMandatoryCondition(item.getMandatoryCondition());
+            itemTO.setConnObjectKey(item.isConnObjectKey());
+            itemTO.setPassword(item.isPassword());
+            itemTO.setPropagationJEXLTransformer(item.getPropagationJEXLTransformer());
+            itemTO.setPullJEXLTransformer(item.getPullJEXLTransformer());
             itemTO.setPurpose(MappingPurpose.NONE);
 
             if (itemTO.isConnObjectKey()) {
diff --git a/ext/saml2sp/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SAML2IdPDataBinderImpl.java b/ext/saml2sp/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SAML2IdPDataBinderImpl.java
index 85c693a..fe0f8f0 100644
--- a/ext/saml2sp/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SAML2IdPDataBinderImpl.java
+++ b/ext/saml2sp/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SAML2IdPDataBinderImpl.java
@@ -42,7 +42,6 @@ import org.apache.syncope.core.provisioning.api.IntAttrName;
 import org.apache.syncope.core.provisioning.api.data.SAML2IdPDataBinder;
 import org.apache.syncope.core.provisioning.java.IntAttrNameParser;
 import org.apache.syncope.core.provisioning.java.jexl.JexlUtils;
-import org.apache.syncope.core.spring.BeanUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -53,8 +52,6 @@ public class SAML2IdPDataBinderImpl implements SAML2IdPDataBinder {
 
     private static final Logger LOG = LoggerFactory.getLogger(SAML2IdPDataBinder.class);
 
-    private static final String[] ITEM_IGNORE_PROPERTIES = { "key", "purpose" };
-
     @Autowired
     private AnyTypeDAO anyTypeDAO;
 
@@ -135,7 +132,13 @@ public class SAML2IdPDataBinderImpl implements SAML2IdPDataBinder {
                         }
 
                         SAML2IdPItem item = entityFactory.newEntity(SAML2IdPItem.class);
-                        BeanUtils.copyProperties(itemTO, item, ITEM_IGNORE_PROPERTIES);
+                        item.setIntAttrName(itemTO.getIntAttrName());
+                        item.setExtAttrName(itemTO.getExtAttrName());
+                        item.setMandatoryCondition(itemTO.getMandatoryCondition());
+                        item.setConnObjectKey(itemTO.isConnObjectKey());
+                        item.setPassword(itemTO.isPassword());
+                        item.setPropagationJEXLTransformer(itemTO.getPropagationJEXLTransformer());
+                        item.setPullJEXLTransformer(itemTO.getPullJEXLTransformer());
                         item.setIdP(idp);
                         item.setPurpose(MappingPurpose.NONE);
                         if (item.isConnObjectKey()) {
@@ -217,7 +220,13 @@ public class SAML2IdPDataBinderImpl implements SAML2IdPDataBinder {
         idp.getItems().forEach(item -> {
             ItemTO itemTO = new ItemTO();
             itemTO.setKey(item.getKey());
-            BeanUtils.copyProperties(item, itemTO, ITEM_IGNORE_PROPERTIES);
+            itemTO.setIntAttrName(item.getIntAttrName());
+            itemTO.setExtAttrName(item.getExtAttrName());
+            itemTO.setMandatoryCondition(item.getMandatoryCondition());
+            itemTO.setConnObjectKey(item.isConnObjectKey());
+            itemTO.setPassword(item.isPassword());
+            itemTO.setPropagationJEXLTransformer(item.getPropagationJEXLTransformer());
+            itemTO.setPullJEXLTransformer(item.getPullJEXLTransformer());
             itemTO.setPurpose(MappingPurpose.NONE);
 
             if (itemTO.isConnObjectKey()) {
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/NotificationITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/NotificationITCase.java
index 5b104ec..7a6159b 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/NotificationITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/NotificationITCase.java
@@ -89,10 +89,9 @@ public class NotificationITCase extends AbstractITCase {
 
     @Test
     public void update() {
-        NotificationTO notificationTO = notificationService.read(
-                "9e2b911c-25de-4c77-bcea-b86ed9451050");
-        notificationTO.setRecipientsFIQL(SyncopeClient.getUserSearchConditionBuilder().inGroups(
-                "bf825fe1-7320-4a54-bd64-143b5c18ab97").query());
+        NotificationTO notificationTO = notificationService.read("9e2b911c-25de-4c77-bcea-b86ed9451050");
+        notificationTO.setRecipientsFIQL(SyncopeClient.getUserSearchConditionBuilder().
+                inGroups("bf825fe1-7320-4a54-bd64-143b5c18ab97").query());
 
         notificationService.update(notificationTO);
         NotificationTO actual = notificationService.read(notificationTO.getKey());
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PlainSchemaITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PlainSchemaITCase.java
index fa04dd5..3135834 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PlainSchemaITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PlainSchemaITCase.java
@@ -100,7 +100,7 @@ public class PlainSchemaITCase extends AbstractITCase {
     }
 
     @Test
-    public void createREnumWithoutEnumeration() {
+    public void createEnumWithNoValues() {
         PlainSchemaTO schemaTO = new PlainSchemaTO();
         schemaTO.setKey("enumcheck");
         schemaTO.setType(AttrSchemaType.Enum);
@@ -151,7 +151,7 @@ public class PlainSchemaITCase extends AbstractITCase {
     }
 
     @Test
-    public void testBinaryValidation() throws IOException {
+    public void binaryValidation() throws IOException {
         // pdf - with validator
         PlainSchemaTO schemaTOpdf = new PlainSchemaTO();
         schemaTOpdf.setKey("BinaryPDF");
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
index b1ba164..4b6b864 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
@@ -446,7 +446,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
                                 query()).
                         build());
         assertNull(matchingUsers.getResult().get(0).getPlainAttr("title").orElse(null));
-        
+
         // SYNCOPE-1356 remove group membership from LDAP, pull and check in Syncope
         ConnObjectTO groupConnObject = resourceService.readConnObject(
                 RESOURCE_NAME_LDAP, AnyTypeKind.GROUP.name(), matchingGroups.getResult().get(0).getKey());