You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2019/05/15 06:49:51 UTC

[syncope] 02/02: [SYNCOPE-1460] Console support for domain management

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 07303b494ea41e2f85c7758c60fad5f8327eb200
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Wed May 15 08:49:33 2019 +0200

    [SYNCOPE-1460] Console support for domain management
---
 client/idrepo/common-ui/pom.xml                    |  12 +-
 .../syncope/client/ui/commons/BaseApplication.java |  26 ---
 .../syncope/client/ui/commons/BaseLogin.java       |  27 ++-
 .../syncope/client/ui/commons/DomainDropDown.java  |   8 +-
 .../markup/html/form/AbstractFieldPanel.html       |   0
 .../markup/html/form/AjaxCheckBoxPanel.html        |   0
 .../markup/html/form/AjaxDropDownChoicePanel.html  |   0
 .../commons/markup/html/form/AjaxPalettePanel.html |   0
 .../markup/html/form/AjaxPasswordFieldPanel.html   |   0
 .../markup/html/form/AjaxSpinnerFieldPanel.html    |   0
 .../markup/html/form/AjaxTextFieldPanel.html       |   0
 .../markup/html/form/EncryptedFieldPanel.html      |   0
 .../html/form/EncryptedFieldPanel.properties       |   0
 .../html/form/EncryptedFieldPanel_it.properties    |   0
 .../html/form/EncryptedFieldPanel_ja.properties    |   0
 .../html/form/EncryptedFieldPanel_pt_BR.properties |   0
 .../html/form/EncryptedFieldPanel_ru.properties    |   0
 .../commons/markup/html/form/NonI18nPalette.html   |   0
 .../html/form/preview/AbstractBinaryPreviewer.html |   0
 .../markup/html/form/preview/DefaultPreviewer.html |   0
 .../client/ui/commons/panels/LabelPanel.html       |   0
 .../ui/commons/panels/NotificationPanel.html       |   0
 .../markup/html/bootstrap/tabs/Accordion.html      |   0
 .../client/ui/commons/wizards/AjaxWizard.html      |   0
 .../ui/commons/wizards/AjaxWizard.properties       |   0
 .../ui/commons/wizards/AjaxWizardMgtButtonBar.html |   0
 .../ui/commons/wizards/AjaxWizard_it.properties    |   0
 .../ui/commons/wizards/AjaxWizard_ja.properties    |   0
 .../ui/commons/wizards/AjaxWizard_pt_BR.properties |   0
 .../ui/commons/wizards/AjaxWizard_ru.properties    |   0
 .../ui/commons/wizards/any/PasswordPanel.html      |   0
 client/idrepo/console/pom.xml                      |  44 ----
 .../client/console/SyncopeWebApplication.java      |  25 +--
 .../client/console/commons/IdRepoConstants.java    |   2 +
 .../syncope/client/console/pages/BasePage.java     |  78 +++++--
 .../pages/{NetworkServices.java => Domains.java}   |  34 +--
 .../apache/syncope/client/console/pages/Login.java |   6 -
 .../client/console/pages/NetworkServices.java      |   2 +-
 .../client/console/panels/AbstractModalPanel.java  |   6 +-
 .../panels/DomainAdminCredentialsPanel.java        |  85 ++++++++
 .../console/panels/DomainDirectoryPanel.java       | 208 ++++++++++++++++++
 .../console/panels/DomainPoolModalPanel.java       |  78 +++++++
 .../client/console/panels/DomainWizardBuilder.java | 233 +++++++++++++++++++++
 .../syncope/client/console/panels/TogglePanel.java |   3 +
 .../reports/ReportTemplateDirectoryPanel.java      |   6 +-
 .../console/reports/ReportWizardBuilder.java       |   1 -
 .../markup/html/form/ActionLinksTogglePanel.java   |   5 +-
 .../console/SyncopeWebApplication.properties       |   4 +-
 .../console/SyncopeWebApplication_it.properties    |   4 +-
 .../console/SyncopeWebApplication_ja.properties    |   4 +-
 .../console/SyncopeWebApplication_pt_BR.properties |   4 +-
 .../console/SyncopeWebApplication_ru.properties    |   4 +-
 .../syncope/client/console/pages/BasePage.html     |  10 +-
 .../pages/Domains.html}                            |  24 ++-
 .../client/console/pages/NetworkServices.html      |   4 +-
 .../syncope/client/console/pages/Parameters.html   |   2 +-
 .../panels/DomainAdminCredentialsPanel.html}       |   7 +-
 .../panels/DomainDirectoryPanel.properties}        |  25 ++-
 .../panels/DomainDirectoryPanel_it.properties      |  40 ++++
 .../panels/DomainDirectoryPanel_ja.properties}     |  25 ++-
 .../panels/DomainDirectoryPanel_pt_BR.properties}  |  25 ++-
 .../panels/DomainDirectoryPanel_ru.properties}     |  25 ++-
 .../console/panels/DomainPoolModalPanel.html}      |   9 +-
 .../DomainWizardBuilder$AdminCredentials.html}     |   5 +-
 .../panels/DomainWizardBuilder$Content.html}       |   3 +-
 .../DomainWizardBuilder$KeymasterConfParams.html}  |   3 +-
 .../panels/DomainWizardBuilder$Storage.html}       |  23 +-
 .../markup/html/form/AbstractFieldPanel.html       |  34 ---
 .../markup/html/form/AjaxDropDownChoicePanel.html  |  29 ---
 .../commons/markup/html/form/AjaxPalettePanel.html |  38 ----
 .../markup/html/form/AjaxSpinnerFieldPanel.html    |  39 ----
 .../markup/html/form/EncryptedFieldPanel.html      |  66 ------
 .../html/form/EncryptedFieldPanel_ru.properties    |  19 --
 .../commons/markup/html/form/NonI18nPalette.html   |  57 -----
 .../ui/commons/panels/NotificationPanel.html       |  60 ------
 .../markup/html/bootstrap/tabs/Accordion.html      |  32 ---
 .../ui/commons/wizards/AjaxWizard.properties       |  23 --
 .../ui/commons/wizards/AjaxWizard_it.properties    |  23 --
 .../ui/commons/wizards/AjaxWizard_ja.properties    |  23 --
 .../ui/commons/wizards/AjaxWizard_pt_BR.properties |  23 --
 .../ui/commons/wizards/AjaxWizard_ru.properties    |  30 ---
 client/idrepo/enduser/pom.xml                      |  66 ------
 .../client/enduser/SyncopeWebApplication.java      |  21 +-
 .../apache/syncope/client/enduser/pages/Login.java |   6 -
 .../enduser/pages/SelfConfirmPasswordReset.java    |  26 ++-
 .../client/enduser/panels/SelfPwdResetPanel.java   |  26 ++-
 .../markup/html/form/AjaxCheckBoxPanel.html        |  34 ---
 .../markup/html/form/AjaxPasswordFieldPanel.html   |  36 ----
 .../client/ui/commons/wizards/AjaxWizard.html      |  46 ----
 .../ui/commons/wizards/AjaxWizardMgtButtonBar.html |  38 ----
 .../common/lib/types/IdRepoEntitlement.java        |   2 +-
 .../common/keymaster/client/api/DomainOps.java     |   2 +-
 .../common/keymaster/client/api/model/Domain.java  |  40 ++--
 .../client/zookeper/ZookeeperDomainOps.java        |   6 +-
 .../client/zookeper/ZookeeperDomainOpsITCase.java  |  16 +-
 .../apache/syncope/core/logic/SyncopeLogic.java    |   2 +-
 .../core/persistence/jpa/DomainConfFactory.java    |   4 +-
 .../core/persistence/jpa/StartupDomainLoader.java  |   4 +-
 .../org/apache/syncope/core/logic/DomainLogic.java |  11 +-
 .../self/keymaster/api/service/DomainService.java  |   4 +-
 .../keymaster/cxf/service/DomainServiceImpl.java   |   4 +-
 .../syncope/fit/console/ParametersITCase.java      |   2 +-
 .../apache/syncope/fit/core/KeymasterITCase.java   |  15 +-
 103 files changed, 1050 insertions(+), 996 deletions(-)

diff --git a/client/idrepo/common-ui/pom.xml b/client/idrepo/common-ui/pom.xml
index ce6baac..1dcbb01 100644
--- a/client/idrepo/common-ui/pom.xml
+++ b/client/idrepo/common-ui/pom.xml
@@ -48,6 +48,10 @@ under the License.
     </dependency>
     <dependency>
       <groupId>org.apache.wicket</groupId>
+      <artifactId>wicket-spring</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.wicket</groupId>
       <artifactId>wicket-extensions</artifactId>
     </dependency>
     <dependency>
@@ -82,7 +86,13 @@ under the License.
       <groupId>de.agilecoders.wicket</groupId>
       <artifactId>wicket-bootstrap-extensions</artifactId>
     </dependency>
-    
+
+    <dependency>
+      <groupId>org.apache.syncope.common.keymaster</groupId>
+      <artifactId>syncope-common-keymaster-client-api</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+
     <dependency>
       <groupId>org.apache.syncope.client.idrepo</groupId>
       <artifactId>syncope-client-idrepo-lib</artifactId>
diff --git a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/BaseApplication.java b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/BaseApplication.java
deleted file mode 100644
index 499113a..0000000
--- a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/BaseApplication.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.client.ui.commons;
-
-import java.util.List;
-
-public interface BaseApplication {
-
-    List<String> getDomains();
-}
diff --git a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/BaseLogin.java b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/BaseLogin.java
index 197e9aa..8244cf0 100644
--- a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/BaseLogin.java
+++ b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/BaseLogin.java
@@ -21,10 +21,15 @@ package org.apache.syncope.client.ui.commons;
 import com.googlecode.wicket.kendo.ui.widget.notification.Notification;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.select.BootstrapSelect;
 import java.security.AccessControlException;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.ui.commons.panels.NotificationPanel;
