You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2020/01/03 12:06:42 UTC

[syncope] branch master updated (4f63cab -> 91c7ae5)

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

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


    from 4f63cab  [SYNCOPE-1531] Core support
     new 1430767  Upgrading Swagger Core
     new 91c7ae5  [SYNCOPE-1531] Console support

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../client/console/SyncopeIdMConsoleContext.java   |  21 +-
 ...rectoryPanelAdditionalActionLinksProvider.java} |   4 +-
 ...AnyDirectoryPanelAdditionalActionsProvider.java | 156 ++++++++++++
 .../client/console/panels/CSVConfPanel.java        | 106 ++++++++
 .../console/rest/ReconciliationRestClient.java     |  35 +++
 .../console/topology/TopologyTogglePanel.java      |   8 +-
 .../console/wizards/CSVPullWizardBuilder.java      | 273 +++++++++++++++++++++
 .../console/wizards/CSVPushWizardBuilder.java      | 133 ++++++++++
 .../resources/ItemTransformersTogglePanel.java     |   3 +-
 .../resources/JEXLTransformersTogglePanel.java     |   3 +-
 .../client/console/panels/CSVConfPanel.html        |  29 +++
 .../client/console/panels/CSVConfPanel.properties  |  23 ++
 .../console/panels/CSVConfPanel_fr_CA.properties   |  23 ++
 .../console/panels/CSVConfPanel_it.properties      |  23 ++
 .../console/panels/CSVConfPanel_ja.properties      |  23 ++
 .../console/panels/CSVConfPanel_pt_BR.properties   |  23 ++
 .../console/panels/CSVConfPanel_ru.properties      |  23 ++
 .../wizards/CSVPullWizardBuilder$Columns.html      |  36 +++
 .../CSVPullWizardBuilder$Columns.properties        |  19 ++
 .../CSVPullWizardBuilder$Columns_fr_CA.properties  |  19 ++
 .../CSVPullWizardBuilder$Columns_it.properties     |  19 ++
 .../CSVPullWizardBuilder$Columns_ja.properties     |  19 ++
 .../CSVPullWizardBuilder$Columns_pt_BR.properties  |  19 ++
 .../CSVPullWizardBuilder$Columns_ru.properties     |  19 ++
 .../wizards/CSVPullWizardBuilder$Details.html      |  29 +++
 .../CSVPullWizardBuilder$Details.properties        |  17 ++
 .../CSVPullWizardBuilder$Details_fr_CA.properties  |  17 ++
 .../CSVPullWizardBuilder$Details_it.properties     |  17 ++
 .../CSVPullWizardBuilder$Details_ja.properties     |  17 ++
 .../CSVPullWizardBuilder$Details_pt_BR.properties  |  17 ++
 .../CSVPullWizardBuilder$Details_ru.properties     |  17 ++
 .../wizards/CSVPullWizardBuilder$PullTask.html     |  32 +++
 .../CSVPullWizardBuilder$PullTask.properties       |  22 ++
 .../CSVPullWizardBuilder$PullTask_fr_CA.properties |  22 ++
 .../CSVPullWizardBuilder$PullTask_it.properties    |  22 ++
 .../CSVPullWizardBuilder$PullTask_ja.properties    |  22 ++
 .../CSVPullWizardBuilder$PullTask_pt_BR.properties |  22 ++
 .../CSVPullWizardBuilder$PullTask_ru.properties    |  22 ++
 .../wizards/CSVPushWizardBuilder$Details.html      |  25 ++
 .../wizards/CSVPushWizardBuilder$PushTask.html     |  30 +++
 .../CSVPushWizardBuilder$PushTask.properties       |  20 ++
 .../CSVPushWizardBuilder$PushTask_fr_CA.properties |  20 ++
 .../CSVPushWizardBuilder$PushTask_it.properties    |  20 ++
 .../CSVPushWizardBuilder$PushTask_ja.properties    |  20 ++
 .../CSVPushWizardBuilder$PushTask_pt_BR.properties |  20 ++
 .../CSVPushWizardBuilder$PushTask_ru.properties    |  20 ++
 .../syncope/client/ui/commons/BaseSession.java     |   5 +-
 .../syncope/client/ui/commons/Constants.java       |   4 +
 .../ui/commons/wizards/AjaxWizardBuilder.java      |   3 +-
 .../syncope/client/console/PreferenceManager.java  |  20 +-
 .../client/console/SerializableSupplier.java}      |  23 +-
 .../client/console/SyncopeConsoleApplication.java  |  24 +-
 .../client/console/SyncopeConsoleSession.java      |  17 +-
 .../client/console/SyncopeWebApplication.java      |  24 +-
 ...rectoryPanelAdditionalActionLinksProvider.java} |   2 +-
 ...nyDirectoryPanelAdditionalActionsProvider.java} |  35 +--
 ...rectoryPanelAdditionalActionLinksProvider.java} |   4 +-
 ...AnyDirectoryPanelAdditionalActionsProvider.java |  45 ++++
 .../init/ClassPathScanImplementationLookup.java    |   4 +-
 .../notifications/MailTemplateDirectoryPanel.java  |   2 +-
 .../notifications/NotificationDirectoryPanel.java  |   5 +-
 .../console/panels/ActionDataTablePanel.java       |   6 +-
 .../client/console/panels/AnyDirectoryPanel.java   |  57 +++--
 .../console/panels/AnyObjectDirectoryPanel.java    |   2 +-
 .../console/panels/ApplicationDirectoryPanel.java  |   2 +-
 .../client/console/panels/DirectoryPanel.java      |  13 +-
 .../panels/DisplayAttributesModalPanel.java        |  18 +-
 .../console/panels/DomainDirectoryPanel.java       |   2 +-
 .../client/console/panels/GroupDirectoryPanel.java |   6 +-
 .../client/console/panels/ListViewPanel.java       |  12 +-
 .../client/console/panels/MembersTogglePanel.java  |   3 +-
 .../client/console/panels/RoleDirectoryPanel.java  |   4 +-
 .../client/console/panels/UserDirectoryPanel.java  |   2 +-
 .../console/policies/PolicyDirectoryPanel.java     |   4 +-
 .../console/reports/ReportExecutionDetails.java    |  64 ++---
 .../reports/ReportTemplateDirectoryPanel.java      |   2 +-
 ...loadBehavior.java => AjaxDownloadBehavior.java} |  38 ++-
 .../wicket/markup/html/form/ActionPanel.java       |  10 +-
 .../markup/html/form/AjaxCharacterFieldPanel.java  | 134 ++++++++++
 .../console/wizards/BaseAjaxWizardBuilder.java     |   2 +-
 .../client/console/wizards/WizardMgtPanel.java     |   2 +-
 .../client/console/wizards/any/ResultPage.java     |   8 +-
 .../client/console/panels/AnyDirectoryPanel.html   |  30 +++
 .../console/panels/AnyDirectoryPanel.properties    |  20 ++
 .../panels/AnyDirectoryPanel_fr_CA.properties      |  20 ++
 .../console/panels/AnyDirectoryPanel_it.properties |  20 ++
 .../console/panels/AnyDirectoryPanel_ja.properties |  20 ++
 .../panels/AnyDirectoryPanel_pt_BR.properties      |  20 ++
 .../console/panels/AnyDirectoryPanel_ru.properties |  20 ++
 .../markup/html/form/AjaxCharacterFieldPanel.html} |   0
 .../syncope/client/console/AbstractTest.java       |  21 +-
 .../client/enduser/SyncopeEnduserSession.java      |  19 +-
 .../client/enduser/pages/WizardMgtPanel.html       |   6 +-
 .../common/rest/api/beans/AbstractCSVSpec.java     |   5 +-
 .../syncope/common/rest/api/beans/CSVPullSpec.java |   2 +
 .../syncope/common/rest/api/beans/CSVPushSpec.java |   2 +
 .../syncope/common/rest/api/RESTHeaders.java       |   5 +
 .../client/console/rest/BpmnProcessRestClient.java |  22 +-
 .../client/enduser/rest/BpmnProcessRestClient.java |   8 +-
 .../client/console/rest/SAML2IdPsRestClient.java   |  11 +-
 .../apache/syncope/fit/console/GroupsITCase.java   |   8 +-
 pom.xml                                            |   2 +-
 102 files changed, 2108 insertions(+), 290 deletions(-)
 rename client/idm/console/src/main/java/org/apache/syncope/client/console/commons/{IdMAnyDirectoryPanelAditionalActionLinksProvider.java => IdMAnyDirectoryPanelAdditionalActionLinksProvider.java} (98%)
 create mode 100644 client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMAnyDirectoryPanelAdditionalActionsProvider.java
 create mode 100644 client/idm/console/src/main/java/org/apache/syncope/client/console/panels/CSVConfPanel.java
 create mode 100644 client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder.java
 create mode 100644 client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder.java
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel.html
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel_fr_CA.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel_it.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel_ja.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel_pt_BR.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel_ru.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns.html
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns_fr_CA.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns_it.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns_ja.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns_pt_BR.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns_ru.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details.html
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details_fr_CA.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details_it.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details_ja.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details_pt_BR.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details_ru.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask.html
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask_fr_CA.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask_it.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask_ja.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask_pt_BR.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask_ru.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$Details.html
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask.html
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask_fr_CA.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask_it.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask_ja.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask_pt_BR.properties
 create mode 100644 client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask_ru.properties
 copy client/idrepo/{common-ui/src/main/java/org/apache/syncope/client/ui/commons/BaseSession.java => console/src/main/java/org/apache/syncope/client/console/SerializableSupplier.java} (64%)
 copy client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/{AnyDirectoryPanelAditionalActionLinksProvider.java => AnyDirectoryPanelAdditionalActionLinksProvider.java} (95%)
 rename client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/{AnyDirectoryPanelAditionalActionLinksProvider.java => AnyDirectoryPanelAdditionalActionsProvider.java} (53%)
 rename client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/{IdRepoAnyDirectoryPanelAditionalActionLinksProvider.java => IdRepoAnyDirectoryPanelAdditionalActionLinksProvider.java} (94%)
 create mode 100644 client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/IdRepoAnyDirectoryPanelAdditionalActionsProvider.java
 rename client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/form/{AbstractAjaxDownloadBehavior.java => AjaxDownloadBehavior.java} (67%)
 create mode 100644 client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxCharacterFieldPanel.java
 create mode 100644 client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel.html
 create mode 100644 client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel.properties
 create mode 100644 client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel_fr_CA.properties
 create mode 100644 client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel_it.properties
 create mode 100644 client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel_ja.properties
 create mode 100644 client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel_pt_BR.properties
 create mode 100644 client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel_ru.properties
 copy client/idrepo/{common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxTextFieldPanel.html => console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxCharacterFieldPanel.html} (100%)


[syncope] 01/02: Upgrading Swagger Core

Posted by il...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 1430767c8a5069175f412428b3e101eba1deccce
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Thu Jan 2 17:54:53 2020 +0100

    Upgrading Swagger Core
---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index ed2b67a..5c2ac1d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -459,7 +459,7 @@ under the License.
     <connid.location>file:${bundles.directory}/</connid.location>
     <log.directory>${project.build.directory}/log</log.directory>
 
-    <swagger-core.version>2.1.0</swagger-core.version>    
+    <swagger-core.version>2.1.1</swagger-core.version>    
     <swagger-ui.version>3.24.3</swagger-ui.version>
     <guava.version>20.0</guava.version>
 


[syncope] 02/02: [SYNCOPE-1531] Console support

Posted by il...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 91c7ae52d57361ab3a2585e1d71e43bf9ff0e3e5
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Thu Jan 2 17:41:26 2020 +0100

    [SYNCOPE-1531] Console support
---
 .../client/console/SyncopeIdMConsoleContext.java   |  21 +-
 ...rectoryPanelAdditionalActionLinksProvider.java} |   4 +-
 ...AnyDirectoryPanelAdditionalActionsProvider.java | 156 ++++++++++++
 .../client/console/panels/CSVConfPanel.java        | 106 ++++++++
 .../console/rest/ReconciliationRestClient.java     |  35 +++
 .../console/topology/TopologyTogglePanel.java      |   8 +-
 .../console/wizards/CSVPullWizardBuilder.java      | 273 +++++++++++++++++++++
 .../console/wizards/CSVPushWizardBuilder.java      | 133 ++++++++++
 .../resources/ItemTransformersTogglePanel.java     |   3 +-
 .../resources/JEXLTransformersTogglePanel.java     |   3 +-
 .../client/console/panels/CSVConfPanel.html        |  29 +++
 .../client/console/panels/CSVConfPanel.properties  |  23 ++
 .../console/panels/CSVConfPanel_fr_CA.properties   |  23 ++
 .../console/panels/CSVConfPanel_it.properties      |  23 ++
 .../console/panels/CSVConfPanel_ja.properties      |  23 ++
 .../console/panels/CSVConfPanel_pt_BR.properties   |  23 ++
 .../console/panels/CSVConfPanel_ru.properties      |  23 ++
 .../wizards/CSVPullWizardBuilder$Columns.html      |  36 +++
 .../CSVPullWizardBuilder$Columns.properties        |  19 ++
 .../CSVPullWizardBuilder$Columns_fr_CA.properties  |  19 ++
 .../CSVPullWizardBuilder$Columns_it.properties     |  19 ++
 .../CSVPullWizardBuilder$Columns_ja.properties     |  19 ++
 .../CSVPullWizardBuilder$Columns_pt_BR.properties  |  19 ++
 .../CSVPullWizardBuilder$Columns_ru.properties     |  19 ++
 .../wizards/CSVPullWizardBuilder$Details.html      |  29 +++
 .../CSVPullWizardBuilder$Details.properties        |  17 ++
 .../CSVPullWizardBuilder$Details_fr_CA.properties  |  17 ++
 .../CSVPullWizardBuilder$Details_it.properties     |  17 ++
 .../CSVPullWizardBuilder$Details_ja.properties     |  17 ++
 .../CSVPullWizardBuilder$Details_pt_BR.properties  |  17 ++
 .../CSVPullWizardBuilder$Details_ru.properties     |  17 ++
 .../wizards/CSVPullWizardBuilder$PullTask.html     |  32 +++
 .../CSVPullWizardBuilder$PullTask.properties       |  22 ++
 .../CSVPullWizardBuilder$PullTask_fr_CA.properties |  22 ++
 .../CSVPullWizardBuilder$PullTask_it.properties    |  22 ++
 .../CSVPullWizardBuilder$PullTask_ja.properties    |  22 ++
 .../CSVPullWizardBuilder$PullTask_pt_BR.properties |  22 ++
 .../CSVPullWizardBuilder$PullTask_ru.properties    |  22 ++
 .../wizards/CSVPushWizardBuilder$Details.html      |  25 ++
 .../wizards/CSVPushWizardBuilder$PushTask.html     |  30 +++
 .../CSVPushWizardBuilder$PushTask.properties       |  20 ++
 .../CSVPushWizardBuilder$PushTask_fr_CA.properties |  20 ++
 .../CSVPushWizardBuilder$PushTask_it.properties    |  20 ++
 .../CSVPushWizardBuilder$PushTask_ja.properties    |  20 ++
 .../CSVPushWizardBuilder$PushTask_pt_BR.properties |  20 ++
 .../CSVPushWizardBuilder$PushTask_ru.properties    |  20 ++
 .../syncope/client/ui/commons/BaseSession.java     |   5 +-
 .../syncope/client/ui/commons/Constants.java       |   4 +
 .../ui/commons/wizards/AjaxWizardBuilder.java      |   3 +-
 .../syncope/client/console/PreferenceManager.java  |  20 +-
 .../client/console/SerializableSupplier.java}      |  23 +-
 .../client/console/SyncopeConsoleApplication.java  |  24 +-
 .../client/console/SyncopeConsoleSession.java      |  17 +-
 .../client/console/SyncopeWebApplication.java      |  24 +-
 ...rectoryPanelAdditionalActionLinksProvider.java} |   2 +-
 ...nyDirectoryPanelAdditionalActionsProvider.java} |  35 +--
 ...rectoryPanelAdditionalActionLinksProvider.java} |   4 +-
 ...AnyDirectoryPanelAdditionalActionsProvider.java |  45 ++++
 .../init/ClassPathScanImplementationLookup.java    |   4 +-
 .../notifications/MailTemplateDirectoryPanel.java  |   2 +-
 .../notifications/NotificationDirectoryPanel.java  |   5 +-
 .../console/panels/ActionDataTablePanel.java       |   6 +-
 .../client/console/panels/AnyDirectoryPanel.java   |  57 +++--
 .../console/panels/AnyObjectDirectoryPanel.java    |   2 +-
 .../console/panels/ApplicationDirectoryPanel.java  |   2 +-
 .../client/console/panels/DirectoryPanel.java      |  13 +-
 .../panels/DisplayAttributesModalPanel.java        |  18 +-
 .../console/panels/DomainDirectoryPanel.java       |   2 +-
 .../client/console/panels/GroupDirectoryPanel.java |   6 +-
 .../client/console/panels/ListViewPanel.java       |  12 +-
 .../client/console/panels/MembersTogglePanel.java  |   3 +-
 .../client/console/panels/RoleDirectoryPanel.java  |   4 +-
 .../client/console/panels/UserDirectoryPanel.java  |   2 +-
 .../console/policies/PolicyDirectoryPanel.java     |   4 +-
 .../console/reports/ReportExecutionDetails.java    |  64 ++---
 .../reports/ReportTemplateDirectoryPanel.java      |   2 +-
 ...loadBehavior.java => AjaxDownloadBehavior.java} |  38 ++-
 .../wicket/markup/html/form/ActionPanel.java       |  10 +-
 .../markup/html/form/AjaxCharacterFieldPanel.java  | 134 ++++++++++
 .../console/wizards/BaseAjaxWizardBuilder.java     |   2 +-
 .../client/console/wizards/WizardMgtPanel.java     |   2 +-
 .../client/console/wizards/any/ResultPage.java     |   8 +-
 .../client/console/panels/AnyDirectoryPanel.html   |  30 +++
 .../console/panels/AnyDirectoryPanel.properties    |  20 ++
 .../panels/AnyDirectoryPanel_fr_CA.properties      |  20 ++
 .../console/panels/AnyDirectoryPanel_it.properties |  20 ++
 .../console/panels/AnyDirectoryPanel_ja.properties |  20 ++
 .../panels/AnyDirectoryPanel_pt_BR.properties      |  20 ++
 .../console/panels/AnyDirectoryPanel_ru.properties |  20 ++
 .../markup/html/form/AjaxCharacterFieldPanel.html  |  30 +++
 .../syncope/client/console/AbstractTest.java       |  21 +-
 .../client/enduser/SyncopeEnduserSession.java      |  19 +-
 .../client/enduser/pages/WizardMgtPanel.html       |   6 +-
 .../common/rest/api/beans/AbstractCSVSpec.java     |   5 +-
 .../syncope/common/rest/api/beans/CSVPullSpec.java |   2 +
 .../syncope/common/rest/api/beans/CSVPushSpec.java |   2 +
 .../syncope/common/rest/api/RESTHeaders.java       |   5 +
 .../client/console/rest/BpmnProcessRestClient.java |  22 +-
 .../client/enduser/rest/BpmnProcessRestClient.java |   8 +-
 .../client/console/rest/SAML2IdPsRestClient.java   |  11 +-
 .../apache/syncope/fit/console/GroupsITCase.java   |   8 +-
 101 files changed, 2137 insertions(+), 289 deletions(-)

diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/SyncopeIdMConsoleContext.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/SyncopeIdMConsoleContext.java
index 5e3f387..6f9e87a 100644
--- a/client/idm/console/src/main/java/org/apache/syncope/client/console/SyncopeIdMConsoleContext.java
+++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/SyncopeIdMConsoleContext.java
@@ -18,10 +18,11 @@
  */
 package org.apache.syncope.client.console;
 
-import org.apache.syncope.client.console.commons.AnyDirectoryPanelAditionalActionLinksProvider;
+import org.apache.syncope.client.console.commons.AnyDirectoryPanelAdditionalActionsProvider;
 import org.apache.syncope.client.console.commons.AnyWizardBuilderAdditionalSteps;
 import org.apache.syncope.client.console.commons.ExternalResourceProvider;
-import org.apache.syncope.client.console.commons.IdMAnyDirectoryPanelAditionalActionLinksProvider;
+import org.apache.syncope.client.console.commons.IdMAnyDirectoryPanelAdditionalActionsProvider;
+import org.apache.syncope.client.console.commons.IdMAnyDirectoryPanelAdditionalActionLinksProvider;
 import org.apache.syncope.client.console.commons.IdMAnyWizardBuilderAdditionalSteps;
 import org.apache.syncope.client.console.commons.IdMExternalResourceProvider;
 import org.apache.syncope.client.console.commons.IdMImplementationInfoProvider;
