http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/user/UVirAttr.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/user/UVirAttr.java
 
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/user/UVirAttr.java
deleted file mode 100644
index bb3ab70..0000000
--- 
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/user/UVirAttr.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.persistence.api.entity.user;
-
-import org.apache.syncope.core.persistence.api.entity.VirAttr;
-
-public interface UVirAttr extends VirAttr<User> {
-
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/user/User.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/user/User.java
 
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/user/User.java
index 884e849..0a51c48 100644
--- 
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/user/User.java
+++ 
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/user/User.java
@@ -26,7 +26,7 @@ import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.RelationshipType;
 import org.apache.syncope.core.persistence.api.entity.Role;
 
-public interface User extends Any<UPlainAttr, UDerAttr, UVirAttr> {
+public interface User extends Any<UPlainAttr, UDerAttr> {
 
     String getUsername();
 
@@ -116,18 +116,6 @@ public interface User extends Any<UPlainAttr, UDerAttr, 
UVirAttr> {
     @Override
     List<? extends UDerAttr> getDerAttrs();
 
-    @Override
-    boolean add(UVirAttr attr);
-
-    @Override
-    boolean remove(UVirAttr virAttr);
-
-    @Override
-    UVirAttr getVirAttr(String virSchemaName);
-
-    @Override
-    List<? extends UVirAttr> getVirAttrs();
-
     boolean add(Role role);
 
     boolean remove(Role role);

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/ContentLoaderHandler.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/ContentLoaderHandler.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/ContentLoaderHandler.java
index edd430e..125b447 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/ContentLoaderHandler.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/ContentLoaderHandler.java
@@ -27,7 +27,7 @@ import java.util.Map;
 import javax.sql.DataSource;
 import org.apache.commons.codec.DecoderException;
 import org.apache.commons.codec.binary.Hex;
-import org.apache.syncope.core.misc.DataFormat;
+import org.apache.syncope.core.misc.FormatUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.dao.DataAccessException;
@@ -125,7 +125,7 @@ class ContentLoaderHandler extends DefaultHandler {
                 case Types.TIME:
                 case Types.TIMESTAMP:
                     try {
-                        parameters[i] = 
DataFormat.parseDate(attrs.getValue(i));
+                        parameters[i] = 
FormatUtils.parseDate(attrs.getValue(i));
                     } catch (ParseException e) {
                         LOG.error("Unparsable Date '{}'", attrs.getValue(i));
                         parameters[i] = attrs.getValue(i);

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/XMLContentExporter.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/XMLContentExporter.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/XMLContentExporter.java
index 17f4bce..9512849 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/XMLContentExporter.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/XMLContentExporter.java
@@ -50,7 +50,7 @@ import javax.xml.transform.stream.StreamResult;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.core.misc.DataFormat;
+import org.apache.syncope.core.misc.FormatUtils;
 import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.content.ContentExporter;
 import org.apache.syncope.core.persistence.jpa.entity.JPAReportExec;
@@ -60,7 +60,6 @@ import 
org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAPlainAttr;
 import 
org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAPlainAttrUniqueValue;
 import 
org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAPlainAttrValue;
 import 
org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAARelationship;
-import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAVirAttr;
 import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAnyObject;
 import org.apache.syncope.core.persistence.jpa.entity.task.JPATaskExec;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUDerAttr;
@@ -69,7 +68,6 @@ import 
org.apache.syncope.core.persistence.jpa.entity.user.JPAUPlainAttr;
 import 
org.apache.syncope.core.persistence.jpa.entity.user.JPAUPlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUPlainAttrValue;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAURelationship;
-import org.apache.syncope.core.persistence.jpa.entity.user.JPAUVirAttr;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUser;
 import org.springframework.jdbc.datasource.DataSourceUtils;
 import org.springframework.security.crypto.codec.Hex;
@@ -87,9 +85,9 @@ public class XMLContentExporter extends AbstractContentDealer 
implements Content
             new HashSet<>(Arrays.asList(new String[] {
                 "QRTZ_", "LOGGING", JPAReportExec.TABLE, JPATaskExec.TABLE,
                 JPAUser.TABLE, JPAUPlainAttr.TABLE, JPAUPlainAttrValue.TABLE, 
JPAUPlainAttrUniqueValue.TABLE,
-                JPAUDerAttr.TABLE, JPAUVirAttr.TABLE,
+                JPAUDerAttr.TABLE,
                 JPAAnyObject.TABLE, JPAAPlainAttr.TABLE, 
JPAAPlainAttrValue.TABLE, JPAAPlainAttrUniqueValue.TABLE,
-                JPAADerAttr.TABLE, JPAAVirAttr.TABLE,
+                JPAADerAttr.TABLE,
                 JPAARelationship.TABLE, JPAAMembership.TABLE, 
JPAURelationship.TABLE, JPAUMembership.TABLE
             }));
 
@@ -206,7 +204,7 @@ public class XMLContentExporter extends 
AbstractContentDealer implements Content
                 case Types.TIMESTAMP:
                     final Timestamp timestamp = rs.getTimestamp(columnName);
                     if (timestamp != null) {
-                        res = DataFormat.format(new Date(timestamp.getTime()));
+                        res = FormatUtils.format(new 
Date(timestamp.getTime()));
                     }
                     break;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
index 95f5b4e..960251f 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
@@ -47,14 +47,13 @@ import 
org.apache.syncope.core.persistence.api.entity.AnyUtils;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
 import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
-import org.apache.syncope.core.persistence.api.entity.VirAttr;
 import 
org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.persistence.jpa.entity.AbstractPlainAttrValue;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-public abstract class AbstractAnyDAO<A extends Any<?, ?, ?>> extends 
AbstractDAO<A, Long> implements AnyDAO<A> {
+public abstract class AbstractAnyDAO<A extends Any<?, ?>> extends 
AbstractDAO<A, Long> implements AnyDAO<A> {
 
     @Autowired
     protected PlainSchemaDAO plainSchemaDAO;
@@ -415,13 +414,7 @@ public abstract class AbstractAnyDAO<A extends Any<?, ?, 
?>> extends AbstractDAO
 
     @Override
     public A save(final A any) {
-        A merged = entityManager().merge(any);
-        for (VirAttr<?> virAttr : merged.getVirAttrs()) {
-            virAttr.getValues().clear();
-            
virAttr.getValues().addAll(any.getVirAttr(virAttr.getSchema().getKey()).getValues());
-        }
-
-        return merged;
+        return entityManager().merge(any);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
index 2b422eb..2acd683 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
@@ -67,7 +67,7 @@ import org.springframework.stereotype.Repository;
 import org.springframework.util.ReflectionUtils;
 
 @Repository
-public class JPAAnySearchDAO extends AbstractDAO<Any<?, ?, ?>, Long> 
implements AnySearchDAO {
+public class JPAAnySearchDAO extends AbstractDAO<Any<?, ?>, Long> implements 
AnySearchDAO {
 
     private static final String EMPTY_ATTR_QUERY = "SELECT any_id FROM 
user_search_attr WHERE 1=2";
 
@@ -150,14 +150,14 @@ public class JPAAnySearchDAO extends AbstractDAO<Any<?, 
?, ?>, Long> implements
     }
 
     @Override
-    public <T extends Any<?, ?, ?>> List<T> search(
+    public <T extends Any<?, ?>> List<T> search(
             final Set<String> adminRealms, final SearchCond searchCondition, 
final AnyTypeKind typeKind) {
 
         return search(adminRealms, searchCondition, 
Collections.<OrderByClause>emptyList(), typeKind);
     }
 
     @Override
-    public <T extends Any<?, ?, ?>> List<T> search(
+    public <T extends Any<?, ?>> List<T> search(
             final Set<String> adminRealms, final SearchCond searchCondition, 
final List<OrderByClause> orderBy,
             final AnyTypeKind typeKind) {
 
@@ -165,7 +165,7 @@ public class JPAAnySearchDAO extends AbstractDAO<Any<?, ?, 
?>, Long> implements
     }
 
     @Override
-    public <T extends Any<?, ?, ?>> List<T> search(
+    public <T extends Any<?, ?>> List<T> search(
             final Set<String> adminRealms, final SearchCond searchCondition, 
final int page, final int itemsPerPage,
             final List<OrderByClause> orderBy, final AnyTypeKind typeKind) {
 
@@ -189,7 +189,7 @@ public class JPAAnySearchDAO extends AbstractDAO<Any<?, ?, 
?>, Long> implements
     }
 
     @Override
-    public <T extends Any<?, ?, ?>> boolean matches(
+    public <T extends Any<?, ?>> boolean matches(
             final T any, final SearchCond searchCondition, final AnyTypeKind 
typeKind) {
 
         List<Object> parameters = Collections.synchronizedList(new 
ArrayList<>());
@@ -347,7 +347,7 @@ public class JPAAnySearchDAO extends AbstractDAO<Any<?, ?, 
?>, Long> implements
     }
 
     @SuppressWarnings("unchecked")
-    private <T extends Any<?, ?, ?>> List<T> doSearch(final Set<String> 
adminRealms,
+    private <T extends Any<?, ?>> List<T> doSearch(final Set<String> 
adminRealms,
             final SearchCond nodeCond, final int page, final int itemsPerPage, 
final List<OrderByClause> orderBy,
             final AnyTypeKind typeKind) {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerAttrDAO.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerAttrDAO.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerAttrDAO.java
index 8dff203..99b9014 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerAttrDAO.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerAttrDAO.java
@@ -78,7 +78,7 @@ public class JPADerAttrDAO extends AbstractDAO<DerAttr<?>, 
Long> implements DerA
     @SuppressWarnings("unchecked")
     public <T extends DerAttr<?>> void delete(final T derAttr) {
         if (derAttr.getOwner() != null) {
-            ((Any<?, T, ?>) derAttr.getOwner()).remove(derAttr);
+            ((Any<?, T>) derAttr.getOwner()).remove(derAttr);
         }
 
         entityManager().remove(derAttr);

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java
index 3905d92..0650ee9 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java
@@ -32,10 +32,12 @@ import 
org.apache.syncope.core.persistence.api.dao.PolicyDAO;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.dao.TaskDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
+import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
 import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
 import 
org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
 import org.apache.syncope.core.persistence.api.entity.Policy;
+import org.apache.syncope.core.persistence.api.entity.VirSchema;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
 import org.apache.syncope.core.persistence.api.entity.resource.Provision;
@@ -43,6 +45,7 @@ import 
org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.persistence.jpa.entity.resource.JPAMappingItem;
 import 
org.apache.syncope.core.persistence.jpa.entity.resource.JPAExternalResource;
 import org.apache.syncope.core.persistence.jpa.entity.resource.JPAMapping;
+import org.apache.syncope.core.persistence.jpa.entity.resource.JPAProvision;
 import org.apache.syncope.core.provisioning.api.ConnectorRegistry;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;
@@ -67,6 +70,9 @@ public class JPAExternalResourceDAO extends 
AbstractDAO<ExternalResource, String
     private PolicyDAO policyDAO;
 
     @Autowired
+    private VirSchemaDAO virSchemaDAO;
+
+    @Autowired
     private ConnectorRegistry connRegistry;
 
     @Override
@@ -74,6 +80,11 @@ public class JPAExternalResourceDAO extends 
AbstractDAO<ExternalResource, String
         return entityManager().find(JPAExternalResource.class, name);
     }
 
+    @Override
+    public Provision findProvision(final Long key) {
+        return entityManager().find(JPAProvision.class, key);
+    }
+
     private StringBuilder getByPolicyQuery(final PolicyType type) {
         StringBuilder query = new StringBuilder("SELECT e FROM ").
                 append(JPAExternalResource.class.getSimpleName()).
@@ -203,13 +214,6 @@ public class JPAExternalResourceDAO extends 
AbstractDAO<ExternalResource, String
             policy.remove(resource);
         }
 
-        if (resource.getConnector() != null && 
resource.getConnector().getResources() != null
-                && !resource.getConnector().getResources().isEmpty()) {
-
-            resource.getConnector().getResources().remove(resource);
-        }
-        resource.setConnector(null);
-
         for (Provision provision : resource.getProvisions()) {
             for (MappingItem item : provision.getMapping().getItems()) {
                 item.setMapping(null);
@@ -217,7 +221,18 @@ public class JPAExternalResourceDAO extends 
AbstractDAO<ExternalResource, String
             provision.getMapping().getItems().clear();
             provision.setMapping(null);
             provision.setResource(null);
+
+            for (VirSchema schema : virSchemaDAO.findByProvision(provision)) {
+                virSchemaDAO.delete(schema.getKey());
+            }
+        }
+
+        if (resource.getConnector() != null && 
resource.getConnector().getResources() != null
+                && !resource.getConnector().getResources().isEmpty()) {
+
+            resource.getConnector().getResources().remove(resource);
         }
+        resource.setConnector(null);
 
         entityManager().remove(resource);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
index 652c1f7..4c29c90 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
@@ -203,7 +203,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> 
implements GroupDAO {
     }
 
     private void populateTransitiveResources(
-            final Group group, final Any<?, ?, ?> any, final Map<Long, 
PropagationByResource> result) {
+            final Group group, final Any<?, ?> any, final Map<Long, 
PropagationByResource> result) {
 
         PropagationByResource propByRes = new PropagationByResource();
         for (ExternalResource resource : group.getResources()) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainAttrDAO.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainAttrDAO.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainAttrDAO.java
index d21d1f3..cec3d5b 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainAttrDAO.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainAttrDAO.java
@@ -68,7 +68,7 @@ public class JPAPlainAttrDAO extends 
AbstractDAO<PlainAttr<?>, Long> implements
     @SuppressWarnings("unchecked")
     public <T extends PlainAttr<?>> void delete(final T plainAttr) {
         if (plainAttr.getOwner() != null) {
-            ((Any<T, ?, ?>) plainAttr.getOwner()).remove(plainAttr);
+            ((Any<T, ?>) plainAttr.getOwner()).remove(plainAttr);
         }
 
         entityManager().remove(plainAttr);

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainAttrValueDAO.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainAttrValueDAO.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainAttrValueDAO.java
index 312d6fc..60f3786 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainAttrValueDAO.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainAttrValueDAO.java
@@ -21,6 +21,7 @@ package org.apache.syncope.core.persistence.jpa.dao;
 import java.util.List;
 import javax.persistence.TypedQuery;
 import org.apache.syncope.core.persistence.api.dao.PlainAttrValueDAO;
+import org.apache.syncope.core.persistence.api.entity.PlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
 import 
org.apache.syncope.core.persistence.api.entity.anyobject.APlainAttrUniqueValue;
 import 
org.apache.syncope.core.persistence.api.entity.anyobject.APlainAttrValue;
@@ -99,7 +100,11 @@ public class JPAPlainAttrValueDAO extends 
AbstractDAO<PlainAttrValue, Long> impl
     @Override
     public <T extends PlainAttrValue> void delete(final T attrValue) {
         if (attrValue.getAttr() != null) {
-            attrValue.getAttr().remove(attrValue);
+            if (attrValue instanceof PlainAttrUniqueValue) {
+                attrValue.getAttr().setUniqueValue(null);
+            } else {
+                attrValue.getAttr().remove(attrValue);
+            }
         }
 
         entityManager().remove(attrValue);

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirAttrDAO.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirAttrDAO.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirAttrDAO.java
deleted file mode 100644
index 2c8b99f..0000000
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirAttrDAO.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.persistence.jpa.dao;
-
-import java.util.List;
-import javax.persistence.TypedQuery;
-import org.apache.syncope.core.persistence.api.dao.VirAttrDAO;
-import org.apache.syncope.core.persistence.api.entity.Any;
-import org.apache.syncope.core.persistence.api.entity.VirAttr;
-import org.apache.syncope.core.persistence.api.entity.anyobject.AVirAttr;
-import org.apache.syncope.core.persistence.api.entity.group.GVirAttr;
-import org.apache.syncope.core.persistence.api.entity.user.UVirAttr;
-import org.apache.syncope.core.persistence.jpa.entity.AbstractVirAttr;
-import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAVirAttr;
-import org.apache.syncope.core.persistence.jpa.entity.group.JPAGVirAttr;
-import org.apache.syncope.core.persistence.jpa.entity.user.JPAUVirAttr;
-import org.springframework.stereotype.Repository;
-
-@Repository
-public class JPAVirAttrDAO extends AbstractDAO<VirAttr<?>, Long> implements 
VirAttrDAO {
-
-    public <T extends VirAttr<?>> Class<? extends AbstractVirAttr<?>> 
getJPAEntityReference(
-            final Class<T> reference) {
-
-        return GVirAttr.class.isAssignableFrom(reference)
-                ? JPAGVirAttr.class
-                : AVirAttr.class.isAssignableFrom(reference)
-                        ? JPAAVirAttr.class
-                        : UVirAttr.class.isAssignableFrom(reference)
-                                ? JPAUVirAttr.class
-                                : null;
-    }
-
-    @Override
-    public <T extends VirAttr<?>> T find(final Long key, final Class<T> 
reference) {
-        return 
reference.cast(entityManager().find(getJPAEntityReference(reference), key));
-    }
-
-    @Override
-    public <T extends VirAttr<?>> List<T> findAll(final Class<T> reference) {
-        TypedQuery<T> query = entityManager().createQuery(
-                "SELECT e FROM " + 
getJPAEntityReference(reference).getSimpleName() + " e", reference);
-        return query.getResultList();
-    }
-
-    @Override
-    public <T extends VirAttr<?>> T save(final T virAttr) {
-        return entityManager().merge(virAttr);
-    }
-
-    @Override
-    public <T extends VirAttr<?>> void delete(final Long key, final Class<T> 
reference) {
-        T virAttr = find(key, reference);
-        if (virAttr == null) {
-            return;
-        }
-
-        delete(virAttr);
-    }
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public <T extends VirAttr<?>> void delete(final T virAttr) {
-        if (virAttr.getOwner() != null) {
-            ((Any<?, ?, T>) virAttr.getOwner()).remove(virAttr);
-        }
-
-        entityManager().remove(virAttr);
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
index 46a06f6..d4bce14 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
@@ -18,17 +18,18 @@
  */
 package org.apache.syncope.core.persistence.jpa.dao;
 
+import java.util.Collections;
 import java.util.List;
 import javax.persistence.TypedQuery;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
-import org.apache.syncope.core.persistence.api.dao.VirAttrDAO;
 import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
 import org.apache.syncope.core.persistence.api.entity.AnyUtils;
 import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
-import org.apache.syncope.core.persistence.api.entity.VirAttr;
+import org.apache.syncope.core.persistence.api.entity.Attr;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
+import org.apache.syncope.core.persistence.api.entity.resource.Provision;
 import org.apache.syncope.core.persistence.jpa.entity.JPAAnyUtilsFactory;
 import org.apache.syncope.core.persistence.jpa.entity.JPAVirSchema;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -38,9 +39,6 @@ import org.springframework.stereotype.Repository;
 public class JPAVirSchemaDAO extends AbstractDAO<VirSchema, String> implements 
VirSchemaDAO {
 
     @Autowired
-    private VirAttrDAO virAttrDAO;
-
-    @Autowired
     private ExternalResourceDAO resourceDAO;
 
     @Override
@@ -61,6 +59,18 @@ public class JPAVirSchemaDAO extends AbstractDAO<VirSchema, 
String> implements V
     }
 
     @Override
+    public List<VirSchema> findByProvision(final Provision provision) {
+        StringBuilder queryString = new StringBuilder("SELECT e FROM ").
+                append(JPAVirSchema.class.getSimpleName()).
+                append(" e WHERE e.provision=:provision");
+
+        TypedQuery<VirSchema> query = 
entityManager().createQuery(queryString.toString(), VirSchema.class);
+        query.setParameter("provision", provision);
+
+        return query.getResultList();
+    }
+
+    @Override
     public List<VirSchema> findAll() {
         TypedQuery<VirSchema> query = entityManager().createQuery(
                 "SELECT e FROM " + JPAVirSchema.class.getSimpleName() + " e", 
VirSchema.class);
@@ -68,15 +78,8 @@ public class JPAVirSchemaDAO extends AbstractDAO<VirSchema, 
String> implements V
     }
 
     @Override
-    public <T extends VirAttr<?>> List<T> findAttrs(final VirSchema schema, 
final Class<T> reference) {
-        final StringBuilder queryString = new StringBuilder("SELECT e FROM ").
-                append(((JPAVirAttrDAO) 
virAttrDAO).getJPAEntityReference(reference).getSimpleName()).
-                append(" e WHERE e.schema=:schema");
-
-        TypedQuery<T> query = 
entityManager().createQuery(queryString.toString(), reference);
-        query.setParameter("schema", schema);
-
-        return query.getResultList();
+    public <T extends Attr<VirSchema, ?>> List<T> findAttrs(final VirSchema 
schema, final Class<T> reference) {
+        return Collections.emptyList();
     }
 
     @Override
@@ -95,10 +98,6 @@ public class JPAVirSchemaDAO extends AbstractDAO<VirSchema, 
String> implements V
         for (AnyTypeKind anyTypeKind : AnyTypeKind.values()) {
             AnyUtils anyUtils = anyUtilsFactory.getInstance(anyTypeKind);
 
-            for (VirAttr<?> attr : findAttrs(schema, anyUtils.virAttrClass())) 
{
-                virAttrDAO.delete(attr.getKey(), anyUtils.virAttrClass());
-            }
-
             resourceDAO.deleteMapping(key, anyUtils.virIntMappingType());
         }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAny.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAny.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAny.java
index 2e344b0..041c54f 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAny.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAny.java
@@ -39,7 +39,6 @@ import 
org.apache.syncope.core.persistence.api.entity.DerSchema;
 import org.apache.syncope.core.persistence.api.entity.PlainAttr;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.Realm;
-import org.apache.syncope.core.persistence.api.entity.VirAttr;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AMembership;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
@@ -49,9 +48,9 @@ import 
org.apache.syncope.core.persistence.api.entity.user.UMembership;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 
 @MappedSuperclass
-public abstract class AbstractAny<P extends PlainAttr<?>, D extends 
DerAttr<?>, V extends VirAttr<?>>
+public abstract class AbstractAny<P extends PlainAttr<?>, D extends DerAttr<?>>
         extends AbstractAnnotatedEntity<Long>
-        implements Any<P, D, V> {
+        implements Any<P, D> {
 
     private static final long serialVersionUID = -2666540708092702810L;
 
@@ -127,18 +126,6 @@ public abstract class AbstractAny<P extends PlainAttr<?>, 
D extends DerAttr<?>,
         });
     }
 
-    @Override
-    public V getVirAttr(final String virSchemaName) {
-        return CollectionUtils.find(getVirAttrs(), new Predicate<V>() {
-
-            @Override
-            public boolean evaluate(final V virAttr) {
-                return virAttr != null && virAttr.getSchema() != null
-                        && virSchemaName.equals(virAttr.getSchema().getKey());
-            }
-        });
-    }
-
     protected abstract List<JPAExternalResource> internalGetResources();
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAttr.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAttr.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAttr.java
index ec37649..694b18f 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAttr.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAttr.java
@@ -28,7 +28,7 @@ import 
org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.Schema;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
 
-public abstract class AbstractAttr<S extends Schema, O extends Any<?, ?, ?>>
+public abstract class AbstractAttr<S extends Schema, O extends Any<?, ?>>
         extends AbstractEntity<Long> implements Attr<S, O> {
 
     private static final long serialVersionUID = -7722134717360731874L;

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDerAttr.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDerAttr.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDerAttr.java
index 4500a4e..59f390d 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDerAttr.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDerAttr.java
@@ -30,7 +30,7 @@ import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
 
 @MappedSuperclass
-public abstract class AbstractDerAttr<O extends Any<?, ?, ?>>
+public abstract class AbstractDerAttr<O extends Any<?, ?>>
         extends AbstractAttr<DerSchema, O> implements DerAttr<O> {
 
     private static final long serialVersionUID = 4740924251090424771L;

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDynMembership.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDynMembership.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDynMembership.java
index c5404e9..c7110d5 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDynMembership.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDynMembership.java
@@ -24,7 +24,7 @@ import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.DynMembership;
 
 @MappedSuperclass
-public abstract class AbstractDynMembership<A extends Any<?, ?, ?>>
+public abstract class AbstractDynMembership<A extends Any<?, ?>>
         extends AbstractEntity<Long> implements DynMembership<A> {
 
     private static final long serialVersionUID = 921821654690948787L;

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java
index 4bab427..fdd257e 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java
@@ -37,7 +37,7 @@ import 
org.apache.syncope.core.persistence.jpa.validation.entity.PlainAttrCheck;
 
 @MappedSuperclass
 @PlainAttrCheck
-public abstract class AbstractPlainAttr<O extends Any<?, ?, ?>>
+public abstract class AbstractPlainAttr<O extends Any<?, ?>>
         extends AbstractAttr<PlainSchema, O> implements PlainAttr<O> {
 
     private static final long serialVersionUID = -9115431608821806124L;

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttrValue.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttrValue.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttrValue.java
index 424e6a2..7032df6 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttrValue.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttrValue.java
@@ -32,11 +32,11 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import org.apache.syncope.common.lib.types.AttrSchemaType;
+import org.apache.syncope.core.misc.FormatUtils;
 import 
org.apache.syncope.core.persistence.api.attrvalue.validation.InvalidPlainAttrValueException;
 import 
org.apache.syncope.core.persistence.api.attrvalue.validation.ParsingValidationException;
 import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
-import org.apache.syncope.core.misc.DataFormat;
 import 
org.apache.syncope.core.persistence.jpa.validation.entity.PlainAttrValueCheck;
 import org.apache.syncope.core.misc.security.Encryptor;
 
@@ -153,7 +153,7 @@ public abstract class AbstractPlainAttrValue extends 
AbstractEntity<Long> implem
                 try {
                     this.setLongValue(schema.getConversionPattern() == null
                             ? Long.valueOf(value)
-                            : DataFormat.parseNumber(value, 
schema.getConversionPattern()).longValue());
+                            : FormatUtils.parseNumber(value, 
schema.getConversionPattern()).longValue());
                 } catch (Exception pe) {
                     exception = pe;
                 }
@@ -163,7 +163,7 @@ public abstract class AbstractPlainAttrValue extends 
AbstractEntity<Long> implem
                 try {
                     this.setDoubleValue(schema.getConversionPattern() == null
                             ? Double.valueOf(value)
-                            : DataFormat.parseNumber(value, 
schema.getConversionPattern()).doubleValue());
+                            : FormatUtils.parseNumber(value, 
schema.getConversionPattern()).doubleValue());
                 } catch (Exception pe) {
                     exception = pe;
                 }
@@ -172,8 +172,8 @@ public abstract class AbstractPlainAttrValue extends 
AbstractEntity<Long> implem
             case Date:
                 try {
                     this.setDateValue(schema.getConversionPattern() == null
-                            ? DataFormat.parseDate(value)
-                            : new Date(DataFormat.parseDate(value, 
schema.getConversionPattern()).getTime()));
+                            ? FormatUtils.parseDate(value)
+                            : new Date(FormatUtils.parseDate(value, 
schema.getConversionPattern()).getTime()));
                 } catch (Exception pe) {
                     exception = pe;
                 }
@@ -246,21 +246,21 @@ public abstract class AbstractPlainAttrValue extends 
AbstractEntity<Long> implem
                 result = getAttr() == null || getAttr().getSchema() == null
                         || getAttr().getSchema().getConversionPattern() == null
                                 ? getLongValue().toString()
-                                : DataFormat.format(getLongValue(), 
getAttr().getSchema().getConversionPattern());
+                                : FormatUtils.format(getLongValue(), 
getAttr().getSchema().getConversionPattern());
                 break;
 
             case Double:
                 result = getAttr() == null || getAttr().getSchema() == null
                         || getAttr().getSchema().getConversionPattern() == null
                                 ? getDoubleValue().toString()
-                                : DataFormat.format(getDoubleValue(), 
getAttr().getSchema().getConversionPattern());
+                                : FormatUtils.format(getDoubleValue(), 
getAttr().getSchema().getConversionPattern());
                 break;
 
             case Date:
                 result = getAttr() == null || getAttr().getSchema() == null
                         || getAttr().getSchema().getConversionPattern() == null
-                                ? DataFormat.format(getDateValue())
-                                : DataFormat.format(getDateValue(), false, 
getAttr().getSchema().
+                                ? FormatUtils.format(getDateValue())
+                                : FormatUtils.format(getDateValue(), false, 
getAttr().getSchema().
                                         getConversionPattern());
                 break;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractVirAttr.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractVirAttr.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractVirAttr.java
deleted file mode 100644
index aebc8da..0000000
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractVirAttr.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.persistence.jpa.entity;
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.persistence.Column;
-import javax.persistence.FetchType;
-import javax.persistence.ManyToOne;
-import javax.persistence.MappedSuperclass;
-import javax.persistence.Transient;
-import org.apache.syncope.core.persistence.api.entity.Any;
-import org.apache.syncope.core.persistence.api.entity.VirAttr;
-import org.apache.syncope.core.persistence.api.entity.VirSchema;
-
-@MappedSuperclass
-public abstract class AbstractVirAttr<O extends Any<?, ?, ?>>
-        extends AbstractAttr<VirSchema, O> implements VirAttr<O> {
-
-    private static final long serialVersionUID = 5023204776925954907L;
-
-    @Transient
-    protected List<String> values = new ArrayList<>();
-
-    @ManyToOne(fetch = FetchType.EAGER)
-    @Column(name = "schema_name")
-    private JPAVirSchema schema;
-
-    @Override
-    public List<String> getValues() {
-        return values;
-    }
-
-    @Override
-    public boolean add(final String value) {
-        return !values.contains(value) && values.add(value);
-    }
-
-    @Override
-    public boolean remove(final String value) {
-        return values.remove(value);
-    }
-
-    @Override
-    public VirSchema getSchema() {
-        return schema;
-    }
-
-    @Override
-    public void setSchema(final VirSchema schema) {
-        checkType(schema, JPAVirSchema.class);
-        this.schema = (JPAVirSchema) schema;
-        checkSchema(this.schema);
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AnnotatedEntityListener.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AnnotatedEntityListener.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AnnotatedEntityListener.java
index 4e8044d..c63a401 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AnnotatedEntityListener.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AnnotatedEntityListener.java
@@ -33,10 +33,10 @@ public class AnnotatedEntityListener {
     @PrePersist
     @PreUpdate
     public void setSysInfo(final AnnotatedEntity<?> entity) {
-        final String username = AuthContextUtils.getUsername();
+        String username = AuthContextUtils.getUsername();
         LOG.debug("Set system properties for '{}'", entity);
 
-        final Date now = new Date();
+        Date now = new Date();
 
         if (entity.getCreationDate() == null) {
             LOG.debug("Set creation date '{}' and creator '{}' for '{}'", now, 
username, entity);

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java
index 645c60c..7de2fbe 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java
@@ -29,24 +29,20 @@ import 
org.apache.syncope.core.persistence.api.entity.AnyUtils;
 import org.apache.syncope.core.persistence.api.entity.DerAttr;
 import org.apache.syncope.core.persistence.api.entity.PlainAttr;
 import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
-import org.apache.syncope.core.persistence.api.entity.VirAttr;
 import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAADerAttr;
 import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAPlainAttr;
 import 
org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAPlainAttrUniqueValue;
 import 
org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAPlainAttrValue;
-import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAVirAttr;
 import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAnyObject;
 import org.apache.syncope.core.persistence.jpa.entity.group.JPAGDerAttr;
 import org.apache.syncope.core.persistence.jpa.entity.group.JPAGPlainAttr;
 import 
org.apache.syncope.core.persistence.jpa.entity.group.JPAGPlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.jpa.entity.group.JPAGPlainAttrValue;
-import org.apache.syncope.core.persistence.jpa.entity.group.JPAGVirAttr;
 import org.apache.syncope.core.persistence.jpa.entity.group.JPAGroup;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUDerAttr;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUPlainAttr;
 import 
org.apache.syncope.core.persistence.jpa.entity.user.JPAUPlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUPlainAttrValue;
-import org.apache.syncope.core.persistence.jpa.entity.user.JPAUVirAttr;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUser;
 
 @SuppressWarnings({ "unchecked", "rawtypes" })
@@ -64,7 +60,7 @@ public class JPAAnyUtils implements AnyUtils {
     }
 
     @Override
-    public <T extends Any<?, ?, ?>> Class<T> anyClass() {
+    public <T extends Any<?, ?>> Class<T> anyClass() {
         Class result;
 
         switch (anyTypeKind) {
@@ -266,52 +262,6 @@ public class JPAAnyUtils implements AnyUtils {
     }
 
     @Override
-    public <T extends VirAttr<?>> Class<T> virAttrClass() {
-        Class result = null;
-
-        switch (anyTypeKind) {
-            case USER:
-                result = JPAUVirAttr.class;
-                break;
-
-            case GROUP:
-                result = JPAGVirAttr.class;
-                break;
-
-            case ANY_OBJECT:
-                result = JPAAVirAttr.class;
-                break;
-
-            default:
-        }
-
-        return result;
-    }
-
-    @Override
-    public <T extends VirAttr<?>> T newVirAttr() {
-        T result = null;
-
-        switch (anyTypeKind) {
-            case USER:
-                result = (T) new JPAUVirAttr();
-                break;
-
-            case GROUP:
-                result = (T) new JPAGVirAttr();
-                break;
-
-            case ANY_OBJECT:
-                result = (T) new JPAAVirAttr();
-                break;
-
-            default:
-        }
-
-        return result;
-    }
-
-    @Override
     public IntMappingType plainIntMappingType() {
         IntMappingType result = null;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtilsFactory.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtilsFactory.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtilsFactory.java
index f68b3f9..38e08b4 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtilsFactory.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtilsFactory.java
@@ -41,7 +41,7 @@ public class JPAAnyUtilsFactory implements AnyUtilsFactory {
     }
 
     @Override
-    public AnyUtils getInstance(final Any<?, ?, ?> any) {
+    public AnyUtils getInstance(final Any<?, ?> any) {
         AnyTypeKind type = null;
         if (any instanceof User) {
             type = AnyTypeKind.USER;

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java
index 4c3b816..372e062 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java
@@ -64,7 +64,6 @@ import 
org.apache.syncope.core.persistence.api.entity.group.GDerAttr;
 import org.apache.syncope.core.persistence.api.entity.group.GPlainAttr;
 import 
org.apache.syncope.core.persistence.api.entity.group.GPlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.api.entity.group.GPlainAttrValue;
-import org.apache.syncope.core.persistence.api.entity.group.GVirAttr;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
 import org.apache.syncope.core.persistence.api.entity.resource.Mapping;
 import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
@@ -85,7 +84,6 @@ import 
org.apache.syncope.core.persistence.api.entity.user.UPlainAttr;
 import 
org.apache.syncope.core.persistence.api.entity.user.UPlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.api.entity.user.UPlainAttrValue;
 import org.apache.syncope.core.persistence.api.entity.user.URelationship;
-import org.apache.syncope.core.persistence.api.entity.user.UVirAttr;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import 
org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAADynGroupMembership;
 import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAMembership;
@@ -102,7 +100,6 @@ import 
org.apache.syncope.core.persistence.jpa.entity.group.JPAGDerAttr;
 import org.apache.syncope.core.persistence.jpa.entity.group.JPAGPlainAttr;
 import 
org.apache.syncope.core.persistence.jpa.entity.group.JPAGPlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.jpa.entity.group.JPAGPlainAttrValue;
-import org.apache.syncope.core.persistence.jpa.entity.group.JPAGVirAttr;
 import org.apache.syncope.core.persistence.jpa.entity.group.JPAGroup;
 import org.apache.syncope.core.persistence.jpa.entity.resource.JPAMapping;
 import org.apache.syncope.core.persistence.jpa.entity.resource.JPAMappingItem;
@@ -122,7 +119,6 @@ import 
org.apache.syncope.core.persistence.jpa.entity.user.JPAUPlainAttr;
 import 
org.apache.syncope.core.persistence.jpa.entity.user.JPAUPlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUPlainAttrValue;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAURelationship;
-import org.apache.syncope.core.persistence.jpa.entity.user.JPAUVirAttr;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUser;
 import org.springframework.stereotype.Component;
 
@@ -202,8 +198,6 @@ public class JPAEntityFactory implements EntityFactory {
             result = (T) new JPAUDerAttr();
         } else if (reference.equals(VirSchema.class)) {
             result = (T) new JPAVirSchema();
-        } else if (reference.equals(UVirAttr.class)) {
-            result = (T) new JPAUVirAttr();
         } else if (reference.equals(Mapping.class)) {
             result = (T) new JPAMapping();
         } else if (reference.equals(MappingItem.class)) {
@@ -216,8 +210,6 @@ public class JPAEntityFactory implements EntityFactory {
             result = (T) new JPAGPlainAttrUniqueValue();
         } else if (reference.equals(GDerAttr.class)) {
             result = (T) new JPAGDerAttr();
-        } else if (reference.equals(GVirAttr.class)) {
-            result = (T) new JPAGVirAttr();
         } else if (reference.equals(CPlainAttr.class)) {
             result = (T) new JPACPlainAttr();
         } else if (reference.equals(CPlainAttrValue.class)) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java
index 6c1dd73..b984bb3 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java
@@ -18,18 +18,28 @@
  */
 package org.apache.syncope.core.persistence.jpa.entity;
 
+import java.util.Collections;
+import java.util.List;
 import javax.persistence.Basic;
 import javax.persistence.Cacheable;
+import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.Id;
+import javax.persistence.ManyToOne;
 import javax.persistence.OneToOne;
 import javax.persistence.Table;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import org.apache.syncope.common.lib.types.AttrSchemaType;
+import org.apache.syncope.common.lib.types.IntMappingType;
+import org.apache.syncope.common.lib.types.MappingPurpose;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
+import org.apache.syncope.core.persistence.api.entity.resource.Mapping;
+import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
+import org.apache.syncope.core.persistence.api.entity.resource.Provision;
+import org.apache.syncope.core.persistence.jpa.entity.resource.JPAProvision;
 import 
org.apache.syncope.core.persistence.jpa.validation.entity.SchemaNameCheck;
 
 @Entity
@@ -53,6 +63,13 @@ public class JPAVirSchema extends AbstractEntity<String> 
implements VirSchema {
     @Max(1)
     private Integer readonly;
 
+    @Column(nullable = false)
+    @ManyToOne
+    private JPAProvision provision;
+
+    @Column(nullable = false)
+    private String extAttrName;
+
     public JPAVirSchema() {
         super();
 
@@ -109,4 +126,134 @@ public class JPAVirSchema extends AbstractEntity<String> 
implements VirSchema {
     public void setReadonly(final boolean readonly) {
         this.readonly = getBooleanAsInteger(readonly);
     }
+
+    @Override
+    public Provision getProvision() {
+        return provision;
+    }
+
+    @Override
+    public void setProvision(final Provision provision) {
+        checkType(provision, JPAProvision.class);
+        this.provision = (JPAProvision) provision;
+    }
+
+    @Override
+    public String getExtAttrName() {
+        return extAttrName;
+    }
+
+    @Override
+    public void setExtAttrName(final String extAttrName) {
+        this.extAttrName = extAttrName;
+    }
+
+    @Override
+    public MappingItem asLinkingMappingItem() {
+        return new MappingItem() {
+
+            private static final long serialVersionUID = 327455459536715529L;
+
+            @Override
+            public Long getKey() {
+                return -1L;
+            }
+
+            @Override
+            public Mapping getMapping() {
+                return getProvision().getMapping();
+            }
+
+            @Override
+            public void setMapping(final Mapping mapping) {
+                // RO instance, nothing to do
+            }
+
+            @Override
+            public String getExtAttrName() {
+                return JPAVirSchema.this.getExtAttrName();
+            }
+
+            @Override
+            public void setExtAttrName(final String extAttrName) {
+                // RO instance, nothing to do
+            }
+
+            @Override
+            public String getIntAttrName() {
+                return JPAVirSchema.this.getKey();
+            }
+
+            @Override
+            public void setIntAttrName(final String intAttrName) {
+                // RO instance, nothing to do
+            }
+
+            @Override
+            public IntMappingType getIntMappingType() {
+                switch (getProvision().getAnyType().getKind()) {
+                    case ANY_OBJECT:
+                        return IntMappingType.AnyObjectVirtualSchema;
+
+                    case GROUP:
+                        return IntMappingType.GroupVirtualSchema;
+
+                    case USER:
+                    default:
+                        return IntMappingType.UserVirtualSchema;
+                }
+            }
+
+            @Override
+            public void setIntMappingType(final IntMappingType intMappingType) 
{
+                // RO instance, nothing to do
+            }
+
+            @Override
+            public String getMandatoryCondition() {
+                return JPAVirSchema.this.getMandatoryCondition();
+            }
+
+            @Override
+            public void setMandatoryCondition(final String condition) {
+                // RO instance, nothing to do
+            }
+
+            @Override
+            public MappingPurpose getPurpose() {
+                return JPAVirSchema.this.isReadonly() ? 
MappingPurpose.SYNCHRONIZATION : MappingPurpose.BOTH;
+            }
+
+            @Override
+            public void setPurpose(final MappingPurpose purpose) {
+                // RO instance, nothing to do
+            }
+
+            @Override
+            public boolean isConnObjectKey() {
+                return false;
+            }
+
+            @Override
+            public void setConnObjectKey(final boolean connObjectKey) {
+                // RO instance, nothing to do
+            }
+
+            @Override
+            public boolean isPassword() {
+                return false;
+            }
+
+            @Override
+            public void setPassword(final boolean password) {
+                // RO instance, nothing to do
+            }
+
+            @Override
+            public List<String> getMappingItemTransformerClassNames() {
+                return Collections.emptyList();
+            }
+        };
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAPlainAttrUniqueValue.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAPlainAttrUniqueValue.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAPlainAttrUniqueValue.java
index 25cc5eb..01be6a8 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAPlainAttrUniqueValue.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAPlainAttrUniqueValue.java
@@ -60,7 +60,7 @@ public class JPAAPlainAttrUniqueValue extends 
AbstractPlainAttrValue implements
     }
 
     @Override
-    public void setAttr(final PlainAttr attr) {
+    public void setAttr(final PlainAttr<?> attr) {
         checkType(attr, JPAAPlainAttr.class);
         this.attribute = (JPAAPlainAttr) attr;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAPlainAttrValue.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAPlainAttrValue.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAPlainAttrValue.java
index 73c962c..0c9e598 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAPlainAttrValue.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAPlainAttrValue.java
@@ -57,7 +57,7 @@ public class JPAAPlainAttrValue extends 
AbstractPlainAttrValue implements APlain
     }
 
     @Override
-    public void setAttr(final PlainAttr attr) {
+    public void setAttr(final PlainAttr<?> attr) {
         checkType(attr, JPAAPlainAttr.class);
         this.attribute = (JPAAPlainAttr) attr;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAVirAttr.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAVirAttr.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAVirAttr.java
deleted file mode 100644
index 62e2ea5..0000000
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAVirAttr.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.persistence.jpa.entity.anyobject;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import org.apache.syncope.core.persistence.api.entity.anyobject.AVirAttr;
-import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
-import org.apache.syncope.core.persistence.jpa.entity.AbstractVirAttr;
-
-@Entity
-@Table(name = JPAAVirAttr.TABLE)
-public class JPAAVirAttr extends AbstractVirAttr<AnyObject> implements 
AVirAttr {
-
-    private static final long serialVersionUID = -4935990254545760827L;
-
-    public static final String TABLE = "AVirAttr";
-
-    @Id
-    private Long id;
-
-    @ManyToOne
-    private JPAAnyObject owner;
-
-    @Override
-    public Long getKey() {
-        return id;
-    }
-
-    @Override
-    public AnyObject getOwner() {
-        return owner;
-    }
-
-    @Override
-    public void setOwner(final AnyObject owner) {
-        checkType(owner, JPAAnyObject.class);
-        this.owner = (JPAAnyObject) owner;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java
index 3e9feda..9d69735 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java
@@ -42,7 +42,6 @@ import 
org.apache.syncope.core.persistence.api.entity.anyobject.ADerAttr;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AMembership;
 import org.apache.syncope.core.persistence.api.entity.anyobject.APlainAttr;
 import org.apache.syncope.core.persistence.api.entity.anyobject.ARelationship;
-import org.apache.syncope.core.persistence.api.entity.anyobject.AVirAttr;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
 import org.apache.syncope.core.persistence.jpa.entity.AbstractAny;
 import org.apache.syncope.core.persistence.jpa.entity.JPAAnyType;
@@ -52,7 +51,7 @@ import 
org.apache.syncope.core.persistence.jpa.entity.resource.JPAExternalResour
 @Entity
 @Table(name = JPAAnyObject.TABLE)
 @Cacheable
-public class JPAAnyObject extends AbstractAny<APlainAttr, ADerAttr, AVirAttr> 
implements AnyObject {
+public class JPAAnyObject extends AbstractAny<APlainAttr, ADerAttr> implements 
AnyObject {
 
     private static final long serialVersionUID = 9063766472970643492L;
 
@@ -72,10 +71,6 @@ public class JPAAnyObject extends AbstractAny<APlainAttr, 
ADerAttr, AVirAttr> im
     @Valid
     private List<JPAADerAttr> derAttrs = new ArrayList<>();
 
-    @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner")
-    @Valid
-    private List<JPAAVirAttr> virAttrs = new ArrayList<>();
-
     @ManyToMany(fetch = FetchType.EAGER)
     @JoinTable(joinColumns =
             @JoinColumn(name = "anyObject_id"),
@@ -149,23 +144,6 @@ public class JPAAnyObject extends AbstractAny<APlainAttr, 
ADerAttr, AVirAttr> im
     }
 
     @Override
-    public boolean add(final AVirAttr attr) {
-        checkType(attr, JPAAVirAttr.class);
-        return virAttrs.add((JPAAVirAttr) attr);
-    }
-
-    @Override
-    public boolean remove(final AVirAttr attr) {
-        checkType(attr, JPAAVirAttr.class);
-        return virAttrs.remove((JPAAVirAttr) attr);
-    }
-
-    @Override
-    public List<? extends AVirAttr> getVirAttrs() {
-        return virAttrs;
-    }
-
-    @Override
     protected List<JPAExternalResource> internalGetResources() {
         return resources;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPACPlainAttrUniqueValue.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPACPlainAttrUniqueValue.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPACPlainAttrUniqueValue.java
index 4783911..fea5af4 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPACPlainAttrUniqueValue.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPACPlainAttrUniqueValue.java
@@ -60,7 +60,7 @@ public class JPACPlainAttrUniqueValue extends 
AbstractPlainAttrValue implements
     }
 
     @Override
-    public void setAttr(final PlainAttr attr) {
+    public void setAttr(final PlainAttr<?> attr) {
         checkType(attr, JPACPlainAttr.class);
         this.attribute = (JPACPlainAttr) attr;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPACPlainAttrValue.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPACPlainAttrValue.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPACPlainAttrValue.java
index 2761a84..5b7d2b3 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPACPlainAttrValue.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPACPlainAttrValue.java
@@ -57,7 +57,7 @@ public class JPACPlainAttrValue extends 
AbstractPlainAttrValue implements CPlain
     }
 
     @Override
-    public void setAttr(final PlainAttr attr) {
+    public void setAttr(final PlainAttr<?> attr) {
         checkType(attr, JPACPlainAttr.class);
         this.attribute = (JPACPlainAttr) attr;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPAConf.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPAConf.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPAConf.java
index 2b44253..ac5616a 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPAConf.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPAConf.java
@@ -37,7 +37,6 @@ import org.apache.syncope.core.persistence.api.entity.DerAttr;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.Realm;
-import org.apache.syncope.core.persistence.api.entity.VirAttr;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
 import org.apache.syncope.core.persistence.api.entity.conf.CPlainAttr;
 import org.apache.syncope.core.persistence.api.entity.conf.Conf;
@@ -120,26 +119,6 @@ public class JPAConf extends AbstractAnnotatedEntity<Long> 
implements Conf {
     }
 
     @Override
-    public boolean add(final VirAttr<?> attr) {
-        return false;
-    }
-
-    @Override
-    public boolean remove(final VirAttr<?> virAttr) {
-        return false;
-    }
-
-    @Override
-    public VirAttr<?> getVirAttr(final String virSchemaName) {
-        return null;
-    }
-
-    @Override
-    public List<? extends VirAttr<?>> getVirAttrs() {
-        return Collections.emptyList();
-    }
-
-    @Override
     public boolean add(final ExternalResource resource) {
         return false;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGPlainAttrUniqueValue.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGPlainAttrUniqueValue.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGPlainAttrUniqueValue.java
index 3efae7c..a5c1b90 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGPlainAttrUniqueValue.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGPlainAttrUniqueValue.java
@@ -60,7 +60,7 @@ public class JPAGPlainAttrUniqueValue extends 
AbstractPlainAttrValue implements
     }
 
     @Override
-    public void setAttr(final PlainAttr attr) {
+    public void setAttr(final PlainAttr<?> attr) {
         checkType(attr, JPAGPlainAttr.class);
         this.attribute = (JPAGPlainAttr) attr;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGPlainAttrValue.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGPlainAttrValue.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGPlainAttrValue.java
index ed93477..e5d0830 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGPlainAttrValue.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGPlainAttrValue.java
@@ -57,7 +57,7 @@ public class JPAGPlainAttrValue extends 
AbstractPlainAttrValue implements GPlain
     }
 
     @Override
-    public void setAttr(final PlainAttr attr) {
+    public void setAttr(final PlainAttr<?> attr) {
         checkType(attr, JPAGPlainAttr.class);
         this.attribute = (JPAGPlainAttr) attr;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGVirAttr.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGVirAttr.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGVirAttr.java
deleted file mode 100644
index 47b8886..0000000
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGVirAttr.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.persistence.jpa.entity.group;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import org.apache.syncope.core.persistence.api.entity.group.GVirAttr;
-import org.apache.syncope.core.persistence.api.entity.group.Group;
-import org.apache.syncope.core.persistence.jpa.entity.AbstractVirAttr;
-
-@Entity
-@Table(name = JPAGVirAttr.TABLE)
-public class JPAGVirAttr extends AbstractVirAttr<Group> implements GVirAttr {
-
-    private static final long serialVersionUID = -1747430556914428649L;
-
-    public static final String TABLE = "GVirAttr";
-
-    @Id
-    private Long id;
-
-    @ManyToOne
-    private JPAGroup owner;
-
-    @Override
-    public Long getKey() {
-        return id;
-    }
-
-    @Override
-    public Group getOwner() {
-        return owner;
-    }
-
-    @Override
-    public void setOwner(final Group owner) {
-        checkType(owner, JPAGroup.class);
-        this.owner = (JPAGroup) owner;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGroup.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGroup.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGroup.java
index 2913dc6..2fb84b5 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGroup.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGroup.java
@@ -44,7 +44,6 @@ import 
org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
 import 
org.apache.syncope.core.persistence.api.entity.anyobject.ADynGroupMembership;
 import org.apache.syncope.core.persistence.api.entity.group.GDerAttr;
 import org.apache.syncope.core.persistence.api.entity.group.GPlainAttr;
-import org.apache.syncope.core.persistence.api.entity.group.GVirAttr;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
 import org.apache.syncope.core.persistence.api.entity.group.TypeExtension;
 import org.apache.syncope.core.persistence.api.entity.user.UDynGroupMembership;
@@ -61,7 +60,7 @@ import 
org.apache.syncope.core.persistence.jpa.entity.user.JPAUser;
 @Table(name = JPAGroup.TABLE)
 @Cacheable
 @GroupCheck
-public class JPAGroup extends AbstractAny<GPlainAttr, GDerAttr, GVirAttr> 
implements Group {
+public class JPAGroup extends AbstractAny<GPlainAttr, GDerAttr> implements 
Group {
 
     private static final long serialVersionUID = -5281258853142421875L;
 
@@ -88,10 +87,6 @@ public class JPAGroup extends AbstractAny<GPlainAttr, 
GDerAttr, GVirAttr> implem
     @Valid
     private List<JPAGDerAttr> derAttrs = new ArrayList<>();
 
-    @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner")
-    @Valid
-    private List<JPAGVirAttr> virAttrs = new ArrayList<>();
-
     @ManyToMany(fetch = FetchType.EAGER)
     @JoinTable(joinColumns =
             @JoinColumn(name = "group_id"),
@@ -205,23 +200,6 @@ public class JPAGroup extends AbstractAny<GPlainAttr, 
GDerAttr, GVirAttr> implem
     }
 
     @Override
-    public boolean add(final GVirAttr attr) {
-        checkType(attr, JPAGVirAttr.class);
-        return virAttrs.add((JPAGVirAttr) attr);
-    }
-
-    @Override
-    public boolean remove(final GVirAttr attr) {
-        checkType(attr, JPAGVirAttr.class);
-        return virAttrs.remove((JPAGVirAttr) attr);
-    }
-
-    @Override
-    public List<? extends GVirAttr> getVirAttrs() {
-        return virAttrs;
-    }
-
-    @Override
     public ADynGroupMembership getADynMembership() {
         return aDynMembership;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMapping.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMapping.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMapping.java
index 2066f6f..2d7af3c 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMapping.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMapping.java
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.List;
 import javax.persistence.Cacheable;
 import javax.persistence.CascadeType;
+import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.Id;
@@ -48,12 +49,10 @@ public class JPAMapping extends AbstractEntity<Long> 
implements Mapping {
     @Id
     private Long id;
 
+    @Column(nullable = false)
     @OneToOne
     private JPAProvision provision;
 
-    /**
-     * Attribute mappings.
-     */
     @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = 
FetchType.EAGER, mappedBy = "mapping")
     private List<JPAMappingItem> items = new ArrayList<>();
 
@@ -79,17 +78,6 @@ public class JPAMapping extends AbstractEntity<Long> 
implements Mapping {
     }
 
     @Override
-    public void setConnObjectKeyItem(final MappingItem item) {
-        checkType(item, JPAMappingItem.class);
-        this.addConnObjectKeyItem((JPAMappingItem) item);
-    }
-
-    @Override
-    public List<? extends MappingItem> getItems() {
-        return items;
-    }
-
-    @Override
     public boolean add(final MappingItem item) {
         checkType(item, JPAMappingItem.class);
         return items.contains((JPAMappingItem) item) || 
items.add((JPAMappingItem) item);
@@ -102,6 +90,11 @@ public class JPAMapping extends AbstractEntity<Long> 
implements Mapping {
     }
 
     @Override
+    public List<? extends MappingItem> getItems() {
+        return items;
+    }
+
+    @Override
     public MappingItem getConnObjectKeyItem() {
         return CollectionUtils.find(getItems(), new Predicate<MappingItem>() {
 
@@ -112,6 +105,12 @@ public class JPAMapping extends AbstractEntity<Long> 
implements Mapping {
         });
     }
 
+    @Override
+    public void setConnObjectKeyItem(final MappingItem item) {
+        checkType(item, JPAMappingItem.class);
+        this.addConnObjectKeyItem((JPAMappingItem) item);
+    }
+
     protected boolean addConnObjectKeyItem(final MappingItem 
connObjectKeyItem) {
         if (IntMappingType.UserVirtualSchema == 
connObjectKeyItem.getIntMappingType()
                 || IntMappingType.GroupVirtualSchema == 
connObjectKeyItem.getIntMappingType()

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAProvision.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAProvision.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAProvision.java
index 8e13879..3906dfd 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAProvision.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAProvision.java
@@ -131,5 +131,4 @@ public class JPAProvision extends AbstractEntity<Long> 
implements Provision {
         checkType(mapping, JPAMapping.class);
         this.mapping = (JPAMapping) mapping;
     }
-
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPropagationTask.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPropagationTask.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPropagationTask.java
index 2bdd0f3..9882752 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPropagationTask.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPropagationTask.java
@@ -75,6 +75,8 @@ public class JPAPropagationTask extends AbstractTask 
implements PropagationTask
     @Enumerated(EnumType.STRING)
     private AnyTypeKind anyTypeKind;
 
+    private String anyType;
+
     private Long anyKey;
 
     public JPAPropagationTask() {
@@ -167,6 +169,16 @@ public class JPAPropagationTask extends AbstractTask 
implements PropagationTask
     }
 
     @Override
+    public String getAnyType() {
+        return anyType;
+    }
+
+    @Override
+    public void setAnyType(final String anyType) {
+        this.anyType = anyType;
+    }
+
+    @Override
     public Long getAnyKey() {
         return anyKey;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUPlainAttrUniqueValue.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUPlainAttrUniqueValue.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUPlainAttrUniqueValue.java
index 566739d..86dfdfa 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUPlainAttrUniqueValue.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUPlainAttrUniqueValue.java
@@ -60,7 +60,7 @@ public class JPAUPlainAttrUniqueValue extends 
AbstractPlainAttrValue implements
     }
 
     @Override
-    public void setAttr(final PlainAttr attr) {
+    public void setAttr(final PlainAttr<?> attr) {
         checkType(attr, JPAUPlainAttr.class);
         this.attribute = (JPAUPlainAttr) attr;
     }

Reply via email to