+import org.apache.syncope.common.keymaster.client.api.DomainOps;
+import org.apache.syncope.common.keymaster.client.api.model.Domain;
+import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
@@ -40,8 +45,10 @@ import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LoadableDetachableModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -51,6 +58,9 @@ public abstract class BaseLogin extends WebPage {
 
     protected static final Logger LOG = LoggerFactory.getLogger(BaseLogin.class);
 
+    @SpringBean
+    private DomainOps domainOps;
+
     protected final NotificationPanel notificationPanel;
 
     protected final StatelessForm<Void> form;
@@ -63,6 +73,19 @@ public abstract class BaseLogin extends WebPage {
 
     protected String notificationLevel;
 
+    private final LoadableDetachableModel<List<String>> domains = new LoadableDetachableModel<List<String>>() {
+
+        private static final long serialVersionUID = 4659376149825914247L;
+
+        @Override
+        protected List<String> load() {
+            List<String> current = new ArrayList<>();
+            current.addAll(domainOps.list().stream().map(Domain::getKey).sorted().collect(Collectors.toList()));
+            current.add(0, SyncopeConstants.MASTER_DOMAIN);
+            return current;
+        }
+    };
+
     public BaseLogin(final PageParameters parameters) {
         super(parameters);
         setStatelessHint(true);
@@ -116,7 +139,7 @@ public abstract class BaseLogin extends WebPage {
         });
         form.add(languageSelect);
 
-        DomainDropDown domainSelect = new DomainDropDown("domain");
+        DomainDropDown domainSelect = new DomainDropDown("domain", domains);
         domainSelect.add(new AjaxFormComponentUpdatingBehavior(Constants.ON_BLUR) {
 
             private static final long serialVersionUID = -1107858522700306810L;
@@ -175,8 +198,6 @@ public abstract class BaseLogin extends WebPage {
         }
     }
 
-    protected abstract BaseApplication getBaseApplication();
-
     protected abstract BaseSession getBaseSession();
 
     protected abstract List<Panel> getSSOLoginFormPanels();
diff --git a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/DomainDropDown.java b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/DomainDropDown.java
index 38a6914..17a9de7 100644
--- a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/DomainDropDown.java
+++ b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/DomainDropDown.java
@@ -19,8 +19,8 @@
 package org.apache.syncope.client.ui.commons;
 
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.select.BootstrapSelect;
+import java.util.List;
 import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.wicket.Application;
 import org.apache.wicket.Session;
 import org.apache.wicket.model.IModel;
 
@@ -31,8 +31,8 @@ public class DomainDropDown extends BootstrapSelect<String> {
 
     private static final long serialVersionUID = -7401167913360133325L;
 
-    public DomainDropDown(final String id) {
-        super(id, BaseApplication.class.cast(Application.get()).getDomains());
+    public DomainDropDown(final String id, final IModel<List<String>> domains) {
+        super(id, domains);
         setModel(new IModel<String>() {
 
             private static final long serialVersionUID = -1124206668056084806L;
@@ -55,7 +55,7 @@ public class DomainDropDown extends BootstrapSelect<String> {
         // set default value to Master Domain
         getModel().setObject(SyncopeConstants.MASTER_DOMAIN);
 
-        if (BaseApplication.class.cast(Application.get()).getDomains().size() == 1) {
+        if (domains.getObject().size() == 1) {
             setOutputMarkupPlaceholderTag(true);
         }
     }
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AbstractFieldPanel.html b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AbstractFieldPanel.html
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AbstractFieldPanel.html
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AbstractFieldPanel.html
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxCheckBoxPanel.html b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxCheckBoxPanel.html
similarity index 100%
rename from client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxCheckBoxPanel.html
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxCheckBoxPanel.html
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxDropDownChoicePanel.html b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxDropDownChoicePanel.html
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxDropDownChoicePanel.html
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxDropDownChoicePanel.html
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxPalettePanel.html b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxPalettePanel.html
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxPalettePanel.html
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxPalettePanel.html
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxPasswordFieldPanel.html b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxPasswordFieldPanel.html
similarity index 100%
rename from client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxPasswordFieldPanel.html
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxPasswordFieldPanel.html
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxSpinnerFieldPanel.html b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxSpinnerFieldPanel.html
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxSpinnerFieldPanel.html
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxSpinnerFieldPanel.html
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxTextFieldPanel.html b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxTextFieldPanel.html
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxTextFieldPanel.html
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxTextFieldPanel.html
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel.html b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel.html
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel.html
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel.html
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel.properties b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel.properties
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel.properties
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel.properties
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_it.properties b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_it.properties
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_it.properties
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_it.properties
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_ja.properties b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_ja.properties
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_ja.properties
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_ja.properties
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_pt_BR.properties b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_pt_BR.properties
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_pt_BR.properties
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_pt_BR.properties
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_ru.properties b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_ru.properties
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_ru.properties
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_ru.properties
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/NonI18nPalette.html b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/NonI18nPalette.html
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/NonI18nPalette.html
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/NonI18nPalette.html
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/preview/AbstractBinaryPreviewer.html b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/preview/AbstractBinaryPreviewer.html
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/preview/AbstractBinaryPreviewer.html
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/preview/AbstractBinaryPreviewer.html
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/preview/DefaultPreviewer.html b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/preview/DefaultPreviewer.html
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/preview/DefaultPreviewer.html
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/preview/DefaultPreviewer.html
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/panels/LabelPanel.html b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/panels/LabelPanel.html
similarity index 100%
copy from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/panels/LabelPanel.html
copy to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/panels/LabelPanel.html
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/panels/NotificationPanel.html b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/panels/NotificationPanel.html
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/panels/NotificationPanel.html
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/panels/NotificationPanel.html
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/wicket/markup/html/bootstrap/tabs/Accordion.html b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/wicket/markup/html/bootstrap/tabs/Accordion.html
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/wicket/markup/html/bootstrap/tabs/Accordion.html
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/wicket/markup/html/bootstrap/tabs/Accordion.html
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard.html b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard.html
similarity index 100%
rename from client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard.html
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard.html
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard.properties b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard.properties
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard.properties
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard.properties
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizardMgtButtonBar.html b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizardMgtButtonBar.html
similarity index 100%
rename from client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizardMgtButtonBar.html
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizardMgtButtonBar.html
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_it.properties b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_it.properties
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_it.properties
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_it.properties
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_ja.properties b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_ja.properties
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_ja.properties
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_ja.properties
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_pt_BR.properties b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_pt_BR.properties
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_pt_BR.properties
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_pt_BR.properties
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_ru.properties b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_ru.properties
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_ru.properties
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_ru.properties
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/wizards/any/PasswordPanel.html b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/wizards/any/PasswordPanel.html
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/wizards/any/PasswordPanel.html
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/wizards/any/PasswordPanel.html
diff --git a/client/idrepo/console/pom.xml b/client/idrepo/console/pom.xml
index 150d4f6..aefa2ac 100644
--- a/client/idrepo/console/pom.xml
+++ b/client/idrepo/console/pom.xml
@@ -57,46 +57,6 @@ under the License.
       <groupId>org.apache.wicket</groupId>
       <artifactId>wicket-auth-roles</artifactId>
     </dependency>
-    <dependency>
-      <groupId>com.googlecode.wicket-jquery-ui</groupId>
-      <artifactId>wicket-jquery-ui</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.googlecode.wicket-jquery-ui</groupId>
-      <artifactId>wicket-kendo-ui</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.googlecode.wicket-jquery-ui</groupId>
-      <artifactId>wicket-kendo-ui-culture</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.googlecode.wicket-jquery-ui</groupId>
-      <artifactId>wicket-kendo-ui-theme-bootstrap</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.wicket</groupId>
-      <artifactId>wicket-native-websocket-javax</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>de.agilecoders.wicket</groupId>
-      <artifactId>wicket-bootstrap-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>de.agilecoders.wicket</groupId>
-      <artifactId>wicket-bootstrap-extensions</artifactId>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.apache.syncope.common.keymaster</groupId>
-      <artifactId>syncope-common-keymaster-client-api</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.syncope.client.idrepo</groupId>
-      <artifactId>syncope-client-idrepo-lib</artifactId>
-      <version>${project.version}</version>
-    </dependency>
 
     <dependency>
       <groupId>org.apache.syncope.client.idrepo</groupId>
@@ -148,10 +108,6 @@ under the License.
     </dependency>
     <dependency>
       <groupId>org.webjars</groupId>
-      <artifactId>jquery-ui</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.webjars</groupId>
       <artifactId>jQuery-slimScroll</artifactId>
     </dependency>
 
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 dbf4854..368b0a6 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
@@ -31,7 +31,6 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Properties;
-import java.util.stream.Collectors;
 import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.ClassUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -58,7 +57,6 @@ import org.apache.wicket.request.http.WebResponse;
 import org.apache.wicket.request.resource.AbstractResource;
 import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.request.resource.ResourceReference;
-import org.apache.wicket.resource.JQueryResourceReference;
 import org.apache.wicket.util.lang.Args;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -68,23 +66,20 @@ 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.pages.MustChangePassword;
-import org.apache.syncope.client.ui.commons.BaseApplication;
 import org.apache.syncope.client.ui.commons.SyncopeUIRequestCycleListener;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.common.keymaster.client.api.DomainOps;
 import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
 import org.apache.syncope.common.keymaster.client.api.ServiceOps;
-import org.apache.syncope.common.keymaster.client.api.model.Domain;
-import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.wicket.request.component.IRequestablePage;
 import org.apache.wicket.request.cycle.IRequestCycleListener;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.resource.JQueryResourceReference;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
 @Component
-public class SyncopeWebApplication extends WicketBootSecuredWebApplication implements BaseApplication {
+public class SyncopeWebApplication extends WicketBootSecuredWebApplication {
 
     private static final Logger LOG = LoggerFactory.getLogger(SyncopeWebApplication.class);
 
@@ -105,9 +100,6 @@ public class SyncopeWebApplication extends WicketBootSecuredWebApplication imple
     @Autowired
     private ServiceOps serviceOps;
 
-    @Autowired
-    private DomainOps domainOps;
-
     @Value("${service.discovery.address}")
     private String address;
 
@@ -129,8 +121,6 @@ public class SyncopeWebApplication extends WicketBootSecuredWebApplication imple
 
     private Integer queueCapacity;
 
-    private List<String> domains;
-
     private ExternalResourceProvider resourceProvider;
 
     private AnyWizardBuilderAdditionalSteps anyWizardBuilderAdditionalSteps;
@@ -365,17 +355,6 @@ public class SyncopeWebApplication extends WicketBootSecuredWebApplication imple
                 setUseCompression(useGZIPCompression);
     }
 
-    @Override
-    public List<String> getDomains() {
-        synchronized (LOG) {
-            if (domains == null) {
-                domains = domainOps.list().stream().map(Domain::getKey).sorted().collect(Collectors.toList());
-                domains.add(0, SyncopeConstants.MASTER_DOMAIN);
-            }
-        }
-        return domains;
-    }
-
     public ExternalResourceProvider getResourceProvider() {
         return resourceProvider;
     }
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/IdRepoConstants.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/IdRepoConstants.java
index fd2819d..52c9932 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/IdRepoConstants.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/IdRepoConstants.java
@@ -72,6 +72,8 @@ public final class IdRepoConstants {
 
     public static final String PREF_NETWORK_SERVICE_PAGINATOR_ROWS = "network.service.paginator.rows";
 
+    public static final String PREF_DOMAIN_PAGINATOR_ROWS = "domain.paginator.rows";
+
     public static final String PREF_MAIL_TEMPLATE_PAGINATOR_ROWS = "mail.template.paginator.rows";
 
     public static final String PREF_PROPAGATION_TASKS_PAGINATOR_ROWS = "proagationtasks.paginator.rows";
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
index a2379a3..3e55ccf 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
@@ -34,6 +34,7 @@ import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.Bas
 import org.apache.syncope.client.console.widgets.ExtAlertWidget;
 import org.apache.syncope.client.ui.commons.Constants;
 import org.apache.syncope.client.ui.commons.pages.BaseWebPage;
+import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.info.PlatformInfo;
 import org.apache.syncope.common.lib.info.SystemInfo;
 import org.apache.syncope.common.lib.types.IdRepoEntitlement;
@@ -135,8 +136,7 @@ public class BasePage extends BaseWebPage {
                 }
             }
         };
-        MetaDataRoleAuthorizationStrategy.authorize(
-                dbExportLink, WebPage.RENDER, IdRepoEntitlement.INTERNAL_STORAGE_EXPORT);
+        MetaDataRoleAuthorizationStrategy.authorize(dbExportLink, WebPage.RENDER, IdRepoEntitlement.KEYMASTER);
         body.add(dbExportLink);
 
         // menu
@@ -199,6 +199,31 @@ public class BasePage extends BaseWebPage {
         idmPages.setOutputMarkupId(true);
         body.add(idmPages);
 
+        WebMarkupContainer keymasterLIContainer = new WebMarkupContainer(getLIContainerId("keymaster"));
+        body.add(keymasterLIContainer);
+        WebMarkupContainer keymasterULContainer = new WebMarkupContainer(getULContainerId("keymaster"));
+        keymasterLIContainer.add(keymasterULContainer);
+
+        if (SyncopeConstants.MASTER_DOMAIN.equals(SyncopeConsoleSession.get().getDomain())) {
+            liContainer = new WebMarkupContainer(getLIContainerId("domains"));
+            keymasterULContainer.add(liContainer);
+            link = BookmarkablePageLinkBuilder.build("domains", Domains.class);
+            MetaDataRoleAuthorizationStrategy.authorize(link, WebPage.RENDER, IdRepoEntitlement.KEYMASTER);
+            liContainer.add(link);
+
+            liContainer = new WebMarkupContainer(getLIContainerId("networkservices"));
+            keymasterULContainer.add(liContainer);
+            link = BookmarkablePageLinkBuilder.build("networkservices", NetworkServices.class);
+            MetaDataRoleAuthorizationStrategy.authorize(link, WebPage.RENDER, IdRepoEntitlement.KEYMASTER);
+            liContainer.add(link);
+        }
+
+        liContainer = new WebMarkupContainer(getLIContainerId("parameters"));
+        keymasterULContainer.add(liContainer);
+        link = BookmarkablePageLinkBuilder.build("parameters", Parameters.class);
+        MetaDataRoleAuthorizationStrategy.authorize(link, WebPage.RENDER, IdRepoEntitlement.KEYMASTER);
+        liContainer.add(link);
+
         WebMarkupContainer confLIContainer = new WebMarkupContainer(getLIContainerId("configuration"));
         body.add(confLIContainer);
         WebMarkupContainer confULContainer = new WebMarkupContainer(getULContainerId("configuration"));
@@ -222,12 +247,6 @@ public class BasePage extends BaseWebPage {
         MetaDataRoleAuthorizationStrategy.authorize(link, WebPage.RENDER, IdRepoEntitlement.LOG_LIST);
         liContainer.add(link);
 
-        liContainer = new WebMarkupContainer(getLIContainerId("networkServices"));
-        confULContainer.add(liContainer);
-        link = BookmarkablePageLinkBuilder.build("networkServices", NetworkServices.class);
-        MetaDataRoleAuthorizationStrategy.authorize(link, WebPage.RENDER, IdRepoEntitlement.INTERNAL_STORAGE_EXPORT);
-        liContainer.add(link);
-
         liContainer = new WebMarkupContainer(getLIContainerId("types"));
         confULContainer.add(liContainer);
         link = BookmarkablePageLinkBuilder.build("types", Types.class);
@@ -255,12 +274,6 @@ public class BasePage extends BaseWebPage {
         MetaDataRoleAuthorizationStrategy.authorize(link, WebPage.RENDER, IdRepoEntitlement.NOTIFICATION_LIST);
         liContainer.add(link);
 
-        liContainer = new WebMarkupContainer(getLIContainerId("parameters"));
-        confULContainer.add(liContainer);
-        link = BookmarkablePageLinkBuilder.build("parameters", Parameters.class);
-        MetaDataRoleAuthorizationStrategy.authorize(link, WebPage.RENDER, IdRepoEntitlement.INTERNAL_STORAGE_EXPORT);
-        liContainer.add(link);
-
         body.add(new AjaxLink<Void>("collapse") {
 
             private static final long serialVersionUID = -7978723352517770644L;
@@ -273,6 +286,7 @@ public class BasePage extends BaseWebPage {
                         : !(Boolean) SyncopeConsoleSession.get().getAttribute(Constants.MENU_COLLAPSE));
             }
         });
+
         body.add(new Label("domain", SyncopeConsoleSession.get().getDomain()));
 
         @SuppressWarnings("unchecked")
@@ -304,11 +318,15 @@ public class BasePage extends BaseWebPage {
         // set 'active' menu item for everything but extensions
         // 1. check if current class is set to top-level menu
         Component containingLI = body.get(getLIContainerId(getClass().getSimpleName().toLowerCase()));
-        // 2. if not, check if it is under 'Configuration'
+        // 2. if not, check if it is under 'Keymaster'
+        if (containingLI == null) {
+            containingLI = keymasterULContainer.get(getLIContainerId(getClass().getSimpleName().toLowerCase()));
+        }
+        // 3. if not, check if it is under 'Configuration'
         if (containingLI == null) {
             containingLI = confULContainer.get(getLIContainerId(getClass().getSimpleName().toLowerCase()));
         }
-        // 3. when found, set CSS coordinates for menu
+        // 4. when found, set CSS coordinates for menu
         if (containingLI != null) {
             containingLI.add(new Behavior() {
 
@@ -320,7 +338,29 @@ public class BasePage extends BaseWebPage {
                 }
             });
 
-            if (confULContainer.getId().equals(containingLI.getParent().getId())) {
+            if (keymasterULContainer.getId().equals(containingLI.getParent().getId())) {
+                keymasterULContainer.add(new Behavior() {
+
+                    private static final long serialVersionUID = -5775607340182293596L;
+
+                    @Override
+                    public void onComponentTag(final Component component, final ComponentTag tag) {
+                        tag.put("class", "treeview-menu menu-open");
+                        tag.put("style", "display: block;");
+                    }
+
+                });
+
+                keymasterLIContainer.add(new Behavior() {
+
+                    private static final long serialVersionUID = -5775607340182293596L;
+
+                    @Override
+                    public void onComponentTag(final Component component, final ComponentTag tag) {
+                        tag.put("class", "treeview active");
+                    }
+                });
+            } else if (confULContainer.getId().equals(containingLI.getParent().getId())) {
                 confULContainer.add(new Behavior() {
 
                     private static final long serialVersionUID = 3109256773218160485L;
@@ -376,8 +416,8 @@ public class BasePage extends BaseWebPage {
         extensionsLI.setVisible(!extPageClasses.isEmpty());
         body.add(extensionsLI);
 
-        ListView<Class<? extends BaseExtPage>> extPages = new ListView<Class<? extends BaseExtPage>>(
-                "extPages", extPageClasses) {
+        ListView<Class<? extends BaseExtPage>> extPages =
+                new ListView<Class<? extends BaseExtPage>>("extPages", extPageClasses) {
 
             private static final long serialVersionUID = 4949588177564901031L;
 
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/NetworkServices.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Domains.java
similarity index 50%
copy from client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/NetworkServices.java
copy to client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Domains.java
index d0cc73d..a337a92 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/NetworkServices.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Domains.java
@@ -18,46 +18,24 @@
  */
 package org.apache.syncope.client.console.pages;
 
-import de.agilecoders.wicket.core.markup.html.bootstrap.tabs.AjaxBootstrapTabbedPanel;
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
 import org.apache.syncope.client.console.BookmarkablePageLinkBuilder;
-import org.apache.syncope.client.console.panels.NetworkServiceDirectoryPanel;
-import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
-import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
-import org.apache.wicket.extensions.markup.html.tabs.ITab;
+import org.apache.syncope.client.console.panels.DomainDirectoryPanel;
 import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.model.Model;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 
-public class NetworkServices extends BasePage {
+public class Domains extends BasePage {
 
-    private static final long serialVersionUID = -4562707092152823781L;
+    private static final long serialVersionUID = -4144386092487209655L;
 
-    public NetworkServices(final PageParameters parameters) {
+    public Domains(final PageParameters parameters) {
         super(parameters);
 
         body.add(BookmarkablePageLinkBuilder.build("dashboard", "dashboardBr", Dashboard.class));
 
         WebMarkupContainer content = new WebMarkupContainer("content");
         content.setOutputMarkupId(true);
-        content.setMarkupId("networkServices");
-        content.add(new AjaxBootstrapTabbedPanel<>("tabbedPanel", buildTabList()));
+        content.setMarkupId("domains");
+        content.add(new DomainDirectoryPanel("domainPanel", getPageReference()));
         body.add(content);
     }
-
-    private List<ITab> buildTabList() {
-        return Stream.of(NetworkService.Type.values()).
-                sorted().
-                map(type -> new AbstractTab(Model.of(type.name())) {
-
-            private static final long serialVersionUID = -5861786415855103549L;
-
-            @Override
-            public WebMarkupContainer getPanel(final String panelId) {
-                return new NetworkServiceDirectoryPanel(panelId, type, getPageReference());
-            }
-        }).collect(Collectors.toList());
-    }
 }
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Login.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Login.java
index bba025d..b78c793 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Login.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Login.java
@@ -25,7 +25,6 @@ import java.util.Locale;
 import org.apache.syncope.client.console.SyncopeWebApplication;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.init.ClassPathScanImplementationLookup;
-import org.apache.syncope.client.ui.commons.BaseApplication;
 import org.apache.syncope.client.ui.commons.BaseLogin;
 import org.apache.syncope.client.ui.commons.BaseSession;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -47,11 +46,6 @@ public class Login extends BaseLogin {
     }
 
     @Override
-    protected BaseApplication getBaseApplication() {
-        return SyncopeWebApplication.get();
-    }
-
-    @Override
     protected BaseSession getBaseSession() {
         return SyncopeConsoleSession.get();
     }
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/NetworkServices.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/NetworkServices.java
index d0cc73d..15422d8 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/NetworkServices.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/NetworkServices.java
@@ -42,7 +42,7 @@ public class NetworkServices extends BasePage {
 
         WebMarkupContainer content = new WebMarkupContainer("content");
         content.setOutputMarkupId(true);
-        content.setMarkupId("networkServices");
+        content.setMarkupId("networkservices");
         content.add(new AjaxBootstrapTabbedPanel<>("tabbedPanel", buildTabList()));
         body.add(content);
     }
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java
index 586cc54..2d7dee8 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java
@@ -55,7 +55,11 @@ public class AbstractModalPanel<T extends Serializable> extends Panel
     protected final HeaderItem meta = new MetaHeaderItem("X-UA-Compatible", "IE=edge");
 
     public AbstractModalPanel(final BaseModal<T> modal, final PageReference pageRef) {
-        super(BaseModal.getContentId());
+        this(BaseModal.getContentId(), modal, pageRef);
+    }
+
+    public AbstractModalPanel(final String id, final BaseModal<T> modal, final PageReference pageRef) {
+        super(id);
         this.pageRef = pageRef;
         this.modal = modal;
     }
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DomainAdminCredentialsPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DomainAdminCredentialsPanel.java
new file mode 100644
index 0000000..324eae7
--- /dev/null
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DomainAdminCredentialsPanel.java
@@ -0,0 +1,85 @@
+/*
+ * 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 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.wicket.markup.html.bootstrap.dialog.BaseModal;
+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.EncryptedFieldPanel;
+import org.apache.syncope.common.keymaster.client.api.DomainOps;
+import org.apache.syncope.common.keymaster.client.api.model.Domain;
+import org.apache.syncope.common.lib.types.CipherAlgorithm;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+
+public class DomainAdminCredentialsPanel extends AbstractModalPanel<Domain> {
+
+    private static final long serialVersionUID = 2893133457496751451L;
+
+    @SpringBean
+    private DomainOps domainOps;
+
+    private final Domain domain;
+
+    public DomainAdminCredentialsPanel(
+            final Domain domain, final BaseModal<Domain> modal, final PageReference pageRef) {
+
+        super(modal, pageRef);
+        this.domain = domain;
+
+        AjaxDropDownChoicePanel<CipherAlgorithm> adminCipherAlgorithm = new AjaxDropDownChoicePanel<>(
+                "adminCipherAlgorithm", "adminCipherAlgorithm",
+                new PropertyModel<>(domain, "adminCipherAlgorithm"), false);
+        adminCipherAlgorithm.setChoices(Arrays.asList(CipherAlgorithm.values()));
+        adminCipherAlgorithm.addRequiredLabel();
+        adminCipherAlgorithm.setNullValid(false);
+        add(adminCipherAlgorithm);
+
+        EncryptedFieldPanel adminPassword = new EncryptedFieldPanel(
+                "adminPassword", "adminPassword", new PropertyModel<>(domain, "adminPassword"), false);
+        adminPassword.setRequired(true);
+        add(adminPassword);
+    }
+
+    @Override
+    public Domain getItem() {
+        return domain;
+    }
+
+    @Override
+    public void onSubmit(final AjaxRequestTarget target) {
+        try {
+            domainOps.changeAdminPassword(domain.getKey(), domain.getAdminPassword(), domain.getAdminCipherAlgorithm());
+
+            SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
+            this.modal.close(target);
+        } catch (Exception e) {
+            LOG.error("While updating domain", e);
+            SyncopeConsoleSession.get().error(
+                    StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
+        }
+        ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
+    }
+}
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
new file mode 100644
index 0000000..597449f
--- /dev/null
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DomainDirectoryPanel.java
@@ -0,0 +1,208 @@
+/*
+ * 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 de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.console.commons.IdRepoConstants;
+import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
+import org.apache.syncope.client.console.pages.BasePage;
+import org.apache.syncope.client.console.panels.DomainDirectoryPanel.DomainProvider;
+import org.apache.syncope.client.console.rest.SyncopeRestClient;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel;
+import org.apache.syncope.client.ui.commons.Constants;
+import org.apache.syncope.common.keymaster.client.api.DomainOps;
+import org.apache.syncope.common.keymaster.client.api.KeymasterException;
+import org.apache.syncope.common.keymaster.client.api.model.Domain;
+import org.apache.syncope.common.lib.types.IdRepoEntitlement;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
+import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.model.StringResourceModel;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+
+public class DomainDirectoryPanel extends DirectoryPanel<Domain, Domain, DomainProvider, SyncopeRestClient> {
+
+    private static final long serialVersionUID = -1039907608594680220L;
+
+    @SpringBean
+    private DomainOps domainOps;
+
+    private final BaseModal<Domain> utilityModal = new BaseModal<>("outer");
+
+    public DomainDirectoryPanel(final String id, final PageReference pageRef) {
+        super(id, pageRef);
+        disableCheckBoxes();
+
+        modal.size(Modal.Size.Large);
+
+        modal.setWindowClosedCallback(target -> {
+            updateResultTable(target);
+            modal.show(false);
+        });
+
+        addOuterObject(utilityModal);
+        utilityModal.setWindowClosedCallback(target -> {
+            updateResultTable(target);
+            modal.show(false);
+        });
+        utilityModal.size(Modal.Size.Small);
+        utilityModal.addSubmitButton();
+
+        addNewItemPanelBuilder(new DomainWizardBuilder(domainOps, new Domain(), pageRef), true);
+
+        initResultTable();
+
+        MetaDataRoleAuthorizationStrategy.authorize(addAjaxLink, RENDER, IdRepoEntitlement.KEYMASTER);
+    }
+
+    @Override
+    protected List<IColumn<Domain, String>> getColumns() {
+        List<IColumn<Domain, String>> columns = new ArrayList<>();
+        columns.add(new PropertyColumn<>(new StringResourceModel("key", this), "key", "key"));
+        columns.add(new PropertyColumn<>(
+                new StringResourceModel("jdbcURL", this), "jdbcURL", "jdbcURL"));
+        columns.add(new PropertyColumn<>(
+                new StringResourceModel("poolMaxActive", this), "poolMaxActive", "poolMaxActive"));
+        columns.add(new PropertyColumn<>(
+                new StringResourceModel("poolMinIdle", this), "poolMinIdle", "poolMinIdle"));
+        return columns;
+    }
+
+    @Override
+    protected ActionsPanel<Domain> getActions(final IModel<Domain> model) {
+        final ActionsPanel<Domain> panel = super.getActions(model);
+
+        panel.add(new ActionLink<Domain>() {
+
+            private static final long serialVersionUID = 7610801302168867641L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final Domain ignore) {
+                utilityModal.header(new ResourceModel("adjust.pool.size"));
+                utilityModal.setContent(new DomainPoolModalPanel(model.getObject(), utilityModal, pageRef));
+                utilityModal.show(true);
+                target.add(utilityModal);
+            }
+        }, ActionLink.ActionType.EDIT, IdRepoEntitlement.KEYMASTER);
+
+        panel.add(new ActionLink<Domain>() {
+
+            private static final long serialVersionUID = 7610801302168867641L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final Domain ignore) {
+                utilityModal.header(new ResourceModel("set.admin.credentials"));
+                utilityModal.setContent(new DomainAdminCredentialsPanel(model.getObject(), utilityModal, pageRef));
+                utilityModal.show(true);
+                target.add(utilityModal);
+            }
+        }, ActionLink.ActionType.PASSWORD_MANAGEMENT, IdRepoEntitlement.KEYMASTER);
+
+        panel.add(new ActionLink<Domain>() {
+
+            private static final long serialVersionUID = -3722207913631435501L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final Domain ignore) {
+                final Domain domain = model.getObject();
+                try {
+                    domainOps.delete(domain.getKey());
+                    SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
+                    target.add(container);
+                } catch (KeymasterException e) {
+                    LOG.error("While deleting {}", domain.getKey(), e);
+                    SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage())
+                            ? e.getClass().getName() : e.getMessage());
+                }
+                ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
+            }
+        }, ActionLink.ActionType.DELETE, IdRepoEntitlement.KEYMASTER, true);
+
+        return panel;
+    }
+
+    @Override
+    protected DomainProvider dataProvider() {
+        return new DomainProvider(rows);
+    }
+
+    @Override
+    protected String paginatorRowsKey() {
+        return IdRepoConstants.PREF_DOMAIN_PAGINATOR_ROWS;
+    }
+
+    @Override
+    protected Collection<ActionLink.ActionType> getBatches() {
+        return Collections.<ActionLink.ActionType>emptyList();
+
+    }
+
+    protected final class DomainProvider extends DirectoryDataProvider<Domain> {
+
+        private static final long serialVersionUID = 8668261951640646188L;
+
+        private final SortableDataProviderComparator<Domain> comparator;
+
+        public DomainProvider(final int paginatorRows) {
+            super(paginatorRows);
+            setSort("key", SortOrder.ASCENDING);
+            comparator = new SortableDataProviderComparator<>(this);
+        }
+
+        @Override
+        public Iterator<? extends Domain> iterator(final long first, final long count) {
+            List<Domain> list = domainOps.list();
+            Collections.sort(list, comparator);
+            return list.subList((int) first, (int) first + (int) count).iterator();
+        }
+
+        @Override
+        public long size() {
+            return domainOps.list().size();
+        }
+
+        @Override
+        public IModel<Domain> model(final Domain object) {
+            return new IModel<Domain>() {
+
+                private static final long serialVersionUID = 8093553921710742624L;
+
+                @Override
+                public Domain getObject() {
+                    return object;
+                }
+            };
+        }
+    }
+}
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DomainPoolModalPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DomainPoolModalPanel.java
new file mode 100644
index 0000000..ab6d303
--- /dev/null
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DomainPoolModalPanel.java
@@ -0,0 +1,78 @@
+/*
+ * 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 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.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.client.ui.commons.Constants;
+import org.apache.syncope.client.ui.commons.markup.html.form.AjaxSpinnerFieldPanel;
+import org.apache.syncope.common.keymaster.client.api.DomainOps;
+import org.apache.syncope.common.keymaster.client.api.model.Domain;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+
+public class DomainPoolModalPanel extends AbstractModalPanel<Domain> {
+
+    private static final long serialVersionUID = -2676426626979352532L;
+
+    @SpringBean
+    private DomainOps domainOps;
+
+    private final Domain domain;
+
+    public DomainPoolModalPanel(final Domain domain, final BaseModal<Domain> modal, final PageReference pageRef) {
+        super(modal, pageRef);
+        this.domain = domain;
+
+        add(new AjaxSpinnerFieldPanel.Builder<Integer>().min(0).build(
+                "poolMaxActive",
+                "poolMaxActive",
+                Integer.class,
+                new PropertyModel<>(domain, "poolMaxActive")).setRequired(true));
+        add(new AjaxSpinnerFieldPanel.Builder<Integer>().min(0).build(
+                "poolMinIdle",
+                "poolMinIdle",
+                Integer.class,
+                new PropertyModel<>(domain, "poolMinIdle")).setRequired(true));
+    }
+
+    @Override
+    public Domain getItem() {
+        return domain;
+    }
+
+    @Override
+    public void onSubmit(final AjaxRequestTarget target) {
+        try {
+            domainOps.adjustPoolSize(domain.getKey(), domain.getPoolMaxActive(), domain.getPoolMinIdle());
+
+            SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
+            this.modal.close(target);
+        } catch (Exception e) {
+            LOG.error("While updating domain", e);
+            SyncopeConsoleSession.get().error(
+                    StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
+        }
+        ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
+    }
+}
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DomainWizardBuilder.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DomainWizardBuilder.java
new file mode 100644
index 0000000..84b8874
--- /dev/null
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DomainWizardBuilder.java
@@ -0,0 +1,233 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.panels;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.List;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.syncope.client.console.wicket.markup.html.form.JsonEditorPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.XMLEditorPanel;
+import org.apache.syncope.client.console.wizards.BaseAjaxWizardBuilder;
+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.AjaxSpinnerFieldPanel;
+import org.apache.syncope.client.ui.commons.markup.html.form.AjaxTextFieldPanel;
+import org.apache.syncope.client.ui.commons.markup.html.form.EncryptedFieldPanel;
+import org.apache.syncope.common.keymaster.client.api.DomainOps;
+import org.apache.syncope.common.keymaster.client.api.model.Domain;
+import org.apache.syncope.common.lib.types.CipherAlgorithm;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
+import org.apache.wicket.extensions.wizard.WizardModel;
+import org.apache.wicket.extensions.wizard.WizardStep;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.PropertyModel;
+
+public class DomainWizardBuilder extends BaseAjaxWizardBuilder<Domain> {
+
+    private static final long serialVersionUID = -6731030158762705250L;
+
+    private static final List<String> JDBC_DRIVERS = Arrays.asList(
+            "org.postgresql.Driver",
+            "com.mysql.cj.jdbc.Driver",
+            "org.mariadb.jdbc.Driver",
+            "com.microsoft.sqlserver.jdbc.SQLServerDriver",
+            "oracle.jdbc.OracleDriver",
+            "org.h2.Driver");
+
+    private static final List<String> DATABASE_PLATFORMS = Arrays.asList(
+            "org.apache.openjpa.jdbc.sql.PostgresDictionary",
+            "org.apache.openjpa.jdbc.sql.MySQLDictionary(blobTypeName=LONGBLOB,dateFractionDigits=3)",
+            "org.apache.openjpa.jdbc.sql.MariaDBDictionary(blobTypeName=LONGBLOB,dateFractionDigits=3)",
+            "org.apache.openjpa.jdbc.sql.SQLServerDictionary",
+            "org.apache.openjpa.jdbc.sql.OracleDictionary",
+            "org.apache.openjpa.jdbc.sql.H2Dictionary");
+
+    private final DomainOps domainOps;
+
+    public DomainWizardBuilder(final DomainOps domainOps, final Domain domain, final PageReference pageRef) {
+        super(domain, pageRef);
+        this.domainOps = domainOps;
+    }
+
+    @Override
+    protected Serializable onApplyInternal(final Domain domain) {
+        domainOps.create(domain);
+        return domain;
+    }
+
+    @Override
+    protected WizardModel buildModelSteps(final Domain domain, final WizardModel wizardModel) {
+        wizardModel.add(new Storage(domain));
+        wizardModel.add(new AdminCredentials(domain));
+        wizardModel.add(new Content(domain));
+        wizardModel.add(new KeymasterConfParams(domain));
+        return wizardModel;
+    }
+
+    public class Storage extends WizardStep {
+
+        private static final long serialVersionUID = 3671044119870133102L;
+
+        public Storage(final Domain domain) {
+            add(new AjaxTextFieldPanel(
+                    "key",
+                    "key",
+                    new PropertyModel<>(domain, "key")).setRequired(true));
+
+            AjaxDropDownChoicePanel<String> jdbcDriver = new AjaxDropDownChoicePanel<>(
+                    "jdbcDriver", "jdbcDriver", new PropertyModel<>(domain, "jdbcDriver"), false);
+            jdbcDriver.setChoices(JDBC_DRIVERS);
+            jdbcDriver.addRequiredLabel();
+            jdbcDriver.setNullValid(false);
+            add(jdbcDriver);
+
+            add(new AjaxTextFieldPanel(
+                    "jdbcURL",
+                    "jdbcURL",
+                    new PropertyModel<>(domain, "jdbcURL")).setRequired(true));
+
+            add(new AjaxTextFieldPanel(
+                    "dbSchema",
+                    "dbSchema",
+                    new PropertyModel<>(domain, "dbSchema")).setRequired(false));
+
+            add(new AjaxTextFieldPanel(
+                    "dbUsername",
+                    "dbUsername",
+                    new PropertyModel<>(domain, "dbUsername")).setRequired(true));
+            add(new EncryptedFieldPanel(
+                    "dbPassword", "dbPassword", new PropertyModel<>(domain, "dbPassword"), false));
+
+            AjaxDropDownChoicePanel<Domain.TransactionIsolation> transactionIsolation = new AjaxDropDownChoicePanel<>(
+                    "transactionIsolation", "transactionIsolation",
+                    new PropertyModel<>(domain, "transactionIsolation"), false);
+            transactionIsolation.setChoices(Arrays.asList(Domain.TransactionIsolation.values()));
+            transactionIsolation.addRequiredLabel();
+            transactionIsolation.setNullValid(false);
+            add(transactionIsolation);
+
+            add(new AjaxSpinnerFieldPanel.Builder<Integer>().min(0).build(
+                    "poolMaxActive",
+                    "poolMaxActive",
+                    Integer.class,
+                    new PropertyModel<>(domain, "poolMaxActive")).setRequired(true));
+            add(new AjaxSpinnerFieldPanel.Builder<Integer>().min(0).build(
+                    "poolMinIdle",
+                    "poolMinIdle",
+                    Integer.class,
+                    new PropertyModel<>(domain, "poolMinIdle")).setRequired(true));
+
+            add(new AjaxTextFieldPanel(
+                    "auditSql",
+                    "auditSql",
+                    new PropertyModel<>(domain, "auditSql")).setRequired(true));
+
+            add(new AjaxTextFieldPanel(
+                    "orm",
+                    "orm",
+                    new PropertyModel<>(domain, "orm")).setRequired(true));
+
+            AjaxDropDownChoicePanel<String> databasePlatform = new AjaxDropDownChoicePanel<>(
+                    "databasePlatform", "databasePlatform", new PropertyModel<>(domain, "databasePlatform"), false);
+            databasePlatform.setChoices(DATABASE_PLATFORMS);
+            databasePlatform.addRequiredLabel();
+            databasePlatform.setNullValid(false);
+            add(databasePlatform);
+        }
+    }
+
+    public class AdminCredentials extends WizardStep {
+
+        private static final long serialVersionUID = -7472243942630790243L;
+
+        public AdminCredentials(final Domain domain) {
+            AjaxDropDownChoicePanel<CipherAlgorithm> adminCipherAlgorithm = new AjaxDropDownChoicePanel<>(
+                    "adminCipherAlgorithm", "adminCipherAlgorithm",
+                    new PropertyModel<>(domain, "adminCipherAlgorithm"), false);
+            adminCipherAlgorithm.setChoices(Arrays.asList(CipherAlgorithm.values()));
+            adminCipherAlgorithm.addRequiredLabel();
+            adminCipherAlgorithm.setNullValid(false);
+            add(adminCipherAlgorithm);
+
+            EncryptedFieldPanel adminPassword = new EncryptedFieldPanel(
+                    "adminPassword", "adminPassword", new PropertyModel<>(domain, "adminPassword"), false);
+            adminPassword.setRequired(true);
+            add(adminPassword);
+        }
+    }
+
+    public class Content extends WizardStep {
+
+        private static final long serialVersionUID = -4214163958296844853L;
+
+        public Content(final Domain domain) {
+            XMLEditorPanel content = new XMLEditorPanel(
+                    null, new PropertyModel<>(domain, "content"), false, pageRef);
+            content.setOutputMarkupPlaceholderTag(true);
+            content.setVisible(false);
+            add(content);
+
+            AjaxCheckBoxPanel defaultContent = new AjaxCheckBoxPanel(
+                    "defaultContent", "defaultContent", Model.of(true), true);
+            defaultContent.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+
+                private static final long serialVersionUID = -1107858522700306810L;
+
+                @Override
+                protected void onUpdate(final AjaxRequestTarget target) {
+                    content.setVisible(!BooleanUtils.toBoolean(defaultContent.getField().getConvertedInput()));
+                    target.add(content);
+                }
+            });
+            add(defaultContent);
+        }
+    }
+
+    public class KeymasterConfParams extends WizardStep {
+
+        private static final long serialVersionUID = -8448363577805933925L;
+
+        public KeymasterConfParams(final Domain domain) {
+            JsonEditorPanel keymasterConfParams = new JsonEditorPanel(
+                    null, new PropertyModel<>(domain, "keymasterConfParams"), false, pageRef);
+            keymasterConfParams.setOutputMarkupPlaceholderTag(true);
+            keymasterConfParams.setVisible(false);
+            add(keymasterConfParams);
+
+            AjaxCheckBoxPanel defaultKeymasterConfParams = new AjaxCheckBoxPanel(
+                    "defaultKeymasterConfParams", "defaultKeymasterConfParams", Model.of(true), true);
+            defaultKeymasterConfParams.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+
+                private static final long serialVersionUID = -6139318907146065915L;
+
+                @Override
+                protected void onUpdate(final AjaxRequestTarget target) {
+                    keymasterConfParams.setVisible(
+                            !BooleanUtils.toBoolean(defaultKeymasterConfParams.getField().getConvertedInput()));
+                    target.add(keymasterConfParams);
+                }
+            });
+            add(defaultKeymasterConfParams);
+        }
+    }
+}
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/TogglePanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/TogglePanel.java
index 85e31dd..17f7af5 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/TogglePanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/TogglePanel.java
@@ -28,6 +28,7 @@ import org.apache.syncope.client.console.wizards.WizardMgtPanel;
 import org.apache.syncope.client.ui.commons.wizards.any.AnyWrapper;
 import org.apache.syncope.client.console.wizards.any.GroupWrapper;
 import org.apache.syncope.client.ui.commons.wizards.any.UserWrapper;
+import org.apache.syncope.common.keymaster.client.api.model.Domain;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.Attr;
 import org.apache.syncope.common.lib.to.EntityTO;
@@ -190,6 +191,8 @@ public abstract class TogglePanel<T extends Serializable> extends WizardMgtPanel
                     ? ((JobTO) modelObject).getRefDesc() : ((JobTO) modelObject).getRefKey();
         } else if (modelObject instanceof ToggleableTarget) {
             key = ((ToggleableTarget) modelObject).getKey();
+        } else if (modelObject instanceof Domain) {
+            key = ((Domain) modelObject).getKey();
         } else {
             key = new ResourceModel("actions", StringUtils.EMPTY).getObject();
         }
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 3174c62..868d9e1 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
@@ -66,8 +66,8 @@ public class ReportTemplateDirectoryPanel
 
     protected final BaseModal<String> utilityModal = new BaseModal<>("outer");
 
-    public ReportTemplateDirectoryPanel(final String id, final PageReference pageReference) {
-        super(id, pageReference, true);
+    public ReportTemplateDirectoryPanel(final String id, final PageReference pageRef) {
+        super(id, pageRef);
         disableCheckBoxes();
 
         modal.size(Modal.Size.Small);
@@ -99,7 +99,7 @@ public class ReportTemplateDirectoryPanel
             public WizardModalPanel<ReportTemplateTO> build(
                     final String id, final int index, final AjaxWizard.Mode mode) {
 
-                return new TemplateModal<>(modal, restClient, new ReportTemplateTO(), pageReference);
+                return new TemplateModal<>(modal, restClient, new ReportTemplateTO(), pageRef);
             }
         }, true);
 
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportWizardBuilder.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportWizardBuilder.java
index 3ceb127..3c86969 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportWizardBuilder.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportWizardBuilder.java
@@ -68,7 +68,6 @@ public class ReportWizardBuilder extends BaseAjaxWizardBuilder<ReportTO> {
         private static final long serialVersionUID = -3043839139187792810L;
 
         public Profile(final ReportTO reportTO) {
-
             AjaxTextFieldPanel name = new AjaxTextFieldPanel(
                     "name", "name", new PropertyModel<>(reportTO, "name"), false);
             name.addRequiredLabel();
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java
index 50ff530..9c434a5 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java
@@ -50,6 +50,7 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.panel.Fragment;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.syncope.client.console.panels.ToggleableTarget;
+import org.apache.syncope.common.keymaster.client.api.model.Domain;
 
 public class ActionLinksTogglePanel<T extends Serializable> extends TogglePanel<Serializable> {
 
@@ -118,8 +119,8 @@ public class ActionLinksTogglePanel<T extends Serializable> extends TogglePanel<
                     ? ((JobTO) modelObject).getRefDesc() : ((JobTO) modelObject).getRefKey();
         } else if (modelObject instanceof ToggleableTarget) {
             header = ((ToggleableTarget) modelObject).getAnyType();
-        } else if (modelObject instanceof EntityTO) {
-            header = ((EntityTO) modelObject).getKey();
+        } else if (modelObject instanceof Domain) {
+            header = ((Domain) modelObject).getKey();
         } else {
             header = new ResourceModel("actions", StringUtils.EMPTY).getObject();
         }
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication.properties
index c6ec2c3..b9826b3 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication.properties
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication.properties
@@ -74,4 +74,6 @@ timeout=Operation is taking too long: it will be executed in background. Please
 security=Security
 before=Before
 after=After
-networkServices=Network Services
+networkservices=Network Services
+keymaster=Keymaster
+domains=Domains
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_it.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_it.properties
index cb11db3..5dbcbe1 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_it.properties
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_it.properties
@@ -74,4 +74,6 @@ timeout=L'operazione sta durando troppo: sar\u00e0 eseguita in background. Verif
 security=Sicurezza
 before=Prima
 after=Dopo
-networkServices=Servizi di Rete
+networkservices=Servizi di Rete
+keymaster=Keymaster
+domains=Domini
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_ja.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_ja.properties
index 8ea9b6b..d6874c3 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_ja.properties
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_ja.properties
@@ -72,4 +72,6 @@ timeout=\u64cd\u4f5c\u306b\u9577\u6642\u9593\u304b\u304b\u3063\u3066\u3044\u307e
 security=Security
 before=Before
 after=After
-networkServices=Network Services
+networkservices=Network Services
+keymaster=Keymaster
+domains=Domains
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_pt_BR.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_pt_BR.properties
index 0fe6396..4da4f99 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_pt_BR.properties
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_pt_BR.properties
@@ -74,4 +74,6 @@ timeout=Operation is taking too long: it will be executed in background. Please
 security=Security
 before=Before
 after=After
-networkServices=Network Services
+networkservices=Network Services
+keymaster=Keymaster
+domains=Domains
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_ru.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_ru.properties
index d19cc40..6d3c060 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_ru.properties
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_ru.properties
@@ -73,4 +73,6 @@ timeout=Operation is taking too long: it will be executed in background. Please
 security=Security
 before=Before
 after=After
-networkServices=Network Services
+networkservices=Network Services
+keymaster=Keymaster
+domains=Domains
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
index 13dc038..c38ee0d 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
@@ -117,15 +117,21 @@ under the License.
                 <a href="#" wicket:id="idmPage"><i wicket:id="idmPageIcon"></i><span wicket:id="idmPageLabel"/></a>
               </li>
             </wicket:container>
+            <li wicket:id="keymasterLI" class="treeview">
+              <a href="#"><i class="fa fa-magic"></i><span><wicket:message key="keymaster"/></span> <span class="pull-right-container"><i class="fa fa-angle-left pull-right"></i></span></a>
+              <ul wicket:id="keymasterUL" class="treeview-menu">
+                <li wicket:id="domainsLI"><a href="#" wicket:id="domains"><i class="fa fa-code-fork"></i><wicket:message key="domains"/></a></li>
+                <li wicket:id="networkservicesLI"><a href="#" wicket:id="networkservices"><i class="fa fa-server"></i><wicket:message key="networkservices"/></a></li>
+                <li wicket:id="parametersLI"><a href="#" wicket:id="parameters"><i class="fa fa-cog"></i><wicket:message key="parameters"/></a></li>
+              </ul>
+            </li>
             <li wicket:id="configurationLI" class="treeview">
               <a href="#"><i class="fa fa-edit"></i><span><wicket:message key="configuration"/></span> <span class="pull-right-container"><i class="fa fa-angle-left pull-right"></i></span></a>
               <ul wicket:id="configurationUL" class="treeview-menu">
                 <li wicket:id="auditLI"><a href="#" wicket:id="audit"><i class="fa fa-check-square-o"></i><wicket:message key="audit"/></a></li>
                 <li wicket:id="implementationsLI"><a href="#" wicket:id="implementations"><i class="fa fa-file-code-o"></i><wicket:message key="implementations"/></a></li>
                 <li wicket:id="logsLI"><a href="#" wicket:id="logs"><i class="fa fa-file-text-o"></i><wicket:message key="logs"/></a></li>
-                <li wicket:id="networkServicesLI"><a href="#" wicket:id="networkServices"><i class="fa fa-server"></i><wicket:message key="networkServices"/></a></li>
                 <li wicket:id="notificationsLI"><a href="#" wicket:id="notifications"><i class="fa fa-envelope-o"></i><wicket:message key="notifications"/></a></li>
-                <li wicket:id="parametersLI"><a href="#" wicket:id="parameters"><i class="fa fa-cog"></i><wicket:message key="parameters"/></a></li>
                 <li wicket:id="policiesLI"><a href="#" wicket:id="policies"><i class="fa fa-list"></i><wicket:message key="policies"/></a></li>
                 <li wicket:id="securityLI"><a href="#" wicket:id="security"><i class="fa fa-lock"></i><wicket:message key="security"/></a></li>
                 <li wicket:id="typesLI"><a href="#" wicket:id="types"><i class="fa fa-wrench"></i><wicket:message key="types"/></a></li>
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxTextFieldPanel.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/pages/Domains.html
similarity index 62%
rename from client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxTextFieldPanel.html
rename to client/idrepo/console/src/main/resources/org/apache/syncope/client/console/pages/Domains.html
index 2c1b7bb..1c6fa24 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxTextFieldPanel.html
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/pages/Domains.html
@@ -18,13 +18,19 @@ 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>
+    <section class="content-header">
+      <h1>&nbsp;</h1>
+      <ol class="breadcrumb">
+        <li><a wicket:id="dashboardBr"><i class="fa fa-dashboard"></i> <wicket:message key="dashboard"/></a></li>
+        <li class="active"><wicket:message key="keymaster"/></li>
+        <li class="active"><wicket:message key="domains"/></li>
+      </ol>
+    </section>
+
+    <section class="content" wicket:id="content">
+      <div class="box">
+        <div class="box-body" wicket:id="domainPanel"/>
+      </div>
+    </section>
   </wicket:extend>
-</html>
+</html>
\ No newline at end of file
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/pages/NetworkServices.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/pages/NetworkServices.html
index 4645abf..da05fe8 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/pages/NetworkServices.html
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/pages/NetworkServices.html
@@ -22,8 +22,8 @@ under the License.
       <h1>&nbsp;</h1>
       <ol class="breadcrumb">
         <li><a wicket:id="dashboardBr"><i class="fa fa-dashboard"></i> <wicket:message key="dashboard"></wicket:message></a></li>
-        <li class="active"><wicket:message key="configuration"/></li>
-        <li class="active"><wicket:message key="networkServices"></wicket:message></li>
+        <li class="active"><wicket:message key="keymaster"/></li>
+        <li class="active"><wicket:message key="networkservices"></wicket:message></li>
       </ol>
     </section>
 
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/pages/Parameters.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/pages/Parameters.html
index 08fa4ba..ef3003f 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/pages/Parameters.html
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/pages/Parameters.html
@@ -22,7 +22,7 @@ under the License.
       <h1>&nbsp;</h1>
       <ol class="breadcrumb">
         <li><a wicket:id="dashboardBr"><i class="fa fa-dashboard"></i> <wicket:message key="dashboard"/></a></li>
-        <li class="active"><wicket:message key="configuration"/></li>
+        <li class="active"><wicket:message key="keymaster"/></li>
         <li class="active"><wicket:message key="parameters"/></li>
       </ol>
     </section>
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/preview/DefaultPreviewer.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainAdminCredentialsPanel.html
similarity index 80%
rename from client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/preview/DefaultPreviewer.html
rename to client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainAdminCredentialsPanel.html
index 7471fed..f243622 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/preview/DefaultPreviewer.html
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainAdminCredentialsPanel.html
@@ -16,10 +16,11 @@ 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" >
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
   <wicket:extend>
-    <div style="padding: 8px 0px 1px 10px">
-      <i class=" glyphicon glyphicon-paperclip fa-2x" title="Preview not available" alt="Default preview icon"></i>
+    <div class="form-group">
+      <span wicket:id="adminCipherAlgorithm"/>
+      <span wicket:id="adminPassword"/>
     </div>
   </wicket:extend>
 </html>
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_pt_BR.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainDirectoryPanel.properties
similarity index 50%
rename from client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_pt_BR.properties
rename to client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainDirectoryPanel.properties
index 193287d..2b3d928 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_pt_BR.properties
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainDirectoryPanel.properties
@@ -14,4 +14,27 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-confirmMessage=This will remove the current value. Continue?
+jdbcURL=JDBC URL
+maxPoolSize=Pool size: Max
+minIdle=Pool size: Min
+adjust.pool.size=Adjust pool size
+set.admin.credentials=Set admin credentials
+edit.title=adjust pool size
+password_management.title=set admin credentials
+poolMaxActive=Pool: Max active connections
+poolMinIdle=Pool: Min idle connections
+adminCipherAlgorithm=Cipher Algorithm
+adminPassword=Password (encoded)
+any.new=New domain
+jdbcDriver=JDBC Driver
+dbSchema=Database schema
+dbUsername=Database username
+dbPassword=Database password
+transactionIsolation=Transaction isolation
+auditSql=Audit SQL init
+orm=ORM
+databasePlatform=Database platform
+content=Initial content
+keymasterConfParams=Initial conf params
+defaultContent=Leave default content
+defaultKeymasterConfParams=Leave default conf params
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainDirectoryPanel_it.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainDirectoryPanel_it.properties
new file mode 100644
index 0000000..a84d8d6
--- /dev/null
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainDirectoryPanel_it.properties
@@ -0,0 +1,40 @@
+# 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.
+jdbcURL=URL JDBC
+maxPoolSize=Pool size: Max
+minIdle=Pool size: Min
+adjust.pool.size=Imposta la dimensione del pool
+set.admin.credentials=Imposta le credenziali di admin
+edit.title=imposta la dimensione del pool
+password_management.title=Imposta le credenziali di admin
+poolMaxActive=Pool: Max active connections
+poolMinIdle=Pool: Min idle connections
+adminCipherAlgorithm=Algoritmo di cifratura
+adminPassword=Password (codificata)
+any.new=Nuovo dominio
+jdbcDriver=Driver JDBC
+dbSchema=Schema database
+dbUsername=Username database
+dbPassword=Password database
+transactionIsolation=Isolamento transazioni
+auditSql=Audit SQL init
+orm=ORM
+databasePlatform=Piattaforma database
+content=Contenuto iniziale
+keymasterConfParams=Parametri iniziali
+defaultContent=Contenuto iniziale predefinito
+defaultKeymasterConfParams=Parametri iniziali predefiniti
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_ja.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainDirectoryPanel_ja.properties
similarity index 50%
rename from client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_ja.properties
rename to client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainDirectoryPanel_ja.properties
index 807c589..2b3d928 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_ja.properties
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainDirectoryPanel_ja.properties
@@ -14,4 +14,27 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-confirmMessage=\u3053\u308c\u306f\u73fe\u5728\u306e\u5024\u3092\u524a\u9664\u3057\u307e\u3059\u3002\u7d9a\u884c\u3057\u307e\u3059\u304b?
+jdbcURL=JDBC URL
+maxPoolSize=Pool size: Max
+minIdle=Pool size: Min
+adjust.pool.size=Adjust pool size
+set.admin.credentials=Set admin credentials
+edit.title=adjust pool size
+password_management.title=set admin credentials
+poolMaxActive=Pool: Max active connections
+poolMinIdle=Pool: Min idle connections
+adminCipherAlgorithm=Cipher Algorithm
+adminPassword=Password (encoded)
+any.new=New domain
+jdbcDriver=JDBC Driver
+dbSchema=Database schema
+dbUsername=Database username
+dbPassword=Database password
+transactionIsolation=Transaction isolation
+auditSql=Audit SQL init
+orm=ORM
+databasePlatform=Database platform
+content=Initial content
+keymasterConfParams=Initial conf params
+defaultContent=Leave default content
+defaultKeymasterConfParams=Leave default conf params
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainDirectoryPanel_pt_BR.properties
similarity index 50%
rename from client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel.properties
rename to client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainDirectoryPanel_pt_BR.properties
index 193287d..2b3d928 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel.properties
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainDirectoryPanel_pt_BR.properties
@@ -14,4 +14,27 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-confirmMessage=This will remove the current value. Continue?
+jdbcURL=JDBC URL
+maxPoolSize=Pool size: Max
+minIdle=Pool size: Min
+adjust.pool.size=Adjust pool size
+set.admin.credentials=Set admin credentials
+edit.title=adjust pool size
+password_management.title=set admin credentials
+poolMaxActive=Pool: Max active connections
+poolMinIdle=Pool: Min idle connections
+adminCipherAlgorithm=Cipher Algorithm
+adminPassword=Password (encoded)
+any.new=New domain
+jdbcDriver=JDBC Driver
+dbSchema=Database schema
+dbUsername=Database username
+dbPassword=Database password
+transactionIsolation=Transaction isolation
+auditSql=Audit SQL init
+orm=ORM
+databasePlatform=Database platform
+content=Initial content
+keymasterConfParams=Initial conf params
+defaultContent=Leave default content
+defaultKeymasterConfParams=Leave default conf params
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_it.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainDirectoryPanel_ru.properties
similarity index 50%
rename from client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_it.properties
rename to client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainDirectoryPanel_ru.properties
index 13be74d..2b3d928 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_it.properties
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainDirectoryPanel_ru.properties
@@ -14,4 +14,27 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-confirmMessage=Questa azione rimuover\u00e0 il valore corrente. Continuare?
+jdbcURL=JDBC URL
+maxPoolSize=Pool size: Max
+minIdle=Pool size: Min
+adjust.pool.size=Adjust pool size
+set.admin.credentials=Set admin credentials
+edit.title=adjust pool size
+password_management.title=set admin credentials
+poolMaxActive=Pool: Max active connections
+poolMinIdle=Pool: Min idle connections
+adminCipherAlgorithm=Cipher Algorithm
+adminPassword=Password (encoded)
+any.new=New domain
+jdbcDriver=JDBC Driver
+dbSchema=Database schema
+dbUsername=Database username
+dbPassword=Database password
+transactionIsolation=Transaction isolation
+auditSql=Audit SQL init
+orm=ORM
+databasePlatform=Database platform
+content=Initial content
+keymasterConfParams=Initial conf params
+defaultContent=Leave default content
+defaultKeymasterConfParams=Leave default conf params
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/panels/LabelPanel.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainPoolModalPanel.html
similarity index 84%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/panels/LabelPanel.html
rename to client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainPoolModalPanel.html
index c2ec0a9..a82bd45 100644
--- a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/panels/LabelPanel.html
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainPoolModalPanel.html
@@ -17,7 +17,10 @@ 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>
-    <label wicket:id="label"/>
-  </wicket:panel>
+  <wicket:extend>
+    <div class="form-group">
+      <span wicket:id="poolMaxActive"/>
+      <span wicket:id="poolMinIdle"/>
+    </div>
+  </wicket:extend>
 </html>
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/preview/AbstractBinaryPreviewer.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainWizardBuilder$AdminCredentials.html
similarity index 83%
rename from client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/preview/AbstractBinaryPreviewer.html
rename to client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainWizardBuilder$AdminCredentials.html
index 249ac51..8cbf977 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/preview/AbstractBinaryPreviewer.html
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainWizardBuilder$AdminCredentials.html
@@ -16,8 +16,9 @@ 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" >
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
   <wicket:panel>
-    <wicket:child/>
+    <div wicket:id="adminCipherAlgorithm"/>
+    <div wicket:id="adminPassword"/>
   </wicket:panel>
 </html>
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/panels/LabelPanel.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainWizardBuilder$Content.html
similarity index 92%
copy from client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/panels/LabelPanel.html
copy to client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainWizardBuilder$Content.html
index c2ec0a9..28df851 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/panels/LabelPanel.html
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainWizardBuilder$Content.html
@@ -18,6 +18,7 @@ under the License.
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
   <wicket:panel>
-    <label wicket:id="label"/>
+    <div wicket:id="defaultContent"/>
+    <div wicket:id="content"/>
   </wicket:panel>
 </html>
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/panels/LabelPanel.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainWizardBuilder$KeymasterConfParams.html
similarity index 91%
rename from client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/panels/LabelPanel.html
rename to client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainWizardBuilder$KeymasterConfParams.html
index c2ec0a9..ce9e935 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/panels/LabelPanel.html
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainWizardBuilder$KeymasterConfParams.html
@@ -18,6 +18,7 @@ under the License.
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
   <wicket:panel>
-    <label wicket:id="label"/>
+    <div wicket:id="defaultKeymasterConfParams"/>
+    <div wicket:id="content"/>
   </wicket:panel>
 </html>
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wizards/any/PasswordPanel.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainWizardBuilder$Storage.html
similarity index 68%
rename from client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wizards/any/PasswordPanel.html
rename to client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainWizardBuilder$Storage.html
index 7adf2a0..2ad3372 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wizards/any/PasswordPanel.html
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/DomainWizardBuilder$Storage.html
@@ -18,16 +18,17 @@ under the License.
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
   <wicket:panel>
-    <form wicket:id="passwordInnerForm">
-      <div class="form-group">
-        <span wicket:id="password"/>
-      </div>
-      <div class="form-group">
-        <span wicket:id="confirmPassword"/>
-      </div>
-      <div class="form-group">
-        <span wicket:id="storePasswordInSyncope"/>
-      </div>
-    </form>
+    <div wicket:id="key"/>
+    <div wicket:id="jdbcDriver"/>
+    <div wicket:id="jdbcURL"/>
+    <div wicket:id="dbSchema"/>
+    <div wicket:id="dbUsername"/>
+    <div wicket:id="dbPassword"/>
+    <div wicket:id="transactionIsolation"/>
+    <div wicket:id="poolMaxActive"/>
+    <div wicket:id="poolMinIdle"/>
+    <div wicket:id="auditSql"/>
+    <div wicket:id="orm"/>
+    <div wicket:id="databasePlatform"/>
   </wicket:panel>
 </html>
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AbstractFieldPanel.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AbstractFieldPanel.html
deleted file mode 100644
index 1fd3275..0000000
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AbstractFieldPanel.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <wicket:panel>
-    <wicket:fragment wicket:id="requiredFragment">
-      <span wicket:id="requiredLabel"/>
-    </wicket:fragment>
-
-    <wicket:fragment wicket:id="externalActionFragment">
-      <span wicket:id="externalAction"/>
-    </wicket:fragment>
-
-    <wicket:fragment wicket:id="emptyFragment">
-    </wicket:fragment>
-
-    <wicket:child/>
-  </wicket:panel>
-</html>
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxDropDownChoicePanel.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxDropDownChoicePanel.html
deleted file mode 100644
index c4b3da7..0000000
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxDropDownChoicePanel.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <wicket:extend>
-    <wicket:enclosure child="field-label">
-      <label wicket:id="field-label">[LABEL]</label><span wicket:id="required"/>
-      <span wicket:id="externalAction"/>
-    </wicket:enclosure>
-    <fieldset class="input-group">
-      <select wicket:id="dropDownChoiceField" />
-    </fieldset>
-  </wicket:extend>
-</html>
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxPalettePanel.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxPalettePanel.html
deleted file mode 100644
index 633a310..0000000
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxPalettePanel.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-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>
-    <form wicket:id="form">
-      <div class="form-group input-group">
-        <span wicket:id="filter">[FILTER]</span>
-        <span class="input-group-addon">
-          <a href="#" wicket:id="search"><i class="glyphicon glyphicon-search"></i></a>
-        </span>
-      </div>
-    </form>
-    <wicket:enclosure child="field-label">
-      <div><label wicket:id="field-label">[LABEL]</label><span wicket:id="required"/></div>
-      <span wicket:id="externalAction"/>
-    </wicket:enclosure>
-    <fieldset class="input-group">
-      <span wicket:id="paletteField">[Palette]</span>
-    </fieldset>
-  </wicket:extend>
-</html>
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxSpinnerFieldPanel.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxSpinnerFieldPanel.html
deleted file mode 100644
index 56c60a8..0000000
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxSpinnerFieldPanel.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <wicket:head>
-    <style type="text/css">
-      .input-group .ui-spinner {
-        width: 100%;
-      }
-      .ui-state-default .ui-icon {
-        background-image: url("../../webjars/jquery-ui/${jquery-ui.version}/images/ui-icons_222222_256x240.png");
-      }
-    </style>
-  </wicket:head>
-  <wicket:extend>
-    <wicket:enclosure child="field-label">
-      <label wicket:id="field-label">[LABEL]</label><span wicket:id="required"/>
-      <span wicket:id="externalAction"/>
-    </wicket:enclosure>
-    <fieldset class="input-group">
-      <input wicket:id="spinner"/>
-    </fieldset>
-  </wicket:extend>
-</html>
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel.html
deleted file mode 100644
index 632307d..0000000
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <wicket:extend>
-    <wicket:enclosure child="field-label">
-      <label wicket:id="field-label">[LABEL]</label><span wicket:id="required"/>
-      <span wicket:id="externalAction"/>
-    </wicket:enclosure>
-    <div class="input-group input-group-sm">
-      <span class="input-group-btn">  
-        <button type="button" class="btn btn-warning btn-flat"
-                wicket:message="confirm:confirmMessage"
-                onclick="var pwd = $(this).parent().next('input');
-                    var children = $(this).children();
-                    var confirmMessage = $(this).attr('confirm');
-                    if (pwd.is('[readonly]')) {
-                      if (pwd.val() === '') {
-                        pwd.removeAttr('readonly');
-                        children.attr('class', 'fa fa-unlock');
-                      } else {
-                        bootbox.confirm(confirmMessage, function (result) {
-                          if (result === true) {
-                            pwd.removeAttr('readonly');
-                            pwd.val('');
-                            children.attr('class', 'fa fa-unlock');
-                          }
-                          return true;
-                        });
-                      }
-                    }
-                "><i class="fa fa-lock"></i></button>
-      </span>
-      <input type="password" class="form-control" wicket:id="encryptedField" readonly="true"/>
-      <span class="input-group-btn">  
-        <button type="button" class="btn btn-primary btn-flat"
-                onmousedown="var pwd = $(this).parent().prev('input');
-                    if (!pwd.is('[readonly]')) {
-                      pwd.attr('type', 'text');
-                      $(this).children().attr('class', 'fa fa-eye-slash');
-                    }"
-                onmouseup="var pwd = $(this).parent().prev('input');
-                    if (!pwd.is('[readonly]')) {
-                      pwd.attr('type', 'password');
-                      $(this).children().attr('class', 'fa fa-eye');
-                    }"
-                ><i class="fa fa-eye"></i></button>
-      </span>
-    </div>
-  </wicket:extend>
-</html>
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_ru.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_ru.properties
deleted file mode 100644
index 1c45ef7..0000000
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/EncryptedFieldPanel_ru.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-# field.DateTimeFieldPanel$DateTimeFormValidator=\u00d0\u009f\u00d0\u00be\u00d0\u00bb\u00d0\u00b5 '${label0}' \u00d0\u00b4\u00d0\u00be\u00d0\u00bb\u00d0\u00b6\u00d0\u00bd\u00d0\u00be \u00d0\u00b1\u00d1\u008b\u00d1\u0082\u00d1\u008c \u00d0\u00b7\u00d0\u00b0\u00d0\u00bf\u00d0\u00be\u00d0\u00bb\u00d0\u00bd\u00d0\u00b5\u00d0\u00bd\u00d0\u00be \u00d0\u00bf\u00d0\u00be\u00d0\u00bb\u00d0\u00bd\u00d0\u00be\u00d1\u0081\u00d1\u0082\u00d1\u008c\u00d1\u008e
-confirmMessage=This will remove the current value. Continue?
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/NonI18nPalette.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/NonI18nPalette.html
deleted file mode 100644
index 79728da..0000000
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/NonI18nPalette.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <wicket:panel>
-    <input type="hidden" wicket:id="recorder"/>
-    <div class="col-md-5">
-      <div class="form-group">
-        <label>
-          <span wicket:id="availableHeader">[available header]</span>
-        </label>
-        <select class="form-control" style="min-width: 100px;" wicket:id="choices">[choices]</select>
-      </div>
-    </div>
-    <div style="width: 20px; float: left; padding-top: 30px; text-align: center">
-      <div style="padding-top: 2px;">
-        <a wicket:id="addAllButton"><i class="glyphicon glyphicon-forward"></i></a>
-      </div>
-      <div style="padding-top: 2px;">
-        <a wicket:id="removeAllButton"><i class="glyphicon glyphicon-backward"></i></a>
-      </div>
-      <div style="padding-top: 2px;">
-        <a wicket:id="addButton"><i class="glyphicon glyphicon-triangle-right"></i></a>
-      </div>
-      <div style="padding-top: 2px;">
-        <a wicket:id="removeButton"><i class="glyphicon glyphicon-triangle-left"></i></a>
-      </div>
-      <div style="padding-top: 2px;">
-        <a wicket:id="moveUpButton"><i class="glyphicon glyphicon-triangle-top"></i></a>
-      </div>
-      <div style="padding-top: 2px;">
-        <a wicket:id="moveDownButton"><i class="glyphicon glyphicon-triangle-bottom"></i></a>
-      </div>          
-    </div>
-    <div class="col-md-5">
-      <div class="form-group">
-        <label>
-          <span wicket:id="selectedHeader">[selected header]</span>
-        </label>
-        <select class="form-control" style="min-width: 100px;" wicket:id="selection">[selection]</select>	
-      </div>
-    </div>
-  </wicket:panel>
-</html>
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/panels/NotificationPanel.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/panels/NotificationPanel.html
deleted file mode 100644
index 1d5a8a2..0000000
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/panels/NotificationPanel.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <wicket:head>
-    <style type="text/css">
-      div.position {
-        position: fixed;
-        right: 5px;
-        bottom: 20px;
-        width: auto;
-        z-index: 999999;
-      }
-    </style>
-  </wicket:head>
-  <wicket:panel>
-
-    <div id="appendto" class="position"></div>
-    <span wicket:id="feedback"></span>
-
-    <script id="errorTemplate" type="text/x-kendo-template">
-      <div class="alert alert-danger alert-dismissible" style="margin-bottom: 0px; min-width: 370px">
-      <button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button>
-      <h4><i class="icon fa fa-ban"></i> Error!</h4>
-      #= message #     
-      </div>
-    </script>
-    
-    <script id="warningTemplate" type="text/x-kendo-template">
-      <div class="alert alert-warning alert-dismissible" style="margin-bottom: 0px; min-width: 370px">
-      <button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button>
-      <h4><i class="icon fa fa-ban"></i> Warning!</h4>
-      #= message #     
-      </div>
-    </script>
-
-    <script id="successTemplate" type="text/x-kendo-template">
-      <div class="alert alert-success alert-dismissible" style="margin-bottom: 0px; min-width: 370px">
-      <button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button>
-      <h4><i class="icon fa fa-check"></i> Success!</h4>
-      #= message #
-      </div>
-    </script>
-  </wicket:panel>
-</html>
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wicket/markup/html/bootstrap/tabs/Accordion.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wicket/markup/html/bootstrap/tabs/Accordion.html
deleted file mode 100644
index 76ba597..0000000
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wicket/markup/html/bootstrap/tabs/Accordion.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <wicket:panel>
-    <div class="panel box box-primary" wicket:id="tabs">
-      <div class="box-header with-border">
-        <h4  class="box-title">
-          <a wicket:id="title" class="accordion-toggle" data-toggle="collapse">Title</a>
-        </h4>
-      </div>
-      <div wicket:id="body" class="panel-collapse collapse">
-        <div class="box-body" wicket:id="content">Content</div>
-      </div>
-    </div>
-  </wicket:panel>
-</html>
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard.properties
deleted file mode 100644
index cafa9d6..0000000
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-wizard.cancel.error = Wizard error on cancel
-wizard.apply.error = Wizard error on apply changes
-next=Next >
-previous=< Prev
-finish=Finish
-last=Last
-cancel=Cancel
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_it.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_it.properties
deleted file mode 100644
index 3230f79..0000000
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_it.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-wizard.cancel.error = Errore wizard in annullamento operazione
-wizard.apply.error = Errore wizard in fase di commit
-next=Succ >
-previous=< Prec
-finish=Termina
-last=Ultimo
-cancel=Annulla
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_ja.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_ja.properties
deleted file mode 100644
index 8c1969a..0000000
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_ja.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-wizard.cancel.error = \u30ad\u30e3\u30f3\u30bb\u30eb\u6642\u306b\u30a6\u30a3\u30b6\u30fc\u30c9\u30a8\u30e9\u30fc
-wizard.apply.error = \u5909\u66f4\u306e\u9069\u7528\u6642\u306b\u30a6\u30a3\u30b6\u30fc\u30c9\u30a8\u30e9\u30fc
-next=\u6b21\u3078 >
-previous=< \u524d\u3078
-finish=\u5b8c\u4e86
-last=\u6700\u5f8c
-cancel=\u30ad\u30e3\u30f3\u30bb\u30eb
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_pt_BR.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_pt_BR.properties
deleted file mode 100644
index 6cca386..0000000
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_pt_BR.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-wizard.cancel.error = Erro em assistente de cancelar
-wizard.apply.error = Assistente de erro em aplicar as altera\u00e7\u00f5es
-next=Segu >
-previous=< Prec
-finish=Terminar
-last=\u00daltimo
-cancel=Cancelar
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_ru.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_ru.properties
deleted file mode 100644
index af93f5a..0000000
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard_ru.properties
+++ /dev/null
@@ -1,30 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-# wizard.cancel.error = Во время отмены произошла ошибка
-wizard.cancel.error = \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043c\u0435\u043d\u044b \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430
-# wizard.apply.error = Во время применения изменений произошла ошибка
-wizard.apply.error = \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430
-# next=Далее >
-next=\u0414\u0430\u043b\u0435\u0435 >
-# previous=< Назад
-previous=< \u041d\u0430\u0437\u0430\u0434
-# finish=Завершить
-finish=\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c
-# last=В конец
-last=\u0412 \u043a\u043e\u043d\u0435\u0446
-# cancel=Отмена
-cancel=\u041e\u0442\u043c\u0435\u043d\u0430
diff --git a/client/idrepo/enduser/pom.xml b/client/idrepo/enduser/pom.xml
index cda2a38..cfa8351 100644
--- a/client/idrepo/enduser/pom.xml
+++ b/client/idrepo/enduser/pom.xml
@@ -52,51 +52,6 @@ under the License.
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-log4j2</artifactId>
     </dependency>
-      
-    <dependency>
-      <groupId>org.apache.wicket</groupId>
-      <artifactId>wicket-auth-roles</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.googlecode.wicket-jquery-ui</groupId>
-      <artifactId>wicket-jquery-ui</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.googlecode.wicket-jquery-ui</groupId>
-      <artifactId>wicket-kendo-ui</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.googlecode.wicket-jquery-ui</groupId>
-      <artifactId>wicket-kendo-ui-culture</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.googlecode.wicket-jquery-ui</groupId>
-      <artifactId>wicket-kendo-ui-theme-bootstrap</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.wicket</groupId>
-      <artifactId>wicket-native-websocket-javax</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>de.agilecoders.wicket</groupId>
-      <artifactId>wicket-bootstrap-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>de.agilecoders.wicket</groupId>
-      <artifactId>wicket-bootstrap-extensions</artifactId>
-    </dependency>
-    
-    <dependency>
-      <groupId>org.apache.syncope.common.keymaster</groupId>
-      <artifactId>syncope-common-keymaster-client-api</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.syncope.client.idrepo</groupId>
-      <artifactId>syncope-client-idrepo-lib</artifactId>
-      <version>${project.version}</version>
-    </dependency>
     
     <dependency>
       <groupId>org.apache.syncope.client.idrepo</groupId>
@@ -105,11 +60,6 @@ under the License.
     </dependency>
 
     <dependency>
-      <groupId>org.apache.cxf</groupId>
-      <artifactId>cxf-rt-rs-security-jose</artifactId>
-    </dependency>
-
-    <dependency>
       <groupId>org.apache.pdfbox</groupId>
       <artifactId>pdfbox</artifactId>
     </dependency>
@@ -128,30 +78,14 @@ under the License.
     </dependency>
     <dependency>
       <groupId>org.webjars</groupId>
-      <artifactId>codemirror</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.webjars</groupId>
-      <artifactId>google-diff-match-patch</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.webjars</groupId>
       <artifactId>jsplumb</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.webjars.bower</groupId>
-      <artifactId>chart.js</artifactId>
-    </dependency>
-    <dependency>
       <groupId>org.webjars</groupId>
       <artifactId>jquery-cookie</artifactId>
     </dependency>
     <dependency>
       <groupId>org.webjars</groupId>
-      <artifactId>jquery-ui</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.webjars</groupId>
       <artifactId>jQuery-slimScroll</artifactId>
     </dependency>
 
diff --git a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeWebApplication.java b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeWebApplication.java
index d1c2a2b..34dce75 100644
--- a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeWebApplication.java
+++ b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeWebApplication.java
@@ -34,7 +34,6 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Properties;
-import java.util.stream.Collectors;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.monitor.FileAlterationListener;
 import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
@@ -50,14 +49,10 @@ import org.apache.syncope.client.enduser.pages.MustChangePassword;
 import org.apache.syncope.client.enduser.pages.Self;
 import org.apache.syncope.client.enduser.pages.SelfConfirmPasswordReset;
 import org.apache.syncope.client.lib.SyncopeClientFactoryBean;
-import org.apache.syncope.client.ui.commons.BaseApplication;
 import org.apache.syncope.client.ui.commons.SyncopeUIRequestCycleListener;
-import org.apache.syncope.common.keymaster.client.api.DomainOps;
 import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
 import org.apache.syncope.common.keymaster.client.api.ServiceOps;
-import org.apache.syncope.common.keymaster.client.api.model.Domain;
 import org.apache.syncope.common.lib.PropertyUtils;
-import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.wicket.Page;
 import org.apache.wicket.Session;
 import org.apache.wicket.WicketRuntimeException;
@@ -80,7 +75,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
 @Component
-public class SyncopeWebApplication extends WicketBootStandardWebApplication implements BaseApplication {
+public class SyncopeWebApplication extends WicketBootStandardWebApplication {
 
     private static final Logger LOG = LoggerFactory.getLogger(SyncopeWebApplication.class);
 
@@ -105,9 +100,6 @@ public class SyncopeWebApplication extends WicketBootStandardWebApplication impl
     @Autowired
     private ServiceOps serviceOps;
 
-    @Autowired
-    private DomainOps domainOps;
-
     @Value("${service.discovery.address}")
     private String address;
 
@@ -334,17 +326,6 @@ public class SyncopeWebApplication extends WicketBootStandardWebApplication impl
                 setUseCompression(useGZIPCompression);
     }
 
-    @Override
-    public List<String> getDomains() {
-        synchronized (LOG) {
-            if (domains == null) {
-                domains = domainOps.list().stream().map(Domain::getKey).sorted().collect(Collectors.toList());
-                domains.add(0, SyncopeConstants.MASTER_DOMAIN);
-            }
-        }
-        return domains;
-    }
-
     protected Class<? extends WebPage> getSignInPageClass() {
         return Login.class;
     }
diff --git a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/pages/Login.java b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/pages/Login.java
index 2e4a0c7..f86ccdf 100644
--- a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/pages/Login.java
+++ b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/pages/Login.java
@@ -25,7 +25,6 @@ import java.util.Locale;
 import org.apache.syncope.client.enduser.SyncopeWebApplication;
 import org.apache.syncope.client.enduser.SyncopeEnduserSession;
 import org.apache.syncope.client.enduser.init.ClassPathScanImplementationLookup;
-import org.apache.syncope.client.ui.commons.BaseApplication;
 import org.apache.syncope.client.ui.commons.BaseLogin;
 import org.apache.syncope.client.ui.commons.BaseSession;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -49,11 +48,6 @@ public class Login extends BaseLogin {
     }
 
     @Override
-    protected BaseApplication getBaseApplication() {
-        return SyncopeWebApplication.get();
-    }
-
-    @Override
     protected BaseSession getBaseSession() {
         return SyncopeEnduserSession.get();
     }
diff --git a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/pages/SelfConfirmPasswordReset.java b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/pages/SelfConfirmPasswordReset.java
index 5600a8d..6a6cb36 100644
--- a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/pages/SelfConfirmPasswordReset.java
+++ b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/pages/SelfConfirmPasswordReset.java
@@ -18,13 +18,19 @@
  */
 package org.apache.syncope.client.enduser.pages;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.enduser.SyncopeEnduserSession;
 import org.apache.syncope.client.ui.commons.Constants;
 import org.apache.syncope.client.ui.commons.DomainDropDown;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxPasswordFieldPanel;
 import org.apache.syncope.client.ui.commons.markup.html.form.FieldPanel;
+import org.apache.syncope.common.keymaster.client.api.DomainOps;
+import org.apache.syncope.common.keymaster.client.api.model.Domain;
 import org.apache.syncope.common.lib.SyncopeClientException;
+import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.rest.api.service.UserSelfService;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
@@ -35,13 +41,31 @@ import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.PasswordTextField;
 import org.apache.wicket.markup.html.form.StatelessForm;
 import org.apache.wicket.markup.html.form.validation.EqualPasswordInputValidator;
+import org.apache.wicket.model.LoadableDetachableModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.spring.injection.annot.SpringBean;
 
 public class SelfConfirmPasswordReset extends BaseEnduserWebPage {
 
     private static final long serialVersionUID = -2166782304542750726L;
 
+    @SpringBean
+    private DomainOps domainOps;
+
+    private final LoadableDetachableModel<List<String>> domains = new LoadableDetachableModel<List<String>>() {
+
+        private static final long serialVersionUID = 4659376149825914247L;
+
+        @Override
+        protected List<String> load() {
+            List<String> current = new ArrayList<>();
+            current.addAll(domainOps.list().stream().map(Domain::getKey).sorted().collect(Collectors.toList()));
+            current.add(0, SyncopeConstants.MASTER_DOMAIN);
+            return current;
+        }
+    };
+
     public SelfConfirmPasswordReset(final PageParameters parameters) {
         super(parameters);
 
@@ -62,7 +86,7 @@ public class SelfConfirmPasswordReset extends BaseEnduserWebPage {
         form.setOutputMarkupId(true);
         content.add(form);
 
-        DomainDropDown domainSelect = new DomainDropDown("domain");
+        DomainDropDown domainSelect = new DomainDropDown("domain", domains);
         domainSelect.add(new AjaxFormComponentUpdatingBehavior(Constants.ON_BLUR) {
 
             private static final long serialVersionUID = -1107858522700306810L;
diff --git a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/panels/SelfPwdResetPanel.java b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/panels/SelfPwdResetPanel.java
index cc996cd..94a6ae0 100644
--- a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/panels/SelfPwdResetPanel.java
+++ b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/panels/SelfPwdResetPanel.java
@@ -18,6 +18,9 @@
  */
 package org.apache.syncope.client.enduser.panels;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.enduser.SyncopeEnduserSession;
 import org.apache.syncope.client.enduser.SyncopeWebApplication;
@@ -27,7 +30,10 @@ import org.apache.syncope.client.enduser.wizards.any.CaptchaPanel;
 import org.apache.syncope.client.ui.commons.Constants;
 import org.apache.syncope.client.ui.commons.DomainDropDown;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxTextFieldPanel;
+import org.apache.syncope.common.keymaster.client.api.DomainOps;
+import org.apache.syncope.common.keymaster.client.api.model.Domain;
 import org.apache.syncope.common.lib.SyncopeClientException;
+import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.SecurityQuestionTO;
 import org.apache.syncope.common.rest.api.service.SecurityQuestionService;
 import org.apache.syncope.common.rest.api.service.UserSelfService;
@@ -40,9 +46,11 @@ import org.apache.wicket.event.IEventSource;
 import org.apache.wicket.markup.html.form.Button;
 import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.LoadableDetachableModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.PropertyModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -52,6 +60,22 @@ public class SelfPwdResetPanel extends Panel implements IEventSource {
 
     private static final Logger LOG = LoggerFactory.getLogger(SelfPwdResetPanel.class);
 
+    @SpringBean
+    private DomainOps domainOps;
+
+    private final LoadableDetachableModel<List<String>> domains = new LoadableDetachableModel<List<String>>() {
+
+        private static final long serialVersionUID = 4659376149825914247L;
+
+        @Override
+        protected List<String> load() {
+            List<String> current = new ArrayList<>();
+            current.addAll(domainOps.list().stream().map(Domain::getKey).sorted().collect(Collectors.toList()));
+            current.add(0, SyncopeConstants.MASTER_DOMAIN);
+            return current;
+        }
+    };
+
     private String usernameText;
 
     private final TextField<String> securityQuestion;
@@ -63,7 +87,7 @@ public class SelfPwdResetPanel extends Panel implements IEventSource {
     public SelfPwdResetPanel(final String id, final PageReference pageRef) {
         super(id);
 
-        DomainDropDown domainSelect = new DomainDropDown("domain");
+        DomainDropDown domainSelect = new DomainDropDown("domain", domains);
         domainSelect.add(new AjaxFormComponentUpdatingBehavior(Constants.ON_BLUR) {
 
             private static final long serialVersionUID = -1107858522700306810L;
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxCheckBoxPanel.html b/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxCheckBoxPanel.html
deleted file mode 100644
index 54e63c3..0000000
--- a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxCheckBoxPanel.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <head>
-    <title>Ajax checkbox panel</title>
-  </head>
-  <body>
-    <wicket:extend>
-      <div class="checkbox">
-        <input type="checkbox" wicket:id="checkboxField" />
-        <wicket:enclosure child="field-label">
-          <label wicket:id="field-label">[LABEL]</label><span wicket:id="required"/>
-          <span wicket:id="externalAction"/>
-        </wicket:enclosure>
-      </div>
-    </wicket:extend>
-  </body>
-</html>
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxPasswordFieldPanel.html b/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxPasswordFieldPanel.html
deleted file mode 100644
index bddd03a..0000000
--- a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxPasswordFieldPanel.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <head>
-    <title>Ajaxt password field panel</title>
-  </head>
-  <body>
-    <wicket:extend>
-      <wicket:enclosure child="field-label">
-        <label wicket:id="field-label">[LABEL]</label><span wicket:id="required"/>
-        <span wicket:id="externalAction"/>
-      </wicket:enclosure>
-      <!--to be restored and merged with password strength meter-->
-      <!--<fieldset class="input-group">-->
-      <fieldset>
-        <input type="password" class="form-control" wicket:id="passwordField" />
-      </fieldset>
-    </wicket:extend>
-  </body>
-</html>
\ No newline at end of file
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard.html b/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard.html
deleted file mode 100644
index 96f296e..0000000
--- a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizard.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <head>
-    <title></title>
-  </head>
-  <body>
-    <wicket:panel>
-      <div class="wizard-form">
-        <form wicket:id="form">
-          <div class="wizard-overview">
-            <div wicket:id="overview"></div> 
-          </div>
-          <div class="wizard-header">
-            <div wicket:id="header"></div>
-          </div>
-          <div class="wizard-view">
-            <div wicket:id="view"></div>
-          </div>
-          <div class="wizard-buttons">
-            <div wicket:id="buttons"></div>
-          </div>
-        </form>
-      </div>
-      <span wicket:id="outerObjectsRepeater">
-        <div wicket:id="outer"/>
-      </span>
-    </wicket:panel>
-  </body>
-</html>
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizardMgtButtonBar.html b/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizardMgtButtonBar.html
deleted file mode 100644
index 8b51391..0000000
--- a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/ui/commons/wizards/AjaxWizardMgtButtonBar.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <head>
-    <title></title>
-  </head>
-  <body>
-    <wicket:panel xmlns:wicket="http://wicket.apache.org">
-
-      <span class="pull-left">
-        <input wicket:id="cancel" type="submit" wicket:message="value:cancel" class="btn btn-default"/>
-      </span>
-      <span class="pull-right">
-        <input wicket:id="previous" type="submit" wicket:message="value:previous" class="btn btn-default"/>
-        <input wicket:id="next" type="submit" wicket:message="value:next" class="btn btn-default"/>
-        <input wicket:id="last" type="submit" wicket:message="value:last" class="btn btn-default"/>
-        <input wicket:id="finish" type="submit" wicket:message="value:finish" class="btn btn-primary"/>
-      </span>
-
-    </wicket:panel>
-  </body>
-</html>
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/IdRepoEntitlement.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/IdRepoEntitlement.java
index 56850cc..63cf758 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/IdRepoEntitlement.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/IdRepoEntitlement.java
@@ -132,7 +132,7 @@ public final class IdRepoEntitlement {
 
     public static final String GROUP_DELETE = "GROUP_DELETE";
 
-    public static final String INTERNAL_STORAGE_EXPORT = "INTERNAL_STORAGE_EXPORT";
+    public static final String KEYMASTER = "KEYMASTER";
 
     public static final String TASK_LIST = "TASK_LIST";
 
diff --git a/common/keymaster/client-api/src/main/java/org/apache/syncope/common/keymaster/client/api/DomainOps.java b/common/keymaster/client-api/src/main/java/org/apache/syncope/common/keymaster/client/api/DomainOps.java
index 00224b2..b7ec18a 100644
--- a/common/keymaster/client-api/src/main/java/org/apache/syncope/common/keymaster/client/api/DomainOps.java
+++ b/common/keymaster/client-api/src/main/java/org/apache/syncope/common/keymaster/client/api/DomainOps.java
@@ -35,7 +35,7 @@ public interface DomainOps {
 
     void changeAdminPassword(String key, String password, CipherAlgorithm cipherAlgorithm);
 
-    void adjustPoolSize(String key, int maxPoolSize, int minIdle);
+    void adjustPoolSize(String key, int poolMaxActive, int poolMinIdle);
 
     void delete(String key);
 }
diff --git a/common/keymaster/client-api/src/main/java/org/apache/syncope/common/keymaster/client/api/model/Domain.java b/common/keymaster/client-api/src/main/java/org/apache/syncope/common/keymaster/client/api/model/Domain.java
index 3e659ac..2c156ec 100644
--- a/common/keymaster/client-api/src/main/java/org/apache/syncope/common/keymaster/client/api/model/Domain.java
+++ b/common/keymaster/client-api/src/main/java/org/apache/syncope/common/keymaster/client/api/model/Domain.java
@@ -84,13 +84,13 @@ public class Domain implements Serializable {
             return this;
         }
 
-        public Builder maxPoolSize(final int maxPoolSize) {
-            this.domain.maxPoolSize = maxPoolSize;
+        public Builder poolMaxActive(final int poolMaxActive) {
+            this.domain.poolMaxActive = poolMaxActive;
             return this;
         }
 
-        public Builder minIdle(final int minIdle) {
-            this.domain.minIdle = minIdle;
+        public Builder poolMinIdle(final int poolMinIdle) {
+            this.domain.poolMinIdle = poolMinIdle;
             return this;
         }
 
@@ -148,9 +148,9 @@ public class Domain implements Serializable {
 
     private TransactionIsolation transactionIsolation = TransactionIsolation.TRANSACTION_READ_COMMITTED;
 
-    private int maxPoolSize = 10;
+    private int poolMaxActive = 10;
 
-    private int minIdle = 2;
+    private int poolMinIdle = 2;
 
     private String auditSql = "audit.sql";
 
@@ -194,20 +194,20 @@ public class Domain implements Serializable {
         return transactionIsolation;
     }
 
-    public int getMaxPoolSize() {
-        return maxPoolSize;
+    public int getPoolMaxActive() {
+        return poolMaxActive;
     }
 
-    public void setMaxPoolSize(final int maxPoolSize) {
-        this.maxPoolSize = maxPoolSize;
+    public void setPoolMaxActive(final int poolMaxActive) {
+        this.poolMaxActive = poolMaxActive;
     }
 
-    public int getMinIdle() {
-        return minIdle;
+    public int getPoolMinIdle() {
+        return poolMinIdle;
     }
 
-    public void setMinIdle(final int minIdle) {
-        this.minIdle = minIdle;
+    public void setPoolMinIdle(final int poolMinIdle) {
+        this.poolMinIdle = poolMinIdle;
     }
 
     public String getAuditSql() {
@@ -275,8 +275,8 @@ public class Domain implements Serializable {
                 append(dbUsername).
                 append(dbPassword).
                 append(transactionIsolation).
-                append(maxPoolSize).
-                append(minIdle).
+                append(poolMaxActive).
+                append(poolMinIdle).
                 append(auditSql).
                 append(orm).
                 append(databasePlatform).
@@ -307,8 +307,8 @@ public class Domain implements Serializable {
                 append(dbUsername, other.dbUsername).
                 append(dbPassword, other.dbPassword).
                 append(transactionIsolation, other.transactionIsolation).
-                append(maxPoolSize, other.maxPoolSize).
-                append(minIdle, other.minIdle).
+                append(poolMaxActive, other.poolMaxActive).
+                append(poolMinIdle, other.poolMinIdle).
                 append(auditSql, other.auditSql).
                 append(orm, other.orm).
                 append(databasePlatform, other.databasePlatform).
@@ -329,8 +329,8 @@ public class Domain implements Serializable {
                 + ", dbUsername=" + dbUsername
                 + ", dbPassword=" + dbPassword
                 + ", transactionIsolation=" + transactionIsolation
-                + ", maxPoolSize=" + maxPoolSize
-                + ", minIdle=" + minIdle
+                + ", poolMaxSize=" + poolMaxActive
+                + ", poolMinIdle=" + poolMinIdle
                 + ", auditSql=" + auditSql
                 + ", orm=" + orm
                 + ", databasePlatform=" + databasePlatform
diff --git a/common/keymaster/client-zookeeper/src/main/java/org/apache/syncope/common/keymaster/client/zookeper/ZookeeperDomainOps.java b/common/keymaster/client-zookeeper/src/main/java/org/apache/syncope/common/keymaster/client/zookeper/ZookeeperDomainOps.java
index 2ff4726..1fd2ce6 100644
--- a/common/keymaster/client-zookeeper/src/main/java/org/apache/syncope/common/keymaster/client/zookeper/ZookeeperDomainOps.java
+++ b/common/keymaster/client-zookeeper/src/main/java/org/apache/syncope/common/keymaster/client/zookeper/ZookeeperDomainOps.java
@@ -165,12 +165,12 @@ public class ZookeeperDomainOps implements DomainOps, InitializingBean {
     }
 
     @Override
-    public void adjustPoolSize(final String key, final int maxPoolSize, final int minIdle) {
+    public void adjustPoolSize(final String key, final int poolMaxActive, final int poolMinIdle) {
         try {
             Domain domain = read(key);
 
-            domain.setMaxPoolSize(maxPoolSize);
-            domain.setMinIdle(minIdle);
+            domain.setPoolMaxActive(poolMaxActive);
+            domain.setPoolMinIdle(poolMinIdle);
             client.setData().forPath(buildDomainPath(key), MAPPER.writeValueAsBytes(domain));
         } catch (KeymasterException e) {
             throw e;
diff --git a/common/keymaster/client-zookeeper/src/test/java/org/apache/syncope/common/keymaster/client/zookeper/ZookeeperDomainOpsITCase.java b/common/keymaster/client-zookeeper/src/test/java/org/apache/syncope/common/keymaster/client/zookeper/ZookeeperDomainOpsITCase.java
index ed53738..1741f29 100644
--- a/common/keymaster/client-zookeeper/src/test/java/org/apache/syncope/common/keymaster/client/zookeper/ZookeeperDomainOpsITCase.java
+++ b/common/keymaster/client-zookeeper/src/test/java/org/apache/syncope/common/keymaster/client/zookeper/ZookeeperDomainOpsITCase.java
@@ -22,6 +22,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.util.List;
 import java.util.UUID;
@@ -59,13 +60,20 @@ public class ZookeeperDomainOpsITCase {
         assertEquals(Domain.TransactionIsolation.TRANSACTION_READ_UNCOMMITTED, domain.getTransactionIsolation());
         assertEquals("password", domain.getAdminPassword());
         assertEquals(CipherAlgorithm.BCRYPT, domain.getAdminCipherAlgorithm());
-        assertEquals(10, domain.getMaxPoolSize());
-        assertEquals(2, domain.getMinIdle());
+        assertEquals(10, domain.getPoolMaxActive());
+        assertEquals(2, domain.getPoolMinIdle());
 
         List<Domain> list = domainOps.list();
         assertNotNull(list);
         assertEquals(domain, list.get(0));
 
+        try {
+            domainOps.create(new Domain.Builder(domain.getKey()).build());
+            fail();
+        } catch (KeymasterException e) {
+            assertNotNull(e);
+        }
+
         domainOps.changeAdminPassword(key, "newpassword", CipherAlgorithm.SSHA512);
 
         domain = domainOps.read(key);
@@ -75,8 +83,8 @@ public class ZookeeperDomainOpsITCase {
         domainOps.adjustPoolSize(key, 100, 23);
 
         domain = domainOps.read(key);
-        assertEquals(100, domain.getMaxPoolSize());
-        assertEquals(23, domain.getMinIdle());
+        assertEquals(100, domain.getPoolMaxActive());
+        assertEquals(23, domain.getPoolMinIdle());
 
         domainOps.delete(key);
 
diff --git a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
index 338671a..e76aa59 100644
--- a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
+++ b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
@@ -493,7 +493,7 @@ public class SyncopeLogic extends AbstractLogic<EntityTO> {
         return groupDataBinder.getTypeExtensionTO(typeExt.get());
     }
 
-    @PreAuthorize("hasRole('" + IdRepoEntitlement.INTERNAL_STORAGE_EXPORT + "')")
+    @PreAuthorize("hasRole('" + IdRepoEntitlement.KEYMASTER + "')")
     @Transactional(readOnly = true)
     public void exportInternalStorageContent(final OutputStream os) {
         try {
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/DomainConfFactory.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/DomainConfFactory.java
index 68a6982..1718a87 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/DomainConfFactory.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/DomainConfFactory.java
@@ -90,8 +90,8 @@ public class DomainConfFactory implements DomainRegistry, EnvironmentAware {
         hikariConfig.setPassword(domain.getDbPassword());
         hikariConfig.setSchema(domain.getDbSchema());
         hikariConfig.setTransactionIsolation(domain.getTransactionIsolation().name());
-        hikariConfig.setMaximumPoolSize(domain.getMaxPoolSize());
-        hikariConfig.setMinimumIdle(domain.getMinIdle());
+        hikariConfig.setMaximumPoolSize(domain.getPoolMaxActive());
+        hikariConfig.setMinimumIdle(domain.getPoolMinIdle());
 
         HikariDataSource localDomainDataSource = new HikariDataSource(hikariConfig);
 
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/StartupDomainLoader.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/StartupDomainLoader.java
index c933ff5..6364dd2 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/StartupDomainLoader.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/StartupDomainLoader.java
@@ -112,9 +112,9 @@ public class StartupDomainLoader implements SyncopeCoreLoader {
                             } else if (prop.endsWith(".orm")) {
                                 builder.orm(props.getProperty(prop));
                             } else if (prop.endsWith(".pool.maxActive")) {
-                                builder.maxPoolSize(Integer.parseInt(props.getProperty(prop)));
+                                builder.poolMaxActive(Integer.parseInt(props.getProperty(prop)));
                             } else if (prop.endsWith(".pool.minIdle")) {
-                                builder.minIdle(Integer.parseInt(props.getProperty(prop)));
+                                builder.poolMinIdle(Integer.parseInt(props.getProperty(prop)));
                             } else if (prop.endsWith(".audit.sql")) {
                                 builder.auditSql(props.getProperty(prop));
                             }
diff --git a/ext/self-keymaster/logic/src/main/java/org/apache/syncope/core/logic/DomainLogic.java b/ext/self-keymaster/logic/src/main/java/org/apache/syncope/core/logic/DomainLogic.java
index 789f39d..61d4ad8 100644
--- a/ext/self-keymaster/logic/src/main/java/org/apache/syncope/core/logic/DomainLogic.java
+++ b/ext/self-keymaster/logic/src/main/java/org/apache/syncope/core/logic/DomainLogic.java
@@ -29,6 +29,7 @@ import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.types.CipherAlgorithm;
 import org.apache.syncope.core.persistence.api.dao.DomainDAO;
+import org.apache.syncope.core.persistence.api.dao.DuplicateException;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.entity.DomainEntity;
 import org.apache.syncope.core.persistence.api.entity.SelfKeymasterEntityFactory;
@@ -69,6 +70,10 @@ public class DomainLogic extends AbstractTransactionalLogic<EntityTO> {
             throw new KeymasterException("Cannot create domain " + SyncopeConstants.MASTER_DOMAIN);
         }
 
+        if (domainDAO.find(domain.getKey()) != null) {
+            throw new DuplicateException("Domain " + domain.getKey() + " already existing");
+        }
+
         DomainEntity domainEntity = entityFactory.newDomainEntity();
         domainEntity.setKey(domain.getKey());
         domainEntity.set(domain);
@@ -94,15 +99,15 @@ public class DomainLogic extends AbstractTransactionalLogic<EntityTO> {
     }
 
     @PreAuthorize("@environment.getProperty('keymaster.username') == authentication.name and not(isAnonymous())")
-    public void adjustPoolSize(final String key, final int maxPoolSize, final int minIdle) {
+    public void adjustPoolSize(final String key, final int poolMaxActive, final int poolMinIdle) {
         DomainEntity domain = domainDAO.find(key);
         if (domain == null) {
             throw new NotFoundException("Domain " + key);
         }
 
         Domain domainObj = domain.get();
-        domainObj.setMaxPoolSize(maxPoolSize);
-        domainObj.setMinIdle(minIdle);
+        domainObj.setPoolMaxActive(poolMaxActive);
+        domainObj.setPoolMinIdle(poolMinIdle);
         domain.set(domainObj);
         domainDAO.save(domain);
     }
diff --git a/ext/self-keymaster/rest-api/src/main/java/org/apache/syncope/ext/self/keymaster/api/service/DomainService.java b/ext/self-keymaster/rest-api/src/main/java/org/apache/syncope/ext/self/keymaster/api/service/DomainService.java
index 40a390d..85e3479 100644
--- a/ext/self-keymaster/rest-api/src/main/java/org/apache/syncope/ext/self/keymaster/api/service/DomainService.java
+++ b/ext/self-keymaster/rest-api/src/main/java/org/apache/syncope/ext/self/keymaster/api/service/DomainService.java
@@ -67,8 +67,8 @@ public interface DomainService extends Serializable {
     @Produces({ MediaType.APPLICATION_JSON })
     Response adjustPoolSize(
             @NotNull @PathParam("key") String key,
-            @QueryParam("maxPoolSize") int maxPoolSize,
-            @QueryParam("minIdle") int minIdle);
+            @QueryParam("poolMaxActive") int poolMaxActive,
+            @QueryParam("poolMinIdle") int poolMinIdle);
 
     @DELETE
     @Path("{key}")
diff --git a/ext/self-keymaster/rest-cxf/src/main/java/org/apache/syncope/ext/self/keymaster/cxf/service/DomainServiceImpl.java b/ext/self-keymaster/rest-cxf/src/main/java/org/apache/syncope/ext/self/keymaster/cxf/service/DomainServiceImpl.java
index a181c20..2440922 100644
--- a/ext/self-keymaster/rest-cxf/src/main/java/org/apache/syncope/ext/self/keymaster/cxf/service/DomainServiceImpl.java
+++ b/ext/self-keymaster/rest-cxf/src/main/java/org/apache/syncope/ext/self/keymaster/cxf/service/DomainServiceImpl.java
@@ -70,8 +70,8 @@ public class DomainServiceImpl implements DomainService {
     }
 
     @Override
-    public Response adjustPoolSize(final String key, final int maxPoolSize, final int minIdle) {
-        logic.adjustPoolSize(key, maxPoolSize, minIdle);
+    public Response adjustPoolSize(final String key, final int poolMaxActive, final int poolMinIdle) {
+        logic.adjustPoolSize(key, poolMaxActive, poolMinIdle);
         return Response.noContent().build();
     }
 
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/ParametersITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/ParametersITCase.java
index ef7f3aa..c0fa456 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/ParametersITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/ParametersITCase.java
@@ -34,7 +34,7 @@ public class ParametersITCase extends AbstractConsoleITCase {
     @BeforeEach
     public void login() {
         doLogin(ADMIN_UNAME, ADMIN_PWD);
-        TESTER.clickLink("body:configurationLI:configurationUL:parametersLI:parameters");
+        TESTER.clickLink("body:keymasterLI:keymasterUL:parametersLI:parameters");
         TESTER.assertRenderedPage(Parameters.class);
     }
 
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/KeymasterITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/KeymasterITCase.java
index caf836d..a07760e 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/KeymasterITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/KeymasterITCase.java
@@ -237,8 +237,8 @@ public class KeymasterITCase extends AbstractITCase {
         Domain domain = domainOps.read(key);
         assertEquals(Domain.TransactionIsolation.TRANSACTION_READ_UNCOMMITTED, domain.getTransactionIsolation());
         assertEquals(CipherAlgorithm.BCRYPT, domain.getAdminCipherAlgorithm());
-        assertEquals(10, domain.getMaxPoolSize());
-        assertEquals(2, domain.getMinIdle());
+        assertEquals(10, domain.getPoolMaxActive());
+        assertEquals(2, domain.getPoolMinIdle());
 
         assertEquals(domain, domainOps.read(key));
 
@@ -246,8 +246,8 @@ public class KeymasterITCase extends AbstractITCase {
         domainOps.adjustPoolSize(key, 100, 23);
 
         domain = domainOps.read(key);
-        assertEquals(100, domain.getMaxPoolSize());
-        assertEquals(23, domain.getMinIdle());
+        assertEquals(100, domain.getPoolMaxActive());
+        assertEquals(23, domain.getPoolMinIdle());
 
         // 3. work with new domain - create user
         clientFactory = new SyncopeClientFactoryBean().setAddress(ADDRESS).setDomain(key);
@@ -294,6 +294,13 @@ public class KeymasterITCase extends AbstractITCase {
     }
 
     @Test
+    public void domainCreateDuplicateKey() {
+        assertThrows(KeymasterException.class, () -> {
+            domainOps.create(new Domain.Builder("Two").build());
+        });
+    }
+
+    @Test
     public void domainUpdateAdminPassword() throws Exception {
         assumeFalse(domainOps.list().isEmpty());