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

[syncope] 08/08: [SYNCOPE-160] Adding missing support for AuthModule items

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

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

commit f7e75bbe77d44d1c0a6b2aaa83001d920c757ffc
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Fri Apr 10 09:18:41 2020 +0200

    [SYNCOPE-160] Adding missing support for AuthModule items
---
 .../commons/IdMImplementationInfoProvider.java     |   8 +-
 .../resources/ItemTransformersTogglePanel.java     |   4 +-
 .../commons/IdRepoImplementationInfoProvider.java  |   4 +
 .../apache/syncope/common/lib/to/AuthModuleTO.java |  26 ++---
 .../common/lib/types/AMImplementationType.java     |  15 ++-
 .../common/rest/api/service/AuthModuleService.java |  12 +--
 .../common/lib/types/IdMImplementationType.java    |  13 +--
 .../common/lib/types/IdRepoImplementationType.java |   5 +-
 .../init/ClassPathScanImplementationLookup.java    |   4 +-
 .../syncope/core/logic/ImplementationLogic.java    |   2 +-
 .../init/ClassPathScanImplementationLookup.java    |   2 +-
 .../persistence/api/entity/auth/AuthModule.java    |  14 +--
 .../api/entity/auth/AuthModuleItem.java            |   3 +
 .../src/test/resources/domains/MasterContent.xml   |   8 +-
 .../persistence/jpa/dao/auth/JPAAuthModuleDAO.java |  16 ++--
 .../persistence/jpa/entity/auth/JPAAuthModule.java |  18 ++--
 .../jpa/entity/auth/JPAAuthModuleItem.java         |  31 +++++-
 .../jpa/entity/policy/JPAAccessPolicy.java         |   2 +-
 .../jpa/entity/policy/JPAAttrReleasePolicy.java    |   2 +-
 .../jpa/entity/policy/JPAAuthPolicy.java           |   2 +-
 .../jpa/entity/resource/JPAMappingItem.java        |   4 +-
 .../jpa/entity/resource/JPAOrgUnitItem.java        |   4 +-
 .../jpa/inner/AbstractClientAppTest.java           |   6 +-
 .../core/persistence/jpa/inner/AuthModuleTest.java |  44 ++++-----
 .../persistence/jpa/inner/ImplementationTest.java  |   4 +-
 .../core/persistence/jpa/inner/PolicyTest.java     |   6 +-
 .../src/test/resources/domains/MasterContent.xml   |   8 +-
 .../java/data/AuthModuleDataBinderImpl.java        |  99 +++++++++++++++----
 .../java/data/ImplementationDataBinderImpl.java    |  14 +--
 .../jpa/entity/JPAOIDCProviderItem.java            |   4 +-
 .../java/data/OIDCProviderDataBinderImpl.java      | 105 +++++++--------------
 .../core/persistence/jpa/dao/JPASAML2IdPDAO.java   |   1 -
 .../persistence/jpa/entity/JPASAML2IdPItem.java    |   4 +-
 .../java/data/SAML2IdPDataBinderImpl.java          | 104 +++++++-------------
 .../fit/core/reference/ITImplementationLookup.java |   2 +-
 .../apache/syncope/fit/core/AuthModuleITCase.java  |  35 +++----
 .../org/apache/syncope/fit/core/PolicyITCase.java  |  24 ++---
 .../syncope/fit/core/PropagationTaskITCase.java    |  10 +-
 .../apache/syncope/fit/core/PullTaskITCase.java    |   5 +-
 .../org/apache/syncope/fit/core/RealmITCase.java   |   6 +-
 .../view/ResourceExplorerTopComponent.java         |   2 +-
 41 files changed, 332 insertions(+), 350 deletions(-)

diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMImplementationInfoProvider.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMImplementationInfoProvider.java
index 174c813..3a7196e 100644
--- a/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMImplementationInfoProvider.java
+++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMImplementationInfoProvider.java
@@ -71,10 +71,6 @@ public class IdMImplementationInfoProvider extends IdRepoImplementationInfoProvi
         String templateClassName;
 
         switch (implementationType) {
-            case IdMImplementationType.ITEM_TRANSFORMER:
-                templateClassName = "MyItemTransformer";
-                break;
-
             case IdMImplementationType.RECON_FILTER_BUILDER:
                 templateClassName = "MyReconFilterBuilder";
                 break;
@@ -100,9 +96,9 @@ public class IdMImplementationInfoProvider extends IdRepoImplementationInfoProvi
                 break;
 
             case IdMImplementationType.PROVISION_SORTER:
-                templateClassName = "MyProvisionSorter";                
+                templateClassName = "MyProvisionSorter";
                 break;
-                
+
             default:
                 templateClassName = super.getGroovyTemplateClassName(implementationType);
         }
diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ItemTransformersTogglePanel.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ItemTransformersTogglePanel.java
index 912174d..bf77409 100644
--- a/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ItemTransformersTogglePanel.java
+++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ItemTransformersTogglePanel.java
@@ -28,7 +28,7 @@ import org.apache.syncope.client.ui.commons.Constants;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxPalettePanel;
 import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.ItemTO;
