syncope-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ilgro...@apache.org
Subject [4/4] syncope git commit: [SYNCOPE-1067] Management from Admin Console
Date Fri, 09 Jun 2017 16:00:25 GMT
[SYNCOPE-1067] Management from Admin Console


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/52bd7eb0
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/52bd7eb0
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/52bd7eb0

Branch: refs/heads/master
Commit: 52bd7eb0d8331b884e8b8cdf598670d1a03ccad1
Parents: f74ce5d
Author: Francesco Chicchiriccò <ilgrosso@apache.org>
Authored: Fri Jun 9 17:59:22 2017 +0200
Committer: Francesco Chicchiriccò <ilgrosso@apache.org>
Committed: Fri Jun 9 18:00:11 2017 +0200

----------------------------------------------------------------------
 .../client/console/commons/Constants.java       |   2 +
 .../console/layout/AbstractAnyFormLayout.java   |  10 +
 .../console/layout/AnyObjectFormLayoutInfo.java |  10 -
 .../console/layout/UserFormLayoutInfo.java      |  10 -
 .../console/notifications/TemplateModal.java    |   4 +-
 .../client/console/pages/Administration.java    |  83 ++++++
 .../syncope/client/console/pages/BasePage.java  |   6 +-
 .../syncope/client/console/pages/Roles.java     |  52 ----
 .../console/panels/DynRealmDirectoryPanel.java  | 186 +++++++++++++
 .../console/panels/DynRealmModalPanel.java      | 109 ++++++++
 .../console/panels/RoleDirectoryPanel.java      |   2 +-
 .../console/panels/SecurityQuestionsPanel.java  |   4 +-
 .../client/console/rest/DynRealmRestClient.java |  47 ++++
 .../client/console/rest/RoleRestClient.java     |   4 -
 .../html/form/ActionLinksTogglePanel.java       |   8 +-
 .../wicket/markup/html/form/ActionPanel.java    |   2 +-
 .../console/widgets/CompletenessWidget.java     |   4 +-
 .../client/console/widgets/NumberWidget.java    |   4 +-
 .../client/console/wizards/DynRealmWrapper.java |  69 +++++
 .../client/console/wizards/WizardMgtPanel.java  |   4 +-
 .../console/wizards/any/AnyWizardBuilder.java   |   6 +-
 .../console/wizards/any/GroupWizardBuilder.java |   2 +-
 .../client/console/wizards/any/Groups.java      | 260 +++++++++++--------
 .../console/wizards/role/RoleWizardBuilder.java |  20 +-
 .../src/main/resources/console.properties       |   2 +-
 .../SyncopeConsoleApplication.properties        |   1 +
 .../SyncopeConsoleApplication_it.properties     |   1 +
 .../SyncopeConsoleApplication_pt_BR.properties  |   1 +
 .../SyncopeConsoleApplication_ru.properties     |   1 +
 .../console/notifications/TemplateModal.html    |  13 +-
 .../client/console/pages/Administration.html    |  36 +++
 .../console/pages/Administration.properties     |  18 ++
 .../console/pages/Administration_it.properties  |  18 ++
 .../pages/Administration_pt_BR.properties       |  18 ++
 .../console/pages/Administration_ru.properties  |  20 ++
 .../syncope/client/console/pages/BasePage.html  |   2 +-
 .../syncope/client/console/pages/Roles.html     |  36 ---
 .../client/console/pages/Roles.properties       |  17 --
 .../client/console/pages/Roles_it.properties    |  17 --
 .../client/console/pages/Roles_pt_BR.properties |  17 --
 .../client/console/pages/Roles_ru.properties    |  19 --
 .../panels/DynRealmDirectoryPanel.properties    |  18 ++
 .../panels/DynRealmDirectoryPanel_it.properties |  18 ++
 .../DynRealmDirectoryPanel_pt_BR.properties     |  18 ++
 .../panels/DynRealmDirectoryPanel_ru.properties |  19 ++
 .../console/panels/DynRealmModalPanel.html      |  26 ++
 .../panels/RoleDirectoryPanel.properties        |   1 -
 .../panels/RoleDirectoryPanel_it.properties     |   1 -
 .../panels/RoleDirectoryPanel_pt_BR.properties  |   1 -
 .../panels/RoleDirectoryPanel_ru.properties     |   1 -
 .../client/console/wizards/any/Groups.html      |  17 +-
 .../console/wizards/any/Groups.properties       |   1 +
 .../console/wizards/any/Groups_it.properties    |   1 +
 .../console/wizards/any/Groups_pt_BR.properties |   1 +
 .../console/wizards/any/Groups_ru.properties    |   1 +
 .../role/RoleWizardBuilder$DynRealms.html       |  28 ++
 .../java/data/DynRealmDataBinderImpl.java       |   7 +-
 .../src/main/resources/console.properties       |   2 +-
 .../syncope/fit/console/AjaxBrowseITCase.java   |   6 +-
 .../apache/syncope/fit/console/RolesITCase.java |  55 ++--
 .../apache/syncope/fit/console/UsersITCase.java |   4 +-
 .../src/test/resources/console.properties       |   2 +-
 62 files changed, 1002 insertions(+), 371 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
index 1eedd67..e49f10d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
@@ -121,6 +121,8 @@ public final class Constants {
 
     public static final String PREF_ROLE_PAGINATOR_ROWS = "role.paginator.rows";
 
+    public static final String PREF_DYNREALM_PAGINATOR_ROWS = "dynRealm.paginator.rows";
+
     public static final String PREF_ACCESS_TOKEN_PAGINATOR_ROWS = "accessToken.paginator.rows";
 
     public static final String PREF_WORKFLOW_FORM_PAGINATOR_ROWS = "role.paginator.workflow.form";

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/layout/AbstractAnyFormLayout.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/layout/AbstractAnyFormLayout.java b/client/console/src/main/java/org/apache/syncope/client/console/layout/AbstractAnyFormLayout.java
index 91c887a..6b85887 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/layout/AbstractAnyFormLayout.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/layout/AbstractAnyFormLayout.java
@@ -31,6 +31,8 @@ public abstract class AbstractAnyFormLayout<A extends AnyTO, F extends AnyForm<A
 
     private boolean auxClasses = true;
 
+    private boolean groups = true;
+
     private boolean plainAttrs = true;
 
     private final List<String> whichPlainAttrs = new ArrayList<>();
@@ -63,6 +65,14 @@ public abstract class AbstractAnyFormLayout<A extends AnyTO, F extends AnyForm<A
         this.auxClasses = auxClasses;
     }
 
