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 2019/12/20 13:11:39 UTC

[syncope] 02/02: [SYNCOPE-1517] Initial changes

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

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

commit b33cc1415e4fa4b8953a27c789888b94fe185331
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Fri Dec 20 14:11:19 2019 +0100

    [SYNCOPE-1517] Initial changes
---
 .../client/console/audit/AuditHistoryDetails.java  |  127 +
 .../console/audit/AuditHistoryDirectoryPanel.java  |  241 +-
 .../client/console/audit/AuditHistoryModal.java    |   42 +-
 .../client/console/audit/HistoryAuditDetails.java  |  232 --
 .../console/panels/AnyObjectDirectoryPanel.java    |   93 +-
 .../console/panels/AnyTypeClassDetailsPanel.java   |    7 -
 .../ConnInstanceHistoryConfDirectoryPanel.java     |  229 --
 .../client/console/panels/DirectoryPanel.java      |    5 +-
 .../client/console/panels/GroupDirectoryPanel.java |   79 +-
 .../client/console/panels/HistoryConfDetails.java  |  247 --
 .../client/console/panels/HistoryConfList.java     |   74 -
 .../console/panels/LinkedAccountModalPanel.java    |    6 +-
 .../panels/ResourceHistoryConfDirectoryPanel.java  |  230 --
 .../client/console/panels/UserDirectoryPanel.java  |  106 +-
 .../console/policies/PolicyRuleDirectoryPanel.java |    3 -
 .../console/policies/PolicyRuleWizardBuilder.java  |    3 +-
 .../policies/ProvisioningPolicyModalPanel.java     |    3 +-
 .../console/reports/ReportletDirectoryPanel.java   |    3 -
 .../console/reports/ReportletWizardBuilder.java    |    3 +-
 .../console/rest/AuditHistoryRestClient.java       |   60 +-
 .../console/rest/ConnectorHistoryRestClient.java   |   50 -
 .../console/rest/ResourceHistoryRestClient.java    |   50 -
 .../console/topology/TopologyTogglePanel.java      |   88 +-
 .../repeater/data/table/AjaxFallbackDataTable.java |   12 +-
 .../wicket/markup/html/form/ActionLink.java        |    1 -
 .../wicket/markup/html/form/ActionsPanel.java      |   12 +-
 .../syncope/client/console/wizards/AjaxWizard.java |    3 +-
 .../client/console/wizards/WizardMgtPanel.java     |    4 +-
 .../console/wizards/any/AnyObjectWrapper.java      |    1 -
 .../client/console/wizards/any/AnyWrapper.java     |    1 -
 ...yAuditDetails.html => AuditHistoryDetails.html} |    8 +-
 ...s.properties => AuditHistoryDetails.properties} |    4 +-
 ...erties => AuditHistoryDetails_fr_CA.properties} |    6 +-
 ...roperties => AuditHistoryDetails_it.properties} |    6 +-
 ...roperties => AuditHistoryDetails_ja.properties} |    4 +-
 ...erties => AuditHistoryDetails_pt_BR.properties} |    4 +-
 ...roperties => AuditHistoryDetails_ru.properties} |    4 +-
 .../console/audit/AuditHistoryModal.properties     |    2 +-
 ...operties => AuditHistoryModal_fr_CA.properties} |    2 +-
 .../console/audit/AuditHistoryModal_it.properties  |    2 +-
 .../console/audit/AuditHistoryModal_ja.properties  |    2 +-
 .../audit/AuditHistoryModal_pt_BR.properties       |    2 +-
 .../console/audit/AuditHistoryModal_ru.properties  |    2 +-
 .../audit/HistoryAuditDetails_it.properties        |   19 -
 .../client/console/panels/HistoryConfDetails.html  |   29 -
 .../console/panels/HistoryConfDetails.properties   |   23 -
 .../panels/HistoryConfDetails_fr_CA.properties     |   23 -
 .../panels/HistoryConfDetails_it.properties        |   23 -
 .../panels/HistoryConfDetails_ja.properties        |   23 -
 .../panels/HistoryConfDetails_pt_BR.properties     |   23 -
 .../panels/HistoryConfDetails_ru.properties        |   23 -
 .../client/console/panels/HistoryConfList.html     |   23 -
 .../console/panels/HistoryConfList.properties      |   21 -
 .../panels/HistoryConfList_fr_CA.properties        |   21 -
 .../console/panels/HistoryConfList_it.properties   |   21 -
 .../console/panels/HistoryConfList_ja.properties   |   21 -
 .../panels/HistoryConfList_pt_BR.properties        |   21 -
 .../console/panels/HistoryConfList_ru.properties   |   21 -
 .../markup/html/form/ActionsPanel.properties       |   12 +-
 .../markup/html/form/ActionsPanel_fr_CA.properties |  196 +-
 .../markup/html/form/ActionsPanel_it.properties    |    9 +-
 .../markup/html/form/ActionsPanel_ja.properties    |   11 +-
 .../markup/html/form/ActionsPanel_pt_BR.properties |   15 +-
 .../markup/html/form/ActionsPanel_ru.properties    |   15 +-
 .../syncope/common/lib/to/AbstractHistoryConf.java |   70 -
 .../common/lib/to/ConnInstanceHistoryConfTO.java   |   40 -
 .../common/lib/to/ResourceHistoryConfTO.java       |   39 -
 .../common/lib/types/StandardEntitlement.java      |   12 -
 .../rest/api/service/ConnectorHistoryService.java  |   82 -
 .../rest/api/service/ResourceHistoryService.java   |   82 -
 .../syncope/core/logic/ConnectorHistoryLogic.java  |   98 -
 .../syncope/core/logic/ResourceHistoryLogic.java   |   98 -
 .../api/dao/ConnInstanceHistoryConfDAO.java        |   36 -
 .../api/dao/ExternalResourceHistoryConfDAO.java    |   36 -
 .../api/entity/ConnInstanceHistoryConf.java        |   24 -
 .../core/persistence/api/entity/HistoryConf.java   |   41 -
 .../resource/ExternalResourceHistoryConf.java      |   25 -
 .../src/main/resources/domains/MasterContent.xml   |   11 +-
 .../src/test/resources/domains/MasterContent.xml   |   26 +-
 .../persistence/jpa/dao/JPAConnInstanceDAO.java    |    6 -
 .../jpa/dao/JPAConnInstanceHistoryConfDAO.java     |   71 -
 .../jpa/dao/JPAExternalResourceDAO.java            |    6 -
 .../jpa/dao/JPAExternalResourceHistoryConfDAO.java |   71 -
 .../jpa/entity/AbstractHistoryConf.java            |   76 -
 .../jpa/entity/JPAConnInstanceHistoryConf.java     |   59 -
 .../persistence/jpa/entity/JPAEntityFactory.java   |    7 -
 .../resource/JPAExternalResourceHistoryConf.java   |   60 -
 .../src/main/resources/domains/MasterContent.xml   |   17 -
 .../persistence/jpa/inner/PlainSchemaTest.java     |    2 +-
 .../jpa/outer/ConnInstanceHistoryConfTest.java     |   74 -
 .../jpa/outer/ResourceHistoryConfTest.java         |   74 -
 .../src/test/resources/domains/MasterContent.xml   |   32 +-
 .../api/data/ConnInstanceDataBinder.java           |    5 -
 .../provisioning/api/data/ResourceDataBinder.java  |    4 -
 .../java/data/ConnInstanceDataBinderImpl.java      |   42 -
 .../java/data/ResourceDataBinderImpl.java          |   43 -
 .../cxf/service/ConnectorHistoryServiceImpl.java   |   49 -
 .../cxf/service/ResourceHistoryServiceImpl.java    |   49 -
 core/upgrade/src/main/resources/schema.xml         | 2537 +++++++++++---------
 .../main/resources/domains/MasterContent.xml.all   |   17 -
 .../resources/domains/MasterContent.xml.myjson     |   11 +-
 .../resources/domains/MasterContent.xml.pgjsonb    |   11 +-
 .../org/apache/syncope/fit/AbstractITCase.java     |   10 +-
 .../syncope/fit/console/AbstractTypesITCase.java   |    1 -
 .../syncope/fit/console/AnyObjectsITCase.java      |    2 +-
 .../apache/syncope/fit/console/BatchesITCase.java  |   10 +-
 .../apache/syncope/fit/console/GroupsITCase.java   |    4 +-
 .../apache/syncope/fit/console/PoliciesITCase.java |    2 +-
 .../apache/syncope/fit/console/UsersITCase.java    |    8 +-
 .../syncope/fit/core/AbstractTaskITCase.java       |    4 +-
 .../org/apache/syncope/fit/core/AuditITCase.java   |   78 +-
 .../syncope/fit/core/AuthenticationITCase.java     |    6 +-
 .../apache/syncope/fit/core/ConnectorITCase.java   |   38 -
 .../org/apache/syncope/fit/core/GroupITCase.java   |    3 +-
 .../syncope/fit/core/LinkedAccountITCase.java      |    9 +-
 .../apache/syncope/fit/core/MembershipITCase.java  |    4 +-
 .../syncope/fit/core/MultitenancyITCase.java       |    2 +-
 .../apache/syncope/fit/core/PullTaskITCase.java    |   72 +-
 .../apache/syncope/fit/core/PushTaskITCase.java    |   28 +-
 .../org/apache/syncope/fit/core/ReportITCase.java  |    9 +-
 .../apache/syncope/fit/core/SchedTaskITCase.java   |   11 +-
 .../apache/syncope/fit/core/UserIssuesITCase.java  |    2 +-
 .../apache/syncope/fit/core/UserSelfITCase.java    |   12 +-
 .../org/apache/syncope/fit/core/VirAttrITCase.java |   12 +-
 .../concepts/externalresources.adoc                |   15 -
 .../configurationparameters.adoc                   |    4 -
 126 files changed, 2227 insertions(+), 4818 deletions(-)

diff --git a/client/console/src/main/java/org/apache/syncope/client/console/audit/AuditHistoryDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/audit/AuditHistoryDetails.java
new file mode 100644
index 0000000..cf37124
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/audit/AuditHistoryDetails.java
@@ -0,0 +1,127 @@
+/*
+ * 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.client.console.audit;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.util.Date;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.panels.MultilevelPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.JsonDiffPanel;
+import org.apache.syncope.common.lib.to.AbstractAnnotatedBean;
+import org.apache.syncope.common.lib.to.AuditEntryTO;
+import org.apache.syncope.common.lib.to.EntityTO;
+import org.apache.syncope.common.lib.to.UserTO;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.WicketRuntimeException;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.model.Model;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class AuditHistoryDetails<T extends EntityTO> extends MultilevelPanel.SecondLevel {
+
+    private static final long serialVersionUID = -7400543686272100483L;
+
+    private static final Logger LOG = LoggerFactory.getLogger(AuditHistoryDetails.class);
+
+    private static final ObjectMapper MAPPER = new ObjectMapper();
+
+    private static final String KEY_CURRENT = "current";
+
+    public AuditHistoryDetails(
+            final MultilevelPanel mlp,
+            final AuditEntryTO selected,
+            final T currentEntity,
+            final String auditRestoreEntitlement,
+            final PageReference pageRef) {
+
+        super();
+
+        AuditEntryTO current = new AuditEntryTO();
+        current.setKey(KEY_CURRENT);
+        if (currentEntity instanceof AbstractAnnotatedBean) {
+            current.setWho(((AbstractAnnotatedBean) currentEntity).getCreator());
+            current.setDate(((AbstractAnnotatedBean) currentEntity).getCreationDate());
+        } else {
+            current.setWho(SyncopeConsoleSession.get().getSelfTO().getUsername());
+            current.setDate(new Date());
+        }
+        try {
+            current.setBefore(MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(currentEntity));
+        } catch (JsonProcessingException e) {
+            LOG.error("While serializing current entity", e);
+            throw new WicketRuntimeException(e);
+        }
+
+        add(new Label("current", getString("current")));
+        add(new Label("previous", getString("previous")));
+
+        @SuppressWarnings("unchecked")
+        Class<T> reference = (Class<T>) currentEntity.getClass();
+        add(new JsonDiffPanel(null, toJSON(current, reference), toJSON(selected, reference), null) {
+
+            private static final long serialVersionUID = 2087989787864619493L;
+
+            @Override
+            public void onSubmit(final AjaxRequestTarget target) {
+                modal.close(target);
+            }
+        });
+
+        AjaxLink<Void> restore = new AjaxLink<Void>("restore") {
+
+            private static final long serialVersionUID = -817438685948164787L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target) {
+                restore(currentEntity, target);
+
+                mlp.prev(target);
+            }
+        };
+        MetaDataRoleAuthorizationStrategy.authorize(restore, RENDER, auditRestoreEntitlement);
+        add(restore);
+    }
+
+    protected abstract void restore(T entity, AjaxRequestTarget target);
+
+    private Model<String> toJSON(final AuditEntryTO auditEntry, final Class<T> reference) {
+        try {
+            String content = auditEntry.getBefore() == null
+                    ? MAPPER.readTree(auditEntry.getOutput()).get("entity").toPrettyString()
+                    : auditEntry.getBefore();
+
+            T entity = MAPPER.readValue(content, reference);
+            if (entity instanceof UserTO) {
+                UserTO userTO = (UserTO) entity;
+                userTO.setPassword(null);
+                userTO.setSecurityAnswer(null);
+            }
+
+            return Model.of(MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(entity));
+        } catch (Exception e) {
+            LOG.error("While (de)serializing entity {}", auditEntry, e);
+            throw new WicketRuntimeException(e);
+        }
+    }
+}
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/audit/AuditHistoryDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/audit/AuditHistoryDirectoryPanel.java
index 62bb700..ee2066e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/audit/AuditHistoryDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/audit/AuditHistoryDirectoryPanel.java
@@ -18,49 +18,30 @@
  */
 package org.apache.syncope.client.console.audit;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
-import java.util.stream.Collectors;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.console.audit.AuditHistoryDirectoryPanel.AuditHistoryProvider;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.commons.DirectoryDataProvider;
-import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.panels.AjaxDataTablePanel;
 import org.apache.syncope.client.console.panels.DirectoryPanel;
 import org.apache.syncope.client.console.panels.ModalPanel;
 import org.apache.syncope.client.console.panels.MultilevelPanel;
-import org.apache.syncope.client.console.rest.AnyObjectRestClient;
 import org.apache.syncope.client.console.rest.AuditHistoryRestClient;
-import org.apache.syncope.client.console.rest.GroupRestClient;
-import org.apache.syncope.client.console.rest.UserRestClient;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.DatePropertyColumn;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel;
-import org.apache.syncope.common.lib.AnyOperations;
-import org.apache.syncope.common.lib.patch.AnyObjectPatch;
-import org.apache.syncope.common.lib.patch.GroupPatch;
-import org.apache.syncope.common.lib.patch.UserPatch;
-import org.apache.syncope.common.lib.to.AnyObjectTO;
-import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.AuditEntryTO;
-import org.apache.syncope.common.lib.to.GroupTO;
-import org.apache.syncope.common.lib.to.ProvisioningResult;
-import org.apache.syncope.common.lib.to.UserTO;
-import org.apache.syncope.common.lib.types.AnyTypeKind;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.types.AuditElements;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
@@ -68,92 +49,54 @@ import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.StringResourceModel;
 
-public class AuditHistoryDirectoryPanel extends
-        DirectoryPanel<AuditEntryTO, AuditEntryTO, AuditHistoryProvider, AuditHistoryRestClient>
+public abstract class AuditHistoryDirectoryPanel<T extends EntityTO> extends DirectoryPanel<
+        AuditEntryTO, AuditEntryTO, AuditHistoryDirectoryPanel<T>.AuditHistoryProvider, AuditHistoryRestClient>
         implements ModalPanel {
 
     private static final long serialVersionUID = -8248734710505211261L;
 
-    private static final int TOTAL_AUDIT_HISTORY_COMPARISONS = 25;
+    private static final List<String> EVENTS = Arrays.asList("create", "update");
 
-    protected static final ObjectMapper MAPPER = new ObjectMapper();
+    private static final SortParam<String> REST_SORT = new SortParam<>("event_date", false);
 
     private final BaseModal<?> baseModal;
 
-    private final MultilevelPanel multiLevelPanelRef;
+    private final MultilevelPanel mlp;
 
-    private final AnyTO anyTO;
+    private final AuditElements.EventCategoryType type;
 
-    private final AnyTypeKind anyTypeKind;
+    private final String category;
+
+    private final T entity;
+
+    private final String auditRestoreEntitlement;
 
     public AuditHistoryDirectoryPanel(
             final BaseModal<?> baseModal,
-            final MultilevelPanel multiLevelPanelRef,
-            final PageReference pageRef,
-            final AnyTO anyTO) {
+            final MultilevelPanel mlp,
+            final AuditElements.EventCategoryType type,
+            final String category,
+            final T entity,
+            final String auditRestoreEntitlement,
+            final PageReference pageRef) {
 
         super(MultilevelPanel.FIRST_LEVEL_ID, pageRef);
         disableCheckBoxes();
 
         this.baseModal = baseModal;
-        this.multiLevelPanelRef = multiLevelPanelRef;
-        this.anyTO = anyTO;
-        this.anyTypeKind = AnyTypeKind.fromTOClass(anyTO.getClass());
+        this.mlp = mlp;
+        this.type = type;
+        this.category = category;
+        this.entity = entity;
+        this.auditRestoreEntitlement = auditRestoreEntitlement;
+        this.pageRef = pageRef;
 
         this.restClient = new AuditHistoryRestClient();
         initResultTable();
     }
 
-    /**
-     * Restore an object based on the audit record.Note that for user objects, the original audit record masks
-     * the password and the security answer; so we cannot use the audit record to resurrect the entry based on mask
-     * data.
-     *
-     * The method behavior below will reset the audit record such that the current security answer and the password for
-     * the object are always maintained, and such properties for the user cannot be restored using audit records.
-     *
-     * @param json the object from audit
-     * @param anyTO the any to
-     * @return the response
-     * @throws JsonProcessingException if json value cannot be parsed
-     */
-    protected ProvisioningResult<? extends AnyTO> restore(final String json, final AnyTO anyTO)
-            throws JsonProcessingException {
-
-        if (anyTO instanceof UserTO) {
-            UserTO userTO = MAPPER.readValue(json, UserTO.class);
-            UserPatch userPatch = AnyOperations.diff(userTO, anyTO, false);
-            userPatch.setPassword(null);
-            userPatch.setSecurityAnswer(null);
-            return new UserRestClient().update(anyTO.getETagValue(), userPatch);
-        }
-        if (anyTO instanceof GroupTO) {
-            GroupTO groupTO = MAPPER.readValue(json, GroupTO.class);
-            GroupPatch groupPatch = AnyOperations.diff(groupTO, anyTO, false);
-            return new GroupRestClient().update(anyTO.getETagValue(), groupPatch);
-        }
-        if (anyTO instanceof AnyObjectTO) {
-            AnyObjectTO anyObjectTO = MAPPER.readValue(json, AnyObjectTO.class);
-            AnyObjectPatch anyObjectPatch = AnyOperations.diff(anyObjectTO, anyTO, false);
-            return new AnyObjectRestClient().update(anyTO.getETagValue(), anyObjectPatch);
-        }
-        throw new UnsupportedOperationException("Restore not supported for " + anyTO.getClass().getName());
-    }
-
-    private static SortParam<String> getSortParam() {
-        return new SortParam<>("event_date", false);
-    }
-
-    private static AuditElements.Result getQueryableAuditResult() {
-        return AuditElements.Result.SUCCESS;
-    }
-
-    private static List<String> getQueryableAuditEvents() {
-        return Arrays.asList("create", "update");
-    }
-
     @Override
-    protected AuditHistoryDirectoryPanel.AuditHistoryProvider dataProvider() {
+    protected AuditHistoryDirectoryPanel<T>.AuditHistoryProvider dataProvider() {
         return new AuditHistoryProvider(rows);
     }
 
@@ -164,20 +107,19 @@ public class AuditHistoryDirectoryPanel extends
 
     @Override
     protected List<IColumn<AuditEntryTO, String>> getColumns() {
-        final List<IColumn<AuditEntryTO, String>> columns = new ArrayList<>();
-        columns.add(new PropertyColumn<>(
-                new StringResourceModel("who", this), "who"));
-        columns.add(new DatePropertyColumn<>(
-                new StringResourceModel("date", this), null, "date"));
+        List<IColumn<AuditEntryTO, String>> columns = new ArrayList<>();
+        columns.add(new PropertyColumn<>(new StringResourceModel("who", this), "who"));
+        columns.add(new DatePropertyColumn<>(new StringResourceModel("date", this), null, "date"));
         return columns;
     }
 
     @Override
-    protected void resultTableCustomChanges(
-            final AjaxDataTablePanel.Builder<AuditEntryTO, String> resultTableBuilder) {
-        resultTableBuilder.setMultiLevelPanel(baseModal, multiLevelPanelRef);
+    protected void resultTableCustomChanges(final AjaxDataTablePanel.Builder<AuditEntryTO, String> resultTableBuilder) {
+        resultTableBuilder.setMultiLevelPanel(baseModal, mlp);
     }
 
+    protected abstract void restore(T entity, AjaxRequestTarget target);
+
     @Override
     protected ActionsPanel<AuditEntryTO> getActions(final IModel<AuditEntryTO> model) {
         final ActionsPanel<AuditEntryTO> panel = super.getActions(model);
@@ -189,48 +131,27 @@ public class AuditHistoryDirectoryPanel extends
             @Override
             public void onClick(final AjaxRequestTarget target, final AuditEntryTO modelObject) {
                 AuditHistoryDirectoryPanel.this.getTogglePanel().close(target);
-                viewAuditHistory(modelObject, target);
-                target.add(modal);
-            }
-        }, ActionLink.ActionType.VIEW, StandardEntitlement.AUDIT_READ);
 
-        final String auditRestoreEntitlement;
-        switch (this.anyTypeKind) {
-            case USER:
-                auditRestoreEntitlement = StandardEntitlement.USER_UPDATE;
-                break;
-            case GROUP:
-                auditRestoreEntitlement = StandardEntitlement.GROUP_UPDATE;
-                break;
-            default:
-                auditRestoreEntitlement = StandardEntitlement.ANYTYPE_UPDATE;
-                break;
-        }
+                mlp.next(
+                        new StringResourceModel("audit.diff.view", AuditHistoryDirectoryPanel.this).getObject(),
+                        new AuditHistoryDetails<T>(
+                                mlp,
+                                modelObject,
+                                entity,
+                                auditRestoreEntitlement,
+                                pageRef) {
 
-        panel.add(new ActionLink<AuditEntryTO>() {
+                    private static final long serialVersionUID = -5311898419151367494L;
 
-            private static final long serialVersionUID = -6745431735457245600L;
+                    @Override
+                    protected void restore(final T entity, final AjaxRequestTarget target) {
+                        AuditHistoryDirectoryPanel.this.restore(entity, target);
+                    }
+                }, target);
 
-            @Override
-            public void onClick(final AjaxRequestTarget target, final AuditEntryTO modelObject) {
-                try {
-                    AuditHistoryDirectoryPanel.this.getTogglePanel().close(target);
-
-                    String json = modelObject.getBefore() == null
-                            ? MAPPER.readTree(modelObject.getOutput()).get("entity").toPrettyString()
-                            : modelObject.getBefore();
-                    ProvisioningResult<? extends AnyTO> result = restore(json, anyTO);
-                    anyTO.setLastChangeDate(new Date(Long.parseLong(result.getEntity().getETagValue())));
-
-                    target.add(container);
-                } catch (Exception e) {
-                    LOG.error("While restoring {}", anyTO.getClass().getName(), e);
-                    SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage())
-                            ? e.getClass().getName() : e.getMessage());
-                }
-                ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
+                target.add(modal);
             }
-        }, ActionLink.ActionType.RESTORE, auditRestoreEntitlement);
+        }, ActionLink.ActionType.VIEW, StandardEntitlement.AUDIT_READ);
 
         return panel;
     }
@@ -240,72 +161,38 @@ public class AuditHistoryDirectoryPanel extends
         return Collections.emptyList();
     }
 
-    private void viewAuditHistory(final AuditEntryTO auditEntryBean, final AjaxRequestTarget target) {
-        List<AuditEntryTO> search = restClient.search(anyTO.getKey(),
-                0,
-                TOTAL_AUDIT_HISTORY_COMPARISONS,
-                getSortParam(),
-                getQueryableAuditEvents(),
-                getQueryableAuditResult());
-
-        multiLevelPanelRef.next(
-                new StringResourceModel("audit.diff.view", this).getObject(),
-                new HistoryAuditDetails(modal, auditEntryBean,
-                        getPage().getPageReference(), toAuditEntryTOs(search), anyTO), target);
-    }
-
-    private List<AuditEntryTO> toAuditEntryTOs(final List<AuditEntryTO> search) {
-        return search
-                .stream()
-                .map(entry -> {
-                    AuditEntryTO bean = new AuditEntryTO();
-                    bean.setKey(anyTO.getKey());
-                    bean.setBefore(entry.getBefore());
-                    bean.setDate(entry.getDate());
-                    bean.setEvent(entry.getEvent());
-                    bean.getInputs().addAll(entry.getInputs());
-                    bean.setLoggerName(entry.getLoggerName());
-                    bean.setOutput(entry.getOutput());
-                    bean.setResult(entry.getResult());
-                    bean.setSubCategory(entry.getSubCategory());
-                    bean.setThrowable(entry.getThrowable());
-                    bean.setWho(entry.getWho());
-                    return bean;
-                })
-                .collect(Collectors.toList());
-    }
-
     protected class AuditHistoryProvider extends DirectoryDataProvider<AuditEntryTO> {
 
         private static final long serialVersionUID = 415113175628260864L;
 
         AuditHistoryProvider(final int paginatorRows) {
             super(paginatorRows);
+            setSort("date", SortOrder.DESCENDING);
         }
 
         @Override
-        public Iterator<? extends AuditEntryTO> iterator(final long first, final long count) {
-            return getAuditEntryBeans(first, count).iterator();
+        public long size() {
+            return restClient.count(entity.getKey(), type, category, EVENTS, AuditElements.Result.SUCCESS);
         }
 
         @Override
-        public long size() {
-            return restClient.count(anyTO.getKey(), getQueryableAuditEvents(), getQueryableAuditResult());
+        public Iterator<AuditEntryTO> iterator(final long first, final long count) {
+            int page = ((int) first / paginatorRows);
+            return restClient.search(
+                    entity.getKey(),
+                    (page < 0 ? 0 : page) + 1,
+                    paginatorRows,
+                    type,
+                    category,
+                    EVENTS,
+                    AuditElements.Result.SUCCESS,
+                    REST_SORT).
+                    iterator();
         }
 
         @Override
         public IModel<AuditEntryTO> model(final AuditEntryTO auditEntryBean) {
             return new CompoundPropertyModel<>(auditEntryBean);
         }
-
-        private List<AuditEntryTO> getAuditEntryBeans(final long first, final long count) {
-            int page = (int) first / paginatorRows;
-            return restClient.search(anyTO.getKey(),
-                    Math.max(page, 0) + 1,
-                    Long.valueOf(count).intValue(),
-                    getSortParam(),
-                    getQueryableAuditEvents(),
-                    getQueryableAuditResult());
-        }
     }
 }
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/audit/AuditHistoryModal.java b/client/console/src/main/java/org/apache/syncope/client/console/audit/AuditHistoryModal.java
index 7b42c6e..615cecd 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/audit/AuditHistoryModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/audit/AuditHistoryModal.java
@@ -21,35 +21,45 @@ package org.apache.syncope.client.console.audit;
 import org.apache.syncope.client.console.panels.ModalPanel;
 import org.apache.syncope.client.console.panels.MultilevelPanel;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
-import org.apache.syncope.common.lib.to.AnyTO;
+import org.apache.syncope.common.lib.to.EntityTO;
+import org.apache.syncope.common.lib.types.AuditElements;
 import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.panel.Panel;
 
-public class AuditHistoryModal<T extends AnyTO> extends Panel implements ModalPanel {
+public abstract class AuditHistoryModal<T extends EntityTO> extends Panel implements ModalPanel {
 
     private static final long serialVersionUID = 1066124171682570080L;
 
-    protected final AuditHistoryDirectoryPanel directoryPanel;
-
     public AuditHistoryModal(
             final BaseModal<?> baseModal,
-            final PageReference pageReference,
-            final T entity) {
+            final AuditElements.EventCategoryType type,
+            final String category,
+            final T entity,
+            final String auditRestoreEntitlement,
+            final PageReference pageRef) {
 
         super(BaseModal.CONTENT_ID);
 
-        final MultilevelPanel mlp = new MultilevelPanel("history");
+        MultilevelPanel mlp = new MultilevelPanel("history");
         mlp.setOutputMarkupId(true);
-        this.directoryPanel = getDirectoryPanel(mlp, baseModal, pageReference, entity);
-        add(mlp.setFirstLevel(this.directoryPanel));
-    }
+        add(mlp.setFirstLevel(new AuditHistoryDirectoryPanel<T>(
+                baseModal,
+                mlp,
+                type,
+                category,
+                entity,
+                auditRestoreEntitlement,
+                pageRef) {
 
-    protected AuditHistoryDirectoryPanel getDirectoryPanel(
-            final MultilevelPanel mlp,
-            final BaseModal<?> baseModal,
-            final PageReference pageReference,
-            final T entity) {
+            private static final long serialVersionUID = 1952220682903768286L;
 
-        return new AuditHistoryDirectoryPanel(baseModal, mlp, pageReference, entity);
+            @Override
+            protected void restore(final T entity, final AjaxRequestTarget target) {
+                AuditHistoryModal.this.restore(entity, target);
+            }
+        }));
     }
+
+    protected abstract void restore(T entity, AjaxRequestTarget target);
 }
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/audit/HistoryAuditDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/audit/HistoryAuditDetails.java
deleted file mode 100644
index a44fbbd..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/audit/HistoryAuditDetails.java
+++ /dev/null
@@ -1,232 +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.client.console.audit;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.panels.AbstractModalPanel;
-import org.apache.syncope.client.console.panels.MultilevelPanel;
-import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
-import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
-import org.apache.syncope.client.console.wicket.markup.html.form.JsonDiffPanel;
-import org.apache.syncope.client.console.wicket.markup.html.form.JsonEditorPanel;
-import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.common.lib.to.AuditEntryTO;
-import org.apache.syncope.common.lib.to.UserTO;
-import org.apache.wicket.PageReference;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.IChoiceRenderer;
-import org.apache.wicket.model.CompoundPropertyModel;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.PropertyModel;
-
-public class HistoryAuditDetails extends MultilevelPanel.SecondLevel {
-
-    private static final long serialVersionUID = -7400543686272100483L;
-
-    private static final ObjectMapper MAPPER = new ObjectMapper();
-
-    private static final String KEY_CURRENT = "current";
-
-    private final AuditEntryTO selected;
-
-    private final List<AuditEntryTO> availableTOs;
-
-    private AbstractModalPanel<String> jsonPanel;
-
-    private final AnyTO currentTO;
-
-    public HistoryAuditDetails(
-            final BaseModal<?> baseModal,
-            final AuditEntryTO selected,
-            final PageReference pageRef,
-            final List<AuditEntryTO> availableTOs,
-            final AnyTO currentTO) {
-
-        super();
-        this.availableTOs = availableTOs.stream().
-                filter(object -> !selected.equals(object) && selected.getBefore() != null).
-                collect(Collectors.toList());
-        this.selected = selected;
-        this.currentTO = currentTO;
-
-        addCurrentInstanceConf();
-        Form<?> form = initDropdownDiffConfForm();
-        add(form);
-        form.setVisible(!this.availableTOs.isEmpty());
-
-        showConfigurationSinglePanel();
-    }
-
-    private void showConfigurationSinglePanel() {
-        Pair<String, String> info = getJSONInfo(selected);
-
-        jsonPanel = new JsonEditorPanel(null, new PropertyModel<>(info, "right"), true, null) {
-
-            private static final long serialVersionUID = -8927036362466990179L;
-
-            @Override
-            public void onSubmit(final AjaxRequestTarget target) {
-                modal.close(target);
-            }
-        };
-        jsonPanel.setOutputMarkupId(true);
-
-        addOrReplace(jsonPanel);
-    }
-
-    private void showConfigurationDiffPanel(final List<AuditEntryTO> entries) {
-        List<Pair<String, String>> infos = new ArrayList<>();
-        entries.forEach(entry -> infos.add(getJSONInfo(entry)));
-
-        jsonPanel = new JsonDiffPanel(null, new PropertyModel<>(infos.get(0), "value"),
-                new PropertyModel<>(infos.get(1), "value"), null) {
-
-            private static final long serialVersionUID = -8927036362466990179L;
-
-            @Override
-            public void onSubmit(final AjaxRequestTarget target) {
-                modal.close(target);
-            }
-        };
-
-        replace(jsonPanel);
-    }
-
-    private String getSanitizedTOAsJSON(final AnyTO anyTO) throws Exception {
-        if (anyTO instanceof UserTO) {
-            UserTO userTO = (UserTO) anyTO;
-            userTO.setPassword(null);
-            userTO.setSecurityAnswer(null);
-            return MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(userTO);
-        }
-        return MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(anyTO);
-    }
-
-    private Pair<String, String> getJSONInfo(final AuditEntryTO auditEntryBean) {
-        try {
-            String content = auditEntryBean.getBefore() == null
-                    ? MAPPER.readTree(auditEntryBean.getOutput()).get("entity").toPrettyString()
-                    : auditEntryBean.getBefore();
-
-            AnyTO anyTO = MAPPER.readValue(content, currentTO.getClass());
-            String json = getSanitizedTOAsJSON(anyTO);
-            return Pair.of(auditEntryBean.getKey(), json);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private static <T extends AuditEntryTO> Map<String, String> getDropdownNamesMap(final List<T> entries) {
-        Map<String, String> map = new LinkedHashMap<>();
-        entries.forEach(audit -> {
-            String value = audit.getWho() + " - " + SyncopeConsoleSession.get().getDateFormat().format(audit.getDate());
-            if (audit.getKey().equalsIgnoreCase(KEY_CURRENT)) {
-                value += " - " + audit.getKey();
-            }
-            map.put(audit.getKey(), value);
-        });
-        return map;
-    }
-
-    private Form<?> initDropdownDiffConfForm() {
-        final Form<AuditEntryTO> form = new Form<>("form");
-        form.setModel(new CompoundPropertyModel<>(selected));
-        form.setOutputMarkupId(true);
-
-        Map<String, String> namesMap = getDropdownNamesMap(availableTOs);
-        List<String> keys = new ArrayList<>(namesMap.keySet());
-
-        final AjaxDropDownChoicePanel<String> dropdownElem = new AjaxDropDownChoicePanel<>(
-                "compareDropdown",
-                getString("compare"),
-                new PropertyModel<>(selected, Constants.KEY_FIELD_NAME),
-                false);
-        dropdownElem.setChoices(keys);
-        dropdownElem.setChoiceRenderer(new IChoiceRenderer<String>() {
-
-            private static final long serialVersionUID = -6265603675261014912L;
-
-            @Override
-            public Object getDisplayValue(final String value) {
-                return namesMap.get(value) == null ? value : namesMap.get(value);
-            }
-
-            @Override
-            public String getIdValue(final String value, final int i) {
-                return value;
-            }
-
-            @Override
-            public String getObject(
-                    final String id, final IModel<? extends List<? extends String>> choices) {
-                return id;
-            }
-        });
-        dropdownElem.setNullValid(false);
-        dropdownElem.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
-
-            private static final long serialVersionUID = -1107858522700306810L;
-
-            @Override
-            protected void onUpdate(final AjaxRequestTarget target) {
-                List<AuditEntryTO> elemsToCompare = new ArrayList<>();
-                elemsToCompare.add(selected);
-
-                final String selectedKey = dropdownElem.getModelObject();
-                if (selectedKey != null) {
-                    if (!selectedKey.isEmpty()) {
-                        AuditEntryTO confToCompare = availableTOs.stream().
-                                filter(object -> object.getKey().equals(selectedKey)).findAny().orElse(null);
-                        elemsToCompare.add(confToCompare);
-                        showConfigurationDiffPanel(elemsToCompare);
-                    } else {
-                        showConfigurationSinglePanel();
-                    }
-                }
-                target.add(jsonPanel);
-            }
-        });
-        form.add(dropdownElem);
-
-        return form;
-    }
-
-    private void addCurrentInstanceConf() {
-        try {
-            AuditEntryTO entryBean = new AuditEntryTO();
-            entryBean.setKey(KEY_CURRENT);
-            entryBean.setWho(currentTO.getCreator());
-            entryBean.setDate(currentTO.getCreationDate());
-            entryBean.setBefore(MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(currentTO));
-            availableTOs.add(entryBean);
-        } catch (final Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-}
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDirectoryPanel.java
index 229af3d..4327d69 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDirectoryPanel.java
@@ -36,14 +36,19 @@ import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel;
 import org.apache.syncope.client.console.wizards.AjaxWizard;
 import org.apache.syncope.client.console.wizards.WizardMgtPanel;
 import org.apache.syncope.client.console.wizards.any.AnyWrapper;
+import org.apache.syncope.common.lib.AnyOperations;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.SyncopeConstants;
+import org.apache.syncope.common.lib.patch.AnyObjectPatch;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
+import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.lib.types.AnyEntitlement;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
+import org.apache.syncope.common.lib.types.AuditElements;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.wicket.PageReference;
+import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.event.Broadcast;
 import org.apache.wicket.model.CompoundPropertyModel;
@@ -114,24 +119,6 @@ public class AnyObjectDirectoryPanel extends AnyDirectoryPanel<AnyObjectTO, AnyO
                 String.format("%s,%s", AnyEntitlement.READ.getFor(type), AnyEntitlement.UPDATE.getFor(type))).
                 setRealms(realm, model.getObject().getDynRealms());
 
-        panel.add(new ActionLink<AnyObjectTO>() {
-
-            private static final long serialVersionUID = -7978723352517770645L;
-
-            @Override
-            public void onClick(final AjaxRequestTarget target, final AnyObjectTO ignore) {
-                final AnyObjectTO clone = SerializationUtils.clone(model.getObject());
-                clone.setKey(null);
-                send(AnyObjectDirectoryPanel.this, Broadcast.EXACT,
-                        new AjaxWizard.NewItemActionEvent<>(new AnyWrapper<>(clone), target));
-            }
-
-            @Override
-            protected boolean statusCondition(final AnyObjectTO modelObject) {
-                return addAjaxLink.isVisibleInHierarchy() && realm.startsWith(SyncopeConstants.ROOT_REALM);
-            }
-        }, ActionType.CLONE, AnyEntitlement.CREATE.getFor(type)).setRealm(realm);
-
         if (wizardInModal) {
             panel.add(new ActionLink<AnyObjectTO>() {
 
@@ -190,26 +177,69 @@ public class AnyObjectDirectoryPanel extends AnyDirectoryPanel<AnyObjectTO, AnyO
             }, ActionType.NOTIFICATION_TASKS, StandardEntitlement.TASK_LIST);
         }
         panel.add(new ActionLink<AnyObjectTO>() {
+
             private static final long serialVersionUID = -2878723352517770644L;
 
             @Override
             public void onClick(final AjaxRequestTarget target, final AnyObjectTO ignore) {
-                IModel<AnyWrapper<AnyObjectTO>> formModel = new CompoundPropertyModel<>(
-                    new AnyWrapper<>(new AnyObjectRestClient().read(model.getObject().getKey())));
-                altDefaultModal.setFormModel(formModel);
-
-                target.add(altDefaultModal.setContent(new AuditHistoryModal<>(
-                    altDefaultModal,
-                    pageRef,
-                    formModel.getObject().getInnerObject())));
+                model.setObject(restClient.read(model.getObject().getKey()));
+                target.add(altDefaultModal.setContent(new AuditHistoryModal<AnyObjectTO>(
+                        altDefaultModal,
+                        AuditElements.EventCategoryType.LOGIC,
+                        "AnyObjectLogic",
+                        model.getObject(),
+                        AnyEntitlement.UPDATE.getFor(type),
+                        pageRef) {
+
+                    private static final long serialVersionUID = -7440902560249531201L;
+
+                    @Override
+                    protected void restore(final AnyObjectTO updated, final AjaxRequestTarget target) {
+                        AnyObjectTO original = model.getObject();
+                        try {
+                            AnyObjectPatch anyObjectPatch = AnyOperations.diff(updated, original, false);
+                            ProvisioningResult<AnyObjectTO> result =
+                                    restClient.update(original.getETagValue(), anyObjectPatch);
+                            model.getObject().setLastChangeDate(result.getEntity().getLastChangeDate());
+
+                            SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
+                            target.add(container);
+                        } catch (Exception e) {
+                            LOG.error("While restoring any object {}", model.getObject().getKey(), e);
+                            SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage())
+                                    ? e.getClass().getName() : e.getMessage());
+                            throw new WicketRuntimeException(e);
+                        }
+                        ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
+                    }
+                }));
 
                 altDefaultModal.header(new StringResourceModel("auditHistory.title", model));
 
                 altDefaultModal.show(true);
             }
-        }, ActionType.VIEW_AUDIT_HISTORY, StandardEntitlement.AUDIT_LIST).
-            setRealms(realm, model.getObject().getDynRealms());
-        
+        }, ActionType.VIEW_AUDIT_HISTORY,
+                String.format("%s,%s", AnyEntitlement.READ.getFor(type), StandardEntitlement.AUDIT_LIST)).
+                setRealms(realm, model.getObject().getDynRealms());
+
+        panel.add(new ActionLink<AnyObjectTO>() {
+
+            private static final long serialVersionUID = -7978723352517770645L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final AnyObjectTO ignore) {
+                final AnyObjectTO clone = SerializationUtils.clone(model.getObject());
+                clone.setKey(null);
+                send(AnyObjectDirectoryPanel.this, Broadcast.EXACT,
+                        new AjaxWizard.NewItemActionEvent<>(new AnyWrapper<>(clone), target));
+            }
+
+            @Override
+            protected boolean statusCondition(final AnyObjectTO modelObject) {
+                return addAjaxLink.isVisibleInHierarchy() && realm.startsWith(SyncopeConstants.ROOT_REALM);
+            }
+        }, ActionType.CLONE, AnyEntitlement.CREATE.getFor(type)).setRealm(realm);
+
         panel.add(new ActionLink<AnyObjectTO>() {
 
             private static final long serialVersionUID = -7978723352517770646L;
@@ -218,10 +248,11 @@ public class AnyObjectDirectoryPanel extends AnyDirectoryPanel<AnyObjectTO, AnyO
             public void onClick(final AjaxRequestTarget target, final AnyObjectTO ignore) {
                 try {
                     restClient.delete(model.getObject().getETagValue(), model.getObject().getKey());
+
                     SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
                     target.add(container);
                 } catch (SyncopeClientException e) {
-                    LOG.error("While deleting object {}", model.getObject().getKey(), e);
+                    LOG.error("While deleting any object {}", model.getObject().getKey(), e);
                     SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage())
                             ? e.getClass().getName() : e.getMessage());
                 }
@@ -233,7 +264,7 @@ public class AnyObjectDirectoryPanel extends AnyDirectoryPanel<AnyObjectTO, AnyO
                 return realm.startsWith(SyncopeConstants.ROOT_REALM);
             }
         }, ActionType.DELETE, AnyEntitlement.DELETE.getFor(type), true).setRealm(realm);
-        
+
         return panel;
     }
 
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassDetailsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassDetailsPanel.java
index e01db3a..92fe0fa 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassDetailsPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassDetailsPanel.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.client.console.panels;
 
-import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
 import org.apache.syncope.client.console.commons.Constants;
@@ -50,10 +49,6 @@ public class AnyTypeClassDetailsPanel extends Panel {
 
     private final List<String> availableVirSchemas = schemaRestClient.getVirSchemaNames();
 
-    private static final List<String> LAYOUT_PARAMETERS =
-            Arrays.asList(new String[] { "admin.user.layout", "self.user.layout",
-        "admin.group.layout", "self.group.layout", "admin.membership.layout", "self.membership.layout" });
-
     public AnyTypeClassDetailsPanel(final String id, final AnyTypeClassTO anyTypeClassTO) {
         super(id);
 
@@ -109,7 +104,6 @@ public class AnyTypeClassDetailsPanel extends Panel {
     }
 
     private void buildAvailableSchemas(final String key) {
-
         List<String> configurationSchemas = new ConfRestClient().list().stream().
                 map(AttrTO::getSchema).collect(Collectors.toList());
 
@@ -122,6 +116,5 @@ public class AnyTypeClassDetailsPanel extends Panel {
                 });
 
         availablePlainSchemas.removeAll(configurationSchemas);
-        availablePlainSchemas.removeAll(LAYOUT_PARAMETERS);
     }
 }
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnInstanceHistoryConfDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnInstanceHistoryConfDirectoryPanel.java
deleted file mode 100644
index e366891..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnInstanceHistoryConfDirectoryPanel.java
+++ /dev/null
@@ -1,229 +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.client.console.panels;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
-import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
-import org.apache.syncope.client.console.pages.BasePage;
-import org.apache.syncope.client.console.panels.ConnInstanceHistoryConfDirectoryPanel.CHConfProvider;
-import org.apache.syncope.client.console.rest.ConnectorHistoryRestClient;
-import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.DatePropertyColumn;
-import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.KeyPropertyColumn;
-import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
-import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
-import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink.ActionType;
-import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel;
-import org.apache.syncope.common.lib.SyncopeClientException;
-import org.apache.syncope.common.lib.to.ConnInstanceHistoryConfTO;
-import org.apache.syncope.common.lib.types.StandardEntitlement;
-import org.apache.wicket.PageReference;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.event.IEvent;
-import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
-import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
-import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
-import org.apache.wicket.model.CompoundPropertyModel;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.StringResourceModel;
-
-/**
- * List all connector configuration history instances for the selected connector.
- */
-public abstract class ConnInstanceHistoryConfDirectoryPanel extends DirectoryPanel<
-        ConnInstanceHistoryConfTO, ConnInstanceHistoryConfTO, CHConfProvider, ConnectorHistoryRestClient>
-        implements ModalPanel {
-
-    private static final long serialVersionUID = 4984337552918213290L;
-
-    protected final BaseModal<?> baseModal;
-
-    private final MultilevelPanel multiLevelPanelRef;
-
-    private final String entityKey;
-
-    public ConnInstanceHistoryConfDirectoryPanel(
-            final BaseModal<?> baseModal,
-            final MultilevelPanel multiLevelPanelRef,
-            final String entityKey,
-            final PageReference pageRef) {
-
-        super(MultilevelPanel.FIRST_LEVEL_ID, pageRef, false, false);
-
-        this.baseModal = baseModal;
-        this.multiLevelPanelRef = multiLevelPanelRef;
-        restClient = new ConnectorHistoryRestClient();
-        setShowResultPage(false);
-        disableCheckBoxes();
-
-        this.entityKey = entityKey;
-        initResultTable();
-    }
-
-    @Override
-    protected List<IColumn<ConnInstanceHistoryConfTO, String>> getColumns() {
-        final List<IColumn<ConnInstanceHistoryConfTO, String>> columns = new ArrayList<>();
-
-        columns.add(new KeyPropertyColumn<>(
-                new StringResourceModel(Constants.KEY_FIELD_NAME, this), Constants.KEY_FIELD_NAME));
-
-        columns.add(new PropertyColumn<>(new StringResourceModel(
-                "creator", this), "creator", "creator"));
-
-        columns.add(new DatePropertyColumn<>(
-                new StringResourceModel("creation", this), "creation", "creation"));
-
-        return columns;
-    }
-
-    @Override
-    public ActionsPanel<ConnInstanceHistoryConfTO> getActions(final IModel<ConnInstanceHistoryConfTO> model) {
-        final ActionsPanel<ConnInstanceHistoryConfTO> panel = super.getActions(model);
-        final ConnInstanceHistoryConfTO connHistoryConfTO = model.getObject();
-
-        // -- view
-        panel.add(new ActionLink<ConnInstanceHistoryConfTO>() {
-
-            private static final long serialVersionUID = -6745431735457245600L;
-
-            @Override
-            public void onClick(final AjaxRequestTarget target, final ConnInstanceHistoryConfTO modelObject) {
-
-                ConnInstanceHistoryConfDirectoryPanel.this.getTogglePanel().close(target);
-                viewConfiguration(modelObject, target);
-                target.add(modal);
-            }
-        }, ActionLink.ActionType.VIEW, StandardEntitlement.CONNECTOR_HISTORY_LIST);
-
-        // -- restore
-        panel.add(new ActionLink<ConnInstanceHistoryConfTO>() {
-
-            private static final long serialVersionUID = -6745431735457245600L;
-
-            @Override
-            public void onClick(final AjaxRequestTarget target, final ConnInstanceHistoryConfTO modelObject) {
-                try {
-                    restClient.restore(modelObject.getKey());
-                    ConnInstanceHistoryConfDirectoryPanel.this.getTogglePanel().close(target);
-                    target.add(container);
-                } catch (SyncopeClientException e) {
-                    LOG.error("While restoring {}", connHistoryConfTO.getKey(), e);
-                    SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage())
-                            ? e.getClass().getName() : e.getMessage());
-                }
-                ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
-            }
-        }, ActionLink.ActionType.RESTORE, StandardEntitlement.CONNECTOR_HISTORY_RESTORE);
-
-        // -- delete
-        panel.add(new ActionLink<ConnInstanceHistoryConfTO>() {
-
-            private static final long serialVersionUID = -6745431735457245600L;
-
-            @Override
-            public void onClick(final AjaxRequestTarget target, final ConnInstanceHistoryConfTO modelObject) {
-                try {
-                    restClient.delete(modelObject.getKey());
-                    SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
-                    target.add(container);
-                    ConnInstanceHistoryConfDirectoryPanel.this.getTogglePanel().close(target);
-                } catch (SyncopeClientException e) {
-                    LOG.error("While deleting {}", connHistoryConfTO.getKey(), e);
-                    SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage())
-                            ? e.getClass().getName() : e.getMessage());
-                }
-                ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
-            }
-        }, ActionLink.ActionType.DELETE, StandardEntitlement.CONNECTOR_HISTORY_DELETE, true);
-
-        return panel;
-    }
-
-    @Override
-    protected Collection<ActionType> getBatches() {
-        return Collections.<ActionLink.ActionType>emptyList();
-    }
-
-    @Override
-    protected String paginatorRowsKey() {
-        return Constants.PREF_CONNECTOR_HISTORY_CONF_PAGINATOR_ROWS;
-    }
-
-    protected abstract void viewConfiguration(ConnInstanceHistoryConfTO connHistoryTO, AjaxRequestTarget target);
-
-    @Override
-    protected void resultTableCustomChanges(
-            final AjaxDataTablePanel.Builder<ConnInstanceHistoryConfTO, String> resultTableBuilder) {
-        resultTableBuilder.setMultiLevelPanel(baseModal, multiLevelPanelRef);
-    }
-
-    @Override
-    protected CHConfProvider dataProvider() {
-        return new CHConfProvider(rows);
-    }
-
-    @Override
-    public void onEvent(final IEvent<?> event) {
-        super.onEvent(event);
-        if (event.getPayload() instanceof ExitEvent && modal != null) {
-            final AjaxRequestTarget target = ExitEvent.class.cast(event.getPayload()).getTarget();
-            baseModal.show(false);
-            baseModal.close(target);
-        }
-    }
-
-    protected class CHConfProvider extends DirectoryDataProvider<ConnInstanceHistoryConfTO> {
-
-        private static final long serialVersionUID = -4402560904215049574L;
-
-        private final SortableDataProviderComparator<ConnInstanceHistoryConfTO> comparator;
-
-        public CHConfProvider(final int paginatorRows) {
-            super(paginatorRows);
-
-            setSort("creation", SortOrder.ASCENDING);
-            comparator = new SortableDataProviderComparator<>(this);
-        }
-
-        @Override
-        public Iterator<ConnInstanceHistoryConfTO> iterator(final long first, final long count) {
-            final List<ConnInstanceHistoryConfTO> configurations = restClient.list(entityKey);
-
-            Collections.sort(configurations, comparator);
-            return configurations.iterator();
-        }
-
-        @Override
-        public long size() {
-            return restClient.list(entityKey).size();
-        }
-
-        @Override
-        public IModel<ConnInstanceHistoryConfTO> model(final ConnInstanceHistoryConfTO object) {
-            return new CompoundPropertyModel<>(object);
-        }
-    }
-}
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
index c2ef5e5..f06b07e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.client.console.panels;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import java.io.Serializable;
 import java.util.Collection;
@@ -57,6 +58,8 @@ public abstract class DirectoryPanel<
 
     protected static final Logger LOG = LoggerFactory.getLogger(DirectoryPanel.class);
 
+    protected static final ObjectMapper MAPPER = new ObjectMapper();
+
     /**
      * Application preferences.
      */
@@ -87,7 +90,7 @@ public abstract class DirectoryPanel<
     /**
      * Result table.
      */
-    private AjaxDataTablePanel<T, String> resultTable;
+    protected AjaxDataTablePanel<T, String> resultTable;
 
     /**
      * Data provider used to search for entities.
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java
index 0091949..93d9f03 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java
@@ -45,14 +45,18 @@ import org.apache.syncope.client.console.wizards.WizardMgtPanel;
 import org.apache.syncope.client.console.wizards.any.AnyWrapper;
 import org.apache.syncope.client.console.wizards.any.GroupWrapper;
 import org.apache.syncope.client.lib.SyncopeClient;
+import org.apache.syncope.common.lib.AnyOperations;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.SyncopeConstants;
+import org.apache.syncope.common.lib.patch.GroupPatch;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
 import org.apache.syncope.common.lib.to.GroupTO;
+import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.types.AnyEntitlement;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
+import org.apache.syncope.common.lib.types.AuditElements;
 import org.apache.syncope.common.lib.types.ProvisionAction;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.wicket.PageReference;
@@ -223,24 +227,6 @@ public class GroupDirectoryPanel extends AnyDirectoryPanel<GroupTO, GroupRestCli
 
             @Override
             public void onClick(final AjaxRequestTarget target, final GroupTO ignore) {
-                GroupTO clone = SerializationUtils.clone(model.getObject());
-                clone.setKey(null);
-                send(GroupDirectoryPanel.this, Broadcast.EXACT,
-                        new AjaxWizard.NewItemActionEvent<>(new GroupWrapper(clone), target));
-            }
-
-            @Override
-            protected boolean statusCondition(final GroupTO modelObject) {
-                return realm.startsWith(SyncopeConstants.ROOT_REALM);
-            }
-        }, ActionType.CLONE, StandardEntitlement.GROUP_CREATE).setRealm(realm);
-
-        panel.add(new ActionLink<GroupTO>() {
-
-            private static final long serialVersionUID = 6242834621660352855L;
-
-            @Override
-            public void onClick(final AjaxRequestTarget target, final GroupTO ignore) {
                 target.add(typeExtensionsModal.setContent(new TypeExtensionDirectoryPanel(
                         typeExtensionsModal, model.getObject(), pageRef)));
                 typeExtensionsModal.header(new StringResourceModel("typeExtensions", model));
@@ -367,33 +353,76 @@ public class GroupDirectoryPanel extends AnyDirectoryPanel<GroupTO, GroupRestCli
 
             @Override
             public void onClick(final AjaxRequestTarget target, final GroupTO ignore) {
-                IModel<GroupWrapper> formModel = new CompoundPropertyModel<>(
-                        new GroupWrapper(new GroupRestClient().read(model.getObject().getKey())));
-                target.add(altDefaultModal.setContent(new AuditHistoryModal<>(
+                model.setObject(restClient.read(model.getObject().getKey()));
+                target.add(altDefaultModal.setContent(new AuditHistoryModal<GroupTO>(
                         altDefaultModal,
-                        pageRef,
-                        formModel.getObject().getInnerObject())));
+                        AuditElements.EventCategoryType.LOGIC,
+                        "GroupLogic",
+                        model.getObject(),
+                        StandardEntitlement.GROUP_UPDATE,
+                        pageRef) {
+
+                    private static final long serialVersionUID = -5819724478921691835L;
+
+                    @Override
+                    protected void restore(final GroupTO updated, final AjaxRequestTarget target) {
+                        GroupTO original = model.getObject();
+                        try {
+                            GroupPatch groupPatch = AnyOperations.diff(updated, original, false);
+                            ProvisioningResult<GroupTO> result = restClient.update(original.getETagValue(), groupPatch);
+                            model.getObject().setLastChangeDate(result.getEntity().getLastChangeDate());
+
+                            SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
+                            target.add(container);
+                        } catch (Exception e) {
+                            LOG.error("While restoring group {}", model.getObject().getKey(), e);
+                            SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage())
+                                    ? e.getClass().getName() : e.getMessage());
+                        }
+                        ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
+                    }
+                }));
 
                 altDefaultModal.header(new Model<>(
                         getString("auditHistory.title", new Model<>(new AnyWrapper<>(model.getObject())))));
 
                 altDefaultModal.show(true);
             }
-        }, ActionType.VIEW_AUDIT_HISTORY, StandardEntitlement.AUDIT_LIST).
+        }, ActionType.VIEW_AUDIT_HISTORY,
+                String.format("%s,%s", StandardEntitlement.GROUP_READ, StandardEntitlement.AUDIT_LIST)).
                 setRealms(realm, model.getObject().getDynRealms());
 
         panel.add(new ActionLink<GroupTO>() {
 
+            private static final long serialVersionUID = 6242834621660352855L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final GroupTO ignore) {
+                GroupTO clone = SerializationUtils.clone(model.getObject());
+                clone.setKey(null);
+                send(GroupDirectoryPanel.this, Broadcast.EXACT,
+                        new AjaxWizard.NewItemActionEvent<>(new GroupWrapper(clone), target));
+            }
+
+            @Override
+            protected boolean statusCondition(final GroupTO modelObject) {
+                return realm.startsWith(SyncopeConstants.ROOT_REALM);
+            }
+        }, ActionType.CLONE, StandardEntitlement.GROUP_CREATE).setRealm(realm);
+
+        panel.add(new ActionLink<GroupTO>() {
+
             private static final long serialVersionUID = -7978723352517770644L;
 
             @Override
             public void onClick(final AjaxRequestTarget target, final GroupTO ignore) {
                 try {
                     restClient.delete(model.getObject().getETagValue(), model.getObject().getKey());
+
                     SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
                     target.add(container);
                 } catch (SyncopeClientException e) {
-                    LOG.error("While deleting object {}", model.getObject().getKey(), e);
+                    LOG.error("While deleting group {}", model.getObject().getKey(), e);
                     SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage())
                             ? e.getClass().getName() : e.getMessage());
                 }
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/HistoryConfDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/HistoryConfDetails.java
deleted file mode 100644
index bb6ba40..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/HistoryConfDetails.java
+++ /dev/null
@@ -1,247 +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.client.console.panels;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.rest.ConnectorRestClient;
-import org.apache.syncope.client.console.rest.ResourceRestClient;
-import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
-import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
-import org.apache.syncope.client.console.wicket.markup.html.form.JsonDiffPanel;
-import org.apache.syncope.client.console.wicket.markup.html.form.JsonEditorPanel;
-import org.apache.syncope.common.lib.to.AbstractHistoryConf;
-import org.apache.syncope.common.lib.to.ConnInstanceHistoryConfTO;
-import org.apache.syncope.common.lib.to.ConnInstanceTO;
-import org.apache.syncope.common.lib.to.ResourceHistoryConfTO;
-import org.apache.syncope.common.lib.to.ResourceTO;
-import org.apache.wicket.PageReference;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.IChoiceRenderer;
-import org.apache.wicket.model.CompoundPropertyModel;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.PropertyModel;
-
-public class HistoryConfDetails<T extends AbstractHistoryConf> extends MultilevelPanel.SecondLevel {
-
-    private static final long serialVersionUID = -7400543686272100483L;
-
-    private static final ObjectMapper MAPPER = new ObjectMapper();
-
-    private final T selectedHistoryConfTO;
-
-    private final List<T> availableHistoryConfTOs;
-
-    private AbstractModalPanel<String> jsonPanel;
-
-    public HistoryConfDetails(final BaseModal<?> baseModal, final T selectedHistoryConfTO,
-            final PageReference pageRef, final List<T> availableHistoryConfTOs) {
-        super();
-
-        // remove selected conf from list
-        this.availableHistoryConfTOs = availableHistoryConfTOs.stream().
-                filter(object -> !object.getKey().equals(selectedHistoryConfTO.getKey())).collect(Collectors.toList());
-        this.selectedHistoryConfTO = selectedHistoryConfTO;
-
-        // add current conf to list
-        addCurrentInstanceConf();
-
-        Form<?> form = initDropdownDiffConfForm();
-        add(form);
-        form.setVisible(!availableHistoryConfTOs.isEmpty());
-
-        showConfigurationSinglePanel();
-    }
-
-    private void showConfigurationSinglePanel() {
-        Pair<String, String> info = getJSONInfo(selectedHistoryConfTO);
-
-        jsonPanel = new JsonEditorPanel(null, new PropertyModel<String>(info, "right"), true, null) {
-
-            private static final long serialVersionUID = -8927036362466990179L;
-
-            @Override
-            public void onSubmit(final AjaxRequestTarget target) {
-                modal.close(target);
-            }
-        };
-        jsonPanel.setOutputMarkupId(true);
-
-        addOrReplace(jsonPanel);
-    }
-
-    private void showConfigurationDiffPanel(final List<T> historyConfTOs) {
-        List<Pair<String, String>> infos = new ArrayList<>();
-        historyConfTOs.forEach(historyConfTO -> {
-            infos.add(getJSONInfo(historyConfTO));
-        });
-
-        jsonPanel = new JsonDiffPanel(null, new PropertyModel<String>(infos.get(0), "value"),
-                new PropertyModel<String>(infos.get(1), "value"), null) {
-
-            private static final long serialVersionUID = -8927036362466990179L;
-
-            @Override
-            public void onSubmit(final AjaxRequestTarget target) {
-                modal.close(target);
-            }
-        };
-
-        replace(jsonPanel);
-    }
-
-    private Pair<String, String> getJSONInfo(final T historyConfTO) {
-        Object conf = null; // selected configuration instance
-        String key = "";
-        if (historyConfTO instanceof ConnInstanceHistoryConfTO) {
-            ConnInstanceHistoryConfTO historyConf = ConnInstanceHistoryConfTO.class.cast(historyConfTO);
-            conf = historyConf.getConnInstanceTO();
-            key = historyConf.getKey();
-        } else if (historyConfTO instanceof ResourceHistoryConfTO) {
-            ResourceHistoryConfTO historyConf = ResourceHistoryConfTO.class.cast(historyConfTO);
-            conf = historyConf.getResourceTO();
-            key = historyConf.getKey();
-        }
-
-        String json = "";
-        try {
-            json = MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(conf);
-        } catch (IOException ex) {
-            DirectoryPanel.LOG.error("Error converting objects to JSON", ex);
-        }
-
-        return Pair.of(key, json);
-    }
-
-    private <T extends AbstractHistoryConf> Map<String, String> getDropdownNamesMap(final List<T> historyConfTOs) {
-        Map<String, String> historyConfMap = new LinkedHashMap<>();
-
-        String current = null;
-        for (T historyConf : historyConfTOs) {
-            if (historyConf.getCreation() == null) {
-                current = historyConf.getKey();
-            } else {
-                historyConfMap.put(historyConf.getKey(), historyConf.getCreator() + " - "
-                        + SyncopeConsoleSession.get().getDateFormat().format(
-                                historyConf.getCreation()) + " - " + historyConf.getKey());
-            }
-        }
-        if (current != null) {
-            historyConfMap.put(current, getString("current"));
-        }
-
-        return historyConfMap;
-    }
-
-    private Form<?> initDropdownDiffConfForm() {
-        final Form<T> form = new Form<>("form");
-        form.setModel(new CompoundPropertyModel<>(selectedHistoryConfTO));
-        form.setOutputMarkupId(true);
-
-        final Map<String, String> namesMap = getDropdownNamesMap(availableHistoryConfTOs);
-        List<String> keys = new ArrayList<>(namesMap.keySet());
-
-        final AjaxDropDownChoicePanel<String> dropdownElem = new AjaxDropDownChoicePanel<>(
-                "compareDropdown",
-                getString("compare"),
-                new PropertyModel<>(selectedHistoryConfTO, Constants.KEY_FIELD_NAME),
-                false);
-        dropdownElem.setChoices(keys);
-        dropdownElem.setChoiceRenderer(new IChoiceRenderer<String>() {
-
-            private static final long serialVersionUID = -6265603675261014912L;
-
-            @Override
-            public Object getDisplayValue(final String value) {
-                return namesMap.get(value) == null ? value : namesMap.get(value);
-            }
-
-            @Override
-            public String getIdValue(final String value, final int i) {
-                return value;
-            }
-
-            @Override
-            public String getObject(
-                    final String id, final IModel<? extends List<? extends String>> choices) {
-                return id;
-            }
-        });
-        dropdownElem.setNullValid(true);
-        dropdownElem.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
-
-            private static final long serialVersionUID = -1107858522700306810L;
-
-            @Override
-            protected void onUpdate(final AjaxRequestTarget target) {
-                List<T> elemsToCompare = new ArrayList<>();
-                elemsToCompare.add(selectedHistoryConfTO);
-
-                final String selectedKey = dropdownElem.getModelObject();
-                if (selectedKey != null) {
-                    if (!selectedKey.isEmpty()) {
-                        T confToCompare = availableHistoryConfTOs.stream().
-                                filter(object -> object.getKey().equals(selectedKey)).findAny().orElse(null);
-                        elemsToCompare.add(confToCompare);
-                        showConfigurationDiffPanel(elemsToCompare);
-                    } else {
-                        showConfigurationSinglePanel();
-                    }
-                }
-                target.add(jsonPanel);
-            }
-        });
-        form.add(dropdownElem);
-
-        return form;
-    }
-
-    @SuppressWarnings("unchecked")
-    private void addCurrentInstanceConf() {
-        T conf = null;
-
-        if (selectedHistoryConfTO instanceof ConnInstanceHistoryConfTO) {
-            ConnInstanceTO current = new ConnectorRestClient().read(
-                    ConnInstanceHistoryConfTO.class.cast(selectedHistoryConfTO).getConnInstanceTO().getKey());
-            conf = (T) new ConnInstanceHistoryConfTO();
-            ((ConnInstanceHistoryConfTO) conf).setConnInstanceTO(current);
-        } else if (selectedHistoryConfTO instanceof ResourceHistoryConfTO) {
-            ResourceTO current = new ResourceRestClient().read(
-                    ResourceHistoryConfTO.class.cast(selectedHistoryConfTO).getResourceTO().getKey());
-            conf = (T) new ResourceHistoryConfTO();
-            ((ResourceHistoryConfTO) conf).setResourceTO(current);
-        }
-
-        if (conf != null) {
-            conf.setCreator(selectedHistoryConfTO.getCreator());
-            conf.setKey("current");
-            availableHistoryConfTOs.add(conf);
-        }
-    }
-}
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/HistoryConfList.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/HistoryConfList.java
deleted file mode 100644
index 5848b7a..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/HistoryConfList.java
+++ /dev/null
@@ -1,74 +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.client.console.panels;
-
-import java.io.Serializable;
-import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
-import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.common.lib.to.ConnInstanceHistoryConfTO;
-import org.apache.syncope.common.lib.to.ConnInstanceTO;
-import org.apache.syncope.common.lib.to.EntityTO;
-import org.apache.syncope.common.lib.to.ResourceHistoryConfTO;
-import org.apache.wicket.PageReference;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.model.StringResourceModel;
-
-public class HistoryConfList<T extends Serializable> extends Panel implements ModalPanel {
-
-    private static final long serialVersionUID = 2482507052037665907L;
-
-    public <T extends AnyTO> HistoryConfList(
-            final BaseModal<?> baseModal,
-            final String entityKey,
-            final PageReference pageReference,
-            final EntityTO modelObj) {
-
-        super(BaseModal.CONTENT_ID);
-
-        final MultilevelPanel mlp = new MultilevelPanel("history");
-
-        mlp.setFirstLevel(modelObj instanceof ConnInstanceTO
-                ? new ConnInstanceHistoryConfDirectoryPanel(baseModal, mlp, entityKey, pageReference) {
-
-            private static final long serialVersionUID = 1422189028000709100L;
-
-            @Override
-            protected void viewConfiguration(final ConnInstanceHistoryConfTO historyTO,
-                    final AjaxRequestTarget target) {
-                mlp.next(
-                        new StringResourceModel("history.diff.view", this).getObject(),
-                        new HistoryConfDetails<>(modal, historyTO, pageReference, restClient.list(entityKey)), target);
-            }
-        } : new ResourceHistoryConfDirectoryPanel(baseModal, mlp, entityKey, pageReference) {
-
-            private static final long serialVersionUID = 1422189028000709100L;
-
-            @Override
-            protected void viewConfiguration(final ResourceHistoryConfTO historyTO,
-                    final AjaxRequestTarget target) {
-                mlp.next(
-                        new StringResourceModel("history.diff.view", this).getObject(),
-                        new HistoryConfDetails<>(modal, historyTO, pageReference, restClient.list(entityKey)), target);
-            }
-        });
-
-        add(mlp);
-    }
-}
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/LinkedAccountModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/LinkedAccountModalPanel.java
index da7569d..b5de68f 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/LinkedAccountModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/LinkedAccountModalPanel.java
@@ -18,8 +18,6 @@
  */
 package org.apache.syncope.client.console.panels;
 
-import static org.apache.syncope.client.console.panels.AbstractModalPanel.LOG;
-
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -54,11 +52,15 @@ import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.StringResourceModel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class LinkedAccountModalPanel extends Panel implements ModalPanel {
 
     private static final long serialVersionUID = -4603032036433309900L;
 
+    private static final Logger LOG = LoggerFactory.getLogger(LinkedAccountModalPanel.class);
+
     private final LinkedAccountWizardBuilder wizard;
 
     private final WizardMgtPanel<LinkedAccountTO> list;
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceHistoryConfDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceHistoryConfDirectoryPanel.java
deleted file mode 100644
index a1cfeb7..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceHistoryConfDirectoryPanel.java
+++ /dev/null
@@ -1,230 +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.client.console.panels;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
-import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
-import org.apache.syncope.client.console.pages.BasePage;
-import org.apache.syncope.client.console.panels.ResourceHistoryConfDirectoryPanel.RHConfProvider;
-import org.apache.syncope.client.console.rest.ResourceHistoryRestClient;
-import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.DatePropertyColumn;
-import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.KeyPropertyColumn;
-import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
-import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
-import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink.ActionType;
-import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel;
-import org.apache.syncope.client.console.wizards.WizardMgtPanel;
-import org.apache.syncope.common.lib.SyncopeClientException;
-import org.apache.syncope.common.lib.to.ResourceHistoryConfTO;
-import org.apache.syncope.common.lib.types.StandardEntitlement;
-import org.apache.wicket.PageReference;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.event.IEvent;
-import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
-import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
-import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
-import org.apache.wicket.model.CompoundPropertyModel;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.StringResourceModel;
-
-/**
- * List all resource configuration history instances for the selected resource.
- */
-public abstract class ResourceHistoryConfDirectoryPanel extends DirectoryPanel<
-        ResourceHistoryConfTO, ResourceHistoryConfTO, RHConfProvider, ResourceHistoryRestClient>
-        implements ModalPanel {
-
-    private static final long serialVersionUID = 7636531280703026376L;
-
-    protected final BaseModal<?> baseModal;
-
-    private final MultilevelPanel multiLevelPanelRef;
-
-    private final String entityKey;
-
-    public ResourceHistoryConfDirectoryPanel(
-            final BaseModal<?> baseModal,
-            final MultilevelPanel multiLevelPanelRef,
-            final String entityKey,
-            final PageReference pageRef) {
-
-        super(MultilevelPanel.FIRST_LEVEL_ID, pageRef, false, false);
-
-        this.baseModal = baseModal;
-        this.multiLevelPanelRef = multiLevelPanelRef;
-        restClient = new ResourceHistoryRestClient();
-        setShowResultPage(false);
-        disableCheckBoxes();
-
-        this.entityKey = entityKey;
-        initResultTable();
-    }
-
-    @Override
-    protected List<IColumn<ResourceHistoryConfTO, String>> getColumns() {
-        final List<IColumn<ResourceHistoryConfTO, String>> columns = new ArrayList<>();
-
-        columns.add(new KeyPropertyColumn<>(
-                new StringResourceModel(Constants.KEY_FIELD_NAME, this), Constants.KEY_FIELD_NAME));
-
-        columns.add(new PropertyColumn<>(new StringResourceModel(
-                "creator", this), "creator", "creator"));
-
-        columns.add(new DatePropertyColumn<>(
-                new StringResourceModel("creation", this), "creation", "creation"));
-
-        return columns;
-    }
-
-    @Override
-    public ActionsPanel<ResourceHistoryConfTO> getActions(final IModel<ResourceHistoryConfTO> model) {
-        final ActionsPanel<ResourceHistoryConfTO> panel = super.getActions(model);
-        final ResourceHistoryConfTO resHistoryConfTO = model.getObject();
-
-        // -- view
-        panel.add(new ActionLink<ResourceHistoryConfTO>() {
-
-            private static final long serialVersionUID = -3369924994540304232L;
-
-            @Override
-            public void onClick(final AjaxRequestTarget target, final ResourceHistoryConfTO modelObject) {
-
-                ResourceHistoryConfDirectoryPanel.this.getTogglePanel().close(target);
-                viewConfiguration(modelObject, target);
-                target.add(modal);
-            }
-        }, ActionLink.ActionType.VIEW, StandardEntitlement.RESOURCE_HISTORY_LIST);
-
-        // -- restore
-        panel.add(new ActionLink<ResourceHistoryConfTO>() {
-
-            private static final long serialVersionUID = -3369924994540304232L;
-
-            @Override
-            public void onClick(final AjaxRequestTarget target, final ResourceHistoryConfTO modelObject) {
-                try {
-                    restClient.restore(modelObject.getKey());
-                    ResourceHistoryConfDirectoryPanel.this.getTogglePanel().close(target);
-                    target.add(container);
-                } catch (SyncopeClientException e) {
-                    LOG.error("While restoring {}", resHistoryConfTO.getKey(), e);
-                    SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage())
-                            ? e.getClass().getName() : e.getMessage());
-                }
-                ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
-            }
-        }, ActionLink.ActionType.RESTORE, StandardEntitlement.RESOURCE_HISTORY_RESTORE);
-
-        // -- delete
-        panel.add(new ActionLink<ResourceHistoryConfTO>() {
-
-            private static final long serialVersionUID = -3369924994540304232L;
-
-            @Override
-            public void onClick(final AjaxRequestTarget target, final ResourceHistoryConfTO modelObject) {
-                try {
-                    restClient.delete(modelObject.getKey());
-                    SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
-                    target.add(container);
-                    ResourceHistoryConfDirectoryPanel.this.getTogglePanel().close(target);
-                } catch (SyncopeClientException e) {
-                    LOG.error("While deleting {}", resHistoryConfTO.getKey(), e);
-                    SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage())
-                            ? e.getClass().getName() : e.getMessage());
-                }
-                ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
-            }
-        }, ActionLink.ActionType.DELETE, StandardEntitlement.RESOURCE_HISTORY_DELETE, true);
-
-        return panel;
-    }
-
-    @Override
-    protected Collection<ActionType> getBatches() {
-        return Collections.<ActionLink.ActionType>emptyList();
-    }
-
-    @Override
-    protected String paginatorRowsKey() {
-        return Constants.PREF_RESOURCE_HISTORY_CONF_PAGINATOR_ROWS;
-    }
-
-    protected abstract void viewConfiguration(ResourceHistoryConfTO resHistoryTO, AjaxRequestTarget target);
-
-    @Override
-    protected void resultTableCustomChanges(
-            final AjaxDataTablePanel.Builder<ResourceHistoryConfTO, String> resultTableBuilder) {
-        resultTableBuilder.setMultiLevelPanel(baseModal, multiLevelPanelRef);
-    }
-
-    @Override
-    protected RHConfProvider dataProvider() {
-        return new RHConfProvider(rows);
-    }
-
-    @Override
-    public void onEvent(final IEvent<?> event) {
-        super.onEvent(event);
-        if (event.getPayload() instanceof WizardMgtPanel.ExitEvent && modal != null) {
-            final AjaxRequestTarget target = WizardMgtPanel.ExitEvent.class.cast(event.getPayload()).getTarget();
-            baseModal.show(false);
-            baseModal.close(target);
-        }
-    }
-
-    protected class RHConfProvider extends DirectoryDataProvider<ResourceHistoryConfTO> {
-
-        private static final long serialVersionUID = -5244315453787001412L;
-
-        private final SortableDataProviderComparator<ResourceHistoryConfTO> comparator;
-
-        public RHConfProvider(final int paginatorRows) {
-            super(paginatorRows);
-
-            setSort("creation", SortOrder.ASCENDING);
-            comparator = new SortableDataProviderComparator<>(this);
-        }
-
-        @Override
-        public Iterator<ResourceHistoryConfTO> iterator(final long first, final long count) {
-            final List<ResourceHistoryConfTO> configurations = restClient.list(entityKey);
-
-            Collections.sort(configurations, comparator);
-            return configurations.iterator();
-        }
-
-        @Override
-        public long size() {
-            return restClient.list(entityKey).size();
-        }
-
-        @Override
-        public IModel<ResourceHistoryConfTO> model(final ResourceHistoryConfTO object) {
-            return new CompoundPropertyModel<>(object);
-        }
-    }
-}
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java
index eb42741..79b2607 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java
@@ -42,13 +42,18 @@ import org.apache.syncope.client.console.wizards.AjaxWizard;
 import org.apache.syncope.client.console.wizards.WizardMgtPanel;
 import org.apache.syncope.client.console.wizards.any.AnyWrapper;
 import org.apache.syncope.client.console.wizards.any.UserWrapper;
+import org.apache.syncope.common.lib.AnyOperations;
 import org.apache.syncope.common.lib.SyncopeConstants;
+import org.apache.syncope.common.lib.patch.UserPatch;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
+import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
+import org.apache.syncope.common.lib.types.AuditElements;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.syncope.common.rest.api.service.UserSelfService;
 import org.apache.wicket.PageReference;
+import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.event.Broadcast;
 import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
@@ -155,7 +160,7 @@ public class UserDirectoryPanel extends AnyDirectoryPanel<UserTO, UserRestClient
     @Override
     public ActionsPanel<UserTO> getActions(final IModel<UserTO> model) {
         final ActionsPanel<UserTO> panel = super.getActions(model);
-         
+
         panel.add(new ActionLink<UserTO>() {
 
             private static final long serialVersionUID = -7978723352517770644L;
@@ -164,7 +169,7 @@ public class UserDirectoryPanel extends AnyDirectoryPanel<UserTO, UserRestClient
             public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
                 send(UserDirectoryPanel.this, Broadcast.EXACT,
                         new AjaxWizard.EditItemActionEvent<>(
-                                new UserWrapper(UserRestClient.class.cast(restClient).read(model.getObject().getKey())),
+                                new UserWrapper(restClient.read(model.getObject().getKey())),
                                 target));
             }
         }, ActionType.EDIT,
@@ -177,27 +182,8 @@ public class UserDirectoryPanel extends AnyDirectoryPanel<UserTO, UserRestClient
 
             @Override
             public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
-                UserTO clone = SerializationUtils.clone(model.getObject());
-                clone.setKey(null);
-                clone.setUsername(model.getObject().getUsername() + "_clone");
-                send(UserDirectoryPanel.this, Broadcast.EXACT,
-                        new AjaxWizard.NewItemActionEvent<>(new UserWrapper(clone), target));
-            }
-
-            @Override
-            protected boolean statusCondition(final UserTO modelObject) {
-                return addAjaxLink.isVisibleInHierarchy() && realm.startsWith(SyncopeConstants.ROOT_REALM);
-            }
-        }, ActionType.CLONE, StandardEntitlement.USER_CREATE).setRealm(realm);
-
-        panel.add(new ActionLink<UserTO>() {
-
-            private static final long serialVersionUID = -7978723352517770644L;
-
-            @Override
-            public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
                 try {
-                    UserRestClient.class.cast(restClient).mustChangePassword(
+                    restClient.mustChangePassword(
                             model.getObject().getETagValue(),
                             !model.getObject().isMustChangePassword(),
                             model.getObject().getKey());
@@ -295,7 +281,7 @@ public class UserDirectoryPanel extends AnyDirectoryPanel<UserTO, UserRestClient
 
                 @Override
                 public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
-                    model.setObject(UserRestClient.class.cast(restClient).read(model.getObject().getKey()));
+                    model.setObject(restClient.read(model.getObject().getKey()));
                     IModel<AnyWrapper<UserTO>> formModel = new CompoundPropertyModel<>(
                             new AnyWrapper<>(model.getObject()));
                     altDefaultModal.setFormModel(formModel);
@@ -351,7 +337,7 @@ public class UserDirectoryPanel extends AnyDirectoryPanel<UserTO, UserRestClient
 
                 @Override
                 public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
-                    model.setObject(UserRestClient.class.cast(restClient).read(model.getObject().getKey()));
+                    model.setObject(restClient.read(model.getObject().getKey()));
                     target.add(wizardWrapperModal.setContent(
                             new LinkedAccountModalPanel(wizardWrapperModal, model, pageRef, false)));
                     wizardWrapperModal.header(new ResourceModel("linkedAccounts.title"));
@@ -368,20 +354,72 @@ public class UserDirectoryPanel extends AnyDirectoryPanel<UserTO, UserRestClient
 
             @Override
             public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
-                IModel<UserWrapper> formModel = new CompoundPropertyModel<>(
-                    new UserWrapper(new UserRestClient().read(model.getObject().getKey())));
-                target.add(altDefaultModal.setContent(new AuditHistoryModal<>(
-                    altDefaultModal,
-                    pageRef,
-                    formModel.getObject().getInnerObject())));
+                model.setObject(restClient.read(model.getObject().getKey()));
+                target.add(altDefaultModal.setContent(new AuditHistoryModal<UserTO>(
+                        altDefaultModal,
+                        AuditElements.EventCategoryType.LOGIC,
+                        "UserLogic",
+                        model.getObject(),
+                        StandardEntitlement.USER_UPDATE,
+                        pageRef) {
+
+                    private static final long serialVersionUID = 959378158400669867L;
+
+                    @Override
+                    protected void restore(final UserTO updated, final AjaxRequestTarget target) {
+                        // The original audit record masks the password and the security
+                        // answer; so we cannot use the audit record to resurrect the entry based on mask data.
+                        //
+                        // The method behavior below will reset the audit record such that the current security
+                        // answer and the password for the object are always maintained, and such properties for the
+                        // user cannot be restored using audit records.
+                        UserTO original = model.getObject();
+                        try {
+                            UserPatch userPatch = AnyOperations.diff(updated, original, false);
+                            userPatch.setPassword(null);
+                            userPatch.setSecurityAnswer(null);
+                            ProvisioningResult<UserTO> result = restClient.update(original.getETagValue(), userPatch);
+                            model.getObject().setLastChangeDate(result.getEntity().getLastChangeDate());
+
+                            SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
+                            target.add(container);
+                        } catch (Exception e) {
+                            LOG.error("While restoring user {}", model.getObject().getKey(), e);
+                            SyncopeConsoleSession.get().error(
+                                    StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
+                            throw new WicketRuntimeException(e);
+                        }
+                        ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
+                    }
+                }));
 
                 altDefaultModal.header(new Model<>(
-                    getString("auditHistory.title", new Model<>(new AnyWrapper<>(model.getObject())))));
+                        getString("auditHistory.title", new Model<>(new AnyWrapper<>(model.getObject())))));
 
                 altDefaultModal.show(true);
             }
-        }, ActionType.VIEW_AUDIT_HISTORY, StandardEntitlement.AUDIT_LIST).
-            setRealms(realm, model.getObject().getDynRealms());
+        }, ActionType.VIEW_AUDIT_HISTORY,
+                String.format("%s,%s", StandardEntitlement.USER_READ, StandardEntitlement.AUDIT_LIST)).
+                setRealms(realm, model.getObject().getDynRealms());
+
+        panel.add(new ActionLink<UserTO>() {
+
+            private static final long serialVersionUID = -7978723352517770644L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
+                UserTO clone = SerializationUtils.clone(model.getObject());
+                clone.setKey(null);
+                clone.setUsername(model.getObject().getUsername() + "_clone");
+                send(UserDirectoryPanel.this, Broadcast.EXACT,
+                        new AjaxWizard.NewItemActionEvent<>(new UserWrapper(clone), target));
+            }
+
+            @Override
+            protected boolean statusCondition(final UserTO modelObject) {
+                return addAjaxLink.isVisibleInHierarchy() && realm.startsWith(SyncopeConstants.ROOT_REALM);
+            }
+        }, ActionType.CLONE, StandardEntitlement.USER_CREATE).setRealm(realm);
 
         panel.add(new ActionLink<UserTO>() {
 
@@ -395,7 +433,7 @@ public class UserDirectoryPanel extends AnyDirectoryPanel<UserTO, UserRestClient
                     SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
                     target.add(container);
                 } catch (Exception e) {
-                    LOG.error("While deleting object {}", model.getObject().getKey(), e);
+                    LOG.error("While deleting user {}", model.getObject().getKey(), e);
                     SyncopeConsoleSession.get().error(
                             StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
                 }
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java
index 3a14f41..5160359 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.client.console.policies;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -77,8 +76,6 @@ public class PolicyRuleDirectoryPanel<T extends PolicyTO> extends DirectoryPanel
 
     private static final long serialVersionUID = 4984337552918213290L;
 
-    private static final ObjectMapper MAPPER = new ObjectMapper();
-
     private final BaseModal<T> baseModal;
 
     private final PolicyType type;
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleWizardBuilder.java
index 855837e..982a496 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleWizardBuilder.java
@@ -38,6 +38,7 @@ import org.apache.syncope.common.lib.types.ImplementationEngine;
 import org.apache.syncope.common.lib.types.ImplementationType;
 import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.wicket.PageReference;
+import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.extensions.wizard.WizardModel;
@@ -93,7 +94,7 @@ public class PolicyRuleWizardBuilder extends AjaxWizardBuilder<PolicyRuleWrapper
                 rule.setBody(MAPPER.writeValueAsString(modelObject.getConf()));
                 implementationClient.update(rule);
             } catch (Exception e) {
-                throw new RuntimeException(e);
+                throw new WicketRuntimeException(e);
             }
         }
 
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/policies/ProvisioningPolicyModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/policies/ProvisioningPolicyModalPanel.java
index 4f86f93..23155c0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/policies/ProvisioningPolicyModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/policies/ProvisioningPolicyModalPanel.java
@@ -54,6 +54,7 @@ import org.apache.syncope.common.lib.types.ImplementationType;
 import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.syncope.common.lib.types.SchemaType;
 import org.apache.wicket.PageReference;
+import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.panel.Panel;
@@ -156,7 +157,7 @@ public class ProvisioningPolicyModalPanel extends AbstractModalPanel<Provisionin
                     try {
                         implRestClient.update(rule.getImpl());
                     } catch (Exception e) {
-                        throw new RuntimeException(e);
+                        throw new WicketRuntimeException(e);
                     }
                 }
             });
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
index 7b7edd1..5b17389 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.client.console.reports;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -73,8 +72,6 @@ public class ReportletDirectoryPanel extends DirectoryPanel<
 
     private static final long serialVersionUID = 4984337552918213290L;
 
-    private static final ObjectMapper MAPPER = new ObjectMapper();
-
     private final BaseModal<ReportTO> baseModal;
 
     private final String report;
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWizardBuilder.java
index 17785b0..5b43f30 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWizardBuilder.java
@@ -34,6 +34,7 @@ import org.apache.syncope.common.lib.to.ReportTO;
 import org.apache.syncope.common.lib.types.ImplementationEngine;
 import org.apache.syncope.common.lib.types.ImplementationType;
 import org.apache.wicket.PageReference;
+import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.extensions.wizard.WizardModel;
@@ -70,7 +71,7 @@ public class ReportletWizardBuilder extends AjaxWizardBuilder<ReportletWrapper>
                 reportlet.setBody(MAPPER.writeValueAsString(modelObject.getConf()));
                 implementationClient.update(reportlet);
             } catch (Exception e) {
-                throw new RuntimeException(e);
+                throw new WicketRuntimeException(e);
             }
         }
 
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/AuditHistoryRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/AuditHistoryRestClient.java
index fd3da6a..8666aa1 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/AuditHistoryRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/AuditHistoryRestClient.java
@@ -18,41 +18,55 @@
  */
 package org.apache.syncope.client.console.rest;
 
+import java.util.List;
 import org.apache.syncope.common.lib.to.AuditEntryTO;
 import org.apache.syncope.common.lib.types.AuditElements;
 import org.apache.syncope.common.rest.api.beans.AuditQuery;
 import org.apache.syncope.common.rest.api.service.AuditService;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
 
-import java.util.List;
-
 public class AuditHistoryRestClient extends BaseRestClient {
+
     private static final long serialVersionUID = -381814125643246243L;
 
-    public List<AuditEntryTO> search(final String key,
-                                     final int page,
-                                     final int size,
-                                     final SortParam<String> sort,
-                                     final List<String> events,
-                                     final AuditElements.Result result) {
-        AuditQuery query = new AuditQuery.Builder(key)
-            .size(size)
-            .page(page)
-            .events(events)
-            .result(result)
-            .orderBy(toOrderBy(sort))
-            .build();
+    public List<AuditEntryTO> search(
+            final String key,
+            final int page,
+            final int size,
+            final AuditElements.EventCategoryType type,
+            final String category,
+            final List<String> events,
+            final AuditElements.Result result,
+            final SortParam<String> sort) {
+
+        AuditQuery query = new AuditQuery.Builder(key).
+                size(size).
+                page(page).
+                type(type).
+                category(category).
+                events(events).
+                result(result).
+                orderBy(toOrderBy(sort)).
+                build();
+
         return getService(AuditService.class).search(query).getResult();
     }
 
-    public int count(final String key,
-                     final List<String> events,
-                     final AuditElements.Result result) {
-        AuditQuery query = new AuditQuery.Builder(key)
-            .events(events)
-            .result(result)
-            .build();
+    public int count(
+            final String key,
+            final AuditElements.EventCategoryType type,
+            final String category,
+            final List<String> events,
+            final AuditElements.Result result) {
+
+        AuditQuery query = new AuditQuery.Builder(key).
+                page(1).
+                size(1).
+                type(type).
+                category(category).
+                events(events).
+                result(result).
+                build();
         return getService(AuditService.class).search(query).getTotalCount();
     }
 }
-
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorHistoryRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorHistoryRestClient.java
deleted file mode 100644
index 9178569..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorHistoryRestClient.java
+++ /dev/null
@@ -1,50 +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.client.console.rest;
-
-import java.util.Collections;
-import java.util.List;
-import org.apache.syncope.common.lib.to.ConnInstanceHistoryConfTO;
-import org.apache.syncope.common.rest.api.service.ConnectorHistoryService;
-
-/**
- * Console client for invoking Rest Connector configuration history services.
- */
-public class ConnectorHistoryRestClient extends BaseRestClient {
-
-    private static final long serialVersionUID = -1917949374689773018L;
-
-    public List<ConnInstanceHistoryConfTO> list(final String key) {
-        List<ConnInstanceHistoryConfTO> connHistoryConfs = Collections.<ConnInstanceHistoryConfTO>emptyList();
-        try {
-            connHistoryConfs = getService(ConnectorHistoryService.class).list(key);
-        } catch (Exception e) {
-            LOG.error("While reading connector history configuration instances", e);
-        }
-        return connHistoryConfs;
-    }
-
-    public void delete(final String key) {
-        getService(ConnectorHistoryService.class).delete(key);
-    }
-
-    public void restore(final String key) {
-        getService(ConnectorHistoryService.class).restore(key);
-    }
-}
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceHistoryRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceHistoryRestClient.java
deleted file mode 100644
index 9efb783..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceHistoryRestClient.java
+++ /dev/null
@@ -1,50 +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.client.console.rest;
-
-import java.util.Collections;
-import java.util.List;
-import org.apache.syncope.common.lib.to.ResourceHistoryConfTO;
-import org.apache.syncope.common.rest.api.service.ResourceHistoryService;
-
-/**
- * Console client for invoking Rest Resource configuration history services.
- */
-public class ResourceHistoryRestClient extends BaseRestClient {
-
-    private static final long serialVersionUID = -5722829010510310887L;
-
-    public List<ResourceHistoryConfTO> list(final String key) {
-        List<ResourceHistoryConfTO> resHistoryConfs = Collections.<ResourceHistoryConfTO>emptyList();
-        try {
-            resHistoryConfs = getService(ResourceHistoryService.class).list(key);
-        } catch (Exception e) {
-            LOG.error("While reading resource history configuration instances", e);
-        }
-        return resHistoryConfs;
-    }
-
-    public void delete(final String key) {
-        getService(ResourceHistoryService.class).delete(key);
-    }
-
-    public void restore(final String key) {
-        getService(ResourceHistoryService.class).restore(key);
-    }
-}
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyTogglePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyTogglePanel.java
index 310aa13..9f79016 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyTogglePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyTogglePanel.java
@@ -18,14 +18,15 @@
  */
 package org.apache.syncope.client.console.topology;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import java.io.Serializable;
 import java.text.MessageFormat;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.audit.AuditHistoryModal;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.pages.BasePage;
-import org.apache.syncope.client.console.panels.HistoryConfList;
 import org.apache.syncope.client.console.panels.ConnObjects;
 import org.apache.syncope.client.console.wizards.resources.ConnectorWizardBuilder;
 import org.apache.syncope.client.console.wizards.resources.ResourceWizardBuilder;
@@ -44,9 +45,8 @@ import org.apache.syncope.client.console.wizards.resources.AbstractResourceWizar
 import org.apache.syncope.client.console.wizards.resources.ResourceProvisionPanel;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
-import org.apache.syncope.common.lib.to.ItemTO;
-import org.apache.syncope.common.lib.to.ProvisionTO;
 import org.apache.syncope.common.lib.to.ResourceTO;
+import org.apache.syncope.common.lib.types.AuditElements;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -68,6 +68,8 @@ public class TopologyTogglePanel extends TogglePanel<Serializable> {
 
     private static final long serialVersionUID = -2025535531121434056L;
 
+    private static final ObjectMapper MAPPER = new ObjectMapper();
+
     private final ResourceRestClient resourceRestClient = new ResourceRestClient();
 
     private final ConnectorRestClient connectorRestClient = new ConnectorRestClient();
@@ -335,11 +337,33 @@ public class TopologyTogglePanel extends TogglePanel<Serializable> {
 
             @Override
             public void onClick(final AjaxRequestTarget target) {
-                String connKey = String.class.cast(node.getKey());
-                ConnInstanceTO connInstance = connectorRestClient.read(connKey);
-
-                target.add(historyModal.setContent(
-                        new HistoryConfList<>(historyModal, connKey, pageRef, connInstance)));
+                ConnInstanceTO modelObject = connectorRestClient.read(node.getKey());
+
+                target.add(historyModal.setContent(new AuditHistoryModal<ConnInstanceTO>(
+                        historyModal,
+                        AuditElements.EventCategoryType.LOGIC,
+                        "ConnectorLogic",
+                        modelObject,
+                        StandardEntitlement.CONNECTOR_UPDATE,
+                        pageRef) {
+
+                    private static final long serialVersionUID = -3225348282675513648L;
+
+                    @Override
+                    protected void restore(final ConnInstanceTO updated, final AjaxRequestTarget target) {
+                        try {
+                            connectorRestClient.update(updated);
+
+                            SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
+                            toggle(target, false);
+                        } catch (Exception e) {
+                            LOG.error("While restoring connector {}", node.getKey(), e);
+                            SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage())
+                                    ? e.getClass().getName() : e.getMessage());
+                        }
+                        ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
+                    }
+                }));
 
                 historyModal.header(
                         new Model<>(MessageFormat.format(getString("connector.menu.history"), node.getDisplayName())));
@@ -353,7 +377,8 @@ public class TopologyTogglePanel extends TogglePanel<Serializable> {
             }
 
         };
-        MetaDataRoleAuthorizationStrategy.authorize(history, RENDER, StandardEntitlement.CONNECTOR_HISTORY_LIST);
+        MetaDataRoleAuthorizationStrategy.authorize(history, RENDER,
+                String.format("%s,%s", StandardEntitlement.CONNECTOR_READ, StandardEntitlement.AUDIT_LIST));
         fragment.add(history);
 
         return fragment;
@@ -566,11 +591,33 @@ public class TopologyTogglePanel extends TogglePanel<Serializable> {
 
             @Override
             public void onClick(final AjaxRequestTarget target) {
-                String resourceKey = String.class.cast(node.getKey());
-                final ResourceTO modelObject = resourceRestClient.read(String.class.cast(node.getKey()));
+                ResourceTO modelObject = resourceRestClient.read(node.getKey());
 
-                target.add(historyModal.setContent(
-                        new HistoryConfList<>(historyModal, resourceKey, pageRef, modelObject)));
+                target.add(historyModal.setContent(new AuditHistoryModal<ResourceTO>(
+                        historyModal,
+                        AuditElements.EventCategoryType.LOGIC,
+                        "ResourceLogic",
+                        modelObject,
+                        StandardEntitlement.RESOURCE_UPDATE,
+                        pageRef) {
+
+                    private static final long serialVersionUID = -3712506022627033811L;
+
+                    @Override
+                    protected void restore(final ResourceTO updated, final AjaxRequestTarget target) {
+                        try {
+                            resourceRestClient.update(updated);
+
+                            SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
+                            toggle(target, false);
+                        } catch (Exception e) {
+                            LOG.error("While restoring resource {}", node.getKey(), e);
+                            SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage())
+                                    ? e.getClass().getName() : e.getMessage());
+                        }
+                        ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
+                    }
+                }));
 
                 historyModal.header(
                         new Model<>(MessageFormat.format(getString("resource.menu.history"), node.getDisplayName())));
@@ -584,7 +631,8 @@ public class TopologyTogglePanel extends TogglePanel<Serializable> {
             }
 
         };
-        MetaDataRoleAuthorizationStrategy.authorize(history, RENDER, StandardEntitlement.RESOURCE_HISTORY_LIST);
+        MetaDataRoleAuthorizationStrategy.authorize(history, RENDER,
+                String.format("%s,%s", StandardEntitlement.RESOURCE_READ, StandardEntitlement.AUDIT_LIST));
         fragment.add(history);
 
         // [SYNCOPE-1161] - Option to clone a resource
@@ -600,20 +648,16 @@ public class TopologyTogglePanel extends TogglePanel<Serializable> {
                     // reset some resource objects keys
                     if (resource.getOrgUnit() != null) {
                         resource.getOrgUnit().setKey(null);
-                        for (ItemTO item : resource.getOrgUnit().getItems()) {
-                            item.setKey(null);
-                        }
+                        resource.getOrgUnit().getItems().forEach(item -> item.setKey(null));
                     }
-                    for (ProvisionTO provision : resource.getProvisions()) {
+                    resource.getProvisions().forEach(provision -> {
                         provision.setKey(null);
                         if (provision.getMapping() != null) {
-                            for (ItemTO item : provision.getMapping().getItems()) {
-                                item.setKey(null);
-                            }
+                            provision.getMapping().getItems().forEach(item -> item.setKey(null));
                             provision.getMapping().getLinkingItems().clear();
                         }
                         provision.getVirSchemas().clear();
-                    }
+                    });
                     resourceRestClient.create(resource);
 
                     // refresh Topology
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/extensions/markup/html/repeater/data/table/AjaxFallbackDataTable.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/extensions/markup/html/repeater/data/table/AjaxFallbackDataTable.java
index 9cfa769..ecd70d0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/extensions/markup/html/repeater/data/table/AjaxFallbackDataTable.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/extensions/markup/html/repeater/data/table/AjaxFallbackDataTable.java
@@ -50,9 +50,15 @@ public class AjaxFallbackDataTable<T extends Serializable, S> extends DataTable<
 
     private ActionLinksTogglePanel<T> togglePanel;
 
-    public AjaxFallbackDataTable(final String id, final List<? extends IColumn<T, S>> columns,
-            final ISortableDataProvider<T, S> dataProvider, final int rowsPerPage, final WebMarkupContainer container) {
+    public AjaxFallbackDataTable(
+            final String id,
+            final List<? extends IColumn<T, S>> columns,
+            final ISortableDataProvider<T, S> dataProvider,
+            final int rowsPerPage,
+            final WebMarkupContainer container) {
+
         super(id, columns, dataProvider, rowsPerPage);
+
         setOutputMarkupId(true);
         setVersioned(false);
 
@@ -67,7 +73,7 @@ public class AjaxFallbackDataTable<T extends Serializable, S> extends DataTable<
                     final String borderId, final S property, final ISortStateLocator<S> locator) {
                 return new AjaxFallbackOrderByBorder<S>(borderId, property, locator) {
 
-                    private static final long serialVersionUID = 1L;
+                    private static final long serialVersionUID = -5729452929468028615L;
 
                     @Override
                     protected void onAjaxClick(final AjaxRequestTarget target) {
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
index 67afe12..d62156f 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
@@ -77,7 +77,6 @@ public abstract class ActionLink<T extends Serializable> implements Serializable
         EXPORT_PDF("read"),
         EXPORT_RTF("read"),
         EXPORT_XML("read"),
-        RESTORE("import"),
         SUSPEND("update"),
         REACTIVATE("update"),
         RELOAD("import"),
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel.java
index c708624..d269c0a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel.java
@@ -60,6 +60,7 @@ public final class ActionsPanel<T extends Serializable> extends Panel {
             final ActionLink<T> link,
             final ActionLink.ActionType type,
             final String entitlements) {
+
         return add(link, type, entitlements, false);
     }
 
@@ -69,7 +70,7 @@ public final class ActionsPanel<T extends Serializable> extends Panel {
             final String entitlements,
             final boolean onConfirm) {
 
-        final Action<T> action = new Action<>(link, type);
+        Action<T> action = new Action<>(link, type);
         action.setEntitlements(entitlements);
         action.setOnConfirm(onConfirm);
         actions.add(action);
@@ -77,22 +78,21 @@ public final class ActionsPanel<T extends Serializable> extends Panel {
     }
 
     public ActionsPanel<T> clone(final String componentId, final IModel<T> model) {
-        final ActionsPanel<T> panel = new ActionsPanel<>(componentId, model);
+        ActionsPanel<T> panel = new ActionsPanel<>(componentId, model);
         panel.actions.addAll(actions);
         return panel;
     }
 
     /**
      * Use this with toggle panels.
+     *
      * @param componentId Component Id.
      * @param model Model.
      * @return Actions panel.
      */
     public ActionsPanel<T> cloneWithLabels(final String componentId, final IModel<T> model) {
-        final ActionsPanel<T> panel = new ActionsPanel<>(componentId, model);
-        for (Action<T> action : actions) {
-            panel.actions.add(action.showLabel());
-        }
+        ActionsPanel<T> panel = new ActionsPanel<>(componentId, model);
+        actions.forEach(action -> panel.actions.add(action.showLabel()));
         return panel;
     }
 
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
index c84a05b..d8938e3 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
@@ -51,6 +51,7 @@ import org.apache.wicket.Application;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.Session;
 import org.apache.wicket.ThreadContext;
+import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.model.IModel;
@@ -390,7 +391,7 @@ public abstract class AjaxWizard<T extends Serializable> extends Wizard
 
             return res.getRight();
         } catch (InterruptedException | ExecutionException e) {
-            throw new RuntimeException(e);
+            throw new WicketRuntimeException(e);
         }
     }
 
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
index 57b8226..0e5bc89 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
@@ -359,9 +359,7 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
      * @param modal target modal.
      */
     protected void setWindowClosedReloadCallback(final BaseModal<?> modal) {
-        modal.setWindowClosedCallback(target -> {
-            modal.show(false);
-        });
+        modal.setWindowClosedCallback(target -> modal.show(false));
     }
 
     /**
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyObjectWrapper.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyObjectWrapper.java
index 3855bd8..8611db3 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyObjectWrapper.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyObjectWrapper.java
@@ -38,5 +38,4 @@ public class AnyObjectWrapper extends AnyWrapper<AnyObjectTO> {
     public AnyObjectTO getPreviousAnyObjectTO() {
         return previousAnyObjectTO;
     }
-
 }
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWrapper.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWrapper.java
index 85698ca..095cef5 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWrapper.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWrapper.java
@@ -34,5 +34,4 @@ public class AnyWrapper<T extends AnyTO> implements Serializable {
     public T getInnerObject() {
         return anyTO;
     }
-
 }
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/audit/HistoryAuditDetails.html b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryDetails.html
similarity index 72%
rename from client/console/src/main/resources/org/apache/syncope/client/console/audit/HistoryAuditDetails.html
rename to client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryDetails.html
index da89934..78e44ed 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/audit/HistoryAuditDetails.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryDetails.html
@@ -19,9 +19,11 @@ under the License.
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
   <wicket:panel>
 
-    <form wicket:id="form">
-      <span wicket:id="compareDropdown"></span>
-    </form>
+    <div style="padding-left: 1%;padding-right: 1%;text-align: center;">
+      <div class="pull-left"><strong><span wicket:id="current"/></strong></div>
+      <a href="#" wicket:id="restore" wicket:message="title:restore"><i class="fa fa-history fa-2x"></i></a>
+      <div class="pull-right"><strong><span wicket:id="previous"/></strong></div>
+    </div>
 
     <div wicket:id="content"></div>
 
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/audit/HistoryAuditDetails.properties b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryDetails.properties
similarity index 94%
rename from client/console/src/main/resources/org/apache/syncope/client/console/audit/HistoryAuditDetails.properties
rename to client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryDetails.properties
index b1406fe..cec89d0 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/audit/HistoryAuditDetails.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryDetails.properties
@@ -14,6 +14,6 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-history.view=History view
-compare=Compare with
 current=Current
+previous=Previous
+restore=Restore
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal.properties b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryDetails_fr_CA.properties
similarity index 92%
copy from client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal.properties
copy to client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryDetails_fr_CA.properties
index e2abe89..6073f49 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryDetails_fr_CA.properties
@@ -14,6 +14,6 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-who=Who
-date=Date
-audit.diff.view=Configuration
+current=Courant
+previous=Pr\u00e9c\u00e9dent
+restore=Restaurer
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal.properties b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryDetails_it.properties
similarity index 93%
copy from client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal.properties
copy to client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryDetails_it.properties
index e2abe89..7af93d8 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryDetails_it.properties
@@ -14,6 +14,6 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-who=Who
-date=Date
-audit.diff.view=Configuration
+current=Attuale
+previous=Precedente
+restore=Ripristina
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/audit/HistoryAuditDetails_ja.properties b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryDetails_ja.properties
similarity index 94%
rename from client/console/src/main/resources/org/apache/syncope/client/console/audit/HistoryAuditDetails_ja.properties
rename to client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryDetails_ja.properties
index b1406fe..cec89d0 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/audit/HistoryAuditDetails_ja.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryDetails_ja.properties
@@ -14,6 +14,6 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-history.view=History view
-compare=Compare with
 current=Current
+previous=Previous
+restore=Restore
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/audit/HistoryAuditDetails_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryDetails_pt_BR.properties
similarity index 94%
rename from client/console/src/main/resources/org/apache/syncope/client/console/audit/HistoryAuditDetails_pt_BR.properties
rename to client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryDetails_pt_BR.properties
index b1406fe..cec89d0 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/audit/HistoryAuditDetails_pt_BR.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryDetails_pt_BR.properties
@@ -14,6 +14,6 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-history.view=History view
-compare=Compare with
 current=Current
+previous=Previous
+restore=Restore
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/audit/HistoryAuditDetails_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryDetails_ru.properties
similarity index 94%
rename from client/console/src/main/resources/org/apache/syncope/client/console/audit/HistoryAuditDetails_ru.properties
rename to client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryDetails_ru.properties
index b1406fe..cec89d0 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/audit/HistoryAuditDetails_ru.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryDetails_ru.properties
@@ -14,6 +14,6 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-history.view=History view
-compare=Compare with
 current=Current
+previous=Previous
+restore=Restore
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal.properties b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal.properties
index e2abe89..3896fbb 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal.properties
@@ -16,4 +16,4 @@
 # under the License.
 who=Who
 date=Date
-audit.diff.view=Configuration
+audit.diff.view=History view
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal.properties b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal_fr_CA.properties
similarity index 96%
copy from client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal.properties
copy to client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal_fr_CA.properties
index e2abe89..c053b7b 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal_fr_CA.properties
@@ -16,4 +16,4 @@
 # under the License.
 who=Who
 date=Date
-audit.diff.view=Configuration
+audit.diff.view=Vue historique
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal_it.properties
index e2abe89..a6f4786 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal_it.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal_it.properties
@@ -16,4 +16,4 @@
 # under the License.
 who=Who
 date=Date
-audit.diff.view=Configuration
+audit.diff.view=Vista storica
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal_ja.properties b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal_ja.properties
index e2abe89..3896fbb 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal_ja.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal_ja.properties
@@ -16,4 +16,4 @@
 # under the License.
 who=Who
 date=Date
-audit.diff.view=Configuration
+audit.diff.view=History view
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal_pt_BR.properties
index e2abe89..3896fbb 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal_pt_BR.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal_pt_BR.properties
@@ -16,4 +16,4 @@
 # under the License.
 who=Who
 date=Date
-audit.diff.view=Configuration
+audit.diff.view=History view
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal_ru.properties
index e2abe89..3896fbb 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal_ru.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/audit/AuditHistoryModal_ru.properties
@@ -16,4 +16,4 @@
 # under the License.
 who=Who
 date=Date
-audit.diff.view=Configuration
+audit.diff.view=History view
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/audit/HistoryAuditDetails_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/audit/HistoryAuditDetails_it.properties
deleted file mode 100644
index e128bca..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/audit/HistoryAuditDetails_it.properties
+++ /dev/null
@@ -1,19 +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.
-history.view=Storico vista
-compare=paragonare con
-current=presente
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfDetails.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfDetails.html
deleted file mode 100644
index da89934..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfDetails.html
+++ /dev/null
@@ -1,29 +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.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <wicket:panel>
-
-    <form wicket:id="form">
-      <span wicket:id="compareDropdown"></span>
-    </form>
-
-    <div wicket:id="content"></div>
-
-  </wicket:panel>
-</html>
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfDetails.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfDetails.properties
deleted file mode 100644
index 0abe803..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfDetails.properties
+++ /dev/null
@@ -1,23 +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.
-creation=Creation date
-creator=Creator
-entityKey=Local ID
-history.view=History view
-resource=Resource
-compare=Compare with
-current=Current
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfDetails_fr_CA.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfDetails_fr_CA.properties
deleted file mode 100644
index 4977063..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfDetails_fr_CA.properties
+++ /dev/null
@@ -1,23 +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.
-creation=Date de cr�ation
-creator=Cr�� par
-entityKey=ID local
-history.view=Afficher historique
-resource=Ressource
-compare=Comparer avec
-current=Actuel
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfDetails_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfDetails_it.properties
deleted file mode 100644
index bac0d9c..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfDetails_it.properties
+++ /dev/null
@@ -1,23 +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.
-creation=Data di creazione
-creator=Creatore
-entityKey=ID locale
-history.view=Configurazione
-resource=Risorsa
-compare=Confronta con
-current=Corrente
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfDetails_ja.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfDetails_ja.properties
deleted file mode 100644
index efe910c..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfDetails_ja.properties
+++ /dev/null
@@ -1,23 +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.
-creation=\u4f5c\u6210\u65e5
-creator=\u4f5c\u6210\u8005
-entityKey=\u30ed\u30fc\u30ab\u30eb ID
-history.view=\u5c65\u6b74\u30d3\u30e5\u30fc
-resource=\u30ea\u30bd\u30fc\u30b9
-compare=\u6bd4\u8f03...
-current=\u73fe\u5728
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfDetails_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfDetails_pt_BR.properties
deleted file mode 100644
index 192a559..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfDetails_pt_BR.properties
+++ /dev/null
@@ -1,23 +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.
-creation=Cria\u00e7\u00e3o
-creator=O Criador
-entityKey=ID local
-history.view=Configura\u00e7\u00e3o
-resource=Recurso
-compare=Compare com
-current=Atual
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfDetails_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfDetails_ru.properties
deleted file mode 100644
index 7b17b31..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfDetails_ru.properties
+++ /dev/null
@@ -1,23 +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.
-creation=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435
-creator=\u0442\u0432\u043e\u0440\u0435\u0446
-entityKey=\u041c\u0435\u0441\u0442\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440
-history.view=\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f
-resource=\u0420\u0435\u0441\u0443\u0440\u0441
-compare=\u0421\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0441
-current=\u0422\u0435\u043a\u0443\u0449\u0438\u0439
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfList.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfList.html
deleted file mode 100644
index 1cae5af..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfList.html
+++ /dev/null
@@ -1,23 +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.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <wicket:panel>
-    <span wicket:id="history">[HISTORY]</span>
-  </wicket:panel>
-</html>
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfList.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfList.properties
deleted file mode 100644
index 5546931..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfList.properties
+++ /dev/null
@@ -1,21 +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.
-creation=Creation date
-creator=Creator
-entityKey=Local ID
-history.diff.view=Configuration
-resource=Resource
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfList_fr_CA.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfList_fr_CA.properties
deleted file mode 100644
index 5a090f6..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfList_fr_CA.properties
+++ /dev/null
@@ -1,21 +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.
-creation=Date de cr�ation
-creator=Cr�� par
-entityKey=ID local
-history.diff.view=Configuration
-resource=Ressource
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfList_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfList_it.properties
deleted file mode 100644
index 88c8bb3..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfList_it.properties
+++ /dev/null
@@ -1,21 +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.
-creation=Data di creazione
-creator=Creatore
-entityKey=ID locale
-history.diff.view=Configurazione
-resource=Risorsa
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfList_ja.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfList_ja.properties
deleted file mode 100644
index 991fa5f..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfList_ja.properties
+++ /dev/null
@@ -1,21 +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.
-creation=\u4f5c\u6210\u65e5
-creator=\u4f5c\u6210\u8005
-entityKey=\u30ed\u30fc\u30ab\u30eb ID
-history.diff.view=\u8a2d\u5b9a
-resource=\u30ea\u30bd\u30fc\u30b9
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfList_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfList_pt_BR.properties
deleted file mode 100644
index 813728d..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfList_pt_BR.properties
+++ /dev/null
@@ -1,21 +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.
-creation=Cria\u00e7\u00e3o
-creator=O Criador
-entityKey=ID local
-history.diff.view=Configura\u00e7\u00e3o
-resource=Recurso
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfList_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfList_ru.properties
deleted file mode 100644
index 4f278d7..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/HistoryConfList_ru.properties
+++ /dev/null
@@ -1,21 +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.
-creation=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435
-creator=\u0442\u0432\u043e\u0440\u0435\u0446
-entityKey=\u041c\u0435\u0441\u0442\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440
-history.diff.view=\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f
-resource=\u0420\u0435\u0441\u0443\u0440\u0441
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel.properties
index be4d4d1..b197829 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel.properties
@@ -134,8 +134,8 @@ execute.title=execute
 execute.alt=execute icon
 
 password_management.class=fa fa-shield
-password_management.title=password management
-password_management.alt=password management icon
+password_management.title=manage password
+password_management.alt=manage password icon
 
 request_password_reset.class=fa fa-user-secret
 request_password_reset.title=request password reset
@@ -185,10 +185,6 @@ export_xml.class=fa fa-file-excel-o
 export_xml.title=export as xml
 export_xml.alt=export as xml icon
 
-restore.class=fa fa-arrow-circle-down
-restore.title=restore
-restore.alt=restore icon
-
 suspend.class=glyphicon glyphicon-ban-circle
 suspend.title=suspend
 suspend.alt=suspend icon
@@ -282,5 +278,5 @@ workflow_modeler.title=workflow modeler
 workflow_modeler.alt=workflow modeler icon
 
 view_audit_history.class=fa fa-history
-view_audit_history.title=history management
-view_audit_history.alt=history management icon
+view_audit_history.title=manage history
+view_audit_history.alt=manage history icon
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel_fr_CA.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel_fr_CA.properties
index b23f3e9..f2a3581 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel_fr_CA.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel_fr_CA.properties
@@ -16,202 +16,202 @@
 # under the License.
 mapping.class=fa fa-exchange
 mapping.title=configuration
-mapping.alt=ic�ne configuration
+mapping.alt=ic\u00f4ne configuration
 mustchangepassword.class=fa fa-lock
-mustchangepassword.title=case le mot de passe doit �tre chang�
-mustchangepassword.alt=case ic�ne pour changement de mot de passe
+mustchangepassword.title=case le mot de passe doit \u00eatre chang\u00e9
+mustchangepassword.alt=case ic\u00f4ne pour changement de mot de passe
 set_latest_sync_token.class=fa fa-hourglass-start
-set_latest_sync_token.title=configurer jeton derni�re sync
-set_latest_sync_token.alt=ic�ne configurer jeton derni�re sync
+set_latest_sync_token.title=configurer jeton derni\u00e8re sync
+set_latest_sync_token.alt=ic\u00f4ne configurer jeton derni\u00e8re sync
 remove_sync_token.class=fa fa-hourglass-o
 remove_sync_token.title=retirer jeton sync
-remove_sync_token.alt=ic�ne retirer jeton sync
+remove_sync_token.alt=ic\u00f4ne retirer jeton sync
 clone.class=fa fa-clone
 clone.title=cloner
-clone.alt=ic�ne cl�ner
+clone.alt=ic\u00f4ne cl\u00f4ner
 create.class=glyphicon glyphicon-plus
-create.title=cr�er
-create.alt=ic�ne cr�er
+create.title=cr\u00e9er
+create.alt=ic\u00f4ne cr\u00e9er
 template.class=fa fa-list-alt
-template.title=mod�le
-template.alt=ic�ne mod�le
+template.title=mod\u00e8le
+template.alt=ic\u00f4ne mod\u00e8le
 edit.class=glyphicon glyphicon-pencil
 edit.title=modifier
-edit.alt=ic�ne modifier
+edit.alt=ic\u00f4ne modifier
 manage_approval.class=fa fa-pencil-square-o
-manage_approval.title=g�rer
-manage_approval.alt=ic�ne approbation de gestion
+manage_approval.title=g\u00e9rer
+manage_approval.alt=ic\u00f4ne approbation de gestion
 edit_approval.class=glyphicon glyphicon-pencil
 edit_approval.title=modifier
-edit_approval.alt=ic�ne approbation de modification
+edit_approval.alt=ic\u00f4ne approbation de modification
 type_extensions.class=fa fa-expand
 type_extensions.title=extensions
-type_extensions.alt=ic�ne extensions
+type_extensions.alt=ic\u00f4ne extensions
 fo_edit.class=fa fa-file-code-o
 fo_edit.title=fo
-fo_edit.alt=ic�ne fo
+fo_edit.alt=ic\u00f4ne fo
 fo_manage_approval.class=fa fa-file-code-o
 fo_manage_approval.title=fo
-fo_manage_approval.alt=ic�ne fo
+fo_manage_approval.alt=ic\u00f4ne fo
 fo_edit_approval.class=fa fa-file-code-o
 fo_edit_approval.title=fo
-fo_edit_approval.alt=ic�ne fo
+fo_edit_approval.alt=ic\u00f4ne fo
 html.class=fa fa-file-code-o
 html.title=html
-html.alt=ic�ne html
+html.alt=ic\u00f4ne html
 text.class=fa fa-file-text-o
 text.title=texte
-text.alt=ic�ne texte
+text.alt=ic\u00f4ne texte
 compose.class=fa fa-puzzle-piece
 compose.title=composer
-compose.alt=ic�ne composer
+compose.alt=ic\u00f4ne composer
 layout_edit.class=fa fa-object-ungroup
 layout_edit.title=configuration
-layout_edit.alt=ic�ne configuration
+layout_edit.alt=ic\u00f4ne configuration
 reset.class=fa fa-shield
-reset.title=r�initialiser
-reset.alt=ic�ne r�initialiser
+reset.title=r\u00e9initialiser
+reset.alt=ic\u00f4ne r\u00e9initialiser
 enable.class=fa fa-toggle-on
-enable.title=g�rer statut
-enable.alt=ic�ne activer
+enable.title=g\u00e9rer statut
+enable.alt=ic\u00f4ne activer
 not_found.class=fa fa-eye-slash
-not_found.title=non trouvďż˝
-not_found.alt=ic�ne non trouv�
+not_found.title=non trouv\u00e9
+not_found.alt=ic\u00f4ne non trouv\u00e9
 view.class=fa fa-eye
 view.title=afficher
-view.alt=ic�ne afficher
+view.alt=ic\u00f4ne afficher
 view_executions.class=fa fa-eye
-view_executions.title=afficher ex�citions
-view_executions.alt=ic�ne afficher ex�cutions
+view_executions.title=afficher ex\u00e9citions
+view_executions.alt=ic\u00f4ne afficher ex\u00e9cutions
 view_details.class=fa fa-info-circle
-view_details.title=afficher d�tails
-view_details.alt=ic�ne afficher d�tails
+view_details.title=afficher d\u00e9tails
+view_details.alt=ic\u00f4ne afficher d\u00e9tails
 members.class=fa fa-users
 members.title=membres
-members.alt=ic�ne memnres
+members.alt=ic\u00f4ne memnres
 search.class=glyphicon glyphicon-search
 search.title=rechercher
-search.alt=ic�ne recherche
+search.alt=ic\u00f4ne recherche
 view_executions.class=fa fa-eye
-view_executions.title=ex�cutions
-view_executions.alt=afficher ic�ne ex�cutions
+view_executions.title=ex\u00e9cutions
+view_executions.alt=afficher ic\u00f4ne ex\u00e9cutions
 view_details.class=fa fa-info-circle
-view_details.title=d�tails
-view_details.alt=ic�ne d�tails
+view_details.title=d\u00e9tails
+view_details.alt=ic\u00f4ne d\u00e9tails
 delete.class=glyphicon glyphicon-minus
 delete.title=supprimer
-delete.alt=ic�ne supprimer
+delete.alt=ic\u00f4ne supprimer
 execute.class=fa fa-gear
-execute.title=ex�cuter
-execute.alt=ic�ne ex�cuter
+execute.title=ex\u00e9cuter
+execute.alt=ic\u00f4ne ex\u00e9cuter
 password_management.class=fa fa-shield
 password_management.title=gestion du mot de passe
-password_management.alt=ic�ne gestion du mot de passe
+password_management.alt=ic\u00f4ne gestion du mot de passe
 request_password_reset.class=fa fa-user-secret
-request_password_reset.title=demande de r�initialisation du mot de passe
-request_password_reset.alt=ic�ne r�initialisation du mot de passe
+request_password_reset.title=demande de r\u00e9initialisation du mot de passe
+request_password_reset.alt=ic\u00f4ne r\u00e9initialisation du mot de passe
 dryrun.class=fa fa-gears
-dryrun.title=test ďż˝ blanc
-dryrun.alt=ic�ne test � blanc
+dryrun.title=test \u00e0 blanc
+dryrun.alt=ic\u00f4ne test \u00e0 blanc
 claim.class=fa fa-ticket
 claim.title=obtenir
-claim.alt=ic�ne obtenir
+claim.alt=ic\u00f4ne obtenir
 unclaim.class=fa fa-undo
-unclaim.title=c�der
-unclaim.alt=ic�ne c�der
+unclaim.title=c\u00e9der
+unclaim.alt=ic\u00f4ne c\u00e9der
 select.class=glyphicon glyphicon-ok
-select.title=s�lectionner
-select.alt=ic�ne s�lectionner
+select.title=s\u00e9lectionner
+select.alt=ic\u00f4ne s\u00e9lectionner
 close.class=fa fa-sign-out
 close.title=fermer
-close.alt=ic�ne fermer
+close.alt=ic\u00f4ne fermer
 export.class=fa fa-floppy-o
 export.title=exporter
-export.alt=ic�ne exporter
+export.alt=ic\u00f4ne exporter
 export_csv.class=fa fa-file-text-o
 export_csv.title=exporter en csv
-export_csv.alt=ic�ne exporter en csv
+export_csv.alt=ic\u00f4ne exporter en csv
 export_html.class=fa fa-file-code-o
 export_html.title=exporter en html
-export_html.alt=ic�ne exporter en html
+export_html.alt=ic\u00f4ne exporter en html
 export_pdf.class=fa fa-file-pdf-o
 export_pdf.title=exporter en pdf
-export_pdf.alt=ic�ne exporter en pdf
+export_pdf.alt=ic\u00f4ne exporter en pdf
 export_rtf.class=fa fa-file-word-o
 export_rtf.title=exporter en rtf
-export_rtf.alt=ic�ne exporter en rtf
+export_rtf.alt=ic\u00f4ne exporter en rtf
 export_xml.class=fa fa-file-excel-o
 export_xml.title=exporter en xml
-export_xml.alt=ic�ne exporter en xml
-restore.class=fa fa-arrow-circle-down
-restore.title=restaurer
-restore.alt=ic�ne restaurer
+export_xml.alt=ic\u00f4ne exporter en xml
 suspend.class=glyphicon glyphicon-ban-circle
 suspend.title=interrompre
-suspend.alt=ic�ne interrompre
+suspend.alt=ic\u00f4ne interrompre
 reactivate.class=glyphicon glyphicon-ok-sign
-reactivate.title=r�activer
-reactivate.alt=ic�ne r�activer
-reload.class=fa fa-r�p�ter
+reactivate.title=r\u00e9activer
+reactivate.alt=ic\u00f4ne r\u00e9activer
+reload.class=fa fa-r\u00e9p\u00e9ter
 reload.title=recharger
-reload.alt=ic�ne recharger
+reload.alt=ic\u00f4ne recharger
 change_view.class=fa fa-list
 change_view.title=changer affichage
-change_view.alt=ic�ne changer affichage
+change_view.alt=ic\u00f4ne changer affichage
 unlink.class=fa fa-unlink
 unlink.title=dissocier 
-unlink.alt=ic�ne dissocier
+unlink.alt=ic\u00f4ne dissocier
 link.class=fa fa-link
 link.title=lien
-link.alt=ic�ne lien
+link.alt=ic\u00f4ne lien
 unassign.class=glyphicon glyphicon-resize-full
-unassign.title=d�assigner
-unassign.alt=ic�ne d�assigner
+unassign.title=d\u00e9assigner
+unassign.alt=ic\u00f4ne d\u00e9assigner
 assign.class=glyphicon glyphicon-resize-small
 assign.title=assigner
-assign.alt=ic�ne assigner
+assign.alt=ic\u00f4ne assigner
 deprovision.class=glyphicon glyphicon-fast-backward
-deprovision.title=d�sattribution
-deprovision.alt=ic�ne d�sattribution
+deprovision.title=d\u00e9sattribution
+deprovision.alt=ic\u00f4ne d\u00e9sattribution
 provision.class=glyphicon glyphicon-fast-forward
 provision.title=provision
-provision.alt=ic�ne provision
+provision.alt=ic\u00f4ne provision
 deprovision_members.class=glyphicon glyphicon-fast-backward
 deprovision_members.title=Retirer des membres
-deprovision_members.alt=ic�ne retirer des membres
+deprovision_members.alt=ic\u00f4ne retirer des membres
 provision_members.class=glyphicon glyphicon-fast-forward
-provision_members.title=faire adh�rer membres
-provision_members.alt=ic�ne faire adh�rer membres
+provision_members.title=faire adh\u00e9rer membres
+provision_members.alt=ic\u00f4ne faire adh\u00e9rer membres
 reconciliation_push.class=fa fa-chevron-circle-right
 reconciliation_push.title=push
-reconciliation_push.alt=ic�ne push r�conciliation
+reconciliation_push.alt=ic\u00f4ne push r\u00e9conciliation
 reconciliation_pull.class=fa fa-chevron-circle-left
 reconciliation_pull.title=pull
-reconciliation_pull.alt=ic�ne pull r�conciliation
+reconciliation_pull.alt=ic\u00f4ne pull r\u00e9conciliation
 manage_resources.class=fa fa-sitemap
-manage_resources.title=g�rer ressources
-manage_resources.alt=ic�ne g�rer ressources
+manage_resources.title=g\u00e9rer ressources
+manage_resources.alt=ic\u00f4ne g\u00e9rer ressources
 manage_users.class=fa fa-users
-manage_users.title=g�rer utilisateurs
-manage_users.alt=ic�ne g�rer utilisateurs
+manage_users.title=g\u00e9rer utilisateurs
+manage_users.alt=ic\u00f4ne g\u00e9rer utilisateurs
 manage_groups.class=fa fa-users
-manage_groups.title=g�rer groupes
-manage_groups.alt=ic�ne g�rer groupes
+manage_groups.title=g\u00e9rer groupes
+manage_groups.alt=ic\u00f4ne g\u00e9rer groupes
 propagation_tasks.class=fa fa-arrow-right
-propagation_tasks.title=t�ches de propagation
-propagation_tasks.alt=ic�ne t�ches de propagation
+propagation_tasks.title=t\u00e2ches de propagation
+propagation_tasks.alt=ic\u00f4ne t\u00e2ches de propagation
 notification_tasks.class=fa fa-envelope-o
-notification_tasks.title=t�ches de notification
-notification_tasks.alt=ic�ne t�ches de notification
+notification_tasks.title=t\u00e2ches de notification
+notification_tasks.alt=ic\u00f4ne t\u00e2ches de notification
 zoom_in.class=fa fa-search-plus
 zoom_in.title=zoom-in
-zoom_in.alt=ic�ne zoom-in
+zoom_in.alt=ic\u00f4ne zoom-in
 zoom_out.class=fa fa-search-minus
 zoom_out.title=zoom-out
-zoom_out.alt=ic�ne zoom-out
+zoom_out.alt=ic\u00f4ne zoom-out
 manage_accounts.class=fa fa-users
-manage_accounts.title=g�rer comptes
-manage_accounts.alt=ic�ne g�rer groupes
+manage_accounts.title=g\u00e9rer comptes
+manage_accounts.alt=ic\u00f4ne g\u00e9rer groupes
 workflow_modeler.class=fa fa-picture-o
-workflow_modeler.title=mod�lisateur de workflow
-workflow_modeler.alt=ic�ne mod�lisateur de workflow
+workflow_modeler.title=mod\u00e9lisateur de workflow
+workflow_modeler.alt=ic\u00f4ne mod\u00e9lisateur de workflow
+view_audit_history.title=manage history
+view_audit_history.class=fa fa-history
+view_audit_history.alt=manage history icon
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel_it.properties
index fe1457a..0155d4f 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel_it.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel_it.properties
@@ -136,7 +136,7 @@ execute.alt=execute icon
 
 password_management.class=fa fa-shield
 password_management.title=gestione password
-password_management.alt=password management icon
+password_management.alt=manage password icon
 
 request_password_reset.class=fa fa-user-secret
 request_password_reset.title=richiedi password reset
@@ -182,10 +182,6 @@ export_xml.class=fa fa-file-excel-o
 export_xml.title=export as xml
 export_xml.alt=export as xml icon
 
-restore.class=fa fa-arrow-circle-down
-restore.title=ripristina
-restore.alt=restore icon
-
 suspend.class=glyphicon glyphicon-ban-circle
 suspend.title=sospendi
 suspend.alt=suspend icon
@@ -279,3 +275,6 @@ manage_accounts.alt=manage accounts icon
 view_audit_history.class=fa fa-history
 view_audit_history.title=storico modifiche
 view_audit_history.alt=storico modifiche icon
+unclaim.class=fa fa-undo
+unclaim.alt=unclaim icon
+unclaim.title=ritira
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel_ja.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel_ja.properties
index e23c35e..4f88ec0 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel_ja.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel_ja.properties
@@ -182,10 +182,6 @@ export_xml.class=fa fa-file-excel-o
 export_xml.title=xml \u3068\u3057\u3066\u30a8\u30af\u30b9\u30dd\u30fc\u30c8
 export_xml.alt=xml \u3068\u3057\u3066\u30a8\u30af\u30b9\u30dd\u30fc\u30c8
 
-restore.class=fa fa-arrow-circle-down
-restore.title=\u5fa9\u5143
-restore.alt=\u5fa9\u5143
-
 suspend.class=glyphicon glyphicon-ban-circle
 suspend.title=\u30b5\u30b9\u30da\u30f3\u30c9
 suspend.alt=\u30b5\u30b9\u30da\u30f3\u30c9
@@ -279,5 +275,8 @@ manage_accounts.title=\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u7ba1\u7406\u3059\u30
 manage_accounts.alt=\u30a2\u30ab\u30a6\u30f3\u30c8\u7ba1\u7406\u30a2\u30a4\u30b3\u30f3
 
 view_audit_history.class=fa fa-history
-view_audit_history.title=history management
-view_audit_history.alt=history management icon
+view_audit_history.title=manage history
+view_audit_history.alt=manage history icon
+unclaim.class=fa fa-undo
+unclaim.alt=unclaim icon
+unclaim.title=unclaim
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel_pt_BR.properties
index 9ca5a2a..0d2b609 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel_pt_BR.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel_pt_BR.properties
@@ -134,8 +134,8 @@ execute.title=execute
 execute.alt=execute icon
 
 password_management.class=fa fa-shield
-password_management.title=password management
-password_management.alt=password management icon
+password_management.title=manage password
+password_management.alt=manage password icon
 
 request_password_reset.class=fa fa-user-secret
 request_password_reset.title=request password reset
@@ -185,10 +185,6 @@ export_xml.class=fa fa-file-excel-o
 export_xml.title=export as xml
 export_xml.alt=export as xml icon
 
-restore.class=fa fa-arrow-circle-down
-restore.title=restore
-restore.alt=restore icon
-
 suspend.class=glyphicon glyphicon-ban-circle
 suspend.title=suspend
 suspend.alt=suspend icon
@@ -284,5 +280,8 @@ manage_accounts.title=manage accounts
 manage_accounts.alt=manage accounts icon
 
 view_audit_history.class=fa fa-history
-view_audit_history.title=history management
-view_audit_history.alt=history management icon
+view_audit_history.title=manage history
+view_audit_history.alt=manage history icon
+workflow_modeler.class=fa fa-picture-o
+workflow_modeler.title=workflow modeler icon
+workflow_modeler.alt=workflow modeler icon
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel_ru.properties
index e3ac79b..146652e 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel_ru.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel_ru.properties
@@ -135,8 +135,8 @@ execute.title=execute
 execute.alt=execute icon
 
 password_management.class=fa fa-shield
-password_management.title=password management
-password_management.alt=password management icon
+password_management.title=manage password
+password_management.alt=manage password icon
 
 request_password_reset.class=fa fa-user-secret
 request_password_reset.title=request password reset
@@ -182,10 +182,6 @@ export_xml.class=fa fa-file-excel-o
 export_xml.title=export as xml
 export_xml.alt=export as xml icon
 
-restore.class=fa fa-arrow-circle-down
-restore.title=restore
-restore.alt=restore icon
-
 suspend.class=glyphicon glyphicon-ban-circle
 suspend.title=suspend
 suspend.alt=suspend icon
@@ -278,5 +274,8 @@ manage_accounts.title=manage accounts
 manage_accounts.alt=manage accounts icon
 
 view_audit_history.class=fa fa-history
-view_audit_history.title=history management
-view_audit_history.alt=history management icon
+view_audit_history.title=manage history
+view_audit_history.alt=manage history icon
+unclaim.class=fa fa-undo
+unclaim.alt=unclaim icon
+unclaim.title=unclaim
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractHistoryConf.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractHistoryConf.java
deleted file mode 100644
index 08c2293..0000000
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractHistoryConf.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.common.lib.to;
-
-import java.util.Date;
-import javax.ws.rs.PathParam;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlRootElement(name = "abstractHistoryConf")
-@XmlType
-@XmlSeeAlso({ ConnInstanceHistoryConfTO.class, ResourceHistoryConfTO.class })
-public abstract class AbstractHistoryConf implements EntityTO {
-
-    private static final long serialVersionUID = -8001640160293506651L;
-
-    private String key;
-
-    private String creator;
-
-    private Date creation;
-
-    @Override
-    public String getKey() {
-        return key;
-    }
-
-    @PathParam("key")
-    @Override
-    public void setKey(final String key) {
-        this.key = key;
-    }
-
-    public String getCreator() {
-        return creator;
-    }
-
-    public void setCreator(final String creator) {
-        this.creator = creator;
-    }
-
-    public Date getCreation() {
-        return creation == null
-                ? null
-                : new Date(creation.getTime());
-    }
-
-    public void setCreation(final Date creation) {
-        this.creation = creation == null
-                ? null
-                : new Date(creation.getTime());
-    }
-}
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceHistoryConfTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceHistoryConfTO.java
deleted file mode 100644
index 6583c54..0000000
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceHistoryConfTO.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.common.lib.to;
-
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlRootElement(name = "connInstanceHistoryConf")
-@XmlType
-public class ConnInstanceHistoryConfTO extends AbstractHistoryConf {
-
-    private static final long serialVersionUID = 8067539341757100479L;
-
-    private ConnInstanceTO connInstanceTO;
-
-    public ConnInstanceTO getConnInstanceTO() {
-        return connInstanceTO;
-    }
-
-    public void setConnInstanceTO(final ConnInstanceTO connInstanceTO) {
-        this.connInstanceTO = connInstanceTO;
-    }
-
-}
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceHistoryConfTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceHistoryConfTO.java
deleted file mode 100644
index 5268299..0000000
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceHistoryConfTO.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.common.lib.to;
-
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlRootElement(name = "resourceHistoryConf")
-@XmlType
-public class ResourceHistoryConfTO extends AbstractHistoryConf {
-
-    private static final long serialVersionUID = -7308499697925335157L;
-
-    private ResourceTO resourceTO;
-
-    public ResourceTO getResourceTO() {
-        return resourceTO;
-    }
-
-    public void setResourceTO(final ResourceTO resourceTO) {
-        this.resourceTO = resourceTO;
-    }
-}
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/types/StandardEntitlement.java b/common/lib/src/main/java/org/apache/syncope/common/lib/types/StandardEntitlement.java
index 3d7bcf9..a68c69f 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/types/StandardEntitlement.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/types/StandardEntitlement.java
@@ -146,12 +146,6 @@ public final class StandardEntitlement {
 
     public static final String RESOURCE_LIST_CONNOBJECT = "RESOURCE_LIST_CONNOBJECT";
 
-    public static final String RESOURCE_HISTORY_LIST = "RESOURCE_HISTORY_LIST";
-
-    public static final String RESOURCE_HISTORY_RESTORE = "RESOURCE_HISTORY_RESTORE";
-
-    public static final String RESOURCE_HISTORY_DELETE = "RESOURCE_HISTORY_DELETE";
-
     public static final String CONNECTOR_LIST = "CONNECTOR_LIST";
 
     public static final String CONNECTOR_CREATE = "CONNECTOR_CREATE";
@@ -164,12 +158,6 @@ public final class StandardEntitlement {
 
     public static final String CONNECTOR_RELOAD = "CONNECTOR_RELOAD";
 
-    public static final String CONNECTOR_HISTORY_LIST = "CONNECTOR_HISTORY_LIST";
-
-    public static final String CONNECTOR_HISTORY_RESTORE = "CONNECTOR_HISTORY_RESTORE";
-
-    public static final String CONNECTOR_HISTORY_DELETE = "CONNECTOR_HISTORY_DELETE";
-
     public static final String CONFIGURATION_EXPORT = "CONFIGURATION_EXPORT";
 
     public static final String CONFIGURATION_LIST = "CONFIGURATION_LIST";
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorHistoryService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorHistoryService.java
deleted file mode 100644
index c94799f..0000000
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorHistoryService.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.common.rest.api.service;
-
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.annotations.responses.ApiResponses;
-import io.swagger.v3.oas.annotations.security.SecurityRequirement;
-import io.swagger.v3.oas.annotations.security.SecurityRequirements;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import java.util.List;
-import javax.validation.constraints.NotNull;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import org.apache.syncope.common.lib.to.ConnInstanceHistoryConfTO;
-import org.apache.syncope.common.rest.api.RESTHeaders;
-
-/**
- * REST operations for connector configuration versioning.
- */
-@Tag(name = "ConnectorHistory")
-@SecurityRequirements({
-    @SecurityRequirement(name = "BasicAuthentication"),
-    @SecurityRequirement(name = "Bearer") })
-@Path("connectorsHistory")
-public interface ConnectorHistoryService extends JAXRSService {
-
-    /**
-     * Returns a list of all connector configuration history instances for the given connector instance key.
-     *
-     * @param connectorKey connector instance key
-     * @return list of all connector configuration history instances for the given connector instance key
-     */
-    @GET
-    @Path("{connectorKey}")
-    @Produces({ MediaType.APPLICATION_JSON, RESTHeaders.APPLICATION_YAML, MediaType.APPLICATION_XML })
-    List<ConnInstanceHistoryConfTO> list(@NotNull @PathParam("connectorKey") String connectorKey);
-
-    /**
-     * Restores the connector configuration history instance matching the provided key.
-     *
-     * @param key connector configuration history instance key to be restored
-     */
-    @ApiResponses(
-            @ApiResponse(responseCode = "204", description = "Operation was successful"))
-    @POST
-    @Path("{key}")
-    @Produces({ MediaType.APPLICATION_JSON, RESTHeaders.APPLICATION_YAML, MediaType.APPLICATION_XML })
-    void restore(@NotNull @PathParam("key") String key);
-
-    /**
-     * Deletes the connector configuration history instance matching the provided key.
-     *
-     * @param key connector configuration history instance key to be deleted
-     */
-    @ApiResponses(
-            @ApiResponse(responseCode = "204", description = "Operation was successful"))
-    @DELETE
-    @Path("{key}")
-    @Produces({ MediaType.APPLICATION_JSON, RESTHeaders.APPLICATION_YAML, MediaType.APPLICATION_XML })
-    void delete(@NotNull @PathParam("key") String key);
-}
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceHistoryService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceHistoryService.java
deleted file mode 100644
index 1024f6e..0000000
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceHistoryService.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.common.rest.api.service;
-
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.annotations.responses.ApiResponses;
-import io.swagger.v3.oas.annotations.security.SecurityRequirement;
-import io.swagger.v3.oas.annotations.security.SecurityRequirements;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import java.util.List;
-import javax.validation.constraints.NotNull;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import org.apache.syncope.common.lib.to.ResourceHistoryConfTO;
-import org.apache.syncope.common.rest.api.RESTHeaders;
-
-/**
- * REST operations for resource configuration versioning.
- */
-@Tag(name = "ResourceHistory")
-@SecurityRequirements({
-    @SecurityRequirement(name = "BasicAuthentication"),
-    @SecurityRequirement(name = "Bearer") })
-@Path("resourcesHistory")
-public interface ResourceHistoryService extends JAXRSService {
-
-    /**
-     * Returns a list of all resource configuration history for the given resource key.
-     *
-     * @param resourceKey resource key
-     * @return list of all resource configuration history for the given resource key
-     */
-    @GET
-    @Path("{resourceKey}")
-    @Produces({ MediaType.APPLICATION_JSON, RESTHeaders.APPLICATION_YAML, MediaType.APPLICATION_XML })
-    List<ResourceHistoryConfTO> list(@NotNull @PathParam("resourceKey") String resourceKey);
-
-    /**
-     * Restores the resource configuration history matching the provided key.
-     *
-     * @param key resource configuration history key to be restored
-     */
-    @ApiResponses(
-            @ApiResponse(responseCode = "204", description = "Operation was successful"))
-    @POST
-    @Path("{key}")
-    @Produces({ MediaType.APPLICATION_JSON, RESTHeaders.APPLICATION_YAML, MediaType.APPLICATION_XML })
-    void restore(@NotNull @PathParam("key") String key);
-
-    /**
-     * Deletes the resource configuration history matching the provided key.
-     *
-     * @param key resource configuration history key to be deleted
-     */
-    @ApiResponses(
-            @ApiResponse(responseCode = "204", description = "Operation was successful"))
-    @DELETE
-    @Path("{key}")
-    @Produces({ MediaType.APPLICATION_JSON, RESTHeaders.APPLICATION_YAML, MediaType.APPLICATION_XML })
-    void delete(@NotNull @PathParam("key") String key);
-}
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorHistoryLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorHistoryLogic.java
deleted file mode 100644
index e3a22a8..0000000
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorHistoryLogic.java
+++ /dev/null
@@ -1,98 +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.logic;
-
-import java.lang.reflect.Method;
-import java.util.List;
-import java.util.stream.Collectors;
-import org.apache.syncope.common.lib.to.ConnInstanceHistoryConfTO;
-import org.apache.syncope.common.lib.types.StandardEntitlement;
-import org.apache.syncope.core.persistence.api.dao.ConnInstanceDAO;
-import org.apache.syncope.core.persistence.api.dao.ConnInstanceHistoryConfDAO;
-import org.apache.syncope.core.persistence.api.dao.NotFoundException;
-import org.apache.syncope.core.persistence.api.entity.ConnInstance;
-import org.apache.syncope.core.persistence.api.entity.ConnInstanceHistoryConf;
-import org.apache.syncope.core.provisioning.api.data.ConnInstanceDataBinder;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
-
-@Component
-public class ConnectorHistoryLogic extends AbstractTransactionalLogic<ConnInstanceHistoryConfTO> {
-
-    @Autowired
-    private ConnInstanceHistoryConfDAO connInstanceHistoryConfDAO;
-
-    @Autowired
-    private ConnInstanceDAO connInstanceDAO;
-
-    @Autowired
-    private ConnInstanceDataBinder binder;
-
-    @PreAuthorize("hasRole('" + StandardEntitlement.CONNECTOR_HISTORY_LIST + "')")
-    @Transactional(readOnly = true)
-    public List<ConnInstanceHistoryConfTO> list(final String key) {
-        ConnInstance connInstance = connInstanceDAO.find(key);
-        if (connInstance == null) {
-            throw new NotFoundException("Connector '" + key + "'");
-        }
-
-        return connInstanceHistoryConfDAO.findByEntity(connInstance).stream().
-                map(binder::getConnInstanceHistoryConfTO).collect(Collectors.toList());
-    }
-
-    @PreAuthorize("hasRole('" + StandardEntitlement.CONNECTOR_HISTORY_RESTORE + "')")
-    public void restore(final String key) {
-        ConnInstanceHistoryConf connInstanceHistoryConf = connInstanceHistoryConfDAO.find(key);
-        if (connInstanceHistoryConf == null) {
-            throw new NotFoundException("Connector History Conf '" + key + "'");
-        }
-
-        binder.update(connInstanceHistoryConf.getConf());
-    }
-
-    @PreAuthorize("hasRole('" + StandardEntitlement.CONNECTOR_HISTORY_DELETE + "')")
-    public void delete(final String key) {
-        ConnInstanceHistoryConf connInstanceHistoryConf = connInstanceHistoryConfDAO.find(key);
-        if (connInstanceHistoryConf == null) {
-            throw new NotFoundException("Connector History Conf '" + key + "'");
-        }
-
-        connInstanceHistoryConfDAO.delete(key);
-    }
-
-    @Override
-    protected ConnInstanceHistoryConfTO resolveReference(final Method method, final Object... args)
-            throws UnresolvedReferenceException {
-
-        if (!"list".equals(method.getName())) {
-            try {
-                String key = (String) args[0];
-                return binder.getConnInstanceHistoryConfTO(connInstanceHistoryConfDAO.find(key));
-            } catch (Throwable ignore) {
-                LOG.debug("Unresolved reference", ignore);
-                throw new UnresolvedReferenceException(ignore);
-            }
-        }
-
-        throw new UnresolvedReferenceException();
-    }
-
-}
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceHistoryLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceHistoryLogic.java
deleted file mode 100644
index 42126fb..0000000
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceHistoryLogic.java
+++ /dev/null
@@ -1,98 +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.logic;
-
-import java.lang.reflect.Method;
-import java.util.List;
-import java.util.stream.Collectors;
-import org.apache.syncope.common.lib.to.ResourceHistoryConfTO;
-import org.apache.syncope.common.lib.types.StandardEntitlement;
-import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
-import org.apache.syncope.core.persistence.api.dao.ExternalResourceHistoryConfDAO;
-import org.apache.syncope.core.persistence.api.dao.NotFoundException;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResourceHistoryConf;
-import org.apache.syncope.core.provisioning.api.data.ResourceDataBinder;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
-
-@Component
-public class ResourceHistoryLogic extends AbstractTransactionalLogic<ResourceHistoryConfTO> {
-
-    @Autowired
-    private ExternalResourceHistoryConfDAO resourceHistoryConfDAO;
-
-    @Autowired
-    private ExternalResourceDAO resourceDAO;
-
-    @Autowired
-    private ResourceDataBinder binder;
-
-    @PreAuthorize("hasRole('" + StandardEntitlement.RESOURCE_HISTORY_LIST + "')")
-    @Transactional(readOnly = true)
-    public List<ResourceHistoryConfTO> list(final String key) {
-        ExternalResource resource = resourceDAO.find(key);
-        if (resource == null) {
-            throw new NotFoundException("Resource '" + key + "'");
-        }
-
-        return resourceHistoryConfDAO.findByEntity(resource).stream().
-                map(binder::getResourceHistoryConfTO).collect(Collectors.toList());
-    }
-
-    @PreAuthorize("hasRole('" + StandardEntitlement.RESOURCE_HISTORY_RESTORE + "')")
-    public void restore(final String key) {
-        ExternalResourceHistoryConf resourceHistoryConf = resourceHistoryConfDAO.find(key);
-        if (resourceHistoryConf == null) {
-            throw new NotFoundException("Resource History Conf '" + key + "'");
-        }
-
-        binder.update(resourceHistoryConf.getEntity(), resourceHistoryConf.getConf());
-    }
-
-    @PreAuthorize("hasRole('" + StandardEntitlement.RESOURCE_HISTORY_DELETE + "')")
-    public void delete(final String key) {
-        ExternalResourceHistoryConf resourceHistoryConf = resourceHistoryConfDAO.find(key);
-        if (resourceHistoryConf == null) {
-            throw new NotFoundException("Resource History Conf '" + key + "'");
-        }
-
-        resourceHistoryConfDAO.delete(key);
-    }
-
-    @Override
-    protected ResourceHistoryConfTO resolveReference(final Method method, final Object... args)
-            throws UnresolvedReferenceException {
-
-        if (!"list".equals(method.getName())) {
-            try {
-                String key = (String) args[0];
-                return binder.getResourceHistoryConfTO(resourceHistoryConfDAO.find(key));
-            } catch (Throwable ignore) {
-                LOG.debug("Unresolved reference", ignore);
-                throw new UnresolvedReferenceException(ignore);
-            }
-        }
-
-        throw new UnresolvedReferenceException();
-    }
-
-}
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ConnInstanceHistoryConfDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ConnInstanceHistoryConfDAO.java
deleted file mode 100644
index 1caad69..0000000
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ConnInstanceHistoryConfDAO.java
+++ /dev/null
@@ -1,36 +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.dao;
-
-import java.util.List;
-import org.apache.syncope.core.persistence.api.entity.ConnInstance;
-import org.apache.syncope.core.persistence.api.entity.ConnInstanceHistoryConf;
-
-public interface ConnInstanceHistoryConfDAO extends DAO<ConnInstanceHistoryConf> {
-
-    ConnInstanceHistoryConf find(String key);
-
-    List<ConnInstanceHistoryConf> findByEntity(ConnInstance entity);
-
-    ConnInstanceHistoryConf save(ConnInstanceHistoryConf conf);
-
-    void delete(String key);
-
-    void deleteByEntity(ConnInstance entity);
-}
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ExternalResourceHistoryConfDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ExternalResourceHistoryConfDAO.java
deleted file mode 100644
index 1c4db5a..0000000
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ExternalResourceHistoryConfDAO.java
+++ /dev/null
@@ -1,36 +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.dao;
-
-import java.util.List;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResourceHistoryConf;
-
-public interface ExternalResourceHistoryConfDAO extends DAO<ExternalResourceHistoryConf> {
-
-    ExternalResourceHistoryConf find(String key);
-
-    List<ExternalResourceHistoryConf> findByEntity(ExternalResource entity);
-
-    ExternalResourceHistoryConf save(ExternalResourceHistoryConf conf);
-
-    void delete(String key);
-
-    void deleteByEntity(ExternalResource entity);
-}
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/ConnInstanceHistoryConf.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/ConnInstanceHistoryConf.java
deleted file mode 100644
index 88a4481..0000000
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/ConnInstanceHistoryConf.java
+++ /dev/null
@@ -1,24 +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;
-
-import org.apache.syncope.common.lib.to.ConnInstanceTO;
-
-public interface ConnInstanceHistoryConf extends HistoryConf<ConnInstance, ConnInstanceTO> {
-}
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/HistoryConf.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/HistoryConf.java
deleted file mode 100644
index 5da50c1..0000000
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/HistoryConf.java
+++ /dev/null
@@ -1,41 +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;
-
-import java.util.Date;
-import org.apache.syncope.common.lib.to.EntityTO;
-
-public interface HistoryConf<E extends Entity, T extends EntityTO> extends Entity {
-
-    String getCreator();
-
-    void setCreator(String creator);
-
-    Date getCreation();
-
-    void setCreation(Date creation);
-
-    E getEntity();
-
-    void setEntity(E entity);
-
-    T getConf();
-
-    void setConf(T conf);
-}
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/ExternalResourceHistoryConf.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/ExternalResourceHistoryConf.java
deleted file mode 100644
index 0fd8a25..0000000
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/ExternalResourceHistoryConf.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.resource;
-
-import org.apache.syncope.common.lib.to.ResourceTO;
-import org.apache.syncope.core.persistence.api.entity.HistoryConf;
-
-public interface ExternalResourceHistoryConf extends HistoryConf<ExternalResource, ResourceTO> {
-}
diff --git a/core/persistence-jpa-json/src/main/resources/domains/MasterContent.xml b/core/persistence-jpa-json/src/main/resources/domains/MasterContent.xml
index 814b3c6..29918c0 100644
--- a/core/persistence-jpa-json/src/main/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa-json/src/main/resources/domains/MasterContent.xml
@@ -77,17 +77,8 @@ under the License.
   <PlainSchema id="jwt.lifetime.minutes" type="Long"
                mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
     
-  <!--  Connector and Resource configuration history -->                   
-  <SyncopeSchema id="connector.conf.history.size"/>
-  <PlainSchema id="connector.conf.history.size" type="Long"
-               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
-  
-  <SyncopeSchema id="resource.conf.history.size"/>
-  <PlainSchema id="resource.conf.history.size" type="Long"
-               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
-  
   <SyncopeConf id="cd64d66f-6fff-4008-b966-a06b1cc1436d"
-               plainAttrs="[{&quot;values&quot;:[{&quot;stringValue&quot;:&quot;SSHA256&quot;}],&quot;schema&quot;:&quot;password.cipher.algorithm&quot;},{&quot;values&quot;:[{&quot;stringValue&quot;:&quot;&quot;}],&quot;schema&quot;:&quot;notificationjob.cronExpression&quot;},{&quot;values&quot;:[{&quot;longValue&quot;:3}],&quot;schema&quot;:&quot;notification.maxRetries&quot;},{&quot;values&quot;:[{&quot;longValue&quot;:256}],&quot;schema&quot;:&quot;token.length&quot;},{&quot;values&q [...]
+               plainAttrs="[{&quot;values&quot;:[{&quot;stringValue&quot;:&quot;SSHA256&quot;}],&quot;schema&quot;:&quot;password.cipher.algorithm&quot;},{&quot;values&quot;:[{&quot;stringValue&quot;:&quot;&quot;}],&quot;schema&quot;:&quot;notificationjob.cronExpression&quot;},{&quot;values&quot;:[{&quot;longValue&quot;:3}],&quot;schema&quot;:&quot;notification.maxRetries&quot;},{&quot;values&quot;:[{&quot;longValue&quot;:256}],&quot;schema&quot;:&quot;token.length&quot;},{&quot;values&q [...]
 
   <AnyType id="USER" kind="USER"/>
   <AnyTypeClass id="BaseUser"/>
diff --git a/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml b/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml
index 1020ecc..8b25834 100644
--- a/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml
@@ -75,17 +75,8 @@ under the License.
   <PlainSchema id="jwt.lifetime.minutes" type="Long"
                mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
     
-  <!--  Connector and Resource configuration history -->                   
-  <SyncopeSchema id="connector.conf.history.size"/>
-  <PlainSchema id="connector.conf.history.size" type="Long"
-               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
-  
-  <SyncopeSchema id="resource.conf.history.size"/>
-  <PlainSchema id="resource.conf.history.size" type="Long"
-               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
-  
   <SyncopeConf id="cd64d66f-6fff-4008-b966-a06b1cc1436d"
-               plainAttrs="[{&quot;values&quot;:[{&quot;stringValue&quot;:&quot;SHA1&quot;}],&quot;schema&quot;:&quot;password.cipher.algorithm&quot;},{&quot;values&quot;:[{&quot;stringValue&quot;:&quot;0/20 * * * * ?&quot;}],&quot;schema&quot;:&quot;notificationjob.cronExpression&quot;},{&quot;values&quot;:[{&quot;longValue&quot;:3}],&quot;schema&quot;:&quot;notification.maxRetries&quot;},{&quot;values&quot;:[{&quot;longValue&quot;:256}],&quot;schema&quot;:&quot;token.length&quot;},{&qu [...]
+               plainAttrs="[{&quot;values&quot;:[{&quot;stringValue&quot;:&quot;SHA1&quot;}],&quot;schema&quot;:&quot;password.cipher.algorithm&quot;},{&quot;values&quot;:[{&quot;stringValue&quot;:&quot;0/20 * * * * ?&quot;}],&quot;schema&quot;:&quot;notificationjob.cronExpression&quot;},{&quot;values&quot;:[{&quot;longValue&quot;:3}],&quot;schema&quot;:&quot;notification.maxRetries&quot;},{&quot;values&quot;:[{&quot;longValue&quot;:256}],&quot;schema&quot;:&quot;token.length&quot;},{&qu [...]
 
   <!-- sample policies -->
   <PasswordPolicy id="ce93fcda-dc3a-4369-a7b0-a6108c261c85" description="a password policy"
@@ -2408,20 +2399,23 @@ $$ }&#10;
   
   <SecurityQuestion id="887028ea-66fc-41e7-b397-620d7ea6dfbb" content="What's your mother's maiden name?"/>
 
-  <SyncopeLogger logName="syncope.audit.[LOGIC]:[SyncopeLogic]:[]:[isSelfRegAllowed]:[SUCCESS]" logLevel="DEBUG" logType="AUDIT"/>
+  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[SyncopeLogic]:[]:[isSelfRegAllowed]:[SUCCESS]" logLevel="DEBUG"/>
+
+  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[ConnectorLogic]:[]:[create]:[SUCCESS]" logLevel="DEBUG"/>
+  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[ConnectorLogic]:[]:[update]:[SUCCESS]" logLevel="DEBUG"/>
+
+  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[ResourceLogic]:[]:[create]:[SUCCESS]" logLevel="DEBUG"/>
+  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[ResourceLogic]:[]:[update]:[SUCCESS]" logLevel="DEBUG"/>
 
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[assign]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[confirmPasswordReset]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[create]:[SUCCESS]" logLevel="DEBUG"/>
-  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[delete]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[deprovision]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[link]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[mustChangePassword]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[provision]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[requestPasswordReset]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[selfCreate]:[SUCCESS]" logLevel="DEBUG"/>
-  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[selfDelete]:[SUCCESS]" logLevel="DEBUG"/>
-  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[selfRead]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[selfStatus]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[selfUpdate]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[status]:[SUCCESS]" logLevel="DEBUG"/>
@@ -2431,12 +2425,8 @@ $$ }&#10;
 
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[GroupLogic]:[]:[assign]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[GroupLogic]:[]:[create]:[SUCCESS]" logLevel="DEBUG"/>
-  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[GroupLogic]:[]:[delete]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[GroupLogic]:[]:[deprovision]:[SUCCESS]" logLevel="DEBUG"/>
-  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[GroupLogic]:[]:[link]:[SUCCESS]" logLevel="DEBUG"/>
-  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[GroupLogic]:[]:[own]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[GroupLogic]:[]:[provisionMembers]:[SUCCESS]" logLevel="DEBUG"/>
-  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[GroupLogic]:[]:[provision]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[GroupLogic]:[]:[unassign]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[GroupLogic]:[]:[unlink]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[GroupLogic]:[]:[update]:[SUCCESS]" logLevel="DEBUG"/>
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAConnInstanceDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAConnInstanceDAO.java
index 049fea3..563a684 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAConnInstanceDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAConnInstanceDAO.java
@@ -25,7 +25,6 @@ import java.util.stream.Collectors;
 import javax.persistence.TypedQuery;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.syncope.core.persistence.api.dao.ConnInstanceDAO;
-import org.apache.syncope.core.persistence.api.dao.ConnInstanceHistoryConfDAO;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.entity.Entity;
@@ -42,9 +41,6 @@ import org.springframework.transaction.annotation.Transactional;
 public class JPAConnInstanceDAO extends AbstractDAO<ConnInstance> implements ConnInstanceDAO {
 
     @Autowired
-    private ConnInstanceHistoryConfDAO connInstanceHistoryConfDAO;
-
-    @Autowired
     private ExternalResourceDAO resourceDAO;
 
     @Autowired
@@ -119,8 +115,6 @@ public class JPAConnInstanceDAO extends AbstractDAO<ConnInstance> implements Con
                 map(Entity::getKey).collect(Collectors.toList()).
                 forEach(resource -> resourceDAO.delete(resource));
 
-        connInstanceHistoryConfDAO.deleteByEntity(connInstance);
-
         entityManager().remove(connInstance);
 
         connRegistry.unregisterConnector(key);
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAConnInstanceHistoryConfDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAConnInstanceHistoryConfDAO.java
deleted file mode 100644
index 001d7fb..0000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAConnInstanceHistoryConfDAO.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.dao;
-
-import java.util.List;
-import javax.persistence.Query;
-import javax.persistence.TypedQuery;
-import org.apache.syncope.core.persistence.api.dao.ConnInstanceHistoryConfDAO;
-import org.apache.syncope.core.persistence.api.entity.ConnInstance;
-import org.apache.syncope.core.persistence.api.entity.ConnInstanceHistoryConf;
-import org.apache.syncope.core.persistence.jpa.entity.JPAConnInstanceHistoryConf;
-import org.springframework.stereotype.Repository;
-
-@Repository
-public class JPAConnInstanceHistoryConfDAO
-        extends AbstractDAO<ConnInstanceHistoryConf> implements ConnInstanceHistoryConfDAO {
-
-    @Override
-    public ConnInstanceHistoryConf find(final String key) {
-        return entityManager().find(JPAConnInstanceHistoryConf.class, key);
-    }
-
-    @Override
-    public List<ConnInstanceHistoryConf> findByEntity(final ConnInstance entity) {
-        TypedQuery<ConnInstanceHistoryConf> query = entityManager().createQuery(
-                "SELECT e FROM " + JPAConnInstanceHistoryConf.class.getSimpleName()
-                + " e WHERE e.entity=:entity ORDER BY e.creation DESC", ConnInstanceHistoryConf.class);
-        query.setParameter("entity", entity);
-        return query.getResultList();
-    }
-
-    @Override
-    public ConnInstanceHistoryConf save(final ConnInstanceHistoryConf conf) {
-        return entityManager().merge(conf);
-    }
-
-    @Override
-    public void delete(final String key) {
-        ConnInstanceHistoryConf conf = find(key);
-        if (conf == null) {
-            return;
-        }
-
-        entityManager().remove(conf);
-    }
-
-    @Override
-    public void deleteByEntity(final ConnInstance entity) {
-        Query query = entityManager().createQuery(
-                "DELETE FROM " + JPAConnInstanceHistoryConf.class.getSimpleName() + " e WHERE e.entity=:entity");
-        query.setParameter("entity", entity);
-        query.executeUpdate();
-    }
-
-}
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 a331512..4990ee0 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
@@ -29,7 +29,6 @@ import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
-import org.apache.syncope.core.persistence.api.dao.ExternalResourceHistoryConfDAO;
 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.dao.GroupDAO;
@@ -86,9 +85,6 @@ public class JPAExternalResourceDAO extends AbstractDAO<ExternalResource> implem
     @Autowired
     private RealmDAO realmDAO;
 
-    @Autowired
-    private ExternalResourceHistoryConfDAO externalResourceHistoryConfDAO;
-
     @Override
     public int count() {
         Query query = entityManager().createQuery(
@@ -267,8 +263,6 @@ public class JPAExternalResourceDAO extends AbstractDAO<ExternalResource> implem
                 forEach(provision -> virSchemaDAO.findByProvision(provision).
                 forEach(schema -> virSchemaDAO.delete(schema.getKey())));
 
-        externalResourceHistoryConfDAO.deleteByEntity(resource);
-
         if (resource.getConnector() != null && resource.getConnector().getResources() != null
                 && !resource.getConnector().getResources().isEmpty()) {
 
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceHistoryConfDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceHistoryConfDAO.java
deleted file mode 100644
index ba43355..0000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceHistoryConfDAO.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.dao;
-
-import java.util.List;
-import javax.persistence.Query;
-import javax.persistence.TypedQuery;
-import org.apache.syncope.core.persistence.api.dao.ExternalResourceHistoryConfDAO;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResourceHistoryConf;
-import org.apache.syncope.core.persistence.jpa.entity.resource.JPAExternalResourceHistoryConf;
-import org.springframework.stereotype.Repository;
-
-@Repository
-public class JPAExternalResourceHistoryConfDAO
-        extends AbstractDAO<ExternalResourceHistoryConf> implements ExternalResourceHistoryConfDAO {
-
-    @Override
-    public ExternalResourceHistoryConf find(final String key) {
-        return entityManager().find(JPAExternalResourceHistoryConf.class, key);
-    }
-
-    @Override
-    public List<ExternalResourceHistoryConf> findByEntity(final ExternalResource entity) {
-        TypedQuery<ExternalResourceHistoryConf> query = entityManager().createQuery(
-                "SELECT e FROM " + JPAExternalResourceHistoryConf.class.getSimpleName()
-                + " e WHERE e.entity=:entity ORDER BY e.creation DESC", ExternalResourceHistoryConf.class);
-        query.setParameter("entity", entity);
-        return query.getResultList();
-    }
-
-    @Override
-    public ExternalResourceHistoryConf save(final ExternalResourceHistoryConf conf) {
-        return entityManager().merge(conf);
-    }
-
-    @Override
-    public void delete(final String key) {
-        ExternalResourceHistoryConf conf = find(key);
-        if (conf == null) {
-            return;
-        }
-
-        entityManager().remove(conf);
-    }
-
-    @Override
-    public void deleteByEntity(final ExternalResource entity) {
-        Query query = entityManager().createQuery(
-                "DELETE FROM " + JPAExternalResourceHistoryConf.class.getSimpleName() + " e WHERE e.entity=:entity");
-        query.setParameter("entity", entity);
-        query.executeUpdate();
-    }
-
-}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractHistoryConf.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractHistoryConf.java
deleted file mode 100644
index 9ee2c65..0000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractHistoryConf.java
+++ /dev/null
@@ -1,76 +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.Date;
-import javax.persistence.Column;
-import javax.persistence.Lob;
-import javax.persistence.MappedSuperclass;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import org.apache.syncope.common.lib.to.EntityTO;
-import org.apache.syncope.core.persistence.api.entity.Entity;
-import org.apache.syncope.core.persistence.api.entity.HistoryConf;
-import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
-
-@MappedSuperclass
-public abstract class AbstractHistoryConf<E extends Entity, T extends EntityTO>
-        extends AbstractGeneratedKeyEntity implements HistoryConf<E, T> {
-
-    private static final long serialVersionUID = -7210303753586235180L;
-
-    @Column(nullable = false)
-    private String creator;
-
-    @Temporal(TemporalType.TIMESTAMP)
-    private Date creation;
-
-    @Lob
-    protected String conf;
-
-    @Override
-    public String getCreator() {
-        return creator;
-    }
-
-    @Override
-    public void setCreator(final String creator) {
-        this.creator = creator;
-    }
-
-    @Override
-    public Date getCreation() {
-        return creation == null
-                ? null
-                : new Date(creation.getTime());
-    }
-
-    @Override
-    public void setCreation(final Date creation) {
-        this.creation = creation == null
-                ? null
-                : new Date(creation.getTime());
-    }
-
-    @Override
-    public void setConf(final T conf) {
-        this.conf = POJOHelper.serialize(conf);
-    }
-
-}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstanceHistoryConf.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstanceHistoryConf.java
deleted file mode 100644
index 9001676..0000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstanceHistoryConf.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;
-
-import javax.persistence.Entity;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.common.lib.to.ConnInstanceTO;
-import org.apache.syncope.core.persistence.api.entity.ConnInstance;
-import org.apache.syncope.core.persistence.api.entity.ConnInstanceHistoryConf;
-import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
-
-@Entity
-@Table(name = JPAConnInstanceHistoryConf.TABLE)
-public class JPAConnInstanceHistoryConf
-        extends AbstractHistoryConf<ConnInstance, ConnInstanceTO> implements ConnInstanceHistoryConf {
-
-    private static final long serialVersionUID = -4152915369607435186L;
-
-    public static final String TABLE = "ConnInstanceHistoryConf";
-
-    @OneToOne
-    private JPAConnInstance entity;
-
-    @Override
-    public ConnInstance getEntity() {
-        return entity;
-    }
-
-    @Override
-    public void setEntity(final ConnInstance entity) {
-        checkType(entity, JPAConnInstance.class);
-        this.entity = (JPAConnInstance) entity;
-    }
-
-    @Override
-    public ConnInstanceTO getConf() {
-        return StringUtils.isBlank(conf)
-                ? null
-                : POJOHelper.deserialize(conf, ConnInstanceTO.class);
-    }
-}
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 28f6f94..d96f6fb 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
@@ -35,7 +35,6 @@ import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
 import org.apache.syncope.core.persistence.api.entity.Application;
 import org.apache.syncope.core.persistence.api.entity.Batch;
 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
-import org.apache.syncope.core.persistence.api.entity.ConnInstanceHistoryConf;
 import org.apache.syncope.core.persistence.api.entity.ConnPoolConf;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
 import org.apache.syncope.core.persistence.api.entity.Domain;
@@ -134,10 +133,8 @@ import org.apache.syncope.core.persistence.api.entity.Implementation;
 import org.apache.syncope.core.persistence.api.entity.Privilege;
 import org.apache.syncope.core.persistence.api.entity.Remediation;
 import org.apache.syncope.core.persistence.api.entity.SchemaLabel;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResourceHistoryConf;
 import org.apache.syncope.core.persistence.api.entity.resource.OrgUnitItem;
 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPullCorrelationRuleEntity;
-import org.apache.syncope.core.persistence.jpa.entity.resource.JPAExternalResourceHistoryConf;
 import org.apache.syncope.core.persistence.jpa.entity.resource.JPAOrgUnitItem;
 import org.apache.syncope.core.persistence.api.entity.policy.PullCorrelationRuleEntity;
 import org.apache.syncope.core.persistence.api.entity.policy.PushCorrelationRuleEntity;
@@ -222,16 +219,12 @@ public class JPAEntityFactory implements EntityFactory {
             result = (E) new JPANotification();
         } else if (reference.equals(ExternalResource.class)) {
             result = (E) new JPAExternalResource();
-        } else if (reference.equals(ExternalResourceHistoryConf.class)) {
-            result = (E) new JPAExternalResourceHistoryConf();
         } else if (reference.equals(Provision.class)) {
             result = (E) new JPAProvision();
         } else if (reference.equals(OrgUnit.class)) {
             result = (E) new JPAOrgUnit();
         } else if (reference.equals(ConnInstance.class)) {
             result = (E) new JPAConnInstance();
-        } else if (reference.equals(ConnInstanceHistoryConf.class)) {
-            result = (E) new JPAConnInstanceHistoryConf();
         } else if (reference.equals(SchemaLabel.class)) {
             result = (E) new JPASchemaLabel();
         } else if (reference.equals(PlainSchema.class)) {
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAExternalResourceHistoryConf.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAExternalResourceHistoryConf.java
deleted file mode 100644
index 31fa726..0000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAExternalResourceHistoryConf.java
+++ /dev/null
@@ -1,60 +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.resource;
-
-import javax.persistence.Entity;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.common.lib.to.ResourceTO;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResourceHistoryConf;
-import org.apache.syncope.core.persistence.jpa.entity.AbstractHistoryConf;
-import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
-
-@Entity
-@Table(name = JPAExternalResourceHistoryConf.TABLE)
-public class JPAExternalResourceHistoryConf
-        extends AbstractHistoryConf<ExternalResource, ResourceTO> implements ExternalResourceHistoryConf {
-
-    public static final String TABLE = "ExternalResourceHistoryConf";
-
-    private static final long serialVersionUID = 4994551965604592529L;
-
-    @OneToOne
-    private JPAExternalResource entity;
-
-    @Override
-    public ExternalResource getEntity() {
-        return entity;
-    }
-
-    @Override
-    public void setEntity(final ExternalResource entity) {
-        checkType(entity, JPAExternalResource.class);
-        this.entity = (JPAExternalResource) entity;
-    }
-
-    @Override
-    public ResourceTO getConf() {
-        return StringUtils.isBlank(conf)
-                ? null
-                : POJOHelper.deserialize(conf, ResourceTO.class);
-    }
-}
diff --git a/core/persistence-jpa/src/main/resources/domains/MasterContent.xml b/core/persistence-jpa/src/main/resources/domains/MasterContent.xml
index fd66eb6..39aa841 100644
--- a/core/persistence-jpa/src/main/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/main/resources/domains/MasterContent.xml
@@ -135,23 +135,6 @@ under the License.
   <CPlainAttrValue id="447e2456-3ff5-41bc-8ff1-cbb0567546cb"
                    attribute_id="cfec3140-562d-459c-ac6a-e3e10758661d" longValue="120"/>
   
-  <!--  Connector and Resource configuration history -->                   
-  <SyncopeSchema id="connector.conf.history.size"/>
-  <PlainSchema id="connector.conf.history.size" type="Long"
-               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
-  <CPlainAttr id="ae36c6ab-0f39-40d7-b6e6-3b8394547c9c"
-              owner_id="cd64d66f-6fff-4008-b966-a06b1cc1436d" schema_id="connector.conf.history.size"/>
-  <CPlainAttrValue id="4989ce5d-7b42-4a5c-b725-54286888df10"
-                   attribute_id="ae36c6ab-0f39-40d7-b6e6-3b8394547c9c" longValue="10"/>
-  
-  <SyncopeSchema id="resource.conf.history.size"/>
-  <PlainSchema id="resource.conf.history.size" type="Long"
-               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
-  <CPlainAttr id="ae7ae53a-74cf-48b0-9a57-6d2c94928e60"
-              owner_id="cd64d66f-6fff-4008-b966-a06b1cc1436d" schema_id="resource.conf.history.size"/>
-  <CPlainAttrValue id="059ac3e1-687f-4dd9-a28b-a23f8b436f31"
-                   attribute_id="ae7ae53a-74cf-48b0-9a57-6d2c94928e60" longValue="10"/>
-
   <AnyType id="USER" kind="USER"/>
   <AnyTypeClass id="BaseUser"/>
   <AnyType_AnyTypeClass anyType_id="USER" anyTypeClass_id="BaseUser"/>
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainSchemaTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainSchemaTest.java
index 9a64989..6a639d1 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainSchemaTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainSchemaTest.java
@@ -55,7 +55,7 @@ public class PlainSchemaTest extends AbstractTest {
     @Test
     public void findAll() {
         List<PlainSchema> schemas = plainSchemaDAO.findAll();
-        assertEquals(42, schemas.size());
+        assertEquals(40, schemas.size());
     }
 
     @Test
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ConnInstanceHistoryConfTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ConnInstanceHistoryConfTest.java
deleted file mode 100644
index 1377edd..0000000
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ConnInstanceHistoryConfTest.java
+++ /dev/null
@@ -1,74 +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.outer;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import java.util.Date;
-import java.util.List;
-import org.apache.syncope.common.lib.to.ConnInstanceTO;
-import org.apache.syncope.core.persistence.api.dao.ConnInstanceDAO;
-import org.apache.syncope.core.persistence.api.dao.ConnInstanceHistoryConfDAO;
-import org.apache.syncope.core.persistence.api.entity.ConnInstance;
-import org.apache.syncope.core.persistence.api.entity.ConnInstanceHistoryConf;
-import org.apache.syncope.core.persistence.jpa.AbstractTest;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-
-@Transactional("Master")
-public class ConnInstanceHistoryConfTest extends AbstractTest {
-
-    @Autowired
-    private ConnInstanceDAO connInstanceDAO;
-
-    @Autowired
-    private ConnInstanceHistoryConfDAO connInstanceHistoryConfDAO;
-
-    @Test
-    public void createDelete() {
-        ConnInstance ldapConnector = connInstanceDAO.find("74141a3b-0762-4720-a4aa-fc3e374ef3ef");
-        assertNotNull(ldapConnector);
-
-        ConnInstanceHistoryConf ldapHistory = entityFactory.newEntity(ConnInstanceHistoryConf.class);
-        ldapHistory.setCreation(new Date());
-        ldapHistory.setCreator("me");
-        ldapHistory.setEntity(ldapConnector);
-        ldapHistory.setConf(new ConnInstanceTO());
-
-        ldapHistory = connInstanceHistoryConfDAO.save(ldapHistory);
-        assertNotNull(ldapHistory.getKey());
-
-        entityManager().flush();
-
-        List<ConnInstanceHistoryConf> history = connInstanceHistoryConfDAO.findByEntity(ldapConnector);
-        assertEquals(1, history.size());
-        assertEquals(ldapHistory, history.get(0));
-
-        connInstanceHistoryConfDAO.delete(ldapHistory.getKey());
-
-        entityManager().flush();
-
-        assertNull(connInstanceHistoryConfDAO.find(ldapHistory.getKey()));
-        assertTrue(connInstanceHistoryConfDAO.findByEntity(ldapConnector).isEmpty());
-    }
-}
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ResourceHistoryConfTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ResourceHistoryConfTest.java
deleted file mode 100644
index 8689ddd..0000000
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ResourceHistoryConfTest.java
+++ /dev/null
@@ -1,74 +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.outer;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import java.util.Date;
-import java.util.List;
-import org.apache.syncope.common.lib.to.ResourceTO;
-import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
-import org.apache.syncope.core.persistence.api.dao.ExternalResourceHistoryConfDAO;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResourceHistoryConf;
-import org.apache.syncope.core.persistence.jpa.AbstractTest;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-
-@Transactional("Master")
-public class ResourceHistoryConfTest extends AbstractTest {
-
-    @Autowired
-    private ExternalResourceDAO resourceDAO;
-
-    @Autowired
-    private ExternalResourceHistoryConfDAO resourceHistoryConfDAO;
-
-    @Test
-    public void createDelete() {
-        ExternalResource ldapResource = resourceDAO.find("resource-ldap");
-        assertNotNull(ldapResource);
-
-        ExternalResourceHistoryConf ldapHistory = entityFactory.newEntity(ExternalResourceHistoryConf.class);
-        ldapHistory.setCreation(new Date());
-        ldapHistory.setCreator("me");
-        ldapHistory.setEntity(ldapResource);
-        ldapHistory.setConf(new ResourceTO());
-
-        ldapHistory = resourceHistoryConfDAO.save(ldapHistory);
-        assertNotNull(ldapHistory.getKey());
-
-        entityManager().flush();
-
-        List<ExternalResourceHistoryConf> history = resourceHistoryConfDAO.findByEntity(ldapResource);
-        assertEquals(1, history.size());
-        assertEquals(ldapHistory, history.get(0));
-
-        resourceHistoryConfDAO.delete(ldapHistory.getKey());
-
-        entityManager().flush();
-
-        assertNull(resourceHistoryConfDAO.find(ldapHistory.getKey()));
-        assertTrue(resourceHistoryConfDAO.findByEntity(ldapResource).isEmpty());
-    }
-}
diff --git a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
index 117baea..fc10517 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -135,23 +135,6 @@ under the License.
   <CPlainAttrValue id="447e2456-3ff5-41bc-8ff1-cbb0567546cb"
                    attribute_id="cfec3140-562d-459c-ac6a-e3e10758661d" longValue="120"/>
     
-  <!--  Connector and Resource configuration history -->                   
-  <SyncopeSchema id="connector.conf.history.size"/>
-  <PlainSchema id="connector.conf.history.size" type="Long"
-               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
-  <CPlainAttr id="ae36c6ab-0f39-40d7-b6e6-3b8394547c9c"
-              owner_id="cd64d66f-6fff-4008-b966-a06b1cc1436d" schema_id="connector.conf.history.size"/>
-  <CPlainAttrValue id="4989ce5d-7b42-4a5c-b725-54286888df10"
-                   attribute_id="ae36c6ab-0f39-40d7-b6e6-3b8394547c9c" longValue="10"/>
-  
-  <SyncopeSchema id="resource.conf.history.size"/>
-  <PlainSchema id="resource.conf.history.size" type="Long"
-               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
-  <CPlainAttr id="ae7ae53a-74cf-48b0-9a57-6d2c94928e60"
-              owner_id="cd64d66f-6fff-4008-b966-a06b1cc1436d" schema_id="resource.conf.history.size"/>
-  <CPlainAttrValue id="059ac3e1-687f-4dd9-a28b-a23f8b436f31"
-                   attribute_id="ae7ae53a-74cf-48b0-9a57-6d2c94928e60" longValue="10"/>
-  
   <!-- sample policies -->
   <PasswordPolicy id="ce93fcda-dc3a-4369-a7b0-a6108c261c85" description="a password policy"
                   historyLength="1" allowNullPassword="1"/>
@@ -2560,20 +2543,23 @@ $$ }&#10;
   
   <SecurityQuestion id="887028ea-66fc-41e7-b397-620d7ea6dfbb" content="What's your mother's maiden name?"/>
 
-  <SyncopeLogger logName="syncope.audit.[LOGIC]:[SyncopeLogic]:[]:[isSelfRegAllowed]:[SUCCESS]" logLevel="DEBUG" logType="AUDIT"/>
+  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[SyncopeLogic]:[]:[isSelfRegAllowed]:[SUCCESS]" logLevel="DEBUG"/>
+
+  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[ConnectorLogic]:[]:[create]:[SUCCESS]" logLevel="DEBUG"/>
+  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[ConnectorLogic]:[]:[update]:[SUCCESS]" logLevel="DEBUG"/>
+
+  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[ResourceLogic]:[]:[create]:[SUCCESS]" logLevel="DEBUG"/>
+  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[ResourceLogic]:[]:[update]:[SUCCESS]" logLevel="DEBUG"/>
 
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[assign]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[confirmPasswordReset]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[create]:[SUCCESS]" logLevel="DEBUG"/>
-  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[delete]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[deprovision]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[link]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[mustChangePassword]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[provision]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[requestPasswordReset]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[selfCreate]:[SUCCESS]" logLevel="DEBUG"/>
-  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[selfDelete]:[SUCCESS]" logLevel="DEBUG"/>
-  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[selfRead]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[selfStatus]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[selfUpdate]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[UserLogic]:[]:[status]:[SUCCESS]" logLevel="DEBUG"/>
@@ -2583,12 +2569,8 @@ $$ }&#10;
 
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[GroupLogic]:[]:[assign]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[GroupLogic]:[]:[create]:[SUCCESS]" logLevel="DEBUG"/>
-  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[GroupLogic]:[]:[delete]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[GroupLogic]:[]:[deprovision]:[SUCCESS]" logLevel="DEBUG"/>
-  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[GroupLogic]:[]:[link]:[SUCCESS]" logLevel="DEBUG"/>
-  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[GroupLogic]:[]:[own]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[GroupLogic]:[]:[provisionMembers]:[SUCCESS]" logLevel="DEBUG"/>
-  <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[GroupLogic]:[]:[provision]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[GroupLogic]:[]:[unassign]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[GroupLogic]:[]:[unlink]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[GroupLogic]:[]:[update]:[SUCCESS]" logLevel="DEBUG"/>
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 9fa892e..b4b7c18 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,11 +18,9 @@
  */
 package org.apache.syncope.core.provisioning.api.data;
 
-import org.apache.syncope.common.lib.to.ConnInstanceHistoryConfTO;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
 import org.apache.syncope.common.lib.types.ConnConfPropSchema;
 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
-import org.apache.syncope.core.persistence.api.entity.ConnInstanceHistoryConf;
 import org.identityconnectors.framework.api.ConfigurationProperty;
 
 public interface ConnInstanceDataBinder {
@@ -33,8 +31,5 @@ public interface ConnInstanceDataBinder {
 
     ConnInstanceTO getConnInstanceTO(ConnInstance connInstance);
 
-    ConnInstanceHistoryConfTO getConnInstanceHistoryConfTO(ConnInstanceHistoryConf history);
-
     ConnInstance update(ConnInstanceTO connInstanceTO);
-
 }
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 84b2254..c63fbf3 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
@@ -18,10 +18,8 @@
  */
 package org.apache.syncope.core.provisioning.api.data;
 
-import org.apache.syncope.common.lib.to.ResourceHistoryConfTO;
 import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResourceHistoryConf;
 
 public interface ResourceDataBinder {
 
@@ -30,6 +28,4 @@ public interface ResourceDataBinder {
     ExternalResource create(ResourceTO resourceTO);
 
     ExternalResource update(ExternalResource resource, ResourceTO resourceTO);
-
-    ResourceHistoryConfTO getResourceHistoryConfTO(ExternalResourceHistoryConf history);
 }
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 d08338f..32e24b6 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
@@ -22,12 +22,9 @@ import java.net.URI;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Date;
-import java.util.List;
 import java.util.Optional;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.lib.SyncopeClientException;
-import org.apache.syncope.common.lib.to.ConnInstanceHistoryConfTO;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
 import org.apache.syncope.common.lib.to.ConnPoolConfTO;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
@@ -35,11 +32,9 @@ import org.apache.syncope.common.lib.types.ConnConfPropSchema;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.core.persistence.api.dao.ConfDAO;
 import org.apache.syncope.core.persistence.api.dao.ConnInstanceDAO;
-import org.apache.syncope.core.persistence.api.dao.ConnInstanceHistoryConfDAO;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.dao.RealmDAO;
 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
-import org.apache.syncope.core.persistence.api.entity.ConnInstanceHistoryConf;
 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
 import org.apache.syncope.core.persistence.api.entity.Realm;
 import org.apache.syncope.core.provisioning.api.ConnIdBundleManager;
@@ -48,7 +43,6 @@ import org.apache.syncope.core.provisioning.api.utils.ConnPoolConfUtils;
 import org.identityconnectors.framework.api.ConfigurationProperties;
 import org.identityconnectors.framework.api.ConfigurationProperty;
 import org.identityconnectors.framework.impl.api.ConfigurationPropertyImpl;
-import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.identityconnectors.framework.api.ConnectorInfo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -63,9 +57,6 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
     private ConnInstanceDAO connInstanceDAO;
 
     @Autowired
-    private ConnInstanceHistoryConfDAO connInstanceHistoryConfDAO;
-
-    @Autowired
     private RealmDAO realmDAO;
 
     @Autowired
@@ -137,28 +128,6 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
             throw new NotFoundException("Connector '" + connInstanceTO.getKey() + "'");
         }
 
-        ConnInstanceTO current = getConnInstanceTO(connInstance);
-        if (!current.equals(connInstanceTO)) {
-            // 1. save the current configuration, before update
-            ConnInstanceHistoryConf connInstanceHistoryConf = entityFactory.newEntity(ConnInstanceHistoryConf.class);
-            connInstanceHistoryConf.setCreator(AuthContextUtils.getUsername());
-            connInstanceHistoryConf.setCreation(new Date());
-            connInstanceHistoryConf.setEntity(connInstance);
-            connInstanceHistoryConf.setConf(current);
-            connInstanceHistoryConfDAO.save(connInstanceHistoryConf);
-
-            // 2. ensure the maximum history size is not exceeded
-            List<ConnInstanceHistoryConf> history = connInstanceHistoryConfDAO.findByEntity(connInstance);
-            long maxHistorySize = confDAO.find("connector.conf.history.size", 10L);
-            if (maxHistorySize < history.size()) {
-                // always remove the last item since history was obtained  by a query with ORDER BY creation DESC
-                for (int i = 0; i < history.size() - maxHistorySize; i++) {
-                    connInstanceHistoryConfDAO.delete(history.get(history.size() - 1).getKey());
-                }
-            }
-        }
-
-        // 3. actual update
         connInstance.getCapabilities().clear();
         connInstance.getCapabilities().addAll(connInstanceTO.getCapabilities());
 
@@ -291,15 +260,4 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
 
         return connInstanceTO;
     }
-
-    @Override
-    public ConnInstanceHistoryConfTO getConnInstanceHistoryConfTO(final ConnInstanceHistoryConf history) {
-        ConnInstanceHistoryConfTO historyTO = new ConnInstanceHistoryConfTO();
-        historyTO.setKey(history.getKey());
-        historyTO.setCreator(history.getCreator());
-        historyTO.setCreation(history.getCreation());
-        historyTO.setConnInstanceTO(history.getConf());
-
-        return historyTO;
-    }
 }
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 a565e78..b045ad7 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
@@ -20,7 +20,6 @@ package org.apache.syncope.core.provisioning.java.data;
 
 import java.text.ParseException;
 import java.util.Collections;
-import java.util.Date;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -35,7 +34,6 @@ import org.apache.syncope.common.lib.to.ItemTO;
 import org.apache.syncope.common.lib.to.MappingTO;
 import org.apache.syncope.common.lib.to.OrgUnitTO;
 import org.apache.syncope.common.lib.to.ProvisionTO;
-import org.apache.syncope.common.lib.to.ResourceHistoryConfTO;
 import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.lib.types.MappingPurpose;
@@ -53,7 +51,6 @@ import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy;
 import org.apache.syncope.core.provisioning.java.jexl.JexlUtils;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.ConfDAO;
-import org.apache.syncope.core.persistence.api.dao.ExternalResourceHistoryConfDAO;
 import org.apache.syncope.core.persistence.api.dao.ImplementationDAO;
 import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
 import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
@@ -65,7 +62,6 @@ import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
 import org.apache.syncope.core.persistence.api.entity.policy.PullPolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.PushPolicy;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResourceHistoryConf;
 import org.apache.syncope.core.persistence.api.entity.resource.Item;
 import org.apache.syncope.core.persistence.api.entity.resource.OrgUnit;
 import org.apache.syncope.core.persistence.api.entity.resource.OrgUnitItem;
@@ -73,7 +69,6 @@ import org.apache.syncope.core.persistence.api.entity.resource.Provision;
 import org.apache.syncope.core.provisioning.java.IntAttrNameParser;
 import org.apache.syncope.core.provisioning.api.IntAttrName;
 import org.apache.syncope.core.provisioning.api.data.ResourceDataBinder;
-import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.identityconnectors.framework.common.objects.ObjectClass;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -101,9 +96,6 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
     private AnyTypeClassDAO anyTypeClassDAO;
 
     @Autowired
-    private ExternalResourceHistoryConfDAO resourceHistoryConfDAO;
-
-    @Autowired
     private ConfDAO confDAO;
 
     @Autowired
@@ -125,30 +117,6 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
 
     @Override
     public ExternalResource update(final ExternalResource resource, final ResourceTO resourceTO) {
-        if (resource.getKey() != null) {
-            ResourceTO current = getResourceTO(resource);
-            if (!current.equals(resourceTO)) {
-                // 1. save the current configuration, before update
-                ExternalResourceHistoryConf resourceHistoryConf =
-                        entityFactory.newEntity(ExternalResourceHistoryConf.class);
-                resourceHistoryConf.setCreator(AuthContextUtils.getUsername());
-                resourceHistoryConf.setCreation(new Date());
-                resourceHistoryConf.setEntity(resource);
-                resourceHistoryConf.setConf(current);
-                resourceHistoryConfDAO.save(resourceHistoryConf);
-
-                // 2. ensure the maximum history size is not exceeded
-                List<ExternalResourceHistoryConf> history = resourceHistoryConfDAO.findByEntity(resource);
-                long maxHistorySize = confDAO.find("resource.conf.history.size", 10L);
-                if (maxHistorySize < history.size()) {
-                    // always remove the last item since history was obtained  by a query with ORDER BY creation DESC
-                    for (int i = 0; i < history.size() - maxHistorySize; i++) {
-                        resourceHistoryConfDAO.delete(history.get(history.size() - 1).getKey());
-                    }
-                }
-            }
-        }
-
         resource.setKey(resourceTO.getKey());
 
         if (resourceTO.getConnector() != null) {
@@ -718,15 +686,4 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
 
         return resourceTO;
     }
-
-    @Override
-    public ResourceHistoryConfTO getResourceHistoryConfTO(final ExternalResourceHistoryConf history) {
-        ResourceHistoryConfTO historyTO = new ResourceHistoryConfTO();
-        historyTO.setKey(history.getKey());
-        historyTO.setCreator(history.getCreator());
-        historyTO.setCreation(history.getCreation());
-        historyTO.setResourceTO(history.getConf());
-
-        return historyTO;
-    }
 }
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConnectorHistoryServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConnectorHistoryServiceImpl.java
deleted file mode 100644
index 3424c5e..0000000
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConnectorHistoryServiceImpl.java
+++ /dev/null
@@ -1,49 +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.rest.cxf.service;
-
-import java.util.List;
-import org.apache.syncope.common.lib.to.ConnInstanceHistoryConfTO;
-import org.apache.syncope.common.rest.api.service.ConnectorHistoryService;
-import org.apache.syncope.core.logic.ConnectorHistoryLogic;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-@Service
-public class ConnectorHistoryServiceImpl extends AbstractServiceImpl implements ConnectorHistoryService {
-
-    @Autowired
-    private ConnectorHistoryLogic logic;
-
-    @Override
-    public List<ConnInstanceHistoryConfTO> list(final String connectorKey) {
-        return logic.list(connectorKey);
-    }
-
-    @Override
-    public void restore(final String key) {
-        logic.restore(key);
-    }
-
-    @Override
-    public void delete(final String key) {
-        logic.delete(key);
-    }
-
-}
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ResourceHistoryServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ResourceHistoryServiceImpl.java
deleted file mode 100644
index b69b5be..0000000
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ResourceHistoryServiceImpl.java
+++ /dev/null
@@ -1,49 +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.rest.cxf.service;
-
-import java.util.List;
-import org.apache.syncope.common.lib.to.ResourceHistoryConfTO;
-import org.apache.syncope.common.rest.api.service.ResourceHistoryService;
-import org.apache.syncope.core.logic.ResourceHistoryLogic;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-@Service
-public class ResourceHistoryServiceImpl extends AbstractServiceImpl implements ResourceHistoryService {
-
-    @Autowired
-    private ResourceHistoryLogic logic;
-
-    @Override
-    public List<ResourceHistoryConfTO> list(final String resourceKey) {
-        return logic.list(resourceKey);
-    }
-
-    @Override
-    public void restore(final String key) {
-        logic.restore(key);
-    }
-
-    @Override
-    public void delete(final String key) {
-        logic.delete(key);
-    }
-
-}
diff --git a/core/upgrade/src/main/resources/schema.xml b/core/upgrade/src/main/resources/schema.xml
index dcc6ab0..99db049 100644
--- a/core/upgrade/src/main/resources/schema.xml
+++ b/core/upgrade/src/main/resources/schema.xml
@@ -18,1195 +18,1350 @@ specific language governing permissions and limitations
 under the License.
 -->
 <schemas>
-  <schema>
-    <table name="ADynGroupMembership">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="fiql" type="varchar" size="255"/>
-      <column name="GROUP_ID" type="varchar" size="36"/>
-      <column name="ANYTYPE_ID" type="varchar" size="255"/>
-      <fk to-table="SyncopeGroup" column="GROUP_ID"/>
-      <fk to-table="AnyType" column="ANYTYPE_ID"/>
-      <index name="I_DYNGSHP_ANYTYPE" column="ANYTYPE_ID"/>
-      <index name="I_DYNGSHP_GROUP" column="GROUP_ID"/>
-    </table>
-    <table name="AMembership">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="anyObject_id" type="varchar" size="36"/>
-      <column name="group_id" type="varchar" size="36"/>
-      <fk to-table="AnyObject" column="anyObject_id"/>
-      <fk to-table="SyncopeGroup" column="group_id"/>
-      <index name="I_MMBRSHP_LEFTEND" column="anyObject_id"/>
-      <index name="I_MMBRSHP_RIGHTEND" column="group_id"/>
-    </table>
-    <table name="APlainAttr">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="OWNER_ID" type="varchar" size="36"/>
-      <column name="schema_id" type="varchar" size="255"/>
-      <column name="MEMBERSHIP_ID" type="varchar" size="36"/>
-      <fk to-table="AnyObject" column="OWNER_ID"/>
-      <fk to-table="PlainSchema" column="schema_id"/>
-      <fk to-table="AMembership" column="MEMBERSHIP_ID"/>
-      <index name="I_PLINTTR_MEMBERSHIP" column="MEMBERSHIP_ID"/>
-      <index name="I_PLINTTR_OWNER" column="OWNER_ID"/>
-      <index name="I_PLINTTR_SCHEMA" column="schema_id"/>
-    </table>
-    <table name="APlainAttrUniqueValue">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="binaryValue" type="blob" size="-1"/>
-      <column name="booleanValue" type="integer"/>
-      <column name="dateValue" type="timestamp"/>
-      <column name="doubleValue" type="double"/>
-      <column name="longValue" type="bigint"/>
-      <column name="stringValue" type="varchar" size="255"/>
-      <column name="ATTRIBUTE_ID" type="varchar" size="36"/>
-      <column name="schema_id" type="varchar" size="255"/>
-      <fk to-table="APlainAttr" column="ATTRIBUTE_ID"/>
-      <fk to-table="PlainSchema" column="schema_id"/>
-      <index name="I_PLNTQVL_ATTRIBUTE" column="ATTRIBUTE_ID"/>
-      <index name="I_PLNTQVL_SCHEMA" column="schema_id"/>
-      <unique name="U_PLNTQVL_BOOLEANVALUE">
-        <on column="booleanValue"/>
-        <on column="schema_id"/>
-      </unique>
-      <unique name="U_PLNTQVL_DATEVALUE">
-        <on column="dateValue"/>
-        <on column="schema_id"/>
-      </unique>
-      <unique name="U_PLNTQVL_STRINGVALUE">
-        <on column="stringValue"/>
-        <on column="schema_id"/>
-      </unique>
-      <unique name="U_PLNTQVL_DOUBLEVALUE">
-        <on column="doubleValue"/>
-        <on column="schema_id"/>
-      </unique>
-      <unique name="U_PLNTQVL_LONGVALUE">
-        <on column="longValue"/>
-        <on column="schema_id"/>
-      </unique>
-    </table>
-    <table name="APlainAttrValue">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="binaryValue" type="blob" size="-1"/>
-      <column name="booleanValue" type="integer"/>
-      <column name="dateValue" type="timestamp"/>
-      <column name="doubleValue" type="double"/>
-      <column name="longValue" type="bigint"/>
-      <column name="stringValue" type="varchar" size="255"/>
-      <column name="ATTRIBUTE_ID" type="varchar" size="36"/>
-      <fk to-table="APlainAttr" column="ATTRIBUTE_ID"/>
-      <index name="I_PLNTRVL_ATTRIBUTE" column="ATTRIBUTE_ID"/>
-    </table>
-    <table name="ARelationship">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="left_anyObject_id" type="varchar" size="36"/>
-      <column name="right_anyObject_id" type="varchar" size="36"/>
-      <column name="TYPE_ID" type="varchar" size="255"/>
-      <fk to-table="AnyObject" column="left_anyObject_id"/>
-      <fk to-table="AnyObject" column="right_anyObject_id"/>
-      <fk to-table="RelationshipType" column="TYPE_ID"/>
-      <index name="I_RLTNSHP_LEFTEND" column="left_anyObject_id"/>
-      <index name="I_RLTNSHP_RIGHTEND" column="right_anyObject_id"/>
-      <index name="I_RLTNSHP_TYPE" column="TYPE_ID"/>
-      <unique name="U_RLTNSHP_TYPE_ID">
-        <on column="TYPE_ID"/>
-        <on column="left_anyObject_id"/>
-        <on column="right_anyObject_id"/>
-      </unique>
-    </table>
-    <table name="AccessToken">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="255"/>
-      <column name="authorities" type="blob" size="-1"/>
-      <column name="body" type="clob" size="-1"/>
-      <column name="expiryTime" type="timestamp"/>
-      <column name="owner" type="varchar" size="255"/>
-      <unique name="U_CCSSTKN_OWNER" column="owner"/>
-    </table>
-    <table name="AccountPolicy">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="description" type="varchar" size="255"/>
-      <column name="maxAuthenticationAttempts" type="integer"/>
-      <column name="propagateSuspension" type="integer"/>
-    </table>
-    <table name="AccountPolicyRule">
-      <column name="policy_id" type="varchar" size="36"/>
-      <column name="implementation_id" type="varchar" size="255"/>
-      <fk to-table="AccountPolicy" column="policy_id"/>
-      <fk to-table="Implementation" column="implementation_id"/>
-      <index name="I_CCNTYRL_ELEMENT" column="implementation_id"/>
-      <index name="I_CCNTYRL_POLICY_ID" column="policy_id"/>
-    </table>
-    <table name="AccountPolicy_ExternalResource">
-      <column name="accountPolicy_id" type="varchar" size="36"/>
-      <column name="resource_id" type="varchar" size="255"/>
-      <fk to-table="AccountPolicy" column="accountPolicy_id"/>
-      <fk to-table="ExternalResource" column="resource_id"/>
-      <index name="I_CCNTSRC_ACCOUNTPOLICY_ID" column="accountPolicy_id"/>
-      <index name="I_CCNTSRC_ELEMENT" column="resource_id"/>
-    </table>
-    <table name="AnyAbout">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="filter" type="clob" size="-1"/>
-      <column name="NOTIFICATION_ID" type="varchar" size="36"/>
-      <column name="ANYTYPE_ID" type="varchar" size="255"/>
-      <fk to-table="Notification" column="NOTIFICATION_ID"/>
-      <fk to-table="AnyType" column="ANYTYPE_ID"/>
-      <index name="I_NYABOUT_ANYTYPE" column="ANYTYPE_ID"/>
-      <index name="I_NYABOUT_NOTIFICATION" column="NOTIFICATION_ID"/>
-      <unique name="U_NYABOUT_NOTIFICATION_ID">
-        <on column="NOTIFICATION_ID"/>
-        <on column="ANYTYPE_ID"/>
-      </unique>
-    </table>
-    <table name="AnyObject">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="creationDate" type="timestamp"/>
-      <column name="creator" type="varchar" size="255"/>
-      <column name="lastChangeDate" type="timestamp"/>
-      <column name="lastModifier" type="varchar" size="255"/>
-      <column name="status" type="varchar" size="255"/>
-      <column name="name" type="varchar" size="255"/>
-      <column name="REALM_ID" type="varchar" size="36"/>
-      <column name="TYPE_ID" type="varchar" size="255"/>
-      <fk to-table="Realm" column="REALM_ID"/>
-      <fk to-table="AnyType" column="TYPE_ID"/>
-      <index name="I_NYOBJCT_REALM" column="REALM_ID"/>
-      <index name="I_NYOBJCT_TYPE" column="TYPE_ID"/>
-      <unique name="U_NYOBJCT_NAME" column="name"/>
-    </table>
-    <table name="AnyObject_AnyTypeClass">
-      <column name="anyObject_id" type="varchar" size="36"/>
-      <column name="anyTypeClass_id" type="varchar" size="255"/>
-      <fk to-table="AnyObject" column="anyObject_id"/>
-      <fk to-table="AnyTypeClass" column="anyTypeClass_id"/>
-      <index name="I_NYBJLSS_ANYOBJECT_ID" column="anyObject_id"/>
-      <index name="I_NYBJLSS_ELEMENT" column="anyTypeClass_id"/>
-    </table>
-    <table name="AnyObject_ExternalResource">
-      <column name="anyObject_id" type="varchar" size="36"/>
-      <column name="resource_id" type="varchar" size="255"/>
-      <fk to-table="AnyObject" column="anyObject_id"/>
-      <fk to-table="ExternalResource" column="resource_id"/>
-      <index name="I_NYBJSRC_ANYOBJECT_ID" column="anyObject_id"/>
-      <index name="I_NYBJSRC_ELEMENT" column="resource_id"/>
-    </table>
-    <table name="AnyTemplatePullTask">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="template" type="clob" size="-1"/>
-      <column name="ANYTYPE_ID" type="varchar" size="255"/>
-      <column name="PULLTASK_ID" type="varchar" size="36"/>
-      <fk to-table="AnyType" column="ANYTYPE_ID"/>
-      <fk to-table="Task" column="PULLTASK_ID"/>
-      <index name="I_NYTMTSK_ANYTYPE" column="ANYTYPE_ID"/>
-      <index name="I_NYTMTSK_PULLTASK" column="PULLTASK_ID"/>
-      <unique name="U_NYTMTSK_PULLTASK_ID">
-        <on column="PULLTASK_ID"/>
-        <on column="ANYTYPE_ID"/>
-      </unique>
-    </table>
-    <table name="AnyTemplateRealm">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="template" type="clob" size="-1"/>
-      <column name="REALM_ID" type="varchar" size="36"/>
-      <column name="ANYTYPE_ID" type="varchar" size="255"/>
-      <fk to-table="Realm" column="REALM_ID"/>
-      <fk to-table="AnyType" column="ANYTYPE_ID"/>
-      <index name="I_NYTMRLM_ANYTYPE" column="ANYTYPE_ID"/>
-      <index name="I_NYTMRLM_REALM" column="REALM_ID"/>
-      <unique name="U_NYTMRLM_REALM_ID">
-        <on column="REALM_ID"/>
-        <on column="ANYTYPE_ID"/>
-      </unique>
-    </table>
-    <table name="AnyType">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="255"/>
-      <column name="kind" type="varchar" size="20"/>
-    </table>
-    <table name="AnyTypeClass">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="255"/>
-    </table>
-    <table name="AnyType_AnyTypeClass">
-      <column name="anyType_id" type="varchar" size="255"/>
-      <column name="anyTypeClass_id" type="varchar" size="255"/>
-      <fk to-table="AnyType" column="anyType_id"/>
-      <fk to-table="AnyTypeClass" column="anyTypeClass_id"/>
-      <index name="I_NYTYLSS_ANYTYPE_ID" column="anyType_id"/>
-      <index name="I_NYTYLSS_ELEMENT" column="anyTypeClass_id"/>
-    </table>
-    <table name="Application">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="255"/>
-      <column name="description" type="varchar" size="255"/>
-    </table>
-    <table name="CPlainAttr">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="schema_id" type="varchar" size="255"/>
-      <column name="OWNER_ID" type="varchar" size="255"/>
-      <fk to-table="PlainSchema" column="schema_id"/>
-      <fk to-table="SyncopeConf" column="OWNER_ID"/>
-      <index name="I_CPLNTTR_OWNER" column="OWNER_ID"/>
-      <index name="I_CPLNTTR_SCHEMA" column="schema_id"/>
-    </table>
-    <table name="CPlainAttrUniqueValue">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="binaryValue" type="blob" size="-1"/>
-      <column name="booleanValue" type="integer"/>
-      <column name="dateValue" type="timestamp"/>
-      <column name="doubleValue" type="double"/>
-      <column name="longValue" type="bigint"/>
-      <column name="stringValue" type="varchar" size="255"/>
-      <column name="ATTRIBUTE_ID" type="varchar" size="36"/>
-      <column name="schema_id" type="varchar" size="255"/>
-      <fk to-table="CPlainAttr" column="ATTRIBUTE_ID"/>
-      <fk to-table="PlainSchema" column="schema_id"/>
-      <index name="I_CPLNQVL_ATTRIBUTE" column="ATTRIBUTE_ID"/>
-      <index name="I_CPLNQVL_SCHEMA" column="schema_id"/>
-      <unique name="U_CPLNQVL_BOOLEANVALUE">
-        <on column="booleanValue"/>
-        <on column="schema_id"/>
-      </unique>
-      <unique name="U_CPLNQVL_DATEVALUE">
-        <on column="dateValue"/>
-        <on column="schema_id"/>
-      </unique>
-      <unique name="U_CPLNQVL_STRINGVALUE">
-        <on column="stringValue"/>
-        <on column="schema_id"/>
-      </unique>
-      <unique name="U_CPLNQVL_DOUBLEVALUE">
-        <on column="doubleValue"/>
-        <on column="schema_id"/>
-      </unique>
-      <unique name="U_CPLNQVL_LONGVALUE">
-        <on column="longValue"/>
-        <on column="schema_id"/>
-      </unique>
-    </table>
-    <table name="CPlainAttrValue">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="binaryValue" type="blob" size="-1"/>
-      <column name="booleanValue" type="integer"/>
-      <column name="dateValue" type="timestamp"/>
-      <column name="doubleValue" type="double"/>
-      <column name="longValue" type="bigint"/>
-      <column name="stringValue" type="varchar" size="255"/>
-      <column name="ATTRIBUTE_ID" type="varchar" size="36"/>
-      <fk to-table="CPlainAttr" column="ATTRIBUTE_ID"/>
-      <index name="I_CPLNRVL_ATTRIBUTE" column="ATTRIBUTE_ID"/>
-    </table>
-    <table name="ConnInstance">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="bundleName" type="varchar" size="255"/>
-      <column name="connRequestTimeout" type="integer"/>
-      <column name="connectorName" type="varchar" size="255"/>
-      <column name="displayName" type="varchar" size="255"/>
-      <column name="jsonConf" type="clob" size="-1"/>
-      <column name="location" type="varchar" size="255"/>
-      <column name="version" type="varchar" size="255"/>
-      <column name="ADMINREALM_ID" type="varchar" size="36"/>
-      <column name="maxIdle" type="integer"/>
-      <column name="maxObjects" type="integer"/>
-      <column name="maxWait" type="bigint"/>
-      <column name="minEvictableIdleTimeMillis" type="bigint"/>
-      <column name="minIdle" type="integer"/>
-      <fk to-table="Realm" column="ADMINREALM_ID"/>
-      <index name="I_CNNNTNC_ADMINREALM" column="ADMINREALM_ID"/>
-      <unique name="U_CNNNTNC_DISPLAYNAME" column="displayName"/>
-    </table>
-    <table name="ConnInstanceHistoryConf">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="conf" type="clob" size="-1"/>
-      <column name="creation" type="timestamp"/>
-      <column name="creator" type="varchar" not-null="true" size="255"/>
-      <column name="ENTITY_ID" type="varchar" size="36"/>
-      <fk to-table="ConnInstance" column="ENTITY_ID"/>
-      <index name="I_CNNNCNF_ENTITY" column="ENTITY_ID"/>
-    </table>
-    <table name="ConnInstance_capabilities">
-      <column name="connInstance_id" type="varchar" size="36"/>
-      <column name="capability" type="varchar" size="20"/>
-      <fk to-table="ConnInstance" column="connInstance_id"/>
-      <index name="I_CNNNLTS_CONNINSTANCE_ID" column="connInstance_id"/>
-    </table>
-    <table name="DerSchema">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="255"/>
-      <column name="expression" type="varchar" size="255"/>
-      <column name="ANYTYPECLASS_ID" type="varchar" size="255"/>
-      <fk to-table="SyncopeSchema" column="id"/>
-      <fk to-table="AnyTypeClass" column="ANYTYPECLASS_ID"/>
-      <index name="I_DRSCHEM_ANYTYPECLASS" column="ANYTYPECLASS_ID"/>
-    </table>
-    <table name="DynRealm">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="255"/>
-    </table>
-    <table name="DynRealmMembership">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="fiql" type="varchar" size="255"/>
-      <column name="DYNREALM_ID" type="varchar" size="255"/>
-      <column name="ANYTYPE_ID" type="varchar" size="255"/>
-      <fk to-table="DynRealm" column="DYNREALM_ID"/>
-      <fk to-table="AnyType" column="ANYTYPE_ID"/>
-      <index name="I_DYNRSHP_ANYTYPE" column="ANYTYPE_ID"/>
-      <index name="I_DYNRSHP_DYNREALM" column="DYNREALM_ID"/>
-    </table>
-    <table name="DynRoleMembership">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="fiql" type="varchar" size="255"/>
-      <column name="ROLE_ID" type="varchar" size="255"/>
-      <fk to-table="SyncopeRole" column="ROLE_ID"/>
-      <index name="I_DYNRSHP_ROLE" column="ROLE_ID"/>
-    </table>
-    <table name="ExternalResource">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="255"/>
-      <column name="createTraceLevel" type="varchar" size="20"/>
-      <column name="deleteTraceLevel" type="varchar" size="20"/>
-      <column name="enforceMandatoryCondition" type="integer"/>
-      <column name="jsonConf" type="clob" size="-1"/>
-      <column name="overrideCapabilities" type="integer"/>
-      <column name="propagationPriority" type="integer"/>
-      <column name="provisioningTraceLevel" type="varchar" size="20"/>
-      <column name="randomPwdIfNotProvided" type="integer"/>
-      <column name="updateTraceLevel" type="varchar" size="20"/>
-      <column name="ACCOUNTPOLICY_ID" type="varchar" size="36"/>
-      <column name="CONNECTOR_ID" type="varchar" size="36"/>
-      <column name="PASSWORDPOLICY_ID" type="varchar" size="36"/>
-      <column name="PULLPOLICY_ID" type="varchar" size="36"/>
-      <column name="PUSHPOLICY_ID" type="varchar" size="36"/>
-      <fk to-table="AccountPolicy" column="ACCOUNTPOLICY_ID"/>
-      <fk to-table="ConnInstance" column="CONNECTOR_ID"/>
-      <fk to-table="PasswordPolicy" column="PASSWORDPOLICY_ID"/>
-      <fk to-table="PullPolicy" column="PULLPOLICY_ID"/>
-      <fk to-table="PushPolicy" column="PUSHPOLICY_ID"/>
-      <index name="I_XTRNSRC_ACCOUNTPOLICY" column="ACCOUNTPOLICY_ID"/>
-      <index name="I_XTRNSRC_CONNECTOR" column="CONNECTOR_ID"/>
-      <index name="I_XTRNSRC_PASSWORDPOLICY" column="PASSWORDPOLICY_ID"/>
-      <index name="I_XTRNSRC_PULLPOLICY" column="PULLPOLICY_ID"/>
-      <index name="I_XTRNSRC_PUSHPOLICY" column="PUSHPOLICY_ID"/>
-    </table>
-    <table name="ExternalResourceHistoryConf">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="conf" type="clob" size="-1"/>
-      <column name="creation" type="timestamp"/>
-      <column name="creator" type="varchar" not-null="true" size="255"/>
-      <column name="ENTITY_ID" type="varchar" size="255"/>
-      <fk to-table="ExternalResource" column="ENTITY_ID"/>
-      <index name="I_XTRNCNF_ENTITY" column="ENTITY_ID"/>
-    </table>
-    <table name="ExternalResourcePropAction">
-      <column name="resource_id" type="varchar" size="255"/>
-      <column name="implementation_id" type="varchar" size="255"/>
-      <fk to-table="ExternalResource" column="resource_id"/>
-      <fk to-table="Implementation" column="implementation_id"/>
-      <index name="I_XTRNCTN_ELEMENT" column="implementation_id"/>
-      <index name="I_XTRNCTN_RESOURCE_ID" column="resource_id"/>
-    </table>
-    <table name="ExternalResource_capOverride">
-      <column name="resource_id" type="varchar" size="255"/>
-      <column name="capabilityOverride" type="varchar" size="20"/>
-      <fk to-table="ExternalResource" column="resource_id"/>
-      <index name="I_XTRNRRD_RESOURCE_ID" column="resource_id"/>
-    </table>
-    <table name="GPlainAttr">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="OWNER_ID" type="varchar" size="36"/>
-      <column name="schema_id" type="varchar" size="255"/>
-      <fk to-table="SyncopeGroup" column="OWNER_ID"/>
-      <fk to-table="PlainSchema" column="schema_id"/>
-      <index name="I_GPLNTTR_OWNER" column="OWNER_ID"/>
-      <index name="I_GPLNTTR_SCHEMA" column="schema_id"/>
-    </table>
-    <table name="GPlainAttrUniqueValue">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="binaryValue" type="blob" size="-1"/>
-      <column name="booleanValue" type="integer"/>
-      <column name="dateValue" type="timestamp"/>
-      <column name="doubleValue" type="double"/>
-      <column name="longValue" type="bigint"/>
-      <column name="stringValue" type="varchar" size="255"/>
-      <column name="ATTRIBUTE_ID" type="varchar" size="36"/>
-      <column name="schema_id" type="varchar" size="255"/>
-      <fk to-table="GPlainAttr" column="ATTRIBUTE_ID"/>
-      <fk to-table="PlainSchema" column="schema_id"/>
-      <index name="I_GPLNQVL_ATTRIBUTE" column="ATTRIBUTE_ID"/>
-      <index name="I_GPLNQVL_SCHEMA" column="schema_id"/>
-      <unique name="U_GPLNQVL_BOOLEANVALUE">
-        <on column="booleanValue"/>
-        <on column="schema_id"/>
-      </unique>
-      <unique name="U_GPLNQVL_DATEVALUE">
-        <on column="dateValue"/>
-        <on column="schema_id"/>
-      </unique>
-      <unique name="U_GPLNQVL_STRINGVALUE">
-        <on column="stringValue"/>
-        <on column="schema_id"/>
-      </unique>
-      <unique name="U_GPLNQVL_DOUBLEVALUE">
-        <on column="doubleValue"/>
-        <on column="schema_id"/>
-      </unique>
-      <unique name="U_GPLNQVL_LONGVALUE">
-        <on column="longValue"/>
-        <on column="schema_id"/>
-      </unique>
-    </table>
-    <table name="GPlainAttrValue">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="binaryValue" type="blob" size="-1"/>
-      <column name="booleanValue" type="integer"/>
-      <column name="dateValue" type="timestamp"/>
-      <column name="doubleValue" type="double"/>
-      <column name="longValue" type="bigint"/>
-      <column name="stringValue" type="varchar" size="255"/>
-      <column name="ATTRIBUTE_ID" type="varchar" size="36"/>
-      <fk to-table="GPlainAttr" column="ATTRIBUTE_ID"/>
-      <index name="I_GPLNRVL_ATTRIBUTE" column="ATTRIBUTE_ID"/>
-    </table>
-    <table name="Implementation">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="255"/>
-      <column name="body" type="clob" size="-1"/>
-      <column name="engine" type="varchar" not-null="true" size="20"/>
-      <column name="type" type="varchar" not-null="true" size="21"/>
-    </table>
-    <table name="MailTemplate">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="255"/>
-      <column name="htmlTemplate" type="clob" size="-1"/>
-      <column name="textTemplate" type="clob" size="-1"/>
-    </table>
-    <table name="Mapping">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="connObjectLink" type="varchar" size="255"/>
-      <column name="PROVISION_ID" type="varchar" size="36"/>
-      <fk to-table="Provision" column="PROVISION_ID"/>
-      <index name="I_MAPPING_PROVISION" column="PROVISION_ID"/>
-    </table>
-    <table name="MappingItem">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="connObjectKey" type="integer"/>
-      <column name="extAttrName" type="varchar" size="255"/>
-      <column name="intAttrName" type="varchar" size="255"/>
-      <column name="mandatoryCondition" type="varchar" size="255"/>
-      <column name="password" type="integer"/>
-      <column name="propJEXL" type="varchar" size="255"/>
-      <column name="pullJEXL" type="varchar" size="255"/>
-      <column name="purpose" type="varchar" size="20"/>
-      <column name="MAPPING_ID" type="varchar" size="36"/>
-      <fk to-table="Mapping" column="MAPPING_ID"/>
-      <index name="I_MPPNGTM_MAPPING" column="MAPPING_ID"/>
-    </table>
-    <table name="MappingItemTransformer">
-      <column name="item_id" type="varchar" size="36"/>
-      <column name="implementation_id" type="varchar" size="255"/>
-      <fk to-table="MappingItem" column="item_id"/>
-      <fk to-table="Implementation" column="implementation_id"/>
-      <index name="I_MPPNRMR_ELEMENT" column="implementation_id"/>
-      <index name="I_MPPNRMR_ITEM_ID" column="item_id"/>
-    </table>
-    <table name="Notification">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="active" type="integer"/>
-      <column name="recipientAttrName" type="varchar" size="255"/>
-      <column name="recipientsFIQL" type="varchar" size="255"/>
-      <column name="selfAsRecipient" type="integer"/>
-      <column name="sender" type="varchar" size="255"/>
-      <column name="subject" type="varchar" size="255"/>
-      <column name="traceLevel" type="varchar" size="20"/>
-      <column name="RECIPIENTSPROVIDER_ID" type="varchar" size="255"/>
-      <column name="template_id" type="varchar" size="255"/>
-      <fk to-table="Implementation" column="RECIPIENTSPROVIDER_ID"/>
-      <fk to-table="MailTemplate" column="template_id"/>
-      <index name="I_NTFCTON_RECIPIENTSPROVIDER" column="RECIPIENTSPROVIDER_ID"/>
-      <index name="I_NTFCTON_TEMPLATE" column="template_id"/>
-    </table>
-    <table name="NotificationTask_recipients">
-      <column name="notificationTask_id" type="varchar" size="36"/>
-      <column name="address" type="varchar" size="255"/>
-      <fk to-table="Task" column="notificationTask_id"/>
-      <index name="I_NTFCNTS_NOTIFICATIONTASK_ID" column="notificationTask_id"/>
-    </table>
-    <table name="Notification_events">
-      <column name="notification_id" type="varchar" size="36"/>
-      <column name="event" type="varchar" size="255"/>
-      <fk to-table="Notification" column="notification_id"/>
-      <index name="I_NTFCNTS_NOTIFICATION_ID" column="notification_id"/>
-    </table>
-    <table name="Notification_staticRecipients">
-      <column name="notification_id" type="varchar" size="36"/>
-      <column name="staticRecipients" type="varchar" size="255"/>
-      <fk to-table="Notification" column="notification_id"/>
-      <index name="I_NTFCNTS_NOTIFICATION_ID1" column="notification_id"/>
-    </table>
-    <table name="OrgUnit">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="connObjectLink" type="varchar" size="255"/>
-      <column name="ignoreCaseMatch" type="integer"/>
-      <column name="objectClass" type="varchar" size="255"/>
-      <column name="serializedSyncToken" type="clob" size="-1"/>
-      <column name="RESOURCE_ID" type="varchar" size="255"/>
-      <fk to-table="ExternalResource" column="RESOURCE_ID"/>
-      <index name="I_ORGUNIT_RESOURCE" column="RESOURCE_ID"/>
-    </table>
-    <table name="OrgUnitItem">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="connObjectKey" type="integer"/>
-      <column name="extAttrName" type="varchar" size="255"/>
-      <column name="intAttrName" type="varchar" size="255"/>
-      <column name="mandatoryCondition" type="varchar" size="255"/>
-      <column name="password" type="integer"/>
-      <column name="propJEXL" type="varchar" size="255"/>
-      <column name="pullJEXL" type="varchar" size="255"/>
-      <column name="purpose" type="varchar" size="20"/>
-      <column name="ORGUNIT_ID" type="varchar" size="36"/>
-      <fk to-table="OrgUnit" column="ORGUNIT_ID"/>
-      <index name="I_RGUNTTM_ORGUNIT" column="ORGUNIT_ID"/>
-    </table>
-    <table name="OrgUnitItemTransformer">
-      <column name="item_id" type="varchar" size="36"/>
-      <column name="implementation_id" type="varchar" size="255"/>
-      <fk to-table="OrgUnitItem" column="item_id"/>
-      <fk to-table="Implementation" column="implementation_id"/>
-      <index name="I_RGNTRMR_ELEMENT" column="implementation_id"/>
-      <index name="I_RGNTRMR_ITEM_ID" column="item_id"/>
-    </table>
-    <table name="PasswordPolicy">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="description" type="varchar" size="255"/>
-      <column name="allowNullPassword" type="integer"/>
-      <column name="historyLength" type="integer"/>
-    </table>
-    <table name="PasswordPolicyRule">
-      <column name="policy_id" type="varchar" size="36"/>
-      <column name="implementation_id" type="varchar" size="255"/>
-      <fk to-table="PasswordPolicy" column="policy_id"/>
-      <fk to-table="Implementation" column="implementation_id"/>
-      <index name="I_PSSWYRL_ELEMENT" column="implementation_id"/>
-      <index name="I_PSSWYRL_POLICY_ID" column="policy_id"/>
-    </table>
-    <table name="PlainSchema">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="255"/>
-      <column name="cipherAlgorithm" type="varchar" size="20"/>
-      <column name="conversionPattern" type="varchar" size="255"/>
-      <column name="enumerationKeys" type="clob" size="-1"/>
-      <column name="enumerationValues" type="clob" size="-1"/>
-      <column name="mandatoryCondition" type="varchar" size="255"/>
-      <column name="mimeType" type="varchar" size="255"/>
-      <column name="multivalue" type="integer"/>
-      <column name="readonly" type="integer"/>
-      <column name="secretKey" type="varchar" size="255"/>
-      <column name="type" type="varchar" size="20"/>
-      <column name="uniqueConstraint" type="integer"/>
-      <column name="ANYTYPECLASS_ID" type="varchar" size="255"/>
-      <column name="VALIDATOR_ID" type="varchar" size="255"/>
-      <fk to-table="SyncopeSchema" column="id"/>
-      <fk to-table="AnyTypeClass" column="ANYTYPECLASS_ID"/>
-      <fk to-table="Implementation" column="VALIDATOR_ID"/>
-      <index name="I_PLNSCHM_ANYTYPECLASS" column="ANYTYPECLASS_ID"/>
-      <index name="I_PLNSCHM_VALIDATOR" column="VALIDATOR_ID"/>
-    </table>
-    <table name="Privilege">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="255"/>
-      <column name="description" type="varchar" size="255"/>
-      <column name="spec" type="clob" size="-1"/>
-      <column name="APPLICATION_ID" type="varchar" size="255"/>
-      <fk to-table="Application" column="APPLICATION_ID"/>
-      <index name="I_PRIVILG_APPLICATION" column="APPLICATION_ID"/>
-    </table>
-    <table name="Provision">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="ignoreCaseMatch" type="integer"/>
-      <column name="objectClass" type="varchar" size="255"/>
-      <column name="serializedSyncToken" type="clob" size="-1"/>
-      <column name="RESOURCE_ID" type="varchar" size="255"/>
-      <column name="ANYTYPE_ID" type="varchar" size="255"/>
-      <column name="UIDONCREATE_ID" type="varchar" size="255"/>
-      <fk to-table="ExternalResource" column="RESOURCE_ID"/>
-      <fk to-table="AnyType" column="ANYTYPE_ID"/>
-      <fk to-table="PlainSchema" column="UIDONCREATE_ID"/>
-      <index name="I_PROVSON_ANYTYPE" column="ANYTYPE_ID"/>
-      <index name="I_PROVSON_RESOURCE" column="RESOURCE_ID"/>
-      <index name="I_PROVSON_UIDONCREATE" column="UIDONCREATE_ID"/>
-      <unique name="U_PROVSON_RESOURCE_ID">
-        <on column="RESOURCE_ID"/>
-        <on column="ANYTYPE_ID"/>
-      </unique>
-    </table>
-    <table name="Provision_AnyTypeClass">
-      <column name="provision_id" type="varchar" size="36"/>
-      <column name="anyTypeClass_id" type="varchar" size="255"/>
-      <fk to-table="Provision" column="provision_id"/>
-      <fk to-table="AnyTypeClass" column="anyTypeClass_id"/>
-      <index name="I_PRVSLSS_ELEMENT" column="anyTypeClass_id"/>
-      <index name="I_PRVSLSS_PROVISION_ID" column="provision_id"/>
-    </table>
-    <table name="PullCorrelationRuleEntity">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="PULLPOLICY_ID" type="varchar" size="36"/>
-      <column name="ANYTYPE_ID" type="varchar" size="255"/>
-      <column name="IMPLEMENTATION_ID" type="varchar" size="255"/>
-      <fk to-table="PullPolicy" column="PULLPOLICY_ID"/>
-      <fk to-table="AnyType" column="ANYTYPE_ID"/>
-      <fk to-table="Implementation" column="IMPLEMENTATION_ID"/>
-      <index name="I_PLLCTTY_ANYTYPE" column="ANYTYPE_ID"/>
-      <index name="I_PLLCTTY_IMPLEMENTATION" column="IMPLEMENTATION_ID"/>
-      <index name="I_PLLCTTY_PULLPOLICY" column="PULLPOLICY_ID"/>
-      <unique name="U_PLLCTTY_PULLPOLICY_ID">
-        <on column="PULLPOLICY_ID"/>
-        <on column="ANYTYPE_ID"/>
-      </unique>
-    </table>
-    <table name="PullPolicy">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="description" type="varchar" size="255"/>
-      <column name="conflictResolutionAction" type="varchar" size="20"/>
-    </table>
-    <table name="PullTaskAction">
-      <column name="task_id" type="varchar" size="36"/>
-      <column name="implementation_id" type="varchar" size="255"/>
-      <fk to-table="Task" column="task_id"/>
-      <fk to-table="Implementation" column="implementation_id"/>
-      <index name="I_PLLTCTN_ELEMENT" column="implementation_id"/>
-      <index name="I_PLLTCTN_TASK_ID" column="task_id"/>
-    </table>
-    <table name="PushCorrelationRuleEntity">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="PUSHPOLICY_ID" type="varchar" size="36"/>
-      <column name="ANYTYPE_ID" type="varchar" size="255"/>
-      <column name="IMPLEMENTATION_ID" type="varchar" size="255"/>
-      <fk to-table="PushPolicy" column="PUSHPOLICY_ID"/>
-      <fk to-table="AnyType" column="ANYTYPE_ID"/>
-      <fk to-table="Implementation" column="IMPLEMENTATION_ID"/>
-      <index name="I_PSHCTTY_ANYTYPE" column="ANYTYPE_ID"/>
-      <index name="I_PSHCTTY_IMPLEMENTATION" column="IMPLEMENTATION_ID"/>
-      <index name="I_PSHCTTY_PUSHPOLICY" column="PUSHPOLICY_ID"/>
-      <unique name="U_PSHCTTY_PUSHPOLICY_ID">
-        <on column="PUSHPOLICY_ID"/>
-        <on column="ANYTYPE_ID"/>
-      </unique>
-    </table>
-    <table name="PushPolicy">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="description" type="varchar" size="255"/>
-      <column name="conflictResolutionAction" type="varchar" size="20"/>
-    </table>
-    <table name="PushTaskAction">
-      <column name="task_id" type="varchar" size="36"/>
-      <column name="implementation_id" type="varchar" size="255"/>
-      <fk to-table="Task" column="task_id"/>
-      <fk to-table="Implementation" column="implementation_id"/>
-      <index name="I_PSHTCTN_ELEMENT" column="implementation_id"/>
-      <index name="I_PSHTCTN_TASK_ID" column="task_id"/>
-    </table>
-    <table name="PushTaskAnyFilter">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="fiql" type="varchar" size="255"/>
-      <column name="ANYTYPE_ID" type="varchar" size="255"/>
-      <column name="PUSHTASK_ID" type="varchar" size="36"/>
-      <fk to-table="AnyType" column="ANYTYPE_ID"/>
-      <fk to-table="Task" column="PUSHTASK_ID"/>
-      <index name="I_PSHTLTR_ANYTYPE" column="ANYTYPE_ID"/>
-      <index name="I_PSHTLTR_PUSHTASK" column="PUSHTASK_ID"/>
-      <unique name="U_PSHTLTR_PUSHTASK_ID">
-        <on column="PUSHTASK_ID"/>
-        <on column="ANYTYPE_ID"/>
-      </unique>
-    </table>
-    <table name="Realm">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="name" type="varchar" size="255"/>
-      <column name="ACCOUNTPOLICY_ID" type="varchar" size="36"/>
-      <column name="PARENT_ID" type="varchar" size="36"/>
-      <column name="PASSWORDPOLICY_ID" type="varchar" size="36"/>
-      <fk to-table="AccountPolicy" column="ACCOUNTPOLICY_ID"/>
-      <fk to-table="Realm" column="PARENT_ID"/>
-      <fk to-table="PasswordPolicy" column="PASSWORDPOLICY_ID"/>
-      <index name="I_REALM_ACCOUNTPOLICY" column="ACCOUNTPOLICY_ID"/>
-      <index name="I_REALM_PARENT" column="PARENT_ID"/>
-      <index name="I_REALM_PASSWORDPOLICY" column="PASSWORDPOLICY_ID"/>
-      <unique name="U_REALM_NAME">
-        <on column="name"/>
-        <on column="PARENT_ID"/>
-      </unique>
-    </table>
-    <table name="RealmAction">
-      <column name="realm_id" type="varchar" size="36"/>
-      <column name="implementation_id" type="varchar" size="255"/>
-      <fk to-table="Realm" column="realm_id"/>
-      <fk to-table="Implementation" column="implementation_id"/>
-      <index name="I_RLMCTON_ELEMENT" column="implementation_id"/>
-      <index name="I_RLMCTON_REALM_ID" column="realm_id"/>
-    </table>
-    <table name="Realm_ExternalResource">
-      <column name="realm_id" type="varchar" size="36"/>
-      <column name="resource_id" type="varchar" size="255"/>
-      <fk to-table="Realm" column="realm_id"/>
-      <fk to-table="ExternalResource" column="resource_id"/>
-      <index name="I_RLM_SRC_ELEMENT" column="resource_id"/>
-      <index name="I_RLM_SRC_REALM_ID" column="realm_id"/>
-    </table>
-    <table name="RelationshipType">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="255"/>
-      <column name="description" type="varchar" size="255"/>
-    </table>
-    <table name="Remediation">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="error" type="clob" size="-1"/>
-      <column name="instant" type="timestamp"/>
-      <column name="operation" type="varchar" size="20"/>
-      <column name="payload" type="clob" size="-1"/>
-      <column name="remoteName" type="varchar" size="255"/>
-      <column name="ANYTYPE_ID" type="varchar" size="255"/>
-      <column name="PULLTASK_ID" type="varchar" size="36"/>
-      <fk to-table="AnyType" column="ANYTYPE_ID"/>
-      <fk to-table="Task" column="PULLTASK_ID"/>
-      <index name="I_RMDTION_ANYTYPE" column="ANYTYPE_ID"/>
-      <index name="I_RMDTION_PULLTASK" column="PULLTASK_ID"/>
-    </table>
-    <table name="Report">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="active" type="integer"/>
-      <column name="cronExpression" type="varchar" size="255"/>
-      <column name="name" type="varchar" not-null="true" size="255"/>
-      <column name="template_id" type="varchar" size="255"/>
-      <fk to-table="ReportTemplate" column="template_id"/>
-      <index name="I_REPORT_TEMPLATE" column="template_id"/>
-      <unique name="U_REPORT_NAME" column="name"/>
-    </table>
-    <table name="ReportExec">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="endDate" type="timestamp"/>
-      <column name="message" type="clob" size="-1"/>
-      <column name="startDate" type="timestamp"/>
-      <column name="status" type="varchar" size="255"/>
-      <column name="execResult" type="blob" size="-1"/>
-      <column name="REPORT_ID" type="varchar" size="36"/>
-      <fk to-table="Report" column="REPORT_ID"/>
-      <index name="I_RPORTXC_REPORT" column="REPORT_ID"/>
-    </table>
-    <table name="ReportReportlet">
-      <column name="report_id" type="varchar" size="36"/>
-      <column name="implementation_id" type="varchar" size="255"/>
-      <fk to-table="Report" column="report_id"/>
-      <fk to-table="Implementation" column="implementation_id"/>
-      <index name="I_RPRTTLT_ELEMENT" column="implementation_id"/>
-      <index name="I_RPRTTLT_REPORT_ID" column="report_id"/>
-    </table>
-    <table name="ReportTemplate">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="255"/>
-      <column name="csvTemplate" type="clob" size="-1"/>
-      <column name="foTemplate" type="clob" size="-1"/>
-      <column name="htmlTemplate" type="clob" size="-1"/>
-    </table>
-    <table name="SchemaLabel">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="display" type="varchar" not-null="true" size="255"/>
-      <column name="locale" type="varchar" not-null="true" size="255"/>
-      <column name="SCHEMA_ID" type="varchar" size="255"/>
-      <fk to-table="SyncopeSchema" column="SCHEMA_ID"/>
-      <index name="I_SCHMLBL_SCHEMA" column="SCHEMA_ID"/>
-      <unique name="U_SCHMLBL_SCHEMA_ID">
-        <on column="SCHEMA_ID"/>
-        <on column="locale"/>
-      </unique>
-    </table>
-    <table name="SecurityQuestion">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="content" type="varchar" size="255"/>
-      <unique name="U_SCRTSTN_CONTENT" column="content"/>
-    </table>
-    <table name="SyncopeConf">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="255"/>
-    </table>
-    <table name="SyncopeDomain">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="255"/>
-      <column name="adminCipherAlgorithm" type="varchar" size="20"/>
-      <column name="adminPwd" type="varchar" size="255"/>
-    </table>
-    <table name="SyncopeGroup">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="creationDate" type="timestamp"/>
-      <column name="creator" type="varchar" size="255"/>
-      <column name="lastChangeDate" type="timestamp"/>
-      <column name="lastModifier" type="varchar" size="255"/>
-      <column name="status" type="varchar" size="255"/>
-      <column name="name" type="varchar" size="255"/>
-      <column name="REALM_ID" type="varchar" size="36"/>
-      <column name="GROUPOWNER_ID" type="varchar" size="36"/>
-      <column name="USEROWNER_ID" type="varchar" size="36"/>
-      <fk to-table="Realm" column="REALM_ID"/>
-      <fk to-table="SyncopeGroup" column="GROUPOWNER_ID"/>
-      <fk to-table="SyncopeUser" column="USEROWNER_ID"/>
-      <index name="I_SYNCGRP_GROUPOWNER" column="GROUPOWNER_ID"/>
-      <index name="I_SYNCGRP_REALM" column="REALM_ID"/>
-      <index name="I_SYNCGRP_USEROWNER" column="USEROWNER_ID"/>
-      <unique name="U_SYNCGRP_NAME" column="name"/>
-    </table>
-    <table name="SyncopeGroup_AnyTypeClass">
-      <column name="group_id" type="varchar" size="36"/>
-      <column name="anyTypeClass_id" type="varchar" size="255"/>
-      <fk to-table="SyncopeGroup" column="group_id"/>
-      <fk to-table="AnyTypeClass" column="anyTypeClass_id"/>
-      <index name="I_SYNCLSS_ELEMENT" column="anyTypeClass_id"/>
-      <index name="I_SYNCLSS_GROUP_ID" column="group_id"/>
-    </table>
-    <table name="SyncopeGroup_ExternalResource">
-      <column name="group_id" type="varchar" size="36"/>
-      <column name="resource_id" type="varchar" size="255"/>
-      <fk to-table="SyncopeGroup" column="group_id"/>
-      <fk to-table="ExternalResource" column="resource_id"/>
-      <index name="I_SYNCSRC_ELEMENT" column="resource_id"/>
-      <index name="I_SYNCSRC_GROUP_ID" column="group_id"/>
-    </table>
-    <table name="SyncopeLogger">
-      <pk column="logName"/>
-      <column name="logName" type="varchar" not-null="true" size="255"/>
-      <column name="logLevel" type="varchar" not-null="true" size="20"/>
-      <column name="logType" type="varchar" not-null="true" size="20"/>
-    </table>
-    <table name="SyncopeRole">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="255"/>
-      <column name="anyLayout" type="clob" size="-1"/>
-    </table>
-    <table name="SyncopeRole_DynRealm">
-      <column name="role_id" type="varchar" size="255"/>
-      <column name="dynamicRealm_id" type="varchar" size="255"/>
-      <fk to-table="SyncopeRole" column="role_id"/>
-      <fk to-table="DynRealm" column="dynamicRealm_id"/>
-      <index name="I_SYNCRLM_ELEMENT" column="dynamicRealm_id"/>
-      <index name="I_SYNCRLM_ROLE_ID" column="role_id"/>
-    </table>
-    <table name="SyncopeRole_Privilege">
-      <column name="role_id" type="varchar" size="255"/>
-      <column name="privilege_id" type="varchar" size="255"/>
-      <fk to-table="SyncopeRole" column="role_id"/>
-      <fk to-table="Privilege" column="privilege_id"/>
-      <index name="I_SYNCVLG_ELEMENT" column="privilege_id"/>
-      <index name="I_SYNCVLG_ROLE_ID" column="role_id"/>
-    </table>
-    <table name="SyncopeRole_Realm">
-      <column name="role_id" type="varchar" size="255"/>
-      <column name="realm_id" type="varchar" size="36"/>
-      <fk to-table="SyncopeRole" column="role_id"/>
-      <fk to-table="Realm" column="realm_id"/>
-      <index name="I_SYNCRLM_ELEMENT1" column="realm_id"/>
-      <index name="I_SYNCRLM_ROLE_ID1" column="role_id"/>
-    </table>
-    <table name="SyncopeRole_entitlements">
-      <column name="role_id" type="varchar" size="255"/>
-      <column name="entitlement" type="varchar" size="255"/>
-      <fk to-table="SyncopeRole" column="role_id"/>
-      <index name="I_SYNCNTS_ROLE_ID" column="role_id"/>
-    </table>
-    <table name="SyncopeSchema">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="255"/>
-    </table>
-    <table name="SyncopeUser">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="creationDate" type="timestamp"/>
-      <column name="creator" type="varchar" size="255"/>
-      <column name="lastChangeDate" type="timestamp"/>
-      <column name="lastModifier" type="varchar" size="255"/>
-      <column name="status" type="varchar" size="255"/>
-      <column name="changePwdDate" type="timestamp"/>
-      <column name="cipherAlgorithm" type="varchar" size="20"/>
-      <column name="failedLogins" type="integer"/>
-      <column name="lastLoginDate" type="timestamp"/>
-      <column name="mustChangePassword" type="integer"/>
-      <column name="password" type="varchar" size="255"/>
-      <column name="securityAnswer" type="varchar" size="255"/>
-      <column name="suspended" type="integer"/>
-      <column name="token" type="clob" size="-1"/>
-      <column name="tokenExpireTime" type="timestamp"/>
-      <column name="username" type="varchar" size="255"/>
-      <column name="REALM_ID" type="varchar" size="36"/>
-      <column name="SECURITYQUESTION_ID" type="varchar" size="36"/>
-      <fk to-table="Realm" column="REALM_ID"/>
-      <fk to-table="SecurityQuestion" column="SECURITYQUESTION_ID"/>
-      <index name="I_SYNCPSR_REALM" column="REALM_ID"/>
-      <index name="I_SYNCPSR_SECURITYQUESTION" column="SECURITYQUESTION_ID"/>
-      <unique name="U_SYNCPSR_USERNAME" column="username"/>
-    </table>
-    <table name="SyncopeUser_AnyTypeClass">
-      <column name="user_id" type="varchar" size="36"/>
-      <column name="anyTypeClass_id" type="varchar" size="255"/>
-      <fk to-table="SyncopeUser" column="user_id"/>
-      <fk to-table="AnyTypeClass" column="anyTypeClass_id"/>
-      <index name="I_SYNCLSS_ELEMENT1" column="anyTypeClass_id"/>
-      <index name="I_SYNCLSS_USER_ID" column="user_id"/>
-    </table>
-    <table name="SyncopeUser_ExternalResource">
-      <column name="user_id" type="varchar" size="36"/>
-      <column name="resource_id" type="varchar" size="255"/>
-      <fk to-table="SyncopeUser" column="user_id"/>
-      <fk to-table="ExternalResource" column="resource_id"/>
-      <index name="I_SYNCSRC_ELEMENT1" column="resource_id"/>
-      <index name="I_SYNCSRC_USER_ID" column="user_id"/>
-    </table>
-    <table name="SyncopeUser_SyncopeRole">
-      <column name="user_id" type="varchar" size="36"/>
-      <column name="role_id" type="varchar" size="255"/>
-      <fk to-table="SyncopeUser" column="user_id"/>
-      <fk to-table="SyncopeRole" column="role_id"/>
-      <index name="I_SYNCPRL_ELEMENT" column="role_id"/>
-      <index name="I_SYNCPRL_USER_ID" column="user_id"/>
-    </table>
-    <table name="SyncopeUser_passwordHistory">
-      <column name="user_id" type="varchar" size="36"/>
-      <column name="passwordHistoryValue" type="varchar" size="255"/>
-      <fk to-table="SyncopeUser" column="user_id"/>
-      <index name="I_SYNCTRY_USER_ID" column="user_id"/>
-    </table>
-    <table name="Task">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="DTYPE" type="varchar" size="31"/>
-      <column name="active" type="integer"/>
-      <column name="cronExpression" type="varchar" size="255"/>
-      <column name="description" type="varchar" size="255"/>
-      <column name="name" type="varchar" size="255"/>
-      <column name="startAt" type="timestamp"/>
-      <column name="matchingRule" type="varchar" size="20"/>
-      <column name="performCreate" type="integer"/>
-      <column name="performDelete" type="integer"/>
-      <column name="performUpdate" type="integer"/>
-      <column name="syncStatus" type="integer"/>
-      <column name="unmatchingRule" type="varchar" size="20"/>
-      <column name="pullMode" type="varchar" size="23"/>
-      <column name="remediation" type="integer"/>
-      <column name="JOBDELEGATE_ID" type="varchar" size="255"/>
-      <column name="RESOURCE_ID" type="varchar" size="255"/>
-      <column name="DESTINATIONREALM_ID" type="varchar" size="36"/>
-      <column name="RECONFILTERBUILDER_ID" type="varchar" size="255"/>
-      <column name="anyType" type="varchar" size="255"/>
-      <column name="anyTypeKind" type="varchar" size="20"/>
-      <column name="attributes" type="clob" size="-1"/>
-      <column name="connObjectKey" type="varchar" size="255"/>
-      <column name="entityKey" type="varchar" size="255"/>
-      <column name="objectClassName" type="varchar" size="255"/>
-      <column name="oldConnObjectKey" type="varchar" size="255"/>
-      <column name="operation" type="varchar" size="20"/>
-      <column name="SOURCEREALM_ID" type="varchar" size="36"/>
-      <column name="executed" type="integer"/>
-      <column name="htmlBody" type="clob" size="-1"/>
-      <column name="sender" type="varchar" size="255"/>
-      <column name="subject" type="varchar" size="255"/>
-      <column name="textBody" type="clob" size="-1"/>
-      <column name="traceLevel" type="varchar" size="20"/>
-      <column name="NOTIFICATION_ID" type="varchar" size="36"/>
-      <fk to-table="Implementation" column="JOBDELEGATE_ID"/>
-      <fk to-table="ExternalResource" column="RESOURCE_ID"/>
-      <fk to-table="Realm" column="DESTINATIONREALM_ID"/>
-      <fk to-table="Implementation" column="RECONFILTERBUILDER_ID"/>
-      <fk to-table="Realm" column="SOURCEREALM_ID"/>
-      <fk to-table="Notification" column="NOTIFICATION_ID"/>
-      <index name="I_TASK_DESTINATIONREALM" column="DESTINATIONREALM_ID"/>
-      <index name="I_TASK_DTYPE" column="DTYPE"/>
-      <index name="I_TASK_JOBDELEGATE" column="JOBDELEGATE_ID"/>
-      <index name="I_TASK_NOTIFICATION" column="NOTIFICATION_ID"/>
-      <index name="I_TASK_RECONFILTERBUILDER" column="RECONFILTERBUILDER_ID"/>
-      <index name="I_TASK_RESOURCE" column="RESOURCE_ID"/>
-      <index name="I_TASK_SOURCEREALM" column="SOURCEREALM_ID"/>
-    </table>
-    <table name="TaskExec">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="endDate" type="timestamp"/>
-      <column name="message" type="clob" size="-1"/>
-      <column name="startDate" type="timestamp"/>
-      <column name="status" type="varchar" size="255"/>
-      <column name="TASK_ID" type="varchar" size="36"/>
-      <fk to-table="Task" column="TASK_ID"/>
-      <index name="I_TSKEXEC_TASK" column="TASK_ID"/>
-    </table>
-    <table name="TypeExtension">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="GROUP_ID" type="varchar" size="36"/>
-      <column name="ANYTYPE_ID" type="varchar" size="255"/>
-      <fk to-table="SyncopeGroup" column="GROUP_ID"/>
-      <fk to-table="AnyType" column="ANYTYPE_ID"/>
-      <index name="I_TYPXNSN_ANYTYPE" column="ANYTYPE_ID"/>
-      <index name="I_TYPXNSN_GROUP" column="GROUP_ID"/>
-      <unique name="U_TYPXNSN_GROUP_ID">
-        <on column="GROUP_ID"/>
-        <on column="ANYTYPE_ID"/>
-      </unique>
-    </table>
-    <table name="TypeExtension_AnyTypeClass">
-      <column name="typeExtension_id" type="varchar" size="36"/>
-      <column name="anyTypeClass_id" type="varchar" size="255"/>
-      <fk to-table="TypeExtension" column="typeExtension_id"/>
-      <fk to-table="AnyTypeClass" column="anyTypeClass_id"/>
-      <index name="I_TYPXLSS_ELEMENT" column="anyTypeClass_id"/>
-      <index name="I_TYPXLSS_TYPEEXTENSION_ID" column="typeExtension_id"/>
-    </table>
-    <table name="UDynGroupMembership">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="fiql" type="varchar" size="255"/>
-      <column name="GROUP_ID" type="varchar" size="36"/>
-      <fk to-table="SyncopeGroup" column="GROUP_ID"/>
-      <index name="I_DYNGSHP_GROUP1" column="GROUP_ID"/>
-    </table>
-    <table name="UMembership">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="user_id" type="varchar" size="36"/>
-      <column name="group_id" type="varchar" size="36"/>
-      <fk to-table="SyncopeUser" column="user_id"/>
-      <fk to-table="SyncopeGroup" column="group_id"/>
-      <index name="I_MMBRSHP_LEFTEND1" column="user_id"/>
-      <index name="I_MMBRSHP_RIGHTEND1" column="group_id"/>
-    </table>
-    <table name="UPlainAttr">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="OWNER_ID" type="varchar" size="36"/>
-      <column name="schema_id" type="varchar" size="255"/>
-      <column name="MEMBERSHIP_ID" type="varchar" size="36"/>
-      <fk to-table="SyncopeUser" column="OWNER_ID"/>
-      <fk to-table="PlainSchema" column="schema_id"/>
-      <fk to-table="UMembership" column="MEMBERSHIP_ID"/>
-      <index name="I_UPLNTTR_MEMBERSHIP" column="MEMBERSHIP_ID"/>
-      <index name="I_UPLNTTR_OWNER" column="OWNER_ID"/>
-      <index name="I_UPLNTTR_SCHEMA" column="schema_id"/>
-    </table>
-    <table name="UPlainAttrUniqueValue">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="binaryValue" type="blob" size="-1"/>
-      <column name="booleanValue" type="integer"/>
-      <column name="dateValue" type="timestamp"/>
-      <column name="doubleValue" type="double"/>
-      <column name="longValue" type="bigint"/>
-      <column name="stringValue" type="varchar" size="255"/>
-      <column name="ATTRIBUTE_ID" type="varchar" size="36"/>
-      <column name="schema_id" type="varchar" size="255"/>
-      <fk to-table="UPlainAttr" column="ATTRIBUTE_ID"/>
-      <fk to-table="PlainSchema" column="schema_id"/>
-      <index name="I_PLNTQVL_ATTRIBUTE1" column="ATTRIBUTE_ID"/>
-      <index name="I_PLNTQVL_SCHEMA1" column="schema_id"/>
-      <unique name="U_PLNTQVL_BOOLEANVALUE1">
-        <on column="booleanValue"/>
-        <on column="schema_id"/>
-      </unique>
-      <unique name="U_PLNTQVL_DATEVALUE1">
-        <on column="dateValue"/>
-        <on column="schema_id"/>
-      </unique>
-      <unique name="U_PLNTQVL_STRINGVALUE1">
-        <on column="stringValue"/>
-        <on column="schema_id"/>
-      </unique>
-      <unique name="U_PLNTQVL_DOUBLEVALUE1">
-        <on column="doubleValue"/>
-        <on column="schema_id"/>
-      </unique>
-      <unique name="U_PLNTQVL_LONGVALUE1">
-        <on column="longValue"/>
-        <on column="schema_id"/>
-      </unique>
-    </table>
-    <table name="UPlainAttrValue">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="binaryValue" type="blob" size="-1"/>
-      <column name="booleanValue" type="integer"/>
-      <column name="dateValue" type="timestamp"/>
-      <column name="doubleValue" type="double"/>
-      <column name="longValue" type="bigint"/>
-      <column name="stringValue" type="varchar" size="255"/>
-      <column name="ATTRIBUTE_ID" type="varchar" size="36"/>
-      <fk to-table="UPlainAttr" column="ATTRIBUTE_ID"/>
-      <index name="I_PLNTRVL_ATTRIBUTE1" column="ATTRIBUTE_ID"/>
-    </table>
-    <table name="URelationship">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="36"/>
-      <column name="user_id" type="varchar" size="36"/>
-      <column name="anyObject_id" type="varchar" size="36"/>
-      <column name="TYPE_ID" type="varchar" size="255"/>
-      <fk to-table="SyncopeUser" column="user_id"/>
-      <fk to-table="AnyObject" column="anyObject_id"/>
-      <fk to-table="RelationshipType" column="TYPE_ID"/>
-      <index name="I_RLTNSHP_LEFTEND1" column="user_id"/>
-      <index name="I_RLTNSHP_RIGHTEND1" column="anyObject_id"/>
-      <index name="I_RLTNSHP_TYPE1" column="TYPE_ID"/>
-      <unique name="U_RLTNSHP_TYPE_ID1">
-        <on column="TYPE_ID"/>
-        <on column="user_id"/>
-        <on column="anyObject_id"/>
-      </unique>
-    </table>
-    <table name="VirSchema">
-      <pk column="id"/>
-      <column name="id" type="varchar" not-null="true" size="255"/>
-      <column name="extAttrName" type="varchar" size="255"/>
-      <column name="readonly" type="integer"/>
-      <column name="ANYTYPECLASS_ID" type="varchar" size="255"/>
-      <column name="PROVISION_ID" type="varchar" size="36"/>
-      <fk to-table="SyncopeSchema" column="id"/>
-      <fk to-table="AnyTypeClass" column="ANYTYPECLASS_ID"/>
-      <fk to-table="Provision" column="PROVISION_ID"/>
-      <index name="I_VIRSCHM_ANYTYPECLASS" column="ANYTYPECLASS_ID"/>
-      <index name="I_VIRSCHM_PROVISION" column="PROVISION_ID"/>
-    </table>
-  </schema>
+    <schema>
+        <table name="ADynGroupMembership">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="fiql" type="varchar" size="255"/>
+            <column name="GROUP_ID" type="varchar" size="36"/>
+            <column name="ANYTYPE_ID" type="varchar" size="255"/>
+            <fk to-table="SyncopeGroup" column="GROUP_ID"/>
+            <fk to-table="AnyType" column="ANYTYPE_ID"/>
+            <index name="I_DYNGSHP_ANYTYPE" column="ANYTYPE_ID"/>
+            <index name="I_DYNGSHP_GROUP" column="GROUP_ID"/>
+        </table>
+        <table name="AMembership">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="anyObject_id" type="varchar" size="36"/>
+            <column name="group_id" type="varchar" size="36"/>
+            <fk to-table="AnyObject" column="anyObject_id"/>
+            <fk to-table="SyncopeGroup" column="group_id"/>
+            <index name="I_MMBRSHP_LEFTEND1" column="anyObject_id"/>
+            <index name="I_MMBRSHP_RIGHTEND1" column="group_id"/>
+        </table>
+        <table name="APlainAttr">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="OWNER_ID" type="varchar" size="36"/>
+            <column name="schema_id" type="varchar" size="255"/>
+            <column name="MEMBERSHIP_ID" type="varchar" size="36"/>
+            <fk to-table="AnyObject" column="OWNER_ID"/>
+            <fk to-table="PlainSchema" column="schema_id"/>
+            <fk to-table="AMembership" column="MEMBERSHIP_ID"/>
+            <index name="I_PLINTTR_MEMBERSHIP" column="MEMBERSHIP_ID"/>
+            <index name="I_PLINTTR_OWNER" column="OWNER_ID"/>
+            <index name="I_PLINTTR_SCHEMA" column="schema_id"/>
+        </table>
+        <table name="APlainAttrUniqueValue">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="binaryValue" type="blob" size="-1"/>
+            <column name="booleanValue" type="integer"/>
+            <column name="dateValue" type="timestamp"/>
+            <column name="doubleValue" type="double"/>
+            <column name="longValue" type="bigint"/>
+            <column name="stringValue" type="varchar" size="255"/>
+            <column name="ATTRIBUTE_ID" type="varchar" size="36"/>
+            <column name="schema_id" type="varchar" size="255"/>
+            <fk to-table="APlainAttr" column="ATTRIBUTE_ID"/>
+            <fk to-table="PlainSchema" column="schema_id"/>
+            <index name="I_PLNTQVL_ATTRIBUTE1" column="ATTRIBUTE_ID"/>
+            <index name="I_PLNTQVL_SCHEMA1" column="schema_id"/>
+            <unique name="U_PLNTQVL_BOOLEANVALUE1">
+                <on column="booleanValue"/>
+                <on column="schema_id"/>
+            </unique>
+            <unique name="U_PLNTQVL_DATEVALUE1">
+                <on column="dateValue"/>
+                <on column="schema_id"/>
+            </unique>
+            <unique name="U_PLNTQVL_STRINGVALUE1">
+                <on column="stringValue"/>
+                <on column="schema_id"/>
+            </unique>
+            <unique name="U_PLNTQVL_DOUBLEVALUE1">
+                <on column="doubleValue"/>
+                <on column="schema_id"/>
+            </unique>
+            <unique name="U_PLNTQVL_LONGVALUE1">
+                <on column="longValue"/>
+                <on column="schema_id"/>
+            </unique>
+        </table>
+        <table name="APlainAttrValue">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="binaryValue" type="blob" size="-1"/>
+            <column name="booleanValue" type="integer"/>
+            <column name="dateValue" type="timestamp"/>
+            <column name="doubleValue" type="double"/>
+            <column name="longValue" type="bigint"/>
+            <column name="stringValue" type="varchar" size="255"/>
+            <column name="ATTRIBUTE_ID" type="varchar" size="36"/>
+            <fk to-table="APlainAttr" column="ATTRIBUTE_ID"/>
+            <index name="I_PLNTRVL_ATTRIBUTE1" column="ATTRIBUTE_ID"/>
+        </table>
+        <table name="ARelationship">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="left_anyObject_id" type="varchar" size="36"/>
+            <column name="right_anyObject_id" type="varchar" size="36"/>
+            <column name="TYPE_ID" type="varchar" size="255"/>
+            <fk to-table="AnyObject" column="left_anyObject_id"/>
+            <fk to-table="AnyObject" column="right_anyObject_id"/>
+            <fk to-table="RelationshipType" column="TYPE_ID"/>
+            <index name="I_RLTNSHP_LEFTEND1" column="left_anyObject_id"/>
+            <index name="I_RLTNSHP_RIGHTEND1" column="right_anyObject_id"/>
+            <index name="I_RLTNSHP_TYPE1" column="TYPE_ID"/>
+            <unique name="U_RLTNSHP_TYPE_ID1">
+                <on column="TYPE_ID"/>
+                <on column="left_anyObject_id"/>
+                <on column="right_anyObject_id"/>
+            </unique>
+        </table>
+        <table name="AccessToken">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="255"/>
+            <column name="authorities" type="blob" size="-1"/>
+            <column name="body" type="clob" size="-1"/>
+            <column name="expiryTime" type="timestamp"/>
+            <column name="owner" type="varchar" size="255"/>
+            <unique name="U_CCSSTKN_OWNER" column="owner"/>
+        </table>
+        <table name="AccountPolicy">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="description" type="varchar" size="255"/>
+            <column name="maxAuthenticationAttempts" type="integer"/>
+            <column name="propagateSuspension" type="integer"/>
+        </table>
+        <table name="AccountPolicyRule">
+            <column name="policy_id" type="varchar" size="36"/>
+            <column name="implementation_id" type="varchar" size="255"/>
+            <fk to-table="AccountPolicy" column="policy_id"/>
+            <fk to-table="Implementation" column="implementation_id"/>
+            <index name="I_CCNTYRL_ELEMENT" column="implementation_id"/>
+            <index name="I_CCNTYRL_POLICY_ID" column="policy_id"/>
+            <unique name="U_CCNTYRL_POLICY_ID">
+                <on column="policy_id"/>
+                <on column="implementation_id"/>
+            </unique>
+        </table>
+        <table name="AccountPolicy_ExternalResource">
+            <column name="accountPolicy_id" type="varchar" size="36"/>
+            <column name="resource_id" type="varchar" size="255"/>
+            <fk to-table="AccountPolicy" column="accountPolicy_id"/>
+            <fk to-table="ExternalResource" column="resource_id"/>
+            <index name="I_CCNTSRC_ACCOUNTPOLICY_ID" column="accountPolicy_id"/>
+            <index name="I_CCNTSRC_ELEMENT" column="resource_id"/>
+            <unique name="U_CCNTSRC_ACCOUNTPOLICY_ID">
+                <on column="accountPolicy_id"/>
+                <on column="resource_id"/>
+            </unique>
+        </table>
+        <table name="AnyAbout">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="filter" type="clob" size="-1"/>
+            <column name="NOTIFICATION_ID" type="varchar" size="36"/>
+            <column name="ANYTYPE_ID" type="varchar" size="255"/>
+            <fk to-table="Notification" column="NOTIFICATION_ID"/>
+            <fk to-table="AnyType" column="ANYTYPE_ID"/>
+            <index name="I_NYABOUT_ANYTYPE" column="ANYTYPE_ID"/>
+            <index name="I_NYABOUT_NOTIFICATION" column="NOTIFICATION_ID"/>
+            <unique name="U_NYABOUT_NOTIFICATION_ID">
+                <on column="NOTIFICATION_ID"/>
+                <on column="ANYTYPE_ID"/>
+            </unique>
+        </table>
+        <table name="AnyObject">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="creationDate" type="timestamp"/>
+            <column name="creator" type="varchar" size="255"/>
+            <column name="lastChangeDate" type="timestamp"/>
+            <column name="lastModifier" type="varchar" size="255"/>
+            <column name="status" type="varchar" size="255"/>
+            <column name="name" type="varchar" size="255"/>
+            <column name="REALM_ID" type="varchar" size="36"/>
+            <column name="TYPE_ID" type="varchar" size="255"/>
+            <fk to-table="Realm" column="REALM_ID"/>
+            <fk to-table="AnyType" column="TYPE_ID"/>
+            <index name="I_NYOBJCT_REALM" column="REALM_ID"/>
+            <index name="I_NYOBJCT_TYPE" column="TYPE_ID"/>
+            <unique name="U_NYOBJCT_NAME" column="name"/>
+        </table>
+        <table name="AnyObject_AnyTypeClass">
+            <column name="anyObject_id" type="varchar" size="36"/>
+            <column name="anyTypeClass_id" type="varchar" size="255"/>
+            <fk to-table="AnyObject" column="anyObject_id"/>
+            <fk to-table="AnyTypeClass" column="anyTypeClass_id"/>
+            <index name="I_NYBJLSS_ANYOBJECT_ID" column="anyObject_id"/>
+            <index name="I_NYBJLSS_ELEMENT" column="anyTypeClass_id"/>
+            <unique name="U_NYBJLSS_ANYOBJECT_ID">
+                <on column="anyObject_id"/>
+                <on column="anyTypeClass_id"/>
+            </unique>
+        </table>
+        <table name="AnyObject_ExternalResource">
+            <column name="anyObject_id" type="varchar" size="36"/>
+            <column name="resource_id" type="varchar" size="255"/>
+            <fk to-table="AnyObject" column="anyObject_id"/>
+            <fk to-table="ExternalResource" column="resource_id"/>
+            <index name="I_NYBJSRC_ANYOBJECT_ID" column="anyObject_id"/>
+            <index name="I_NYBJSRC_ELEMENT" column="resource_id"/>
+            <unique name="U_NYBJSRC_ANYOBJECT_ID">
+                <on column="anyObject_id"/>
+                <on column="resource_id"/>
+            </unique>
+        </table>
+        <table name="AnyTemplatePullTask">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="template" type="clob" size="-1"/>
+            <column name="PULLTASK_ID" type="varchar" size="36"/>
+            <column name="ANYTYPE_ID" type="varchar" size="255"/>
+            <fk to-table="Task" column="PULLTASK_ID"/>
+            <fk to-table="AnyType" column="ANYTYPE_ID"/>
+            <index name="I_NYTMTSK_ANYTYPE" column="ANYTYPE_ID"/>
+            <index name="I_NYTMTSK_PULLTASK" column="PULLTASK_ID"/>
+            <unique name="U_NYTMTSK_PULLTASK_ID">
+                <on column="PULLTASK_ID"/>
+                <on column="ANYTYPE_ID"/>
+            </unique>
+        </table>
+        <table name="AnyTemplateRealm">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="template" type="clob" size="-1"/>
+            <column name="REALM_ID" type="varchar" size="36"/>
+            <column name="ANYTYPE_ID" type="varchar" size="255"/>
+            <fk to-table="Realm" column="REALM_ID"/>
+            <fk to-table="AnyType" column="ANYTYPE_ID"/>
+            <index name="I_NYTMRLM_ANYTYPE" column="ANYTYPE_ID"/>
+            <index name="I_NYTMRLM_REALM" column="REALM_ID"/>
+            <unique name="U_NYTMRLM_REALM_ID">
+                <on column="REALM_ID"/>
+                <on column="ANYTYPE_ID"/>
+            </unique>
+        </table>
+        <table name="AnyType">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="255"/>
+            <column name="kind" type="varchar" size="20"/>
+        </table>
+        <table name="AnyTypeClass">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="255"/>
+        </table>
+        <table name="AnyType_AnyTypeClass">
+            <column name="anyType_id" type="varchar" size="255"/>
+            <column name="anyTypeClass_id" type="varchar" size="255"/>
+            <fk to-table="AnyType" column="anyType_id"/>
+            <fk to-table="AnyTypeClass" column="anyTypeClass_id"/>
+            <index name="I_NYTYLSS_ANYTYPE_ID" column="anyType_id"/>
+            <index name="I_NYTYLSS_ELEMENT" column="anyTypeClass_id"/>
+            <unique name="U_NYTYLSS_ANYTYPE_ID">
+                <on column="anyType_id"/>
+                <on column="anyTypeClass_id"/>
+            </unique>
+        </table>
+        <table name="Application">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="255"/>
+            <column name="description" type="varchar" size="255"/>
+        </table>
+        <table name="CPlainAttr">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="schema_id" type="varchar" size="255"/>
+            <column name="OWNER_ID" type="varchar" size="255"/>
+            <fk to-table="PlainSchema" column="schema_id"/>
+            <fk to-table="SyncopeConf" column="OWNER_ID"/>
+            <index name="I_CPLNTTR_OWNER" column="OWNER_ID"/>
+            <index name="I_CPLNTTR_SCHEMA" column="schema_id"/>
+        </table>
+        <table name="CPlainAttrUniqueValue">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="binaryValue" type="blob" size="-1"/>
+            <column name="booleanValue" type="integer"/>
+            <column name="dateValue" type="timestamp"/>
+            <column name="doubleValue" type="double"/>
+            <column name="longValue" type="bigint"/>
+            <column name="stringValue" type="varchar" size="255"/>
+            <column name="ATTRIBUTE_ID" type="varchar" size="36"/>
+            <column name="schema_id" type="varchar" size="255"/>
+            <fk to-table="CPlainAttr" column="ATTRIBUTE_ID"/>
+            <fk to-table="PlainSchema" column="schema_id"/>
+            <index name="I_CPLNQVL_ATTRIBUTE" column="ATTRIBUTE_ID"/>
+            <index name="I_CPLNQVL_SCHEMA" column="schema_id"/>
+            <unique name="U_CPLNQVL_BOOLEANVALUE">
+                <on column="booleanValue"/>
+                <on column="schema_id"/>
+            </unique>
+            <unique name="U_CPLNQVL_DATEVALUE">
+                <on column="dateValue"/>
+                <on column="schema_id"/>
+            </unique>
+            <unique name="U_CPLNQVL_STRINGVALUE">
+                <on column="stringValue"/>
+                <on column="schema_id"/>
+            </unique>
+            <unique name="U_CPLNQVL_DOUBLEVALUE">
+                <on column="doubleValue"/>
+                <on column="schema_id"/>
+            </unique>
+            <unique name="U_CPLNQVL_LONGVALUE">
+                <on column="longValue"/>
+                <on column="schema_id"/>
+            </unique>
+        </table>
+        <table name="CPlainAttrValue">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="binaryValue" type="blob" size="-1"/>
+            <column name="booleanValue" type="integer"/>
+            <column name="dateValue" type="timestamp"/>
+            <column name="doubleValue" type="double"/>
+            <column name="longValue" type="bigint"/>
+            <column name="stringValue" type="varchar" size="255"/>
+            <column name="ATTRIBUTE_ID" type="varchar" size="36"/>
+            <fk to-table="CPlainAttr" column="ATTRIBUTE_ID"/>
+            <index name="I_CPLNRVL_ATTRIBUTE" column="ATTRIBUTE_ID"/>
+        </table>
+        <table name="ConnInstance">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="bundleName" type="varchar" size="255"/>
+            <column name="connRequestTimeout" type="integer"/>
+            <column name="connectorName" type="varchar" size="255"/>
+            <column name="displayName" type="varchar" size="255"/>
+            <column name="jsonConf" type="clob" size="-1"/>
+            <column name="location" type="varchar" size="255"/>
+            <column name="version" type="varchar" size="255"/>
+            <column name="ADMINREALM_ID" type="varchar" size="36"/>
+            <column name="maxIdle" type="integer"/>
+            <column name="maxObjects" type="integer"/>
+            <column name="maxWait" type="bigint"/>
+            <column name="minEvictableIdleTimeMillis" type="bigint"/>
+            <column name="minIdle" type="integer"/>
+            <fk to-table="Realm" column="ADMINREALM_ID"/>
+            <index name="I_CNNNTNC_ADMINREALM" column="ADMINREALM_ID"/>
+            <unique name="U_CNNNTNC_DISPLAYNAME" column="displayName"/>
+        </table>
+        <table name="ConnInstance_capabilities">
+            <column name="connInstance_id" type="varchar" size="36"/>
+            <column name="capability" type="varchar" size="20"/>
+            <fk to-table="ConnInstance" column="connInstance_id"/>
+            <index name="I_CNNNLTS_CONNINSTANCE_ID" column="connInstance_id"/>
+        </table>
+        <table name="DerSchema">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="255"/>
+            <column name="expression" type="varchar" size="255"/>
+            <column name="ANYTYPECLASS_ID" type="varchar" size="255"/>
+            <fk to-table="SyncopeSchema" column="id"/>
+            <fk to-table="AnyTypeClass" column="ANYTYPECLASS_ID"/>
+            <index name="I_DRSCHEM_ANYTYPECLASS" column="ANYTYPECLASS_ID"/>
+        </table>
+        <table name="DynRealm">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="255"/>
+        </table>
+        <table name="DynRealmMembership">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="fiql" type="varchar" size="255"/>
+            <column name="DYNREALM_ID" type="varchar" size="255"/>
+            <column name="ANYTYPE_ID" type="varchar" size="255"/>
+            <fk to-table="DynRealm" column="DYNREALM_ID"/>
+            <fk to-table="AnyType" column="ANYTYPE_ID"/>
+            <index name="I_DYNRSHP_ANYTYPE" column="ANYTYPE_ID"/>
+            <index name="I_DYNRSHP_DYNREALM" column="DYNREALM_ID"/>
+        </table>
+        <table name="DynRoleMembership">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="fiql" type="varchar" size="255"/>
+            <column name="ROLE_ID" type="varchar" size="255"/>
+            <fk to-table="SyncopeRole" column="ROLE_ID"/>
+            <index name="I_DYNRSHP_ROLE" column="ROLE_ID"/>
+        </table>
+        <table name="ExternalResource">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="255"/>
+            <column name="createTraceLevel" type="varchar" size="20"/>
+            <column name="deleteTraceLevel" type="varchar" size="20"/>
+            <column name="enforceMandatoryCondition" type="integer"/>
+            <column name="jsonConf" type="clob" size="-1"/>
+            <column name="overrideCapabilities" type="integer"/>
+            <column name="propagationPriority" type="integer"/>
+            <column name="provisioningTraceLevel" type="varchar" size="20"/>
+            <column name="randomPwdIfNotProvided" type="integer"/>
+            <column name="updateTraceLevel" type="varchar" size="20"/>
+            <column name="ACCOUNTPOLICY_ID" type="varchar" size="36"/>
+            <column name="CONNECTOR_ID" type="varchar" size="36"/>
+            <column name="PASSWORDPOLICY_ID" type="varchar" size="36"/>
+            <column name="PULLPOLICY_ID" type="varchar" size="36"/>
+            <column name="PUSHPOLICY_ID" type="varchar" size="36"/>
+            <fk to-table="AccountPolicy" column="ACCOUNTPOLICY_ID"/>
+            <fk to-table="ConnInstance" column="CONNECTOR_ID"/>
+            <fk to-table="PasswordPolicy" column="PASSWORDPOLICY_ID"/>
+            <fk to-table="PullPolicy" column="PULLPOLICY_ID"/>
+            <fk to-table="PushPolicy" column="PUSHPOLICY_ID"/>
+            <index name="I_XTRNSRC_ACCOUNTPOLICY" column="ACCOUNTPOLICY_ID"/>
+            <index name="I_XTRNSRC_CONNECTOR" column="CONNECTOR_ID"/>
+            <index name="I_XTRNSRC_PASSWORDPOLICY" column="PASSWORDPOLICY_ID"/>
+            <index name="I_XTRNSRC_PULLPOLICY" column="PULLPOLICY_ID"/>
+            <index name="I_XTRNSRC_PUSHPOLICY" column="PUSHPOLICY_ID"/>
+        </table>
+        <table name="ExternalResourcePropAction">
+            <column name="resource_id" type="varchar" size="255"/>
+            <column name="implementation_id" type="varchar" size="255"/>
+            <fk to-table="ExternalResource" column="resource_id"/>
+            <fk to-table="Implementation" column="implementation_id"/>
+            <index name="I_XTRNCTN_ELEMENT" column="implementation_id"/>
+            <index name="I_XTRNCTN_RESOURCE_ID" column="resource_id"/>
+            <unique name="U_XTRNCTN_RESOURCE_ID">
+                <on column="resource_id"/>
+                <on column="implementation_id"/>
+            </unique>
+        </table>
+        <table name="ExternalResource_capOverride">
+            <column name="resource_id" type="varchar" size="255"/>
+            <column name="capabilityOverride" type="varchar" size="20"/>
+            <fk to-table="ExternalResource" column="resource_id"/>
+            <index name="I_XTRNRRD_RESOURCE_ID" column="resource_id"/>
+        </table>
+        <table name="GPlainAttr">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="OWNER_ID" type="varchar" size="36"/>
+            <column name="schema_id" type="varchar" size="255"/>
+            <fk to-table="SyncopeGroup" column="OWNER_ID"/>
+            <fk to-table="PlainSchema" column="schema_id"/>
+            <index name="I_GPLNTTR_OWNER" column="OWNER_ID"/>
+            <index name="I_GPLNTTR_SCHEMA" column="schema_id"/>
+        </table>
+        <table name="GPlainAttrUniqueValue">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="binaryValue" type="blob" size="-1"/>
+            <column name="booleanValue" type="integer"/>
+            <column name="dateValue" type="timestamp"/>
+            <column name="doubleValue" type="double"/>
+            <column name="longValue" type="bigint"/>
+            <column name="stringValue" type="varchar" size="255"/>
+            <column name="ATTRIBUTE_ID" type="varchar" size="36"/>
+            <column name="schema_id" type="varchar" size="255"/>
+            <fk to-table="GPlainAttr" column="ATTRIBUTE_ID"/>
+            <fk to-table="PlainSchema" column="schema_id"/>
+            <index name="I_GPLNQVL_ATTRIBUTE" column="ATTRIBUTE_ID"/>
+            <index name="I_GPLNQVL_SCHEMA" column="schema_id"/>
+            <unique name="U_GPLNQVL_BOOLEANVALUE">
+                <on column="booleanValue"/>
+                <on column="schema_id"/>
+            </unique>
+            <unique name="U_GPLNQVL_DATEVALUE">
+                <on column="dateValue"/>
+                <on column="schema_id"/>
+            </unique>
+            <unique name="U_GPLNQVL_STRINGVALUE">
+                <on column="stringValue"/>
+                <on column="schema_id"/>
+            </unique>
+            <unique name="U_GPLNQVL_DOUBLEVALUE">
+                <on column="doubleValue"/>
+                <on column="schema_id"/>
+            </unique>
+            <unique name="U_GPLNQVL_LONGVALUE">
+                <on column="longValue"/>
+                <on column="schema_id"/>
+            </unique>
+        </table>
+        <table name="GPlainAttrValue">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="binaryValue" type="blob" size="-1"/>
+            <column name="booleanValue" type="integer"/>
+            <column name="dateValue" type="timestamp"/>
+            <column name="doubleValue" type="double"/>
+            <column name="longValue" type="bigint"/>
+            <column name="stringValue" type="varchar" size="255"/>
+            <column name="ATTRIBUTE_ID" type="varchar" size="36"/>
+            <fk to-table="GPlainAttr" column="ATTRIBUTE_ID"/>
+            <index name="I_GPLNRVL_ATTRIBUTE" column="ATTRIBUTE_ID"/>
+        </table>
+        <table name="Implementation">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="255"/>
+            <column name="body" type="clob" size="-1"/>
+            <column name="engine" type="varchar" not-null="true" size="20"/>
+            <column name="type" type="varchar" not-null="true" size="21"/>
+        </table>
+        <table name="LAPlainAttr">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="ACCOUNT_ID" type="varchar" size="36"/>
+            <column name="schema_id" type="varchar" size="255"/>
+            <column name="OWNER_ID" type="varchar" size="36"/>
+            <fk to-table="LinkedAccount" column="ACCOUNT_ID"/>
+            <fk to-table="PlainSchema" column="schema_id"/>
+            <fk to-table="SyncopeUser" column="OWNER_ID"/>
+            <index name="I_LPLNTTR_ACCOUNT" column="ACCOUNT_ID"/>
+            <index name="I_LPLNTTR_OWNER" column="OWNER_ID"/>
+            <index name="I_LPLNTTR_SCHEMA" column="schema_id"/>
+        </table>
+        <table name="LAPlainAttrUniqueValue">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="binaryValue" type="blob" size="-1"/>
+            <column name="booleanValue" type="integer"/>
+            <column name="dateValue" type="timestamp"/>
+            <column name="doubleValue" type="double"/>
+            <column name="longValue" type="bigint"/>
+            <column name="stringValue" type="varchar" size="255"/>
+            <column name="ATTRIBUTE_ID" type="varchar" size="36"/>
+            <column name="schema_id" type="varchar" size="255"/>
+            <fk to-table="LAPlainAttr" column="ATTRIBUTE_ID"/>
+            <fk to-table="PlainSchema" column="schema_id"/>
+            <index name="I_LPLNQVL_ATTRIBUTE" column="ATTRIBUTE_ID"/>
+            <index name="I_LPLNQVL_SCHEMA" column="schema_id"/>
+        </table>
+        <table name="LAPlainAttrValue">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="binaryValue" type="blob" size="-1"/>
+            <column name="booleanValue" type="integer"/>
+            <column name="dateValue" type="timestamp"/>
+            <column name="doubleValue" type="double"/>
+            <column name="longValue" type="bigint"/>
+            <column name="stringValue" type="varchar" size="255"/>
+            <column name="ATTRIBUTE_ID" type="varchar" size="36"/>
+            <fk to-table="LAPlainAttr" column="ATTRIBUTE_ID"/>
+            <index name="I_LPLNRVL_ATTRIBUTE" column="ATTRIBUTE_ID"/>
+        </table>
+        <table name="LinkedAccount">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="cipherAlgorithm" type="varchar" size="20"/>
+            <column name="connObjectKeyValue" type="varchar" size="255"/>
+            <column name="password" type="varchar" size="255"/>
+            <column name="suspended" type="integer"/>
+            <column name="username" type="varchar" size="255"/>
+            <column name="OWNER_ID" type="varchar" size="36"/>
+            <column name="RESOURCE_ID" type="varchar" size="255"/>
+            <fk to-table="SyncopeUser" column="OWNER_ID"/>
+            <fk to-table="ExternalResource" column="RESOURCE_ID"/>
+            <index name="I_LNKDCNT_OWNER" column="OWNER_ID"/>
+            <index name="I_LNKDCNT_RESOURCE" column="RESOURCE_ID"/>
+            <unique name="U_LNKDCNT_CONNOBJECTKEYVALUE">
+                <on column="connObjectKeyValue"/>
+                <on column="RESOURCE_ID"/>
+            </unique>
+        </table>
+        <table name="LinkedAccount_Privilege">
+            <column name="linked_account_id" type="varchar" size="36"/>
+            <column name="privilege_id" type="varchar" size="255"/>
+            <fk to-table="LinkedAccount" column="linked_account_id"/>
+            <fk to-table="Privilege" column="privilege_id"/>
+            <index name="I_LNKDVLG_ELEMENT" column="privilege_id"/>
+            <index name="I_LNKDVLG_LINKED_ACCOUNT_ID" column="linked_account_id"/>
+            <unique name="U_LNKDVLG_LINKED_ACCOUNT_ID">
+                <on column="linked_account_id"/>
+                <on column="privilege_id"/>
+            </unique>
+        </table>
+        <table name="MailTemplate">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="255"/>
+            <column name="htmlTemplate" type="clob" size="-1"/>
+            <column name="textTemplate" type="clob" size="-1"/>
+        </table>
+        <table name="Mapping">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="connObjectLink" type="varchar" size="255"/>
+            <column name="PROVISION_ID" type="varchar" size="36"/>
+            <fk to-table="Provision" column="PROVISION_ID"/>
+            <index name="I_MAPPING_PROVISION" column="PROVISION_ID"/>
+        </table>
+        <table name="MappingItem">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="connObjectKey" type="integer"/>
+            <column name="extAttrName" type="varchar" size="255"/>
+            <column name="intAttrName" type="varchar" size="255"/>
+            <column name="mandatoryCondition" type="varchar" size="255"/>
+            <column name="password" type="integer"/>
+            <column name="propJEXL" type="varchar" size="255"/>
+            <column name="pullJEXL" type="varchar" size="255"/>
+            <column name="purpose" type="varchar" size="20"/>
+            <column name="MAPPING_ID" type="varchar" size="36"/>
+            <fk to-table="Mapping" column="MAPPING_ID"/>
+            <index name="I_MPPNGTM_MAPPING" column="MAPPING_ID"/>
+        </table>
+        <table name="MappingItemTransformer">
+            <column name="item_id" type="varchar" size="36"/>
+            <column name="implementation_id" type="varchar" size="255"/>
+            <fk to-table="MappingItem" column="item_id"/>
+            <fk to-table="Implementation" column="implementation_id"/>
+            <index name="I_MPPNRMR_ELEMENT" column="implementation_id"/>
+            <index name="I_MPPNRMR_ITEM_ID" column="item_id"/>
+            <unique name="U_MPPNRMR_ITEM_ID">
+                <on column="item_id"/>
+                <on column="implementation_id"/>
+            </unique>
+        </table>
+        <table name="Notification">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="active" type="integer"/>
+            <column name="recipientAttrName" type="varchar" size="255"/>
+            <column name="recipientsFIQL" type="varchar" size="255"/>
+            <column name="selfAsRecipient" type="integer"/>
+            <column name="sender" type="varchar" size="255"/>
+            <column name="subject" type="varchar" size="255"/>
+            <column name="traceLevel" type="varchar" size="20"/>
+            <column name="RECIPIENTSPROVIDER_ID" type="varchar" size="255"/>
+            <column name="template_id" type="varchar" size="255"/>
+            <fk to-table="Implementation" column="RECIPIENTSPROVIDER_ID"/>
+            <fk to-table="MailTemplate" column="template_id"/>
+            <index name="I_NTFCTON_RECIPIENTSPROVIDER" column="RECIPIENTSPROVIDER_ID"/>
+            <index name="I_NTFCTON_TEMPLATE" column="template_id"/>
+        </table>
+        <table name="NotificationTask_recipients">
+            <column name="notificationTask_id" type="varchar" size="36"/>
+            <column name="address" type="varchar" size="255"/>
+            <fk to-table="Task" column="notificationTask_id"/>
+            <index name="I_NTFCNTS_NOTIFICATIONTASK_ID" column="notificationTask_id"/>
+        </table>
+        <table name="Notification_events">
+            <column name="notification_id" type="varchar" size="36"/>
+            <column name="event" type="varchar" size="255"/>
+            <fk to-table="Notification" column="notification_id"/>
+            <index name="I_NTFCNTS_NOTIFICATION_ID" column="notification_id"/>
+        </table>
+        <table name="Notification_staticRecipients">
+            <column name="notification_id" type="varchar" size="36"/>
+            <column name="staticRecipients" type="varchar" size="255"/>
+            <fk to-table="Notification" column="notification_id"/>
+            <index name="I_NTFCNTS_NOTIFICATION_ID1" column="notification_id"/>
+        </table>
+        <table name="OrgUnit">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="connObjectLink" type="varchar" size="255"/>
+            <column name="ignoreCaseMatch" type="integer"/>
+            <column name="objectClass" type="varchar" size="255"/>
+            <column name="serializedSyncToken" type="clob" size="-1"/>
+            <column name="RESOURCE_ID" type="varchar" size="255"/>
+            <fk to-table="ExternalResource" column="RESOURCE_ID"/>
+            <index name="I_ORGUNIT_RESOURCE" column="RESOURCE_ID"/>
+        </table>
+        <table name="OrgUnitItem">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="connObjectKey" type="integer"/>
+            <column name="extAttrName" type="varchar" size="255"/>
+            <column name="intAttrName" type="varchar" size="255"/>
+            <column name="mandatoryCondition" type="varchar" size="255"/>
+            <column name="password" type="integer"/>
+            <column name="propJEXL" type="varchar" size="255"/>
+            <column name="pullJEXL" type="varchar" size="255"/>
+            <column name="purpose" type="varchar" size="20"/>
+            <column name="ORGUNIT_ID" type="varchar" size="36"/>
+            <fk to-table="OrgUnit" column="ORGUNIT_ID"/>
+            <index name="I_RGUNTTM_ORGUNIT" column="ORGUNIT_ID"/>
+        </table>
+        <table name="OrgUnitItemTransformer">
+            <column name="item_id" type="varchar" size="36"/>
+            <column name="implementation_id" type="varchar" size="255"/>
+            <fk to-table="OrgUnitItem" column="item_id"/>
+            <fk to-table="Implementation" column="implementation_id"/>
+            <index name="I_RGNTRMR_ELEMENT" column="implementation_id"/>
+            <index name="I_RGNTRMR_ITEM_ID" column="item_id"/>
+            <unique name="U_RGNTRMR_ITEM_ID">
+                <on column="item_id"/>
+                <on column="implementation_id"/>
+            </unique>
+        </table>
+        <table name="PasswordPolicy">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="description" type="varchar" size="255"/>
+            <column name="allowNullPassword" type="integer"/>
+            <column name="historyLength" type="integer"/>
+        </table>
+        <table name="PasswordPolicyRule">
+            <column name="policy_id" type="varchar" size="36"/>
+            <column name="implementation_id" type="varchar" size="255"/>
+            <fk to-table="PasswordPolicy" column="policy_id"/>
+            <fk to-table="Implementation" column="implementation_id"/>
+            <index name="I_PSSWYRL_ELEMENT" column="implementation_id"/>
+            <index name="I_PSSWYRL_POLICY_ID" column="policy_id"/>
+            <unique name="U_PSSWYRL_POLICY_ID">
+                <on column="policy_id"/>
+                <on column="implementation_id"/>
+            </unique>
+        </table>
+        <table name="PlainSchema">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="255"/>
+            <column name="cipherAlgorithm" type="varchar" size="20"/>
+            <column name="conversionPattern" type="varchar" size="255"/>
+            <column name="enumerationKeys" type="clob" size="-1"/>
+            <column name="enumerationValues" type="clob" size="-1"/>
+            <column name="mandatoryCondition" type="varchar" size="255"/>
+            <column name="mimeType" type="varchar" size="255"/>
+            <column name="multivalue" type="integer"/>
+            <column name="readonly" type="integer"/>
+            <column name="secretKey" type="varchar" size="255"/>
+            <column name="type" type="varchar" size="20"/>
+            <column name="uniqueConstraint" type="integer"/>
+            <column name="ANYTYPECLASS_ID" type="varchar" size="255"/>
+            <column name="VALIDATOR_ID" type="varchar" size="255"/>
+            <fk to-table="SyncopeSchema" column="id"/>
+            <fk to-table="AnyTypeClass" column="ANYTYPECLASS_ID"/>
+            <fk to-table="Implementation" column="VALIDATOR_ID"/>
+            <index name="I_PLNSCHM_ANYTYPECLASS" column="ANYTYPECLASS_ID"/>
+            <index name="I_PLNSCHM_VALIDATOR" column="VALIDATOR_ID"/>
+        </table>
+        <table name="Privilege">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="255"/>
+            <column name="description" type="varchar" size="255"/>
+            <column name="spec" type="clob" size="-1"/>
+            <column name="APPLICATION_ID" type="varchar" size="255"/>
+            <fk to-table="Application" column="APPLICATION_ID"/>
+            <index name="I_PRIVILG_APPLICATION" column="APPLICATION_ID"/>
+        </table>
+        <table name="Provision">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="ignoreCaseMatch" type="integer"/>
+            <column name="objectClass" type="varchar" size="255"/>
+            <column name="serializedSyncToken" type="clob" size="-1"/>
+            <column name="RESOURCE_ID" type="varchar" size="255"/>
+            <column name="ANYTYPE_ID" type="varchar" size="255"/>
+            <column name="UIDONCREATE_ID" type="varchar" size="255"/>
+            <fk to-table="ExternalResource" column="RESOURCE_ID"/>
+            <fk to-table="AnyType" column="ANYTYPE_ID"/>
+            <fk to-table="PlainSchema" column="UIDONCREATE_ID"/>
+            <index name="I_PROVSON_ANYTYPE" column="ANYTYPE_ID"/>
+            <index name="I_PROVSON_RESOURCE" column="RESOURCE_ID"/>
+            <index name="I_PROVSON_UIDONCREATE" column="UIDONCREATE_ID"/>
+            <unique name="U_PROVSON_RESOURCE_ID">
+                <on column="RESOURCE_ID"/>
+                <on column="ANYTYPE_ID"/>
+            </unique>
+        </table>
+        <table name="Provision_AnyTypeClass">
+            <column name="provision_id" type="varchar" size="36"/>
+            <column name="anyTypeClass_id" type="varchar" size="255"/>
+            <fk to-table="Provision" column="provision_id"/>
+            <fk to-table="AnyTypeClass" column="anyTypeClass_id"/>
+            <index name="I_PRVSLSS_ELEMENT" column="anyTypeClass_id"/>
+            <index name="I_PRVSLSS_PROVISION_ID" column="provision_id"/>
+            <unique name="U_PRVSLSS_PROVISION_ID">
+                <on column="provision_id"/>
+                <on column="anyTypeClass_id"/>
+            </unique>
+        </table>
+        <table name="PullCorrelationRuleEntity">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="PULLPOLICY_ID" type="varchar" size="36"/>
+            <column name="ANYTYPE_ID" type="varchar" size="255"/>
+            <column name="IMPLEMENTATION_ID" type="varchar" size="255"/>
+            <fk to-table="PullPolicy" column="PULLPOLICY_ID"/>
+            <fk to-table="AnyType" column="ANYTYPE_ID"/>
+            <fk to-table="Implementation" column="IMPLEMENTATION_ID"/>
+            <index name="I_PLLCTTY_ANYTYPE" column="ANYTYPE_ID"/>
+            <index name="I_PLLCTTY_IMPLEMENTATION" column="IMPLEMENTATION_ID"/>
+            <index name="I_PLLCTTY_PULLPOLICY" column="PULLPOLICY_ID"/>
+            <unique name="U_PLLCTTY_PULLPOLICY_ID">
+                <on column="PULLPOLICY_ID"/>
+                <on column="ANYTYPE_ID"/>
+            </unique>
+        </table>
+        <table name="PullPolicy">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="description" type="varchar" size="255"/>
+            <column name="conflictResolutionAction" type="varchar" size="20"/>
+        </table>
+        <table name="PullTaskAction">
+            <column name="task_id" type="varchar" size="36"/>
+            <column name="implementation_id" type="varchar" size="255"/>
+            <fk to-table="Task" column="task_id"/>
+            <fk to-table="Implementation" column="implementation_id"/>
+            <index name="I_PLLTCTN_ELEMENT" column="implementation_id"/>
+            <index name="I_PLLTCTN_TASK_ID" column="task_id"/>
+            <unique name="U_PLLTCTN_TASK_ID">
+                <on column="task_id"/>
+                <on column="implementation_id"/>
+            </unique>
+        </table>
+        <table name="PushCorrelationRuleEntity">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="PUSHPOLICY_ID" type="varchar" size="36"/>
+            <column name="ANYTYPE_ID" type="varchar" size="255"/>
+            <column name="IMPLEMENTATION_ID" type="varchar" size="255"/>
+            <fk to-table="PushPolicy" column="PUSHPOLICY_ID"/>
+            <fk to-table="AnyType" column="ANYTYPE_ID"/>
+            <fk to-table="Implementation" column="IMPLEMENTATION_ID"/>
+            <index name="I_PSHCTTY_ANYTYPE" column="ANYTYPE_ID"/>
+            <index name="I_PSHCTTY_IMPLEMENTATION" column="IMPLEMENTATION_ID"/>
+            <index name="I_PSHCTTY_PUSHPOLICY" column="PUSHPOLICY_ID"/>
+            <unique name="U_PSHCTTY_PUSHPOLICY_ID">
+                <on column="PUSHPOLICY_ID"/>
+                <on column="ANYTYPE_ID"/>
+            </unique>
+        </table>
+        <table name="PushPolicy">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="description" type="varchar" size="255"/>
+            <column name="conflictResolutionAction" type="varchar" size="20"/>
+        </table>
+        <table name="PushTaskAction">
+            <column name="task_id" type="varchar" size="36"/>
+            <column name="implementation_id" type="varchar" size="255"/>
+            <fk to-table="Task" column="task_id"/>
+            <fk to-table="Implementation" column="implementation_id"/>
+            <index name="I_PSHTCTN_ELEMENT" column="implementation_id"/>
+            <index name="I_PSHTCTN_TASK_ID" column="task_id"/>
+            <unique name="U_PSHTCTN_TASK_ID">
+                <on column="task_id"/>
+                <on column="implementation_id"/>
+            </unique>
+        </table>
+        <table name="PushTaskAnyFilter">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="fiql" type="varchar" size="255"/>
+            <column name="ANYTYPE_ID" type="varchar" size="255"/>
+            <column name="PUSHTASK_ID" type="varchar" size="36"/>
+            <fk to-table="AnyType" column="ANYTYPE_ID"/>
+            <fk to-table="Task" column="PUSHTASK_ID"/>
+            <index name="I_PSHTLTR_ANYTYPE" column="ANYTYPE_ID"/>
+            <index name="I_PSHTLTR_PUSHTASK" column="PUSHTASK_ID"/>
+            <unique name="U_PSHTLTR_PUSHTASK_ID">
+                <on column="PUSHTASK_ID"/>
+                <on column="ANYTYPE_ID"/>
+            </unique>
+        </table>
+        <table name="Realm">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="name" type="varchar" size="255"/>
+            <column name="ACCOUNTPOLICY_ID" type="varchar" size="36"/>
+            <column name="PARENT_ID" type="varchar" size="36"/>
+            <column name="PASSWORDPOLICY_ID" type="varchar" size="36"/>
+            <fk to-table="AccountPolicy" column="ACCOUNTPOLICY_ID"/>
+            <fk to-table="Realm" column="PARENT_ID"/>
+            <fk to-table="PasswordPolicy" column="PASSWORDPOLICY_ID"/>
+            <index name="I_REALM_ACCOUNTPOLICY" column="ACCOUNTPOLICY_ID"/>
+            <index name="I_REALM_PARENT" column="PARENT_ID"/>
+            <index name="I_REALM_PASSWORDPOLICY" column="PASSWORDPOLICY_ID"/>
+            <unique name="U_REALM_NAME">
+                <on column="name"/>
+                <on column="PARENT_ID"/>
+            </unique>
+        </table>
+        <table name="RealmAction">
+            <column name="realm_id" type="varchar" size="36"/>
+            <column name="implementation_id" type="varchar" size="255"/>
+            <fk to-table="Realm" column="realm_id"/>
+            <fk to-table="Implementation" column="implementation_id"/>
+            <index name="I_RLMCTON_ELEMENT" column="implementation_id"/>
+            <index name="I_RLMCTON_REALM_ID" column="realm_id"/>
+            <unique name="U_RLMCTON_REALM_ID">
+                <on column="realm_id"/>
+                <on column="implementation_id"/>
+            </unique>
+        </table>
+        <table name="Realm_ExternalResource">
+            <column name="realm_id" type="varchar" size="36"/>
+            <column name="resource_id" type="varchar" size="255"/>
+            <fk to-table="Realm" column="realm_id"/>
+            <fk to-table="ExternalResource" column="resource_id"/>
+            <index name="I_RLM_SRC_ELEMENT" column="resource_id"/>
+            <index name="I_RLM_SRC_REALM_ID" column="realm_id"/>
+            <unique name="U_RLM_SRC_REALM_ID">
+                <on column="realm_id"/>
+                <on column="resource_id"/>
+            </unique>
+        </table>
+        <table name="RelationshipType">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="255"/>
+            <column name="description" type="varchar" size="255"/>
+        </table>
+        <table name="Remediation">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="error" type="clob" size="-1"/>
+            <column name="instant" type="timestamp"/>
+            <column name="operation" type="varchar" size="20"/>
+            <column name="payload" type="clob" size="-1"/>
+            <column name="remoteName" type="varchar" size="255"/>
+            <column name="ANYTYPE_ID" type="varchar" size="255"/>
+            <column name="PULLTASK_ID" type="varchar" size="36"/>
+            <fk to-table="AnyType" column="ANYTYPE_ID"/>
+            <fk to-table="Task" column="PULLTASK_ID"/>
+            <index name="I_RMDTION_ANYTYPE" column="ANYTYPE_ID"/>
+            <index name="I_RMDTION_PULLTASK" column="PULLTASK_ID"/>
+        </table>
+        <table name="Report">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="active" type="integer"/>
+            <column name="cronExpression" type="varchar" size="255"/>
+            <column name="name" type="varchar" not-null="true" size="255"/>
+            <column name="template_id" type="varchar" size="255"/>
+            <fk to-table="ReportTemplate" column="template_id"/>
+            <index name="I_REPORT_TEMPLATE" column="template_id"/>
+            <unique name="U_REPORT_NAME" column="name"/>
+        </table>
+        <table name="ReportExec">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="endDate" type="timestamp"/>
+            <column name="message" type="clob" size="-1"/>
+            <column name="startDate" type="timestamp"/>
+            <column name="status" type="varchar" size="255"/>
+            <column name="execResult" type="blob" size="-1"/>
+            <column name="REPORT_ID" type="varchar" size="36"/>
+            <fk to-table="Report" column="REPORT_ID"/>
+            <index name="I_RPORTXC_REPORT" column="REPORT_ID"/>
+        </table>
+        <table name="ReportReportlet">
+            <column name="report_id" type="varchar" size="36"/>
+            <column name="implementation_id" type="varchar" size="255"/>
+            <fk to-table="Report" column="report_id"/>
+            <fk to-table="Implementation" column="implementation_id"/>
+            <index name="I_RPRTTLT_ELEMENT" column="implementation_id"/>
+            <index name="I_RPRTTLT_REPORT_ID" column="report_id"/>
+            <unique name="U_RPRTTLT_REPORT_ID">
+                <on column="report_id"/>
+                <on column="implementation_id"/>
+            </unique>
+        </table>
+        <table name="ReportTemplate">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="255"/>
+            <column name="csvTemplate" type="clob" size="-1"/>
+            <column name="foTemplate" type="clob" size="-1"/>
+            <column name="htmlTemplate" type="clob" size="-1"/>
+        </table>
+        <table name="SchemaLabel">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="display" type="varchar" not-null="true" size="255"/>
+            <column name="locale" type="varchar" not-null="true" size="255"/>
+            <column name="SCHEMA_ID" type="varchar" size="255"/>
+            <fk to-table="SyncopeSchema" column="SCHEMA_ID"/>
+            <index name="I_SCHMLBL_SCHEMA" column="SCHEMA_ID"/>
+            <unique name="U_SCHMLBL_SCHEMA_ID">
+                <on column="SCHEMA_ID"/>
+                <on column="locale"/>
+            </unique>
+        </table>
+        <table name="SecurityQuestion">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="content" type="varchar" size="255"/>
+            <unique name="U_SCRTSTN_CONTENT" column="content"/>
+        </table>
+        <table name="SyncopeBatch">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="255"/>
+            <column name="expiryTime" type="timestamp"/>
+            <column name="results" type="clob" size="-1"/>
+        </table>
+        <table name="SyncopeConf">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="255"/>
+        </table>
+        <table name="SyncopeDomain">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="255"/>
+            <column name="adminCipherAlgorithm" type="varchar" size="20"/>
+            <column name="adminPwd" type="varchar" size="255"/>
+        </table>
+        <table name="SyncopeGroup">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="creationDate" type="timestamp"/>
+            <column name="creator" type="varchar" size="255"/>
+            <column name="lastChangeDate" type="timestamp"/>
+            <column name="lastModifier" type="varchar" size="255"/>
+            <column name="status" type="varchar" size="255"/>
+            <column name="name" type="varchar" size="255"/>
+            <column name="REALM_ID" type="varchar" size="36"/>
+            <column name="GROUPOWNER_ID" type="varchar" size="36"/>
+            <column name="USEROWNER_ID" type="varchar" size="36"/>
+            <fk to-table="Realm" column="REALM_ID"/>
+            <fk to-table="SyncopeGroup" column="GROUPOWNER_ID"/>
+            <fk to-table="SyncopeUser" column="USEROWNER_ID"/>
+            <index name="I_SYNCGRP_GROUPOWNER" column="GROUPOWNER_ID"/>
+            <index name="I_SYNCGRP_REALM" column="REALM_ID"/>
+            <index name="I_SYNCGRP_USEROWNER" column="USEROWNER_ID"/>
+            <unique name="U_SYNCGRP_NAME" column="name"/>
+        </table>
+        <table name="SyncopeGroup_AnyTypeClass">
+            <column name="group_id" type="varchar" size="36"/>
+            <column name="anyTypeClass_id" type="varchar" size="255"/>
+            <fk to-table="SyncopeGroup" column="group_id"/>
+            <fk to-table="AnyTypeClass" column="anyTypeClass_id"/>
+            <index name="I_SYNCLSS_ELEMENT1" column="anyTypeClass_id"/>
+            <index name="I_SYNCLSS_GROUP_ID" column="group_id"/>
+            <unique name="U_SYNCLSS_GROUP_ID">
+                <on column="group_id"/>
+                <on column="anyTypeClass_id"/>
+            </unique>
+        </table>
+        <table name="SyncopeGroup_ExternalResource">
+            <column name="group_id" type="varchar" size="36"/>
+            <column name="resource_id" type="varchar" size="255"/>
+            <fk to-table="SyncopeGroup" column="group_id"/>
+            <fk to-table="ExternalResource" column="resource_id"/>
+            <index name="I_SYNCSRC_ELEMENT1" column="resource_id"/>
+            <index name="I_SYNCSRC_GROUP_ID" column="group_id"/>
+            <unique name="U_SYNCSRC_GROUP_ID">
+                <on column="group_id"/>
+                <on column="resource_id"/>
+            </unique>
+        </table>
+        <table name="SyncopeLogger">
+            <pk column="logName"/>
+            <column name="logName" type="varchar" not-null="true" size="255"/>
+            <column name="logLevel" type="varchar" not-null="true" size="20"/>
+            <column name="logType" type="varchar" not-null="true" size="20"/>
+        </table>
+        <table name="SyncopeRole">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="255"/>
+            <column name="anyLayout" type="clob" size="-1"/>
+        </table>
+        <table name="SyncopeRole_DynRealm">
+            <column name="role_id" type="varchar" size="255"/>
+            <column name="dynamicRealm_id" type="varchar" size="255"/>
+            <fk to-table="SyncopeRole" column="role_id"/>
+            <fk to-table="DynRealm" column="dynamicRealm_id"/>
+            <index name="I_SYNCRLM_ELEMENT" column="dynamicRealm_id"/>
+            <index name="I_SYNCRLM_ROLE_ID" column="role_id"/>
+            <unique name="U_SYNCRLM_ROLE_ID">
+                <on column="role_id"/>
+                <on column="dynamicRealm_id"/>
+            </unique>
+        </table>
+        <table name="SyncopeRole_Privilege">
+            <column name="role_id" type="varchar" size="255"/>
+            <column name="privilege_id" type="varchar" size="255"/>
+            <fk to-table="SyncopeRole" column="role_id"/>
+            <fk to-table="Privilege" column="privilege_id"/>
+            <index name="I_SYNCVLG_ELEMENT" column="privilege_id"/>
+            <index name="I_SYNCVLG_ROLE_ID" column="role_id"/>
+            <unique name="U_SYNCVLG_ROLE_ID">
+                <on column="role_id"/>
+                <on column="privilege_id"/>
+            </unique>
+        </table>
+        <table name="SyncopeRole_Realm">
+            <column name="role_id" type="varchar" size="255"/>
+            <column name="realm_id" type="varchar" size="36"/>
+            <fk to-table="SyncopeRole" column="role_id"/>
+            <fk to-table="Realm" column="realm_id"/>
+            <index name="I_SYNCRLM_ELEMENT1" column="realm_id"/>
+            <index name="I_SYNCRLM_ROLE_ID1" column="role_id"/>
+            <unique name="U_SYNCRLM_ROLE_ID1">
+                <on column="role_id"/>
+                <on column="realm_id"/>
+            </unique>
+        </table>
+        <table name="SyncopeRole_entitlements">
+            <column name="role_id" type="varchar" size="255"/>
+            <column name="entitlement" type="varchar" size="255"/>
+            <fk to-table="SyncopeRole" column="role_id"/>
+            <index name="I_SYNCNTS_ROLE_ID" column="role_id"/>
+        </table>
+        <table name="SyncopeSchema">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="255"/>
+        </table>
+        <table name="SyncopeUser">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="creationDate" type="timestamp"/>
+            <column name="creator" type="varchar" size="255"/>
+            <column name="lastChangeDate" type="timestamp"/>
+            <column name="lastModifier" type="varchar" size="255"/>
+            <column name="status" type="varchar" size="255"/>
+            <column name="changePwdDate" type="timestamp"/>
+            <column name="cipherAlgorithm" type="varchar" size="20"/>
+            <column name="failedLogins" type="integer"/>
+            <column name="lastLoginDate" type="timestamp"/>
+            <column name="mustChangePassword" type="integer"/>
+            <column name="password" type="varchar" size="255"/>
+            <column name="securityAnswer" type="varchar" size="255"/>
+            <column name="suspended" type="integer"/>
+            <column name="token" type="clob" size="-1"/>
+            <column name="tokenExpireTime" type="timestamp"/>
+            <column name="username" type="varchar" size="255"/>
+            <column name="REALM_ID" type="varchar" size="36"/>
+            <column name="SECURITYQUESTION_ID" type="varchar" size="36"/>
+            <fk to-table="Realm" column="REALM_ID"/>
+            <fk to-table="SecurityQuestion" column="SECURITYQUESTION_ID"/>
+            <index name="I_SYNCPSR_REALM" column="REALM_ID"/>
+            <index name="I_SYNCPSR_SECURITYQUESTION" column="SECURITYQUESTION_ID"/>
+            <unique name="U_SYNCPSR_USERNAME" column="username"/>
+        </table>
+        <table name="SyncopeUser_AnyTypeClass">
+            <column name="user_id" type="varchar" size="36"/>
+            <column name="anyTypeClass_id" type="varchar" size="255"/>
+            <fk to-table="SyncopeUser" column="user_id"/>
+            <fk to-table="AnyTypeClass" column="anyTypeClass_id"/>
+            <index name="I_SYNCLSS_ELEMENT" column="anyTypeClass_id"/>
+            <index name="I_SYNCLSS_USER_ID" column="user_id"/>
+            <unique name="U_SYNCLSS_USER_ID">
+                <on column="user_id"/>
+                <on column="anyTypeClass_id"/>
+            </unique>
+        </table>
+        <table name="SyncopeUser_ExternalResource">
+            <column name="user_id" type="varchar" size="36"/>
+            <column name="resource_id" type="varchar" size="255"/>
+            <fk to-table="SyncopeUser" column="user_id"/>
+            <fk to-table="ExternalResource" column="resource_id"/>
+            <index name="I_SYNCSRC_ELEMENT" column="resource_id"/>
+            <index name="I_SYNCSRC_USER_ID" column="user_id"/>
+            <unique name="U_SYNCSRC_USER_ID">
+                <on column="user_id"/>
+                <on column="resource_id"/>
+            </unique>
+        </table>
+        <table name="SyncopeUser_SyncopeRole">
+            <column name="user_id" type="varchar" size="36"/>
+            <column name="role_id" type="varchar" size="255"/>
+            <fk to-table="SyncopeUser" column="user_id"/>
+            <fk to-table="SyncopeRole" column="role_id"/>
+            <index name="I_SYNCPRL_ELEMENT" column="role_id"/>
+            <index name="I_SYNCPRL_USER_ID" column="user_id"/>
+            <unique name="U_SYNCPRL_USER_ID">
+                <on column="user_id"/>
+                <on column="role_id"/>
+            </unique>
+        </table>
+        <table name="SyncopeUser_passwordHistory">
+            <column name="user_id" type="varchar" size="36"/>
+            <column name="passwordHistoryValue" type="varchar" size="255"/>
+            <fk to-table="SyncopeUser" column="user_id"/>
+            <index name="I_SYNCTRY_USER_ID" column="user_id"/>
+        </table>
+        <table name="Task">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="DTYPE" type="varchar" size="31"/>
+            <column name="active" type="integer"/>
+            <column name="cronExpression" type="varchar" size="255"/>
+            <column name="description" type="varchar" size="255"/>
+            <column name="name" type="varchar" size="255"/>
+            <column name="startAt" type="timestamp"/>
+            <column name="matchingRule" type="varchar" size="20"/>
+            <column name="performCreate" type="integer"/>
+            <column name="performDelete" type="integer"/>
+            <column name="performUpdate" type="integer"/>
+            <column name="syncStatus" type="integer"/>
+            <column name="unmatchingRule" type="varchar" size="20"/>
+            <column name="JOBDELEGATE_ID" type="varchar" size="255"/>
+            <column name="RESOURCE_ID" type="varchar" size="255"/>
+            <column name="SOURCEREALM_ID" type="varchar" size="36"/>
+            <column name="pullMode" type="varchar" size="23"/>
+            <column name="remediation" type="integer"/>
+            <column name="DESTINATIONREALM_ID" type="varchar" size="36"/>
+            <column name="RECONFILTERBUILDER_ID" type="varchar" size="255"/>
+            <column name="anyTypeKind" type="varchar" size="20"/>
+            <column name="entityKey" type="varchar" size="255"/>
+            <column name="executed" type="integer"/>
+            <column name="htmlBody" type="clob" size="-1"/>
+            <column name="sender" type="varchar" size="255"/>
+            <column name="subject" type="varchar" size="255"/>
+            <column name="textBody" type="clob" size="-1"/>
+            <column name="traceLevel" type="varchar" size="20"/>
+            <column name="NOTIFICATION_ID" type="varchar" size="36"/>
+            <column name="anyType" type="varchar" size="255"/>
+            <column name="attributes" type="clob" size="-1"/>
+            <column name="connObjectKey" type="varchar" size="255"/>
+            <column name="objectClassName" type="varchar" size="255"/>
+            <column name="oldConnObjectKey" type="varchar" size="255"/>
+            <column name="operation" type="varchar" size="20"/>
+            <fk to-table="Implementation" column="JOBDELEGATE_ID"/>
+            <fk to-table="ExternalResource" column="RESOURCE_ID"/>
+            <fk to-table="Realm" column="SOURCEREALM_ID"/>
+            <fk to-table="Realm" column="DESTINATIONREALM_ID"/>
+            <fk to-table="Implementation" column="RECONFILTERBUILDER_ID"/>
+            <fk to-table="Notification" column="NOTIFICATION_ID"/>
+            <index name="I_TASK_DESTINATIONREALM" column="DESTINATIONREALM_ID"/>
+            <index name="I_TASK_DTYPE" column="DTYPE"/>
+            <index name="I_TASK_JOBDELEGATE" column="JOBDELEGATE_ID"/>
+            <index name="I_TASK_NOTIFICATION" column="NOTIFICATION_ID"/>
+            <index name="I_TASK_RECONFILTERBUILDER" column="RECONFILTERBUILDER_ID"/>
+            <index name="I_TASK_RESOURCE" column="RESOURCE_ID"/>
+            <index name="I_TASK_SOURCEREALM" column="SOURCEREALM_ID"/>
+        </table>
+        <table name="TaskExec">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="endDate" type="timestamp"/>
+            <column name="message" type="clob" size="-1"/>
+            <column name="startDate" type="timestamp"/>
+            <column name="status" type="varchar" size="255"/>
+            <column name="TASK_ID" type="varchar" size="36"/>
+            <fk to-table="Task" column="TASK_ID"/>
+            <index name="I_TSKEXEC_TASK" column="TASK_ID"/>
+        </table>
+        <table name="TypeExtension">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="GROUP_ID" type="varchar" size="36"/>
+            <column name="ANYTYPE_ID" type="varchar" size="255"/>
+            <fk to-table="SyncopeGroup" column="GROUP_ID"/>
+            <fk to-table="AnyType" column="ANYTYPE_ID"/>
+            <index name="I_TYPXNSN_ANYTYPE" column="ANYTYPE_ID"/>
+            <index name="I_TYPXNSN_GROUP" column="GROUP_ID"/>
+            <unique name="U_TYPXNSN_GROUP_ID">
+                <on column="GROUP_ID"/>
+                <on column="ANYTYPE_ID"/>
+            </unique>
+        </table>
+        <table name="TypeExtension_AnyTypeClass">
+            <column name="typeExtension_id" type="varchar" size="36"/>
+            <column name="anyTypeClass_id" type="varchar" size="255"/>
+            <fk to-table="TypeExtension" column="typeExtension_id"/>
+            <fk to-table="AnyTypeClass" column="anyTypeClass_id"/>
+            <index name="I_TYPXLSS_ELEMENT" column="anyTypeClass_id"/>
+            <index name="I_TYPXLSS_TYPEEXTENSION_ID" column="typeExtension_id"/>
+            <unique name="U_TYPXLSS_TYPEEXTENSION_ID">
+                <on column="typeExtension_id"/>
+                <on column="anyTypeClass_id"/>
+            </unique>
+        </table>
+        <table name="UDynGroupMembership">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="fiql" type="varchar" size="255"/>
+            <column name="GROUP_ID" type="varchar" size="36"/>
+            <fk to-table="SyncopeGroup" column="GROUP_ID"/>
+            <index name="I_DYNGSHP_GROUP1" column="GROUP_ID"/>
+        </table>
+        <table name="UMembership">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="user_id" type="varchar" size="36"/>
+            <column name="group_id" type="varchar" size="36"/>
+            <fk to-table="SyncopeUser" column="user_id"/>
+            <fk to-table="SyncopeGroup" column="group_id"/>
+            <index name="I_MMBRSHP_LEFTEND" column="user_id"/>
+            <index name="I_MMBRSHP_RIGHTEND" column="group_id"/>
+        </table>
+        <table name="UPlainAttr">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="schema_id" type="varchar" size="255"/>
+            <column name="MEMBERSHIP_ID" type="varchar" size="36"/>
+            <column name="OWNER_ID" type="varchar" size="36"/>
+            <fk to-table="PlainSchema" column="schema_id"/>
+            <fk to-table="UMembership" column="MEMBERSHIP_ID"/>
+            <fk to-table="SyncopeUser" column="OWNER_ID"/>
+            <index name="I_UPLNTTR_MEMBERSHIP" column="MEMBERSHIP_ID"/>
+            <index name="I_UPLNTTR_OWNER" column="OWNER_ID"/>
+            <index name="I_UPLNTTR_SCHEMA" column="schema_id"/>
+        </table>
+        <table name="UPlainAttrUniqueValue">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="binaryValue" type="blob" size="-1"/>
+            <column name="booleanValue" type="integer"/>
+            <column name="dateValue" type="timestamp"/>
+            <column name="doubleValue" type="double"/>
+            <column name="longValue" type="bigint"/>
+            <column name="stringValue" type="varchar" size="255"/>
+            <column name="ATTRIBUTE_ID" type="varchar" size="36"/>
+            <column name="schema_id" type="varchar" size="255"/>
+            <fk to-table="UPlainAttr" column="ATTRIBUTE_ID"/>
+            <fk to-table="PlainSchema" column="schema_id"/>
+            <index name="I_PLNTQVL_ATTRIBUTE" column="ATTRIBUTE_ID"/>
+            <index name="I_PLNTQVL_SCHEMA" column="schema_id"/>
+            <unique name="U_PLNTQVL_BOOLEANVALUE">
+                <on column="booleanValue"/>
+                <on column="schema_id"/>
+            </unique>
+            <unique name="U_PLNTQVL_DATEVALUE">
+                <on column="dateValue"/>
+                <on column="schema_id"/>
+            </unique>
+            <unique name="U_PLNTQVL_STRINGVALUE">
+                <on column="stringValue"/>
+                <on column="schema_id"/>
+            </unique>
+            <unique name="U_PLNTQVL_DOUBLEVALUE">
+                <on column="doubleValue"/>
+                <on column="schema_id"/>
+            </unique>
+            <unique name="U_PLNTQVL_LONGVALUE">
+                <on column="longValue"/>
+                <on column="schema_id"/>
+            </unique>
+        </table>
+        <table name="UPlainAttrValue">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="binaryValue" type="blob" size="-1"/>
+            <column name="booleanValue" type="integer"/>
+            <column name="dateValue" type="timestamp"/>
+            <column name="doubleValue" type="double"/>
+            <column name="longValue" type="bigint"/>
+            <column name="stringValue" type="varchar" size="255"/>
+            <column name="ATTRIBUTE_ID" type="varchar" size="36"/>
+            <fk to-table="UPlainAttr" column="ATTRIBUTE_ID"/>
+            <index name="I_PLNTRVL_ATTRIBUTE" column="ATTRIBUTE_ID"/>
+        </table>
+        <table name="URelationship">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="36"/>
+            <column name="user_id" type="varchar" size="36"/>
+            <column name="anyObject_id" type="varchar" size="36"/>
+            <column name="TYPE_ID" type="varchar" size="255"/>
+            <fk to-table="SyncopeUser" column="user_id"/>
+            <fk to-table="AnyObject" column="anyObject_id"/>
+            <fk to-table="RelationshipType" column="TYPE_ID"/>
+            <index name="I_RLTNSHP_LEFTEND" column="user_id"/>
+            <index name="I_RLTNSHP_RIGHTEND" column="anyObject_id"/>
+            <index name="I_RLTNSHP_TYPE" column="TYPE_ID"/>
+            <unique name="U_RLTNSHP_TYPE_ID">
+                <on column="TYPE_ID"/>
+                <on column="user_id"/>
+                <on column="anyObject_id"/>
+            </unique>
+        </table>
+        <table name="VirSchema">
+            <pk column="id"/>
+            <column name="id" type="varchar" not-null="true" size="255"/>
+            <column name="extAttrName" type="varchar" size="255"/>
+            <column name="readonly" type="integer"/>
+            <column name="ANYTYPECLASS_ID" type="varchar" size="255"/>
+            <column name="PROVISION_ID" type="varchar" size="36"/>
+            <fk to-table="SyncopeSchema" column="id"/>
+            <fk to-table="AnyTypeClass" column="ANYTYPECLASS_ID"/>
+            <fk to-table="Provision" column="PROVISION_ID"/>
+            <index name="I_VIRSCHM_ANYTYPECLASS" column="ANYTYPECLASS_ID"/>
+            <index name="I_VIRSCHM_PROVISION" column="PROVISION_ID"/>
+        </table>
+    </schema>
 </schemas>
\ No newline at end of file
diff --git a/docker/core/src/main/resources/domains/MasterContent.xml.all b/docker/core/src/main/resources/domains/MasterContent.xml.all
index fd66eb6..39aa841 100644
--- a/docker/core/src/main/resources/domains/MasterContent.xml.all
+++ b/docker/core/src/main/resources/domains/MasterContent.xml.all
@@ -135,23 +135,6 @@ under the License.
   <CPlainAttrValue id="447e2456-3ff5-41bc-8ff1-cbb0567546cb"
                    attribute_id="cfec3140-562d-459c-ac6a-e3e10758661d" longValue="120"/>
   
-  <!--  Connector and Resource configuration history -->                   
-  <SyncopeSchema id="connector.conf.history.size"/>
-  <PlainSchema id="connector.conf.history.size" type="Long"
-               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
-  <CPlainAttr id="ae36c6ab-0f39-40d7-b6e6-3b8394547c9c"
-              owner_id="cd64d66f-6fff-4008-b966-a06b1cc1436d" schema_id="connector.conf.history.size"/>
-  <CPlainAttrValue id="4989ce5d-7b42-4a5c-b725-54286888df10"
-                   attribute_id="ae36c6ab-0f39-40d7-b6e6-3b8394547c9c" longValue="10"/>
-  
-  <SyncopeSchema id="resource.conf.history.size"/>
-  <PlainSchema id="resource.conf.history.size" type="Long"
-               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
-  <CPlainAttr id="ae7ae53a-74cf-48b0-9a57-6d2c94928e60"
-              owner_id="cd64d66f-6fff-4008-b966-a06b1cc1436d" schema_id="resource.conf.history.size"/>
-  <CPlainAttrValue id="059ac3e1-687f-4dd9-a28b-a23f8b436f31"
-                   attribute_id="ae7ae53a-74cf-48b0-9a57-6d2c94928e60" longValue="10"/>
-
   <AnyType id="USER" kind="USER"/>
   <AnyTypeClass id="BaseUser"/>
   <AnyType_AnyTypeClass anyType_id="USER" anyTypeClass_id="BaseUser"/>
diff --git a/docker/core/src/main/resources/domains/MasterContent.xml.myjson b/docker/core/src/main/resources/domains/MasterContent.xml.myjson
index 814b3c6..f606503 100644
--- a/docker/core/src/main/resources/domains/MasterContent.xml.myjson
+++ b/docker/core/src/main/resources/domains/MasterContent.xml.myjson
@@ -77,17 +77,8 @@ under the License.
   <PlainSchema id="jwt.lifetime.minutes" type="Long"
                mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
     
-  <!--  Connector and Resource configuration history -->                   
-  <SyncopeSchema id="connector.conf.history.size"/>
-  <PlainSchema id="connector.conf.history.size" type="Long"
-               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
-  
-  <SyncopeSchema id="resource.conf.history.size"/>
-  <PlainSchema id="resource.conf.history.size" type="Long"
-               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
-  
   <SyncopeConf id="cd64d66f-6fff-4008-b966-a06b1cc1436d"
-               plainAttrs="[{&quot;values&quot;:[{&quot;stringValue&quot;:&quot;SSHA256&quot;}],&quot;schema&quot;:&quot;password.cipher.algorithm&quot;},{&quot;values&quot;:[{&quot;stringValue&quot;:&quot;&quot;}],&quot;schema&quot;:&quot;notificationjob.cronExpression&quot;},{&quot;values&quot;:[{&quot;longValue&quot;:3}],&quot;schema&quot;:&quot;notification.maxRetries&quot;},{&quot;values&quot;:[{&quot;longValue&quot;:256}],&quot;schema&quot;:&quot;token.length&quot;},{&quot;values&q [...]
+	       plainAttrs="[{&quot;values&quot;:[{&quot;stringValue&quot;:&quot;SSHA256&quot;}],&quot;schema&quot;:&quot;password.cipher.algorithm&quot;},{&quot;values&quot;:[{&quot;stringValue&quot;:&quot;&quot;}],&quot;schema&quot;:&quot;notificationjob.cronExpression&quot;},{&quot;values&quot;:[{&quot;longValue&quot;:3}],&quot;schema&quot;:&quot;notification.maxRetries&quot;},{&quot;values&quot;:[{&quot;longValue&quot;:256}],&quot;schema&quot;:&quot;token.length&quot;},{&quot;values&quot;:[{ [...]
 
   <AnyType id="USER" kind="USER"/>
   <AnyTypeClass id="BaseUser"/>
diff --git a/docker/core/src/main/resources/domains/MasterContent.xml.pgjsonb b/docker/core/src/main/resources/domains/MasterContent.xml.pgjsonb
index 814b3c6..7bb6501 100644
--- a/docker/core/src/main/resources/domains/MasterContent.xml.pgjsonb
+++ b/docker/core/src/main/resources/domains/MasterContent.xml.pgjsonb
@@ -77,17 +77,8 @@ under the License.
   <PlainSchema id="jwt.lifetime.minutes" type="Long"
                mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
     
-  <!--  Connector and Resource configuration history -->                   
-  <SyncopeSchema id="connector.conf.history.size"/>
-  <PlainSchema id="connector.conf.history.size" type="Long"
-               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
-  
-  <SyncopeSchema id="resource.conf.history.size"/>
-  <PlainSchema id="resource.conf.history.size" type="Long"
-               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
-  
   <SyncopeConf id="cd64d66f-6fff-4008-b966-a06b1cc1436d"
-               plainAttrs="[{&quot;values&quot;:[{&quot;stringValue&quot;:&quot;SSHA256&quot;}],&quot;schema&quot;:&quot;password.cipher.algorithm&quot;},{&quot;values&quot;:[{&quot;stringValue&quot;:&quot;&quot;}],&quot;schema&quot;:&quot;notificationjob.cronExpression&quot;},{&quot;values&quot;:[{&quot;longValue&quot;:3}],&quot;schema&quot;:&quot;notification.maxRetries&quot;},{&quot;values&quot;:[{&quot;longValue&quot;:256}],&quot;schema&quot;:&quot;token.length&quot;},{&quot;values&q [...]
+	       plainAttrs="[{&quot;values&quot;:[{&quot;stringValue&quot;:&quot;SSHA256&quot;}],&quot;schema&quot;:&quot;password.cipher.algorithm&quot;},{&quot;values&quot;:[{&quot;stringValue&quot;:&quot;&quot;}],&quot;schema&quot;:&quot;notificationjob.cronExpression&quot;},{&quot;values&quot;:[{&quot;longValue&quot;:3}],&quot;schema&quot;:&quot;notification.maxRetries&quot;},{&quot;values&quot;:[{&quot;longValue&quot;:256}],&quot;schema&quot;:&quot;token.length&quot;},{&quot;values&quot;:[{ [...]
 
   <AnyType id="USER" kind="USER"/>
   <AnyTypeClass id="BaseUser"/>
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java
index 9e07481..5118a96 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java
@@ -80,7 +80,6 @@ import org.apache.syncope.common.rest.api.service.ApplicationService;
 import org.apache.syncope.common.rest.api.service.AuditService;
 import org.apache.syncope.common.rest.api.service.CamelRouteService;
 import org.apache.syncope.common.rest.api.service.ConfigurationService;
-import org.apache.syncope.common.rest.api.service.ConnectorHistoryService;
 import org.apache.syncope.common.rest.api.service.ConnectorService;
 import org.apache.syncope.common.rest.api.service.DomainService;
 import org.apache.syncope.common.rest.api.service.DynRealmService;
@@ -99,7 +98,6 @@ import org.apache.syncope.common.rest.api.service.ReconciliationService;
 import org.apache.syncope.common.rest.api.service.RelationshipTypeService;
 import org.apache.syncope.common.rest.api.service.RemediationService;
 import org.apache.syncope.common.rest.api.service.ReportTemplateService;
-import org.apache.syncope.common.rest.api.service.ResourceHistoryService;
 import org.apache.syncope.common.rest.api.service.RoleService;
 import org.apache.syncope.common.rest.api.service.SAML2IdPService;
 import org.apache.syncope.common.rest.api.service.SAML2SPService;
@@ -190,6 +188,8 @@ public abstract class AbstractITCase {
 
     protected static final String PRINTER = "PRINTER";
 
+    protected static final int MAX_WAIT_SECONDS = 50;
+
     protected static String ANONYMOUS_UNAME;
 
     protected static String ANONYMOUS_KEY;
@@ -236,14 +236,10 @@ public abstract class AbstractITCase {
 
     protected static ResourceService resourceService;
 
-    protected static ResourceHistoryService resourceHistoryService;
-
     protected static ConfigurationService configurationService;
 
     protected static ConnectorService connectorService;
 
-    protected static ConnectorHistoryService connectorHistoryService;
-
     protected static LoggerService loggerService;
 
     protected static ReportTemplateService reportTemplateService;
@@ -333,10 +329,8 @@ public abstract class AbstractITCase {
         userWorkflowTaskService = adminClient.getService(UserWorkflowTaskService.class);
         groupService = adminClient.getService(GroupService.class);
         resourceService = adminClient.getService(ResourceService.class);
-        resourceHistoryService = adminClient.getService(ResourceHistoryService.class);
         configurationService = adminClient.getService(ConfigurationService.class);
         connectorService = adminClient.getService(ConnectorService.class);
-        connectorHistoryService = adminClient.getService(ConnectorHistoryService.class);
         loggerService = adminClient.getService(LoggerService.class);
         reportTemplateService = adminClient.getService(ReportTemplateService.class);
         reportService = adminClient.getService(ReportService.class);
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AbstractTypesITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AbstractTypesITCase.java
index 21718f7..d3f74c7 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AbstractTypesITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AbstractTypesITCase.java
@@ -23,7 +23,6 @@ import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.pages.Types;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.AjaxFallbackDataTable;
 import org.apache.wicket.util.tester.FormTester;
-import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 
 public abstract class AbstractTypesITCase extends AbstractConsoleITCase {
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AnyObjectsITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AnyObjectsITCase.java
index 7ebfc38..07803cb 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AnyObjectsITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AnyObjectsITCase.java
@@ -70,7 +70,7 @@ public class AnyObjectsITCase extends AbstractConsoleITCase {
 
         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
         TESTER.clickLink(TAB_PANEL + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
-                + "actions:actions:actionRepeater:1:action:action");
+                + "actions:actions:actionRepeater:5:action:action");
 
         FormTester formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
         assertNotNull(formTester);
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/BatchesITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/BatchesITCase.java
index d347743..de2dde3 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/BatchesITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/BatchesITCase.java
@@ -78,7 +78,7 @@ public class BatchesITCase extends AbstractConsoleITCase {
         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
         // manage resource
         TESTER.clickLink("body:content:body:container:content:tabbedPanel:panel:searchResult:outerObjectsRepeater:1"
-                + ":outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:5:"
+                + ":outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:4:"
                 + "action:action");
 
         TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
@@ -131,7 +131,7 @@ public class BatchesITCase extends AbstractConsoleITCase {
         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
         // enable
         TESTER.clickLink("body:content:body:container:content:tabbedPanel:panel:searchResult:outerObjectsRepeater:1"
-                + ":outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:4:"
+                + ":outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:3:"
                 + "action:action");
 
         TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
@@ -194,7 +194,7 @@ public class BatchesITCase extends AbstractConsoleITCase {
         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
         // enable
         TESTER.clickLink("body:content:body:container:content:tabbedPanel:panel:searchResult:outerObjectsRepeater:1"
-                + ":outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:4:"
+                + ":outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:3:"
                 + "action:action");
 
         TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
@@ -254,7 +254,7 @@ public class BatchesITCase extends AbstractConsoleITCase {
         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
         // manage resource
         TESTER.clickLink("body:content:body:container:content:tabbedPanel:panel:searchResult:outerObjectsRepeater:1"
-                + ":outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:6:"
+                + ":outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:5:"
                 + "action:action");
 
         TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
@@ -302,7 +302,7 @@ public class BatchesITCase extends AbstractConsoleITCase {
         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
         // manage resource
         TESTER.clickLink("body:content:body:container:content:tabbedPanel:panel:searchResult:outerObjectsRepeater:1"
-                + ":outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:2:"
+                + ":outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:1:"
                 + "action:action");
 
         TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/GroupsITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/GroupsITCase.java
index 8e8bc70..e47f9cd 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/GroupsITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/GroupsITCase.java
@@ -53,7 +53,7 @@ public class GroupsITCase extends AbstractConsoleITCase {
 
         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
         TESTER.clickLink(TAB_PANEL + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
-                + "actions:actions:actionRepeater:3:action:action");
+                + "actions:actions:actionRepeater:2:action:action");
 
         FormTester formTester = TESTER.newFormTester(TAB_PANEL
                 + "outerObjectsRepeater:7:outer:container:content:togglePanelContainer:membersForm");
@@ -97,7 +97,7 @@ public class GroupsITCase extends AbstractConsoleITCase {
 
         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
         TESTER.clickLink(TAB_PANEL + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
-                + "actions:actions:actionRepeater:1:action:action");
+                + "actions:actions:actionRepeater:9:action:action");
 
         TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form:view:name:textField",
                 TextField.class);
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/PoliciesITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/PoliciesITCase.java
index a4e84af..5df46f5 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/PoliciesITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/PoliciesITCase.java
@@ -727,7 +727,7 @@ public class PoliciesITCase extends AbstractConsoleITCase {
 
         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
         TESTER.clickLink("body:content:body:container:content:tabbedPanel:panel:searchResult:outerObjectsRepeater:"
-                + "1:outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:1:"
+                + "1:outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:9:"
                 + "action:action");
 
         TESTER.assertComponent(
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/UsersITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/UsersITCase.java
index ff0be0f..a79f7e0 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/UsersITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/UsersITCase.java
@@ -75,7 +75,7 @@ public class UsersITCase extends AbstractConsoleITCase {
 
         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
         TESTER.clickLink(TAB_PANEL + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
-                + "actions:actions:actionRepeater:2:action:action");
+                + "actions:actions:actionRepeater:1:action:action");
 
         TESTER.assertInfoMessages("Operation executed successfully");
     }
@@ -91,7 +91,7 @@ public class UsersITCase extends AbstractConsoleITCase {
 
         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
         TESTER.clickLink(TAB_PANEL + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
-                + "actions:actions:actionRepeater:1:action:action");
+                + "actions:actions:actionRepeater:9:action:action");
 
         TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form:view:username:textField",
                 TextField.class);
@@ -657,7 +657,7 @@ public class UsersITCase extends AbstractConsoleITCase {
 
         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
         TESTER.clickLink(TAB_PANEL + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
-                + "actions:actions:actionRepeater:3:action:action");
+                + "actions:actions:actionRepeater:2:action:action");
 
         TESTER.assertLabel(TAB_PANEL + "outerObjectsRepeater:3:outer:form:content:status:resources:"
                 + "firstLevelContainer:first:container:content:group:beans:0:fields:0:field", "syncope");
@@ -682,7 +682,7 @@ public class UsersITCase extends AbstractConsoleITCase {
 
         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
         TESTER.clickLink(TAB_PANEL + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
-                + "actions:actions:actionRepeater:3:action:action");
+                + "actions:actions:actionRepeater:2:action:action");
 
         TESTER.assertLabel(TAB_PANEL + "outerObjectsRepeater:3:outer:form:content:status:resources:"
                 + "firstLevelContainer:first:container:content:group:beans:0:fields:0:field", "syncope");
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AbstractTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AbstractTaskITCase.java
index 5bfa1b4..43d077e 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AbstractTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AbstractTaskITCase.java
@@ -172,14 +172,14 @@ public abstract class AbstractTaskITCase extends AbstractITCase {
         ExecutorService service = Executors.newFixedThreadPool(taskKeys.size());
         List<Future<ExecTO>> futures = new ArrayList<>();
 
-        for (String key : taskKeys) {
+        taskKeys.forEach(key -> {
             futures.add(service.submit(new ThreadExec(taskService, type, key, maxWaitSeconds, dryRun)));
             // avoid flooding the test server
             try {
                 Thread.sleep(2000);
             } catch (InterruptedException e) {
             }
-        }
+        });
 
         for (Future<ExecTO> future : futures) {
             future.get(100, TimeUnit.SECONDS);
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuditITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuditITCase.java
index e3ceffa..4c1927a 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuditITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuditITCase.java
@@ -22,25 +22,31 @@ import static org.junit.jupiter.api.Assertions.fail;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
-
+import java.util.Set;
+import org.apache.commons.lang3.SerializationUtils;
 import org.apache.syncope.client.lib.SyncopeClient;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.to.AuditEntryTO;
+import org.apache.syncope.common.lib.to.ConnInstanceTO;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.PagedResult;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.types.AuditElements;
+import org.apache.syncope.common.lib.types.ConnConfProperty;
+import org.apache.syncope.common.lib.types.ConnectorCapability;
 import org.apache.syncope.common.rest.api.beans.AnyQuery;
 import org.apache.syncope.common.rest.api.beans.AuditQuery;
 import org.apache.syncope.fit.AbstractITCase;
 import org.junit.jupiter.api.Test;
 
 public class AuditITCase extends AbstractITCase {
-    private static final int MAX_WAIT_SECONDS = 50;
 
     private static AuditEntryTO query(final AuditQuery query, final int maxWaitSeconds, final boolean failIfEmpty) {
         List<AuditEntryTO> results = query(query, maxWaitSeconds);
@@ -77,9 +83,10 @@ public class AuditITCase extends AbstractITCase {
         assertEquals(1, entries.size());
 
         PagedResult<UserTO> usersTOs = userService.search(
-            new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
-                fiql(SyncopeClient.getUserSearchConditionBuilder().is("username").equalTo(userTO.getUsername()).query()).
-                build());
+                new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
+                        fiql(SyncopeClient.getUserSearchConditionBuilder().
+                                is("username").equalTo(userTO.getUsername()).query()).
+                        build());
         assertNotNull(usersTOs);
         assertFalse(usersTOs.getResult().isEmpty());
 
@@ -140,9 +147,10 @@ public class AuditITCase extends AbstractITCase {
         assertEquals(1, entries.size());
 
         PagedResult<GroupTO> groups = groupService.search(
-            new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
-                fiql(SyncopeClient.getGroupSearchConditionBuilder().is("name").equalTo(groupTO.getName()).query()).
-                build());
+                new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
+                        fiql(SyncopeClient.getGroupSearchConditionBuilder().
+                                is("name").equalTo(groupTO.getName()).query()).
+                        build());
         assertNotNull(groups);
         assertFalse(groups.getResult().isEmpty());
 
@@ -155,7 +163,7 @@ public class AuditITCase extends AbstractITCase {
         AnyObjectTO anyObjectTO = createAnyObject(AnyObjectITCase.getSampleTO("Italy")).getEntity();
         assertNotNull(anyObjectTO.getKey());
         AuditQuery query = new AuditQuery.Builder(anyObjectTO.getKey()).orderBy("event_date desc").
-            page(1).size(1).build();
+                page(1).size(1).build();
         AuditEntryTO entry = query(query, MAX_WAIT_SECONDS, true);
         assertEquals(anyObjectTO.getKey(), entry.getKey());
         anyObjectService.delete(anyObjectTO.getKey());
@@ -172,13 +180,57 @@ public class AuditITCase extends AbstractITCase {
         assertEquals(1, entries.size());
 
         PagedResult<AnyObjectTO> anyObjects = anyObjectService.search(
-            new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
-                fiql(SyncopeClient.getAnyObjectSearchConditionBuilder(anyObjectTO.getType()).query()).
-                build());
+                new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
+                        fiql(SyncopeClient.getAnyObjectSearchConditionBuilder(anyObjectTO.getType()).query()).
+                        build());
         assertNotNull(anyObjects);
         assertFalse(anyObjects.getResult().isEmpty());
-        
+
         entries = query(query, MAX_WAIT_SECONDS);
         assertEquals(1, entries.size());
     }
+
+    @Test
+    public void findByConnector() throws JsonProcessingException {
+        String connectorKey = "74141a3b-0762-4720-a4aa-fc3e374ef3ef";
+
+        AuditQuery query = new AuditQuery.Builder(connectorKey).
+                orderBy("event_date desc").
+                type(AuditElements.EventCategoryType.LOGIC).
+                category("ConnectorLogic").
+                event("update").
+                result(AuditElements.Result.SUCCESS).
+                build();
+        List<AuditEntryTO> entries = query(query, 0);
+        int pre = entries.size();
+
+        ConnInstanceTO ldapConn = connectorService.read(connectorKey, null);
+        String originalDisplayName = ldapConn.getDisplayName();
+        Set<ConnectorCapability> originalCapabilities = new HashSet<>(ldapConn.getCapabilities());
+        ConnConfProperty originalConfProp = SerializationUtils.clone(
+                ldapConn.getConf("maintainPosixGroupMembership").get());
+        assertEquals(1, originalConfProp.getValues().size());
+        assertEquals("false", originalConfProp.getValues().get(0));
+
+        ldapConn.setDisplayName(originalDisplayName + " modified");
+        ldapConn.getCapabilities().clear();
+        ldapConn.getConf("maintainPosixGroupMembership").get().getValues().set(0, "true");
+        connectorService.update(ldapConn);
+
+        ldapConn = connectorService.read(connectorKey, null);
+        assertNotEquals(originalDisplayName, ldapConn.getDisplayName());
+        assertNotEquals(originalCapabilities, ldapConn.getCapabilities());
+        assertNotEquals(originalConfProp, ldapConn.getConf("maintainPosixGroupMembership"));
+
+        entries = query(query, MAX_WAIT_SECONDS);
+        assertEquals(pre + 1, entries.size());
+
+        ConnInstanceTO restore = MAPPER.readValue(entries.get(0).getBefore(), ConnInstanceTO.class);
+        connectorService.update(restore);
+
+        ldapConn = connectorService.read(connectorKey, null);
+        assertEquals(originalDisplayName, ldapConn.getDisplayName());
+        assertEquals(originalCapabilities, ldapConn.getCapabilities());
+        assertEquals(originalConfProp, ldapConn.getConf("maintainPosixGroupMembership").get());
+    }
 }
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuthenticationITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuthenticationITCase.java
index cbdb19b..29703fa 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuthenticationITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuthenticationITCase.java
@@ -535,9 +535,9 @@ public class AuthenticationITCase extends AbstractITCase {
         assertNotNull(user);
 
         // 4. check that the db resource has still the initial password value
-        final JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource);
-        String value = queryForObject(
-                jdbcTemplate, 50, "SELECT PASSWORD FROM test WHERE ID=?", String.class, user.getUsername());
+        JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource);
+        String value = queryForObject(jdbcTemplate, MAX_WAIT_SECONDS,
+                "SELECT PASSWORD FROM test WHERE ID=?", String.class, user.getUsername());
         assertEquals(Encryptor.getInstance().encode("password123", CipherAlgorithm.SHA1), value.toUpperCase());
 
         // 5. successfully authenticate with old (on db resource) and new (on internal storage) password values
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConnectorITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConnectorITCase.java
index 7def155..c595475 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConnectorITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConnectorITCase.java
@@ -20,7 +20,6 @@ package org.apache.syncope.fit.core;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertNotEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -39,14 +38,12 @@ import java.util.Set;
 import java.util.UUID;
 import java.util.stream.Collectors;
 import javax.ws.rs.core.Response;
-import org.apache.commons.lang3.SerializationUtils;
 import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.syncope.client.lib.SyncopeClient;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.ConnBundleTO;
 import org.apache.syncope.common.lib.to.ConnIdObjectClassTO;
-import org.apache.syncope.common.lib.to.ConnInstanceHistoryConfTO;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
 import org.apache.syncope.common.lib.to.ConnPoolConfTO;
 import org.apache.syncope.common.lib.to.ItemTO;
@@ -476,41 +473,6 @@ public class ConnectorITCase extends AbstractITCase {
     }
 
     @Test
-    public void history() {
-        List<ConnInstanceHistoryConfTO> history = connectorHistoryService.list("74141a3b-0762-4720-a4aa-fc3e374ef3ef");
-        assertNotNull(history);
-        int pre = history.size();
-
-        ConnInstanceTO ldapConn = connectorService.read("74141a3b-0762-4720-a4aa-fc3e374ef3ef", null);
-        String originalDisplayName = ldapConn.getDisplayName();
-        Set<ConnectorCapability> originalCapabilities = new HashSet<>(ldapConn.getCapabilities());
-        ConnConfProperty originalConfProp = SerializationUtils.clone(
-                ldapConn.getConf("maintainPosixGroupMembership").get());
-        assertEquals(1, originalConfProp.getValues().size());
-        assertEquals("false", originalConfProp.getValues().get(0));
-
-        ldapConn.setDisplayName(originalDisplayName + " modified");
-        ldapConn.getCapabilities().clear();
-        ldapConn.getConf("maintainPosixGroupMembership").get().getValues().set(0, "true");
-        connectorService.update(ldapConn);
-
-        ldapConn = connectorService.read("74141a3b-0762-4720-a4aa-fc3e374ef3ef", null);
-        assertNotEquals(originalDisplayName, ldapConn.getDisplayName());
-        assertNotEquals(originalCapabilities, ldapConn.getCapabilities());
-        assertNotEquals(originalConfProp, ldapConn.getConf("maintainPosixGroupMembership"));
-
-        history = connectorHistoryService.list("74141a3b-0762-4720-a4aa-fc3e374ef3ef");
-        assertEquals(pre + 1, history.size());
-
-        connectorHistoryService.restore(history.get(0).getKey());
-
-        ldapConn = connectorService.read("74141a3b-0762-4720-a4aa-fc3e374ef3ef", null);
-        assertEquals(originalDisplayName, ldapConn.getDisplayName());
-        assertEquals(originalCapabilities, ldapConn.getCapabilities());
-        assertEquals(originalConfProp, ldapConn.getConf("maintainPosixGroupMembership").get());
-    }
-
-    @Test
     public void authorizations() {
         SyncopeClient puccini = clientFactory.create("puccini", ADMIN_PWD);
         ConnectorService pcs = puccini.getService(ConnectorService.class);
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java
index 3a20570..c42b60a 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java
@@ -963,7 +963,6 @@ public class GroupITCase extends AbstractITCase {
             assertNotNull(exec.getRefKey());
 
             int i = 0;
-            int maxit = 50;
 
             // wait for task exec completion (executions incremented)
             SchedTaskTO taskTO;
@@ -975,7 +974,7 @@ public class GroupITCase extends AbstractITCase {
                 assertNotNull(taskTO);
                 assertNotNull(taskTO.getExecutions());
                 i++;
-            } while (taskTO.getExecutions().isEmpty() && i < maxit);
+            } while (taskTO.getExecutions().isEmpty() && i < MAX_WAIT_SECONDS);
             assertFalse(taskTO.getExecutions().isEmpty());
 
             assertEquals(TaskJob.Status.SUCCESS.name(), taskTO.getExecutions().get(0).getStatus());
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LinkedAccountITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LinkedAccountITCase.java
index 93214d7..829570f 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LinkedAccountITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LinkedAccountITCase.java
@@ -259,7 +259,8 @@ public class LinkedAccountITCase extends AbstractITCase {
             assertNotNull(sendUser);
 
             // 5. execute PushTask
-            AbstractTaskITCase.execProvisioningTask(taskService, TaskType.PUSH, sendUser.getKey(), 50, false);
+            AbstractTaskITCase.execProvisioningTask(
+                    taskService, TaskType.PUSH, sendUser.getKey(), MAX_WAIT_SECONDS, false);
 
             TaskTO task = taskService.read(TaskType.PUSH, sendUser.getKey(), true);
             assertEquals(1, task.getExecutions().size());
@@ -403,7 +404,8 @@ public class LinkedAccountITCase extends AbstractITCase {
             List<LinkedAccountTO> accounts = userService.read("vivaldi").getLinkedAccounts();
             assertTrue(accounts.isEmpty());
 
-            ExecTO exec = AbstractTaskITCase.execProvisioningTask(taskService, TaskType.PULL, pullTaskKey, 50, false);
+            ExecTO exec = AbstractTaskITCase.execProvisioningTask(
+                    taskService, TaskType.PULL, pullTaskKey, MAX_WAIT_SECONDS, false);
             assertEquals(ExecStatus.SUCCESS, ExecStatus.valueOf(exec.getStatus()));
             assertTrue(exec.getMessage().contains("Accounts created"));
 
@@ -452,7 +454,8 @@ public class LinkedAccountITCase extends AbstractITCase {
             assertEquals(Response.Status.NO_CONTENT.getStatusCode(), response.getStatus());
 
             // 4. execute pull task again and verify linked accounts were pulled
-            exec = AbstractTaskITCase.execProvisioningTask(taskService, TaskType.PULL, pullTaskKey, 50, false);
+            exec = AbstractTaskITCase.execProvisioningTask(
+                    taskService, TaskType.PULL, pullTaskKey, MAX_WAIT_SECONDS, false);
             assertEquals(ExecStatus.SUCCESS, ExecStatus.valueOf(exec.getStatus()));
             assertTrue(exec.getMessage().contains("Accounts updated"));
             assertTrue(exec.getMessage().contains("Accounts deleted"));
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/MembershipITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/MembershipITCase.java
index 4fd5e05..5e64d99 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/MembershipITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/MembershipITCase.java
@@ -255,7 +255,7 @@ public class MembershipITCase extends AbstractITCase {
             // 2. verify that user was found on resource
             JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource);
             String idOnResource = queryForObject(
-                    jdbcTemplate, 50, "SELECT id FROM testpull WHERE id=?", String.class, "5432");
+                    jdbcTemplate, MAX_WAIT_SECONDS, "SELECT id FROM testpull WHERE id=?", String.class, "5432");
             assertEquals("5432", idOnResource);
 
             // 3. unlink user from resource, then remove it
@@ -277,7 +277,7 @@ public class MembershipITCase extends AbstractITCase {
             assertNotNull(newTask);
 
             ExecTO execution = AbstractTaskITCase.execProvisioningTask(
-                    taskService, TaskType.PULL, newTask.getKey(), 50, false);
+                    taskService, TaskType.PULL, newTask.getKey(), MAX_WAIT_SECONDS, false);
             assertEquals(ExecStatus.SUCCESS, ExecStatus.valueOf(execution.getStatus()));
 
             // 5. verify that pulled user has
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/MultitenancyITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/MultitenancyITCase.java
index a2d698b..6c74240 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/MultitenancyITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/MultitenancyITCase.java
@@ -221,7 +221,7 @@ public class MultitenancyITCase extends AbstractITCase {
 
             // pull
             ExecTO execution = AbstractTaskITCase.execProvisioningTask(
-                    adminClient.getService(TaskService.class), TaskType.PULL, task.getKey(), 50, false);
+                    adminClient.getService(TaskService.class), TaskType.PULL, task.getKey(), MAX_WAIT_SECONDS, false);
 
             // verify execution status
             String status = execution.getStatus();
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
index 760c977..9d266a6 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
@@ -237,7 +237,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
                     page(1).size(1).build()).getTotalCount();
             assertNotNull(usersPre);
 
-            ExecTO exec = execProvisioningTask(taskService, TaskType.PULL, PULL_TASK_KEY, 50, false);
+            ExecTO exec = execProvisioningTask(taskService, TaskType.PULL, PULL_TASK_KEY, MAX_WAIT_SECONDS, false);
             assertEquals(ExecStatus.SUCCESS, ExecStatus.valueOf(exec.getStatus()));
 
             LOG.debug("Execution of task {}:\n{}", PULL_TASK_KEY, exec);
@@ -305,7 +305,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
             Set<String> otherPullTaskKeys = new HashSet<>();
             otherPullTaskKeys.add("feae4e57-15ca-40d9-b973-8b9015efca49");
             otherPullTaskKeys.add("55d5e74b-497e-4bc0-9156-73abef4b9adc");
-            execProvisioningTasks(taskService, TaskType.PULL, otherPullTaskKeys, 50, false);
+            execProvisioningTasks(taskService, TaskType.PULL, otherPullTaskKeys, MAX_WAIT_SECONDS, false);
 
             // Matching --> UNLINK
             assertFalse(userService.read("test9").getResources().contains(RESOURCE_NAME_CSV));
@@ -317,7 +317,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
     @Test
     public void dryRun() {
-        ExecTO execution = execProvisioningTask(taskService, TaskType.PULL, PULL_TASK_KEY, 50, true);
+        ExecTO execution = execProvisioningTask(taskService, TaskType.PULL, PULL_TASK_KEY, MAX_WAIT_SECONDS, true);
         assertEquals("SUCCESS", execution.getStatus());
     }
 
@@ -327,7 +327,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
         JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource);
         try {
             ExecTO execution = execProvisioningTask(
-                    taskService, TaskType.PULL, "83f7e85d-9774-43fe-adba-ccd856312994", 50, false);
+                    taskService, TaskType.PULL, "83f7e85d-9774-43fe-adba-ccd856312994", MAX_WAIT_SECONDS, false);
             assertEquals(ExecStatus.SUCCESS, ExecStatus.valueOf(execution.getStatus()));
 
             userTO = userService.read("testuser1");
@@ -340,7 +340,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
             // re-execute the same PullTask: now user must be active
             execution = execProvisioningTask(
-                    taskService, TaskType.PULL, "83f7e85d-9774-43fe-adba-ccd856312994", 50, false);
+                    taskService, TaskType.PULL, "83f7e85d-9774-43fe-adba-ccd856312994", MAX_WAIT_SECONDS, false);
             assertEquals(ExecStatus.SUCCESS, ExecStatus.valueOf(execution.getStatus()));
 
             userTO = userService.read("testuser1");
@@ -361,7 +361,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
         // 0. pull
         ExecTO execution = execProvisioningTask(
-                taskService, TaskType.PULL, "1e419ca4-ea81-4493-a14f-28b90113686d", 50, false);
+                taskService, TaskType.PULL, "1e419ca4-ea81-4493-a14f-28b90113686d", MAX_WAIT_SECONDS, false);
 
         // 1. verify execution status
         assertEquals(ExecStatus.SUCCESS, ExecStatus.valueOf(execution.getStatus()));
@@ -415,11 +415,11 @@ public class PullTaskITCase extends AbstractTaskITCase {
                 userDn.getValues().get(0), Collections.singletonMap("title", (String) null));
 
         // SYNCOPE-317
-        execProvisioningTask(taskService, TaskType.PULL, "1e419ca4-ea81-4493-a14f-28b90113686d", 50, false);
+        execProvisioningTask(
+                taskService, TaskType.PULL, "1e419ca4-ea81-4493-a14f-28b90113686d", MAX_WAIT_SECONDS, false);
 
         // 4. verify that LDAP group membership is pulled as Syncope membership
         int i = 0;
-        int maxit = 50;
         PagedResult<UserTO> members;
         do {
             try {
@@ -433,8 +433,8 @@ public class PullTaskITCase extends AbstractTaskITCase {
             assertNotNull(members);
 
             i++;
-        } while (members.getResult().isEmpty() && i < maxit);
-        if (i == maxit) {
+        } while (members.getResult().isEmpty() && i < MAX_WAIT_SECONDS);
+        if (i == MAX_WAIT_SECONDS) {
             fail("Timeout while checking for memberships of " + groupTO.getName());
         }
         assertEquals(1, members.getResult().size());
@@ -455,10 +455,10 @@ public class PullTaskITCase extends AbstractTaskITCase {
         updateLdapRemoteObject(RESOURCE_LDAP_ADMIN_DN, RESOURCE_LDAP_ADMIN_PWD,
                 groupDn.getValues().get(0), Collections.singletonMap("uniquemember", "uid=admin,ou=system"));
 
-        execProvisioningTask(taskService, TaskType.PULL, "1e419ca4-ea81-4493-a14f-28b90113686d", 50, false);
+        execProvisioningTask(
+                taskService, TaskType.PULL, "1e419ca4-ea81-4493-a14f-28b90113686d", MAX_WAIT_SECONDS, false);
 
         i = 0;
-        maxit = 50;
         do {
             try {
                 Thread.sleep(1000);
@@ -471,8 +471,8 @@ public class PullTaskITCase extends AbstractTaskITCase {
             assertNotNull(members);
 
             i++;
-        } while (!members.getResult().isEmpty() && i < maxit);
-        if (i == maxit) {
+        } while (!members.getResult().isEmpty() && i < MAX_WAIT_SECONDS);
+        if (i == MAX_WAIT_SECONDS) {
             fail("Timeout while checking for memberships of " + groupTO.getName());
         }
         assertEquals(0, members.getResult().size());
@@ -557,7 +557,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
             assertFalse(pullTask.isPerformDelete());
 
             // 4. pull
-            execProvisioningTask(taskService, TaskType.PULL, pullTask.getKey(), 50, false);
+            execProvisioningTask(taskService, TaskType.PULL, pullTask.getKey(), MAX_WAIT_SECONDS, false);
 
             // 5. verify that printer was re-created in Syncope (implies that location does not start with given prefix,
             // hence PrefixItemTransformer was applied during pull)
@@ -610,7 +610,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
             assertEquals(reconFilterBuilder.getKey(), task.getReconFilterBuilder());
 
             // 3. exec task
-            ExecTO execution = execProvisioningTask(taskService, TaskType.PULL, task.getKey(), 50, false);
+            ExecTO execution = execProvisioningTask(taskService, TaskType.PULL, task.getKey(), MAX_WAIT_SECONDS, false);
             assertEquals(ExecStatus.SUCCESS, ExecStatus.valueOf(execution.getStatus()));
 
             // 4. verify that only enabled user was pulled
@@ -692,7 +692,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
                     + "(1041, 'syncTokenWithErrors2', 'Surname2', "
                     + "false, 'syncTokenWithErrors1@syncope.apache.org', '2015-05-23 13:53:24.293')");
 
-            ExecTO exec = execProvisioningTask(taskService, TaskType.PULL, pullTask.getKey(), 50, false);
+            ExecTO exec = execProvisioningTask(taskService, TaskType.PULL, pullTask.getKey(), MAX_WAIT_SECONDS, false);
             assertEquals(ExecStatus.SUCCESS, ExecStatus.valueOf(exec.getStatus()));
 
             resForTest = resourceService.read(resForTest.getKey());
@@ -702,7 +702,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
                     + "SET email='syncTokenWithErrors2@syncope.apache.org', lastModification='2016-05-23 13:53:24.293' "
                     + "WHERE ID=1041");
 
-            exec = execProvisioningTask(taskService, TaskType.PULL, pullTask.getKey(), 50, false);
+            exec = execProvisioningTask(taskService, TaskType.PULL, pullTask.getKey(), MAX_WAIT_SECONDS, false);
             assertEquals(ExecStatus.SUCCESS, ExecStatus.valueOf(exec.getStatus()));
 
             resForTest = resourceService.read(resForTest.getKey());
@@ -754,7 +754,8 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
         try {
             // 3. execute the pull task and verify that:
-            ExecTO execution = execProvisioningTask(taskService, TaskType.PULL, pullTask.getKey(), 50, false);
+            ExecTO execution = execProvisioningTask(
+                    taskService, TaskType.PULL, pullTask.getKey(), MAX_WAIT_SECONDS, false);
             assertEquals(ExecStatus.SUCCESS, ExecStatus.valueOf(execution.getStatus()));
 
             // 3a. user was not pulled
@@ -859,7 +860,8 @@ public class PullTaskITCase extends AbstractTaskITCase {
             assertFalse(actual.getTemplates().get(AnyTypeKind.USER.name()).getResources().isEmpty());
             assertFalse(((UserTO) actual.getTemplates().get(AnyTypeKind.USER.name())).getMemberships().isEmpty());
 
-            ExecTO execution = execProvisioningTask(taskService, TaskType.PULL, actual.getKey(), 50, false);
+            ExecTO execution = execProvisioningTask(
+                    taskService, TaskType.PULL, actual.getKey(), MAX_WAIT_SECONDS, false);
             assertEquals(ExecStatus.SUCCESS, ExecStatus.valueOf(execution.getStatus()));
 
             userTO = userService.read("testuser2");
@@ -884,7 +886,8 @@ public class PullTaskITCase extends AbstractTaskITCase {
                 + "('" + id + "', 'issuesyncope230', 'Surname230', false, 'syncope230@syncope.apache.org', NULL)");
 
         // 2. execute PullTask for resource-db-pull (table TESTPULL on external H2)
-        execProvisioningTask(taskService, TaskType.PULL, "7c2242f4-14af-4ab5-af31-cdae23783655", 50, false);
+        execProvisioningTask(
+                taskService, TaskType.PULL, "7c2242f4-14af-4ab5-af31-cdae23783655", MAX_WAIT_SECONDS, false);
 
         // 3. read e-mail address for user created by the PullTask first execution
         UserTO userTO = userService.read("issuesyncope230");
@@ -896,7 +899,8 @@ public class PullTaskITCase extends AbstractTaskITCase {
         jdbcTemplate.execute("UPDATE TESTPULL SET email='updatedSYNCOPE230@syncope.apache.org' WHERE id='" + id + "'");
 
         // 5. re-execute the PullTask
-        execProvisioningTask(taskService, TaskType.PULL, "7c2242f4-14af-4ab5-af31-cdae23783655", 50, false);
+        execProvisioningTask(
+                taskService, TaskType.PULL, "7c2242f4-14af-4ab5-af31-cdae23783655", MAX_WAIT_SECONDS, false);
 
         // 6. verify that the e-mail was updated
         userTO = userService.read("issuesyncope230");
@@ -967,7 +971,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
         userService.update(userPatch);
 
-        execProvisioningTask(taskService, TaskType.PULL, task.getKey(), 50, false);
+        execProvisioningTask(taskService, TaskType.PULL, task.getKey(), MAX_WAIT_SECONDS, false);
 
         PullTaskTO executed = taskService.read(TaskType.PULL, task.getKey(), true);
         assertEquals(1, executed.getExecutions().size());
@@ -993,7 +997,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
             assertEquals(ExecStatus.SUCCESS, result.getPropagationStatuses().get(0).getStatus());
 
             ExecTO taskExecTO = execProvisioningTask(
-                    taskService, TaskType.PULL, "986867e2-993b-430e-8feb-aa9abb4c1dcd", 50, false);
+                    taskService, TaskType.PULL, "986867e2-993b-430e-8feb-aa9abb4c1dcd", MAX_WAIT_SECONDS, false);
 
             assertNotNull(taskExecTO.getStatus());
             assertEquals(ExecStatus.SUCCESS, ExecStatus.valueOf(taskExecTO.getStatus()));
@@ -1037,7 +1041,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
         taskService.update(TaskType.PULL, task);
 
         // exec task: one user from CSV will match the user created above and template will be applied
-        execProvisioningTask(taskService, TaskType.PULL, task.getKey(), 50, false);
+        execProvisioningTask(taskService, TaskType.PULL, task.getKey(), MAX_WAIT_SECONDS, false);
 
         // check that template was successfully applied...
         userTO = userService.read(userTO.getKey());
@@ -1045,8 +1049,8 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
         // ...and that propagation to db succeeded
         JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource);
-        String value = queryForObject(
-                jdbcTemplate, 50, "SELECT USERNAME FROM testpull WHERE ID=?", String.class, userTO.getKey());
+        String value = queryForObject(jdbcTemplate,
+                MAX_WAIT_SECONDS, "SELECT USERNAME FROM testpull WHERE ID=?", String.class, userTO.getKey());
         assertEquals("virtualvalue", value);
     }
 
@@ -1062,8 +1066,8 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
         // 2. Check that the DB resource has the correct password
         JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource);
-        String value = queryForObject(
-                jdbcTemplate, 50, "SELECT PASSWORD FROM test WHERE ID=?", String.class, user.getUsername());
+        String value = queryForObject(jdbcTemplate,
+                MAX_WAIT_SECONDS, "SELECT PASSWORD FROM test WHERE ID=?", String.class, user.getUsername());
         assertEquals(Encryptor.getInstance().encode("security123", CipherAlgorithm.SHA1), value.toUpperCase());
 
         // 3. Update the password in the DB
@@ -1101,7 +1105,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
         assertEquals(actual.getKey(), pullTask.getKey());
         assertEquals(actual.getJobDelegate(), pullTask.getJobDelegate());
 
-        ExecTO execution = execProvisioningTask(taskService, TaskType.PULL, pullTask.getKey(), 50, false);
+        ExecTO execution = execProvisioningTask(taskService, TaskType.PULL, pullTask.getKey(), MAX_WAIT_SECONDS, false);
         assertEquals(ExecStatus.SUCCESS, ExecStatus.valueOf(execution.getStatus()));
 
         // 5. Test the pulled user
@@ -1186,7 +1190,8 @@ public class PullTaskITCase extends AbstractTaskITCase {
             pullTask = getObject(taskResponse.getLocation(), TaskService.class, PullTaskTO.class);
             assertNotNull(pullTask);
 
-            ExecTO execution = execProvisioningTask(taskService, TaskType.PULL, pullTask.getKey(), 50, false);
+            ExecTO execution = execProvisioningTask(
+                    taskService, TaskType.PULL, pullTask.getKey(), MAX_WAIT_SECONDS, false);
             assertEquals(ExecStatus.SUCCESS, ExecStatus.valueOf(execution.getStatus()));
 
             // 7. Test the pulled user
@@ -1246,7 +1251,8 @@ public class PullTaskITCase extends AbstractTaskITCase {
             assertFalse(pullTask.getTemplates().isEmpty());
 
             // 3. exec the pull task
-            ExecTO execution = execProvisioningTask(taskService, TaskType.PULL, pullTask.getKey(), 50, false);
+            ExecTO execution = execProvisioningTask(
+                    taskService, TaskType.PULL, pullTask.getKey(), MAX_WAIT_SECONDS, false);
             assertEquals(ExecStatus.SUCCESS, ExecStatus.valueOf(execution.getStatus()));
 
             // the user is successfully pulled...
@@ -1282,7 +1288,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
             assertEquals("pullFromLDAP2@syncope.apache.org", connObject.getAttr("mail").get().getValues().get(0));
 
             // 5. exec the pull task again
-            execution = execProvisioningTask(taskService, TaskType.PULL, pullTask.getKey(), 50, false);
+            execution = execProvisioningTask(taskService, TaskType.PULL, pullTask.getKey(), MAX_WAIT_SECONDS, false);
             assertEquals(ExecStatus.SUCCESS, ExecStatus.valueOf(execution.getStatus()));
 
             // the internal is updated...
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java
index 6c3fed5..de6836a 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java
@@ -131,7 +131,8 @@ public class PushTaskITCase extends AbstractTaskITCase {
         assertFalse(groupService.read("29f96485-729e-4d31-88a1-6fc60e4677f3").
                 getResources().contains(RESOURCE_NAME_LDAP));
 
-        execProvisioningTask(taskService, TaskType.PUSH, "fd905ba5-9d56-4f51-83e2-859096a67b75", 50, false);
+        execProvisioningTask(
+                taskService, TaskType.PUSH, "fd905ba5-9d56-4f51-83e2-859096a67b75", MAX_WAIT_SECONDS, false);
 
         assertNotNull(resourceService.readConnObject(
                 RESOURCE_NAME_LDAP, AnyTypeKind.GROUP.name(), "29f96485-729e-4d31-88a1-6fc60e4677f3"));
@@ -156,7 +157,8 @@ public class PushTaskITCase extends AbstractTaskITCase {
         // ------------------------------------------
         // Unmatching --> Assign --> dryRuyn
         // ------------------------------------------
-        execProvisioningTask(taskService, TaskType.PUSH, "af558be4-9d2f-4359-bf85-a554e6e90be1", 50, true);
+        execProvisioningTask(
+                taskService, TaskType.PUSH, "af558be4-9d2f-4359-bf85-a554e6e90be1", MAX_WAIT_SECONDS, true);
         assertEquals(0, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID='vivaldi'").size());
         assertFalse(userService.read("b3cbc78d-32e6-4bd4-92e0-bbe07566a2ee").
                 getResources().contains(RESOURCE_NAME_TESTDB2));
@@ -167,7 +169,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
         pushTaskKeys.add("97f327b6-2eff-4d35-85e8-d581baaab855");
         pushTaskKeys.add("03aa2a04-4881-4573-9117-753f81b04865");
         pushTaskKeys.add("5e5f7c7e-9de7-4c6a-99f1-4df1af959807");
-        execProvisioningTasks(taskService, TaskType.PUSH, pushTaskKeys, 50, false);
+        execProvisioningTasks(taskService, TaskType.PUSH, pushTaskKeys, MAX_WAIT_SECONDS, false);
 
         // ------------------------------------------
         // Unatching --> Ignore
@@ -218,7 +220,8 @@ public class PushTaskITCase extends AbstractTaskITCase {
         // ------------------------------------------
         // Matching --> Deprovision --> dryRuyn
         // ------------------------------------------
-        execProvisioningTask(taskService, TaskType.PUSH, "c46edc3a-a18b-4af2-b707-f4a415507496", 50, true);
+        execProvisioningTask(
+                taskService, TaskType.PUSH, "c46edc3a-a18b-4af2-b707-f4a415507496", MAX_WAIT_SECONDS, true);
         assertTrue(userService.read("1417acbe-cbf6-4277-9372-e75e04f97000").
                 getResources().contains(RESOURCE_NAME_TESTDB2));
         assertEquals(1, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID='rossini'").size());
@@ -229,7 +232,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
         pushTaskKeys.add("c46edc3a-a18b-4af2-b707-f4a415507496");
         pushTaskKeys.add("5e5f7c7e-9de7-4c6a-99f1-4df1af959807");
 
-        execProvisioningTasks(taskService, TaskType.PUSH, pushTaskKeys, 50, false);
+        execProvisioningTasks(taskService, TaskType.PUSH, pushTaskKeys, MAX_WAIT_SECONDS, false);
 
         // ------------------------------------------
         // Matching --> Deprovision && Ignore
@@ -252,7 +255,8 @@ public class PushTaskITCase extends AbstractTaskITCase {
         // ------------------------------------------
         // Matching --> Link
         // ------------------------------------------
-        execProvisioningTask(taskService, TaskType.PUSH, "51318433-cce4-4f71-8f45-9534b6c9c819", 50, false);
+        execProvisioningTask(
+                taskService, TaskType.PUSH, "51318433-cce4-4f71-8f45-9534b6c9c819", MAX_WAIT_SECONDS, false);
         assertTrue(userService.read("74cd8ece-715a-44a4-a736-e17b46c4e7e6").
                 getResources().contains(RESOURCE_NAME_TESTDB2));
         assertEquals(1, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID='verdi'").size());
@@ -262,7 +266,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
         pushTaskKeys.add("24b1be9c-7e3b-443a-86c9-798ebce5eaf2");
         pushTaskKeys.add("375c7b7f-9e3a-4833-88c9-b7787b0a69f2");
 
-        execProvisioningTasks(taskService, TaskType.PUSH, pushTaskKeys, 50, false);
+        execProvisioningTasks(taskService, TaskType.PUSH, pushTaskKeys, MAX_WAIT_SECONDS, false);
 
         // ------------------------------------------
         // Matching --> Unlink && Update
@@ -300,7 +304,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
             assertNotNull(sendVivaldi);
 
             // 3. execute push: vivaldi is found on ldap
-            execProvisioningTask(taskService, TaskType.PUSH, sendVivaldi.getKey(), 50, false);
+            execProvisioningTask(taskService, TaskType.PUSH, sendVivaldi.getKey(), MAX_WAIT_SECONDS, false);
 
             ReconStatus status = reconciliationService.status(
                     new ReconQuery.Builder(AnyTypeKind.USER.name(), RESOURCE_NAME_LDAP).anyKey("vivaldi").build());
@@ -318,7 +322,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
 
             // 5. execute push again: propagation task for CREATE will be generated, but that will fail
             // as task executor is not able any more to identify the entry to UPDATE
-            execProvisioningTask(taskService, TaskType.PUSH, sendVivaldi.getKey(), 50, false);
+            execProvisioningTask(taskService, TaskType.PUSH, sendVivaldi.getKey(), MAX_WAIT_SECONDS, false);
 
             status = reconciliationService.status(
                     new ReconQuery.Builder(AnyTypeKind.USER.name(), RESOURCE_NAME_LDAP).anyKey("vivaldi").build());
@@ -349,7 +353,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
         PushTaskTO pushTask = getObject(response.getLocation(), TaskService.class, PushTaskTO.class);
         assertNotNull(pushTask);
 
-        ExecTO exec = execProvisioningTask(taskService, TaskType.PUSH, pushTask.getKey(), 50, false);
+        ExecTO exec = execProvisioningTask(taskService, TaskType.PUSH, pushTask.getKey(), MAX_WAIT_SECONDS, false);
         assertEquals(ExecStatus.SUCCESS, ExecStatus.valueOf(exec.getStatus()));
 
         // 2. check
@@ -437,7 +441,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
             assertNotNull(push);
 
             // execute the new task
-            ExecTO exec = execProvisioningTask(taskService, TaskType.PUSH, push.getKey(), 50, false);
+            ExecTO exec = execProvisioningTask(taskService, TaskType.PUSH, push.getKey(), MAX_WAIT_SECONDS, false);
             assertEquals(ExecStatus.SUCCESS, ExecStatus.valueOf(exec.getStatus()));
         } finally {
             groupService.delete(groupTO.getKey());
@@ -486,7 +490,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
         notification = getObject(responseNotification.getLocation(), NotificationService.class, NotificationTO.class);
         assertNotNull(notification);
 
-        execProvisioningTask(taskService, TaskType.PUSH, actual.getKey(), 50, false);
+        execProvisioningTask(taskService, TaskType.PUSH, actual.getKey(), MAX_WAIT_SECONDS, false);
 
         NotificationTaskTO taskTO = findNotificationTask(notification.getKey(), 50);
         assertNotNull(taskTO);
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ReportITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ReportITCase.java
index d8c5d27..ba579bd 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ReportITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ReportITCase.java
@@ -69,7 +69,6 @@ public class ReportITCase extends AbstractITCase {
         assertNotNull(exec);
 
         int i = 0;
-        int maxit = 50;
 
         // wait for completion (executions incremented)
         do {
@@ -84,8 +83,8 @@ public class ReportITCase extends AbstractITCase {
             assertNotNull(reportTO.getExecutions());
 
             i++;
-        } while (preExecSize == reportTO.getExecutions().size() && i < maxit);
-        if (i == maxit) {
+        } while (preExecSize == reportTO.getExecutions().size() && i < MAX_WAIT_SECONDS);
+        if (i == MAX_WAIT_SECONDS) {
             fail("Timeout when executing report " + reportKey);
         }
         exec = reportTO.getExecutions().get(reportTO.getExecutions().size() - 1);
@@ -362,7 +361,7 @@ public class ReportITCase extends AbstractITCase {
         ExecTO execution = reportService.execute(new ExecuteQuery.Builder().key(reportTO.getKey()).build());
         assertNotNull(execution);
 
-        int maxit = 50;
+        int maxit = MAX_WAIT_SECONDS;
         do {
             try {
                 Thread.sleep(1000);
@@ -393,7 +392,7 @@ public class ReportITCase extends AbstractITCase {
         }
 
         // Wait for one execution
-        int maxit = 50;
+        int maxit = MAX_WAIT_SECONDS;
         do {
             try {
                 Thread.sleep(1000);
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SchedTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SchedTaskITCase.java
index 24eacad..04c4778 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SchedTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SchedTaskITCase.java
@@ -108,7 +108,6 @@ public class SchedTaskITCase extends AbstractTaskITCase {
         taskService.execute(new ExecuteQuery.Builder().key(task.getKey()).startAt(later).build());
 
         int i = 0;
-        int maxit = 50;
 
         // wait for completion (executions incremented)
         do {
@@ -123,7 +122,7 @@ public class SchedTaskITCase extends AbstractTaskITCase {
             assertNotNull(task.getExecutions());
 
             i++;
-        } while (task.getExecutions().isEmpty() && i < maxit);
+        } while (task.getExecutions().isEmpty() && i < MAX_WAIT_SECONDS);
 
         PagedResult<ExecTO> execs =
                 taskService.listExecutions(new ExecQuery.Builder().key(task.getKey()).build());
@@ -187,7 +186,7 @@ public class SchedTaskITCase extends AbstractTaskITCase {
 
         taskService.actionJob(task.getKey(), JobAction.START);
 
-        int i = 0, maxit = 50;
+        int i = 0;
 
         do {
             try {
@@ -196,9 +195,9 @@ public class SchedTaskITCase extends AbstractTaskITCase {
                 // ignore
             }
 
-            jobs = taskService.listJobs().stream().filter(job -> job.isRunning()).collect(Collectors.toList());
+            jobs = taskService.listJobs().stream().filter(JobTO::isRunning).collect(Collectors.toList());
             i++;
-        } while (jobs.size() < 1 && i < maxit);
+        } while (jobs.size() < 1 && i < MAX_WAIT_SECONDS);
 
         assertEquals(1, jobs.size());
         assertEquals(task.getKey(), jobs.get(0).getRefKey());
@@ -216,7 +215,7 @@ public class SchedTaskITCase extends AbstractTaskITCase {
 
             jobs = taskService.listJobs().stream().filter(job -> job.isRunning()).collect(Collectors.toList());
             i++;
-        } while (jobs.size() >= 1 && i < maxit);
+        } while (jobs.size() >= 1 && i < MAX_WAIT_SECONDS);
 
         assertTrue(jobs.isEmpty());
     }
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java
index 9d2a101..e78d26d 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java
@@ -159,7 +159,7 @@ public class UserIssuesITCase extends AbstractITCase {
 
         JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource);
         String username = queryForObject(
-                jdbcTemplate, 50, "SELECT id FROM test WHERE id=?", String.class, userTO.getUsername());
+                jdbcTemplate, MAX_WAIT_SECONDS, "SELECT id FROM test WHERE id=?", String.class, userTO.getUsername());
         assertEquals(userTO.getUsername(), username);
 
         UserPatch userPatch = new UserPatch();
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserSelfITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserSelfITCase.java
index 2fad213..555f57c 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserSelfITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserSelfITCase.java
@@ -323,8 +323,8 @@ public class UserSelfITCase extends AbstractITCase {
 
         // verify propagation (including password) on external db
         JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource);
-        String pwdOnResource = queryForObject(
-                jdbcTemplate, 50, "SELECT password FROM test WHERE id=?", String.class, user.getUsername());
+        String pwdOnResource = queryForObject(jdbcTemplate,
+                MAX_WAIT_SECONDS, "SELECT password FROM test WHERE id=?", String.class, user.getUsername());
         assertTrue(StringUtils.isNotBlank(pwdOnResource));
 
         // 2. verify that new user is able to authenticate
@@ -377,8 +377,8 @@ public class UserSelfITCase extends AbstractITCase {
         assertNull(read.getToken());
 
         // 7. verify that password was changed on external resource
-        String newPwdOnResource = queryForObject(
-                jdbcTemplate, 50, "SELECT password FROM test WHERE id=?", String.class, user.getUsername());
+        String newPwdOnResource = queryForObject(jdbcTemplate,
+                MAX_WAIT_SECONDS, "SELECT password FROM test WHERE id=?", String.class, user.getUsername());
         assertTrue(StringUtils.isNotBlank(newPwdOnResource));
         assertNotEquals(pwdOnResource, newPwdOnResource);
     }
@@ -612,8 +612,8 @@ public class UserSelfITCase extends AbstractITCase {
         assertEquals("active", userTO.getStatus());
         assertEquals(Collections.singleton(RESOURCE_NAME_TESTDB), userTO.getResources());
 
-        String username = queryForObject(
-                jdbcTemplate, 50, "SELECT id FROM test WHERE id=?", String.class, userTO.getUsername());
+        String username = queryForObject(jdbcTemplate,
+                MAX_WAIT_SECONDS, "SELECT id FROM test WHERE id=?", String.class, userTO.getUsername());
         assertEquals(userTO.getUsername(), username);
 
         // 6. update user
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/VirAttrITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/VirAttrITCase.java
index f57a4ec..14e84b8 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/VirAttrITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/VirAttrITCase.java
@@ -230,14 +230,14 @@ public class VirAttrITCase extends AbstractITCase {
 
         // 3. update virtual attribute directly
         JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource);
-        String value = queryForObject(
-                jdbcTemplate, 50, "SELECT USERNAME FROM testpull WHERE ID=?", String.class, actual.getKey());
+        String value = queryForObject(jdbcTemplate, 
+                MAX_WAIT_SECONDS, "SELECT USERNAME FROM testpull WHERE ID=?", String.class, actual.getKey());
         assertEquals("virattrcache", value);
 
         jdbcTemplate.update("UPDATE testpull set USERNAME='virattrcache2' WHERE ID=?", actual.getKey());
 
-        value = queryForObject(
-                jdbcTemplate, 50, "SELECT USERNAME FROM testpull WHERE ID=?", String.class, actual.getKey());
+        value = queryForObject(jdbcTemplate, 
+                MAX_WAIT_SECONDS, "SELECT USERNAME FROM testpull WHERE ID=?", String.class, actual.getKey());
         assertEquals("virattrcache2", value);
 
         // 4. check for cached attribute value
@@ -388,13 +388,13 @@ public class VirAttrITCase extends AbstractITCase {
         // ----------------------------------------
         JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource);
         String value = queryForObject(
-                jdbcTemplate, 50, "SELECT USERNAME FROM testpull WHERE ID=?", String.class, userTO.getKey());
+                jdbcTemplate, MAX_WAIT_SECONDS, "SELECT USERNAME FROM testpull WHERE ID=?", String.class, userTO.getKey());
         assertEquals("virattrcache", value);
 
         jdbcTemplate.update("UPDATE testpull set USERNAME='virattrcache2' WHERE ID=?", userTO.getKey());
 
         value = queryForObject(
-                jdbcTemplate, 50, "SELECT USERNAME FROM testpull WHERE ID=?", String.class, userTO.getKey());
+                jdbcTemplate, MAX_WAIT_SECONDS, "SELECT USERNAME FROM testpull WHERE ID=?", String.class, userTO.getKey());
         assertEquals("virattrcache2", value);
         // ----------------------------------------
 
diff --git a/src/main/asciidoc/reference-guide/concepts/externalresources.adoc b/src/main/asciidoc/reference-guide/concepts/externalresources.adoc
index 6f91ed6..6a5ebc0 100644
--- a/src/main/asciidoc/reference-guide/concepts/externalresources.adoc
+++ b/src/main/asciidoc/reference-guide/concepts/externalresources.adoc
@@ -221,21 +221,6 @@ example, which leverage the `syncope:fullPath2Dn()` custom JEXL function:
 * Groups: `'cn=' + name + syncope:fullPath2Dn(realm, 'ou', ',') + ',o=isp'`
 ====
 
-[[connectors-resources-history]]
-[NOTE]
-.Connector Instances and External Resources Configuration History Management
-====
-When either developing an IdM solution or managing a production deployment, it often happens to play with
-Connector Instances and / or External Resources configuration; sometimes, this results in failures which prevent
-<<provisioning,provisioning>> to work properly.
-
-In such situations it is possible to revert a Connector Instance's and / or External Resource's configuration to a
-previous working state.
-
-The maximum number of configurations to keep, for each Connector Instance and for each External Resource, is set by
-`connector.conf.history.size` and `resource.conf.history.size`: see <<configuration-parameters, below>> for details.
-====
-
 ==== Linked Accounts
 
 Sometimes the information provided by the <<mapping,mapping>> is not enough to define a one-to-one correspondence
diff --git a/src/main/asciidoc/reference-guide/workingwithapachesyncope/systemadministration/configurationparameters.adoc b/src/main/asciidoc/reference-guide/workingwithapachesyncope/systemadministration/configurationparameters.adoc
index 559a9de..5aa46a5 100644
--- a/src/main/asciidoc/reference-guide/workingwithapachesyncope/systemadministration/configurationparameters.adoc
+++ b/src/main/asciidoc/reference-guide/workingwithapachesyncope/systemadministration/configurationparameters.adoc
@@ -57,10 +57,6 @@ mechanism to work properly;
 Suspended Users are anyway not allowed to authenticate.
 * `log.lastlogindate` - whether the system updates the `lastLoginDate` field of users upon authentication;
 * `return.password.value` - whether the hashed password value shall be returned when reading users;
-* `connector.conf.history.size` - how many previous configurations shall be kept for each Connector Instance,
-for usage with <<connectors-resources-history, connectors and resources configuration history management>>;
-* `resource.conf.history.size` - how many previous configurations shall be kept for each External Resource,
-for usage with <<connectors-resources-history, connectors and resources configuration history management>>;
 * `connector.test.timeout` - timeout (in seconds) to check connector connection in <<Admin Console>>;
 `0` to skip any check;