-import org.apache.syncope.common.lib.types.IdMImplementationType;
+import org.apache.syncope.common.lib.types.IdRepoImplementationType;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
@@ -64,7 +64,7 @@ public class ItemTransformersTogglePanel extends TogglePanel<Serializable> {
         Form<?> form = new Form<>("form");
         addInnerObject(form);
 
-        List<String> choices = ImplementationRestClient.list(IdMImplementationType.ITEM_TRANSFORMER).stream().
+        List<String> choices = ImplementationRestClient.list(IdRepoImplementationType.ITEM_TRANSFORMER).stream().
                 map(EntityTO::getKey).sorted().collect(Collectors.toList());
 
         form.add(new AjaxPalettePanel.Builder<String>().setAllowOrder(true).setRenderer(new IChoiceRenderer<String>() {
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/IdRepoImplementationInfoProvider.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/IdRepoImplementationInfoProvider.java
index ea08367..6b4d2f1 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/IdRepoImplementationInfoProvider.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/IdRepoImplementationInfoProvider.java
@@ -114,6 +114,10 @@ public class IdRepoImplementationInfoProvider implements ImplementationInfoProvi
                 templateClassName = "MyRecipientsProvider";
                 break;
 
+            case IdRepoImplementationType.ITEM_TRANSFORMER:
+                templateClassName = "MyItemTransformer";
+                break;
+
             default:
         }
 
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/AuthModuleTO.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/AuthModuleTO.java
index 492227f..3f499bd 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/AuthModuleTO.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/AuthModuleTO.java
@@ -22,6 +22,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
+import javax.ws.rs.PathParam;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import org.apache.commons.lang3.builder.EqualsBuilder;
@@ -43,15 +44,16 @@ public class AuthModuleTO extends BaseBean implements EntityTO {
 
     private String description;
 
-    private final List<ItemTO> profileItems = new ArrayList<>();
-
     private AuthModuleConf conf;
 
+    private final List<ItemTO> items = new ArrayList<>();
+
     @Override
     public String getKey() {
         return key;
     }
 
+    @PathParam("key")
     @Override
     public void setKey(final String key) {
         this.key = key;
@@ -81,20 +83,19 @@ public class AuthModuleTO extends BaseBean implements EntityTO {
         this.conf = conf;
     }
 
-    @XmlElementWrapper(name = "profileItems")
-    @XmlElement(name = "profileItem")
-    @JsonProperty("profileItems")
-    public List<ItemTO> getProfileItems() {
-        return profileItems;
+    @XmlElementWrapper(name = "items")
+    @XmlElement(name = "item")
+    @JsonProperty("items")
+    public List<ItemTO> getItems() {
+        return items;
     }
 
     public boolean add(final ItemTO item) {
-        return Optional.ofNullable(item)
-                .filter(itemTO -> this.profileItems.contains(itemTO) || this.profileItems.add(itemTO)).isPresent();
+        return Optional.ofNullable(item).filter(itemTO -> items.contains(itemTO) || items.add(itemTO)).isPresent();
     }
 
     public boolean remove(final ItemTO item) {
-        return this.profileItems.remove(item);
+        return this.items.remove(item);
     }
 
     @Override
@@ -113,7 +114,7 @@ public class AuthModuleTO extends BaseBean implements EntityTO {
                 append(key, other.key).
                 append(name, other.name).
                 append(description, other.description).
-                append(profileItems, other.profileItems).
+                append(items, other.items).
                 append(conf, other.conf).
                 build();
     }
@@ -124,9 +125,8 @@ public class AuthModuleTO extends BaseBean implements EntityTO {
                 append(key).
                 append(name).
                 append(description).
-                append(profileItems).
+                append(items).
                 append(conf).
                 build();
     }
-
 }
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/AMImplementationType.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/AMImplementationType.java
index 1c05727..1a6a7a0 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/AMImplementationType.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/AMImplementationType.java
@@ -23,23 +23,20 @@ import java.util.Map;
 
 public final class AMImplementationType {
 
-    public static final String AUTH_POLICY_CONFIGURATIONS = "AUTH_POLICY_CONFIGURATIONS";
+    public static final String AUTH_POLICY_CONF = "AUTH_POLICY_CONF";
 
-    public static final String ACCESS_POLICY_CONFIGURATIONS = "ACCESS_POLICY_CONFIGURATIONS";
+    public static final String ACCESS_POLICY_CONF = "ACCESS_POLICY_CONF";
 
-    public static final String ATTR_RELEASE_POLICY_CONFIGURATIONS = "ATTR_RELEASE_CONFIGURATIONS";
+    public static final String ATTR_RELEASE_POLICY_CONF = "ATTR_RELEASE_POLICY_CONF";
 
     private AMImplementationType() {
         // private constructor for static utility class
     }
 
     private static final Map<String, String> VALUES = Map.ofEntries(
-            Pair.of(AUTH_POLICY_CONFIGURATIONS,
-                    "org.apache.syncope.common.lib.policy.AuthPolicyConf"),
-            Pair.of(ATTR_RELEASE_POLICY_CONFIGURATIONS,
-                    "org.apache.syncope.common.lib.policy.AttrReleasePolicyConf"),
-            Pair.of(ACCESS_POLICY_CONFIGURATIONS,
-                    "org.apache.syncope.common.lib.policy.AccessPolicyConf"));
+            Pair.of(AUTH_POLICY_CONF, "org.apache.syncope.common.lib.policy.AuthPolicyConf"),
+            Pair.of(ACCESS_POLICY_CONF, "org.apache.syncope.common.lib.policy.AccessPolicyConf"),
+            Pair.of(ATTR_RELEASE_POLICY_CONF, "org.apache.syncope.common.lib.policy.AttrReleasePolicyConf"));
 
     public static Map<String, String> values() {
         return VALUES;
diff --git a/common/am/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AuthModuleService.java b/common/am/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AuthModuleService.java
index 83e6015..d617b42 100644
--- a/common/am/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AuthModuleService.java
+++ b/common/am/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AuthModuleService.java
@@ -62,8 +62,7 @@ public interface AuthModuleService extends JAXRSService {
     @GET
     @Path("{key}")
     @Produces({ MediaType.APPLICATION_JSON, RESTHeaders.APPLICATION_YAML, MediaType.APPLICATION_XML })
-    AuthModuleTO read(
-            @NotNull @PathParam("key") String key);
+    AuthModuleTO read(@NotNull @PathParam("key") String key);
 
     /**
      * Returns a list of authentication modules of the matching type.
@@ -92,8 +91,7 @@ public interface AuthModuleService extends JAXRSService {
     @POST
     @Consumes({ MediaType.APPLICATION_JSON, RESTHeaders.APPLICATION_YAML, MediaType.APPLICATION_XML })
     @Produces({ MediaType.APPLICATION_JSON, RESTHeaders.APPLICATION_YAML, MediaType.APPLICATION_XML })
-    Response create(
-            @NotNull AuthModuleTO authModuleTO);
+    Response create(@NotNull AuthModuleTO authModuleTO);
 
     /**
      * Updates authentication module matching the given key.
@@ -108,8 +106,7 @@ public interface AuthModuleService extends JAXRSService {
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, RESTHeaders.APPLICATION_YAML, MediaType.APPLICATION_XML })
     @Produces({ MediaType.APPLICATION_JSON, RESTHeaders.APPLICATION_YAML, MediaType.APPLICATION_XML })
-    void update(
-            @NotNull AuthModuleTO authModuleTO);
+    void update(@NotNull AuthModuleTO authModuleTO);
 
     /**
      * Delete authentication module matching the given key.
@@ -121,6 +118,5 @@ public interface AuthModuleService extends JAXRSService {
     @DELETE
     @Path("{key}")
     @Produces({ MediaType.APPLICATION_JSON, RESTHeaders.APPLICATION_YAML, MediaType.APPLICATION_XML })
-    void delete(
-            @NotNull @PathParam("key") String key);
+    void delete(@NotNull @PathParam("key") String key);
 }
diff --git a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/types/IdMImplementationType.java b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/types/IdMImplementationType.java
index a3aff0a..37765b2 100644
--- a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/types/IdMImplementationType.java
+++ b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/types/IdMImplementationType.java
@@ -23,8 +23,6 @@ import org.apache.commons.lang3.tuple.Pair;
 
 public final class IdMImplementationType {
 
-    public static final String ITEM_TRANSFORMER = "ITEM_TRANSFORMER";
-
     public static final String RECON_FILTER_BUILDER = "RECON_FILTER_BUILDER";
 
     public static final String PROPAGATION_ACTIONS = "PROPAGATION_ACTIONS";
@@ -40,13 +38,12 @@ public final class IdMImplementationType {
     public static final String PROVISION_SORTER = "PROVISION_SORTER";
 
     private static final Map<String, String> VALUES = Map.ofEntries(
-            Pair.of(ITEM_TRANSFORMER, "org.apache.syncope.core.spring.security.JWTSSOProvider"),
             Pair.of(RECON_FILTER_BUILDER, "org.apache.syncope.core.persistence.api.dao.Reportlet"),
-            Pair.of(PROPAGATION_ACTIONS, "org.apache.syncope.core.persistence.api.dao.AccountRule"),
-            Pair.of(PULL_ACTIONS, "org.apache.syncope.core.persistence.api.dao.PasswordRule"),
-            Pair.of(PUSH_ACTIONS, "org.apache.syncope.core.provisioning.api.job.SchedTaskJobDelegate"),
-            Pair.of(PULL_CORRELATION_RULE, "org.apache.syncope.core.provisioning.api.LogicActions"),
-            Pair.of(PUSH_CORRELATION_RULE, "org.apache.syncope.core.persistence.api.attrvalue.validation.Validator"),
+            Pair.of(PROPAGATION_ACTIONS, "org.apache.syncope.core.provisioning.api.propagation.PropagationActions"),
+            Pair.of(PULL_ACTIONS, "org.apache.syncope.core.provisioning.api.pushpull.PullActions"),
+            Pair.of(PUSH_ACTIONS, "org.apache.syncope.core.provisioning.api.pushpull.PushActions"),
+            Pair.of(PULL_CORRELATION_RULE, "org.apache.syncope.common.lib.policy.PullCorrelationRuleConf"),
+            Pair.of(PUSH_CORRELATION_RULE, "org.apache.syncope.common.lib.policy.PushCorrelationRuleConf"),
             Pair.of(PROVISION_SORTER, "org.apache.syncope.core.provisioning.api.ProvisionSorter"));
 
     public static Map<String, String> values() {
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/IdRepoImplementationType.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/IdRepoImplementationType.java
index 013cb06..eb374be 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/IdRepoImplementationType.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/IdRepoImplementationType.java
@@ -41,6 +41,8 @@ public final class IdRepoImplementationType {
 
     public static final String AUDIT_APPENDER = "AUDIT_APPENDER";
 
+    public static final String ITEM_TRANSFORMER = "ITEM_TRANSFORMER";
+
     private static final Map<String, String> VALUES = Map.ofEntries(
             Pair.of(JWT_SSO_PROVIDER, "org.apache.syncope.core.spring.security.JWTSSOProvider"),
             Pair.of(REPORTLET, "org.apache.syncope.core.persistence.api.dao.Reportlet"),
@@ -50,7 +52,8 @@ public final class IdRepoImplementationType {
             Pair.of(LOGIC_ACTIONS, "org.apache.syncope.core.provisioning.api.LogicActions"),
             Pair.of(VALIDATOR, "org.apache.syncope.core.persistence.api.attrvalue.validation.Validator"),
             Pair.of(RECIPIENTS_PROVIDER, "org.apache.syncope.core.provisioning.api.notification.RecipientsProvider"),
-            Pair.of(AUDIT_APPENDER, "org.apache.syncope.core.logic.audit.AuditAppender"));
+            Pair.of(AUDIT_APPENDER, "org.apache.syncope.core.logic.audit.AuditAppender"),
+            Pair.of(ITEM_TRANSFORMER, "org.apache.syncope.core.provisioning.api.data.ItemTransformer"));
 
     public static Map<String, String> values() {
         return VALUES;
diff --git a/core/am/logic/src/main/java/org/apache/syncope/core/logic/init/ClassPathScanImplementationLookup.java b/core/am/logic/src/main/java/org/apache/syncope/core/logic/init/ClassPathScanImplementationLookup.java
index e887aef..04f4463 100644
--- a/core/am/logic/src/main/java/org/apache/syncope/core/logic/init/ClassPathScanImplementationLookup.java
+++ b/core/am/logic/src/main/java/org/apache/syncope/core/logic/init/ClassPathScanImplementationLookup.java
@@ -92,10 +92,10 @@ public class ClassPathScanImplementationLookup implements SyncopeCoreLoader {
                 boolean isAbstractClazz = Modifier.isAbstract(clazz.getModifiers());
 
                 if (AuthPolicyConf.class.isAssignableFrom(clazz) && !isAbstractClazz) {
-                    classNames.get(AMImplementationType.AUTH_POLICY_CONFIGURATIONS).add(bd.getBeanClassName());
+                    classNames.get(AMImplementationType.AUTH_POLICY_CONF).add(bd.getBeanClassName());
                 }
                 if (AccessPolicyConf.class.isAssignableFrom(clazz) && !isAbstractClazz) {
-                    classNames.get(AMImplementationType.ACCESS_POLICY_CONFIGURATIONS).add(bd.getBeanClassName());
+                    classNames.get(AMImplementationType.ACCESS_POLICY_CONF).add(bd.getBeanClassName());
                 }
             } catch (Throwable t) {
                 LOG.warn("Could not inspect class {}", bd.getBeanClassName(), t);
diff --git a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/ImplementationLogic.java b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/ImplementationLogic.java
index 40380cd..a2fd3d9 100644
--- a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/ImplementationLogic.java
+++ b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/ImplementationLogic.java
@@ -179,7 +179,7 @@ public class ImplementationLogic extends AbstractTransactionalLogic<Implementati
                 inUse = !policyDAO.findByPasswordRule(implementation).isEmpty();
                 break;
 
-            case IdMImplementationType.ITEM_TRANSFORMER:
+            case IdRepoImplementationType.ITEM_TRANSFORMER:
                 inUse = !resourceDAO.findByTransformer(implementation).isEmpty();
                 break;
 
diff --git a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/init/ClassPathScanImplementationLookup.java b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/init/ClassPathScanImplementationLookup.java
index 5baf2e5..6b626db 100644
--- a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/init/ClassPathScanImplementationLookup.java
+++ b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/init/ClassPathScanImplementationLookup.java
@@ -194,7 +194,7 @@ public class ClassPathScanImplementationLookup implements ImplementationLookup {
                 if (ItemTransformer.class.isAssignableFrom(clazz) && !isAbstractClazz
                         && !clazz.equals(JEXLItemTransformerImpl.class)) {
 
-                    classNames.get(IdMImplementationType.ITEM_TRANSFORMER).add(clazz.getName());
+                    classNames.get(IdRepoImplementationType.ITEM_TRANSFORMER).add(clazz.getName());
                 }
 
                 if (SchedTaskJobDelegate.class.isAssignableFrom(clazz) && !isAbstractClazz
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/auth/AuthModule.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/auth/AuthModule.java
index 5d2393e..8ba362c 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/auth/AuthModule.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/auth/AuthModule.java
@@ -21,7 +21,6 @@ package org.apache.syncope.core.persistence.api.entity.auth;
 import java.util.List;
 import org.apache.syncope.common.lib.auth.AuthModuleConf;
 import org.apache.syncope.core.persistence.api.entity.Entity;
-import org.apache.syncope.core.persistence.api.entity.resource.Item;
 
 public interface AuthModule extends Entity {
 
@@ -33,16 +32,11 @@ public interface AuthModule extends Entity {
 
     void setDescription(String description);
 
-    /**
-     * Specify the mapping items for the attributes fetched from the source.
-     *
-     * @return list of mapping items
-     */
-    List<? extends Item> getProfileItems();
-
-    boolean add(Item profileItem);
-
     AuthModuleConf getConf();
 
     void setConf(AuthModuleConf description);
+
+    List<? extends AuthModuleItem> getItems();
+
+    boolean add(AuthModuleItem item);
 }
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/auth/AuthModuleItem.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/auth/AuthModuleItem.java
index 9f249e4..2754b02 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/auth/AuthModuleItem.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/auth/AuthModuleItem.java
@@ -22,4 +22,7 @@ import org.apache.syncope.core.persistence.api.entity.resource.Item;
 
 public interface AuthModuleItem extends Item {
 
+    AuthModule getAuthModule();
+
+    void setAuthModule(AuthModule authModule);
 }
diff --git a/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml b/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml
index 8e82492..d58f29a 100644
--- a/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml
@@ -45,22 +45,22 @@ under the License.
   <PasswordPolicyRule policy_id="55e5de0b-c79c-4e66-adda-251b6fb8579a" implementation_id="DefaultPasswordRuleConf3"/>
   
   <!-- authentication policies -->
-  <Implementation id="MyDefaultAuthPolicyConf" type="AUTH_POLICY_CONFIGURATIONS" engine="JAVA"
+  <Implementation id="MyDefaultAuthPolicyConf" type="AUTH_POLICY_CONF" engine="JAVA"
                   body='{"@class":"org.apache.syncope.common.lib.policy.DefaultAuthPolicyConf","authModules":["LdapAuthenticationTest"]}'/>
   <AuthPolicy id="659b9906-4b6e-4bc0-aca0-6809dff346d4" name="MyDefaultAuthPolicyConf" description="an authentication policy"/>
   <AuthPolicy id="b912a0d4-a890-416f-9ab8-84ab077eb028" name="DefaultAuthPolicy" description="Default authentication policy"/>
 
   <!-- access policies -->
-  <Implementation id="MyDefaultAccessPolicyConf" type="ACCESS_POLICY_CONFIGURATIONS" engine="JAVA"
+  <Implementation id="MyDefaultAccessPolicyConf" type="ACCESS_POLICY_CONF" engine="JAVA"
                   body='{"@class":"org.apache.syncope.common.lib.policy.DefaultAccessPolicyConf","name":"MyDefaultAccessPolicyConf","enabled":true,"ssoEnabled":true}'/>
   <AccessPolicy id="419935c7-deb3-40b3-8a9a-683037e523a2" name="MyDefaultAccessPolicyConf" description="an access policy"/>
 
   <!-- Attr Release Policies -->
-  <Implementation id="AllowedAttrReleasePolicyConf" type="ATTR_RELEASE_CONFIGURATIONS" engine="JAVA"
+  <Implementation id="AllowedAttrReleasePolicyConf" type="ATTR_RELEASE_CONF" engine="JAVA"
                   body='{"@class":"org.apache.syncope.common.lib.policy.AllowedAttrReleasePolicyConf","name":"AllowedAttrReleasePolicy","allowedAttributes":["cn","givenName","uid"]}'/>
   <AttrReleasePolicy id="319935c7-deb3-40b3-8a9a-683037e523a2" name="AllowedAttrReleasePolicy" description="allowed attribute release policy policy"/>
 
-  <Implementation id="DenyAttrReleasePolicyConf" type="ATTR_RELEASE_CONFIGURATIONS" engine="JAVA"
+  <Implementation id="DenyAttrReleasePolicyConf" type="ATTR_RELEASE_CONF" engine="JAVA"
                   body='{"@class":"org.apache.syncope.common.lib.policy.AllowedAttrReleasePolicyConf","name":"DenyAttrReleasePolicyConf"}'/>
   <AttrReleasePolicy id="219935c7-deb3-40b3-8a9a-683037e523a2" name="DenyAttrReleasePolicy" description="deny attribute release policy policy"/>
   
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/auth/JPAAuthModuleDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/auth/JPAAuthModuleDAO.java
index dd765ad..8106222 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/auth/JPAAuthModuleDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/auth/JPAAuthModuleDAO.java
@@ -18,18 +18,19 @@
  */
 package org.apache.syncope.core.persistence.jpa.dao.auth;
 
-import org.apache.syncope.core.persistence.jpa.dao.AbstractDAO;
-import org.springframework.stereotype.Repository;
-import org.springframework.transaction.annotation.Transactional;
-import javax.persistence.TypedQuery;
 import java.util.List;
+import javax.persistence.TypedQuery;
 import org.apache.syncope.core.persistence.api.dao.auth.AuthModuleDAO;
+import org.apache.syncope.core.persistence.jpa.dao.AbstractDAO;
 import org.apache.syncope.core.persistence.api.entity.auth.AuthModule;
 import org.apache.syncope.core.persistence.jpa.entity.auth.JPAAuthModule;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
 
 @Repository
 public class JPAAuthModuleDAO extends AbstractDAO<AuthModule> implements AuthModuleDAO {
 
+    @Transactional(readOnly = true)
     @Override
     public AuthModule find(final String key) {
         return entityManager().find(JPAAuthModule.class, key);
@@ -38,13 +39,11 @@ public class JPAAuthModuleDAO extends AbstractDAO<AuthModule> implements AuthMod
     @Transactional(readOnly = true)
     @Override
     public List<AuthModule> findAll() {
-        TypedQuery<AuthModule> query = entityManager().createQuery("SELECT e FROM " + JPAAuthModule.class.
-                getSimpleName() + " e", AuthModule.class);
-
+        TypedQuery<AuthModule> query = entityManager().createQuery(
+                "SELECT e FROM " + JPAAuthModule.class.getSimpleName() + " e", AuthModule.class);
         return query.getResultList();
     }
 
-    @Transactional(readOnly = true)
     @Override
     public AuthModule save(final AuthModule authModule) {
         return entityManager().merge(authModule);
@@ -64,5 +63,4 @@ public class JPAAuthModuleDAO extends AbstractDAO<AuthModule> implements AuthMod
     public void delete(final AuthModule authModule) {
         entityManager().remove(authModule);
     }
-
 }
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/auth/JPAAuthModule.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/auth/JPAAuthModule.java
index e2b6586..cbbb96b 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/auth/JPAAuthModule.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/auth/JPAAuthModule.java
@@ -30,7 +30,7 @@ import javax.persistence.Table;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.auth.AuthModuleConf;
 import org.apache.syncope.core.persistence.api.entity.auth.AuthModule;
-import org.apache.syncope.core.persistence.api.entity.resource.Item;
+import org.apache.syncope.core.persistence.api.entity.auth.AuthModuleItem;
 import org.apache.syncope.core.persistence.jpa.entity.AbstractGeneratedKeyEntity;
 import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
 
@@ -48,8 +48,8 @@ public class JPAAuthModule extends AbstractGeneratedKeyEntity implements AuthMod
     @Column(nullable = false)
     private String description;
 
-    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER, mappedBy = "mapping")
-    private final List<JPAAuthModuleItem> profileItems = new ArrayList<>();
+    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER, mappedBy = "authModule")
+    private List<JPAAuthModuleItem> items = new ArrayList<>();
 
     @Lob
     private String jsonConf;
@@ -75,15 +75,14 @@ public class JPAAuthModule extends AbstractGeneratedKeyEntity implements AuthMod
     }
 
     @Override
-    public List<? extends Item> getProfileItems() {
-        return profileItems;
+    public List<? extends AuthModuleItem> getItems() {
+        return items;
     }
 
     @Override
-    public boolean add(final Item profileItem) {
-        checkType(profileItem, JPAAuthModuleItem.class);
-        return profileItems.contains((JPAAuthModuleItem) profileItem)
-                || profileItems.add((JPAAuthModuleItem) profileItem);
+    public boolean add(final AuthModuleItem item) {
+        checkType(item, JPAAuthModuleItem.class);
+        return items.contains((JPAAuthModuleItem) item) || items.add((JPAAuthModuleItem) item);
     }
 
     @Override
@@ -100,5 +99,4 @@ public class JPAAuthModule extends AbstractGeneratedKeyEntity implements AuthMod
     public void setConf(final AuthModuleConf conf) {
         jsonConf = POJOHelper.serialize(conf);
     }
-
 }
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/auth/JPAAuthModuleItem.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/auth/JPAAuthModuleItem.java
index bc92d49..c851289 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/auth/JPAAuthModuleItem.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/auth/JPAAuthModuleItem.java
@@ -26,10 +26,13 @@ import javax.persistence.FetchType;
 import javax.persistence.JoinColumn;
 import javax.persistence.JoinTable;
 import javax.persistence.ManyToMany;
+import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 import javax.persistence.UniqueConstraint;
-import org.apache.syncope.common.lib.types.IdMImplementationType;
+import org.apache.syncope.common.lib.types.IdRepoImplementationType;
+import org.apache.syncope.common.lib.types.MappingPurpose;
 import org.apache.syncope.core.persistence.api.entity.Implementation;
+import org.apache.syncope.core.persistence.api.entity.auth.AuthModule;
 import org.apache.syncope.core.persistence.api.entity.auth.AuthModuleItem;
 import org.apache.syncope.core.persistence.jpa.entity.JPAImplementation;
 import org.apache.syncope.core.persistence.jpa.entity.resource.AbstractItem;
@@ -43,6 +46,9 @@ public class JPAAuthModuleItem extends AbstractItem implements AuthModuleItem {
 
     private static final long serialVersionUID = 3165440920144995781L;
 
+    @ManyToOne
+    private JPAAuthModule authModule;
+
     @ManyToMany(fetch = FetchType.EAGER)
     @JoinTable(name = TABLE + "Transformer",
             joinColumns =
@@ -53,10 +59,30 @@ public class JPAAuthModuleItem extends AbstractItem implements AuthModuleItem {
             @UniqueConstraint(columnNames = { "item_id", "implementation_id" }))
     private final List<JPAImplementation> transformers = new ArrayList<>();
 
+    public JPAAuthModuleItem() {
+        super.setPurpose(MappingPurpose.NONE);
+    }
+
+    @Override
+    public void setPurpose(final MappingPurpose purpose) {
+        // cannot be changed
+    }
+
+    @Override
+    public AuthModule getAuthModule() {
+        return authModule;
+    }
+
+    @Override
+    public void setAuthModule(final AuthModule authModule) {
+        checkType(authModule, JPAAuthModule.class);
+        this.authModule = (JPAAuthModule) authModule;
+    }
+
     @Override
     public boolean add(final Implementation transformer) {
         checkType(transformer, JPAImplementation.class);
-        checkImplementationType(transformer, IdMImplementationType.ITEM_TRANSFORMER);
+        checkImplementationType(transformer, IdRepoImplementationType.ITEM_TRANSFORMER);
         return transformers.contains((JPAImplementation) transformer)
                 || this.transformers.add((JPAImplementation) transformer);
     }
@@ -65,5 +91,4 @@ public class JPAAuthModuleItem extends AbstractItem implements AuthModuleItem {
     public List<? extends Implementation> getTransformers() {
         return transformers;
     }
-
 }
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAccessPolicy.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAccessPolicy.java
index 261c176..b5843a9 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAccessPolicy.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAccessPolicy.java
@@ -61,7 +61,7 @@ public class JPAAccessPolicy extends AbstractPolicy implements AccessPolicy {
     @Override
     public void setConfiguration(final Implementation configuration) {
         checkType(configuration, JPAImplementation.class);
-        checkImplementationType(configuration, AMImplementationType.ACCESS_POLICY_CONFIGURATIONS);
+        checkImplementationType(configuration, AMImplementationType.ACCESS_POLICY_CONF);
         this.configuration = (JPAImplementation) configuration;
     }
 
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAttrReleasePolicy.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAttrReleasePolicy.java
index 6a21edc..d6d0ba3 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAttrReleasePolicy.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAttrReleasePolicy.java
@@ -62,7 +62,7 @@ public class JPAAttrReleasePolicy extends AbstractPolicy implements AttrReleaseP
     @Override
     public void setConfiguration(final Implementation configuration) {
         checkType(configuration, JPAImplementation.class);
-        checkImplementationType(configuration, AMImplementationType.ATTR_RELEASE_POLICY_CONFIGURATIONS);
+        checkImplementationType(configuration, AMImplementationType.ATTR_RELEASE_POLICY_CONF);
         this.configuration = (JPAImplementation) configuration;
     }
 }
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAuthPolicy.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAuthPolicy.java
index b367152..59263c2 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAuthPolicy.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAuthPolicy.java
@@ -61,7 +61,7 @@ public class JPAAuthPolicy extends AbstractPolicy implements AuthPolicy {
     @Override
     public void setConfiguration(final Implementation configuration) {
         checkType(configuration, JPAImplementation.class);
-        checkImplementationType(configuration, AMImplementationType.AUTH_POLICY_CONFIGURATIONS);
+        checkImplementationType(configuration, AMImplementationType.AUTH_POLICY_CONF);
         this.configuration = (JPAImplementation) configuration;
     }
 
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMappingItem.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMappingItem.java
index e81450f..a197e11 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMappingItem.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMappingItem.java
@@ -28,8 +28,8 @@ import javax.persistence.JoinTable;
 import javax.persistence.ManyToMany;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
-import org.apache.syncope.common.lib.types.IdMImplementationType;
 import javax.persistence.UniqueConstraint;
+import org.apache.syncope.common.lib.types.IdRepoImplementationType;
 import org.apache.syncope.core.persistence.api.entity.Implementation;
 import org.apache.syncope.core.persistence.api.entity.resource.Mapping;
 import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
@@ -71,7 +71,7 @@ public class JPAMappingItem extends AbstractItem implements MappingItem {
     @Override
     public boolean add(final Implementation transformer) {
         checkType(transformer, JPAImplementation.class);
-        checkImplementationType(transformer, IdMImplementationType.ITEM_TRANSFORMER);
+        checkImplementationType(transformer, IdRepoImplementationType.ITEM_TRANSFORMER);
         return transformers.contains((JPAImplementation) transformer)
                 || transformers.add((JPAImplementation) transformer);
     }
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAOrgUnitItem.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAOrgUnitItem.java
index 90423b4..1882a13 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAOrgUnitItem.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAOrgUnitItem.java
@@ -28,8 +28,8 @@ import javax.persistence.JoinTable;
 import javax.persistence.ManyToMany;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
-import org.apache.syncope.common.lib.types.IdMImplementationType;
 import javax.persistence.UniqueConstraint;
+import org.apache.syncope.common.lib.types.IdRepoImplementationType;
 import org.apache.syncope.core.persistence.api.entity.Implementation;
 import org.apache.syncope.core.persistence.api.entity.resource.OrgUnit;
 import org.apache.syncope.core.persistence.api.entity.resource.OrgUnitItem;
@@ -76,7 +76,7 @@ public class JPAOrgUnitItem extends AbstractItem implements OrgUnitItem {
     @Override
     public boolean add(final Implementation transformer) {
         checkType(transformer, JPAImplementation.class);
-        checkImplementationType(transformer, IdMImplementationType.ITEM_TRANSFORMER);
+        checkImplementationType(transformer, IdRepoImplementationType.ITEM_TRANSFORMER);
         return transformers.contains((JPAImplementation) transformer)
                 || transformers.add((JPAImplementation) transformer);
     }
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AbstractClientAppTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AbstractClientAppTest.java
index d2eea8f..c4ea282 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AbstractClientAppTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AbstractClientAppTest.java
@@ -56,7 +56,7 @@ public class AbstractClientAppTest extends AbstractTest {
         Implementation type = entityFactory.newEntity(Implementation.class);
         type.setKey("AttrRelPolicyTest");
         type.setEngine(ImplementationEngine.JAVA);
-        type.setType(AMImplementationType.ATTR_RELEASE_POLICY_CONFIGURATIONS);
+        type.setType(AMImplementationType.ATTR_RELEASE_POLICY_CONF);
         type.setBody(POJOHelper.serialize(conf));
         type = implementationDAO.save(type);
         attrRelPolicy.setConfiguration(type);
@@ -78,7 +78,7 @@ public class AbstractClientAppTest extends AbstractTest {
         Implementation type = entityFactory.newEntity(Implementation.class);
         type.setKey("AccessPolicyConfKey");
         type.setEngine(ImplementationEngine.JAVA);
-        type.setType(AMImplementationType.ACCESS_POLICY_CONFIGURATIONS);
+        type.setType(AMImplementationType.ACCESS_POLICY_CONF);
         type.setBody(POJOHelper.serialize(conf));
         type = implementationDAO.save(type);
 
@@ -98,7 +98,7 @@ public class AbstractClientAppTest extends AbstractTest {
         Implementation type = entityFactory.newEntity(Implementation.class);
         type.setKey("AuthPolicyConfKey");
         type.setEngine(ImplementationEngine.JAVA);
-        type.setType(AMImplementationType.AUTH_POLICY_CONFIGURATIONS);
+        type.setType(AMImplementationType.AUTH_POLICY_CONF);
         type.setBody(POJOHelper.serialize(conf));
         type = implementationDAO.save(type);
 
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AuthModuleTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AuthModuleTest.java
index 27c0d22..8bd2c13 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AuthModuleTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AuthModuleTest.java
@@ -303,6 +303,7 @@ public class AuthModuleTest extends AbstractTest {
         module = authModuleDAO.save(module);
         assertNotNull(module);
         assertNotNull(module.getKey());
+
         AuthModule found = authModuleDAO.find(module.getKey());
         assertNotNull(found);
         assertEquals("dc=example2,dc=org", LDAPAuthModuleConf.class.cast(found.getConf()).getBaseDn());
@@ -322,8 +323,7 @@ public class AuthModuleTest extends AbstractTest {
         assertNotNull(module.getKey());
         AuthModule found = authModuleDAO.find(module.getKey());
         assertNotNull(found);
-        assertEquals("SELECT * FROM otherTable WHERE name=?",
-                JDBCAuthModuleConf.class.cast(found.getConf()).getSql());
+        assertEquals("SELECT * FROM otherTable WHERE name=?", JDBCAuthModuleConf.class.cast(found.getConf()).getSql());
     }
 
     @Test
@@ -443,6 +443,7 @@ public class AuthModuleTest extends AbstractTest {
     public void updateWithSyncopeModule() {
         AuthModule module = authModuleDAO.find("4c3edd60-7008-11ea-bc55-0242ac130003");
         assertNotNull(module);
+
         AuthModuleConf conf = module.getConf();
         SyncopeAuthModuleConf.class.cast(conf).setDomain("Two");
         module.setConf(conf);
@@ -457,16 +458,13 @@ public class AuthModuleTest extends AbstractTest {
 
     @Test
     public void delete() {
-        testDelete("be456831-593d-4003-b273-4c3fb61700df");
-        testDelete("4c3ed8f6-7008-11ea-bc55-0242ac130003");
-        testDelete("4c3edbbc-7008-11ea-bc55-0242ac130003");
-        testDelete("4c3ed7e8-7008-11ea-bc55-0242ac130003");
-        testDelete("4c3ed4e6-7008-11ea-bc55-0242ac130003");
-        testDelete("4c3edc98-7008-11ea-bc55-0242ac130003");
-        testDelete("4c3ed9d2-7008-11ea-bc55-0242ac130003");
-        testDelete("4c3edd60-7008-11ea-bc55-0242ac130003");
-        testDelete("07c528f3-63b4-4dc1-a4da-87f35b8bdec8");
-        testDelete("f6e1288d-50d9-45fe-82ee-597c42242205");
+        AuthModule authModule = authModuleDAO.find("be456831-593d-4003-b273-4c3fb61700df");
+        assertNotNull(authModule);
+
+        authModuleDAO.delete("be456831-593d-4003-b273-4c3fb61700df");
+
+        authModule = authModuleDAO.find("be456831-593d-4003-b273-4c3fb61700df");
+        assertNull(authModule);
     }
 
     private void saveAuthModule(final String name, final AuthModuleConf conf) {
@@ -474,29 +472,27 @@ public class AuthModuleTest extends AbstractTest {
         module.setName(name);
         module.setDescription("An authentication module");
         module.setConf(conf);
+
         AuthModuleItem keyMapping = entityFactory.newEntity(AuthModuleItem.class);
         keyMapping.setIntAttrName("uid");
         keyMapping.setExtAttrName("username");
+        keyMapping.setAuthModule(module);
+        module.add(keyMapping);
+
         AuthModuleItem fullnameMapping = entityFactory.newEntity(AuthModuleItem.class);
         fullnameMapping.setIntAttrName("cn");
         fullnameMapping.setExtAttrName("fullname");
-        module.add(keyMapping);
+        fullnameMapping.setAuthModule(module);
         module.add(fullnameMapping);
-        authModuleDAO.save(module);
+
+        module = authModuleDAO.save(module);
         assertNotNull(module);
         assertNotNull(module.getKey());
-        assertNotNull(authModuleDAO.find(module.getKey()));
-    }
-
-    private void testDelete(final String key) {
-        AuthModule authModule = authModuleDAO.find(key);
-        assertNotNull(authModule);
-        authModuleDAO.delete(key);
-        authModule = authModuleDAO.find(key);
-        assertNull(authModule);
+        assertEquals(module, authModuleDAO.find(module.getKey()));
+        assertEquals(2, module.getItems().size());
     }
 
-    private boolean isSpecificConf(final AuthModuleConf conf, final Class<? extends AuthModuleConf> clazz) {
+    private static boolean isSpecificConf(final AuthModuleConf conf, final Class<? extends AuthModuleConf> clazz) {
         return ClassUtils.isAssignable(clazz, conf.getClass());
     }
 }
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ImplementationTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ImplementationTest.java
index f34a7e7..bf6ff38 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ImplementationTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ImplementationTest.java
@@ -74,10 +74,10 @@ public class ImplementationTest extends AbstractTest {
         implementations = implementationDAO.findByType(IdMImplementationType.PUSH_CORRELATION_RULE);
         assertEquals(1, implementations.size());
 
-        implementations = implementationDAO.findByType(AMImplementationType.AUTH_POLICY_CONFIGURATIONS);
+        implementations = implementationDAO.findByType(AMImplementationType.AUTH_POLICY_CONF);
         assertEquals(1, implementations.size());
 
-        implementations = implementationDAO.findByType(AMImplementationType.ACCESS_POLICY_CONFIGURATIONS);
+        implementations = implementationDAO.findByType(AMImplementationType.ACCESS_POLICY_CONF);
         assertEquals(1, implementations.size());
     }
 
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PolicyTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PolicyTest.java
index 3e7cdaf..1ebc7c3 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PolicyTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PolicyTest.java
@@ -213,7 +213,7 @@ public class PolicyTest extends AbstractTest {
         Implementation type = entityFactory.newEntity(Implementation.class);
         type.setKey("AttrReleasePolicyAllowEverything");
         type.setEngine(ImplementationEngine.JAVA);
-        type.setType(AMImplementationType.ACCESS_POLICY_CONFIGURATIONS);
+        type.setType(AMImplementationType.ACCESS_POLICY_CONF);
         type.setBody(POJOHelper.serialize(conf));
         type = implementationDAO.save(type);
 
@@ -240,7 +240,7 @@ public class PolicyTest extends AbstractTest {
         Implementation authPolicyType = entityFactory.newEntity(Implementation.class);
         authPolicyType.setKey("AuthPolicyConfKey");
         authPolicyType.setEngine(ImplementationEngine.JAVA);
-        authPolicyType.setType(AMImplementationType.AUTH_POLICY_CONFIGURATIONS);
+        authPolicyType.setType(AMImplementationType.AUTH_POLICY_CONF);
         authPolicyType.setBody(POJOHelper.serialize(authPolicyConf));
         authPolicyType = implementationDAO.save(authPolicyType);
 
@@ -265,7 +265,7 @@ public class PolicyTest extends AbstractTest {
         Implementation attrReleasePolicyType = entityFactory.newEntity(Implementation.class);
         attrReleasePolicyType.setKey("AttrReleasePolicyAllowEverything");
         attrReleasePolicyType.setEngine(ImplementationEngine.JAVA);
-        attrReleasePolicyType.setType(AMImplementationType.ATTR_RELEASE_POLICY_CONFIGURATIONS);
+        attrReleasePolicyType.setType(AMImplementationType.ATTR_RELEASE_POLICY_CONF);
         attrReleasePolicyType.setBody(POJOHelper.serialize(attrReleasePolicyConf));
         attrReleasePolicyType = implementationDAO.save(attrReleasePolicyType);
 
diff --git a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
index b484956..a222994 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -45,22 +45,22 @@ under the License.
   <PasswordPolicyRule policy_id="55e5de0b-c79c-4e66-adda-251b6fb8579a" implementation_id="DefaultPasswordRuleConf3"/>
   
   <!-- Authentication policies -->
-  <Implementation id="MyDefaultAuthPolicyConf" type="AUTH_POLICY_CONFIGURATIONS" engine="JAVA"
+  <Implementation id="MyDefaultAuthPolicyConf" type="AUTH_POLICY_CONF" engine="JAVA"
                   body='{"@class":"org.apache.syncope.common.lib.policy.DefaultAuthPolicyConf","authModules":["LdapAuthenticationTest"]}'/>
   <AuthPolicy id="659b9906-4b6e-4bc0-aca0-6809dff346d4" name="MyDefaultAuthPolicyConf" description="an authentication policy"/>
   <AuthPolicy id="b912a0d4-a890-416f-9ab8-84ab077eb028" name="DefaultAuthPolicy" description="Default authentication policy"/>
 
   <!-- Access policies -->
-  <Implementation id="MyDefaultAccessPolicyConf" type="ACCESS_POLICY_CONFIGURATIONS" engine="JAVA"
+  <Implementation id="MyDefaultAccessPolicyConf" type="ACCESS_POLICY_CONF" engine="JAVA"
                   body='{"@class":"org.apache.syncope.common.lib.policy.DefaultAccessPolicyConf","name":"MyDefaultAccessPolicyConf","enabled":true,"ssoEnabled":true}'/>
   <AccessPolicy id="419935c7-deb3-40b3-8a9a-683037e523a2" name="MyDefaultAccessPolicyConf" description="an access policy"/>
 
   <!-- Attr Release Policies -->
-  <Implementation id="AllowedAttrReleasePolicyConf" type="ATTR_RELEASE_CONFIGURATIONS" engine="JAVA"
+  <Implementation id="AllowedAttrReleasePolicyConf" type="ATTR_RELEASE_CONF" engine="JAVA"
                   body='{"@class":"org.apache.syncope.common.lib.policy.AllowedAttrReleasePolicyConf","name":"AllowedAttrReleasePolicy","allowedAttributes":["cn","givenName","uid"]}'/>
   <AttrReleasePolicy id="319935c7-deb3-40b3-8a9a-683037e523a2" name="AllowedAttrReleasePolicy" description="allowed attribute release policy policy"/>
 
-  <Implementation id="DenyAttrReleasePolicyConf" type="ATTR_RELEASE_CONFIGURATIONS" engine="JAVA"
+  <Implementation id="DenyAttrReleasePolicyConf" type="ATTR_RELEASE_CONF" engine="JAVA"
                   body='{"@class":"org.apache.syncope.common.lib.policy.AllowedAttrReleasePolicyConf","name":"DenyAttrReleasePolicyConf"}'/>
   <AttrReleasePolicy id="219935c7-deb3-40b3-8a9a-683037e523a2" name="DenyAttrReleasePolicy" description="deny attribute release policy policy"/>
   
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AuthModuleDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AuthModuleDataBinderImpl.java
index 0b0e38b..058e58d 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AuthModuleDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AuthModuleDataBinderImpl.java
@@ -18,48 +18,108 @@
  */
 package org.apache.syncope.core.provisioning.java.data;
 
+import org.apache.syncope.common.lib.SyncopeClientCompositeException;
+import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.apache.syncope.common.lib.to.AuthModuleTO;
+import org.apache.syncope.common.lib.to.ItemTO;
+import org.apache.syncope.common.lib.types.ClientExceptionType;
+import org.apache.syncope.common.lib.types.MappingPurpose;
 import org.apache.syncope.core.persistence.api.entity.auth.AuthModule;
+import org.apache.syncope.core.persistence.api.entity.auth.AuthModuleItem;
 import org.apache.syncope.core.provisioning.api.data.AuthModuleDataBinder;
+import org.apache.syncope.core.provisioning.api.jexl.JexlUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @Component
 public class AuthModuleDataBinderImpl implements AuthModuleDataBinder {
 
+    private static final Logger LOG = LoggerFactory.getLogger(AuthModuleDataBinder.class);
+
     @Autowired
     private EntityFactory entityFactory;
 
-    private AuthModule getAuthModule(final AuthModule authModule, final AuthModuleTO authModuleTO) {
-        AuthModule result = authModule;
+    private void populateItems(final AuthModuleTO authModuleTO, final AuthModule authModule) {
+        SyncopeClientCompositeException scce = SyncopeClientException.buildComposite();
+        SyncopeClientException invalidMapping =
+                SyncopeClientException.build(ClientExceptionType.InvalidMapping);
+        SyncopeClientException requiredValuesMissing =
+                SyncopeClientException.build(ClientExceptionType.RequiredValuesMissing);
 
-        if (result == null) {
-            result = entityFactory.newEntity(AuthModule.class);
-        }
+        authModuleTO.getItems().forEach(itemTO -> {
+            if (itemTO == null) {
+                LOG.error("Null {}", ItemTO.class.getSimpleName());
+                invalidMapping.getElements().add("Null " + ItemTO.class.getSimpleName());
+            } else if (itemTO.getIntAttrName() == null) {
+                requiredValuesMissing.getElements().add("intAttrName");
+                scce.addException(requiredValuesMissing);
+            } else {
+                // no mandatory condition implies mandatory condition false
+                if (!JexlUtils.isExpressionValid(itemTO.getMandatoryCondition() == null
+                        ? "false" : itemTO.getMandatoryCondition())) {
 
-        AuthModule authenticationModule = AuthModule.class.cast(result);
-        AuthModuleTO authenticationModuleTO = AuthModuleTO.class.cast(authModuleTO);
+                    SyncopeClientException invalidMandatoryCondition =
+                            SyncopeClientException.build(ClientExceptionType.InvalidValues);
+                    invalidMandatoryCondition.getElements().add(itemTO.getMandatoryCondition());
+                    scce.addException(invalidMandatoryCondition);
+                }
 
-        authenticationModule.setName(authenticationModuleTO.getName());
-        authenticationModule.setConf(authenticationModuleTO.getConf());
-        authenticationModule.setDescription(authenticationModuleTO.getDescription());
-        // remove all profile items not contained in the TO
-        authenticationModule.getProfileItems().
-                removeIf(item -> !authenticationModuleTO.getProfileItems().stream().
-                anyMatch(otherItem -> item.getKey().equals(otherItem.getKey())));
+                AuthModuleItem item = entityFactory.newEntity(AuthModuleItem.class);
+                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.setAuthModule(authModule);
+                authModule.add(item);
+            }
+        });
 
-        return result;
+        if (!invalidMapping.getElements().isEmpty()) {
+            scce.addException(invalidMapping);
+        }
+        if (scce.hasExceptions()) {
+            throw scce;
+        }
     }
 
     @Override
     public AuthModule create(final AuthModuleTO authModuleTO) {
-        return getAuthModule(null, authModuleTO);
+        return update(entityFactory.newEntity(AuthModule.class), authModuleTO);
     }
 
     @Override
     public AuthModule update(final AuthModule authModule, final AuthModuleTO authModuleTO) {
-        return getAuthModule(authModule, authModuleTO);
+        authModule.setName(authModuleTO.getName());
+        authModule.setDescription(authModuleTO.getDescription());
+        authModule.setConf(authModuleTO.getConf());
+
+        authModule.getItems().clear();
+        populateItems(authModuleTO, authModule);
+
+        return authModule;
+    }
+
+    private static void populateItems(final AuthModule authModule, final AuthModuleTO authModuleTO) {
+        authModule.getItems().forEach(item -> {
+            ItemTO itemTO = new ItemTO();
+            itemTO.setKey(item.getKey());
+            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);
+
+            authModuleTO.add(itemTO);
+        });
     }
 
     @Override
@@ -70,9 +130,8 @@ public class AuthModuleDataBinderImpl implements AuthModuleDataBinder {
         authModuleTO.setKey(authModule.getKey());
         authModuleTO.setDescription(authModule.getDescription());
         authModuleTO.setConf(authModule.getConf());
-        authModuleTO.getProfileItems().forEach(item -> {
-            authModuleTO.add(item);
-        });
+
+        populateItems(authModule, authModuleTO);
 
         return authModuleTO;
     }
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 9df9f8c..5de0f13 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
@@ -108,7 +108,7 @@ public class ImplementationDataBinderImpl implements ImplementationDataBinder {
                     base = PasswordRule.class;
                     break;
 
-                case IdMImplementationType.ITEM_TRANSFORMER:
+                case IdRepoImplementationType.ITEM_TRANSFORMER:
                     base = ItemTransformer.class;
                     break;
 
@@ -156,15 +156,15 @@ public class ImplementationDataBinderImpl implements ImplementationDataBinder {
                     base = ProvisionSorter.class;
                     break;
 
-                case AMImplementationType.ACCESS_POLICY_CONFIGURATIONS:
+                case AMImplementationType.ACCESS_POLICY_CONF:
                     base = AccessPolicy.class;
                     break;
 
-                case AMImplementationType.AUTH_POLICY_CONFIGURATIONS:
+                case AMImplementationType.AUTH_POLICY_CONF:
                     base = AuthPolicy.class;
                     break;
 
-                case AMImplementationType.ATTR_RELEASE_POLICY_CONFIGURATIONS:
+                case AMImplementationType.ATTR_RELEASE_POLICY_CONF:
                     base = AttrReleasePolicy.class;
                     break;
                 default:
@@ -176,7 +176,7 @@ public class ImplementationDataBinderImpl implements ImplementationDataBinder {
             }
 
             switch (implementation.getType()) {
-                case AMImplementationType.ACCESS_POLICY_CONFIGURATIONS:
+                case AMImplementationType.ACCESS_POLICY_CONF:
                     AccessPolicyConf accessPolicyConf =
                             POJOHelper.deserialize(implementation.getBody(), AccessPolicyConf.class);
                     if (accessPolicyConf == null) {
@@ -184,7 +184,7 @@ public class ImplementationDataBinderImpl implements ImplementationDataBinder {
                         throw sce;
                     }
                     break;
-                case AMImplementationType.ATTR_RELEASE_POLICY_CONFIGURATIONS:
+                case AMImplementationType.ATTR_RELEASE_POLICY_CONF:
                     AttrReleasePolicyConf policyConf =
                             POJOHelper.deserialize(implementation.getBody(), AttrReleasePolicyConf.class);
                     if (policyConf == null) {
@@ -192,7 +192,7 @@ public class ImplementationDataBinderImpl implements ImplementationDataBinder {
                         throw sce;
                     }
                     break;
-                case AMImplementationType.AUTH_POLICY_CONFIGURATIONS:
+                case AMImplementationType.AUTH_POLICY_CONF:
                     AuthPolicyConf authPolicyConf =
                             POJOHelper.deserialize(implementation.getBody(), AuthPolicyConf.class);
                     if (authPolicyConf == null) {
diff --git a/ext/oidcclient/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAOIDCProviderItem.java b/ext/oidcclient/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAOIDCProviderItem.java
index f707620..f2afe3a 100644
--- a/ext/oidcclient/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAOIDCProviderItem.java
+++ b/ext/oidcclient/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAOIDCProviderItem.java
@@ -28,8 +28,8 @@ import javax.persistence.JoinTable;
 import javax.persistence.ManyToMany;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
-import org.apache.syncope.common.lib.types.IdMImplementationType;
 import javax.persistence.UniqueConstraint;
+import org.apache.syncope.common.lib.types.IdRepoImplementationType;
 import org.apache.syncope.core.persistence.api.entity.Implementation;
 import org.apache.syncope.core.persistence.api.entity.OIDCProvider;
 import org.apache.syncope.core.persistence.api.entity.OIDCProviderItem;
@@ -71,7 +71,7 @@ public class JPAOIDCProviderItem extends AbstractItem implements OIDCProviderIte
     @Override
     public boolean add(final Implementation transformer) {
         checkType(transformer, JPAImplementation.class);
-        checkImplementationType(transformer, IdMImplementationType.ITEM_TRANSFORMER);
+        checkImplementationType(transformer, IdRepoImplementationType.ITEM_TRANSFORMER);
         return transformers.contains((JPAImplementation) transformer)
                 || this.transformers.add((JPAImplementation) transformer);
     }
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 a206cf9..c978a97 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
@@ -22,7 +22,6 @@ import java.text.ParseException;
 import java.util.stream.Collectors;
 import org.apache.syncope.common.lib.SyncopeClientCompositeException;
 import org.apache.syncope.common.lib.SyncopeClientException;
-import org.apache.syncope.common.lib.to.AnyTypeClassTO;
 import org.apache.syncope.common.lib.to.ItemTO;
 import org.apache.syncope.common.lib.to.OIDCProviderTO;
 import org.apache.syncope.common.lib.to.UserTO;
@@ -71,21 +70,16 @@ public class OIDCProviderDataBinderImpl implements OIDCProviderDataBinder {
     @Override
     public OIDCProvider create(final OIDCProviderTO opTO) {
         return update(entityFactory.newEntity(OIDCProvider.class), opTO);
-
     }
 
-    private void populateItems(
-            final OIDCProviderTO opTO,
-            final OIDCProvider op,
-            final AnyTypeClassTO allowedSchemas) {
-
+    private void populateItems(final OIDCProviderTO opTO, final OIDCProvider op) {
         SyncopeClientCompositeException scce = SyncopeClientException.buildComposite();
         SyncopeClientException invalidMapping =
                 SyncopeClientException.build(ClientExceptionType.InvalidMapping);
         SyncopeClientException requiredValuesMissing =
                 SyncopeClientException.build(ClientExceptionType.RequiredValuesMissing);
 
-        for (ItemTO itemTO : opTO.getItems()) {
+        opTO.getItems().forEach(itemTO -> {
             if (itemTO == null) {
                 LOG.error("Null {}", ItemTO.class.getSimpleName());
                 invalidMapping.getElements().add("Null " + ItemTO.class.getSimpleName());
@@ -104,69 +98,43 @@ public class OIDCProviderDataBinderImpl implements OIDCProviderDataBinder {
                     LOG.error("'{}' not existing", itemTO.getIntAttrName());
                     invalidMapping.getElements().add('\'' + itemTO.getIntAttrName() + "' not existing");
                 } else {
-                    boolean allowed = true;
-                    if (intAttrName.getSchemaType() != null
-                            && intAttrName.getEnclosingGroup() == null
-                            && intAttrName.getRelatedAnyObject() == null) {
-                        switch (intAttrName.getSchemaType()) {
-                            case PLAIN:
-                                allowed = allowedSchemas.getPlainSchemas().contains(intAttrName.getSchema().getKey());
-                                break;
-
-                            case DERIVED:
-                                allowed = allowedSchemas.getDerSchemas().contains(intAttrName.getSchema().getKey());
-                                break;
-
-                            case VIRTUAL:
-                                allowed = allowedSchemas.getVirSchemas().contains(intAttrName.getSchema().getKey());
-                                break;
-
-                            default:
-                        }
+                    // no mandatory condition implies mandatory condition false
+                    if (!JexlUtils.isExpressionValid(itemTO.getMandatoryCondition() == null
+                            ? "false" : itemTO.getMandatoryCondition())) {
+
+                        SyncopeClientException invalidMandatoryCondition = SyncopeClientException.build(
+                                ClientExceptionType.InvalidValues);
+                        invalidMandatoryCondition.getElements().add(itemTO.getMandatoryCondition());
+                        scce.addException(invalidMandatoryCondition);
                     }
 
-                    if (allowed) {
-                        // no mandatory condition implies mandatory condition false
-                        if (!JexlUtils.isExpressionValid(itemTO.getMandatoryCondition() == null
-                                ? "false" : itemTO.getMandatoryCondition())) {
-
-                            SyncopeClientException invalidMandatoryCondition = SyncopeClientException.build(
-                                    ClientExceptionType.InvalidValues);
-                            invalidMandatoryCondition.getElements().add(itemTO.getMandatoryCondition());
-                            scce.addException(invalidMandatoryCondition);
+                    OIDCProviderItem item = entityFactory.newEntity(OIDCProviderItem.class);
+                    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()) {
+                        if (intAttrName.getSchemaType() == SchemaType.VIRTUAL) {
+                            invalidMapping.getElements().
+                                    add("Virtual attributes cannot be set as ConnObjectKey");
                         }
-
-                        OIDCProviderItem item = entityFactory.newEntity(OIDCProviderItem.class);
-                        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()) {
-                            if (intAttrName.getSchemaType() == SchemaType.VIRTUAL) {
-                                invalidMapping.getElements().
-                                        add("Virtual attributes cannot be set as ConnObjectKey");
-                            }
-                            if ("password".equals(intAttrName.getField())) {
-                                invalidMapping.getElements().add(
-                                        "Password attributes cannot be set as ConnObjectKey");
-                            }
-
-                            op.setConnObjectKeyItem(item);
-                        } else {
-                            op.add(item);
+                        if ("password".equals(intAttrName.getField())) {
+                            invalidMapping.getElements().add(
+                                    "Password attributes cannot be set as ConnObjectKey");
                         }
+
+                        op.setConnObjectKeyItem(item);
                     } else {
-                        LOG.error("'{}' not allowed", itemTO.getIntAttrName());
-                        invalidMapping.getElements().add('\'' + itemTO.getIntAttrName() + "' not allowed");
+                        op.add(item);
                     }
                 }
             }
-        }
+        });
 
         if (!invalidMapping.getElements().isEmpty()) {
             scce.addException(invalidMapping);
@@ -206,16 +174,7 @@ public class OIDCProviderDataBinderImpl implements OIDCProviderDataBinder {
         }
 
         op.getItems().clear();
-        AnyTypeClassTO allowedSchemas = new AnyTypeClassTO();
-        anyTypeDAO.findUser().getClasses().forEach(anyTypeClass -> {
-            allowedSchemas.getPlainSchemas().addAll(anyTypeClass.getPlainSchemas().stream().
-                    map(Entity::getKey).collect(Collectors.toList()));
-            allowedSchemas.getDerSchemas().addAll(anyTypeClass.getDerSchemas().stream().
-                    map(Entity::getKey).collect(Collectors.toList()));
-            allowedSchemas.getVirSchemas().addAll(anyTypeClass.getVirSchemas().stream().
-                    map(Entity::getKey).collect(Collectors.toList()));
-        });
-        populateItems(opTO, op, allowedSchemas);
+        populateItems(opTO, op);
 
         opTO.getActions().forEach(action -> {
             Implementation implementation = implementationDAO.find(action);
diff --git a/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPASAML2IdPDAO.java b/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPASAML2IdPDAO.java
index ccf67b6..0a2fbef 100644
--- a/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPASAML2IdPDAO.java
+++ b/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPASAML2IdPDAO.java
@@ -73,5 +73,4 @@ public class JPASAML2IdPDAO extends AbstractDAO<SAML2IdP> implements SAML2IdPDAO
             entityManager().remove(idp);
         }
     }
-
 }
diff --git a/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPASAML2IdPItem.java b/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPASAML2IdPItem.java
index 0028789..cb029e6 100644
--- a/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPASAML2IdPItem.java
+++ b/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPASAML2IdPItem.java
@@ -28,8 +28,8 @@ import javax.persistence.JoinTable;
 import javax.persistence.ManyToMany;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
-import org.apache.syncope.common.lib.types.IdMImplementationType;
 import javax.persistence.UniqueConstraint;
+import org.apache.syncope.common.lib.types.IdRepoImplementationType;
 import org.apache.syncope.core.persistence.api.entity.Implementation;
 import org.apache.syncope.core.persistence.api.entity.SAML2IdP;
 import org.apache.syncope.core.persistence.api.entity.SAML2IdPItem;
@@ -71,7 +71,7 @@ public class JPASAML2IdPItem extends AbstractItem implements SAML2IdPItem {
     @Override
     public boolean add(final Implementation transformer) {
         checkType(transformer, JPAImplementation.class);
-        checkImplementationType(transformer, IdMImplementationType.ITEM_TRANSFORMER);
+        checkImplementationType(transformer, IdRepoImplementationType.ITEM_TRANSFORMER);
         return transformers.contains((JPAImplementation) transformer)
                 || this.transformers.add((JPAImplementation) transformer);
     }
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 992a8ce..93bb396 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
@@ -23,7 +23,6 @@ import java.util.Base64;
 import java.util.stream.Collectors;
 import org.apache.syncope.common.lib.SyncopeClientCompositeException;
 import org.apache.syncope.common.lib.SyncopeClientException;
-import org.apache.syncope.common.lib.to.AnyTypeClassTO;
 import org.apache.syncope.common.lib.to.ItemTO;
 import org.apache.syncope.common.lib.to.SAML2IdPTO;
 import org.apache.syncope.common.lib.to.UserTO;
@@ -74,18 +73,14 @@ public class SAML2IdPDataBinderImpl implements SAML2IdPDataBinder {
         return update(entityFactory.newEntity(SAML2IdP.class), idpTO);
     }
 
-    private void populateItems(
-            final SAML2IdPTO idpTO,
-            final SAML2IdP idp,
-            final AnyTypeClassTO allowedSchemas) {
-
+    private void populateItems(final SAML2IdPTO idpTO, final SAML2IdP idp) {
         SyncopeClientCompositeException scce = SyncopeClientException.buildComposite();
         SyncopeClientException invalidMapping =
                 SyncopeClientException.build(ClientExceptionType.InvalidMapping);
         SyncopeClientException requiredValuesMissing =
                 SyncopeClientException.build(ClientExceptionType.RequiredValuesMissing);
 
-        for (ItemTO itemTO : idpTO.getItems()) {
+        idpTO.getItems().forEach(itemTO -> {
             if (itemTO == null) {
                 LOG.error("Null {}", ItemTO.class.getSimpleName());
                 invalidMapping.getElements().add("Null " + ItemTO.class.getSimpleName());
@@ -104,69 +99,43 @@ public class SAML2IdPDataBinderImpl implements SAML2IdPDataBinder {
                     LOG.error("'{}' not existing", itemTO.getIntAttrName());
                     invalidMapping.getElements().add('\'' + itemTO.getIntAttrName() + "' not existing");
                 } else {
-                    boolean allowed = true;
-                    if (intAttrName.getSchemaType() != null
-                            && intAttrName.getEnclosingGroup() == null
-                            && intAttrName.getRelatedAnyObject() == null) {
-                        switch (intAttrName.getSchemaType()) {
-                            case PLAIN:
-                                allowed = allowedSchemas.getPlainSchemas().contains(intAttrName.getSchema().getKey());
-                                break;
-
-                            case DERIVED:
-                                allowed = allowedSchemas.getDerSchemas().contains(intAttrName.getSchema().getKey());
-                                break;
-
-                            case VIRTUAL:
-                                allowed = allowedSchemas.getVirSchemas().contains(intAttrName.getSchema().getKey());
-                                break;
-
-                            default:
-                        }
+                    // no mandatory condition implies mandatory condition false
+                    if (!JexlUtils.isExpressionValid(itemTO.getMandatoryCondition() == null
+                            ? "false" : itemTO.getMandatoryCondition())) {
+
+                        SyncopeClientException invalidMandatoryCondition = SyncopeClientException.build(
+                                ClientExceptionType.InvalidValues);
+                        invalidMandatoryCondition.getElements().add(itemTO.getMandatoryCondition());
+                        scce.addException(invalidMandatoryCondition);
                     }
 
-                    if (allowed) {
-                        // no mandatory condition implies mandatory condition false
-                        if (!JexlUtils.isExpressionValid(itemTO.getMandatoryCondition() == null
-                                ? "false" : itemTO.getMandatoryCondition())) {
-
-                            SyncopeClientException invalidMandatoryCondition = SyncopeClientException.build(
-                                    ClientExceptionType.InvalidValues);
-                            invalidMandatoryCondition.getElements().add(itemTO.getMandatoryCondition());
-                            scce.addException(invalidMandatoryCondition);
+                    SAML2IdPItem item = entityFactory.newEntity(SAML2IdPItem.class);
+                    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()) {
+                        if (intAttrName.getSchemaType() == SchemaType.VIRTUAL) {
+                            invalidMapping.getElements().
+                                    add("Virtual attributes cannot be set as ConnObjectKey");
                         }
-
-                        SAML2IdPItem item = entityFactory.newEntity(SAML2IdPItem.class);
-                        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()) {
-                            if (intAttrName.getSchemaType() == SchemaType.VIRTUAL) {
-                                invalidMapping.getElements().
-                                        add("Virtual attributes cannot be set as ConnObjectKey");
-                            }
-                            if ("password".equals(intAttrName.getField())) {
-                                invalidMapping.getElements().add(
-                                        "Password attributes cannot be set as ConnObjectKey");
-                            }
-
-                            idp.setConnObjectKeyItem(item);
-                        } else {
-                            idp.add(item);
+                        if ("password".equals(intAttrName.getField())) {
+                            invalidMapping.getElements().add(
+                                    "Password attributes cannot be set as ConnObjectKey");
                         }
+
+                        idp.setConnObjectKeyItem(item);
                     } else {
-                        LOG.error("'{}' not allowed", itemTO.getIntAttrName());
-                        invalidMapping.getElements().add('\'' + itemTO.getIntAttrName() + "' not allowed");
+                        idp.add(item);
                     }
                 }
             }
-        }
+        });
 
         if (!invalidMapping.getElements().isEmpty()) {
             scce.addException(invalidMapping);
@@ -202,16 +171,7 @@ public class SAML2IdPDataBinderImpl implements SAML2IdPDataBinder {
         }
 
         idp.getItems().clear();
-        AnyTypeClassTO allowedSchemas = new AnyTypeClassTO();
-        anyTypeDAO.findUser().getClasses().forEach(anyTypeClass -> {
-            allowedSchemas.getPlainSchemas().addAll(anyTypeClass.getPlainSchemas().stream().
-                    map(Entity::getKey).collect(Collectors.toList()));
-            allowedSchemas.getDerSchemas().addAll(anyTypeClass.getDerSchemas().stream().
-                    map(Entity::getKey).collect(Collectors.toList()));
-            allowedSchemas.getVirSchemas().addAll(anyTypeClass.getVirSchemas().stream().
-                    map(Entity::getKey).collect(Collectors.toList()));
-        });
-        populateItems(idpTO, idp, allowedSchemas);
+        populateItems(idpTO, idp);
 
         idpTO.getActions().forEach(action -> {
             Implementation implementation = implementationDAO.find(action);
diff --git a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/ITImplementationLookup.java b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/ITImplementationLookup.java
index 40834af..dcebb97 100644
--- a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/ITImplementationLookup.java
+++ b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/ITImplementationLookup.java
@@ -184,7 +184,7 @@ public class ITImplementationLookup implements ImplementationLookup {
             classNames = new HashSet<>();
             classNames.add(DateToDateItemTransformer.class.getName());
             classNames.add(DateToLongItemTransformer.class.getName());
-            put(IdMImplementationType.ITEM_TRANSFORMER, classNames);
+            put(IdRepoImplementationType.ITEM_TRANSFORMER, classNames);
 
             classNames = new HashSet<>();
             classNames.add(TestSampleJobDelegate.class.getName());
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuthModuleITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuthModuleITCase.java
index a13c4fa..ab51c1f 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuthModuleITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuthModuleITCase.java
@@ -45,6 +45,7 @@ import org.apache.syncope.common.lib.auth.StaticAuthModuleConf;
 import org.apache.syncope.common.lib.auth.SyncopeAuthModuleConf;
 import org.apache.syncope.common.lib.auth.U2FAuthModuleConf;
 import org.apache.syncope.common.lib.to.AuthModuleTO;
+import org.apache.syncope.common.lib.to.ItemTO;
 
 public class AuthModuleITCase extends AbstractITCase {
 
@@ -66,8 +67,8 @@ public class AuthModuleITCase extends AbstractITCase {
         AuthModuleTO authModuleTO = new AuthModuleTO();
         authModuleTO.setName("Test" + type + "AuthenticationModule" + getUUIDString());
         authModuleTO.setDescription("A test " + type + " Authentication Module");
-        AuthModuleConf conf;
 
+        AuthModuleConf conf;
         switch (type) {
             case LDAP:
                 conf = new LDAPAuthModuleConf();
@@ -161,19 +162,21 @@ public class AuthModuleITCase extends AbstractITCase {
         }
         authModuleTO.setConf(conf);
 
-        return authModuleTO;
-    }
+        ItemTO keyMapping = new ItemTO();
+        keyMapping.setIntAttrName("uid");
+        keyMapping.setExtAttrName("username");
+        authModuleTO.add(keyMapping);
 
-    @Test
-    public void findAll() {
-        List<AuthModuleTO> authModuleTOs = authModuleService.list();
-        assertNotNull(authModuleTOs);
-        assertFalse(authModuleTOs.isEmpty());
-        assertTrue(authModuleTOs.size() >= 10);
+        ItemTO fullnameMapping = new ItemTO();
+        fullnameMapping.setIntAttrName("cn");
+        fullnameMapping.setExtAttrName("fullname");
+        authModuleTO.add(fullnameMapping);
+
+        return authModuleTO;
     }
 
     @Test
-    public void listByType() {
+    public void list() {
         List<AuthModuleTO> authModuleTOs = authModuleService.list();
         assertNotNull(authModuleTOs);
         assertFalse(authModuleTOs.isEmpty());
@@ -564,17 +567,17 @@ public class AuthModuleITCase extends AbstractITCase {
     private void testCreate(final AuthModuleSupportedType type) {
         AuthModuleTO authModuleTO = createAuthModule(buildAuthModuleTO(type));
         assertNotNull(authModuleTO);
-        assertTrue(authModuleTO.getName().contains(
-                "Test" + type + "AuthenticationModule"));
-        assertTrue(authModuleTO.getDescription().contains(
-                "A test " + type + " Authentication Module"));
+        assertTrue(authModuleTO.getName().contains("Test" + type + "AuthenticationModule"));
+        assertTrue(authModuleTO.getDescription().contains("A test " + type + " Authentication Module"));
+        assertEquals(2, authModuleTO.getItems().size());
     }
 
     private void testDelete(final AuthModuleSupportedType type) {
-        AuthModuleTO authModuleTO = buildAuthModuleTO(type);
-        AuthModuleTO read = createAuthModule(authModuleTO);
+        AuthModuleTO read = createAuthModule(buildAuthModuleTO(type));
         assertNotNull(read);
+
         authModuleService.delete(read.getKey());
+
         try {
             authModuleService.read(read.getKey());
             fail("This should not happen");
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PolicyITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PolicyITCase.java
index 4b65c75..817e121 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PolicyITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PolicyITCase.java
@@ -66,14 +66,13 @@ public class PolicyITCase extends AbstractITCase {
         String authPolicyName = "TestAuthPolicy" + getUUIDString();
         ImplementationTO implementationTO = null;
         try {
-            implementationTO = implementationService.read(
-                    AMImplementationType.AUTH_POLICY_CONFIGURATIONS, authPolicyName);
+            implementationTO = implementationService.read(AMImplementationType.AUTH_POLICY_CONF, authPolicyName);
         } catch (SyncopeClientException e) {
             if (e.getType().getResponseStatus() == Response.Status.NOT_FOUND) {
                 implementationTO = new ImplementationTO();
                 implementationTO.setKey(authPolicyName);
                 implementationTO.setEngine(ImplementationEngine.JAVA);
-                implementationTO.setType(AMImplementationType.AUTH_POLICY_CONFIGURATIONS);
+                implementationTO.setType(AMImplementationType.AUTH_POLICY_CONF);
 
                 DefaultAuthPolicyConf conf = new DefaultAuthPolicyConf();
                 conf.getAuthModules().addAll(List.of("LdapAuthentication1"));
@@ -97,14 +96,13 @@ public class PolicyITCase extends AbstractITCase {
     private static AttrReleasePolicyTO buildAttributeReleasePolicyTO(final String policyName) {
         ImplementationTO implementationTO = null;
         try {
-            implementationTO = implementationService.read(
-                    AMImplementationType.ATTR_RELEASE_POLICY_CONFIGURATIONS, policyName);
+            implementationTO = implementationService.read(AMImplementationType.ATTR_RELEASE_POLICY_CONF, policyName);
         } catch (SyncopeClientException e) {
             if (e.getType().getResponseStatus() == Response.Status.NOT_FOUND) {
                 implementationTO = new ImplementationTO();
                 implementationTO.setKey(policyName);
                 implementationTO.setEngine(ImplementationEngine.JAVA);
-                implementationTO.setType(AMImplementationType.ATTR_RELEASE_POLICY_CONFIGURATIONS);
+                implementationTO.setType(AMImplementationType.ATTR_RELEASE_POLICY_CONF);
 
                 AllowedAttrReleasePolicyConf conf = new AllowedAttrReleasePolicyConf();
                 conf.setName("MyDefaultAttrReleasePolicyConf");
@@ -131,14 +129,13 @@ public class PolicyITCase extends AbstractITCase {
 
         ImplementationTO implementationTO = null;
         try {
-            implementationTO = implementationService.read(
-                    AMImplementationType.ACCESS_POLICY_CONFIGURATIONS, accessPolicyName);
+            implementationTO = implementationService.read(AMImplementationType.ACCESS_POLICY_CONF, accessPolicyName);
         } catch (SyncopeClientException e) {
             if (e.getType().getResponseStatus() == Response.Status.NOT_FOUND) {
                 implementationTO = new ImplementationTO();
                 implementationTO.setKey(accessPolicyName);
                 implementationTO.setEngine(ImplementationEngine.JAVA);
-                implementationTO.setType(AMImplementationType.ACCESS_POLICY_CONFIGURATIONS);
+                implementationTO.setType(AMImplementationType.ACCESS_POLICY_CONF);
 
                 DefaultAccessPolicyConf conf = new DefaultAccessPolicyConf();
                 conf.setEnabled(true);
@@ -332,8 +329,7 @@ public class PolicyITCase extends AbstractITCase {
         assertNotNull(newAuthPolicyTO);
         newAuthPolicyTO = createPolicy(PolicyType.AUTH, newAuthPolicyTO);
 
-        ImplementationTO authPolicyImplementationTO = implementationService.read(
-                AMImplementationType.AUTH_POLICY_CONFIGURATIONS, "MyDefaultAuthPolicyConf");
+        ImplementationTO authPolicyImplementationTO = implementationService.read(AMImplementationType.AUTH_POLICY_CONF, "MyDefaultAuthPolicyConf");
         assertNotNull(authPolicyImplementationTO);
         assertFalse(StringUtils.isBlank(authPolicyImplementationTO.getBody()));
 
@@ -365,8 +361,7 @@ public class PolicyITCase extends AbstractITCase {
         newAccessPolicyTO = createPolicy(PolicyType.ACCESS, newAccessPolicyTO);
         assertNotNull(newAccessPolicyTO);
 
-        ImplementationTO accessPolicyImplementationTO = implementationService.read(
-                AMImplementationType.ACCESS_POLICY_CONFIGURATIONS, "MyDefaultAccessPolicyConf");
+        ImplementationTO accessPolicyImplementationTO = implementationService.read(AMImplementationType.ACCESS_POLICY_CONF, "MyDefaultAccessPolicyConf");
         assertNotNull(accessPolicyImplementationTO);
         assertFalse(StringUtils.isBlank(accessPolicyImplementationTO.getBody()));
 
@@ -400,8 +395,7 @@ public class PolicyITCase extends AbstractITCase {
         newPolicyTO = createPolicy(PolicyType.ATTR_RELEASE, newPolicyTO);
         assertNotNull(newPolicyTO);
 
-        ImplementationTO implementationTO = implementationService.read(
-                AMImplementationType.ATTR_RELEASE_POLICY_CONFIGURATIONS, policyName);
+        ImplementationTO implementationTO = implementationService.read(AMImplementationType.ATTR_RELEASE_POLICY_CONF, policyName);
         assertNotNull(implementationTO);
         assertFalse(StringUtils.isBlank(implementationTO.getBody()));
 
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PropagationTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PropagationTaskITCase.java
index 95475fd..0a109ac 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PropagationTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PropagationTaskITCase.java
@@ -62,9 +62,9 @@ import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.IdMImplementationType;
 import org.apache.syncope.common.lib.types.ImplementationEngine;
 import org.apache.syncope.common.lib.types.AttrSchemaType;
+import org.apache.syncope.common.lib.types.IdRepoImplementationType;
 import org.apache.syncope.common.lib.types.MappingPurpose;
 import org.apache.syncope.common.lib.types.PatchOperation;
 import org.apache.syncope.common.lib.types.ResourceDeassociationAction;
@@ -91,15 +91,15 @@ public class PropagationTaskITCase extends AbstractTaskITCase {
         ImplementationTO dateToDate = null;
         try {
             dateToLong = implementationService.read(
-                    IdMImplementationType.ITEM_TRANSFORMER, DateToLongItemTransformer.class.getSimpleName());
+                    IdRepoImplementationType.ITEM_TRANSFORMER, DateToLongItemTransformer.class.getSimpleName());
             dateToDate = implementationService.read(
-                    IdMImplementationType.ITEM_TRANSFORMER, DateToDateItemTransformer.class.getSimpleName());
+                    IdRepoImplementationType.ITEM_TRANSFORMER, DateToDateItemTransformer.class.getSimpleName());
         } catch (SyncopeClientException e) {
             if (e.getType().getResponseStatus() == Response.Status.NOT_FOUND) {
                 dateToLong = new ImplementationTO();
                 dateToLong.setKey(DateToLongItemTransformer.class.getSimpleName());
                 dateToLong.setEngine(ImplementationEngine.JAVA);
-                dateToLong.setType(IdMImplementationType.ITEM_TRANSFORMER);
+                dateToLong.setType(IdRepoImplementationType.ITEM_TRANSFORMER);
                 dateToLong.setBody(DateToLongItemTransformer.class.getName());
                 Response response = implementationService.create(dateToLong);
                 dateToLong = implementationService.read(
@@ -109,7 +109,7 @@ public class PropagationTaskITCase extends AbstractTaskITCase {
                 dateToDate = new ImplementationTO();
                 dateToDate.setKey(DateToDateItemTransformer.class.getSimpleName());
                 dateToDate.setEngine(ImplementationEngine.JAVA);
-                dateToDate.setType(IdMImplementationType.ITEM_TRANSFORMER);
+                dateToDate.setType(IdRepoImplementationType.ITEM_TRANSFORMER);
                 dateToDate.setBody(DateToDateItemTransformer.class.getName());
                 response = implementationService.create(dateToDate);
                 dateToDate = implementationService.read(
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 5be88ed..d1146f4 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
@@ -83,6 +83,7 @@ import org.apache.syncope.common.lib.types.ImplementationEngine;
 import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.syncope.common.lib.types.ExecStatus;
 import org.apache.syncope.common.lib.types.IdMImplementationType;
+import org.apache.syncope.common.lib.types.IdRepoImplementationType;
 import org.apache.syncope.common.lib.types.ResourceDeassociationAction;
 import org.apache.syncope.common.lib.types.PullMode;
 import org.apache.syncope.common.lib.types.ResourceOperation;
@@ -497,13 +498,13 @@ public class PullTaskITCase extends AbstractTaskITCase {
         ImplementationTO transformer = null;
         try {
             transformer = implementationService.read(
-                    IdMImplementationType.ITEM_TRANSFORMER, "PrefixItemTransformer");
+                    IdRepoImplementationType.ITEM_TRANSFORMER, "PrefixItemTransformer");
         } catch (SyncopeClientException e) {
             if (e.getType().getResponseStatus() == Response.Status.NOT_FOUND) {
                 transformer = new ImplementationTO();
                 transformer.setKey("PrefixItemTransformer");
                 transformer.setEngine(ImplementationEngine.GROOVY);
-                transformer.setType(IdMImplementationType.ITEM_TRANSFORMER);
+                transformer.setType(IdRepoImplementationType.ITEM_TRANSFORMER);
                 transformer.setBody(IOUtils.toString(
                         getClass().getResourceAsStream("/PrefixItemTransformer.groovy"), StandardCharsets.UTF_8));
                 Response response = implementationService.create(transformer);
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/RealmITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/RealmITCase.java
index 8a0d9b2..884eaee 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/RealmITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/RealmITCase.java
@@ -220,7 +220,7 @@ public class RealmITCase extends AbstractITCase {
         ImplementationTO rule = new ImplementationTO();
         rule.setKey("TestAuthPolicy" + getUUIDString());
         rule.setEngine(ImplementationEngine.JAVA);
-        rule.setType(AMImplementationType.AUTH_POLICY_CONFIGURATIONS);
+        rule.setType(AMImplementationType.AUTH_POLICY_CONF);
         rule.setBody(POJOHelper.serialize(ruleConf));
         Response response = implementationService.create(rule);
         rule.setKey(response.getHeaderString(RESTHeaders.RESOURCE_KEY));
@@ -271,7 +271,7 @@ public class RealmITCase extends AbstractITCase {
         ImplementationTO rule = new ImplementationTO();
         rule.setKey("TestAccessPolicy" + getUUIDString());
         rule.setEngine(ImplementationEngine.JAVA);
-        rule.setType(AMImplementationType.ACCESS_POLICY_CONFIGURATIONS);
+        rule.setType(AMImplementationType.ACCESS_POLICY_CONF);
         rule.setBody(POJOHelper.serialize(ruleConf));
         Response response = implementationService.create(rule);
         rule.setKey(response.getHeaderString(RESTHeaders.RESOURCE_KEY));
@@ -321,7 +321,7 @@ public class RealmITCase extends AbstractITCase {
         ImplementationTO rule = new ImplementationTO();
         rule.setKey("TestAttrReleasePolicy" + getUUIDString());
         rule.setEngine(ImplementationEngine.JAVA);
-        rule.setType(AMImplementationType.ATTR_RELEASE_POLICY_CONFIGURATIONS);
+        rule.setType(AMImplementationType.ATTR_RELEASE_POLICY_CONF);
         rule.setBody(POJOHelper.serialize(ruleConf));
         Response response = implementationService.create(rule);
         rule.setKey(response.getHeaderString(RESTHeaders.RESOURCE_KEY));
diff --git a/ide/netbeans/src/main/java/org/apache/syncope/ide/netbeans/view/ResourceExplorerTopComponent.java b/ide/netbeans/src/main/java/org/apache/syncope/ide/netbeans/view/ResourceExplorerTopComponent.java
index 9e4096d..dc9c7cf 100644
--- a/ide/netbeans/src/main/java/org/apache/syncope/ide/netbeans/view/ResourceExplorerTopComponent.java
+++ b/ide/netbeans/src/main/java/org/apache/syncope/ide/netbeans/view/ResourceExplorerTopComponent.java
@@ -402,7 +402,7 @@ public final class ResourceExplorerTopComponent extends TopComponent {
                                 templateClassName = "MyPasswordRule";
                                 break;
 
-                            case IdMImplementationType.ITEM_TRANSFORMER:
+                            case IdRepoImplementationType.ITEM_TRANSFORMER:
                                 templateClassName = "MyItemTransformer";
                                 break;