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 2015/10/26 10:55:35 UTC

[3/4] syncope git commit: [SYNCOPE-714] Consolidating old buildSchemaNames and buildSupportedObjectClasses into new buildO bjectClassInfo

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConnInstanceTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConnInstanceTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConnInstanceTest.java
index f3ade5e..6033bd4 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConnInstanceTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConnInstanceTest.java
@@ -104,8 +104,8 @@ public class ConnInstanceTest extends AbstractTest {
         conf.add(servicename);
 
         // set connector configuration
-        connInstance.setConfiguration(conf);
-        assertFalse(connInstance.getConfiguration().isEmpty());
+        connInstance.setConf(conf);
+        assertFalse(connInstance.getConf().isEmpty());
 
         // perform save operation
         ConnInstance actual = connInstanceDAO.save(connInstance);
@@ -125,7 +125,7 @@ public class ConnInstanceTest extends AbstractTest {
 
         assertEquals(60, actual.getConnRequestTimeout(), 0);
 
-        conf = connInstance.getConfiguration();
+        conf = connInstance.getConf();
         assertFalse(conf.isEmpty());
 
         assertNotNull("configuration retrieving failed", conf);

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ConnInstanceTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ConnInstanceTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ConnInstanceTest.java
index d9f79fc..f557e8c 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ConnInstanceTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ConnInstanceTest.java
@@ -85,7 +85,7 @@ public class ConnInstanceTest extends AbstractTest {
                 || "ws-target-resource-nopropagation".equalsIgnoreCase(resources.get(2).getKey())
                 || "ws-target-resource-nopropagation".equalsIgnoreCase(resources.get(3).getKey()));
 
-        connInstance.addCapability(ConnectorCapability.SEARCH);
+        connInstance.getCapabilities().add(ConnectorCapability.SEARCH);
 
         connInstance = connInstanceDAO.save(connInstance);
         assertNotNull(connInstance);

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
index d1fde9e..2bc840d 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -580,54 +580,55 @@ under the License.
   <ConnInstance_capabilities ConnInstance_id="108" capability="SYNC"/>
   
   <ExternalResource name="ws-target-resource-1" connector_id="100"
-                    randomPwdIfNotProvided="0" enforceMandatoryCondition="0"
+                    randomPwdIfNotProvided="0" enforceMandatoryCondition="0" overrideCapabilities="0"
                     propagationPriority="0" propagationPrimary="1" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
-                    creator="admin" lastModifier="admin" 
+                    creator="admin" lastModifier="admin"
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
   <ExternalResource name="ws-target-resource-2" connector_id="100"
-                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1"
+                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1" overrideCapabilities="0"
                     propagationPriority="0" propagationPrimary="0" createTraceLevel="FAILURES" deleteTraceLevel="NONE" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     syncPolicy_id="9"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
   <ExternalResource name="ws-target-resource-timeout" connector_id="102"
-                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1"
+                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1" overrideCapabilities="0"
                     propagationPriority="0" propagationPrimary="1" createTraceLevel="FAILURES" deleteTraceLevel="NONE" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     jsonConf='[{"schema":{"name":"endpoint","displayName":null,"helpMessage":null,"type":"java.lang.String","required":true,"order":0,"confidential":false,"defaultValues":null},"overridable":true,"values":["http://localhost:${cargo.servlet.port}/syncope-fit-build-tools/services/provisioning"]}]'
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
   <ExternalResource name="ws-target-resource-list-mappings-1" connector_id="100"
-                    randomPwdIfNotProvided="0" enforceMandatoryCondition="0"
+                    randomPwdIfNotProvided="0" enforceMandatoryCondition="0" overrideCapabilities="0"
                     propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
   <ExternalResource name="ws-target-resource-list-mappings-2" connector_id="100"
-                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1"
+                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1" overrideCapabilities="0"
                     propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
   <ExternalResource name="ws-target-resource-delete" connector_id="102"
-                    randomPwdIfNotProvided="0" enforceMandatoryCondition="0"
+                    randomPwdIfNotProvided="0" enforceMandatoryCondition="0" overrideCapabilities="0"
                     propagationPriority="2" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
   <ExternalResource name="ws-target-resource-update" connector_id="100"
-                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1"
+                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1" overrideCapabilities="0"
                     propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
   <ExternalResource name="resource-testdb" connector_id="101"
-                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1"
+                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1" overrideCapabilities="0"
                     propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
   <ExternalResource name="resource-testdb2" connector_id="106"
-                    randomPwdIfNotProvided="1" enforceMandatoryCondition="1"
+                    randomPwdIfNotProvided="1" enforceMandatoryCondition="1" overrideCapabilities="0"
                     propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
   <ExternalResource name="resource-csv" connector_id="104"
-                    randomPwdIfNotProvided="0" enforceMandatoryCondition="0" syncPolicy_id="3"
+                    randomPwdIfNotProvided="0" enforceMandatoryCondition="0" overrideCapabilities="0"
+                    syncPolicy_id="3"
                     propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
@@ -636,7 +637,7 @@ under the License.
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
   <ExternalResource name="resource-ldap" connector_id="105"
-                    randomPwdIfNotProvided="1" enforceMandatoryCondition="1"
+                    randomPwdIfNotProvided="1" enforceMandatoryCondition="1" overrideCapabilities="0"
                     propagationPriority="0" propagationPrimary="1"
                     createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     creator="admin" lastModifier="admin" 
@@ -644,22 +645,25 @@ under the License.
   <ExternalResource_PropActions resource_name="resource-ldap"
                                 actionClassName="org.apache.syncope.core.provisioning.java.propagation.LDAPMembershipPropagationActions"/>
   <ExternalResource name="ws-target-resource-nopropagation" connector_id="103"
-                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1"
+                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1" overrideCapabilities="0"
                     propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" 
                     passwordPolicy_id="4"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
   
-  <!-- The following three resources has been added to verify the issue SYNCOPE-68 -->
-  <ExternalResource name="ws-target-resource-nopropagation2" connector_id="103" enforceMandatoryCondition="1"
+  <!-- The following three resources have been added to verify the issue SYNCOPE-68 -->
+  <ExternalResource name="ws-target-resource-nopropagation2" connector_id="103" 
+                    enforceMandatoryCondition="1" overrideCapabilities="0"
                     randomPwdIfNotProvided="0" propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
-  <ExternalResource name="ws-target-resource-nopropagation3" connector_id="103" enforceMandatoryCondition="1"
+  <ExternalResource name="ws-target-resource-nopropagation3" connector_id="103" 
+                    enforceMandatoryCondition="1" overrideCapabilities="0"
                     randomPwdIfNotProvided="0" propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
-  <ExternalResource name="ws-target-resource-nopropagation4" connector_id="103" enforceMandatoryCondition="1"
+  <ExternalResource name="ws-target-resource-nopropagation4" connector_id="103" 
+                    enforceMandatoryCondition="1" overrideCapabilities="0"
                     randomPwdIfNotProvided="0" propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
@@ -668,7 +672,7 @@ under the License.
   <ExternalResource name="resource-db-sync" connector_id="107"
                     randomPwdIfNotProvided="0" createTraceLevel="ALL" deleteTraceLevel="ALL" syncTraceLevel="ALL" updateTraceLevel="ALL"
                     enforceMandatoryCondition="0" 
-                    propagationPrimary="0" propagationPriority="0"
+                    propagationPrimary="0" propagationPriority="0" overrideCapabilities="0"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
                     
@@ -676,14 +680,14 @@ under the License.
   <ExternalResource name="resource-db-virattr" connector_id="107"
                     randomPwdIfNotProvided="0" createTraceLevel="ALL" deleteTraceLevel="ALL" syncTraceLevel="ALL" updateTraceLevel="ALL"
                     enforceMandatoryCondition="0" 
-                    propagationPrimary="0" propagationPriority="0"
+                    propagationPrimary="0" propagationPriority="0" overrideCapabilities="0"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
 
   <ExternalResource name="resource-db-scripted" connector_id="108"
                     randomPwdIfNotProvided="0" createTraceLevel="ALL" deleteTraceLevel="ALL" syncTraceLevel="ALL" updateTraceLevel="ALL"
                     enforceMandatoryCondition="0"
-                    propagationPrimary="0" propagationPriority="0"
+                    propagationPrimary="0" propagationPriority="0" overrideCapabilities="0"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnIdBundleManager.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnIdBundleManager.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnIdBundleManager.java
index 186dbbb..242202f 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnIdBundleManager.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnIdBundleManager.java
@@ -31,7 +31,7 @@ import org.identityconnectors.framework.api.ConnectorInfoManager;
  */
 public interface ConnIdBundleManager {
 
-    ConfigurationProperties getConfigurationProperties(final ConnectorInfo info);
+    ConfigurationProperties getConfigurationProperties(ConnectorInfo info);
 
     Map<URI, ConnectorInfoManager> getConnManagers();
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/Connector.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/Connector.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/Connector.java
index ce8adba..2a3a0a1 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/Connector.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/Connector.java
@@ -28,6 +28,7 @@ import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
 import org.identityconnectors.framework.common.objects.Attribute;
 import org.identityconnectors.framework.common.objects.ConnectorObject;
 import org.identityconnectors.framework.common.objects.ObjectClass;
+import org.identityconnectors.framework.common.objects.ObjectClassInfo;
 import org.identityconnectors.framework.common.objects.OperationOptions;
 import org.identityconnectors.framework.common.objects.ResultsHandler;
 import org.identityconnectors.framework.common.objects.SyncResultsHandler;
@@ -134,8 +135,7 @@ public interface Connector {
     ConnectorObject getObject(ObjectClass objectClass, Uid uid, OperationOptions options);
 
     /**
-     * Get remote object used by the propagation manager in order to choose for a create (object doesn't exist) or an
-     * update (object exists).
+     * Get remote object with check for intended operation to perform on external resource.
      *
      * @param operationType resource operation type
      * @param objectClass ConnId's object class
@@ -186,40 +186,11 @@ public interface Connector {
             Iterator<? extends MappingItem> mapItems);
 
     /**
-     * Read attribute for a given connector object.
+     * Builds metadata description of ConnId {@link ObjectClass}.
      *
-     * @param objectClass ConnId's object class
-     * @param uid ConnId's Uid
-     * @param options ConnId's OperationOptions
-     * @param attributeName attribute to read
-     * @return attribute (if present)
-     */
-    Attribute getObjectAttribute(ObjectClass objectClass, Uid uid, OperationOptions options, String attributeName);
-
-    /**
-     * Read attributes for a given connector object.
-     *
-     * @param objectClass ConnId's object class
-     * @param uid ConnId's Uid
-     * @param options ConnId's OperationOptions
-     * @return attributes (if present)
+     * @return metadata description of ConnId ObjectClass
      */
-    Set<Attribute> getObjectAttributes(ObjectClass objectClass, Uid uid, OperationOptions options);
-
-    /**
-     * Return resource schema names.
-     *
-     * @param includeSpecial return special attributes (like as __NAME__ or __PASSWORD__) if true
-     * @return schema names
-     */
-    Set<String> getSchemaNames(boolean includeSpecial);
-
-    /**
-     * Return ConnId's object classes supported by this connector.
-     *
-     * @return supported object classes
-     */
-    Set<ObjectClass> getSupportedObjectClasses();
+    Set<ObjectClassInfo> getObjectClassInfo();
 
     /**
      * Validate a connector instance.
@@ -236,14 +207,5 @@ public interface Connector {
      *
      * @return active connector instance.
      */
-    ConnInstance getActiveConnInstance();
-
-    /**
-     * Build options for requesting all mapped connector attributes.
-     *
-     * @param mapItems mapping items
-     * @return options for requesting all mapped connector attributes
-     * @see OperationOptions
-     */
-    OperationOptions getOperationOptions(Iterator<? extends MappingItem> mapItems);
+    ConnInstance getConnInstance();
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorFactory.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorFactory.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorFactory.java
index 6d2d0c8..4c6dd82 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorFactory.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorFactory.java
@@ -20,7 +20,7 @@ package org.apache.syncope.core.provisioning.api;
 
 import java.util.Set;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
-import org.apache.syncope.core.persistence.api.SyncopeLoader;
+import org.apache.syncope.common.lib.types.ConnectorCapability;
 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 
@@ -29,16 +29,28 @@ import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
  *
  * @see Connector
  */
-public interface ConnectorFactory extends SyncopeLoader {
+public interface ConnectorFactory {
 
     /**
-     * Create connector from given connector instance and configuration properties.
+     * Builds connector instance override over base connector instance, configuration and capabilities override.
+     *
+     * @param connInstance base connector instance
+     * @param confOverride configuration override
+     * @param capabilitiesOverride capabilities override
+     * @return connector instance override over base connector instance, configuration and capabilities override
+     */
+    ConnInstance buildConnInstanceOverride(
+            ConnInstance connInstance,
+            Set<ConnConfProperty> confOverride,
+            Set<ConnectorCapability> capabilitiesOverride);
+
+    /**
+     * Create connector from given connector instance.
      *
      * @param connInstance connector instance
-     * @param configuration configuration properties
      * @return connector
      */
-    Connector createConnector(ConnInstance connInstance, Set<ConnConfProperty> configuration);
+    Connector createConnector(ConnInstance connInstance);
 
     /**
      * Get existing connector for the given resource.
@@ -53,7 +65,6 @@ public interface ConnectorFactory extends SyncopeLoader {
      *
      * @see ExternalResource
      */
-    @Override
     void load();
 
     /**

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorRegistry.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorRegistry.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorRegistry.java
index 1bcbcbc..c1cc547 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorRegistry.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorRegistry.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.core.provisioning.api;
 
-import java.util.Set;
-import org.apache.syncope.common.lib.types.ConnConfProperty;
-import org.apache.syncope.core.persistence.api.entity.ConnInstance;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 
 /**
@@ -29,15 +26,6 @@ import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 public interface ConnectorRegistry {
 
     /**
-     * Returns a connector instance with overridden property values, if found.
-     *
-     * @param connInstance base connector instance
-     * @param overridden overridden property values
-     * @return connector instance with overridden property values, if found
-     */
-    ConnInstance getOverriddenConnInstance(ConnInstance connInstance, Set<ConnConfProperty> overridden);
-
-    /**
      * Create and register into Spring context a bean for the given resource.
      *
      * @param resource external resource

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConnInstanceDataBinder.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConnInstanceDataBinder.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConnInstanceDataBinder.java
index d3496a2..373d1af 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConnInstanceDataBinder.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConnInstanceDataBinder.java
@@ -18,31 +18,19 @@
  */
 package org.apache.syncope.core.provisioning.api.data;
 
-import java.util.Set;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
 import org.apache.syncope.common.lib.types.ConnConfPropSchema;
-import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
 import org.identityconnectors.framework.api.ConfigurationProperty;
 
 public interface ConnInstanceDataBinder {
 
-    ConnConfPropSchema buildConnConfPropSchema(ConfigurationProperty property);
+    ConnConfPropSchema build(ConfigurationProperty property);
 
     ConnInstance getConnInstance(ConnInstanceTO connInstanceTO);
 
     ConnInstanceTO getConnInstanceTO(ConnInstance connInstance);
 
-    /**
-     * Merge connector configuration properties avoiding repetition but giving priority to primary set.
-     *
-     * @param primary primary set.
-     * @param secondary secondary set.
-     * @return merged set.
-     */
-    Set<ConnConfProperty> mergeConnConfProperties(Set<ConnConfProperty> primary,
-            Set<ConnConfProperty> secondary);
-
-    ConnInstance updateConnInstance(long connInstanceId, ConnInstanceTO connInstanceTO);
+    ConnInstance update(long key, ConnInstanceTO connInstanceTO);
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ResourceDataBinder.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ResourceDataBinder.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ResourceDataBinder.java
index 2d96d71..9f1ea5d 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ResourceDataBinder.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ResourceDataBinder.java
@@ -19,17 +19,14 @@
 package org.apache.syncope.core.provisioning.api.data;
 
 import org.apache.syncope.common.lib.to.ResourceTO;
-import org.apache.syncope.core.persistence.api.entity.ConnInstance;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 
 public interface ResourceDataBinder {
 
-    ExternalResource create(ResourceTO resourceTO);
-
-    ConnInstance getConnInstance(ResourceTO resourceTO);
-
     ResourceTO getResourceTO(ExternalResource resource);
 
+    ExternalResource create(ResourceTO resourceTO);
+
     ExternalResource update(ExternalResource resource, ResourceTO resourceTO);
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/AsyncConnectorFacade.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/AsyncConnectorFacade.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/AsyncConnectorFacade.java
index 0b4340e..83a38eb 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/AsyncConnectorFacade.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/AsyncConnectorFacade.java
@@ -18,19 +18,16 @@
  */
 package org.apache.syncope.core.provisioning.java;
 
-import java.util.HashSet;
+import java.util.Collections;
 import java.util.Set;
 import java.util.concurrent.Future;
 import org.identityconnectors.common.security.GuardedString;
 import org.identityconnectors.framework.api.ConnectorFacade;
 import org.identityconnectors.framework.common.objects.Attribute;
-import org.identityconnectors.framework.common.objects.AttributeInfo;
-import org.identityconnectors.framework.common.objects.AttributeUtil;
 import org.identityconnectors.framework.common.objects.ConnectorObject;
 import org.identityconnectors.framework.common.objects.ObjectClass;
 import org.identityconnectors.framework.common.objects.ObjectClassInfo;
 import org.identityconnectors.framework.common.objects.OperationOptions;
-import org.identityconnectors.framework.common.objects.Schema;
 import org.identityconnectors.framework.common.objects.SyncToken;
 import org.identityconnectors.framework.common.objects.Uid;
 import org.slf4j.Logger;
@@ -46,9 +43,6 @@ import org.springframework.stereotype.Component;
 @Component
 public class AsyncConnectorFacade {
 
-    /**
-     * Logger.
-     */
     private static final Logger LOG = LoggerFactory.getLogger(AsyncConnectorFacade.class);
 
     @Async
@@ -111,83 +105,17 @@ public class AsyncConnectorFacade {
     }
 
     @Async
-    public Future<Attribute> getObjectAttribute(
-            final ConnectorFacade connector,
-            final ObjectClass objectClass,
-            final Uid uid,
-            final OperationOptions options,
-            final String attributeName) {
-
-        Attribute attribute = null;
-
-        ConnectorObject object = connector.getObject(objectClass, uid, options);
-        if (object == null) {
-            LOG.debug("Object for '{}' not found", uid.getUidValue());
-        } else {
-            attribute = object.getAttributeByName(attributeName);
-        }
-
-        return new AsyncResult<>(attribute);
-    }
-
-    @Async
-    public Future<Set<Attribute>> getObjectAttributes(
-            final ConnectorFacade connector,
-            final ObjectClass objectClass,
-            final Uid uid,
-            final OperationOptions options) {
-
-        Set<Attribute> attributes = new HashSet<>();
-
-        ConnectorObject object = connector.getObject(objectClass, uid, options);
-
-        if (object == null) {
-            LOG.debug("Object for '{}' not found", uid.getUidValue());
-        } else {
-            for (String attribute : options.getAttributesToGet()) {
-                attributes.add(object.getAttributeByName(attribute));
-            }
-        }
-
-        return new AsyncResult<>(attributes);
-    }
-
-    @Async
-    public Future<Set<String>> getSchemaNames(final ConnectorFacade connector, final boolean includeSpecial) {
-        Set<String> schemaNames = new HashSet<>();
-
-        try {
-            Schema schema = connector.schema();
-            for (ObjectClassInfo info : schema.getObjectClassInfo()) {
-                for (AttributeInfo attrInfo : info.getAttributeInfo()) {
-                    if (includeSpecial || !AttributeUtil.isSpecialName(attrInfo.getName())) {
-                        schemaNames.add(attrInfo.getName());
-                    }
-                }
-            }
-        } catch (Exception e) {
-            // catch exception in order to manage unpredictable behaviors
-            LOG.debug("While reading schema on connector {}", connector, e);
-        }
-
-        return new AsyncResult<>(schemaNames);
-    }
-
-    @Async
-    public Future<Set<ObjectClass>> getSupportedObjectClasses(final ConnectorFacade connector) {
-        Set<ObjectClass> objectClasses = new HashSet<>();
+    public Future<Set<ObjectClassInfo>> getObjectClassInfo(final ConnectorFacade connector) {
+        Set<ObjectClassInfo> result = Collections.emptySet();
 
         try {
-            Schema schema = connector.schema();
-            for (ObjectClassInfo info : schema.getObjectClassInfo()) {
-                objectClasses.add(new ObjectClass(info.getType()));
-            }
+            result = connector.schema().getObjectClassInfo();
         } catch (Exception e) {
             // catch exception in order to manage unpredictable behaviors
             LOG.debug("While reading schema on connector {}", connector, e);
         }
 
-        return new AsyncResult<>(objectClasses);
+        return new AsyncResult<>(result);
     }
 
     @Async

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java
index 6c2be32..a3b865f 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java
@@ -21,7 +21,6 @@ package org.apache.syncope.core.provisioning.java;
 import java.io.File;
 import java.net.URI;
 import java.util.ArrayList;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
@@ -31,8 +30,8 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Transformer;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.common.lib.types.ConnectorCapability;
-import org.apache.syncope.common.lib.types.MappingPurpose;
 import org.apache.syncope.common.lib.types.ResourceOperation;
+import org.apache.syncope.core.misc.MappingUtils;
 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
 import org.apache.syncope.core.provisioning.api.ConnIdBundleManager;
 import org.apache.syncope.core.provisioning.api.ConnPoolConfUtils;
@@ -50,11 +49,10 @@ import org.identityconnectors.framework.api.ConnectorFacadeFactory;
 import org.identityconnectors.framework.api.ConnectorInfo;
 import org.identityconnectors.framework.common.objects.Attribute;
 import org.identityconnectors.framework.common.objects.ConnectorObject;
-import org.identityconnectors.framework.common.objects.Name;
 import org.identityconnectors.framework.common.objects.ObjectClass;
+import org.identityconnectors.framework.common.objects.ObjectClassInfo;
 import org.identityconnectors.framework.common.objects.OperationOptions;
 import org.identityconnectors.framework.common.objects.OperationOptionsBuilder;
-import org.identityconnectors.framework.common.objects.OperationalAttributes;
 import org.identityconnectors.framework.common.objects.ResultsHandler;
 import org.identityconnectors.framework.common.objects.SearchResult;
 import org.identityconnectors.framework.common.objects.SortKey;
@@ -84,7 +82,7 @@ public class ConnectorFacadeProxy implements Connector {
     /**
      * Active connector instance.
      */
-    private final ConnInstance activeConnInstance;
+    private final ConnInstance connInstance;
 
     @Autowired
     private AsyncConnectorFacade asyncFacade;
@@ -92,14 +90,14 @@ public class ConnectorFacadeProxy implements Connector {
     /**
      * Use the passed connector instance to build a ConnectorFacade that will be used to make all wrapped calls.
      *
-     * @param connInstance the connector instance configuration
+     * @param connInstance the connector instance
      * @see ConnectorInfo
      * @see APIConfiguration
      * @see ConfigurationProperties
      * @see ConnectorFacade
      */
     public ConnectorFacadeProxy(final ConnInstance connInstance) {
-        this.activeConnInstance = connInstance;
+        this.connInstance = connInstance;
 
         ConnIdBundleManager connIdBundleManager =
                 ApplicationContextProvider.getBeanFactory().getBean(ConnIdBundleManager.class);
@@ -112,7 +110,7 @@ public class ConnectorFacadeProxy implements Connector {
 
         // set connector configuration according to conninstance's
         ConfigurationProperties properties = apiConfig.getConfigurationProperties();
-        for (ConnConfProperty property : connInstance.getConfiguration()) {
+        for (ConnConfProperty property : connInstance.getConf()) {
             if (property.getValues() != null && !property.getValues().isEmpty()) {
                 properties.setPropertyValue(property.getSchema().getName(),
                         getPropertyValue(property.getSchema().getType(), property.getValues()));
@@ -140,11 +138,11 @@ public class ConnectorFacadeProxy implements Connector {
     public Uid authenticate(final String username, final String password, final OperationOptions options) {
         Uid result = null;
 
-        if (activeConnInstance.getCapabilities().contains(ConnectorCapability.AUTHENTICATE)) {
+        if (connInstance.getCapabilities().contains(ConnectorCapability.AUTHENTICATE)) {
             Future<Uid> future = asyncFacade.authenticate(
                     connector, username, new GuardedString(password.toCharArray()), options);
             try {
-                result = future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
+                result = future.get(connInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
             } catch (java.util.concurrent.TimeoutException e) {
                 future.cancel(true);
                 throw new TimeoutException("Request timeout");
@@ -158,7 +156,7 @@ public class ConnectorFacadeProxy implements Connector {
             }
         } else {
             LOG.info("Authenticate was attempted, although the connector only has these capabilities: {}. No action.",
-                    activeConnInstance.getCapabilities());
+                    connInstance.getCapabilities());
         }
 
         return result;
@@ -173,12 +171,12 @@ public class ConnectorFacadeProxy implements Connector {
 
         Uid result = null;
 
-        if (activeConnInstance.getCapabilities().contains(ConnectorCapability.CREATE)) {
+        if (connInstance.getCapabilities().contains(ConnectorCapability.CREATE)) {
             propagationAttempted[0] = true;
 
             Future<Uid> future = asyncFacade.create(connector, objectClass, attrs, options);
             try {
-                result = future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
+                result = future.get(connInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
             } catch (java.util.concurrent.TimeoutException e) {
                 future.cancel(true);
                 throw new TimeoutException("Request timeout");
@@ -192,7 +190,7 @@ public class ConnectorFacadeProxy implements Connector {
             }
         } else {
             LOG.info("Create was attempted, although the connector only has these capabilities: {}. No action.",
-                    activeConnInstance.getCapabilities());
+                    connInstance.getCapabilities());
         }
 
         return result;
@@ -208,13 +206,13 @@ public class ConnectorFacadeProxy implements Connector {
 
         Uid result = null;
 
-        if (activeConnInstance.getCapabilities().contains(ConnectorCapability.UPDATE)) {
+        if (connInstance.getCapabilities().contains(ConnectorCapability.UPDATE)) {
             propagationAttempted[0] = true;
 
             Future<Uid> future = asyncFacade.update(connector, objectClass, uid, attrs, options);
 
             try {
-                result = future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
+                result = future.get(connInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
             } catch (java.util.concurrent.TimeoutException e) {
                 future.cancel(true);
                 throw new TimeoutException("Request timeout");
@@ -228,7 +226,7 @@ public class ConnectorFacadeProxy implements Connector {
             }
         } else {
             LOG.info("Update for {} was attempted, although the "
-                    + "connector only has these capabilities: {}. No action.", uid.getUidValue(), activeConnInstance.
+                    + "connector only has these capabilities: {}. No action.", uid.getUidValue(), connInstance.
                     getCapabilities());
         }
 
@@ -242,13 +240,13 @@ public class ConnectorFacadeProxy implements Connector {
             final OperationOptions options,
             final Boolean[] propagationAttempted) {
 
-        if (activeConnInstance.getCapabilities().contains(ConnectorCapability.DELETE)) {
+        if (connInstance.getCapabilities().contains(ConnectorCapability.DELETE)) {
             propagationAttempted[0] = true;
 
             Future<Uid> future = asyncFacade.delete(connector, objectClass, uid, options);
 
             try {
-                future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
+                future.get(connInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
             } catch (java.util.concurrent.TimeoutException e) {
                 future.cancel(true);
                 throw new TimeoutException("Request timeout");
@@ -262,7 +260,7 @@ public class ConnectorFacadeProxy implements Connector {
             }
         } else {
             LOG.info("Delete for {} was attempted, although the connector only has these capabilities: {}. No action.",
-                    uid.getUidValue(), activeConnInstance.getCapabilities());
+                    uid.getUidValue(), connInstance.getCapabilities());
         }
     }
 
@@ -270,11 +268,11 @@ public class ConnectorFacadeProxy implements Connector {
     public void sync(final ObjectClass objectClass, final SyncToken token, final SyncResultsHandler handler,
             final OperationOptions options) {
 
-        if (activeConnInstance.getCapabilities().contains(ConnectorCapability.SYNC)) {
+        if (connInstance.getCapabilities().contains(ConnectorCapability.SYNC)) {
             connector.sync(objectClass, token, handler, options);
         } else {
             LOG.info("Sync was attempted, although the connector only has these capabilities: {}. No action.",
-                    activeConnInstance.getCapabilities());
+                    connInstance.getCapabilities());
         }
     }
 
@@ -282,11 +280,11 @@ public class ConnectorFacadeProxy implements Connector {
     public SyncToken getLatestSyncToken(final ObjectClass objectClass) {
         SyncToken result = null;
 
-        if (activeConnInstance.getCapabilities().contains(ConnectorCapability.SYNC)) {
+        if (connInstance.getCapabilities().contains(ConnectorCapability.SYNC)) {
             Future<SyncToken> future = asyncFacade.getLatestSyncToken(connector, objectClass);
 
             try {
-                result = future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
+                result = future.get(connInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
             } catch (java.util.concurrent.TimeoutException e) {
                 future.cancel(true);
                 throw new TimeoutException("Request timeout");
@@ -300,7 +298,7 @@ public class ConnectorFacadeProxy implements Connector {
             }
         } else {
             LOG.info("getLatestSyncToken was attempted, although the "
-                    + "connector only has these capabilities: {}. No action.", activeConnInstance.getCapabilities());
+                    + "connector only has these capabilities: {}. No action.", connInstance.getCapabilities());
         }
 
         return result;
@@ -320,17 +318,17 @@ public class ConnectorFacadeProxy implements Connector {
 
         boolean hasCapablities = false;
 
-        if (activeConnInstance.getCapabilities().contains(ConnectorCapability.SEARCH)) {
+        if (connInstance.getCapabilities().contains(ConnectorCapability.SEARCH)) {
             if (operationType == null) {
                 hasCapablities = true;
             } else {
                 switch (operationType) {
                     case CREATE:
-                        hasCapablities = activeConnInstance.getCapabilities().contains(ConnectorCapability.CREATE);
+                        hasCapablities = connInstance.getCapabilities().contains(ConnectorCapability.CREATE);
                         break;
 
                     case UPDATE:
-                        hasCapablities = activeConnInstance.getCapabilities().contains(ConnectorCapability.UPDATE);
+                        hasCapablities = connInstance.getCapabilities().contains(ConnectorCapability.UPDATE);
                         break;
 
                     default:
@@ -344,11 +342,11 @@ public class ConnectorFacadeProxy implements Connector {
             future = asyncFacade.getObject(connector, objectClass, uid, options);
         } else {
             LOG.info("Search was attempted, although the connector only has these capabilities: {}. No action.",
-                    activeConnInstance.getCapabilities());
+                    connInstance.getCapabilities());
         }
 
         try {
-            return future == null ? null : future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
+            return future == null ? null : future.get(connInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
         } catch (java.util.concurrent.TimeoutException e) {
             if (future != null) {
                 future.cancel(true);
@@ -383,69 +381,10 @@ public class ConnectorFacadeProxy implements Connector {
     }
 
     @Override
-    public Attribute getObjectAttribute(final ObjectClass objectClass, final Uid uid, final OperationOptions options,
-            final String attributeName) {
-
-        Future<Attribute> future = asyncFacade.getObjectAttribute(
-                connector, objectClass, uid, options, attributeName);
-        try {
-            return future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
-        } catch (java.util.concurrent.TimeoutException e) {
-            future.cancel(true);
-            throw new TimeoutException("Request timeout");
-        } catch (Exception e) {
-            LOG.error("Connector request execution failure", e);
-            if (e.getCause() instanceof RuntimeException) {
-                throw (RuntimeException) e.getCause();
-            } else {
-                throw new IllegalArgumentException(e.getCause());
-            }
-        }
-    }
-
-    @Override
-    public Set<Attribute> getObjectAttributes(final ObjectClass objectClass, final Uid uid,
-            final OperationOptions options) {
-
-        Future<Set<Attribute>> future = asyncFacade.getObjectAttributes(connector, objectClass, uid, options);
+    public Set<ObjectClassInfo> getObjectClassInfo() {
+        Future<Set<ObjectClassInfo>> future = asyncFacade.getObjectClassInfo(connector);
         try {
-            return future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
-        } catch (java.util.concurrent.TimeoutException e) {
-            future.cancel(true);
-            throw new TimeoutException("Request timeout");
-        } catch (Exception e) {
-            LOG.error("Connector request execution failure", e);
-            if (e.getCause() instanceof RuntimeException) {
-                throw (RuntimeException) e.getCause();
-            } else {
-                throw new IllegalArgumentException(e.getCause());
-            }
-        }
-    }
-
-    @Override
-    public Set<String> getSchemaNames(final boolean includeSpecial) {
-        Future<Set<String>> future = asyncFacade.getSchemaNames(connector, includeSpecial);
-        try {
-            return future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
-        } catch (java.util.concurrent.TimeoutException e) {
-            future.cancel(true);
-            throw new TimeoutException("Request timeout");
-        } catch (Exception e) {
-            LOG.error("Connector request execution failure", e);
-            if (e.getCause() instanceof RuntimeException) {
-                throw (RuntimeException) e.getCause();
-            } else {
-                throw new IllegalArgumentException(e.getCause());
-            }
-        }
-    }
-
-    @Override
-    public Set<ObjectClass> getSupportedObjectClasses() {
-        Future<Set<ObjectClass>> future = asyncFacade.getSupportedObjectClasses(connector);
-        try {
-            return future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
+            return future.get(connInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
         } catch (java.util.concurrent.TimeoutException e) {
             future.cancel(true);
             throw new TimeoutException("Request timeout");
@@ -463,7 +402,7 @@ public class ConnectorFacadeProxy implements Connector {
     public void validate() {
         Future<String> future = asyncFacade.test(connector);
         try {
-            future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
+            future.get(connInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
         } catch (java.util.concurrent.TimeoutException e) {
             future.cancel(true);
             throw new TimeoutException("Request timeout");
@@ -481,7 +420,7 @@ public class ConnectorFacadeProxy implements Connector {
     public void test() {
         Future<String> future = asyncFacade.test(connector);
         try {
-            future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
+            future.get(connInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
         } catch (java.util.concurrent.TimeoutException e) {
             future.cancel(true);
             throw new TimeoutException("Request timeout");
@@ -502,7 +441,7 @@ public class ConnectorFacadeProxy implements Connector {
             final ResultsHandler handler,
             final OperationOptions options) {
 
-        if (activeConnInstance.getCapabilities().contains(ConnectorCapability.SEARCH)) {
+        if (connInstance.getCapabilities().contains(ConnectorCapability.SEARCH)) {
             if (options.getPageSize() == null && options.getPagedResultsCookie() == null) {
                 OperationOptionsBuilder builder = new OperationOptionsBuilder(options);
                 builder.setPageSize(DEFAULT_PAGE_SIZE);
@@ -534,7 +473,7 @@ public class ConnectorFacadeProxy implements Connector {
             }
         } else {
             LOG.info("Search was attempted, although the connector only has these capabilities: {}. No action.",
-                    activeConnInstance.getCapabilities());
+                    connInstance.getCapabilities());
         }
     }
 
@@ -560,39 +499,14 @@ public class ConnectorFacadeProxy implements Connector {
             }
         }, new ArrayList<SortKey>(orderBy.size())));
 
-        builder.setAttributesToGet(getOperationOptions(mapItems).getAttributesToGet());
+        builder.setAttributesToGet(MappingUtils.buildOperationOptions(mapItems).getAttributesToGet());
 
         search(objectClass, filter, handler, builder.build());
     }
 
     @Override
-    public ConnInstance getActiveConnInstance() {
-        return activeConnInstance;
-    }
-
-    @Override
-    public OperationOptions getOperationOptions(final Iterator<? extends MappingItem> mapItems) {
-        // -------------------------------------
-        // Ask just for mapped attributes
-        // -------------------------------------
-        OperationOptionsBuilder builder = new OperationOptionsBuilder();
-
-        Set<String> attrsToGet = new HashSet<>();
-        attrsToGet.add(Name.NAME);
-        attrsToGet.add(Uid.NAME);
-        attrsToGet.add(OperationalAttributes.ENABLE_NAME);
-
-        while (mapItems.hasNext()) {
-            MappingItem mapItem = mapItems.next();
-            if (mapItem.getPurpose() != MappingPurpose.NONE) {
-                attrsToGet.add(mapItem.getExtAttrName());
-            }
-        }
-
-        builder.setAttributesToGet(attrsToGet);
-        // -------------------------------------
-
-        return builder.build();
+    public ConnInstance getConnInstance() {
+        return connInstance;
     }
 
     private Object getPropertyValue(final String propType, final List<?> values) {
@@ -637,6 +551,6 @@ public class ConnectorFacadeProxy implements Connector {
     @Override
     public String toString() {
         return "ConnectorFacadeProxy{"
-                + "connector=" + connector + "\n" + "capabitilies=" + activeConnInstance.getCapabilities() + '}';
+                + "connector=" + connector + "\n" + "capabitilies=" + connInstance.getCapabilities() + '}';
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java
index a38ba50..1ecc163 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java
@@ -25,8 +25,10 @@ import java.util.Map;
 import java.util.Set;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
+import org.apache.syncope.common.lib.types.ConnectorCapability;
 import org.apache.syncope.core.misc.security.AuthContextUtils;
 import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
+import org.apache.syncope.core.persistence.api.SyncopeLoader;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
 import org.apache.syncope.core.provisioning.api.ConnIdBundleManager;
@@ -42,11 +44,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
-/**
- * Load ConnId connector instances.
- */
 @Component
-public class ConnectorManager implements ConnectorRegistry, ConnectorFactory {
+public class ConnectorManager implements ConnectorRegistry, ConnectorFactory, SyncopeLoader {
 
     private static final Logger LOG = LoggerFactory.getLogger(ConnectorManager.class);
 
@@ -56,6 +55,11 @@ public class ConnectorManager implements ConnectorRegistry, ConnectorFactory {
     @Autowired
     private ExternalResourceDAO resourceDAO;
 
+    @Override
+    public Integer getPriority() {
+        return 100;
+    }
+
     private String getBeanName(final ExternalResource resource) {
         return String.format("connInstance-%s-%d-%s",
                 AuthContextUtils.getDomain(), resource.getConnector().getKey(), resource.getKey());
@@ -72,54 +76,61 @@ public class ConnectorManager implements ConnectorRegistry, ConnectorFactory {
     }
 
     @Override
-    public Connector createConnector(final ConnInstance connInstance, final Set<ConnConfProperty> configuration) {
-        ConnInstance connInstanceClone = SerializationUtils.clone(connInstance);
-
-        connInstanceClone.setConfiguration(configuration);
+    public ConnInstance buildConnInstanceOverride(
+            final ConnInstance connInstance,
+            final Set<ConnConfProperty> confOverride,
+            final Set<ConnectorCapability> capabilitiesOverride) {
 
-        Connector connector = new ConnectorFacadeProxy(connInstanceClone);
-        ApplicationContextProvider.getBeanFactory().autowireBean(connector);
-
-        return connector;
-    }
-
-    @Override
-    public ConnInstance getOverriddenConnInstance(
-            final ConnInstance connInstance, final Set<ConnConfProperty> overridden) {
+        ConnInstance override = SerializationUtils.clone(connInstance);
 
-        Set<ConnConfProperty> configuration = new HashSet<>();
         Map<String, ConnConfProperty> overridable = new HashMap<>();
+        Set<ConnConfProperty> conf = new HashSet<>();
 
-        // add not overridable properties
-        for (ConnConfProperty prop : connInstance.getConfiguration()) {
+        for (ConnConfProperty prop : override.getConf()) {
             if (prop.isOverridable()) {
                 overridable.put(prop.getSchema().getName(), prop);
             } else {
-                configuration.add(prop);
+                conf.add(prop);
             }
         }
 
         // add overridden properties
-        for (ConnConfProperty prop : overridden) {
+        for (ConnConfProperty prop : confOverride) {
             if (overridable.containsKey(prop.getSchema().getName()) && !prop.getValues().isEmpty()) {
-                configuration.add(prop);
+                conf.add(prop);
                 overridable.remove(prop.getSchema().getName());
             }
         }
 
         // add overridable properties not overridden
-        configuration.addAll(overridable.values());
+        conf.addAll(overridable.values());
 
-        connInstance.setConfiguration(configuration);
+        override.setConf(conf);
 
-        return connInstance;
+        // replace capabilities
+        if (capabilitiesOverride != null) {
+            override.getCapabilities().clear();
+            override.getCapabilities().addAll(capabilitiesOverride);
+        }
+
+        return override;
+    }
+
+    @Override
+    public Connector createConnector(final ConnInstance connInstance) {
+        Connector connector = new ConnectorFacadeProxy(connInstance);
+        ApplicationContextProvider.getBeanFactory().autowireBean(connector);
+
+        return connector;
     }
 
     @Override
     public void registerConnector(final ExternalResource resource) {
-        ConnInstance connInstance = getOverriddenConnInstance(
-                SerializationUtils.clone(resource.getConnector()), resource.getConnInstanceConfiguration());
-        Connector connector = createConnector(resource.getConnector(), connInstance.getConfiguration());
+        ConnInstance connInstance = buildConnInstanceOverride(
+                resource.getConnector(),
+                resource.getConfOverride(),
+                resource.isOverrideCapabilities() ? resource.getCapabilitiesOverride() : null);
+        Connector connector = createConnector(connInstance);
         LOG.debug("Connector to be registered: {}", connector);
 
         String beanName = getBeanName(resource);
@@ -137,11 +148,6 @@ public class ConnectorManager implements ConnectorRegistry, ConnectorFactory {
         ApplicationContextProvider.getBeanFactory().destroySingleton(id);
     }
 
-    @Override
-    public Integer getPriority() {
-        return 100;
-    }
-
     @Transactional(readOnly = true)
     @Override
     public void load() {
@@ -171,7 +177,7 @@ public class ConnectorManager implements ConnectorRegistry, ConnectorFactory {
     public void unload() {
         int connectors = 0;
         for (ExternalResource resource : resourceDAO.findAll()) {
-            final String beanName = getBeanName(resource);
+            String beanName = getBeanName(resource);
             if (ApplicationContextProvider.getBeanFactory().containsSingleton(beanName)) {
                 LOG.info("Unegistering resource-connector pair {}-{}", resource, resource.getConnector());
                 unregisterConnector(beanName);

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java
index 5763449..94c68ee 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java
@@ -130,7 +130,7 @@ public class VirAttrHandlerImpl implements VirAttrHandler {
                     ConnectorObject connectorObject = connector.getObject(
                             entry.getKey().getObjectClass(),
                             new Uid(connObjectKey),
-                            connector.getOperationOptions(linkingMappingItems.iterator()));
+                            MappingUtils.buildOperationOptions(linkingMappingItems.iterator()));
 
                     if (connectorObject == null) {
                         LOG.debug("No read from {} about {}", entry.getKey(), connObjectKey);

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java
index 7c28b66..70914ae 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java
@@ -21,8 +21,6 @@ package org.apache.syncope.core.provisioning.java.data;
 import org.apache.syncope.core.provisioning.api.data.ConnInstanceDataBinder;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.SyncopeClientException;
@@ -58,35 +56,6 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
     private EntityFactory entityFactory;
 
     @Override
-    public Set<ConnConfProperty> mergeConnConfProperties(
-            final Set<ConnConfProperty> primary,
-            final Set<ConnConfProperty> secondary) {
-
-        Set<ConnConfProperty> conf = new HashSet<>();
-
-        // to be used to control managed prop (needed by overridden mechanism)
-        Set<String> propertyNames = new HashSet<>();
-
-        // get overridden connector configuration properties
-        for (ConnConfProperty prop : primary) {
-            if (!propertyNames.contains(prop.getSchema().getName())) {
-                conf.add(prop);
-                propertyNames.add(prop.getSchema().getName());
-            }
-        }
-
-        // get connector configuration properties
-        for (ConnConfProperty prop : secondary) {
-            if (!propertyNames.contains(prop.getSchema().getName())) {
-                conf.add(prop);
-                propertyNames.add(prop.getSchema().getName());
-            }
-        }
-
-        return conf;
-    }
-
-    @Override
     public ConnInstance getConnInstance(final ConnInstanceTO connInstanceTO) {
         SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.RequiredValuesMissing);
 
@@ -106,7 +75,7 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
             sce.getElements().add("connectorname");
         }
 
-        if (connInstanceTO.getConfiguration() == null || connInstanceTO.getConfiguration().isEmpty()) {
+        if (connInstanceTO.getConf().isEmpty()) {
             sce.getElements().add("configuration");
         }
 
@@ -130,7 +99,7 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
     }
 
     @Override
-    public ConnInstance updateConnInstance(final long connInstanceId, final ConnInstanceTO connInstanceTO) {
+    public ConnInstance update(final long connInstanceId, final ConnInstanceTO connInstanceTO) {
         SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.RequiredValuesMissing);
 
         if (connInstanceId == 0) {
@@ -157,8 +126,8 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
             connInstance.setConnectorName(connInstanceTO.getConnectorName());
         }
 
-        if (connInstanceTO.getConfiguration() != null && !connInstanceTO.getConfiguration().isEmpty()) {
-            connInstance.setConfiguration(connInstanceTO.getConfiguration());
+        if (connInstanceTO.getConf() != null && !connInstanceTO.getConf().isEmpty()) {
+            connInstance.setConf(connInstanceTO.getConf());
         }
 
         if (connInstanceTO.getDisplayName() != null) {
@@ -184,7 +153,7 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
     }
 
     @Override
-    public ConnConfPropSchema buildConnConfPropSchema(final ConfigurationProperty property) {
+    public ConnConfPropSchema build(final ConfigurationProperty property) {
         ConnConfPropSchema connConfPropSchema = new ConnConfPropSchema();
 
         connConfPropSchema.setName(property.getName());
@@ -219,9 +188,9 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
         ConfigurationProperties properties =
                 connIdBundleManager.getConfigurationProperties(connIdBundleManager.getConnectorInfo(connInstance));
         for (final String propName : properties.getPropertyNames()) {
-            ConnConfPropSchema schema = buildConnConfPropSchema(properties.getProperty(propName));
+            ConnConfPropSchema schema = build(properties.getProperty(propName));
 
-            ConnConfProperty property = CollectionUtils.find(connInstanceTO.getConfiguration(),
+            ConnConfProperty property = CollectionUtils.find(connInstanceTO.getConf(),
                     new Predicate<ConnConfProperty>() {
 
                         @Override
@@ -231,7 +200,7 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
                     });
             if (property == null) {
                 property = new ConnConfProperty();
-                connInstanceTO.getConfiguration().add(property);
+                connInstanceTO.getConf().add(property);
             }
 
             property.setSchema(schema);

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
index 388f099..dff71a0 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
@@ -33,7 +33,6 @@ import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.lib.types.IntMappingType;
 import org.apache.syncope.core.persistence.api.dao.ConnInstanceDAO;
-import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.dao.PolicyDAO;
 import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
@@ -43,7 +42,6 @@ import org.apache.syncope.core.persistence.api.entity.resource.Mapping;
 import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
 import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.SyncPolicy;
-import org.apache.syncope.core.provisioning.api.ConnectorRegistry;
 import org.apache.syncope.core.misc.jexl.JexlUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -68,9 +66,6 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
     private AnyTypeDAO anyTypeDAO;
 
     @Autowired
-    private ConnectorRegistry connRegistry;
-
-    @Autowired
     private ConnInstanceDAO connInstanceDAO;
 
     @Autowired
@@ -100,7 +95,7 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
             resource.setConnector(connector);
 
             if (!connector.getResources().contains(resource)) {
-                connector.addResource(resource);
+                connector.add(resource);
             }
         }
 
@@ -196,7 +191,11 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
         resource.setSyncPolicy(resourceTO.getSyncPolicy() == null
                 ? null : (SyncPolicy) policyDAO.find(resourceTO.getSyncPolicy()));
 
-        resource.setConnInstanceConfiguration(new HashSet<>(resourceTO.getConnConfProperties()));
+        resource.setConfOverride(new HashSet<>(resourceTO.getConfOverride()));
+
+        resource.setOverrideCapabilities(resourceTO.isOverrideCapabilities());
+        resource.getCapabilitiesOverride().clear();
+        resource.getCapabilitiesOverride().addAll(resourceTO.getCapabilitiesOverride());
 
         resource.getPropagationActionsClassNames().clear();
         resource.getPropagationActionsClassNames().addAll(resourceTO.getPropagationActionsClassNames());
@@ -270,17 +269,6 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
         return item;
     }
 
-    @Override
-    public ConnInstance getConnInstance(final ResourceTO resourceTO) {
-        ConnInstance connInstance = connInstanceDAO.find(resourceTO.getConnector());
-        if (connInstance == null) {
-            throw new NotFoundException("Connector '" + resourceTO.getConnector() + "'");
-        }
-
-        final ConnInstance connInstanceClone = SerializationUtils.clone(connInstance);
-        return connRegistry.getOverriddenConnInstance(connInstanceClone, resourceTO.getConnConfProperties());
-    }
-
     private void populateMappingTO(final Mapping mapping, final MappingTO mappingTO) {
         mappingTO.setConnObjectLink(mapping.getConnObjectLink());
 
@@ -367,7 +355,10 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
         resourceTO.setSyncPolicy(resource.getSyncPolicy() == null
                 ? null : resource.getSyncPolicy().getKey());
 
-        resourceTO.getConnConfProperties().addAll(resource.getConnInstanceConfiguration());
+        resourceTO.getConfOverride().addAll(resource.getConfOverride());
+
+        resourceTO.setOverrideCapabilities(resource.isOverrideCapabilities());
+        resourceTO.getCapabilitiesOverride().addAll(resource.getCapabilitiesOverride());
 
         resourceTO.getPropagationActionsClassNames().addAll(resource.getPropagationActionsClassNames());
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
index 316f91a..c083187 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
@@ -566,7 +566,7 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
                     task.getOperation(),
                     new ObjectClass(task.getObjectClassName()),
                     new Uid(connObjectKey),
-                    connector.getOperationOptions(IteratorUtils.chainedIterator(
+                    MappingUtils.buildOperationOptions(IteratorUtils.chainedIterator(
                                     MappingUtils.getPropagationMappingItems(provision).iterator(),
                                     linkingMappingItems.iterator())));
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java
index 6b4760b..6910c19 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java
@@ -88,7 +88,7 @@ public class DBPasswordPropagationActions extends DefaultPropagationActions {
 
     private String getCipherAlgorithm(final ConnInstance connInstance) {
         ConnConfProperty cipherAlgorithm =
-                CollectionUtils.find(connInstance.getConfiguration(), new Predicate<ConnConfProperty>() {
+                CollectionUtils.find(connInstance.getConf(), new Predicate<ConnConfProperty>() {
 
                     @Override
                     public boolean evaluate(final ConnConfProperty property) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java
index 870be79..3ba0dc9 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java
@@ -94,7 +94,7 @@ public class LDAPPasswordPropagationActions extends DefaultPropagationActions {
 
     private String getCipherAlgorithm(final ConnInstance connInstance) {
         ConnConfProperty cipherAlgorithm =
-                CollectionUtils.find(connInstance.getConfiguration(), new Predicate<ConnConfProperty>() {
+                CollectionUtils.find(connInstance.getConf(), new Predicate<ConnConfProperty>() {
 
                     @Override
                     public boolean evaluate(final ConnConfProperty property) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractPushResultHandler.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractPushResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractPushResultHandler.java
index dcce5e5..e0d3d59 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractPushResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractPushResultHandler.java
@@ -134,7 +134,7 @@ public abstract class AbstractPushResultHandler extends AbstractSyncopeResultHan
             obj = profile.getConnector().getObject(
                     objectClass,
                     uid,
-                    profile.getConnector().getOperationOptions(IteratorUtils.<MappingItem>emptyIterator()));
+                    MappingUtils.buildOperationOptions(IteratorUtils.<MappingItem>emptyIterator()));
         } catch (TimeoutException toe) {
             LOG.debug("Request timeout", toe);
             throw toe;

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DBPasswordSyncActions.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DBPasswordSyncActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DBPasswordSyncActions.java
index ec7fb2e..35e50f9 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DBPasswordSyncActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DBPasswordSyncActions.java
@@ -91,7 +91,7 @@ public class DBPasswordSyncActions extends DefaultSyncActions {
 
     private void parseEncodedPassword(final String password, final Connector connector) {
         if (password != null) {
-            ConnInstance connInstance = connector.getActiveConnInstance();
+            ConnInstance connInstance = connector.getConnInstance();
 
             String cipherAlgorithm = getCipherAlgorithm(connInstance);
             if (!CLEARTEXT.equals(cipherAlgorithm)) {
@@ -108,7 +108,7 @@ public class DBPasswordSyncActions extends DefaultSyncActions {
 
     private String getCipherAlgorithm(final ConnInstance connInstance) {
         ConnConfProperty cipherAlgorithm =
-                CollectionUtils.find(connInstance.getConfiguration(), new Predicate<ConnConfProperty>() {
+                CollectionUtils.find(connInstance.getConf(), new Predicate<ConnConfProperty>() {
 
                     @Override
                     public boolean evaluate(final ConnConfProperty property) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPMembershipSyncActions.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPMembershipSyncActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPMembershipSyncActions.java
index 430d06d..59e8c42 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPMembershipSyncActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPMembershipSyncActions.java
@@ -55,6 +55,7 @@ import org.apache.syncope.core.persistence.api.entity.user.UMembership;
 import org.apache.syncope.core.provisioning.api.notification.NotificationManager;
 import org.apache.syncope.core.workflow.api.UserWorkflowAdapter;
 import org.identityconnectors.framework.common.objects.Attribute;
+import org.identityconnectors.framework.common.objects.ConnectorObject;
 import org.identityconnectors.framework.common.objects.ObjectClass;
 import org.identityconnectors.framework.common.objects.OperationOptionsBuilder;
 import org.identityconnectors.framework.common.objects.SyncDelta;
@@ -109,7 +110,7 @@ public class LDAPMembershipSyncActions extends DefaultSyncActions {
      * @return the name of the attribute used to keep track of group memberships
      */
     protected String getGroupMembershipAttrName(final Connector connector) {
-        ConnConfProperty groupMembership = CollectionUtils.find(connector.getActiveConnInstance().getConfiguration(),
+        ConnConfProperty groupMembership = CollectionUtils.find(connector.getConnInstance().getConf(),
                 new Predicate<ConnConfProperty>() {
 
                     @Override
@@ -196,7 +197,12 @@ public class LDAPMembershipSyncActions extends DefaultSyncActions {
         if (membAttr == null) {
             OperationOptionsBuilder oob = new OperationOptionsBuilder();
             oob.setAttributesToGet(groupMemberName);
-            membAttr = connector.getObjectAttribute(ObjectClass.GROUP, delta.getUid(), oob.build(), groupMemberName);
+            ConnectorObject remoteObj = connector.getObject(ObjectClass.GROUP, delta.getUid(), oob.build());
+            if (remoteObj == null) {
+                LOG.debug("Object for '{}' not found", delta.getUid().getUidValue());
+            } else {
+                membAttr = remoteObj.getAttributeByName(groupMemberName);
+            }
         }
         if (membAttr != null && membAttr.getValue() != null) {
             result = membAttr.getValue();

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncJobDelegate.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncJobDelegate.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncJobDelegate.java
index 890cece..d3a4a4d 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncJobDelegate.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncJobDelegate.java
@@ -27,6 +27,7 @@ import java.util.Set;
 import org.apache.commons.collections4.IteratorUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.policy.SyncPolicySpec;
+import org.apache.syncope.core.misc.MappingUtils;
 import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
@@ -185,13 +186,13 @@ public class SyncJobDelegate extends AbstractProvisioningJobDelegate<SyncTask> {
                         connector.getAllObjects(
                                 provision.getObjectClass(),
                                 handler,
-                                connector.getOperationOptions(mapItems));
+                                MappingUtils.buildOperationOptions(mapItems));
                     } else {
                         connector.sync(
                                 provision.getObjectClass(),
                                 provision.getSyncToken(),
                                 handler,
-                                connector.getOperationOptions(mapItems));
+                                MappingUtils.buildOperationOptions(mapItems));
                     }
 
                     if (!dryRun && !syncTask.isFullReconciliation()) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java
index eefccad..4fa504e 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java
@@ -128,7 +128,7 @@ public class SyncUtils {
                         return found.add(obj);
                     }
                 },
-                connector.getOperationOptions(MappingUtils.getSyncMappingItems(provision).iterator()));
+                MappingUtils.buildOperationOptions(MappingUtils.getSyncMappingItems(provision).iterator()));
 
         if (found.isEmpty()) {
             LOG.debug("No {} found on {} with __NAME__ {}", provision.getObjectClass(), resource, name);

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConnectorServiceImpl.java
----------------------------------------------------------------------
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConnectorServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConnectorServiceImpl.java
index ac0694d..c64a02d 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConnectorServiceImpl.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConnectorServiceImpl.java
@@ -24,10 +24,8 @@ import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.to.BulkAction;
 import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.to.ConnBundleTO;
+import org.apache.syncope.common.lib.to.ConnIdObjectClassTO;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
-import org.apache.syncope.common.lib.to.PlainSchemaTO;
-import org.apache.syncope.common.lib.wrap.ConnIdObjectClass;
-import org.apache.syncope.common.rest.api.CollectionWrapper;
 import org.apache.syncope.common.rest.api.RESTHeaders;
 import org.apache.syncope.common.rest.api.service.ConnectorService;
 import org.apache.syncope.core.logic.ConnectorLogic;
@@ -60,13 +58,10 @@ public class ConnectorServiceImpl extends AbstractServiceImpl implements Connect
     }
 
     @Override
-    public List<PlainSchemaTO> buildSchemaNames(final ConnInstanceTO connInstanceTO, final boolean includeSpecial) {
-        return logic.buildSchemaNames(connInstanceTO, includeSpecial);
-    }
+    public List<ConnIdObjectClassTO> buildObjectClassInfo(
+            final ConnInstanceTO connInstanceTO, final boolean includeSpecial) {
 
-    @Override
-    public List<ConnIdObjectClass> buildSupportedObjectClasses(final ConnInstanceTO connInstanceTO) {
-        return CollectionWrapper.wrap(logic.buildSupportedObjectClasses(connInstanceTO), ConnIdObjectClass.class);
+        return logic.buildObjectClassInfo(connInstanceTO, includeSpecial);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java
----------------------------------------------------------------------
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java
index 32ae12c..b8a9fa7 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java
@@ -25,7 +25,7 @@ import org.apache.syncope.common.lib.to.EventCategoryTO;
 import org.apache.syncope.common.lib.to.LoggerTO;
 import org.apache.syncope.common.lib.types.AuditLoggerName;
 import org.apache.syncope.common.lib.types.LoggerType;
-import org.apache.syncope.common.rest.api.CollectionWrapper;
+import org.apache.syncope.common.rest.api.LoggerWrapper;
 import org.apache.syncope.common.rest.api.service.LoggerService;
 import org.apache.syncope.core.logic.LoggerLogic;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -66,7 +66,7 @@ public class LoggerServiceImpl extends AbstractServiceImpl implements LoggerServ
 
             case AUDIT:
                 List<AuditLoggerName> auditLogger = logic.listAudits();
-                return CollectionWrapper.unwrapLogger(auditLogger);
+                return LoggerWrapper.unwrap(auditLogger);
 
             default:
                 throw new BadRequestException();