+    public boolean isGroups() {
+        return groups;
+    }
+
+    public void setGroups(final boolean groups) {
+        this.groups = groups;
+    }
+
     public boolean isPlainAttrs() {
         return plainAttrs;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/layout/AnyObjectFormLayoutInfo.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/layout/AnyObjectFormLayoutInfo.java b/client/console/src/main/java/org/apache/syncope/client/console/layout/AnyObjectFormLayoutInfo.java
index 2d275c3..211aa25 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/layout/AnyObjectFormLayoutInfo.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/layout/AnyObjectFormLayoutInfo.java
@@ -25,8 +25,6 @@ public class AnyObjectFormLayoutInfo extends AbstractAnyFormLayout<AnyObjectTO,
 
     private static final long serialVersionUID = -5573691733739618500L;
 
-    private boolean groups = true;
-
     private boolean relationships = true;
 
     @Override
@@ -34,14 +32,6 @@ public class AnyObjectFormLayoutInfo extends AbstractAnyFormLayout<AnyObjectTO,
         return AnyObjectWizardBuilder.class;
     }
 
-    public boolean isGroups() {
-        return groups;
-    }
-
-    public void setGroups(final boolean groups) {
-        this.groups = groups;
-    }
-
     public boolean isRelationships() {
         return relationships;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/layout/UserFormLayoutInfo.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/layout/UserFormLayoutInfo.java b/client/console/src/main/java/org/apache/syncope/client/console/layout/UserFormLayoutInfo.java
index 68a67b9..c100143 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/layout/UserFormLayoutInfo.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/layout/UserFormLayoutInfo.java
@@ -29,8 +29,6 @@ public class UserFormLayoutInfo extends AbstractAnyFormLayout<UserTO, UserForm>
 
     private boolean roles = true;
 
-    private boolean groups = true;
-
     private boolean relationships = true;
 
     @Override
@@ -54,14 +52,6 @@ public class UserFormLayoutInfo extends AbstractAnyFormLayout<UserTO, UserForm>
         this.roles = roles;
     }
 