@@ -34,6 +35,7 @@ import org.apache.syncope.client.console.commons.StatusProvider;
 import org.apache.syncope.client.console.commons.VirSchemaDetailsPanelProvider;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.apache.syncope.client.console.commons.AnyDirectoryPanelAdditionalActionLinksProvider;
 
 @Configuration
 public class SyncopeIdMConsoleContext {
@@ -44,6 +46,16 @@ public class SyncopeIdMConsoleContext {
     }
 
     @Bean
+    public AnyDirectoryPanelAdditionalActionsProvider anyDirectoryPanelAdditionalActionsProvider() {
+        return new IdMAnyDirectoryPanelAdditionalActionsProvider();
+    }
+
+    @Bean
+    public AnyDirectoryPanelAdditionalActionLinksProvider anyDirectoryPanelAdditionalActionLinksProvider() {
+        return new IdMAnyDirectoryPanelAdditionalActionLinksProvider();
+    }
+
+    @Bean
     public AnyWizardBuilderAdditionalSteps anyWizardBuilderAdditionalSteps() {
         return new IdMAnyWizardBuilderAdditionalSteps();
     }
@@ -59,11 +71,6 @@ public class SyncopeIdMConsoleContext {
     }
 
     @Bean
-    public AnyDirectoryPanelAditionalActionLinksProvider anyDirectoryPanelAditionalActionLinksProvider() {
-        return new IdMAnyDirectoryPanelAditionalActionLinksProvider();
-    }
-
-    @Bean
     public ImplementationInfoProvider implementationInfoProvider() {
         return new IdMImplementationInfoProvider();
     }
diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMAnyDirectoryPanelAditionalActionLinksProvider.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMAnyDirectoryPanelAdditionalActionLinksProvider.java
similarity index 98%
rename from client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMAnyDirectoryPanelAditionalActionLinksProvider.java
rename to client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMAnyDirectoryPanelAdditionalActionLinksProvider.java
index 2982849..8b43f4c 100644
--- a/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMAnyDirectoryPanelAditionalActionLinksProvider.java
+++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMAnyDirectoryPanelAdditionalActionLinksProvider.java
@@ -38,8 +38,8 @@ import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 
-public class IdMAnyDirectoryPanelAditionalActionLinksProvider
-        implements AnyDirectoryPanelAditionalActionLinksProvider {
+public class IdMAnyDirectoryPanelAdditionalActionLinksProvider
+        implements AnyDirectoryPanelAdditionalActionLinksProvider {
 
     private static final long serialVersionUID = -1698293704237878993L;
 
diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMAnyDirectoryPanelAdditionalActionsProvider.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMAnyDirectoryPanelAdditionalActionsProvider.java
new file mode 100644
index 0000000..c6abd9d
--- /dev/null
+++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMAnyDirectoryPanelAdditionalActionsProvider.java
@@ -0,0 +1,156 @@
+/*
+ * 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.commons;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import org.apache.syncope.client.console.PreferenceManager;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.pages.BasePage;
+import org.apache.syncope.client.console.panels.AnyDirectoryPanel;
+import org.apache.syncope.client.console.panels.DisplayAttributesModalPanel;
+import org.apache.syncope.client.console.wicket.ajax.form.AjaxDownloadBehavior;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.client.console.wizards.CSVPullWizardBuilder;
+import org.apache.syncope.client.console.wizards.CSVPushWizardBuilder;
+import org.apache.syncope.client.ui.commons.Constants;
+import org.apache.syncope.client.ui.commons.wizards.AjaxWizard;
+import org.apache.syncope.common.rest.api.beans.AnyQuery;
+import org.apache.syncope.common.rest.api.beans.CSVPullSpec;
+import org.apache.syncope.common.rest.api.beans.CSVPushSpec;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.event.IEvent;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.StringResourceModel;
+
+public class IdMAnyDirectoryPanelAdditionalActionsProvider implements AnyDirectoryPanelAdditionalActionsProvider {
+
+    private static final long serialVersionUID = -6768727277642238924L;
+
+    @Override
+    public void add(
+            final AnyDirectoryPanel<?, ?> panel,
+            final BaseModal<?> modal,
+            final WebMarkupContainer container,
+            final String type,
+            final String realm,
+            final String fiql,
+            final List<String> pSchemaNames,
+            final List<String> dSchemaNames,
+            final PageReference pageRef) {
+
+        AjaxDownloadBehavior csvDownloadBehavior = new AjaxDownloadBehavior();
+        WebMarkupContainer csvEventSink = new WebMarkupContainer(Constants.OUTER) {
+
+            private static final long serialVersionUID = -957948639666058749L;
+
+            @Override
+            public void onEvent(final IEvent<?> event) {
+                if (event.getPayload() instanceof AjaxWizard.NewItemCancelEvent) {
+                    AjaxRequestTarget target = ((AjaxWizard.NewItemCancelEvent) event.getPayload()).getTarget();
+                    modal.close(target);
+                } else if (event.getPayload() instanceof AjaxWizard.NewItemFinishEvent) {
+                    AjaxWizard.NewItemFinishEvent<?> payload = (AjaxWizard.NewItemFinishEvent) event.getPayload();
+                    if (Constants.OPERATION_SUCCEEDED.equals(payload.getResult())) {
+                        AjaxRequestTarget target = payload.getTarget();
+
+                        if (csvDownloadBehavior.hasResponse()) {
+                            csvDownloadBehavior.initiate(target);
+                        }
+
+                        SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
+                        ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
+
+                        target.add(container);
+                        modal.close(target);
+                    }
+                }
+            }
+        };
+        csvEventSink.add(csvDownloadBehavior);
+        panel.addOuterObject(csvEventSink);
+        panel.addInnerObject(new AjaxLink<Void>("csvPush") {
+
+            private static final long serialVersionUID = -817438685948164787L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target) {
+                CSVPushSpec spec = csvPushSpec(type, panel, pSchemaNames, dSchemaNames);
+                AnyQuery query = csvAnyQuery(realm, fiql);
+
+                target.add(modal.setContent(new CSVPushWizardBuilder(spec, query, csvDownloadBehavior, pageRef).
+                        setEventSink(csvEventSink).
+                        build(BaseModal.CONTENT_ID, AjaxWizard.Mode.EDIT)));
+
+                modal.header(new StringResourceModel("csvPush", panel, Model.of(spec)));
+                modal.show(true);
+            }
+        });
+        panel.addInnerObject(new AjaxLink<Void>("csvPull") {
+
+            private static final long serialVersionUID = -817438685948164787L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target) {
+                CSVPullSpec spec = csvPullSpec(type, realm);
+
+                target.add(modal.setContent(new CSVPullWizardBuilder(spec, pageRef).
+                        setEventSink(csvEventSink).
+                        build(BaseModal.CONTENT_ID, AjaxWizard.Mode.EDIT)));
+
+                modal.header(new StringResourceModel("csvPull", panel, Model.of(spec)));
+                modal.show(true);
+            }
+        });
+    }
+
+    protected CSVPushSpec csvPushSpec(
+            final String type,
+            final AnyDirectoryPanel<?, ?> panel,
+            final List<String> pSchemaNames,
+            final List<String> dSchemaNames) {
+
+        CSVPushSpec spec = new CSVPushSpec.Builder(type).build();
+        spec.setFields(PreferenceManager.getList(panel.getRequest(),
+                DisplayAttributesModalPanel.getPrefDetailView(type)).
+                stream().filter(name -> !Constants.KEY_FIELD_NAME.equalsIgnoreCase(name)).
+                collect(Collectors.toList()));
+        spec.setPlainAttrs(PreferenceManager.getList(
+                panel.getRequest(), DisplayAttributesModalPanel.getPrefPlainAttributeView(type)).
+                stream().filter(name -> pSchemaNames.contains(name)).collect(Collectors.toList()));
+        spec.setDerAttrs(PreferenceManager.getList(panel.getRequest(),
+                DisplayAttributesModalPanel.getPrefPlainAttributeView(type)).
+                stream().filter(name -> dSchemaNames.contains(name)).collect(Collectors.toList()));
+        return spec;
+    }
+
+    protected CSVPullSpec csvPullSpec(final String type, final String realm) {
+        CSVPullSpec spec = new CSVPullSpec();
+        spec.setAnyTypeKey(type);
+        spec.setDestinationRealm(realm);
+        return spec;
+    }
+
+    protected AnyQuery csvAnyQuery(final String realm, final String fiql) {
+        return new AnyQuery.Builder().realm(realm).fiql(fiql).build();
+    }
+}
diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/panels/CSVConfPanel.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/panels/CSVConfPanel.java
new file mode 100644
index 0000000..a5e4f0c
--- /dev/null
+++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/panels/CSVConfPanel.java
@@ -0,0 +1,106 @@
+/*
+ * 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.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxCharacterFieldPanel;
+import org.apache.syncope.client.console.wizards.CSVPullWizardBuilder;
+import org.apache.syncope.client.ui.commons.markup.html.form.AjaxCheckBoxPanel;
+import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDropDownChoicePanel;
+import org.apache.syncope.client.ui.commons.markup.html.form.AjaxTextFieldPanel;
+import org.apache.syncope.common.rest.api.beans.AbstractCSVSpec;
+import org.apache.wicket.markup.html.form.IChoiceRenderer;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.validation.validator.StringValidator;
+
+public class CSVConfPanel extends Panel {
+
+    private static final long serialVersionUID = -1562409114958459620L;
+
+    public CSVConfPanel(final String id, final AbstractCSVSpec spec) {
+        super(id);
+
+        AjaxCharacterFieldPanel columnSeparator = new AjaxCharacterFieldPanel(
+                "columnSeparator", "columnSeparator", new PropertyModel<>(spec, "columnSeparator"));
+        columnSeparator.setChoices(Arrays.asList(',', ';', ' '));
+        columnSeparator.setRequired(true);
+        add(columnSeparator);
+
+        AjaxTextFieldPanel arrayElementSeparator = new AjaxTextFieldPanel(
+                "arrayElementSeparator", "arrayElementSeparator",
+                new PropertyModel<>(spec, "arrayElementSeparator"));
+        arrayElementSeparator.setChoices(Arrays.asList(";"));
+        arrayElementSeparator.setRequired(true);
+        arrayElementSeparator.addValidator(new StringValidator(1, 1));
+        add(arrayElementSeparator);
+
+        AjaxCharacterFieldPanel quoteChar = new AjaxCharacterFieldPanel(
+                "quoteChar", "quoteChar", new PropertyModel<>(spec, "quoteChar"));
+        quoteChar.setChoices(Arrays.asList('"'));
+        quoteChar.setRequired(true);
+        add(quoteChar);
+
+        AjaxCharacterFieldPanel escapeChar = new AjaxCharacterFieldPanel(
+                "escapeChar", "escapeChar", new PropertyModel<>(spec, "escapeChar"));
+        escapeChar.setRequired(false);
+        add(escapeChar);
+
+        AjaxDropDownChoicePanel<String> lineSeparator = new AjaxDropDownChoicePanel<>(
+                "lineSeparator", "lineSeparator", new PropertyModel<>(spec, "lineSeparator"), false);
+        lineSeparator.setChoices(Stream.of(CSVPullWizardBuilder.LineSeparator.values()).
+                map(CSVPullWizardBuilder.LineSeparator::name).collect(Collectors.toList()));
+        lineSeparator.setChoiceRenderer(new IChoiceRenderer<String>() {
+
+            private static final long serialVersionUID = 8551710814349123350L;
+
+            @Override
+            public Object getDisplayValue(final String object) {
+                return CSVPullWizardBuilder.LineSeparator.valueOf(object).name();
+            }
+
+            @Override
+            public String getIdValue(final String object, final int index) {
+                return object;
+            }
+
+            @Override
+            public String getObject(
+                    final String id, final IModel<? extends List<? extends String>> choices) {
+
+                return CSVPullWizardBuilder.LineSeparator.valueOf(id).getRepr();
+            }
+        });
+        lineSeparator.setRequired(true);
+        add(lineSeparator);
+
+        AjaxTextFieldPanel nullValue = new AjaxTextFieldPanel(
+                "nullValue", "nullValue", new PropertyModel<>(spec, "nullValue"));
+        nullValue.setRequired(false);
+        add(nullValue);
+
+        AjaxCheckBoxPanel allowComments = new AjaxCheckBoxPanel(
+                "allowComments", "allowComments", new PropertyModel<>(spec, "allowComments"), true);
+        add(allowComments);
+    }
+}
diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/rest/ReconciliationRestClient.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/rest/ReconciliationRestClient.java
index 4d7f94c..3855eb7 100644
--- a/client/idm/console/src/main/java/org/apache/syncope/client/console/rest/ReconciliationRestClient.java
+++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/rest/ReconciliationRestClient.java
@@ -18,9 +18,20 @@
  */
 package org.apache.syncope.client.console.rest;
 
+import java.io.InputStream;
+import java.util.List;
+import javax.ws.rs.core.Response;
+import org.apache.cxf.jaxrs.client.Client;
+import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.common.lib.to.ProvisioningReport;
 import org.apache.syncope.common.lib.to.PullTaskTO;
 import org.apache.syncope.common.lib.to.PushTaskTO;
 import org.apache.syncope.common.lib.to.ReconStatus;
+import org.apache.syncope.common.rest.api.RESTHeaders;
+import org.apache.syncope.common.rest.api.beans.AnyQuery;
+import org.apache.syncope.common.rest.api.beans.CSVPullSpec;
+import org.apache.syncope.common.rest.api.beans.CSVPushSpec;
 import org.apache.syncope.common.rest.api.beans.ReconQuery;
 import org.apache.syncope.common.rest.api.service.ReconciliationService;
 
@@ -39,4 +50,28 @@ public class ReconciliationRestClient extends BaseRestClient {
     public static void pull(final ReconQuery reconQuery, final PullTaskTO pullTask) {
         getService(ReconciliationService.class).pull(reconQuery, pullTask);
     }
+
+    public static Response push(final AnyQuery anyQuery, final CSVPushSpec spec) {
+        ReconciliationService service = getService(ReconciliationService.class);
+        Client client = WebClient.client(service);
+        client.accept(RESTHeaders.TEXT_CSV);
+
+        Response response = service.push(anyQuery, spec);
+
+        SyncopeConsoleSession.get().resetClient(ReconciliationService.class);
+
+        return response;
+    }
+
+    public static List<ProvisioningReport> pull(final CSVPullSpec spec, final InputStream csv) {
+        ReconciliationService service = getService(ReconciliationService.class);
+        Client client = WebClient.client(service);
+        client.type(RESTHeaders.TEXT_CSV);
+
+        List<ProvisioningReport> result = service.pull(spec, csv);
+
+        SyncopeConsoleSession.get().resetClient(ReconciliationService.class);
+
+        return result;
+    }
 }
diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/topology/TopologyTogglePanel.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/topology/TopologyTogglePanel.java
index 982a648..e5fdd91 100644
--- a/client/idm/console/src/main/java/org/apache/syncope/client/console/topology/TopologyTogglePanel.java
+++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/topology/TopologyTogglePanel.java
@@ -90,11 +90,11 @@ public class TopologyTogglePanel extends TogglePanel<Serializable> {
         modal.size(Modal.Size.Large);
         setFooterVisibility(false);
 
-        propTaskModal = new BaseModal<>("outer");
+        propTaskModal = new BaseModal<>(Constants.OUTER);
         propTaskModal.size(Modal.Size.Large);
         addOuterObject(propTaskModal);
 
-        schedTaskModal = new BaseModal<Serializable>("outer") {
+        schedTaskModal = new BaseModal<Serializable>(Constants.OUTER) {
 
             private static final long serialVersionUID = 389935548143327858L;
 
@@ -107,12 +107,12 @@ public class TopologyTogglePanel extends TogglePanel<Serializable> {
         schedTaskModal.size(Modal.Size.Large);
         addOuterObject(schedTaskModal);
 
-        provisionModal = new BaseModal<>("outer");
+        provisionModal = new BaseModal<>(Constants.OUTER);
         provisionModal.size(Modal.Size.Large);
         provisionModal.addSubmitButton();
         addOuterObject(provisionModal);
 
-        historyModal = new BaseModal<>("outer");
+        historyModal = new BaseModal<>(Constants.OUTER);
         historyModal.size(Modal.Size.Large);
         addOuterObject(historyModal);
 
diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder.java
new file mode 100644
index 0000000..1c3a2a2
--- /dev/null
+++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder.java
@@ -0,0 +1,273 @@
+/*
+ * 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.wizards;
+
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.fileinput.BootstrapFileInputField;
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.fileinput.FileInputConfig;
+import java.io.ByteArrayInputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.console.panels.CSVConfPanel;
+import org.apache.syncope.client.console.rest.ImplementationRestClient;
+import org.apache.syncope.client.console.rest.ReconciliationRestClient;
+import org.apache.syncope.client.ui.commons.Constants;
+import org.apache.syncope.client.ui.commons.markup.html.form.AjaxCheckBoxPanel;
+import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDropDownChoicePanel;
+import org.apache.syncope.client.ui.commons.markup.html.form.AjaxPalettePanel;
+import org.apache.syncope.common.lib.to.EntityTO;
+import org.apache.syncope.common.lib.types.ConflictResolutionAction;
+import org.apache.syncope.common.lib.types.IdMImplementationType;
+import org.apache.syncope.common.lib.types.MatchingRule;
+import org.apache.syncope.common.lib.types.UnmatchingRule;
+import org.apache.syncope.common.rest.api.beans.CSVPullSpec;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior;
+import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox;
+import org.apache.wicket.event.IEventSink;
+import org.apache.wicket.extensions.wizard.WizardModel;
+import org.apache.wicket.extensions.wizard.WizardStep;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.Radio;
+import org.apache.wicket.markup.html.form.RadioGroup;
+import org.apache.wicket.markup.html.form.upload.FileUpload;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LoadableDetachableModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.model.util.ListModel;
+
+public class CSVPullWizardBuilder extends BaseAjaxWizardBuilder<CSVPullSpec> {
+
+    private static final long serialVersionUID = -4049787433975145383L;
+
+    public enum LineSeparator {
+        LF("\n"),
+        CR("\r"),
+        CRLF("\r\n");
+
+        private final String repr;
+
+        LineSeparator(final String repr) {
+            this.repr = repr;
+        }
+
+        public String getRepr() {
+            return repr;
+        }
+
+        public static LineSeparator byRepr(final String repr) {
+            for (LineSeparator value : values()) {
+                if (value.getRepr().equals(repr)) {
+                    return value;
+                }
+            }
+            return null;
+        }
+    }
+
+    private final Model<byte[]> csv = new Model<>();
+
+    public CSVPullWizardBuilder(final CSVPullSpec defaultItem, final PageReference pageRef) {
+        super(defaultItem, pageRef);
+    }
+
+    @Override
+    public CSVPullWizardBuilder setEventSink(final IEventSink eventSink) {
+        super.setEventSink(eventSink);
+        return this;
+    }
+
+    @Override
+    protected Serializable onApplyInternal(final CSVPullSpec modelObject) {
+        ReconciliationRestClient.pull(modelObject, new ByteArrayInputStream(csv.getObject()));
+        return Constants.OPERATION_SUCCEEDED;
+    }
+
+    @Override
+    protected WizardModel buildModelSteps(final CSVPullSpec modelObject, final WizardModel wizardModel) {
+        wizardModel.add(new Details(modelObject));
+        wizardModel.add(new Columns(modelObject));
+        wizardModel.add(new PullTask(modelObject));
+        return wizardModel;
+    }
+
+    public class Details extends WizardStep {
+
+        private static final long serialVersionUID = -4736870165235853919L;
+
+        public Details(final CSVPullSpec spec) {
+            FileInputConfig csvFile = new FileInputConfig();
+            csvFile.showUpload(false);
+            csvFile.showRemove(false);
+            csvFile.showPreview(false);
+            BootstrapFileInputField csvUpload =
+                    new BootstrapFileInputField("csvUpload", new ListModel<>(new ArrayList<>()), csvFile);
+            csvUpload.setRequired(true);
+            csvUpload.setOutputMarkupId(true);
+            csvUpload.add(new AjaxFormSubmitBehavior(Constants.ON_CHANGE) {
+
+                private static final long serialVersionUID = 5538299138211283825L;
+
+                @Override
+                protected void onSubmit(final AjaxRequestTarget target) {
+                    FileUpload uploadedFile = csvUpload.getFileUpload();
+                    if (uploadedFile != null) {
+                        csv.setObject(uploadedFile.getBytes());
+                    }
+                }
+            });
+            add(csvUpload);
+
+            add(new CSVConfPanel("csvconf", spec));
+        }
+    }
+
+    public class Columns extends WizardStep implements WizardModel.ICondition {
+
+        private static final long serialVersionUID = -4136764210454067728L;
+
+        private final CSVPullSpec spec;
+
+        private final ListModel<String> columnsModel = new ListModel<>();
+
+        public Columns(final CSVPullSpec spec) {
+            this.spec = spec;
+
+            RadioGroup<String> keyColumn = new RadioGroup<>("keyColumn", new PropertyModel<>(spec, "keyColumn"));
+            keyColumn.setOutputMarkupId(true);
+            keyColumn.setOutputMarkupPlaceholderTag(true);
+            keyColumn.setRenderBodyOnly(false);
+            keyColumn.setRequired(true);
+            add(keyColumn);
+
+            keyColumn.add(new ListView<String>("columns", columnsModel) {
+
+                private static final long serialVersionUID = -9112553137618363167L;
+
+                @Override
+                protected void populateItem(final ListItem<String> item) {
+                    item.add(new Label("column", item.getModelObject()));
+                    item.add(new Radio<>("key", new Model<>(item.getModelObject()), keyColumn));
+                    item.add(new AjaxCheckBox("ignore", new Model<>()) {
+
+                        private static final long serialVersionUID = -6139318907146065915L;
+
+                        @Override
+                        protected void onUpdate(final AjaxRequestTarget target) {
+                            if (spec.getIgnoreColumns().contains(item.getModelObject())) {
+                                spec.getIgnoreColumns().remove(item.getModelObject());
+                            } else {
+                                spec.getIgnoreColumns().add(item.getModelObject());
+                            }
+                        }
+                    });
+                }
+            }.setReuseItems(true));
+        }
+
+        @Override
+        public boolean evaluate() {
+            if (csv.getObject() != null) {
+                String header = StringUtils.substringBefore(new String(csv.getObject()), spec.getLineSeparator());
+                columnsModel.setObject(Stream.of(StringUtils.split(header, spec.getColumnSeparator())).
+                        map(value -> {
+                            String unquoted = value;
+                            if (unquoted.charAt(0) == spec.getQuoteChar()) {
+                                unquoted = unquoted.substring(1);
+                            }
+                            if (unquoted.charAt(unquoted.length() - 1) == spec.getQuoteChar()) {
+                                unquoted = unquoted.substring(0, unquoted.length() - 1);
+                            }
+                            return unquoted;
+                        }).collect(Collectors.toList()));
+            }
+
+            return true;
+        }
+    }
+
+    public class PullTask extends WizardStep {
+
+        private static final long serialVersionUID = -8954789648303078732L;
+
+        private final IModel<List<String>> pullActions = new LoadableDetachableModel<List<String>>() {
+
+            private static final long serialVersionUID = 4659376149825914247L;
+
+            @Override
+            protected List<String> load() {
+                return ImplementationRestClient.list(IdMImplementationType.PULL_ACTIONS).stream().
+                        map(EntityTO::getKey).sorted().collect(Collectors.toList());
+            }
+        };
+
+        private final IModel<List<String>> pullCorrelationRules = new LoadableDetachableModel<List<String>>() {
+
+            private static final long serialVersionUID = 4659376149825914247L;
+
+            @Override
+            protected List<String> load() {
+                return ImplementationRestClient.list(IdMImplementationType.PULL_CORRELATION_RULE).stream().
+                        map(EntityTO::getKey).sorted().collect(Collectors.toList());
+            }
+        };
+
+        public PullTask(final CSVPullSpec spec) {
+            AjaxCheckBoxPanel remediation = new AjaxCheckBoxPanel(
+                    "remediation", "remediation", new PropertyModel<>(spec, "remediation"), false);
+            add(remediation);
+
+            AjaxDropDownChoicePanel<MatchingRule> matchingRule = new AjaxDropDownChoicePanel<>(
+                    "matchingRule", "matchingRule", new PropertyModel<>(spec, "matchingRule"), false);
+            matchingRule.setChoices(Arrays.asList(MatchingRule.values()));
+            add(matchingRule);
+
+            AjaxDropDownChoicePanel<UnmatchingRule> unmatchingRule = new AjaxDropDownChoicePanel<>(
+                    "unmatchingRule", "unmatchingRule", new PropertyModel<>(spec, "unmatchingRule"),
+                    false);
+            unmatchingRule.setChoices(Arrays.asList(UnmatchingRule.values()));
+            add(unmatchingRule);
+
+            AjaxPalettePanel<String> actions = new AjaxPalettePanel.Builder<String>().
+                    build("actions", new PropertyModel<>(spec, "actions"), new ListModel<>(pullActions.getObject()));
+            add(actions);
+
+            AjaxDropDownChoicePanel<ConflictResolutionAction> conflictResolutionAction = new AjaxDropDownChoicePanel<>(
+                    "conflictResolutionAction", "conflictResolutionAction",
+                    new PropertyModel<>(spec, "conflictResolutionAction"), false);
+            conflictResolutionAction.setChoices(Arrays.asList(ConflictResolutionAction.values()));
+            conflictResolutionAction.setRequired(true);
+            add(conflictResolutionAction);
+
+            AjaxDropDownChoicePanel<String> pullCorrelationRule = new AjaxDropDownChoicePanel<>(
+                    "pullCorrelationRule", "pullCorrelationRule", new PropertyModel<>(spec, "pullCorrelationRule"),
+                    false);
+            pullCorrelationRule.setChoices(pullCorrelationRules);
+            add(pullCorrelationRule);
+        }
+    }
+}
diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder.java
new file mode 100644
index 0000000..1f2911d
--- /dev/null
+++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder.java
@@ -0,0 +1,133 @@
+/*
+ * 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.wizards;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.apache.syncope.client.console.panels.CSVConfPanel;
+import org.apache.syncope.client.console.rest.ImplementationRestClient;
+import org.apache.syncope.client.console.rest.ReconciliationRestClient;
+import org.apache.syncope.client.console.wicket.ajax.form.AjaxDownloadBehavior;
+import org.apache.syncope.client.ui.commons.Constants;
+import org.apache.syncope.client.ui.commons.markup.html.form.AjaxCheckBoxPanel;
+import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDropDownChoicePanel;
+import org.apache.syncope.client.ui.commons.markup.html.form.AjaxPalettePanel;
+import org.apache.syncope.common.lib.to.EntityTO;
+import org.apache.syncope.common.lib.types.IdMImplementationType;
+import org.apache.syncope.common.lib.types.MatchingRule;
+import org.apache.syncope.common.lib.types.UnmatchingRule;
+import org.apache.syncope.common.rest.api.beans.AnyQuery;
+import org.apache.syncope.common.rest.api.beans.CSVPushSpec;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.event.IEventSink;
+import org.apache.wicket.extensions.wizard.WizardModel;
+import org.apache.wicket.extensions.wizard.WizardStep;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LoadableDetachableModel;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.model.util.ListModel;
+
+public class CSVPushWizardBuilder extends BaseAjaxWizardBuilder<CSVPushSpec> {
+
+    private static final long serialVersionUID = -8890710681835661962L;
+
+    private final AnyQuery query;
+
+    private final AjaxDownloadBehavior downloadBehavior;
+
+    public CSVPushWizardBuilder(
+            final CSVPushSpec defaultItem,
+            final AnyQuery query,
+            final AjaxDownloadBehavior downloadBehavior,
+            final PageReference pageRef) {
+
+        super(defaultItem, pageRef);
+        this.query = query;
+        this.downloadBehavior = downloadBehavior;
+    }
+
+    @Override
+    public CSVPushWizardBuilder setEventSink(final IEventSink eventSink) {
+        super.setEventSink(eventSink);
+        return this;
+    }
+
+    @Override
+    protected Serializable onApplyInternal(final CSVPushSpec modelObject) {
+        downloadBehavior.setResponse(() -> ReconciliationRestClient.push(query, modelObject));
+        return Constants.OPERATION_SUCCEEDED;
+    }
+
+    @Override
+    protected WizardModel buildModelSteps(final CSVPushSpec modelObject, final WizardModel wizardModel) {
+        wizardModel.add(new Details(modelObject));
+        wizardModel.add(new PushTask(modelObject));
+        return wizardModel;
+    }
+
+    public class Details extends WizardStep {
+
+        private static final long serialVersionUID = -2368995286051427297L;
+
+        public Details(final CSVPushSpec spec) {
+            add(new CSVConfPanel("csvconf", spec));
+        }
+    }
+
+    public class PushTask extends WizardStep {
+
+        private static final long serialVersionUID = -2747583614435078452L;
+
+        private final ImplementationRestClient implRestClient = new ImplementationRestClient();
+
+        private final IModel<List<String>> pushActions = new LoadableDetachableModel<List<String>>() {
+
+            private static final long serialVersionUID = 4659376149825914247L;
+
+            @Override
+            protected List<String> load() {
+                return implRestClient.list(IdMImplementationType.PUSH_ACTIONS).stream().
+                        map(EntityTO::getKey).sorted().collect(Collectors.toList());
+            }
+        };
+
+        public PushTask(final CSVPushSpec spec) {
+            AjaxCheckBoxPanel ignorePaging = new AjaxCheckBoxPanel(
+                    "ignorePaging", "ignorePaging", new PropertyModel<>(spec, "ignorePaging"), true);
+            add(ignorePaging);
+
+            AjaxDropDownChoicePanel<MatchingRule> matchingRule = new AjaxDropDownChoicePanel<>(
+                    "matchingRule", "matchingRule", new PropertyModel<>(spec, "matchingRule"), false);
+            matchingRule.setChoices(Arrays.asList(MatchingRule.values()));
+            add(matchingRule);
+
+            AjaxDropDownChoicePanel<UnmatchingRule> unmatchingRule = new AjaxDropDownChoicePanel<>(
+                    "unmatchingRule", "unmatchingRule", new PropertyModel<>(spec, "unmatchingRule"),
+                    false);
+            unmatchingRule.setChoices(Arrays.asList(UnmatchingRule.values()));
+            add(unmatchingRule);
+
+            AjaxPalettePanel<String> actions = new AjaxPalettePanel.Builder<String>().
+                    build("actions", new PropertyModel<>(spec, "actions"), new ListModel<>(pushActions.getObject()));
+            add(actions);
+        }
+    }
+}
diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ItemTransformersTogglePanel.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ItemTransformersTogglePanel.java
index 49274aa..912174d 100644
--- a/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ItemTransformersTogglePanel.java
+++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ItemTransformersTogglePanel.java
@@ -24,6 +24,7 @@ import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.panels.TogglePanel;
 import org.apache.syncope.client.console.rest.ImplementationRestClient;
+import org.apache.syncope.client.ui.commons.Constants;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxPalettePanel;
 import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.ItemTO;
@@ -45,7 +46,7 @@ public class ItemTransformersTogglePanel extends TogglePanel<Serializable> {
     private ItemTO item;
 
     public ItemTransformersTogglePanel(final WebMarkupContainer container, final PageReference pageRef) {
-        super("outer", "itemTransformersTogglePanel", pageRef);
+        super(Constants.OUTER, "itemTransformersTogglePanel", pageRef);
 
         final LoadableDetachableModel<List<String>> model = new LoadableDetachableModel<List<String>>() {
 
diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/resources/JEXLTransformersTogglePanel.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/resources/JEXLTransformersTogglePanel.java
index 9b4a05f..caed0f7 100644
--- a/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/resources/JEXLTransformersTogglePanel.java
+++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/resources/JEXLTransformersTogglePanel.java
@@ -21,6 +21,7 @@ package org.apache.syncope.client.console.wizards.resources;
 import java.io.Serializable;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.panels.TogglePanel;
+import org.apache.syncope.client.ui.commons.Constants;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.common.lib.to.ItemTO;
 import org.apache.wicket.PageReference;
@@ -40,7 +41,7 @@ public class JEXLTransformersTogglePanel extends TogglePanel<Serializable> {
     private final AjaxTextFieldPanel pullJEXLTransformer;
 
     public JEXLTransformersTogglePanel(final WebMarkupContainer container, final PageReference pageRef) {
-        super("outer", "jexlTransformersTogglePanel", pageRef);
+        super(Constants.OUTER, "jexlTransformersTogglePanel", pageRef);
 
         Form<?> form = new Form<>("form");
         addInnerObject(form);
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel.html b/client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel.html
new file mode 100644
index 0000000..3ba0a2a
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel.html
@@ -0,0 +1,29 @@
+<!--
+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>
+    <div wicket:id="columnSeparator">[columnSeparator]</div>
+    <div wicket:id="arrayElementSeparator">[arrayElementSeparator]</div>
+    <div wicket:id="quoteChar">[quoteChar]</div>
+    <div wicket:id="escapeChar">[escapeChar]</div>
+    <div wicket:id="lineSeparator">[lineSeparator]</div>
+    <div wicket:id="nullValue">[nullValue]</div>
+    <div wicket:id="allowComments">[allowComments]</div>
+  </wicket:panel>
+</html>
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel.properties
new file mode 100644
index 0000000..4e008ea
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel.properties
@@ -0,0 +1,23 @@
+# 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.
+columnSeparator=Column separator
+arrayElementSeparator=Array elements separator
+quoteChar=Quote character
+escapeChar=Escape character
+lineSeparator=Line separator
+nullValue=Null value
+allowComments=Comments allowed?
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel_fr_CA.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel_fr_CA.properties
new file mode 100644
index 0000000..1d399ee
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel_fr_CA.properties
@@ -0,0 +1,23 @@
+# 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.
+columnSeparator=S\u00e9parateur de colonnes
+arrayElementSeparator=S\u00e9parateur d'\u00e9l\u00e9ments de tableau
+quoteChar=Caract\u00e8re de citation
+escapeChar=Caract\u00e8re d'\u00e9chappement
+lineSeparator=S\u00e9parateur de ligne
+nullValue=Valeur nulle
+allowComments=Commentaires autoris\u00e9s?
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel_it.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel_it.properties
new file mode 100644
index 0000000..2633d79
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel_it.properties
@@ -0,0 +1,23 @@
+# 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.
+columnSeparator=Separatore di colonna
+arrayElementSeparator=Separatore di elenco
+quoteChar=Carattere di citazione
+escapeChar=Carattere di escape
+lineSeparator=Separatore di linea
+nullValue=Valore nullo
+allowComments=Permettere i commenti?
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel_ja.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel_ja.properties
new file mode 100644
index 0000000..4e008ea
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel_ja.properties
@@ -0,0 +1,23 @@
+# 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.
+columnSeparator=Column separator
+arrayElementSeparator=Array elements separator
+quoteChar=Quote character
+escapeChar=Escape character
+lineSeparator=Line separator
+nullValue=Null value
+allowComments=Comments allowed?
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel_pt_BR.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel_pt_BR.properties
new file mode 100644
index 0000000..4e008ea
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel_pt_BR.properties
@@ -0,0 +1,23 @@
+# 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.
+columnSeparator=Column separator
+arrayElementSeparator=Array elements separator
+quoteChar=Quote character
+escapeChar=Escape character
+lineSeparator=Line separator
+nullValue=Null value
+allowComments=Comments allowed?
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel_ru.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel_ru.properties
new file mode 100644
index 0000000..4e008ea
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/panels/CSVConfPanel_ru.properties
@@ -0,0 +1,23 @@
+# 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.
+columnSeparator=Column separator
+arrayElementSeparator=Array elements separator
+quoteChar=Quote character
+escapeChar=Escape character
+lineSeparator=Line separator
+nullValue=Null value
+allowComments=Comments allowed?
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns.html b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns.html
new file mode 100644
index 0000000..6ebef23
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns.html
@@ -0,0 +1,36 @@
+<!--
+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>
+    <table class="table table-hover">
+      <thead>
+        <th><wicket:message key="column"/></th>
+        <th><wicket:message key="key"/></th>
+        <th><wicket:message key="ignore"/></th>
+      </thead>
+      <tbody wicket:id="keyColumn">
+        <tr wicket:id="columns">
+          <td><span wicket:id="column"></span></td>
+          <td><input type="radio" wicket:id="key"></td>
+          <td><input type="checkbox" wicket:id="ignore"></td>
+        </tr>
+      </tbody>
+    </table>
+  </wicket:panel>
+</html>
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns.properties
new file mode 100644
index 0000000..462a14f
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns.properties
@@ -0,0 +1,19 @@
+# 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.
+column=Column name
+key=Is key column?
+ignore=Ignore?
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns_fr_CA.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns_fr_CA.properties
new file mode 100644
index 0000000..6a7b6de
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns_fr_CA.properties
@@ -0,0 +1,19 @@
+# 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.
+column=Nom de colonne
+key=Est la colonne cl\u00e9?
+ignore=Ignorer?
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns_it.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns_it.properties
new file mode 100644
index 0000000..255afa2
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns_it.properties
@@ -0,0 +1,19 @@
+# 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.
+column=Nome colonna
+key=Chiave?
+ignore=Da ignorare?
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns_ja.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns_ja.properties
new file mode 100644
index 0000000..462a14f
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns_ja.properties
@@ -0,0 +1,19 @@
+# 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.
+column=Column name
+key=Is key column?
+ignore=Ignore?
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns_pt_BR.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns_pt_BR.properties
new file mode 100644
index 0000000..462a14f
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns_pt_BR.properties
@@ -0,0 +1,19 @@
+# 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.
+column=Column name
+key=Is key column?
+ignore=Ignore?
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns_ru.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns_ru.properties
new file mode 100644
index 0000000..462a14f
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Columns_ru.properties
@@ -0,0 +1,19 @@
+# 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.
+column=Column name
+key=Is key column?
+ignore=Ignore?
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details.html b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details.html
new file mode 100644
index 0000000..47873f8
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details.html
@@ -0,0 +1,29 @@
+<!--
+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>
+    <div class="form-group">
+      <label><wicket:message key="csvFile"/></label>
+      <input wicket:id="csvUpload" type="file"/>
+    </div>
+    <div class="form-group">
+      <div wicket:id="csvconf"/>
+    </div>
+  </wicket:panel>
+</html>
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details.properties
new file mode 100644
index 0000000..5a4448a
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details.properties
@@ -0,0 +1,17 @@
+# 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.
+csvFile=CSV File
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details_fr_CA.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details_fr_CA.properties
new file mode 100644
index 0000000..5c281d5
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details_fr_CA.properties
@@ -0,0 +1,17 @@
+# 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.
+csvFile=Fichier CSV
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details_it.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details_it.properties
new file mode 100644
index 0000000..273d12c
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details_it.properties
@@ -0,0 +1,17 @@
+# 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.
+csvFile=File CSV
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details_ja.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details_ja.properties
new file mode 100644
index 0000000..5a4448a
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details_ja.properties
@@ -0,0 +1,17 @@
+# 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.
+csvFile=CSV File
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details_pt_BR.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details_pt_BR.properties
new file mode 100644
index 0000000..5a4448a
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details_pt_BR.properties
@@ -0,0 +1,17 @@
+# 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.
+csvFile=CSV File
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details_ru.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details_ru.properties
new file mode 100644
index 0000000..5a4448a
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$Details_ru.properties
@@ -0,0 +1,17 @@
+# 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.
+csvFile=CSV File
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask.html b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask.html
new file mode 100644
index 0000000..761b1f4
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask.html
@@ -0,0 +1,32 @@
+<!--
+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>
+    <div class="form-group">
+      <div wicket:id="remediation">[remediation]</div>
+      <div wicket:id="matchingRule">[matchingRule]</div>
+      <div wicket:id="unmatchingRule">[unmatchingRule]</div>
+      <div wicket:id="actions">[actions]</div>
+    </div>
+    <div class="form-group">
+      <div wicket:id="conflictResolutionAction">[conflictResolutionAction]</div>
+      <div wicket:id="pullCorrelationRule">[nullValue]</div>
+    </div>
+  </wicket:panel>
+</html>
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask.properties
new file mode 100644
index 0000000..5527723
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask.properties
@@ -0,0 +1,22 @@
+# 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.
+remediation=Remediation
+matchingRule=Matching rule
+unmatchingRule=Unmatching rule
+actions=Actions
+conflictResolutionAction=Conflict resolution action
+pullCorrelationRule=Correlation rule
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask_fr_CA.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask_fr_CA.properties
new file mode 100644
index 0000000..c5e744a
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask_fr_CA.properties
@@ -0,0 +1,22 @@
+# 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.
+remediation=Remediation
+matchingRule=R\u00e8gle de correspondance
+unmatchingRule=R\u00e8gle in\u00e9gal\u00e9e
+actions=Actions
+conflictResolutionAction=Action de r\u00e9solution de conflits
+pullCorrelationRule=R\u00e8gle de corr\u00e9lation
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask_it.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask_it.properties
new file mode 100644
index 0000000..02ad161
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask_it.properties
@@ -0,0 +1,22 @@
+# 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.
+remediation=Bonifiche
+matchingRule=Regola di matrching
+unmatchingRule=Regola di unmatching
+actions=Azioni
+conflictResolutionAction=Azione di Risoluzione Conflitti
+pullCorrelationRule=Regola di Correlazione
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask_ja.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask_ja.properties
new file mode 100644
index 0000000..5527723
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask_ja.properties
@@ -0,0 +1,22 @@
+# 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.
+remediation=Remediation
+matchingRule=Matching rule
+unmatchingRule=Unmatching rule
+actions=Actions
+conflictResolutionAction=Conflict resolution action
+pullCorrelationRule=Correlation rule
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask_pt_BR.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask_pt_BR.properties
new file mode 100644
index 0000000..5527723
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask_pt_BR.properties
@@ -0,0 +1,22 @@
+# 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.
+remediation=Remediation
+matchingRule=Matching rule
+unmatchingRule=Unmatching rule
+actions=Actions
+conflictResolutionAction=Conflict resolution action
+pullCorrelationRule=Correlation rule
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask_ru.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask_ru.properties
new file mode 100644
index 0000000..5527723
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPullWizardBuilder$PullTask_ru.properties
@@ -0,0 +1,22 @@
+# 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.
+remediation=Remediation
+matchingRule=Matching rule
+unmatchingRule=Unmatching rule
+actions=Actions
+conflictResolutionAction=Conflict resolution action
+pullCorrelationRule=Correlation rule
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$Details.html b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$Details.html
new file mode 100644
index 0000000..6628f18
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$Details.html
@@ -0,0 +1,25 @@
+<!--
+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>
+    <div class="form-group">
+      <div wicket:id="csvconf"/>
+    </div>
+  </wicket:panel>
+</html>
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask.html b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask.html
new file mode 100644
index 0000000..3773882
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask.html
@@ -0,0 +1,30 @@
+<!--
+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>
+    <div class="form-group">
+      <div wicket:id="ignorePaging">[ignorePaging]</div>
+    </div>
+    <div class="form-group">
+      <div wicket:id="matchingRule">[matchingRule]</div>
+      <div wicket:id="unmatchingRule">[unmatchingRule]</div>
+      <div wicket:id="actions">[actions]</div>
+    </div>
+  </wicket:panel>
+</html>
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask.properties
new file mode 100644
index 0000000..f269211
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask.properties
@@ -0,0 +1,20 @@
+# 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.
+matchingRule=Matching rule
+unmatchingRule=Unmatching rule
+actions=Actions
+ignorePaging=Include all pages?
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask_fr_CA.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask_fr_CA.properties
new file mode 100644
index 0000000..68e7e24
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask_fr_CA.properties
@@ -0,0 +1,20 @@
+# 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.
+matchingRule=R\u00e8gle de correspondance
+unmatchingRule=R\u00e8gle in\u00e9gal\u00e9e
+actions=Actions
+ignorePaging=Inclure toutes les pages?
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask_it.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask_it.properties
new file mode 100644
index 0000000..6dfeb3d
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask_it.properties
@@ -0,0 +1,20 @@
+# 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.
+matchingRule=Regola di matrching
+unmatchingRule=Regola di unmatching
+actions=Azioni
+ignorePaging=Includere tutte le pagine?
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask_ja.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask_ja.properties
new file mode 100644
index 0000000..f269211
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask_ja.properties
@@ -0,0 +1,20 @@
+# 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.
+matchingRule=Matching rule
+unmatchingRule=Unmatching rule
+actions=Actions
+ignorePaging=Include all pages?
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask_pt_BR.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask_pt_BR.properties
new file mode 100644
index 0000000..f269211
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask_pt_BR.properties
@@ -0,0 +1,20 @@
+# 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.
+matchingRule=Matching rule
+unmatchingRule=Unmatching rule
+actions=Actions
+ignorePaging=Include all pages?
diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask_ru.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask_ru.properties
new file mode 100644
index 0000000..f269211
--- /dev/null
+++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder$PushTask_ru.properties
@@ -0,0 +1,20 @@
+# 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.
+matchingRule=Matching rule
+unmatchingRule=Unmatching rule
+actions=Actions
+ignorePaging=Include all pages?
diff --git a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/BaseSession.java b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/BaseSession.java
index 890faaf..dd31af8 100644
--- a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/BaseSession.java
+++ b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/BaseSession.java
@@ -18,7 +18,7 @@
  */
 package org.apache.syncope.client.ui.commons;
 
-import javax.ws.rs.core.MediaType;
+import org.apache.commons.lang3.time.FastDateFormat;
 
 public interface BaseSession {
 
@@ -32,8 +32,7 @@ public interface BaseSession {
 
     <T> T getService(String etag, Class<T> serviceClass);
 
-    <T> T getService(MediaType mediaType, Class<T> serviceClass);
-
     <T> void resetClient(Class<T> service);
 
+    FastDateFormat getDateFormat();
 }
diff --git a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/Constants.java b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/Constants.java
index 7a0e0ac..b106b46 100644
--- a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/Constants.java
+++ b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/Constants.java
@@ -77,6 +77,10 @@ public final class Constants {
 
     public static final String ERROR = "error";
 
+    public static final String OUTER = "outer";
+
+    public static final String ACTION = "action";
+
     public static final String BEFORE_LOGOUT_PAGE = "beforeLogoutPage";
 
     public static final String PARAM_PASSWORD_RESET_TOKEN = "pwdResetToken";
diff --git a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/AjaxWizardBuilder.java b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/AjaxWizardBuilder.java
index 9a72010..7d92c00 100644
--- a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/AjaxWizardBuilder.java
+++ b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/AjaxWizardBuilder.java
@@ -169,8 +169,7 @@ public abstract class AjaxWizardBuilder<T extends Serializable> extends Abstract
      * @param target ajax request target
      * @return payload to be sent.
      */
-    protected static Serializable getEditCustomPayloadEvent(final Serializable afterObject,
-            final AjaxRequestTarget target) {
+    protected Serializable getEditCustomPayloadEvent(final Serializable afterObject, final AjaxRequestTarget target) {
         return null;
     }
 }
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/PreferenceManager.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/PreferenceManager.java
index 3eca648..c074fe3 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/PreferenceManager.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/PreferenceManager.java
@@ -37,7 +37,7 @@ import org.apache.wicket.util.cookies.CookieUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class PreferenceManager implements Serializable {
+public final class PreferenceManager implements Serializable {
 
     private static final long serialVersionUID = 3581434664555284193L;
 
@@ -125,7 +125,7 @@ public class PreferenceManager implements Serializable {
         return result;
     }
 
-    public void set(final Request request, final Response response, final Map<String, List<String>> prefs) {
+    public static void set(final Request request, final Response response, final Map<String, List<String>> prefs) {
         Map<String, String> current = new HashMap<>();
 
         String prefString = COOKIE_UTILS.load(COOKIE_NAME);
@@ -139,11 +139,11 @@ public class PreferenceManager implements Serializable {
         try {
             COOKIE_UTILS.save(COOKIE_NAME, Base64.getEncoder().encodeToString(setPrefs(current).getBytes()));
         } catch (IOException e) {
-            LOG.error("Could not save {} info: {}", getClass().getSimpleName(), current, e);
+            LOG.error("Could not save {} info: {}", PreferenceManager.class.getSimpleName(), current, e);
         }
     }
 
-    public void set(final Request request, final Response response, final String key, final String value) {
+    public static void set(final Request request, final Response response, final String key, final String value) {
         String prefString = COOKIE_UTILS.load(COOKIE_NAME);
 
         final Map<String, String> current = new HashMap<>();
@@ -157,15 +157,21 @@ public class PreferenceManager implements Serializable {
         try {
             COOKIE_UTILS.save(COOKIE_NAME, Base64.getEncoder().encodeToString(setPrefs(current).getBytes()));
         } catch (IOException e) {
-            LOG.error("Could not save {} info: {}", getClass().getSimpleName(), current, e);
+            LOG.error("Could not save {} info: {}", PreferenceManager.class.getSimpleName(), current, e);
         }
     }
 
-    public void setList(final Request request, final Response response, final String key, final List<String> values) {
+    public static void setList(
+            final Request request, final Response response, final String key, final List<String> values) {
         set(request, response, key, StringUtils.join(values, ";"));
     }
 
-    public void setList(final Request request, final Response response, final Map<String, List<String>> prefs) {
+    public static void setList(
+            final Request request, final Response response, final Map<String, List<String>> prefs) {
         set(request, response, prefs);
     }
+
+    private PreferenceManager() {
+        // private constructor for static utility class
+    }
 }
diff --git a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/BaseSession.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SerializableSupplier.java
similarity index 64%
copy from client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/BaseSession.java
copy to client/idrepo/console/src/main/java/org/apache/syncope/client/console/SerializableSupplier.java
index 890faaf..da3eb79 100644
--- a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/BaseSession.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SerializableSupplier.java
@@ -16,24 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.syncope.client.ui.commons;
+package org.apache.syncope.client.console;
 
-import javax.ws.rs.core.MediaType;
-
-public interface BaseSession {
-
-    void setDomain(String domain);
-
-    String getDomain();
-
-    <T> T getAnonymousService(Class<T> serviceClass);
-
-    <T> T getService(Class<T> serviceClass);
-
-    <T> T getService(String etag, Class<T> serviceClass);
-
-    <T> T getService(MediaType mediaType, Class<T> serviceClass);
-
-    <T> void resetClient(Class<T> service);
+import java.io.Serializable;
+import java.util.function.Supplier;
 
+@FunctionalInterface
+public interface SerializableSupplier<T> extends Supplier<T>, Serializable {
 }
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java
index 9d7c234..0175fe7 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java
@@ -19,10 +19,11 @@
 package org.apache.syncope.client.console;
 
 import com.giffing.wicket.spring.boot.starter.web.config.WicketWebInitializerAutoConfig.WebSocketWicketWebInitializerAutoConfiguration;
-import org.apache.syncope.client.console.commons.AnyDirectoryPanelAditionalActionLinksProvider;
+import org.apache.syncope.client.console.commons.AnyDirectoryPanelAdditionalActionsProvider;
 import org.apache.syncope.client.console.commons.AnyWizardBuilderAdditionalSteps;
 import org.apache.syncope.client.console.commons.ExternalResourceProvider;
-import org.apache.syncope.client.console.commons.IdRepoAnyDirectoryPanelAditionalActionLinksProvider;
+import org.apache.syncope.client.console.commons.IdRepoAnyDirectoryPanelAdditionalActionsProvider;
+import org.apache.syncope.client.console.commons.IdRepoAnyDirectoryPanelAdditionalActionLinksProvider;
 import org.apache.syncope.client.console.commons.IdRepoAnyWizardBuilderAdditionalSteps;
 import org.apache.syncope.client.console.commons.IdRepoExternalResourceProvider;
 import org.apache.syncope.client.console.commons.IdRepoImplementationInfoProvider;
@@ -43,6 +44,7 @@ import org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConf
 import org.springframework.boot.builder.SpringApplicationBuilder;
 import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
 import org.springframework.context.annotation.Bean;
+import org.apache.syncope.client.console.commons.AnyDirectoryPanelAdditionalActionLinksProvider;
 
 @SpringBootApplication(exclude = {
     ErrorMvcAutoConfiguration.class,
@@ -81,6 +83,18 @@ public class SyncopeConsoleApplication extends SpringBootServletInitializer {
         return new IdRepoExternalResourceProvider();
     }
 
+    @ConditionalOnMissingBean(name = "anyDirectoryPanelAdditionalActionsProvider")
+    @Bean
+    public AnyDirectoryPanelAdditionalActionsProvider anyDirectoryPanelAdditionalActionsProvider() {
+        return new IdRepoAnyDirectoryPanelAdditionalActionsProvider();
+    }
+
+    @ConditionalOnMissingBean(name = "anyDirectoryPanelAdditionalActionLinksProvider")
+    @Bean
+    public AnyDirectoryPanelAdditionalActionLinksProvider anyDirectoryPanelAdditionalActionLinksProvider() {
+        return new IdRepoAnyDirectoryPanelAdditionalActionLinksProvider();
+    }
+
     @ConditionalOnMissingBean(name = "anyWizardBuilderAdditionalSteps")
     @Bean
     public AnyWizardBuilderAdditionalSteps anyWizardBuilderAdditionalSteps() {
@@ -99,12 +113,6 @@ public class SyncopeConsoleApplication extends SpringBootServletInitializer {
         return new IdRepoVirSchemaDetailsPanelProvider();
     }
 
-    @ConditionalOnMissingBean(name = "anyDirectoryPanelAditionalActionLinksProvider")
-    @Bean
-    public AnyDirectoryPanelAditionalActionLinksProvider anyDirectoryPanelAditionalActionLinksProvider() {
-        return new IdRepoAnyDirectoryPanelAditionalActionLinksProvider();
-    }
-
     @ConditionalOnMissingBean(name = "implementationInfoProvider")
     @Bean
     public ImplementationInfoProvider implementationInfoProvider() {
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java
index d25233c..9826ecb 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java
@@ -318,22 +318,6 @@ public class SyncopeConsoleSession extends AuthenticatedWebSession implements Ba
         return serviceInstance;
     }
 
-    @Override
-    public <T> T getService(final MediaType mediaType, final Class<T> serviceClass) {
-        T service;
-
-        synchronized (clientFactory) {
-            SyncopeClientFactoryBean.ContentType preType = clientFactory.getContentType();
-
-            clientFactory.setContentType(SyncopeClientFactoryBean.ContentType.fromString(mediaType.toString()));
-            service = clientFactory.create(getJWT()).getService(serviceClass);
-
-            clientFactory.setContentType(preType);
-        }
-
-        return service;
-    }
-
     public BatchRequest batch() {
         return client.batch();
     }
@@ -344,6 +328,7 @@ public class SyncopeConsoleSession extends AuthenticatedWebSession implements Ba
         WebClient.client(serviceInstance).reset();
     }
 
+    @Override
     public FastDateFormat getDateFormat() {
         return FastDateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, getLocale());
     }
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeWebApplication.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeWebApplication.java
index 3b7cf65..bc01e4d 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeWebApplication.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeWebApplication.java
@@ -35,7 +35,8 @@ import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.ClassUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.annotations.Resource;
-import org.apache.syncope.client.console.commons.AnyDirectoryPanelAditionalActionLinksProvider;
+import org.apache.syncope.client.console.commons.AnyDirectoryPanelAdditionalActionLinksProvider;
+import org.apache.syncope.client.console.commons.AnyDirectoryPanelAdditionalActionsProvider;
 import org.apache.syncope.client.console.commons.AnyWizardBuilderAdditionalSteps;
 import org.apache.syncope.client.console.init.ClassPathScanImplementationLookup;
 import org.apache.syncope.client.console.pages.BasePage;
@@ -124,6 +125,12 @@ public class SyncopeWebApplication extends WicketBootSecuredWebApplication {
     private ExternalResourceProvider resourceProvider;
 
     @Autowired
+    private AnyDirectoryPanelAdditionalActionsProvider anyDirectoryPanelAdditionalActionsProvider;
+
+    @Autowired
+    private AnyDirectoryPanelAdditionalActionLinksProvider anyDirectoryPanelAdditionalActionLinksProvider;
+
+    @Autowired
     private AnyWizardBuilderAdditionalSteps anyWizardBuilderAdditionalSteps;
 
     @Autowired
@@ -133,9 +140,6 @@ public class SyncopeWebApplication extends WicketBootSecuredWebApplication {
     private VirSchemaDetailsPanelProvider virSchemaDetailsPanelProvider;
 
     @Autowired
-    private AnyDirectoryPanelAditionalActionLinksProvider anyDirectoryPanelAditionalActionLinksProvider;
-
-    @Autowired
     private ImplementationInfoProvider implementationInfoProvider;
 
     @Autowired
@@ -382,6 +386,14 @@ public class SyncopeWebApplication extends WicketBootSecuredWebApplication {
         return resourceProvider;
     }
 
+    public AnyDirectoryPanelAdditionalActionsProvider getAnyDirectoryPanelAdditionalActionsProvider() {
+        return anyDirectoryPanelAdditionalActionsProvider;
+    }
+
+    public AnyDirectoryPanelAdditionalActionLinksProvider getAnyDirectoryPanelAdditionalActionLinksProvider() {
+        return anyDirectoryPanelAdditionalActionLinksProvider;
+    }
+
     public AnyWizardBuilderAdditionalSteps getAnyWizardBuilderAdditionalSteps() {
         return anyWizardBuilderAdditionalSteps;
     }
@@ -394,10 +406,6 @@ public class SyncopeWebApplication extends WicketBootSecuredWebApplication {
         return virSchemaDetailsPanelProvider;
     }
 
-    public AnyDirectoryPanelAditionalActionLinksProvider getAnyDirectoryPanelAditionalActionLinksProvider() {
-        return anyDirectoryPanelAditionalActionLinksProvider;
-    }
-
     public ImplementationInfoProvider getImplementationInfoProvider() {
         return implementationInfoProvider;
     }
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/AnyDirectoryPanelAditionalActionLinksProvider.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/AnyDirectoryPanelAdditionalActionLinksProvider.java
similarity index 95%
copy from client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/AnyDirectoryPanelAditionalActionLinksProvider.java
copy to client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/AnyDirectoryPanelAdditionalActionLinksProvider.java
index 012cf59..1d05d3f 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/AnyDirectoryPanelAditionalActionLinksProvider.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/AnyDirectoryPanelAdditionalActionLinksProvider.java
@@ -29,7 +29,7 @@ import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.model.IModel;
 
-public interface AnyDirectoryPanelAditionalActionLinksProvider extends Serializable {
+public interface AnyDirectoryPanelAdditionalActionLinksProvider extends Serializable {
 
     List<Action<UserTO>> get(
             IModel<UserTO> model,
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/AnyDirectoryPanelAditionalActionLinksProvider.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/AnyDirectoryPanelAdditionalActionsProvider.java
similarity index 53%
rename from client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/AnyDirectoryPanelAditionalActionLinksProvider.java
rename to client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/AnyDirectoryPanelAdditionalActionsProvider.java
index 012cf59..86fcb82 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/AnyDirectoryPanelAditionalActionLinksProvider.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/AnyDirectoryPanelAdditionalActionsProvider.java
@@ -20,36 +20,21 @@ package org.apache.syncope.client.console.commons;
 
 import java.io.Serializable;
 import java.util.List;
+import org.apache.syncope.client.console.panels.AnyDirectoryPanel;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
-import org.apache.syncope.client.console.wicket.markup.html.form.Action;
-import org.apache.syncope.client.ui.commons.wizards.any.AnyWrapper;
-import org.apache.syncope.common.lib.to.AnyObjectTO;
-import org.apache.syncope.common.lib.to.GroupTO;
-import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.wicket.PageReference;
-import org.apache.wicket.model.IModel;
+import org.apache.wicket.markup.html.WebMarkupContainer;
 
-public interface AnyDirectoryPanelAditionalActionLinksProvider extends Serializable {
+@FunctionalInterface
+public interface AnyDirectoryPanelAdditionalActionsProvider extends Serializable {
 
-    List<Action<UserTO>> get(
-            IModel<UserTO> model,
-            String realm,
-            BaseModal<AnyWrapper<UserTO>> modal,
-            String header,
-            PageReference pageRef);
-
-    List<Action<GroupTO>> get(
-            GroupTO modelObject,
-            String realm,
-            BaseModal<AnyWrapper<GroupTO>> modal,
-            String header,
-            PageReference pageRef);
-
-    List<Action<AnyObjectTO>> get(
+    void add(AnyDirectoryPanel<?, ?> panel,
+            BaseModal<?> modal,
+            WebMarkupContainer container,
             String type,
-            AnyObjectTO modelObject,
             String realm,
-            BaseModal<AnyWrapper<AnyObjectTO>> modal,
-            String header,
+            String fiql,
+            List<String> pSchemaNames,
+            List<String> dSchemaNames,
             PageReference pageRef);
 }
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/IdRepoAnyDirectoryPanelAditionalActionLinksProvider.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/IdRepoAnyDirectoryPanelAdditionalActionLinksProvider.java
similarity index 94%
rename from client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/IdRepoAnyDirectoryPanelAditionalActionLinksProvider.java
rename to client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/IdRepoAnyDirectoryPanelAdditionalActionLinksProvider.java
index 03e897e..dff2274 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/IdRepoAnyDirectoryPanelAditionalActionLinksProvider.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/IdRepoAnyDirectoryPanelAdditionalActionLinksProvider.java
@@ -28,8 +28,8 @@ import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.model.IModel;
 
-public class IdRepoAnyDirectoryPanelAditionalActionLinksProvider
-        implements AnyDirectoryPanelAditionalActionLinksProvider {
+public class IdRepoAnyDirectoryPanelAdditionalActionLinksProvider
+        implements AnyDirectoryPanelAdditionalActionLinksProvider {
 
     private static final long serialVersionUID = 121356001392126568L;
 
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/IdRepoAnyDirectoryPanelAdditionalActionsProvider.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/IdRepoAnyDirectoryPanelAdditionalActionsProvider.java
new file mode 100644
index 0000000..d32b3a6
--- /dev/null
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/IdRepoAnyDirectoryPanelAdditionalActionsProvider.java
@@ -0,0 +1,45 @@
+/*
+ * 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.commons;
+
+import java.util.List;
+import org.apache.syncope.client.console.panels.AnyDirectoryPanel;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+
+public class IdRepoAnyDirectoryPanelAdditionalActionsProvider implements AnyDirectoryPanelAdditionalActionsProvider {
+
+    private static final long serialVersionUID = -6768727277642238924L;
+
+    @Override
+    public void add(
+            final AnyDirectoryPanel<?, ?> panel,
+            final BaseModal<?> modal,
+            final WebMarkupContainer container,
+            final String type,
+            final String realm,
+            final String fiql,
+            final List<String> pSchemaNames,
+            final List<String> dSchemaNames,
+            final PageReference pageRef) {
+
+        // nothing to do
+    }
+}
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/init/ClassPathScanImplementationLookup.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/init/ClassPathScanImplementationLookup.java
index 332948c..e980fce 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/init/ClassPathScanImplementationLookup.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/init/ClassPathScanImplementationLookup.java
@@ -38,7 +38,6 @@ import org.apache.syncope.client.ui.commons.annotations.BinaryPreview;
 import org.apache.syncope.client.ui.commons.annotations.ExtWidget;
 import org.apache.syncope.client.console.annotations.IdMPage;
 import org.apache.syncope.client.console.annotations.Resource;
-import org.apache.syncope.client.console.commons.AnyDirectoryPanelAditionalActionLinksProvider;
 import org.apache.syncope.client.console.commons.AnyWizardBuilderAdditionalSteps;
 import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.ui.commons.panels.BaseSSOLoginFormPanel;
@@ -64,6 +63,7 @@ import org.apache.syncope.client.console.commons.ImplementationInfoProvider;
 import org.apache.syncope.client.console.commons.PolicyTabProvider;
 import org.apache.syncope.client.console.commons.StatusProvider;
 import org.apache.syncope.client.console.commons.VirSchemaDetailsPanelProvider;
+import org.apache.syncope.client.console.commons.AnyDirectoryPanelAdditionalActionLinksProvider;
 
 public class ClassPathScanImplementationLookup {
 
@@ -169,7 +169,7 @@ public class ClassPathScanImplementationLookup {
         scanner.addIncludeFilter(new AssignableTypeFilter(AnyWizardBuilderAdditionalSteps.class));
         scanner.addIncludeFilter(new AssignableTypeFilter(StatusProvider.class));
         scanner.addIncludeFilter(new AssignableTypeFilter(VirSchemaDetailsPanelProvider.class));
-        scanner.addIncludeFilter(new AssignableTypeFilter(AnyDirectoryPanelAditionalActionLinksProvider.class));
+        scanner.addIncludeFilter(new AssignableTypeFilter(AnyDirectoryPanelAdditionalActionLinksProvider.class));
         scanner.addIncludeFilter(new AssignableTypeFilter(ImplementationInfoProvider.class));
         scanner.addIncludeFilter(new AssignableTypeFilter(PolicyTabProvider.class));
 
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateDirectoryPanel.java
index fa8b942..fd283a7 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateDirectoryPanel.java
@@ -62,7 +62,7 @@ public class MailTemplateDirectoryPanel
 
     private static final long serialVersionUID = -3789392431954221446L;
 
-    protected final BaseModal<String> utilityModal = new BaseModal<>("outer");
+    protected final BaseModal<String> utilityModal = new BaseModal<>(Constants.OUTER);
 
     public MailTemplateDirectoryPanel(final String id, final PageReference pageReference) {
         super(id, pageReference, true);
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationDirectoryPanel.java
index ec11188..2290a67 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationDirectoryPanel.java
@@ -19,7 +19,6 @@
 package org.apache.syncope.client.console.notifications;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
-import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
@@ -59,7 +58,7 @@ public class NotificationDirectoryPanel
 
     private static final long serialVersionUID = -3789392431954221446L;
 
-    protected final BaseModal<Serializable> utilityModal = new BaseModal<>("outer");
+    protected final BaseModal<String> utilityModal = new BaseModal<>(Constants.OUTER);
 
     public NotificationDirectoryPanel(final String id, final PageReference pageRef) {
         super(id, pageRef, true);
@@ -112,7 +111,7 @@ public class NotificationDirectoryPanel
                 send(NotificationDirectoryPanel.this, Broadcast.EXACT,
                         new AjaxWizard.EditItemActionEvent<>(
                                 new NotificationWrapper(
-                                    NotificationRestClient.read(model.getObject().getKey())), target));
+                                        NotificationRestClient.read(model.getObject().getKey())), target));
             }
         }, ActionLink.ActionType.EDIT, IdRepoEntitlement.NOTIFICATION_UPDATE);
 
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
index 1c8558a..03fc8bf 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
@@ -105,14 +105,12 @@ public class ActionDataTablePanel<T extends Serializable, S> extends DataTablePa
         }.setVisible(false).setEnabled(false));
     }
 
-    public void addAction(
-            final ActionLink<Serializable> action, final ActionType type, final String entitlements) {
+    public void addAction(final ActionLink<Serializable> action, final ActionType type, final String entitlements) {
         actionPanel.add(action, type, entitlements);
     }
 
     public void addCancelButton(final BaseModal<?> modal) {
-
-        final AjaxButton cancel = new IndicatingAjaxButton(CANCEL, new ResourceModel(CANCEL)) {
+        AjaxButton cancel = new IndicatingAjaxButton(CANCEL, new ResourceModel(CANCEL)) {
 
             private static final long serialVersionUID = -4804368561204623354L;
 
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyDirectoryPanel.java
index 3ad57cd..37c2be4 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyDirectoryPanel.java
@@ -22,6 +22,7 @@ import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import java.io.Serializable;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Date;
 import java.util.List;
@@ -29,9 +30,8 @@ import java.util.stream.Collectors;
 import org.apache.commons.lang3.tuple.Triple;
 import org.apache.syncope.client.console.PreferenceManager;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.SyncopeWebApplication;
 import org.apache.syncope.client.console.commons.AnyDataProvider;
-import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.ui.commons.status.ConnObjectWrapper;
 import org.apache.syncope.client.console.rest.AbstractAnyRestClient;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.AttrColumn;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.BooleanPropertyColumn;
@@ -40,9 +40,11 @@ import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.TokenColumn;
 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.ui.commons.wizards.any.AnyWrapper;
 import org.apache.syncope.client.console.wizards.any.ResultPage;
 import org.apache.syncope.client.console.wizards.any.StatusPanel;
+import org.apache.syncope.client.ui.commons.Constants;
+import org.apache.syncope.client.ui.commons.status.ConnObjectWrapper;
+import org.apache.syncope.client.ui.commons.wizards.any.AnyWrapper;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
@@ -84,7 +86,7 @@ public abstract class AnyDirectoryPanel<A extends AnyTO, E extends AbstractAnyRe
      */
     protected final String type;
 
-    protected final BaseModal<Serializable> utilityModal = new BaseModal<>("outer");
+    protected final BaseModal<Serializable> utilityModal = new BaseModal<>(Constants.OUTER);
 
     protected AnyDirectoryPanel(final String id, final Builder<A, E> builder) {
         this(id, builder, true);
@@ -113,17 +115,6 @@ public abstract class AnyDirectoryPanel<A extends AnyTO, E extends AbstractAnyRe
         setWindowClosedReloadCallback(utilityModal);
 
         modal.size(Modal.Size.Large);
-        altDefaultModal.size(Modal.Size.Large);
-
-        this.pSchemaNames = new ArrayList<>();
-        AnyDirectoryPanelBuilder.class.cast(builder).getAnyTypeClassTOs()
-                .forEach(anyTypeClassTO -> this.pSchemaNames.addAll(anyTypeClassTO.getPlainSchemas()));
-        this.dSchemaNames = new ArrayList<>();
-        AnyDirectoryPanelBuilder.class.cast(builder).getAnyTypeClassTOs()
-                .forEach(anyTypeClassTO -> this.dSchemaNames.addAll(anyTypeClassTO.getDerSchemas()));
-
-        initResultTable();
-
         // change close callback in order to update header after model update
         modal.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {
 
@@ -132,36 +123,47 @@ public abstract class AnyDirectoryPanel<A extends AnyTO, E extends AbstractAnyRe
             @Override
             public void onClose(final AjaxRequestTarget target) {
                 if (actionTogglePanel.isVisibleInHierarchy() && modal.getContent() instanceof ResultPage) {
-                    actionTogglePanel.updateHeader(
-                            target, ResultPage.class.cast(modal.getContent()).getItem());
+                    actionTogglePanel.updateHeader(target, ResultPage.class.cast(modal.getContent()).getItem());
                 }
                 modal.show(false);
             }
         });
+
+        altDefaultModal.size(Modal.Size.Large);
+
+        this.pSchemaNames = AnyDirectoryPanelBuilder.class.cast(builder).getAnyTypeClassTOs().stream().
+                flatMap(anyTypeClassTO -> anyTypeClassTO.getPlainSchemas().stream()).collect(Collectors.toList());
+
+        this.dSchemaNames = AnyDirectoryPanelBuilder.class.cast(builder).getAnyTypeClassTOs().stream().
+                flatMap(anyTypeClassTO -> anyTypeClassTO.getDerSchemas().stream()).collect(Collectors.toList());
+
+        initResultTable();
+
+        SyncopeWebApplication.get().getAnyDirectoryPanelAdditionalActionsProvider().
+                add(this, modal, container, type, realm, fiql, pSchemaNames, dSchemaNames, pageRef);
     }
 
     @Override
     protected List<IColumn<A, String>> getColumns() {
-        final List<IColumn<A, String>> columns = new ArrayList<>();
-        final List<IColumn<A, String>> prefcolumns = new ArrayList<>();
-
+        List<IColumn<A, String>> columns = new ArrayList<>();
         columns.add(new KeyPropertyColumn<>(
                 new ResourceModel(Constants.KEY_FIELD_NAME, Constants.KEY_FIELD_NAME), Constants.KEY_FIELD_NAME));
 
+        List<IColumn<A, String>> prefcolumns = new ArrayList<>();
         PreferenceManager.getList(getRequest(), DisplayAttributesModalPanel.getPrefDetailView(type)).stream().
                 filter(name -> !Constants.KEY_FIELD_NAME.equalsIgnoreCase(name)).
-                forEachOrdered(name -> addPropertyColumn(
+                forEach(name -> addPropertyColumn(
                 name,
                 ReflectionUtils.findField(DisplayAttributesModalPanel.getTOClass(type), name),
                 prefcolumns));
 
         PreferenceManager.getList(getRequest(), DisplayAttributesModalPanel.getPrefPlainAttributeView(type)).stream().
-                filter(pSchemaNames::contains).
-                forEachOrdered(name -> prefcolumns.add(new AttrColumn<>(name, SchemaType.PLAIN)));
+                filter(name -> pSchemaNames.contains(name)).
+                map(name -> prefcolumns.add(new AttrColumn<>(name, SchemaType.PLAIN)));
 
         PreferenceManager.getList(getRequest(), DisplayAttributesModalPanel.getPrefDerivedAttributeView(type)).stream().
-                filter(dSchemaNames::contains).
-                forEachOrdered(name -> prefcolumns.add(new AttrColumn<>(name, SchemaType.DERIVED)));
+                filter(name -> (dSchemaNames.contains(name))).
+                forEach(name -> prefcolumns.add(new AttrColumn<>(name, SchemaType.DERIVED)));
 
         // Add defaults in case of no selection
         if (prefcolumns.isEmpty()) {
@@ -172,8 +174,9 @@ public abstract class AnyDirectoryPanel<A extends AnyTO, E extends AbstractAnyRe
                         prefcolumns);
             }
 
-            prefMan.setList(getRequest(), getResponse(), DisplayAttributesModalPanel.getPrefDetailView(type),
-                    List.of(getDefaultAttributeSelection()));
+            PreferenceManager.setList(
+                    getRequest(), getResponse(), DisplayAttributesModalPanel.getPrefDetailView(type),
+                    Arrays.asList(getDefaultAttributeSelection()));
         }
 
         columns.addAll(prefcolumns);
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDirectoryPanel.java
index 3324a17..ca0c406 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDirectoryPanel.java
@@ -119,7 +119,7 @@ public class AnyObjectDirectoryPanel extends AnyDirectoryPanel<AnyObjectTO, AnyO
                 setRealms(realm, model.getObject().getDynRealms());
 
         if (wizardInModal) {
-            SyncopeWebApplication.get().getAnyDirectoryPanelAditionalActionLinksProvider().get(
+            SyncopeWebApplication.get().getAnyDirectoryPanelAdditionalActionLinksProvider().get(
                     type,
                     model.getObject(),
                     realm,
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ApplicationDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ApplicationDirectoryPanel.java
index a4f1a28..dcad92f 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ApplicationDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ApplicationDirectoryPanel.java
@@ -64,7 +64,7 @@ public class ApplicationDirectoryPanel extends
 
     private static final long serialVersionUID = -5491515010207202168L;
 
-    protected final BaseModal<PrivilegeTO> privilegeModal = new BaseModal<PrivilegeTO>("outer") {
+    protected final BaseModal<PrivilegeTO> privilegeModal = new BaseModal<PrivilegeTO>(Constants.OUTER) {
 
         private static final long serialVersionUID = 389935548143327858L;
 
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
index ad4c7e2..885ee9d 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
@@ -61,11 +61,6 @@ public abstract class DirectoryPanel<
 
     protected static final ObjectMapper MAPPER = new ObjectMapper();
 
-    /**
-     * Application preferences.
-     */
-    protected PreferenceManager prefMan = new PreferenceManager();
-
     protected E restClient;
 
     /**
@@ -105,9 +100,9 @@ public abstract class DirectoryPanel<
 
     protected String itemKeyFieldName = Constants.KEY_FIELD_NAME;
 
-    protected final BaseModal<W> altDefaultModal = new BaseModal<>("outer");
+    protected final BaseModal<W> altDefaultModal = new BaseModal<>(Constants.OUTER);
 
-    protected final BaseModal<W> displayAttributeModal = new BaseModal<>("outer");
+    protected final BaseModal<W> displayAttributeModal = new BaseModal<>(Constants.OUTER);
 
     protected ActionLinksTogglePanel<T> actionTogglePanel;
 
@@ -150,7 +145,7 @@ public abstract class DirectoryPanel<
         super(id, wizardInModal);
         setOutputMarkupId(true);
 
-        actionTogglePanel = new ActionLinksTogglePanel<>("outer", builder.getPageRef());
+        actionTogglePanel = new ActionLinksTogglePanel<>(Constants.OUTER, builder.getPageRef());
         addOuterObject(actionTogglePanel);
 
         addOuterObject(altDefaultModal);
@@ -226,7 +221,7 @@ public abstract class DirectoryPanel<
 
             @Override
             protected void onUpdate(final AjaxRequestTarget target) {
-                prefMan.set(getRequest(), getResponse(), paginatorRowsKey(), String.valueOf(rows));
+                PreferenceManager.set(getRequest(), getResponse(), paginatorRowsKey(), String.valueOf(rows));
 
                 EventDataWrapper data = new EventDataWrapper();
                 data.setTarget(target);
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DisplayAttributesModalPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DisplayAttributesModalPanel.java
index 0822212..0e5094a 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DisplayAttributesModalPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DisplayAttributesModalPanel.java
@@ -57,8 +57,6 @@ public abstract class DisplayAttributesModalPanel<T extends Serializable> extend
      */
     private static final int MAX_SELECTIONS = 9;
 
-    private final PreferenceManager prefMan = new PreferenceManager();
-
     private final List<String> selectedDetails;
 
     private final List<String> selectedPlainSchemas;
@@ -131,7 +129,7 @@ public abstract class DisplayAttributesModalPanel<T extends Serializable> extend
                 setAllowOrder(true).
                 setAllowMoveAll(true).
                 build("details",
-                        new PropertyModel<List<String>>(this, "selectedDetails"),
+                        new PropertyModel<>(this, "selectedDetails"),
                         new ListModel<>(fnames.getObject()));
         details.hideLabel();
         details.setOutputMarkupId(true);
@@ -141,7 +139,7 @@ public abstract class DisplayAttributesModalPanel<T extends Serializable> extend
                 setAllowOrder(true).
                 setAllowMoveAll(true).
                 build("plainSchemas",
-                        new PropertyModel<List<String>>(this, "selectedPlainSchemas"),
+                        new PropertyModel<>(this, "selectedPlainSchemas"),
                         new ListModel<>(psnames.getObject()));
         plainSchemas.hideLabel();
         plainSchemas.setOutputMarkupId(true);
@@ -151,7 +149,7 @@ public abstract class DisplayAttributesModalPanel<T extends Serializable> extend
                 setAllowOrder(true).
                 setAllowMoveAll(true).
                 build("derSchemas",
-                        new PropertyModel<List<String>>(this, "selectedDerSchemas"),
+                        new PropertyModel<>(this, "selectedDerSchemas"),
                         new ListModel<>(dsnames.getObject()));
         derSchemas.hideLabel();
         derSchemas.setOutputMarkupId(true);
@@ -169,7 +167,7 @@ public abstract class DisplayAttributesModalPanel<T extends Serializable> extend
             prefs.put(DisplayAttributesModalPanel.getPrefDetailView(type), selectedDetails);
             prefs.put(DisplayAttributesModalPanel.getPrefPlainAttributeView(type), selectedPlainSchemas);
             prefs.put(DisplayAttributesModalPanel.getPrefDerivedAttributeView(type), selectedDerSchemas);
-            prefMan.setList(getRequest(), getResponse(), prefs);
+            PreferenceManager.setList(getRequest(), getResponse(), prefs);
 
             SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
             modal.close(target);
@@ -177,19 +175,19 @@ public abstract class DisplayAttributesModalPanel<T extends Serializable> extend
         }
     }
 
-    protected static final String getPrefDetailView(final String type) {
+    public static final String getPrefDetailView(final String type) {
         return String.format(Constants.PREF_ANY_DETAILS_VIEW, type);
     }
 
-    protected static final String getPrefPlainAttributeView(final String type) {
+    public static final String getPrefPlainAttributeView(final String type) {
         return String.format(Constants.PREF_ANY_PLAIN_ATTRS_VIEW, type);
     }
 
-    protected static final String getPrefDerivedAttributeView(final String type) {
+    public static final String getPrefDerivedAttributeView(final String type) {
         return String.format(Constants.PREF_ANY_DER_ATTRS_VIEW, type);
     }
 
-    protected static final Class<? extends AnyTO> getTOClass(final String type) {
+    public static final Class<? extends AnyTO> getTOClass(final String type) {
         if (type.equalsIgnoreCase(AnyTypeKind.USER.name())) {
             return UserTO.class;
         } else if (type.equalsIgnoreCase(AnyTypeKind.GROUP.name())) {
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DomainDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DomainDirectoryPanel.java
index 0aa5e0d..6f206ad 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DomainDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DomainDirectoryPanel.java
@@ -57,7 +57,7 @@ public class DomainDirectoryPanel extends DirectoryPanel<Domain, Domain, DomainP
     @SpringBean
     private DomainOps domainOps;
 
-    private final BaseModal<Domain> utilityModal = new BaseModal<>("outer");
+    private final BaseModal<Domain> utilityModal = new BaseModal<>(Constants.OUTER);
 
     public DomainDirectoryPanel(final String id, final PageReference pageRef) {
         super(id, pageRef);
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java
index 2c9a74b..a978417 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java
@@ -76,9 +76,9 @@ public class GroupDirectoryPanel extends AnyDirectoryPanel<GroupTO, GroupRestCli
 
     private static final long serialVersionUID = -1100228004207271270L;
 
-    private final BaseModal<Serializable> typeExtensionsModal = new BaseModal<>("outer");
+    private final BaseModal<Serializable> typeExtensionsModal = new BaseModal<>(Constants.OUTER);
 
-    protected final BaseModal<Serializable> membersModal = new BaseModal<>("outer");
+    protected final BaseModal<Serializable> membersModal = new BaseModal<>(Constants.OUTER);
 
     protected final MembersTogglePanel templates;
 
@@ -296,7 +296,7 @@ public class GroupDirectoryPanel extends AnyDirectoryPanel<GroupTO, GroupRestCli
                 String.format("%s,%s", IdRepoEntitlement.TASK_CREATE, IdRepoEntitlement.TASK_EXECUTE)).
                 setRealm(realm);
 
-        SyncopeWebApplication.get().getAnyDirectoryPanelAditionalActionLinksProvider().get(
+        SyncopeWebApplication.get().getAnyDirectoryPanelAdditionalActionLinksProvider().get(
                 model.getObject(),
                 realm,
                 altDefaultModal,
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
index fbcd14b..b646d69 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
@@ -162,17 +162,17 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan
 
             @Override
             protected void populateItem(final ListItem<T> beanItem) {
-                beanItem.add(new Check<>("check", beanItem.getModel(), checkGroup).setOutputMarkupId(true)
-                        .setOutputMarkupPlaceholderTag(true)
-                        .setVisible(ListViewPanel.this.check.getObject() == CheckAvailability.AVAILABLE
-                                || ListViewPanel.this.check.getObject() == CheckAvailability.DISABLED)
-                        .setEnabled(ListViewPanel.this.check.getObject() == CheckAvailability.AVAILABLE));
+                beanItem.add(new Check<>("check", beanItem.getModel(), checkGroup).setOutputMarkupId(true).
+                        setOutputMarkupPlaceholderTag(true).
+                        setVisible(ListViewPanel.this.check.getObject() == CheckAvailability.AVAILABLE
+                                || ListViewPanel.this.check.getObject() == CheckAvailability.DISABLED).
+                        setEnabled(ListViewPanel.this.check.getObject() == CheckAvailability.AVAILABLE));
 
                 final T bean = beanItem.getModelObject();
 
                 final ListView<String> fields = new ListView<String>("fields", toBeIncluded) {
 
-                    private static final long serialVersionUID = 1L;
+                    private static final long serialVersionUID = -9112553137618363167L;
 
                     @Override
                     protected void populateItem(final ListItem<String> fieldItem) {
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/MembersTogglePanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/MembersTogglePanel.java
index 80fbe93..685b130 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/MembersTogglePanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/MembersTogglePanel.java
@@ -25,6 +25,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.rest.AnyTypeRestClient;
+import org.apache.syncope.client.ui.commons.Constants;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDropDownChoicePanel;
 import org.apache.syncope.client.ui.commons.markup.html.form.FieldPanel;
 import org.apache.syncope.common.lib.SyncopeClientException;
@@ -59,7 +60,7 @@ public abstract class MembersTogglePanel extends TogglePanel<Serializable> {
     };
 
     public MembersTogglePanel(final PageReference pageRef) {
-        super("outer", "groupMembers", pageRef);
+        super(Constants.OUTER, "groupMembers", pageRef);
 
         form = new Form<>("membersForm");
         addInnerObject(form);
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
index 077a11b..7793f07 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
@@ -74,9 +74,9 @@ public class RoleDirectoryPanel extends DirectoryPanel<RoleTO, RoleWrapper, Role
 
     private static final long serialVersionUID = -1100228004207271270L;
 
-    protected final BaseModal<String> utilityModal = new BaseModal<>("outer");
+    protected final BaseModal<String> utilityModal = new BaseModal<>(Constants.OUTER);
 
-    protected final BaseModal<Serializable> membersModal = new BaseModal<>("outer");
+    protected final BaseModal<Serializable> membersModal = new BaseModal<>(Constants.OUTER);
 
     protected RoleDirectoryPanel(final String id, final Builder builder) {
         super(id, builder);
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java
index 31b5436..9dd6a8d 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java
@@ -223,7 +223,7 @@ public class UserDirectoryPanel extends AnyDirectoryPanel<UserTO, UserRestClient
                         setRealms(realm, model.getObject().getDynRealms());
             }
 
-            SyncopeWebApplication.get().getAnyDirectoryPanelAditionalActionLinksProvider().get(
+            SyncopeWebApplication.get().getAnyDirectoryPanelAdditionalActionLinksProvider().get(
                     model,
                     realm,
                     altDefaultModal,
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.java
index e4c6fb3..c429d7e 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.java
@@ -66,7 +66,7 @@ public abstract class PolicyDirectoryPanel<T extends PolicyTO>
 
     private static final long serialVersionUID = 4984337552918213290L;
 
-    protected final BaseModal<T> ruleCompositionModal = new BaseModal<T>("outer") {
+    protected final BaseModal<T> ruleCompositionModal = new BaseModal<T>(Constants.OUTER) {
 
         private static final long serialVersionUID = 389935548143327858L;
 
@@ -78,7 +78,7 @@ public abstract class PolicyDirectoryPanel<T extends PolicyTO>
 
     };
 
-    protected final BaseModal<T> policySpecModal = new BaseModal<>("outer");
+    protected final BaseModal<T> policySpecModal = new BaseModal<>(Constants.OUTER);
 
     private final PolicyType type;
 
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportExecutionDetails.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportExecutionDetails.java
index da638bc..2009bbb 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportExecutionDetails.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportExecutionDetails.java
@@ -18,24 +18,20 @@
  */
 package org.apache.syncope.client.console.reports;
 
-import org.apache.syncope.client.ui.commons.HttpResourceStream;
 import org.apache.syncope.client.console.panels.MultilevelPanel;
 import org.apache.syncope.client.console.rest.ExecutionRestClient;
 import org.apache.syncope.client.console.rest.ReportRestClient;
 import org.apache.syncope.client.console.tasks.ExecutionsDirectoryPanel;
-import org.apache.syncope.client.console.wicket.ajax.form.AbstractAjaxDownloadBehavior;
+import org.apache.syncope.client.console.wicket.ajax.form.AjaxDownloadBehavior;
 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.to.ExecTO;
 import org.apache.syncope.common.lib.to.ReportTO;
-import org.apache.syncope.common.lib.types.ReportExecExportFormat;
 import org.apache.syncope.common.lib.types.IdRepoEntitlement;
+import org.apache.syncope.common.lib.types.ReportExecExportFormat;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.util.resource.IResourceStream;
-
-import java.util.Optional;
 
 /**
  * Modal window with report executions.
@@ -59,7 +55,7 @@ public class ReportExecutionDetails extends MultilevelPanel.SecondLevel {
 
         private final MultilevelPanel mlp;
 
-        private final AjaxExportDownloadBehavior downloadBehavior;
+        private final AjaxDownloadBehavior downloadBehavior;
 
         ReportExecutionDirectoryPanel(
                 final MultilevelPanel multiLevelPanelRef,
@@ -69,7 +65,7 @@ public class ReportExecutionDetails extends MultilevelPanel.SecondLevel {
             super(multiLevelPanelRef, key, executionRestClient, pageRef);
             this.mlp = multiLevelPanelRef;
 
-            this.downloadBehavior = new AjaxExportDownloadBehavior();
+            this.downloadBehavior = new AjaxDownloadBehavior();
             this.add(downloadBehavior);
         }
 
@@ -89,7 +85,8 @@ public class ReportExecutionDetails extends MultilevelPanel.SecondLevel {
 
                 @Override
                 public void onClick(final AjaxRequestTarget target, final ExecTO ignore) {
-                    downloadBehavior.setDetails(model.getObject().getKey(), ReportExecExportFormat.CSV);
+                    downloadBehavior.setResponse(() -> ReportRestClient.exportExecutionResult(
+                            model.getObject().getKey(), ReportExecExportFormat.CSV));
                     downloadBehavior.initiate(target);
                 }
             }, ActionLink.ActionType.EXPORT_CSV, IdRepoEntitlement.REPORT_READ);
@@ -100,7 +97,8 @@ public class ReportExecutionDetails extends MultilevelPanel.SecondLevel {
 
                 @Override
                 public void onClick(final AjaxRequestTarget target, final ExecTO ignore) {
-                    downloadBehavior.setDetails(model.getObject().getKey(), ReportExecExportFormat.HTML);
+                    downloadBehavior.setResponse(() -> ReportRestClient.exportExecutionResult(
+                            model.getObject().getKey(), ReportExecExportFormat.HTML));
                     downloadBehavior.initiate(target);
                 }
             }, ActionLink.ActionType.EXPORT_HTML, IdRepoEntitlement.REPORT_READ);
@@ -111,7 +109,8 @@ public class ReportExecutionDetails extends MultilevelPanel.SecondLevel {
 
                 @Override
                 public void onClick(final AjaxRequestTarget target, final ExecTO ignore) {
-                    downloadBehavior.setDetails(model.getObject().getKey(), ReportExecExportFormat.PDF);
+                    downloadBehavior.setResponse(() -> ReportRestClient.exportExecutionResult(
+                            model.getObject().getKey(), ReportExecExportFormat.PDF));
                     downloadBehavior.initiate(target);
                 }
             }, ActionLink.ActionType.EXPORT_PDF, IdRepoEntitlement.REPORT_READ);
@@ -122,7 +121,8 @@ public class ReportExecutionDetails extends MultilevelPanel.SecondLevel {
 
                 @Override
                 public void onClick(final AjaxRequestTarget target, final ExecTO ignore) {
-                    downloadBehavior.setDetails(model.getObject().getKey(), ReportExecExportFormat.RTF);
+                    downloadBehavior.setResponse(() -> ReportRestClient.exportExecutionResult(
+                            model.getObject().getKey(), ReportExecExportFormat.RTF));
                     downloadBehavior.initiate(target);
                 }
             }, ActionLink.ActionType.EXPORT_RTF, IdRepoEntitlement.REPORT_READ);
@@ -133,47 +133,11 @@ public class ReportExecutionDetails extends MultilevelPanel.SecondLevel {
 
                 @Override
                 public void onClick(final AjaxRequestTarget target, final ExecTO ignore) {
-                    downloadBehavior.setDetails(model.getObject().getKey(), ReportExecExportFormat.XML);
+                    downloadBehavior.setResponse(() -> ReportRestClient.exportExecutionResult(
+                            model.getObject().getKey(), ReportExecExportFormat.XML));
                     downloadBehavior.initiate(target);
                 }
             }, ActionLink.ActionType.EXPORT_XML, IdRepoEntitlement.REPORT_READ);
         }
     }
-
-    private static class AjaxExportDownloadBehavior extends AbstractAjaxDownloadBehavior {
-
-        private static final long serialVersionUID = 3109256773218160485L;
-
-        private String execution;
-
-        private ReportExecExportFormat exportFormat;
-
-        private HttpResourceStream stream;
-
-        public AjaxExportDownloadBehavior setDetails(
-                final String execution, final ReportExecExportFormat exportFormat) {
-            this.execution = execution;
-            this.exportFormat = exportFormat;
-            this.stream = null;
-            return this;
-        }
-
-        private void createResourceStream() {
-            if (stream == null) {
-                stream = new HttpResourceStream(ReportRestClient.exportExecutionResult(execution, exportFormat));
-            }
-        }
-
-        @Override
-        protected String getFileName() {
-            createResourceStream();
-            return Optional.ofNullable(stream).map(HttpResourceStream::getFilename).orElse(null);
-        }
-
-        @Override
-        protected IResourceStream getResourceStream() {
-            createResourceStream();
-            return stream;
-        }
-    }
 }
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java
index 53f2a81..03eec32 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java
@@ -63,7 +63,7 @@ public class ReportTemplateDirectoryPanel
 
     private static final long serialVersionUID = -3789392431954221446L;
 
-    protected final BaseModal<String> utilityModal = new BaseModal<>("outer");
+    protected final BaseModal<String> utilityModal = new BaseModal<>(Constants.OUTER);
 
     public ReportTemplateDirectoryPanel(final String id, final PageReference pageRef) {
         super(id, pageRef);
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/form/AbstractAjaxDownloadBehavior.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/form/AjaxDownloadBehavior.java
similarity index 67%
rename from client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/form/AbstractAjaxDownloadBehavior.java
rename to client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/form/AjaxDownloadBehavior.java
index 8a175a3..36a61fe 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/form/AbstractAjaxDownloadBehavior.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/form/AjaxDownloadBehavior.java
@@ -18,6 +18,9 @@
  */
 package org.apache.syncope.client.console.wicket.ajax.form;
 
+import javax.ws.rs.core.Response;
+import org.apache.syncope.client.console.SerializableSupplier;
+import org.apache.syncope.client.ui.commons.HttpResourceStream;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.behavior.AbstractAjaxBehavior;
 import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler;
@@ -26,11 +29,15 @@ import org.apache.wicket.util.time.Duration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public abstract class AbstractAjaxDownloadBehavior extends AbstractAjaxBehavior {
+public class AjaxDownloadBehavior extends AbstractAjaxBehavior {
 
     private static final long serialVersionUID = 6833760760338614245L;
 
-    protected static final Logger LOG = LoggerFactory.getLogger(AbstractAjaxDownloadBehavior.class);
+    protected static final Logger LOG = LoggerFactory.getLogger(AjaxDownloadBehavior.class);
+
+    protected SerializableSupplier<Response> response;
+
+    protected HttpResourceStream stream;
 
     /**
      * Call this method to initiate the download.
@@ -39,7 +46,7 @@ public abstract class AbstractAjaxDownloadBehavior extends AbstractAjaxBehavior
      */
     public void initiate(final AjaxRequestTarget target) {
         CharSequence url = getCallbackUrl();
-        target.appendJavaScript("window.location.href='" + url + '\'');
+        target.appendJavaScript("window.location.href='" + url + "'");
     }
 
     @Override
@@ -54,7 +61,28 @@ public abstract class AbstractAjaxDownloadBehavior extends AbstractAjaxBehavior
         }
     }
 
-    protected abstract String getFileName();
+    public boolean hasResponse() {
+        return response != null;
+    }
+
+    public void setResponse(final SerializableSupplier<Response> response) {
+        this.response = response;
+    }
 
-    protected abstract IResourceStream getResourceStream();
+    private void createResourceStream() {
+        if (stream == null && response != null) {
+            stream = new HttpResourceStream(response.get());
+            response = null;
+        }
+    }
+
+    protected String getFileName() {
+        createResourceStream();
+        return stream == null ? null : stream.getFilename();
+    }
+
+    protected IResourceStream getResourceStream() {
+        createResourceStream();
+        return stream;
+    }
 }
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java
index 2867d95..43442db 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java
@@ -54,7 +54,7 @@ public final class ActionPanel<T extends Serializable> extends Panel {
     private final Action<T> action;
 
     public ActionPanel(final IModel<T> model, final Action<T> action) {
-        this("action", model, action);
+        this(Constants.ACTION, model, action);
     }
 
     public ActionPanel(final String componentId, final IModel<T> model, final Action<T> action) {
@@ -74,7 +74,7 @@ public final class ActionPanel<T extends Serializable> extends Panel {
 
         if (action.getLink() == null || action.getType() == ActionType.NOT_FOUND) {
             enabled = true;
-            actionLink = new IndicatingAjaxLink<Void>("action") {
+            actionLink = new IndicatingAjaxLink<Void>(Constants.ACTION) {
 
                 private static final long serialVersionUID = -7978723352517770644L;
 
@@ -90,13 +90,13 @@ public final class ActionPanel<T extends Serializable> extends Panel {
         } else if (action.getType() == ActionType.EXTERNAL_EDITOR) {
             enabled = action.getLink().isEnabled(obj);
             actionLink = new BookmarkablePageLink<>(
-                    "action", action.getLink().getPageClass(), action.getLink().getPageParameters()).
+                    Constants.ACTION, action.getLink().getPageClass(), action.getLink().getPageParameters()).
                     setPopupSettings(new VeilPopupSettings().setHeight(600).setWidth(800));
         } else {
             enabled = action.getLink().isEnabled(obj);
 
             actionLink = action.isOnConfirm()
-                    ? new IndicatingOnConfirmAjaxLink<Void>("action", enabled) {
+                    ? new IndicatingOnConfirmAjaxLink<Void>(Constants.ACTION, enabled) {
 
                 private static final long serialVersionUID = -7978723352517770644L;
 
@@ -112,7 +112,7 @@ public final class ActionPanel<T extends Serializable> extends Panel {
                             ? StringUtils.EMPTY : Constants.VEIL_INDICATOR_MARKUP_ID;
                 }
             }
-                    : new IndicatingAjaxLink<Void>("action") {
+                    : new IndicatingAjaxLink<Void>(Constants.ACTION) {
 
                 private static final long serialVersionUID = -7978723352517770644L;
 
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxCharacterFieldPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxCharacterFieldPanel.java
new file mode 100644
index 0000000..a880b95
--- /dev/null
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxCharacterFieldPanel.java
@@ -0,0 +1,134 @@
+/*
+ * 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.wicket.markup.html.form;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipConfig;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import org.apache.syncope.client.ui.commons.Constants;
+import org.apache.syncope.client.ui.commons.ajax.form.IndicatorAjaxFormComponentUpdatingBehavior;
+import org.apache.syncope.client.ui.commons.ajax.form.IndicatorAutoCompleteBehavior;
+import org.apache.syncope.client.ui.commons.markup.html.form.FieldPanel;
+import org.apache.wicket.Component;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteBehavior;
+import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteSettings;
+import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteTextField;
+import org.apache.wicket.extensions.ajax.markup.html.autocomplete.IAutoCompleteRenderer;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.validation.IValidator;
+
+public class AjaxCharacterFieldPanel extends FieldPanel<Character> implements Cloneable {
+
+    private static final long serialVersionUID = 238940918106696068L;
+
+    private Component questionMarkJexlHelp;
+
+    private List<Character> choices = Collections.emptyList();
+
+    public AjaxCharacterFieldPanel(final String id, final String name, final IModel<Character> model) {
+        this(id, name, model, true);
+    }
+
+    public AjaxCharacterFieldPanel(
+            final String id, final String name, final IModel<Character> model, final boolean enableOnChange) {
+        super(id, name, model);
+
+        questionMarkJexlHelp = Constants.getJEXLPopover(this, TooltipConfig.Placement.right);
+        add(questionMarkJexlHelp.setVisible(false));
+
+        final AutoCompleteSettings settings = new AutoCompleteSettings();
+        settings.setShowCompleteListOnFocusGain(true);
+        settings.setShowListOnEmptyInput(true);
+        settings.setCssClassName("custom-autocomplete-box");
+
+        field = new AutoCompleteTextField<Character>("textField", model, settings) {
+
+            private static final long serialVersionUID = -6648767303091874219L;
+
+            @Override
+            protected Iterator<Character> getChoices(final String input) {
+                return AjaxCharacterFieldPanel.this.getChoices(input);
+            }
+
+            @Override
+            protected AutoCompleteBehavior<Character> newAutoCompleteBehavior(
+                    final IAutoCompleteRenderer<Character> renderer, final AutoCompleteSettings settings) {
+                return new IndicatorAutoCompleteBehavior<Character>(renderer, settings) {
+
+                    private static final long serialVersionUID = 1070808433195962931L;
+
+                    @Override
+                    protected Iterator<Character> getChoices(final String input) {
+                        return AjaxCharacterFieldPanel.this.getChoices(input);
+                    }
+                };
+            }
+        };
+        add(field.setLabel(new ResourceModel(name, name)).setOutputMarkupId(true));
+
+        if (enableOnChange && !isReadOnly()) {
+            field.add(new IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+
+                private static final long serialVersionUID = -1107858522700306810L;
+
+                @Override
+                protected void onUpdate(final AjaxRequestTarget target) {
+                    // nothing to do
+                }
+            });
+        }
+    }
+
+    public void addValidator(final IValidator<? super Character> validator) {
+        this.field.add(validator);
+    }
+
+    public void setChoices(final List<Character> choices) {
+        if (choices != null) {
+            this.choices = choices;
+        }
+    }
+
+    public FieldPanel<Character> enableJexlHelp() {
+        questionMarkJexlHelp.setVisible(true);
+        return this;
+    }
+
+    public FieldPanel<Character> enableJexlHelp(final String... jexlExamples) {
+        questionMarkJexlHelp = Constants.getJEXLPopover(this, TooltipConfig.Placement.bottom, jexlExamples);
+        addOrReplace(questionMarkJexlHelp.setVisible(true));
+        return this;
+    }
+
+    protected Iterator<Character> getChoices(final String input) {
+        return choices.stream().
+                filter(choice -> input != null && input.length() > 0 && input.toCharArray()[0] == choice).
+                iterator();
+    }
+
+    @Override
+    public FieldPanel<Character> clone() {
+        final AjaxCharacterFieldPanel panel = (AjaxCharacterFieldPanel) super.clone();
+        panel.setChoices(choices);
+        return panel;
+    }
+}
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/BaseAjaxWizardBuilder.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/BaseAjaxWizardBuilder.java
index ff5d427..dcf7d95 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/BaseAjaxWizardBuilder.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/BaseAjaxWizardBuilder.java
@@ -53,7 +53,7 @@ public abstract class BaseAjaxWizardBuilder<T extends Serializable> extends Ajax
     @Override
     protected Future<Pair<Serializable, Serializable>> execute(
             final Callable<Pair<Serializable, Serializable>> future) {
+
         return SyncopeConsoleSession.get().execute(future);
     }
-
 }
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
index bb744a2..12b37c6 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
@@ -85,7 +85,7 @@ public abstract class WizardMgtPanel<T extends Serializable> extends AbstractWiz
 
     private final List<Component> outerObjects = new ArrayList<>();
 
-    protected final BaseModal<T> modal = new BaseModal<T>("outer") {
+    protected final BaseModal<T> modal = new BaseModal<T>(Constants.OUTER) {
 
         private static final long serialVersionUID = 389935548143327858L;
 
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/ResultPage.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/ResultPage.java
index 9149d31..149b035 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/ResultPage.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/ResultPage.java
@@ -25,6 +25,7 @@ import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel;
+import org.apache.syncope.client.ui.commons.Constants;
 import org.apache.syncope.client.ui.commons.panels.WizardModalPanel;
 
 public abstract class ResultPage<T extends Serializable> extends Panel implements WizardModalPanel<T> {
@@ -43,9 +44,7 @@ public abstract class ResultPage<T extends Serializable> extends Panel implement
 
         add(customResultBody("customResultBody", item, result));
 
-        final ActionsPanel<T> panel = new ActionsPanel<>("action", null);
-        add(panel);
-
+        ActionsPanel<T> panel = new ActionsPanel<>(Constants.ACTION, null);
         panel.add(new ActionLink<T>() {
 
             private static final long serialVersionUID = 3257738274365467945L;
@@ -55,8 +54,7 @@ public abstract class ResultPage<T extends Serializable> extends Panel implement
                 closeAction(target);
             }
         }, ActionLink.ActionType.CLOSE, StringUtils.EMPTY).hideLabel();
-
-        panel.setRenderBodyOnly(true);
+        add(panel.setRenderBodyOnly(true));
     }
 
     protected abstract void closeAction(AjaxRequestTarget target);
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel.html
new file mode 100644
index 0000000..4466dfa
--- /dev/null
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel.html
@@ -0,0 +1,30 @@
+<!--
+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:extend>
+    <div style="float: left;padding-top: 15px;">
+      <a href="#" class="btn btn-primary btn-circle btn-lg" wicket:id="csvPush" wicket:message="title:csvPushTitle">
+        <i class="fa fa-download" aria-hidden="true"></i>
+      </a>
+      <a href="#" class="btn btn-primary btn-circle btn-lg" wicket:id="csvPull" wicket:message="title:csvPullTitle">
+        <i class="fa fa-upload" aria-hidden="true"></i>
+      </a>
+    </div>
+  </wicket:extend>
+</html>
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel.properties
new file mode 100644
index 0000000..d65e32b
--- /dev/null
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel.properties
@@ -0,0 +1,20 @@
+# 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.
+csvPush=Export current ${anyTypeKey} selection to CSV
+csvPull=Import ${anyTypeKey} from CSV into Realm ${destinationRealm}
+csvPushTitle=Export to CSV
+csvPullTitle=Import from CSV
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel_fr_CA.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel_fr_CA.properties
new file mode 100644
index 0000000..3b7d66a
--- /dev/null
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel_fr_CA.properties
@@ -0,0 +1,20 @@
+# 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.
+csvPush=Exporter la s\u00e9lection actuelle de $ {anyTypeKey} vers CSV
+csvPull=Importer ${anyTypeKey} depuis CSV en Realm ${destinationRealm}
+csvPushTitle=Export to CSV
+csvPullTitle=Importer depuis CSV
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel_it.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel_it.properties
new file mode 100644
index 0000000..7aba06c
--- /dev/null
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel_it.properties
@@ -0,0 +1,20 @@
+# 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.
+csvPush=Esporta la selezione corrente di ${anyTypeKey} su CSV
+csvPull=Importa ${anyTypeKey} da CSV nel Realm ${destinationRealm}
+csvPushTitle=Esporta su CSV
+csvPullTitle=Importa da CSV
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel_ja.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel_ja.properties
new file mode 100644
index 0000000..d65e32b
--- /dev/null
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel_ja.properties
@@ -0,0 +1,20 @@
+# 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.
+csvPush=Export current ${anyTypeKey} selection to CSV
+csvPull=Import ${anyTypeKey} from CSV into Realm ${destinationRealm}
+csvPushTitle=Export to CSV
+csvPullTitle=Import from CSV
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel_pt_BR.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel_pt_BR.properties
new file mode 100644
index 0000000..d65e32b
--- /dev/null
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel_pt_BR.properties
@@ -0,0 +1,20 @@
+# 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.
+csvPush=Export current ${anyTypeKey} selection to CSV
+csvPull=Import ${anyTypeKey} from CSV into Realm ${destinationRealm}
+csvPushTitle=Export to CSV
+csvPullTitle=Import from CSV
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel_ru.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel_ru.properties
new file mode 100644
index 0000000..d65e32b
--- /dev/null
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AnyDirectoryPanel_ru.properties
@@ -0,0 +1,20 @@
+# 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.
+csvPush=Export current ${anyTypeKey} selection to CSV
+csvPull=Import ${anyTypeKey} from CSV into Realm ${destinationRealm}
+csvPushTitle=Export to CSV
+csvPullTitle=Import from CSV
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxCharacterFieldPanel.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxCharacterFieldPanel.html
new file mode 100644
index 0000000..2c1b7bb
--- /dev/null
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxCharacterFieldPanel.html
@@ -0,0 +1,30 @@
+<!--
+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:extend>
+    <wicket:enclosure child="field-label">
+      <label wicket:id="field-label">[LABEL]</label><span wicket:id="required"/>
+      <span wicket:id="jexlInfo" class="glyphicon glyphicon-info-sign" style="cursor: pointer"></span>
+      <span wicket:id="externalAction"/>
+    </wicket:enclosure>
+    <fieldset class="input-group">
+      <input type="text" class="form-control" wicket:id="textField" placeholder=""/>
+    </fieldset>
+  </wicket:extend>
+</html>
diff --git a/client/idrepo/console/src/test/java/org/apache/syncope/client/console/AbstractTest.java b/client/idrepo/console/src/test/java/org/apache/syncope/client/console/AbstractTest.java
index 8f34e28..40c4a0c 100644
--- a/client/idrepo/console/src/test/java/org/apache/syncope/client/console/AbstractTest.java
+++ b/client/idrepo/console/src/test/java/org/apache/syncope/client/console/AbstractTest.java
@@ -37,10 +37,12 @@ import java.util.stream.Stream;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.cxf.jaxrs.client.Client;
 import org.apache.syncope.client.console.AbstractTest.TestSyncopeWebApplication.SyncopeServiceClient;
-import org.apache.syncope.client.console.commons.AnyDirectoryPanelAditionalActionLinksProvider;
+import org.apache.syncope.client.console.commons.AnyDirectoryPanelAdditionalActionLinksProvider;
+import org.apache.syncope.client.console.commons.AnyDirectoryPanelAdditionalActionsProvider;
 import org.apache.syncope.client.console.commons.AnyWizardBuilderAdditionalSteps;
 import org.apache.syncope.client.console.commons.ExternalResourceProvider;
-import org.apache.syncope.client.console.commons.IdRepoAnyDirectoryPanelAditionalActionLinksProvider;
+import org.apache.syncope.client.console.commons.IdRepoAnyDirectoryPanelAdditionalActionLinksProvider;
+import org.apache.syncope.client.console.commons.IdRepoAnyDirectoryPanelAdditionalActionsProvider;
 import org.apache.syncope.client.console.commons.IdRepoAnyWizardBuilderAdditionalSteps;
 import org.apache.syncope.client.console.commons.IdRepoExternalResourceProvider;
 import org.apache.syncope.client.console.commons.IdRepoImplementationInfoProvider;
@@ -136,6 +138,16 @@ public abstract class AbstractTest {
         }
 
         @Bean
+        public AnyDirectoryPanelAdditionalActionsProvider anyDirectoryPanelAdditionalActionsProvider() {
+            return new IdRepoAnyDirectoryPanelAdditionalActionsProvider();
+        }
+
+        @Bean
+        public AnyDirectoryPanelAdditionalActionLinksProvider anyDirectoryPanelAditionalActionLinksProvider() {
+            return new IdRepoAnyDirectoryPanelAdditionalActionLinksProvider();
+        }
+
+        @Bean
         public AnyWizardBuilderAdditionalSteps anyWizardBuilderAdditionalSteps() {
             return new IdRepoAnyWizardBuilderAdditionalSteps();
         }
@@ -151,11 +163,6 @@ public abstract class AbstractTest {
         }
 
         @Bean
-        public AnyDirectoryPanelAditionalActionLinksProvider anyDirectoryPanelAditionalActionLinksProvider() {
-            return new IdRepoAnyDirectoryPanelAditionalActionLinksProvider();
-        }
-
-        @Bean
         public ImplementationInfoProvider implementationInfoProvider() {
             return new IdRepoImplementationInfoProvider();
         }
diff --git a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeEnduserSession.java b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeEnduserSession.java
index c1d45c8..c1358b4 100644
--- a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeEnduserSession.java
+++ b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeEnduserSession.java
@@ -179,6 +179,7 @@ public class SyncopeEnduserSession extends WebSession implements BaseSession {
         return getService(serviceClass);
     }
 
+    @Override
     public <T> T getService(final Class<T> serviceClass) {
         T service = (client == null || !isAuthenticated())
                 ? anonymousClient.getService(serviceClass)
@@ -187,6 +188,7 @@ public class SyncopeEnduserSession extends WebSession implements BaseSession {
         return service;
     }
 
+    @Override
     public <T> T getService(final String etag, final Class<T> serviceClass) {
         T serviceInstance = getService(serviceClass);
         WebClient.client(serviceInstance).match(new EntityTag(etag), false).
@@ -195,21 +197,6 @@ public class SyncopeEnduserSession extends WebSession implements BaseSession {
         return serviceInstance;
     }
 
-    public <T> T getService(final MediaType mediaType, final Class<T> serviceClass) {
-        T service;
-
-        synchronized (clientFactory) {
-            SyncopeClientFactoryBean.ContentType preType = clientFactory.getContentType();
-
-            clientFactory.setContentType(SyncopeClientFactoryBean.ContentType.fromString(mediaType.toString()));
-            service = clientFactory.create(getJWT()).getService(serviceClass);
-
-            clientFactory.setContentType(preType);
-        }
-
-        return service;
-    }
-
     public UserTO getSelfTO() {
         if (selfTO == null) {
             throw new IllegalArgumentException("User not authenticated");
@@ -246,11 +233,13 @@ public class SyncopeEnduserSession extends WebSession implements BaseSession {
         return service;
     }
 
+    @Override
     public <T> void resetClient(final Class<T> service) {
         T serviceInstance = getCachedService(service);
         WebClient.client(serviceInstance).reset();
     }
 
+    @Override
     public FastDateFormat getDateFormat() {
         return FastDateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, getLocale());
     }
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/enduser/pages/WizardMgtPanel.html b/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/enduser/pages/WizardMgtPanel.html
index 80736d2..995c7ea 100644
--- a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/enduser/pages/WizardMgtPanel.html
+++ b/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/enduser/pages/WizardMgtPanel.html
@@ -42,11 +42,11 @@ under the License.
       <wicket:child/>
 
       <wicket:enclosure child="add">
-        <div class="modal-footer" style="text-align: right">
-          <a href="#"  class="btn btn-default btn-circle btn-lg pull-left" wicket:id="exit">
+        <div class="modal-footer">
+          <a href="#" class="btn btn-default btn-circle btn-lg pull-left" wicket:id="exit">
             <i class="fa fa-sign-out"></i>
           </a>
-          <a href="#"  class="btn btn-primary btn-circle btn-lg" wicket:id="add">
+          <a href="#" class="btn btn-primary btn-circle btn-lg" wicket:id="add">
             <i class="glyphicon glyphicon-plus"></i>
           </a>
         </div>
diff --git a/common/idm/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AbstractCSVSpec.java b/common/idm/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AbstractCSVSpec.java
index 7844335..81ba8f3 100644
--- a/common/idm/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AbstractCSVSpec.java
+++ b/common/idm/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AbstractCSVSpec.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.common.rest.api.beans;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 import javax.validation.constraints.NotNull;
@@ -25,7 +26,9 @@ import javax.ws.rs.QueryParam;
 import org.apache.syncope.common.lib.types.MatchingRule;
 import org.apache.syncope.common.lib.types.UnmatchingRule;
 
-public abstract class AbstractCSVSpec {
+public abstract class AbstractCSVSpec implements Serializable {
+
+    private static final long serialVersionUID = 2253975790270165334L;
 
     protected abstract static class Builder<T extends AbstractCSVSpec, B extends Builder<T, B>> {
 
diff --git a/common/idm/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/CSVPullSpec.java b/common/idm/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/CSVPullSpec.java
index 7bb8a2d..ac6d309 100644
--- a/common/idm/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/CSVPullSpec.java
+++ b/common/idm/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/CSVPullSpec.java
@@ -29,6 +29,8 @@ import org.apache.syncope.common.lib.types.ConflictResolutionAction;
 
 public class CSVPullSpec extends AbstractCSVSpec {
 
+    private static final long serialVersionUID = -5079876176017613587L;
+
     public static class Builder extends AbstractCSVSpec.Builder<CSVPullSpec, Builder> {
 
         @Override
diff --git a/common/idm/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/CSVPushSpec.java b/common/idm/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/CSVPushSpec.java
index 92b2196..7663010 100644
--- a/common/idm/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/CSVPushSpec.java
+++ b/common/idm/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/CSVPushSpec.java
@@ -25,6 +25,8 @@ import javax.ws.rs.QueryParam;
 
 public class CSVPushSpec extends AbstractCSVSpec {
 
+    private static final long serialVersionUID = -8198709720749169648L;
+
     public static class Builder extends AbstractCSVSpec.Builder<CSVPushSpec, Builder> {
 
         @Override
diff --git a/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/RESTHeaders.java b/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/RESTHeaders.java
index fdabce0..428fc53 100644
--- a/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/RESTHeaders.java
+++ b/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/RESTHeaders.java
@@ -73,6 +73,11 @@ public final class RESTHeaders {
     public static final String TEXT_CSV = "text/csv";
 
     /**
+     * Mediatype for text/csv, not defined in {@link javax.ws.rs.core.MediaType}.
+     */
+    public static final MediaType TEXT_CSV_TYPE = new MediaType("text", "csv");
+
+    /**
      * Mediatype for multipart/mixed, not defined in {@link javax.ws.rs.core.MediaType}.
      */
     public static final String MULTIPART_MIXED = "multipart/mixed";
diff --git a/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/rest/BpmnProcessRestClient.java b/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/rest/BpmnProcessRestClient.java
index 3dfede4..d5a56e3 100644
--- a/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/rest/BpmnProcessRestClient.java
+++ b/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/rest/BpmnProcessRestClient.java
@@ -23,6 +23,7 @@ import java.util.List;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import org.apache.cxf.helpers.IOUtils;
+import org.apache.cxf.jaxrs.client.Client;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.common.lib.to.BpmnProcess;
@@ -33,20 +34,29 @@ public class BpmnProcessRestClient extends BaseRestClient {
 
     private static final long serialVersionUID = 5049285686167071017L;
 
-    private static BpmnProcessService getService(final MediaType mediaType) {
-        return SyncopeConsoleSession.get().getService(mediaType, BpmnProcessService.class);
-    }
-
     public static List<BpmnProcess> getDefinitions() {
         return getService(BpmnProcessService.class).list();
     }
 
+    private static BpmnProcessService getService(final MediaType mediaType) {
+        BpmnProcessService service = getService(BpmnProcessService.class);
+        Client client = WebClient.client(service);
+        client.type(mediaType);
+        return service;
+    }
+
     public static InputStream getDefinition(final MediaType mediaType, final String key) {
         Response response = getService(mediaType).get(key);
+        SyncopeConsoleSession.get().resetClient(BpmnProcessService.class);
 
         return (InputStream) response.getEntity();
     }
 
+    public static void setDefinition(final MediaType mediaType, final String key, final String definition) {
+        getService(mediaType).set(key, definition);
+        SyncopeConsoleSession.get().resetClient(BpmnProcessService.class);
+    }
+
     public static byte[] getDiagram(final String key) {
         BpmnProcessService service = getService(BpmnProcessService.class);
         WebClient.client(service).accept(RESTHeaders.MEDIATYPE_IMAGE_PNG);
@@ -62,10 +72,6 @@ public class BpmnProcessRestClient extends BaseRestClient {
         return diagram;
     }
 
-    public static void setDefinition(final MediaType mediaType, final String key, final String definition) {
-        getService(mediaType).set(key, definition);
-    }
-
     public static void deleteDefinition(final String key) {
         getService(BpmnProcessService.class).delete(key);
     }
diff --git a/ext/flowable/client-enduser/src/main/java/org/apache/syncope/client/enduser/rest/BpmnProcessRestClient.java b/ext/flowable/client-enduser/src/main/java/org/apache/syncope/client/enduser/rest/BpmnProcessRestClient.java
index b91b64e..c4a5bea 100644
--- a/ext/flowable/client-enduser/src/main/java/org/apache/syncope/client/enduser/rest/BpmnProcessRestClient.java
+++ b/ext/flowable/client-enduser/src/main/java/org/apache/syncope/client/enduser/rest/BpmnProcessRestClient.java
@@ -23,6 +23,7 @@ import java.util.List;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import org.apache.cxf.helpers.IOUtils;
+import org.apache.cxf.jaxrs.client.Client;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.syncope.client.enduser.SyncopeEnduserSession;
 import org.apache.syncope.common.lib.to.BpmnProcess;
@@ -34,7 +35,10 @@ public class BpmnProcessRestClient extends BaseRestClient {
     private static final long serialVersionUID = 5049285686167071017L;
 
     private static BpmnProcessService getService(final MediaType mediaType) {
-        return SyncopeEnduserSession.get().getService(mediaType, BpmnProcessService.class);
+        BpmnProcessService service = getService(BpmnProcessService.class);
+        Client client = WebClient.client(service);
+        client.type(mediaType);
+        return service;
     }
 
     public static List<BpmnProcess> getDefinitions() {
@@ -43,6 +47,7 @@ public class BpmnProcessRestClient extends BaseRestClient {
 
     public static InputStream getDefinition(final MediaType mediaType, final String key) {
         Response response = getService(mediaType).get(key);
+        SyncopeEnduserSession.get().resetClient(BpmnProcessService.class);
 
         return (InputStream) response.getEntity();
     }
@@ -61,5 +66,4 @@ public class BpmnProcessRestClient extends BaseRestClient {
         }
         return diagram;
     }
-
 }
diff --git a/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/rest/SAML2IdPsRestClient.java b/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/rest/SAML2IdPsRestClient.java
index 2c04b1c..81ac4ac 100644
--- a/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/rest/SAML2IdPsRestClient.java
+++ b/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/rest/SAML2IdPsRestClient.java
@@ -21,6 +21,8 @@ package org.apache.syncope.client.console.rest;
 import java.io.InputStream;
 import java.util.List;
 import javax.ws.rs.core.MediaType;
+import org.apache.cxf.jaxrs.client.Client;
+import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.common.lib.to.SAML2IdPTO;
 import org.apache.syncope.common.rest.api.service.SAML2IdPService;
@@ -34,8 +36,13 @@ public class SAML2IdPsRestClient extends BaseRestClient {
     }
 
     public static void importIdPs(final InputStream input) {
-        SyncopeConsoleSession.get().
-                getService(MediaType.APPLICATION_XML_TYPE, SAML2IdPService.class).importFromMetadata(input);
+        SAML2IdPService service = getService(SAML2IdPService.class);
+        Client client = WebClient.client(service);
+        client.type(MediaType.APPLICATION_XML);
+
+        service.importFromMetadata(input);
+
+        SyncopeConsoleSession.get().resetClient(SAML2IdPService.class);
     }
 
     public static SAML2IdPTO read(final String key) {
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 dc2ebc4..2f63c75 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
@@ -57,19 +57,19 @@ public class GroupsITCase extends AbstractConsoleITCase {
                 + "actions:actions:actionRepeater:2:action:action");
 
         FormTester formTester = TESTER.newFormTester(TAB_PANEL
-                + "outerObjectsRepeater:7:outer:container:content:togglePanelContainer:membersForm");
+                + "outerObjectsRepeater:8:outer:container:content:togglePanelContainer:membersForm");
 
         formTester.select("type:dropDownChoiceField", 0);
         formTester.submit("changeit");
 
         TESTER.assertModelValue(TAB_PANEL
-                + "outerObjectsRepeater:6:outer:dialog:header:header-label", "USER members of artDirector");
+                + "outerObjectsRepeater:7:outer:dialog:header:header-label", "USER members of artDirector");
         assertNotNull(findComponentByProp("username", TAB_PANEL
-                + "outerObjectsRepeater:6:outer:form:content:searchResult:container:content:"
+                + "outerObjectsRepeater:7:outer:form:content:searchResult:container:content:"
                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "puccini"));
 
         TESTER.executeAjaxEvent(TAB_PANEL
-                + "outerObjectsRepeater:6:outer:dialog:footer:buttons:0:button", Constants.ON_CLICK);
+                + "outerObjectsRepeater:7:outer:dialog:footer:buttons:0:button", Constants.ON_CLICK);
     }
 
     @Test