-    public boolean isGroups() {
-        return groups;
-    }
-
-    public void setGroups(final boolean groups) {
-        this.groups = groups;
-    }
-
     public boolean isRelationships() {
         return relationships;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/notifications/TemplateModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/notifications/TemplateModal.java b/client/console/src/main/java/org/apache/syncope/client/console/notifications/TemplateModal.java
index 57bb761..d802f66 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/notifications/TemplateModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/notifications/TemplateModal.java
@@ -50,8 +50,8 @@ public class TemplateModal<T extends EntityTO, F> extends AbstractModalPanel<T>
         this.restClient = restClient;
         this.templateTO = templateTO;
 
-        final AjaxTextFieldPanel key
-                = new AjaxTextFieldPanel("key", "key", new PropertyModel<String>(templateTO, "key"), false);
+        AjaxTextFieldPanel key = new AjaxTextFieldPanel(
+                "key", "key", new PropertyModel<String>(templateTO, "key"), false);
         key.setOutputMarkupPlaceholderTag(true);
         add(key.setRenderBodyOnly(true));
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/pages/Administration.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Administration.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Administration.java
new file mode 100644
index 0000000..6f4423f
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Administration.java
@@ -0,0 +1,83 @@
+/*
+ * 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.pages;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.tabs.AjaxBootstrapTabbedPanel;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.syncope.client.console.BookmarkablePageLinkBuilder;
+import org.apache.syncope.client.console.panels.DynRealmDirectoryPanel;
+import org.apache.syncope.client.console.panels.RoleDirectoryPanel;
+import org.apache.syncope.client.console.wizards.role.RoleWizardBuilder;
+import org.apache.syncope.common.lib.to.RoleTO;
+import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
+import org.apache.wicket.extensions.markup.html.tabs.ITab;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+public class Administration extends BasePage {
+
+    private static final long serialVersionUID = -1100228004207271271L;
+
+    public Administration(final PageParameters parameters) {
+        super(parameters);
+
+        body.add(BookmarkablePageLinkBuilder.build("dashboard", "dashboardBr", Dashboard.class));
+        WebMarkupContainer content = new WebMarkupContainer("content");
+        content.setOutputMarkupId(true);
+        content.setMarkupId("administration");
+        content.add(new AjaxBootstrapTabbedPanel<>("tabbedPanel", buildTabList()));
+        body.add(content);
+    }
+
+    private List<ITab> buildTabList() {
+        final List<ITab> tabs = new ArrayList<>();
+
+        tabs.add(new AbstractTab(new ResourceModel("roles")) {
+
+            private static final long serialVersionUID = -6815067322125799251L;
+
+            @Override
+            public Panel getPanel(final String panelId) {
+                return new RoleDirectoryPanel.Builder(getPageReference()) {
+
+                    private static final long serialVersionUID = -5960765294082359003L;
+
+                }.addNewItemPanelBuilder(new RoleWizardBuilder(new RoleTO(), getPageReference()), true).build(panelId);
+            }
+        });
+
+        tabs.add(new AbstractTab(new ResourceModel("dynRealms")) {
+
+            private static final long serialVersionUID = -6815067322125799251L;
+
+            @Override
+            public Panel getPanel(final String panelId) {
+                return new DynRealmDirectoryPanel.Builder(getPageReference()) {
+
+                    private static final long serialVersionUID = -5960765294082359003L;
+
+                }.build(panelId);
+            }
+        });
+        return tabs;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
index e7e23ae..1a94309 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
@@ -206,9 +206,9 @@ public class BasePage extends WebPage implements IAjaxIndicatorAware {
         MetaDataRoleAuthorizationStrategy.authorize(link, WebPage.RENDER, StandardEntitlement.SCHEMA_LIST);
         liContainer.add(link);
 
-        liContainer = new WebMarkupContainer(getLIContainerId("roles"));
+        liContainer = new WebMarkupContainer(getLIContainerId("administration"));
         confULContainer.add(liContainer);
-        link = BookmarkablePageLinkBuilder.build("roles", Roles.class);
+        link = BookmarkablePageLinkBuilder.build("administration", Administration.class);
         MetaDataRoleAuthorizationStrategy.authorize(link, WebPage.RENDER, StandardEntitlement.ROLE_LIST);
         liContainer.add(link);
 
@@ -317,7 +317,7 @@ public class BasePage extends WebPage implements IAjaxIndicatorAware {
         // Extensions
         ClassPathScanImplementationLookup classPathScanImplementationLookup =
                 (ClassPathScanImplementationLookup) SyncopeConsoleApplication.get().
-                getServletContext().getAttribute(ConsoleInitializer.CLASSPATH_LOOKUP);
+                        getServletContext().getAttribute(ConsoleInitializer.CLASSPATH_LOOKUP);
         List<Class<? extends BaseExtPage>> extPageClasses = classPathScanImplementationLookup.getExtPageClasses();
 
         WebMarkupContainer extensionsLI = new WebMarkupContainer(getLIContainerId("extensions"));

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/pages/Roles.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Roles.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Roles.java
deleted file mode 100644
index d02345c..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/Roles.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.client.console.pages;
-
-import org.apache.syncope.client.console.BookmarkablePageLinkBuilder;
-import org.apache.syncope.client.console.panels.RoleDirectoryPanel;
-import org.apache.syncope.client.console.wizards.WizardMgtPanel;
-import org.apache.syncope.client.console.wizards.role.RoleWrapper;
-import org.apache.syncope.client.console.wizards.role.RoleWizardBuilder;
-import org.apache.syncope.common.lib.to.RoleTO;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
-
-public class Roles extends BasePage {
-
-    private static final long serialVersionUID = -1100228004207271271L;
-
-    public Roles(final PageParameters parameters) {
-        super(parameters);
-
-        body.add(BookmarkablePageLinkBuilder.build("dashboard", "dashboardBr", Dashboard.class));
-
-        WebMarkupContainer content = new WebMarkupContainer("content");
-        content.setOutputMarkupId(true);
-        body.add(content);
-
-        WizardMgtPanel<RoleWrapper> rolesPanel = new RoleDirectoryPanel.Builder(getPageReference()) {
-
-            private static final long serialVersionUID = -5960765294082359003L;
-
-        }.addNewItemPanelBuilder(
-                new RoleWizardBuilder(new RoleTO(), getPageReference()), true).build("rolesPanel");
-
-        content.add(rolesPanel);
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java
new file mode 100644
index 0000000..c20efb5
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java
@@ -0,0 +1,186 @@
+/*
+ * 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.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
+import org.apache.syncope.client.console.panels.DynRealmDirectoryPanel.DynRealmDataProvider;
+import org.apache.syncope.client.console.rest.DynRealmRestClient;
+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.console.wizards.DynRealmWrapper;
+import org.apache.syncope.client.console.wizards.WizardMgtPanel;
+import org.apache.syncope.common.lib.to.DynRealmTO;
+import org.apache.syncope.common.lib.types.StandardEntitlement;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
+import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
+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.markup.html.WebMarkupContainer;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.model.StringResourceModel;
+
+public class DynRealmDirectoryPanel extends
+        DirectoryPanel<DynRealmTO, DynRealmWrapper, DynRealmDataProvider, DynRealmRestClient> {
+
+    private static final long serialVersionUID = -5491515010207202168L;
+
+    protected DynRealmDirectoryPanel(final String id, final Builder builder) {
+        super(id, builder);
+        MetaDataRoleAuthorizationStrategy.authorize(addAjaxLink, RENDER, StandardEntitlement.DYNREALM_CREATE);
+        setReadOnly(!SyncopeConsoleSession.get().owns(StandardEntitlement.DYNREALM_UPDATE));
+
+        disableCheckBoxes();
+        setShowResultPage(true);
+
+        modal.size(Modal.Size.Large);
+        modal.addSubmitButton();
+        setFooterVisibility(true);
+        modal.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {
+
+            private static final long serialVersionUID = 8804221891699487139L;
+
+            @Override
+            public void onClose(final AjaxRequestTarget target) {
+                updateResultTable(target);
+                modal.show(false);
+            }
+        });
+
+        AjaxLink<Void> newDynReamlLink = new AjaxLink<Void>("add") {
+
+            private static final long serialVersionUID = -7978723352517770644L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target) {
+                modal.header(new StringResourceModel("any.new"));
+                modal.setContent(new DynRealmModalPanel(new DynRealmWrapper(new DynRealmTO()), true, modal, pageRef));
+                modal.show(true);
+                target.add(modal);
+            }
+        };
+        ((WebMarkupContainer) get("container:content")).addOrReplace(newDynReamlLink);
+        MetaDataRoleAuthorizationStrategy.authorize(newDynReamlLink, RENDER, StandardEntitlement.DYNREALM_CREATE);
+
+        initResultTable();
+    }
+
+    @Override
+    protected DynRealmDataProvider dataProvider() {
+        return new DynRealmDataProvider(rows);
+    }
+
+    @Override
+    protected String paginatorRowsKey() {
+        return Constants.PREF_DYNREALM_PAGINATOR_ROWS;
+    }
+
+    @Override
+    protected List<IColumn<DynRealmTO, String>> getColumns() {
+        final List<IColumn<DynRealmTO, String>> columns = new ArrayList<>();
+
+        columns.add(new PropertyColumn<DynRealmTO, String>(new ResourceModel("key"), "key", "key"));
+
+        return columns;
+    }
+
+    @Override
+    public ActionsPanel<DynRealmTO> getActions(final IModel<DynRealmTO> model) {
+        final ActionsPanel<DynRealmTO> panel = super.getActions(model);
+
+        panel.add(new ActionLink<DynRealmTO>() {
+
+            private static final long serialVersionUID = -7978723352517770644L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final DynRealmTO ignore) {
+                modal.header(new StringResourceModel("any.edit", model));
+                modal.setContent(new DynRealmModalPanel(new DynRealmWrapper(model.getObject()), false, modal, pageRef));
+                modal.show(true);
+                target.add(modal);
+            }
+        }, ActionLink.ActionType.EDIT, StandardEntitlement.DYNREALM_UPDATE);
+
+        return panel;
+    }
+
+    @Override
+    protected Collection<ActionLink.ActionType> getBulkActions() {
+        return Collections.<ActionLink.ActionType>emptyList();
+    }
+
+    public abstract static class Builder
+            extends DirectoryPanel.Builder<DynRealmTO, DynRealmWrapper, DynRealmRestClient> {
+
+        private static final long serialVersionUID = 5530948153889495221L;
+
+        public Builder(final PageReference pageRef) {
+            super(new DynRealmRestClient(), pageRef);
+        }
+
+        @Override
+        protected WizardMgtPanel<DynRealmWrapper> newInstance(final String id, final boolean wizardInModal) {
+            return new DynRealmDirectoryPanel(id, this);
+        }
+    }
+
+    protected class DynRealmDataProvider extends DirectoryDataProvider<DynRealmTO> {
+
+        private static final long serialVersionUID = 3124431855954382273L;
+
+        private final SortableDataProviderComparator<DynRealmTO> comparator;
+
+        private final DynRealmRestClient restClient = new DynRealmRestClient();
+
+        public DynRealmDataProvider(final int paginatorRows) {
+            super(paginatorRows);
+            this.comparator = new SortableDataProviderComparator<>(this);
+        }
+
+        @Override
+        public Iterator<DynRealmTO> iterator(final long first, final long count) {
+            List<DynRealmTO> result = restClient.list();
+            Collections.sort(result, comparator);
+            return result.subList((int) first, (int) first + (int) count).iterator();
+        }
+
+        @Override
+        public long size() {
+            return restClient.list().size();
+        }
+
+        @Override
+        public IModel<DynRealmTO> model(final DynRealmTO object) {
+            return new CompoundPropertyModel<>(object);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmModalPanel.java
new file mode 100644
index 0000000..dd22e23
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmModalPanel.java
@@ -0,0 +1,109 @@
+/*
+ * 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.Collections;
+import java.util.List;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.pages.BasePage;
+import org.apache.syncope.client.console.panels.search.SearchClause;
+import org.apache.syncope.client.console.panels.search.UserSearchPanel;
+import org.apache.syncope.client.console.rest.DynRealmRestClient;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.tabs.Accordion;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
+import org.apache.syncope.client.console.wizards.DynRealmWrapper;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
+import org.apache.wicket.extensions.markup.html.tabs.ITab;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.model.ResourceModel;
+
+public class DynRealmModalPanel extends AbstractModalPanel<DynRealmWrapper> {
+
+    private static final long serialVersionUID = -3773196441177699452L;
+
+    private final DynRealmRestClient restClient = new DynRealmRestClient();
+
+    private final DynRealmWrapper dynRealmWrapper;
+
+    private final boolean create;
+
+    public DynRealmModalPanel(
+            final DynRealmWrapper dynRealmWrapper,
+            final boolean create,
+            final BaseModal<DynRealmWrapper> modal,
+            final PageReference pageRef) {
+
+        super(modal, pageRef);
+        this.dynRealmWrapper = dynRealmWrapper;
+        this.create = create;
+        modal.setFormModel(dynRealmWrapper);
+
+        AjaxTextFieldPanel key = new AjaxTextFieldPanel(
+                "key", "key", new PropertyModel<String>(dynRealmWrapper.getInnerObject(), "key"), false);
+        key.setReadOnly(!create);
+        add(key);
+
+        add(new Accordion("cond", Collections.<ITab>singletonList(
+                new AbstractTab(new ResourceModel("cond", "Dynamic Condition")) {
+
+            private static final long serialVersionUID = 1037272333056449378L;
+
+            @Override
+            public Panel getPanel(final String panelId) {
+                return new UserSearchPanel.Builder(
+                        new PropertyModel<List<SearchClause>>(dynRealmWrapper, "dynClauses")).
+                        required(false).build(panelId);
+            }
+        }), Model.of(StringUtils.isBlank(dynRealmWrapper.getCond()) ? -1 : 0)).setOutputMarkupId(true));
+    }
+
+    @Override
+    public DynRealmWrapper getItem() {
+        return dynRealmWrapper;
+    }
+
+    @Override
+    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
+        try {
+            dynRealmWrapper.fillDynamicConditions();
+            if (create) {
+                restClient.create(dynRealmWrapper.getInnerObject());
+            } else {
+                restClient.update(dynRealmWrapper.getInnerObject());
+            }
+            SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
+            this.modal.close(target);
+        } catch (Exception e) {
+            LOG.error("While creating/updating dynamic realm", e);
+            SyncopeConsoleSession.get().error(
+                    StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
+        }
+        ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
index 1251b6d..f037a33 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
@@ -300,7 +300,7 @@ public class RoleDirectoryPanel extends DirectoryPanel<RoleTO, RoleWrapper, Role
 
         @Override
         public long size() {
-            return restClient.count();
+            return restClient.list().size();
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
index c7748d0..fb14b54 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
@@ -87,8 +87,8 @@ public class SecurityQuestionsPanel extends DirectoryPanel<
             @Override
             public WizardModalPanel<SecurityQuestionTO> build(
                     final String id, final int index, final AjaxWizard.Mode mode) {
-                final SecurityQuestionTO modelObject = newModelObject();
-                return new SecurityQuestionsModalPanel(modal, modelObject, pageRef);
+
+                return new SecurityQuestionsModalPanel(modal, newModelObject(), pageRef);
             }
         }, true);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/rest/DynRealmRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/DynRealmRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/DynRealmRestClient.java
new file mode 100644
index 0000000..5bc61d4
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/DynRealmRestClient.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.rest;
+
+import java.util.List;
+import org.apache.syncope.common.lib.to.DynRealmTO;
+import org.apache.syncope.common.rest.api.service.DynRealmService;
+
+/**
+ * Console client for invoking REST DynRealm's services.
+ */
+public class DynRealmRestClient extends BaseRestClient {
+
+    private static final long serialVersionUID = -8549081557283519638L;
+
+    public List<DynRealmTO> list() {
+        return getService(DynRealmService.class).list();
+    }
+
+    public void create(final DynRealmTO dynRealmTO) {
+        getService(DynRealmService.class).create(dynRealmTO);
+    }
+
+    public void update(final DynRealmTO dynRealmTO) {
+        getService(DynRealmService.class).update(dynRealmTO);
+    }
+
+    public void delete(final String key) {
+        getService(DynRealmService.class).delete(key);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/rest/RoleRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/RoleRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/RoleRestClient.java
index 32404e1..743bfb5 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/RoleRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/RoleRestClient.java
@@ -55,10 +55,6 @@ public class RoleRestClient extends BaseRestClient {
         return getService(RoleService.class).list();
     }
 
-    public int count() {
-        return getService(RoleService.class).list().size();
-    }
-
     public String readConsoleLayoutInfo(final String roleKey) {
         try {
             return IOUtils.toString(InputStream.class.cast(

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java
index 5788759..78c175a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java
@@ -140,16 +140,16 @@ public class ActionLinksTogglePanel<T extends Serializable> extends TogglePanel<
 
     @Override
     public void onEvent(final IEvent<?> event) {
-        if (event.getPayload() instanceof ActionLinkTogleCloseEventPayload) {
-            close(ActionLinkTogleCloseEventPayload.class.cast(event.getPayload()).getTarget());
+        if (event.getPayload() instanceof ActionLinkToggleCloseEventPayload) {
+            close(ActionLinkToggleCloseEventPayload.class.cast(event.getPayload()).getTarget());
         }
     }
 
-    public static class ActionLinkTogleCloseEventPayload {
+    public static class ActionLinkToggleCloseEventPayload {
 
         private final AjaxRequestTarget target;
 
-        public ActionLinkTogleCloseEventPayload(final AjaxRequestTarget target) {
+        public ActionLinkToggleCloseEventPayload(final AjaxRequestTarget target) {
             this.target = target;
         }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java
index 4e39205..6f147c0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java
@@ -185,7 +185,7 @@ public final class ActionPanel<T extends Serializable> extends Panel {
             case CREATE:
             case MEMBERS:
             case CLAIM:
-                send(this, Broadcast.BUBBLE, new ActionLinksTogglePanel.ActionLinkTogleCloseEventPayload(target));
+                send(this, Broadcast.BUBBLE, new ActionLinksTogglePanel.ActionLinkToggleCloseEventPayload(target));
                 break;
             default:
                 break;

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/widgets/CompletenessWidget.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/CompletenessWidget.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/CompletenessWidget.java
index ab74021..fe80ac9 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/widgets/CompletenessWidget.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/CompletenessWidget.java
@@ -25,7 +25,7 @@ import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.BookmarkablePageLinkBuilder;
 import org.apache.syncope.client.console.pages.Notifications;
 import org.apache.syncope.client.console.pages.Policies;
-import org.apache.syncope.client.console.pages.Roles;
+import org.apache.syncope.client.console.pages.Administration;
 import org.apache.syncope.client.console.pages.SecurityQuestions;
 import org.apache.syncope.client.console.pages.Types;
 import org.apache.syncope.client.console.topology.Topology;
@@ -112,7 +112,7 @@ public class CompletenessWidget extends BaseWidget {
         actions.add(securityquestions);
         securityquestions.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.SECURITY_QUESTION));
 
-        roles = BookmarkablePageLinkBuilder.build("roles", Roles.class);
+        roles = BookmarkablePageLinkBuilder.build("roles", Administration.class);
         roles.setOutputMarkupPlaceholderTag(true);
         MetaDataRoleAuthorizationStrategy.authorize(roles, WebPage.ENABLE, StandardEntitlement.ROLE_LIST);
         actions.add(roles);

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/widgets/NumberWidget.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/NumberWidget.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/NumberWidget.java
index fe5ef29..15bf597 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/widgets/NumberWidget.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/NumberWidget.java
@@ -30,7 +30,7 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.syncope.client.console.pages.Realms;
-import org.apache.syncope.client.console.pages.Roles;
+import org.apache.syncope.client.console.pages.Administration;
 import org.apache.syncope.client.console.topology.Topology;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.wicket.request.component.IRequestablePage;
@@ -81,7 +81,7 @@ public class NumberWidget extends BaseWidget {
                     responsePage = Realms.class;
                     isAuthorized = SyncopeConsoleSession.get().owns(label + "_SEARCH");
                 } else {
-                    responsePage = Roles.class;
+                    responsePage = Administration.class;
                     isAuthorized = SyncopeConsoleSession.get().owns(StandardEntitlement.ROLE_LIST);
                 }
                 break;

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/wizards/DynRealmWrapper.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/DynRealmWrapper.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/DynRealmWrapper.java
new file mode 100644
index 0000000..e9f5acc
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/DynRealmWrapper.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.wizards;
+
+import java.io.Serializable;
+import java.util.List;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.syncope.client.console.panels.search.SearchClause;
+import org.apache.syncope.client.console.panels.search.SearchUtils;
+import org.apache.syncope.client.lib.SyncopeClient;
+import org.apache.syncope.common.lib.to.DynRealmTO;
+
+public class DynRealmWrapper implements Serializable {
+
+    private static final long serialVersionUID = 7226128615964284614L;
+
+    private final DynRealmTO dynRealmTO;
+
+    private List<SearchClause> dynClauses;
+
+    public DynRealmWrapper(final DynRealmTO dynRealmTO) {
+        this.dynRealmTO = dynRealmTO;
+        getDynClauses();
+    }
+
+    public final List<SearchClause> getDynClauses() {
+        if (this.dynClauses == null) {
+            this.dynClauses = SearchUtils.getSearchClauses(this.dynRealmTO.getCond());
+        }
+        return this.dynClauses;
+    }
+
+    public void setDynClauses(final List<SearchClause> dynClauses) {
+        this.dynClauses = dynClauses;
+    }
+
+    public String getCond() {
+        if (CollectionUtils.isEmpty(this.dynClauses)) {
+            return null;
+        } else {
+            return SearchUtils.buildFIQL(this.dynClauses, SyncopeClient.getUserSearchConditionBuilder());
+        }
+    }
+
+    public DynRealmTO fillDynamicConditions() {
+        this.dynRealmTO.setCond(this.getCond());
+        return this.dynRealmTO;
+    }
+
+    public DynRealmTO getInnerObject() {
+        return this.dynRealmTO;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
index 3891908..0ade92c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
@@ -124,9 +124,9 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
             @Override
             public void onClick(final AjaxRequestTarget target) {
                 send(WizardMgtPanel.this, Broadcast.BREADTH,
-                        new ActionLinksTogglePanel.ActionLinkTogleCloseEventPayload(target));
+                        new ActionLinksTogglePanel.ActionLinkToggleCloseEventPayload(target));
                 send(WizardMgtPanel.this, Broadcast.EXACT,
-                        new AjaxWizard.NewItemActionEvent<T>(null, target));
+                        new AjaxWizard.NewItemActionEvent<>(null, target));
             }
         };
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
index 1253f20..9f1d3d2 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
@@ -103,11 +103,7 @@ public abstract class AnyWizardBuilder<A extends AnyTO> extends AjaxWizardBuilde
             wizardModel.add(new AuxClasses(modelObject.getInnerObject(), anyTypeClasses));
         }
 
-        if (formLayoutInfo instanceof UserFormLayoutInfo
-                && UserFormLayoutInfo.class.cast(formLayoutInfo).isGroups()
-                || formLayoutInfo instanceof AnyObjectFormLayoutInfo
-                && AnyObjectFormLayoutInfo.class.cast(formLayoutInfo).isGroups()) {
-
+        if (formLayoutInfo.isGroups()) {
             wizardModel.add(new Groups(modelObject.getInnerObject(), mode == AjaxWizard.Mode.TEMPLATE));
         }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java
index 6c1e166..e5cb435 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java
@@ -47,7 +47,7 @@ public class GroupWizardBuilder extends AnyWizardBuilder<GroupTO> implements Gro
     }
 
     /**
-     * This method has been overridden to manage asynchronous translation of FIQL string to search clases list and
+     * This method has been overridden to manage asynchronous translation of FIQL string to search classes list and
      * viceversa.
      *
      * @param item wizard backend item.

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
index 184f657..6525be5 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
@@ -27,170 +27,202 @@ import org.apache.commons.collections4.Transformer;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.cxf.jaxrs.ext.search.client.CompleteCondition;
 import org.apache.syncope.client.console.SyncopeConsoleApplication;
+import org.apache.syncope.client.console.rest.DynRealmRestClient;
 import org.apache.syncope.client.console.rest.GroupRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel;
 import org.apache.syncope.client.lib.SyncopeClient;
+import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.search.GroupFiqlSearchConditionBuilder;
-import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.to.AnyTO;
+import org.apache.syncope.common.lib.to.DynRealmTO;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.MembershipTO;
-import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
 import org.apache.wicket.extensions.wizard.WizardStep;
 import org.apache.wicket.markup.html.form.IChoiceRenderer;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.util.ListModel;
-import org.apache.wicket.util.lang.Args;
 import org.apache.syncope.common.lib.to.GroupableRelatableTO;
 import org.apache.wicket.authroles.authorization.strategies.role.metadata.ActionPermissions;
 import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
 import org.apache.wicket.extensions.wizard.WizardModel.ICondition;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.model.PropertyModel;
 
 public class Groups extends WizardStep implements ICondition {
 
     private static final long serialVersionUID = 552437609667518888L;
 
+    private static final int MAX_GROUP_LIST_CARDINALITY = 30;
+
     private final GroupRestClient groupRestClient = new GroupRestClient();
 
-    private final List<GroupTO> allGroups;
+    private final List<DynRealmTO> allDynRealms = new DynRealmRestClient().list();
 
-    private static final int MAX_GROUP_LIST_CARDINALITY = 30;
+    private List<GroupTO> allGroups;
+
+    private final AnyTO anyTO;
 
     public <T extends AnyTO> Groups(final T anyTO, final boolean templateMode) {
         super();
+        this.anyTO = anyTO;
 
         final String realm = templateMode ? "/" : anyTO.getRealm();
 
         // -----------------------------------------------------------------
         // Pre-Authorizations
         // -----------------------------------------------------------------
-        final ActionPermissions permissions = new ActionPermissions();
+        ActionPermissions permissions = new ActionPermissions();
         setMetaData(MetaDataRoleAuthorizationStrategy.ACTION_PERMISSIONS, permissions);
         permissions.authorizeAll(RENDER);
         // -----------------------------------------------------------------
 
         setOutputMarkupId(true);
 
-        Args.isTrue((anyTO instanceof UserTO) || (anyTO instanceof AnyObjectTO), "Expected user or anyObject");
-
-        AjaxPalettePanel.Builder<MembershipTO> builder = new AjaxPalettePanel.Builder<MembershipTO>().
-                setRenderer(new IChoiceRenderer<MembershipTO>() {
-
-                    private static final long serialVersionUID = -3086661086073628855L;
-
-                    @Override
-                    public Object getDisplayValue(final MembershipTO object) {
-                        return object.getGroupName();
-                    }
-
-                    @Override
-                    public String getIdValue(final MembershipTO object, final int index) {
-                        return object.getGroupName();
-                    }
-
-                    @Override
-                    public MembershipTO getObject(
-                            final String id, final IModel<? extends List<? extends MembershipTO>> choices) {
-
-                        return IterableUtils.find(choices.getObject(), new Predicate<MembershipTO>() {
-
-                            @Override
-                            public boolean evaluate(final MembershipTO object) {
-                                return id.equalsIgnoreCase(object.getGroupName());
-                            }
-                        });
-                    }
-                });
-
-        allGroups = groupRestClient.search(
-                realm,
-                SyncopeClient.getGroupSearchConditionBuilder().isAssignable().query(),
-                1,
-                MAX_GROUP_LIST_CARDINALITY,
-                new SortParam<>("name", true),
-                null);
-
-        // ---------------------------------
-        // Retrieve group memberships
-        // ---------------------------------
-        add(builder.setAllowOrder(true).withFilter().build("groups",
-                new ListModel<>(GroupableRelatableTO.class.cast(anyTO).getMemberships()),
-                new AjaxPalettePanel.Builder.Query<MembershipTO>() {
-
-            private static final long serialVersionUID = -7223078772249308813L;
-
-            @Override
-            public List<MembershipTO> execute(final String filter) {
-                return CollectionUtils.collect(
-                        StringUtils.isEmpty(filter) || "*".equals(filter)
-                        ? allGroups
-                        : groupRestClient.search(
-                                realm,
-                                SyncopeClient.getGroupSearchConditionBuilder().
-                                isAssignable().and().is("name").equalTo(filter).query(),
-                                1, MAX_GROUP_LIST_CARDINALITY,
-                                new SortParam<>("name", true),
-                                null),
-                        new Transformer<GroupTO, MembershipTO>() {
-
-                    @Override
-                    public MembershipTO transform(final GroupTO input) {
-                        return new MembershipTO.Builder().
-                                group(input.getKey(), input.getName()).
-                                build();
-                    }
-                }, new ArrayList<MembershipTO>());
+        WebMarkupContainer groupsContainer = new WebMarkupContainer("groupsContainer");
+        groupsContainer.setOutputMarkupId(true);
+        groupsContainer.setOutputMarkupPlaceholderTag(true);
+        add(groupsContainer);
+
+        WebMarkupContainer dyngroupsContainer = new WebMarkupContainer("dyngroupsContainer");
+        dyngroupsContainer.setOutputMarkupId(true);
+        dyngroupsContainer.setOutputMarkupPlaceholderTag(true);
+        add(dyngroupsContainer);
+
+        if (anyTO instanceof GroupTO) {
+            groupsContainer.add(new Label("groups").setVisible(false));
+            groupsContainer.setVisible(false);
+            dyngroupsContainer.add(new Label("dyngroups").setVisible(false));
+            dyngroupsContainer.setVisible(false);
+        } else {
+            AjaxPalettePanel.Builder<MembershipTO> builder = new AjaxPalettePanel.Builder<MembershipTO>().
+                    setRenderer(new IChoiceRenderer<MembershipTO>() {
+
+                        private static final long serialVersionUID = -3086661086073628855L;
+
+                        @Override
+                        public Object getDisplayValue(final MembershipTO object) {
+                            return object.getGroupName();
+                        }
+
+                        @Override
+                        public String getIdValue(final MembershipTO object, final int index) {
+                            return object.getGroupName();
+                        }
+
+                        @Override
+                        public MembershipTO getObject(
+                                final String id, final IModel<? extends List<? extends MembershipTO>> choices) {
+
+                            return IterableUtils.find(choices.getObject(), new Predicate<MembershipTO>() {
+
+                                @Override
+                                public boolean evaluate(final MembershipTO object) {
+                                    return id.equalsIgnoreCase(object.getGroupName());
+                                }
+                            });
+                        }
+                    });
+
+            allGroups = groupRestClient.search(
+                    realm,
+                    SyncopeClient.getGroupSearchConditionBuilder().isAssignable().query(),
+                    1,
+                    MAX_GROUP_LIST_CARDINALITY,
+                    new SortParam<>("name", true),
+                    null);
+
+            // ---------------------------------
+            // Retrieve group memberships
+            // ---------------------------------
+            groupsContainer.add(builder.setAllowOrder(true).withFilter().build("groups",
+                    new ListModel<>(GroupableRelatableTO.class.cast(anyTO).getMemberships()),
+                    new AjaxPalettePanel.Builder.Query<MembershipTO>() {
+
+                private static final long serialVersionUID = -7223078772249308813L;
+
+                @Override
+                public List<MembershipTO> execute(final String filter) {
+                    return CollectionUtils.collect(
+                            StringUtils.isEmpty(filter) || "*".equals(filter)
+                            ? allGroups
+                            : groupRestClient.search(
+                                    realm,
+                                    SyncopeClient.getGroupSearchConditionBuilder().
+                                            isAssignable().and().is("name").equalTo(filter).query(),
+                                    1, MAX_GROUP_LIST_CARDINALITY,
+                                    new SortParam<>("name", true),
+                                    null),
+                            new Transformer<GroupTO, MembershipTO>() {
+
+                        @Override
+                        public MembershipTO transform(final GroupTO input) {
+                            return new MembershipTO.Builder().
+                                    group(input.getKey(), input.getName()).
+                                    build();
+                        }
+                    }, new ArrayList<MembershipTO>());
+                }
+            }).hideLabel().setOutputMarkupId(true));
+            // ---------------------------------
+
+            // ---------------------------------
+            // Retrieve dyn group memberships
+            // ---------------------------------
+            GroupFiqlSearchConditionBuilder searchConditionBuilder = SyncopeClient.getGroupSearchConditionBuilder();
+
+            List<CompleteCondition> conditions = new ArrayList<>();
+            for (String groupKey : GroupableRelatableTO.class.cast(anyTO).getDynGroups()) {
+                conditions.add(searchConditionBuilder.is("key").equalTo(groupKey).wrap());
             }
-        }).hideLabel().setOutputMarkupId(true));
-        // ---------------------------------
 
-        // ---------------------------------
-        // Retrieve dyn group memberships
-        // ---------------------------------
-        final GroupFiqlSearchConditionBuilder searchConditionBuilder = SyncopeClient.getGroupSearchConditionBuilder();
+            List<GroupTO> dynGroups = new ArrayList<>();
+            if (!conditions.isEmpty()) {
+                dynGroups.addAll(groupRestClient.search(
+                        "/",
+                        searchConditionBuilder.or(conditions).query(),
+                        -1,
+                        -1,
+                        new SortParam<>("name", true),
+                        null));
+            }
 
-        List<CompleteCondition> conditions = new ArrayList<>();
-        for (String groupKey : GroupableRelatableTO.class.cast(anyTO).getDynGroups()) {
-            conditions.add(searchConditionBuilder.is("key").equalTo(groupKey).wrap());
-        }
+            dyngroupsContainer.add(new AjaxPalettePanel.Builder<String>().setAllowOrder(true).build("dyngroups",
+                    new ListModel<>(CollectionUtils.collect(dynGroups, new Transformer<GroupTO, String>() {
 
-        final List<GroupTO> dynGroups = new ArrayList<>();
-        if (!conditions.isEmpty()) {
-            dynGroups.addAll(groupRestClient.search(
-                    "/",
-                    searchConditionBuilder.or(conditions).query(),
-                    -1,
-                    -1,
-                    new SortParam<>("name", true),
-                    null));
+                        @Override
+                        public String transform(final GroupTO input) {
+                            return input.getName();
+                        }
+                    }, new ArrayList<String>())),
+                    new ListModel<>(CollectionUtils.collect(allGroups, new Transformer<GroupTO, String>() {
+
+                        @Override
+                        public String transform(final GroupTO input) {
+                            return input.getName();
+                        }
+                    }, new ArrayList<String>()))).
+                    hideLabel().setEnabled(false).setOutputMarkupId(true));
+
+            // ---------------------------------
         }
 
-        add(new AjaxPalettePanel.Builder<String>().setAllowOrder(true).build("dyngroups",
-                new ListModel<>(CollectionUtils.collect(dynGroups,
-                        new Transformer<GroupTO, String>() {
-
-                    @Override
-                    public String transform(final GroupTO input) {
-                        return input.getName();
-                    }
-                }, new ArrayList<String>())),
-                new ListModel<>(CollectionUtils.collect(allGroups, new Transformer<GroupTO, String>() {
-
-                    @Override
-                    public String transform(final GroupTO input) {
-                        return input.getName();
-                    }
-                }, new ArrayList<String>()))).
+        add(new AjaxPalettePanel.Builder<String>().build("dynrealms",
+                new PropertyModel<List<String>>(anyTO, "dynRealms"),
+                new ListModel<>(
+                        CollectionUtils.collect(allDynRealms,
+                                EntityTOUtils.keyTransformer(),
+                                new ArrayList<String>()))).
                 hideLabel().setEnabled(false).setOutputMarkupId(true));
-
-        // ---------------------------------
     }
 
     @Override
     public boolean evaluate() {
-        return CollectionUtils.isNotEmpty(allGroups)
+        return ((anyTO instanceof GroupTO)
+                ? CollectionUtils.isNotEmpty(allDynRealms)
+                : CollectionUtils.isNotEmpty(allDynRealms) || CollectionUtils.isNotEmpty(allGroups))
                 && SyncopeConsoleApplication.get().getSecuritySettings().getAuthorizationStrategy().
-                isActionAuthorized(this, RENDER);
+                        isActionAuthorized(this, RENDER);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java
index 7841c8e..49f377b 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java
@@ -27,12 +27,14 @@ import org.apache.commons.collections4.Transformer;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.panels.search.SearchClause;
 import org.apache.syncope.client.console.panels.search.UserSearchPanel;
+import org.apache.syncope.client.console.rest.DynRealmRestClient;
 import org.apache.syncope.client.console.rest.RealmRestClient;
 import org.apache.syncope.client.console.rest.RoleRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.tabs.Accordion;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.client.console.wizards.AjaxWizardBuilder;
+import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.to.RealmTO;
 import org.apache.syncope.common.lib.to.RoleTO;
 import org.apache.wicket.PageReference;
@@ -63,7 +65,7 @@ public class RoleWizardBuilder extends AjaxWizardBuilder<RoleWrapper> {
     }
 
     /**
-     * This method has been overridden to manage asynchronous translation of FIQL string to search clases list and
+     * This method has been overridden to manage asynchronous translation of FIQL string to search classes list and
      * viceversa.
      *
      * @param item wizard backend item.
@@ -93,6 +95,7 @@ public class RoleWizardBuilder extends AjaxWizardBuilder<RoleWrapper> {
         wizardModel.add(new Details(modelObject));
         wizardModel.add(new Entitlements(modelObject.getInnerObject()));
         wizardModel.add(new Realms(modelObject.getInnerObject()));
+        wizardModel.add(new DynRealms(modelObject.getInnerObject()));
         return wizardModel;
     }
 
@@ -169,4 +172,19 @@ public class RoleWizardBuilder extends AjaxWizardBuilder<RoleWrapper> {
         }
     }
 
+    public static class DynRealms extends WizardStep {
+
+        private static final long serialVersionUID = 6846234574424462255L;
+
+        public DynRealms(final RoleTO modelObject) {
+            setTitleModel(new ResourceModel("dynRealms"));
+            add(new AjaxPalettePanel.Builder<String>().build("dynRealms",
+                    new PropertyModel<List<String>>(modelObject, "dynRealms"),
+                    new ListModel<>(
+                            CollectionUtils.collect(new DynRealmRestClient().list(),
+                                    EntityTOUtils.keyTransformer(),
+                                    new ArrayList<String>()))).hideLabel().setOutputMarkupId(true));
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/console.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/console.properties b/client/console/src/main/resources/console.properties
index a3c44f8..c9c0cdd 100644
--- a/client/console/src/main/resources/console.properties
+++ b/client/console/src/main/resources/console.properties
@@ -34,6 +34,7 @@ activitiModelerDirectory=${activiti-modeler.directory}
 
 reconciliationReportKey=c3520ad9-179f-49e7-b315-d684d216dd97
 
+page.administration=org.apache.syncope.client.console.pages.Administration
 page.dashboard=org.apache.syncope.client.console.pages.Dashboard
 page.realms=org.apache.syncope.client.console.pages.Realms
 page.topology=org.apache.syncope.client.console.topology.Topology
@@ -43,7 +44,6 @@ page.audit=org.apache.syncope.client.console.pages.Audit
 page.logs=org.apache.syncope.client.console.pages.Logs
 page.securityquestions=org.apache.syncope.client.console.pages.SecurityQuestions
 page.types=org.apache.syncope.client.console.pages.Types
-page.roles=org.apache.syncope.client.console.pages.Roles
 page.policies=org.apache.syncope.client.console.pages.Policies
 page.notifications=org.apache.syncope.client.console.pages.Notifications
 page.parameters=org.apache.syncope.client.console.pages.Parameters

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication.properties b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication.properties
index 77841d6..56df013 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication.properties
@@ -69,3 +69,4 @@ audit=Audit
 connectors.confirm.reload=This request is potentially dangerous for running operations, continue?
 intAttrNameInfo.help=Besides auto-completed attributes, you can also refer to groups, any objects or memberships  (if applicable); for example:
 confirmGlobalLogout=Do you really want to perform global logout?
+administration=Administration

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_it.properties
index 8c2df2f..f039403 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_it.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_it.properties
@@ -69,3 +69,4 @@ audit=Audit
 connectors.confirm.reload=Questa richiesta \u00e8 potenzialmente dannosa per le operazioni in corso, proseguire?
 intAttrNameInfo.help=Oltre agli attributi auto-completati, \u00e8 possibile fare riferimento anche a gruppi, any object e membership (se applicabile); ad esempio:
 confirmGlobalLogout=Vuoi davvero procedere al logout globale?
+administration=Amministrazione

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_pt_BR.properties
index 043df29..c746a66 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_pt_BR.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_pt_BR.properties
@@ -69,3 +69,4 @@ audit=Audit
 connectors.confirm.reload=Esta requis\u00e7\u00e3o \u00e9 potencialmente perigosa para opera\u00e7\u00f5es em execu\u00e7\u00e3o, prosseguir?
 intAttrNameInfo.help=Besides auto-completed attributes, you can also refer to groups, any objects or memberships  (if applicable); for example:
 confirmGlobalLogout=Do you really want to perform global logout?
+administration=Administra\u00e7\u00e3o

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_ru.properties
index c661008..ef6ea6e 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_ru.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_ru.properties
@@ -68,3 +68,4 @@ audit=\u0410\u0443\u0434\u0438\u0442
 connectors.confirm.reload=\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0430\u0441\u043d\u043e \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c?
 intAttrNameInfo.help=\u041f\u043e\u043c\u0438\u043c\u043e \u0430\u0432\u0442\u043e\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432, \u0432\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u044b, \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u0447\u043b\u0435\u043d\u0441\u0442\u0432\u043e (\u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438), \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:
 confirmGlobalLogout=Do you really want to perform global logout?
+administration=Administration

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/notifications/TemplateModal.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/notifications/TemplateModal.html b/client/console/src/main/resources/org/apache/syncope/client/console/notifications/TemplateModal.html
index 3a0676c..ab3df26 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/notifications/TemplateModal.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/notifications/TemplateModal.html
@@ -17,12 +17,9 @@ 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="form-group">
-        <span wicket:id="key"/>
-      </div>
-    </wicket:panel>
-  </body>
+  <wicket:panel>
+    <div class="form-group">
+      <span wicket:id="key"/>
+    </div>
+  </wicket:panel>
 </html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.html
new file mode 100644
index 0000000..0c79945
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.html
@@ -0,0 +1,36 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
+  <wicket:extend>
+    <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="configuration"/></li>
+        <li class="active"><wicket:message key="administration"/></li>
+      </ol>
+    </section>
+
+    <section class="content" wicket:id="content">
+      <div class="box">
+        <div class="box-body" wicket:id="tabbedPanel"/>
+      </div>
+    </section>
+  </wicket:extend>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.properties
new file mode 100644
index 0000000..8788d48
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.properties
@@ -0,0 +1,18 @@
+# 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.
+add=Create new Role
+dynRealms=Dynamic Realms

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_it.properties
new file mode 100644
index 0000000..becfb71
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_it.properties
@@ -0,0 +1,18 @@
+# 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.
+add=Crea un nuovo Ruolo
+dynRealms=Realm dinamici

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_pt_BR.properties
new file mode 100644
index 0000000..e6d08f9
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_pt_BR.properties
@@ -0,0 +1,18 @@
+# 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.
+add=Cria um novo fun\u00e7\u00e3o
+dynRealms=Realm din\u00e2micos

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_ru.properties
new file mode 100644
index 0000000..e933b31
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_ru.properties
@@ -0,0 +1,20 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# add=\u00d0\u00a1\u00d0\u00be\u00d0\u00b7\u00d0\u00b4\u00d0\u00b0\u00d1\u0082\u00d1\u008c \u00d1\u0080\u00d0\u00be\u00d0\u00bb\u00d1\u008c
+add=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0440\u043e\u043b\u044c
+dynRealms=Dynamic Realms

http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
index 7b2ccc6..ed0444a 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
@@ -108,12 +108,12 @@ under the License.
             <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="administrationLI"><a href="#" wicket:id="administration"><i class="fa fa-lock"></i><wicket:message key="administration"/></a></li>
                 <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="logsLI"><a href="#" wicket:id="logs"><i class="fa fa-file-text-o"></i><wicket:message key="logs"/></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="rolesLI"><a href="#" wicket:id="roles"><i class="fa fa-users"></i><wicket:message key="roles"/></a></li>
                 <li wicket:id="securityquestionsLI"><a href="#" wicket:id="securityquestions"><i class="fa fa-question"></i><wicket:message key="securityQuestions"/></a></li>
                 <li wicket:id="typesLI"><a href="#" wicket:id="types"><i class="fa fa-wrench"></i><wicket:message key="types"/></a></li>
                 <li wicket:id="workflowLI"><a href="#" wicket:id="workflow"><i class="fa fa-share-alt"></i><wicket:message key="workflow"/></a></li>


Mime
View raw message