You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by fm...@apache.org on 2015/12/31 09:20:11 UTC

[1/4] syncope git commit: [SYNCOPE-156] providing material style for buttons

Repository: syncope
Updated Branches:
  refs/heads/master 24cb528e6 -> 6a93860d8


[SYNCOPE-156] providing material style for buttons


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

Branch: refs/heads/master
Commit: e5990330f193fd7e0777b37ea5128b939e9000a8
Parents: 24cb528
Author: fmartelli <fa...@gmail.com>
Authored: Tue Dec 29 11:26:46 2015 +0100
Committer: fmartelli <fa...@gmail.com>
Committed: Thu Dec 31 08:55:33 2015 +0100

----------------------------------------------------------------------
 .../syncope/client/console/pages/Realms.java    | 97 ++++++--------------
 .../syncope/client/console/pages/Types.java     |  1 -
 .../syncope/client/console/panels/Realm.java    | 46 +++++++++-
 .../client/console/panels/RealmDetails.java     | 24 ++++-
 .../resources/META-INF/resources/css/bulk.css   |  2 +
 .../META-INF/resources/css/syncopeConsole.css   | 71 +++++++++++---
 .../syncope/client/console/pages/Realms.html    | 18 +---
 .../client/console/pages/SecurityQuestions.html | 14 +--
 .../panels/AbstractSearchResultPanel.html       | 14 +--
 .../console/panels/AbstractTypesPanel.html      | 12 +--
 .../client/console/panels/RealmDetails.html     | 11 ++-
 .../markup/html/form/ActionLinksPanel.html      | 64 ++++++-------
 .../client/console/wizards/WizardMgtPanel.html  |  4 +-
 13 files changed, 217 insertions(+), 161 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/e5990330/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
index 53cd426..19c3e0a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
@@ -24,15 +24,11 @@ import org.apache.syncope.client.console.panels.RealmModalPanel;
 import org.apache.syncope.client.console.panels.RealmSidebarPanel;
 import org.apache.syncope.client.console.panels.RealmSidebarPanel.ControlSidebarClick;
 import org.apache.syncope.client.console.rest.RealmRestClient;
-import org.apache.syncope.client.console.wicket.markup.html.bootstrap.confirmation.ConfirmationModalBehavior;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.common.lib.to.RealmTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 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.event.IEvent;
-import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink;
 import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow.WindowClosedCallback;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
@@ -82,10 +78,6 @@ public class Realms extends BasePage {
             }
         });
 
-        setupDeleteLink();
-        setupCreateLink();
-        setupEditLink();
-
         updateRealmContent(realmSidebarPanel.getCurrentRealm());
     }
 
@@ -103,63 +95,22 @@ public class Realms extends BasePage {
 
     private WebMarkupContainer updateRealmContent(final RealmTO realmTO) {
         content.addOrReplace(new Label("header", realmTO.getName()));
-        content.addOrReplace(new Realm("body", realmTO, getPageReference()));
-        return content;
-    }
-
-    private void setupDeleteLink() {
+        content.addOrReplace(new Realm("body", realmTO, getPageReference()) {
 
-        @SuppressWarnings("unchecked")
-        final AjaxLink<Void> deleteLink = new AjaxLink("deleteLink", Model.of("deleteLink")) {
-
-            private static final long serialVersionUID = 3776750333491622263L;
+            private static final long serialVersionUID = 8221398624379357183L;
 
             @Override
-            public void onClick(final AjaxRequestTarget target) {
-                try {
-                    final RealmTO toBeDeleted = realmSidebarPanel.getCurrentRealm();
-
-                    if (toBeDeleted.getKey() == 0) {
-                        throw new Exception("Root realm cannot be deleted");
-                    }
-
-                    realmRestClient.delete(toBeDeleted.getFullPath());
-
-                    target.add(realmSidebarPanel.reloadRealmTree());
-                    target.add(updateRealmContent(realmSidebarPanel.getCurrentRealm()));
-
-                    info(getString(Constants.OPERATION_SUCCEEDED));
-                } catch (Exception e) {
-                    LOG.error("While deleting realm", e);
-                    error(getString(Constants.ERROR) + ": " + e.getMessage());
-                }
-                notificationPanel.refresh(target);
-            }
-        };
-
-        deleteLink.add(new ConfirmationModalBehavior());
-        MetaDataRoleAuthorizationStrategy.authorize(deleteLink, ENABLE, StandardEntitlement.REALM_DELETE);
-
-        content.addOrReplace(deleteLink);
-    }
-
-    private void setupCreateLink() {
-
-        final AjaxLink<Void> createLink = new IndicatingAjaxLink<Void>("createLink") {
-
-            private static final long serialVersionUID = -7978723352517770644L;
-
-            @Override
-            public void onClick(final AjaxRequestTarget target) {
+            protected void onClickCreate(final AjaxRequestTarget target) {
                 modal.header(new ResourceModel("createRealm"));
 
-                final RealmTO realmTO = new RealmTO();
-                modal.setFormModel(realmTO);
+                final RealmTO newRealmTO = new RealmTO();
+
+                modal.setFormModel(newRealmTO);
 
                 final RealmModalPanel panel = new RealmModalPanel(
                         modal,
                         Realms.this.getPageReference(),
-                        realmTO,
+                        newRealmTO,
                         realmSidebarPanel.getCurrentRealm().getFullPath(),
                         StandardEntitlement.REALM_CREATE,
                         true);
@@ -168,22 +119,11 @@ public class Realms extends BasePage {
                 modal.addSumbitButton();
                 modal.show(true);
             }
-        };
-
-        MetaDataRoleAuthorizationStrategy.authorize(createLink, ENABLE, StandardEntitlement.REALM_CREATE);
-        content.addOrReplace(createLink);
-    }
-
-    private void setupEditLink() {
-        final AjaxLink<Void> editLink = new IndicatingAjaxLink<Void>("editLink") {
-
-            private static final long serialVersionUID = -6957616042924610290L;
 
             @Override
-            public void onClick(final AjaxRequestTarget target) {
+            protected void onClickEdit(final AjaxRequestTarget target, final RealmTO realmTO) {
                 modal.header(Model.of(realmSidebarPanel.getCurrentRealm().getName()));
 
-                final RealmTO realmTO = realmSidebarPanel.getCurrentRealm();
                 modal.setFormModel(realmTO);
 
                 final RealmModalPanel panel = new RealmModalPanel(
@@ -198,9 +138,24 @@ public class Realms extends BasePage {
                 modal.addSumbitButton();
                 modal.show(true);
             }
-        };
 
-        MetaDataRoleAuthorizationStrategy.authorize(editLink, ENABLE, StandardEntitlement.REALM_UPDATE);
-        content.addOrReplace(editLink);
+            @Override
+            protected void onClickDelete(final AjaxRequestTarget target, final RealmTO realmTO) {
+                try {
+                    if (realmTO.getKey() == 0) {
+                        throw new Exception("Root realm cannot be deleted");
+                    }
+                    realmRestClient.delete(realmTO.getFullPath());
+                    target.add(realmSidebarPanel.reloadRealmTree());
+                    target.add(updateRealmContent(realmSidebarPanel.getCurrentRealm()));
+                    info(getString(Constants.OPERATION_SUCCEEDED));
+                } catch (Exception e) {
+                    LOG.error("While deleting realm", e);
+                    error(getString(Constants.ERROR) + ": " + e.getMessage());
+                }
+                BasePage.class.cast(getPage()).getNotificationPanel().refresh(target);
+            }
+        });
+        return content;
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5990330/client/console/src/main/java/org/apache/syncope/client/console/pages/Types.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Types.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Types.java
index 0cad78a..f1d2bbb 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/Types.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Types.java
@@ -72,7 +72,6 @@ public class Types extends BasePage {
         ANYTYPECLASS,
         ANYTYPE,
         RELATIONSHIPTYPE;
-
     }
 
     public Types(final PageParameters parameters) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5990330/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
index ae59885..48bd345 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
@@ -27,6 +27,8 @@ import org.apache.syncope.client.console.rest.AnyTypeRestClient;
 import org.apache.syncope.client.console.rest.GroupRestClient;
 import org.apache.syncope.client.console.rest.UserRestClient;
 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.ActionLinksPanel;
 import org.apache.syncope.client.console.wizards.any.AnyWizardBuilder;
 import org.apache.syncope.client.console.wizards.any.GroupWizardBuilder;
 import org.apache.syncope.client.console.wizards.any.UserWizardBuilder;
@@ -38,6 +40,7 @@ import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.types.AnyEntitlement;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 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.tabs.AbstractTab;
 import org.apache.wicket.extensions.markup.html.tabs.ITab;
@@ -47,7 +50,7 @@ import org.apache.wicket.model.Model;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class Realm extends Panel {
+public abstract class Realm extends Panel {
 
     private static final long serialVersionUID = -1100228004207271270L;
 
@@ -91,8 +94,39 @@ public class Realm extends Panel {
 
             @Override
             public Panel getPanel(final String panelId) {
-                final RealmDetails panel = new RealmDetails(panelId, realmTO, false);
-                panel.setEnabled(false);
+                final ActionLinksPanel<RealmTO> actionLinksPanel = ActionLinksPanel.<RealmTO>builder(pageRef).
+                        add(new ActionLink<RealmTO>(realmTO) {
+
+                            private static final long serialVersionUID = 2802988981431379827L;
+
+                            @Override
+                            public void onClick(final AjaxRequestTarget target, final RealmTO modelObject) {
+                                onClickCreate(target);
+                            }
+                        }, ActionLink.ActionType.CREATE, StandardEntitlement.REALM_CREATE).
+                        add(new ActionLink<RealmTO>(realmTO) {
+
+                            private static final long serialVersionUID = 2802988981431379828L;
+
+                            @Override
+                            public void onClick(final AjaxRequestTarget target, final RealmTO modelObject) {
+                                onClickEdit(target, realmTO);
+                            }
+                        }, ActionLink.ActionType.EDIT, StandardEntitlement.REALM_UPDATE).
+                        add(new ActionLink<RealmTO>(realmTO) {
+
+                            private static final long serialVersionUID = 2802988981431379829L;
+
+                            @Override
+                            public void onClick(final AjaxRequestTarget target, final RealmTO modelObject) {
+                                onClickDelete(target, realmTO);
+                            }
+                        }, ActionLink.ActionType.DELETE, StandardEntitlement.REALM_DELETE).
+                        build("actions");
+
+                final RealmDetails panel = new RealmDetails(panelId, realmTO, actionLinksPanel, false);
+                panel.setContentEnabled(false);
+                actionLinksPanel.setEnabled(true);
                 return panel;
             }
         });
@@ -165,4 +199,10 @@ public class Realm extends Panel {
         }
         return panel;
     }
+
+    protected abstract void onClickCreate(final AjaxRequestTarget target);
+
+    protected abstract void onClickEdit(final AjaxRequestTarget target, final RealmTO realmTO);
+
+    protected abstract void onClickDelete(final AjaxRequestTarget target, final RealmTO realmTO);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5990330/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java
index 2bc232b..c27b6cb 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java
@@ -18,10 +18,12 @@
  */
 package org.apache.syncope.client.console.panels;
 
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.FieldPanel;
 import org.apache.syncope.common.lib.to.RealmTO;
 import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.panel.Fragment;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.PropertyModel;
 import org.slf4j.Logger;
@@ -33,14 +35,17 @@ public class RealmDetails extends Panel {
 
     protected static final Logger LOG = LoggerFactory.getLogger(RealmDetails.class);
 
+    private final WebMarkupContainer container;
+
     public RealmDetails(final String id, final RealmTO realmTO) {
-        this(id, realmTO, true);
+        this(id, realmTO, null, true);
     }
 
-    public RealmDetails(final String id, final RealmTO realmTO, final boolean unwraped) {
+    public RealmDetails(
+            final String id, final RealmTO realmTO, final ActionLinksPanel<?> actions, final boolean unwraped) {
         super(id);
 
-        final WebMarkupContainer container = new WebMarkupContainer("container");
+        container = new WebMarkupContainer("container");
         container.setOutputMarkupId(true);
         container.setRenderBodyOnly(unwraped);
         add(container);
@@ -62,5 +67,18 @@ public class RealmDetails extends Panel {
         final FieldPanel<String> passwordPolicy = new AjaxTextFieldPanel(
                 "passwordPolicy", "passwordPolicy", new PropertyModel<String>(realmTO, "passwordPolicy"), false);
         container.add(passwordPolicy);
+
+        if (actions == null) {
+            add(new Fragment("actions", "emptyFragment", this).setRenderBodyOnly(true));
+        } else {
+            Fragment fragment = new Fragment("actions", "actionsFragment", this);
+            fragment.add(actions);
+            add(fragment.setRenderBodyOnly(true));
+        }
+    }
+
+    public RealmDetails setContentEnabled(final boolean enable) {
+        container.setEnabled(enable);
+        return this;
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5990330/client/console/src/main/resources/META-INF/resources/css/bulk.css
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/META-INF/resources/css/bulk.css b/client/console/src/main/resources/META-INF/resources/css/bulk.css
index 1f0e621..db44653 100644
--- a/client/console/src/main/resources/META-INF/resources/css/bulk.css
+++ b/client/console/src/main/resources/META-INF/resources/css/bulk.css
@@ -18,6 +18,8 @@
  */
 th.checkGroupColumn{
   width: 20px;
+  text-align: center;
+  padding-right: 8px !important;
 }
 
 td.checkGroupColumn{

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5990330/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css b/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
index a0391f0..20f0946 100644
--- a/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
+++ b/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
@@ -74,16 +74,6 @@ pre {
   min-height: 554px
 }
 
-.actions > li > a {
-  padding-top: 5px !important;
-  padding-bottom: 5px !important;
-}
-
-div.listview-actions a{
-  float:left; 
-  padding-right:8px
-}
-
 .block-header {
   position: fixed !important;
   width: 100% !important;
@@ -352,7 +342,6 @@ div.searchResult{
   box-sizing: border-box;
 }
 
-
 .wicket-aa-container {
   border-color: #eee;
   box-shadow: none;
@@ -369,6 +358,9 @@ div.searchResult{
   max-height: 250px;
 }
 
+/**
+START - Notifications
+*/
 .k-notification-error.k-group {
   background: rgba(100% , 0% , 0% , .7);
   color: red;
@@ -419,3 +411,60 @@ div.searchResult{
   width:85%
 }
 
+/**
+END - Notifications
+*/
+
+/**
+START - Actions
+*/
+.actions > li > a {
+  padding: 5px 0px 5px 0px !important;
+}
+
+div.listview-actions a {
+  float:left;
+  padding: 5px 0px 5px 0px !important;
+}
+
+.action a.btn {
+  padding: 0px;
+}
+
+.btn-circle, .circular-actions a {
+  border-radius: 15px;
+  font-size: 12px;
+  height: 30px;
+  line-height: 1.42857;
+  padding: 6px 0;
+  text-align: center;
+  width: 30px;
+}
+
+.circular-actions a.btn {
+  background-color: #3c8dbc;
+  border-color: #367fa9;
+  color: #fff;
+}
+
+.btn-circle i, .circular-actions a i {
+  margin: 0px;
+}
+/**
+END - Actions
+*/
+
+/**
+START - DataTable
+*/
+.dataTable {
+  clear: both;
+}
+
+.rowsChooser {
+  padding: 5px 0px 15px 0px;
+  text-align: right;
+}
+/**
+END - DataTable
+*/

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5990330/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms.html
index 47c136e..4d70dbc 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms.html
@@ -18,6 +18,7 @@ specific language governing permissions and limitations
 under the License.
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://xmlns.jcp.org/jsf/composite">
+  <head><title>Realms</title></head>
   <wicket:extend>
     <div class="wrapper">
       <div class="admin-content-page content-margin-layout" wicket:id="content">
@@ -27,23 +28,6 @@ under the License.
               <wicket:container wicket:id="header"></wicket:container>
             </h3>
             <div class="box-tools pull-right">
-              <ul class="nav navbar-nav actions">
-                <li>
-                  <a wicket:id="editLink">
-                    <i class="fa fa-pencil-square-o"></i>
-                  </a>                  
-                </li>
-                <li>
-                  <a wicket:id="createLink">
-                    <i class="fa fa-plus"></i>
-                  </a>                  
-                </li>
-                <li>
-                  <a wicket:id="deleteLink" data-bb="confirm">
-                    <i class="fa fa-minus"></i>
-                  </a>
-                </li>
-              </ul>
             </div><!-- /.box-tools -->
           </div><!-- /.box-header -->
           <div class="box-body">

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5990330/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions.html
index 8d35765..981a5c5 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions.html
@@ -27,18 +27,18 @@ under the License.
               <span wicket:id="header"></span>
             </h3>
             <div class="box-tools pull-right">
-              <ul class="nav navbar-nav actions">
-                <li>
-                  <a wicket:message="title:createSecurityQuestion" wicket:id="createSecurityQuestion">
-                    <i class="glyphicon glyphicon-plus"></i>
-                  </a>                  
-                </li>
-              </ul>
             </div>
           </div>
           <div class="box-body">
             <div class="realms">
               <div wicket:id="securityQuestionPanel"></div>
+
+              <div class="modal-footer">
+                <a wicket:message="title:createSecurityQuestion" wicket:id="createSecurityQuestion" class="btn btn-primary btn-circle btn-lg">
+                  <i class="glyphicon glyphicon-plus"></i>
+                </a>                  
+              </div>
+
             </div>
           </div>
         </div>

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5990330/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.html
index 8a51c77..c7677df 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.html
@@ -23,11 +23,13 @@ under the License.
   <body>
     <wicket:extend>
       <div wicket:id="searchContainer">
-        <span wicket:id="resultTable">[Table]</span>
-
-        <span style="float:right">
-          <form wicket:id="paginator" style="display:inline">
-            <div class="col-sm-6">
+        <div class="dataTable">
+          <span wicket:id="resultTable">[Table]</span>
+        </div>
+        
+        <div class="rowsChooser">
+          <form wicket:id="paginator">
+            <div>
               <div class="dataTables_length">
                 <label>
                   <wicket:message key="displayRows"/>
@@ -36,7 +38,7 @@ under the License.
               </div>
             </div>
           </form>
-        </span>
+        </div>
       </div>
     </wicket:extend>
   </body>

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5990330/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractTypesPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractTypesPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractTypesPanel.html
index 99f4b22..ff35ea3 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractTypesPanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractTypesPanel.html
@@ -20,12 +20,12 @@ under the License.
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
   <wicket:panel>
     <div wicket:id="container">
-      <span wicket:id="tableContainer">
+      <div wicket:id="tableContainer" class="dataTable">
         <table class="table table-bordered table-hover dataTable" wicket:id="datatable">[datatable]</table>
-      </span>
-      <span style="float:right">
-        <form wicket:id="paginator" style="display:inline">
-          <div class="col-sm-6">
+      </div>
+      <div class="rowsChooser">
+        <form wicket:id="paginator">
+          <div>
             <div class="dataTables_length">
               <label>
                 <wicket:message key="displayRows"/>
@@ -34,7 +34,7 @@ under the License.
             </div>
           </div>
         </form>
-      </span>
+      </div>
     </div>
   </wicket:panel>
 </html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5990330/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails.html
index d894546..57955dd 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails.html
@@ -17,10 +17,8 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 -->
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://xmlns.jcp.org/jsf/composite">
+  <head><title></title></head>
   <body>
     <wicket:panel>
       <div wicket:id="container" class="summarize">
@@ -29,6 +27,13 @@ under the License.
         <span wicket:id="accountPolicy">[accountPolicy]</span>
         <span wicket:id="passwordPolicy">[passwordPolicy]</span>
       </div>
+
+      <span wicket:id="actions"></span>
+
+      <wicket:fragment wicket:id="emptyFragment"></wicket:fragment>
+      <wicket:fragment wicket:id="actionsFragment">
+        <div wicket:id="actions" class="modal-footer circular-actions"/>
+      </wicket:fragment>
     </wicket:panel>
   </body>
 </html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5990330/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html
index 772222e..c2b32de 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html
@@ -60,131 +60,131 @@ under the License.
     <span wicket:id="panelZoomOut">[plus]</span>
 
     <wicket:fragment wicket:id="fragmentClaim">
-      <a href="#" wicket:id="claimLink"><img id="actionLink" src="img/actions/claim.png" alt="claim icon" title="Claim"/></a>
+      <a href="#" wicket:id="claimLink" class="btn"><img id="actionLink" src="img/actions/claim.png" alt="claim icon" title="Claim"/></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentManageResources">
-      <a href="#" wicket:id="manageResourcesLink"><i id="actionLink" class="fa fa-sitemap" alt="manage resources icon" title="Manage resources"></i></a>
+      <a href="#" wicket:id="manageResourcesLink" class="btn"><i id="actionLink" class="fa fa-sitemap" alt="manage resources icon" title="Manage resources"></i></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentManageUsers">
-      <a href="#" wicket:id="manageUsersLink"><img id="actionLink" src="img/actions/users-icon.png" alt="manage users icon" title="Manage users"/></a>
+      <a href="#" wicket:id="manageUsersLink" class="btn"><img id="actionLink" src="img/actions/users-icon.png" alt="manage users icon" title="Manage users"/></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentManageGroups">
-      <a href="#" wicket:id="manageGroupsLink"><img id="actionLink" src="img/actions/groups-icon.png" alt="manage groups icon" title="Manage groups"/></a>
+      <a href="#" wicket:id="manageGroupsLink" class="btn"><img id="actionLink" src="img/actions/groups-icon.png" alt="manage groups icon" title="Manage groups"/></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentMapping">
-      <a href="#" wicket:id="mappingLink" title="Mapping"><i class="fa fa-exchange"></i></a>
+      <a href="#" wicket:id="mappingLink" class="btn"><i class="fa fa-exchange" alt="mapping icon" title="Mapping"></i></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentAccountLink">
-      <a href="#" wicket:id="accountLinkLink" title="Account Link"><i class="fa fa-external-link"></i></a>
+      <a href="#" wicket:id="accountLinkLink" class="btn"><i class="fa fa-external-link" alt="account link icon" title="Account Link"></i></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentResetTime">
-      <a href="#" wicket:id="resetTimeLink" title="Reset Time"><i class="fa fa-hourglass-start"></i></a>
+      <a href="#" wicket:id="resetTimeLink" class="btn"><i class="fa fa-hourglass-start" alt="reset time icon" title="Reset Time"></i></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentClone">
-      <a href="#" wicket:id="cloneLink" title="Clone"><i class="fa fa-clone"></i></a>
+      <a href="#" wicket:id="cloneLink" class="btn"><i class="fa fa-clone" alt="clone icon" title="Clone"></i></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentCreate">
-      <a href="#" wicket:id="createLink" title="Create"><i class="fa fa-create"></i></a>
+      <a href="#" wicket:id="createLink" class="btn"><i class="glyphicon glyphicon-plus" alt="create icon" title="Create"></i></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentSearch">
-      <a href="#" wicket:id="searchLink"><i class="glyphicon glyphicon-search" alt="search icon" title="Search"></i></a>
+      <a href="#" wicket:id="searchLink" class="btn"><i class="glyphicon glyphicon-search" alt="search icon" title="Search"></i></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentEnable">
-      <a href="#" wicket:id="enableLink"><i id="actionLink" class="fa fa-toggle-on" alt="enable icon" title="Enable / Disable"></i></a>
+      <a href="#" wicket:id="enableLink" class="btn"><i id="actionLink" class="fa fa-toggle-on" alt="enable icon" title="Enable / Disable"></i></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentEdit">
-      <a href="#" wicket:id="editLink"><i id="actionLink" class="fa fa-pencil" alt="edit icon" title="Edit"></i></a>
+      <a href="#" wicket:id="editLink" class="btn"><i id="actionLink" class="glyphicon glyphicon-pencil" alt="edit icon" title="Edit"></i></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentReset">
-      <a href="#" wicket:id="resetLink"><img id="actionLink" src="img/actions/reset.png" alt="reset icon" title="Reset sync token"/></a>
+      <a href="#" wicket:id="resetLink" class="btn"><img id="actionLink" src="img/actions/reset.png" alt="reset icon" title="Reset sync token"/></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentUserTemplate">
-      <a href="#" wicket:id="userTemplateLink"><img id="actionLink" src="img/actions/user_template.png" alt="user template icon" title="Specify user template"/></a>
+      <a href="#" wicket:id="userTemplateLink" class="btn"><img id="actionLink" src="img/actions/user_template.png" alt="user template icon" title="Specify user template"/></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentGroupTemplate">
-      <a href="#" wicket:id="groupTemplateLink"><img id="actionLink" src="img/actions/groups-icon.png" alt="group template icon"  title="Specify group template"/></a>
+      <a href="#" wicket:id="groupTemplateLink" class="btn"><img id="actionLink" src="img/actions/groups-icon.png" alt="group template icon"  title="Specify group template"/></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentDelete">
-      <a href="#" wicket:id="deleteLink" title="Delete"><i class="fa fa-minus"></i></a>
+      <a href="#" wicket:id="deleteLink" class="btn"><i class="glyphicon glyphicon-minus" alt="delete icon" title="Delete"></i></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentDryRun">
-      <a href="#" wicket:id="dryRunLink"><img id="actionLink" src="img/actions/dryrun.png" alt="dryrun icon" title="DryRun"/></a>
+      <a href="#" wicket:id="dryRunLink" class="btn"><img id="actionLink" src="img/actions/dryrun.png" alt="dryrun icon" title="DryRun"/></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentExecute">
-      <a href="#" wicket:id="executeLink"><img id="actionLink" src="img/actions/execute.png" alt="execute icon" title="Execute"/></a>
+      <a href="#" wicket:id="executeLink" class="btn"><img id="actionLink" src="img/actions/execute.png" alt="execute icon" title="Execute"/></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentSelect">
-      <a href="#" wicket:id="selectLink"><i class="glyphicon glyphicon-ok"></i></a>
+      <a href="#" wicket:id="selectLink" class="btn"><i class="glyphicon glyphicon-ok"></i></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentExport">
-      <a href="#" wicket:id="exportLink"><img id="actionLink" src="img/actions/export.png" alt="export icon" title="Export"/></a>
+      <a href="#" wicket:id="exportLink" class="btn"><img id="actionLink" src="img/actions/export.png" alt="export icon" title="Export"/></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentSuspend">
-      <a href="#" wicket:id="suspendLink"><img id="actionLink" src="img/actions/suspend.png" alt="suspend icon" title="Suspend"/></a>
+      <a href="#" wicket:id="suspendLink" class="btn"><img id="actionLink" src="img/actions/suspend.png" alt="suspend icon" title="Suspend"/></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentReactivate">
-      <a href="#" wicket:id="reactivateLink"><img id="actionLink" src="img/actions/reactivate.png" alt="reactivate icon" title="Reactivate"/></a>
+      <a href="#" wicket:id="reactivateLink" class="btn"><img id="actionLink" src="img/actions/reactivate.png" alt="reactivate icon" title="Reactivate"/></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentReload">
-      <a href="#" wicket:id="reloadLink"><i id="actionLink" class="fa fa-repeat" alt="reload icon" title="Reload"></i></a>
+      <a href="#" wicket:id="reloadLink" class="btn"><i id="actionLink" class="fa fa-repeat" alt="reload icon" title="Reload"></i></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentChangeView">
-      <a href="#" wicket:id="changeViewLink"><i id="actionLink" class="fa fa-list" alt="Change view icon" title="Change view"></i></a>
+      <a href="#" wicket:id="changeViewLink" class="btn"><i id="actionLink" class="fa fa-list" alt="Change view icon" title="Change view"></i></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentUnlink">
-      <a href="#" wicket:id="unlinkLink"><img id="actionLink" src="img/actions/unlink-icon.png" alt="Unlink icon"  title="Unlink"/></a>
+      <a href="#" wicket:id="unlinkLink" class="btn"><img id="actionLink" src="img/actions/unlink-icon.png" alt="Unlink icon"  title="Unlink"/></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentLink">
-      <a href="#" wicket:id="linkLink"><img id="actionLink" src="img/actions/link-icon.png" alt="Link icon"  title="Link"/></a>
+      <a href="#" wicket:id="linkLink" class="btn"><img id="actionLink" src="img/actions/link-icon.png" alt="Link icon"  title="Link"/></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentUnassign">
-      <a href="#" wicket:id="unassignLink"><img id="actionLink" src="img/actions/unassign-icon.png" alt="Unassign icon"  title="Unassign"/></a>
+      <a href="#" wicket:id="unassignLink" class="btn"><img id="actionLink" src="img/actions/unassign-icon.png" alt="Unassign icon"  title="Unassign"/></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentAssign">
-      <a href="#" wicket:id="assignLink"><img id="actionLink" src="img/actions/assign-icon.png" alt="Assign icon"  title="Assign"/></a>
+      <a href="#" wicket:id="assignLink" class="btn"><img id="actionLink" src="img/actions/assign-icon.png" alt="Assign icon"  title="Assign"/></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentDeprovision">
-      <a href="#" wicket:id="deprovisionLink"><img id="actionLink" src="img/actions/deprovision-icon.png" alt="De-provision icon"  title="De-provision"/></a>
+      <a href="#" wicket:id="deprovisionLink" class="btn"><img id="actionLink" src="img/actions/deprovision-icon.png" alt="De-provision icon"  title="De-provision"/></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentProvision">
-      <a href="#" wicket:id="provisionLink"><img id="actionLink" src="img/actions/provision-icon.png" alt="Provision icon"  title="Provision"/></a>
+      <a href="#" wicket:id="provisionLink" class="btn"><img id="actionLink" src="img/actions/provision-icon.png" alt="Provision icon"  title="Provision"/></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentZoomIn">
-      <a href="#" wicket:id="zoomInLink" title="Zoom In"><i class="fa fa-search-plus"></i></a>
+      <a href="#" wicket:id="zoomInLink" class="btn"><i class="fa fa-search-plus" alt="zoom in icon" title="Zoom In"></i></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentZoomOut">
-      <a href="#" wicket:id="zoomOutLink" title="Zoom Out"><i class="fa fa-search-minus"></i></a>
+      <a href="#" wicket:id="zoomOutLink" class="btn"><i class="fa fa-search-minus" alt="zoom out icon" title="Zoom Out"></i></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="emptyFragment">

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5990330/client/console/src/main/resources/org/apache/syncope/client/console/wizards/WizardMgtPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/WizardMgtPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/WizardMgtPanel.html
index 9bf9518..c4e0180 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/WizardMgtPanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/WizardMgtPanel.html
@@ -36,7 +36,9 @@ under the License.
 
         <wicket:enclosure child="add">
           <div class="modal-footer" style="text-align: right">
-            <a haref="#"  class="btn btn-primary" wicket:id="add">Add</a>
+            <a haref="#"  class="btn btn-primary btn-circle btn-lg" wicket:id="add">
+              <i class="glyphicon glyphicon-plus"></i>
+            </a>
           </div>
         </wicket:enclosure>
       </wicket:fragment>


[3/4] syncope git commit: [SYNCOPE-156] provides material button for types by changing to be compliant to the standard use of search tables + fixes some notifications & icons

Posted by fm...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
index 03a836d..17cfbe0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
@@ -43,7 +43,7 @@ import org.apache.wicket.model.ResourceModel;
 /**
  * Modal window with Connector form.
  */
-public class ConnectorModal extends AbstractResourceModal {
+public class ConnectorModal extends AbstractResourceModal<Serializable> {
 
     private static final long serialVersionUID = -2025535531121434050L;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/DataTablePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/DataTablePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/DataTablePanel.java
index 46237ab..58aa653 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/DataTablePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/DataTablePanel.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.client.console.panels;
 
+import java.io.Serializable;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -32,7 +33,7 @@ import org.apache.wicket.model.IModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public abstract class DataTablePanel<T, S> extends Panel {
+public abstract class DataTablePanel<T extends Serializable, S> extends Panel {
 
     private static final long serialVersionUID = -7264400471578272966L;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/FailureMessageModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/FailureMessageModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/FailureMessageModal.java
index f23cecb..bee0c05 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/FailureMessageModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/FailureMessageModal.java
@@ -18,16 +18,17 @@
  */
 package org.apache.syncope.client.console.panels;
 
+import java.io.Serializable;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.model.Model;
 
-public class FailureMessageModal extends AbstractModalPanel {
+public class FailureMessageModal<T extends Serializable> extends AbstractModalPanel<T> {
 
     private static final long serialVersionUID = 9216117990503199258L;
 
-    public FailureMessageModal(final BaseModal<?> modal, final PageReference pageRef, final String failureMessage) {
+    public FailureMessageModal(final BaseModal<T> modal, final PageReference pageRef, final String failureMessage) {
         super(modal, pageRef);
         final Label executionFailureMessage;
         if (!failureMessage.isEmpty()) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
index 8670265..27d27b6 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
@@ -168,7 +168,7 @@ public class GroupSearchResultPanel extends AnyObjectSearchResultPanel<GroupTO>
 
                     @Override
                     public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
-                        target.add(modal.setContent(new GroupDisplayAttributesModalPage(
+                        target.add(modal.setContent(new GroupDisplayAttributesModalPage<>(
                                 modal, page.getPageReference(), schemaNames, dSchemaNames)));
 
                         modal.header(new ResourceModel("any.attr.display", ""));

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/ModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ModalPanel.java
index 681c1f2..11a9f78 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ModalPanel.java
@@ -18,13 +18,16 @@
  */
 package org.apache.syncope.client.console.panels;
 
+import java.io.Serializable;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.request.component.IRequestableComponent;
 
-public interface ModalPanel extends IRequestableComponent {
+public interface ModalPanel<T extends Serializable> extends IRequestableComponent, Serializable {
 
     void onSubmit(final AjaxRequestTarget target, final Form<?> form);
 
     void onError(final AjaxRequestTarget target, final Form<?> form);
+
+    T getItem();
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/NotificationPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/NotificationPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/NotificationPanel.java
index 03102ae..d38cfad 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/NotificationPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/NotificationPanel.java
@@ -61,10 +61,12 @@ public class NotificationPanel extends FeedbackPanel {
     public void refresh(final AjaxRequestTarget target) {
         if (anyMessage()) {
             for (FeedbackMessage message : getCurrentMessages()) {
-                if (anyErrorMessage()) {
+                if (message.isError()) {
                     notification.error(target, message.getMessage());
-                } else {
+                } else if (message.isSuccess() || message.isInfo()) {
                     notification.success(target, message.getMessage());
+                } else {
+                    notification.warn(target, message.getMessage());
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
index 48bd345..1755341 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
@@ -22,6 +22,7 @@ import com.googlecode.wicket.jquery.core.panel.LabelPanel;
 import de.agilecoders.wicket.core.markup.html.bootstrap.tabs.AjaxBootstrapTabbedPanel;
 import java.util.ArrayList;
 import java.util.List;
+import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.rest.AnyObjectRestClient;
 import org.apache.syncope.client.console.rest.AnyTypeRestClient;
 import org.apache.syncope.client.console.rest.GroupRestClient;
@@ -160,7 +161,7 @@ public abstract class Realm extends Panel {
                         pageReference).setRealm(realmTO.getFullPath()).
                         addNewItemPanelBuilder(new UserWizardBuilder(
                                 BaseModal.CONTENT_ID, userTO, anyTypeTO.getClasses(), pageRef)).
-                        //addNotificationPanel(BasePage.class.cast(this.pageRef.getPage()).getPopupComponent()).
+                        addNotificationPanel(BasePage.class.cast(this.pageRef.getPage()).getNotificationPanel()).
                         build(id);
                 MetaDataRoleAuthorizationStrategy.authorize(panel, WebPage.RENDER, StandardEntitlement.USER_LIST);
                 break;
@@ -174,7 +175,7 @@ public abstract class Realm extends Panel {
                         pageReference).setRealm(realmTO.getFullPath()).
                         addNewItemPanelBuilder(new GroupWizardBuilder(
                                 BaseModal.CONTENT_ID, groupTO, anyTypeTO.getClasses(), pageRef)).
-                        //addNotificationPanel(BasePage.class.cast(this.pageRef.getPage()).getFeedbackPanel).
+                        addNotificationPanel(BasePage.class.cast(this.pageRef.getPage()).getNotificationPanel()).
                         build(id);
                 // list of group is available to all authenticated users
                 break;
@@ -189,7 +190,7 @@ public abstract class Realm extends Panel {
                         pageReference).setRealm(realmTO.getFullPath()).
                         addNewItemPanelBuilder(new AnyWizardBuilder<AnyObjectTO>(
                                 BaseModal.CONTENT_ID, anyObjectTO, anyTypeTO.getClasses(), pageRef)).
-                        //addNotificationPanel(BasePage.class.cast(this.pageRef.getPage()).getPopupComponent()).
+                        addNotificationPanel(BasePage.class.cast(this.pageRef.getPage()).getNotificationPanel()).
                         build(id);
                 MetaDataRoleAuthorizationStrategy.authorize(panel, WebPage.RENDER,
                         String.format("%s_%s", anyObjectTO.getType(), AnyEntitlement.LIST));

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmModalPanel.java
index b7692fb..4912dfd 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmModalPanel.java
@@ -20,6 +20,7 @@ package org.apache.syncope.client.console.panels;
 
 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.rest.RealmRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.common.lib.to.RealmTO;
@@ -28,20 +29,18 @@ import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
 import org.apache.wicket.markup.html.form.Form;
 
-public class RealmModalPanel extends AbstractModalPanel {
+public class RealmModalPanel extends AbstractModalPanel<RealmTO> {
 
     private static final long serialVersionUID = -4285220460543213901L;
 
     private final RealmRestClient realmRestClient = new RealmRestClient();
 
-    private RealmTO realmTO;
-
     private boolean newRealm = false;
 
     private final String parentPath;
 
     public RealmModalPanel(
-            final BaseModal<?> modal,
+            final BaseModal<RealmTO> modal,
             final PageReference pageRef,
             final RealmTO realmTO,
             final String parentPath,
@@ -51,7 +50,7 @@ public class RealmModalPanel extends AbstractModalPanel {
     }
 
     public RealmModalPanel(
-            final BaseModal<?> modal,
+            final BaseModal<RealmTO> modal,
             final PageReference pageRef,
             final RealmTO realmTO,
             final String parentPath,
@@ -61,7 +60,6 @@ public class RealmModalPanel extends AbstractModalPanel {
         super(modal, pageRef);
 
         this.newRealm = newRealm;
-        this.realmTO = realmTO;
         this.parentPath = parentPath;
 
         final RealmDetails realmDetail = new RealmDetails("details", realmTO);
@@ -81,13 +79,13 @@ public class RealmModalPanel extends AbstractModalPanel {
             } else {
                 realmRestClient.update(updatedRealmTO);
             }
-            
+
             info(getString(Constants.OPERATION_SUCCEEDED));
             closeAction(target, form);
         } catch (Exception e) {
             LOG.error("While creating or updating realm", e);
             error(getString(Constants.ERROR) + ": " + e.getMessage());
-            modal.getNotificationPanel().refresh(target);
         }
+        BasePage.class.cast(pageRef.getPage()).getNotificationPanel().refresh(target);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypeDetailsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypeDetailsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypeDetailsPanel.java
index e1fd9fc..ef53d05 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypeDetailsPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypeDetailsPanel.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.client.console.panels;
 
-import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.common.lib.to.RelationshipTypeTO;
 import org.apache.wicket.markup.html.WebMarkupContainer;
@@ -31,32 +30,27 @@ public class RelationshipTypeDetailsPanel extends Panel {
 
     private static final long serialVersionUID = -4962850669086306255L;
 
-    private final RelationshipTypeTO relationshipTypeTO;
-
     public RelationshipTypeDetailsPanel(
             final String id,
-            final BaseModal<RelationshipTypeTO> modal) {
+            final RelationshipTypeTO relationshipTypeTO) {
         super(id);
 
-        this.relationshipTypeTO = modal.getFormModel();
-
         final WebMarkupContainer container = new WebMarkupContainer("container");
         container.setOutputMarkupId(true);
         add(container);
 
         final Form<RelationshipTypeTO> form = new Form<>("form");
-        form.setModel(new CompoundPropertyModel<>(this.relationshipTypeTO));
+        form.setModel(new CompoundPropertyModel<>(relationshipTypeTO));
         container.add(form);
 
-        final AjaxTextFieldPanel key =
-                new AjaxTextFieldPanel("key", getString("key"), new PropertyModel<String>(relationshipTypeTO, "key"));
+        final AjaxTextFieldPanel key = new AjaxTextFieldPanel("key", getString("key"), new PropertyModel<String>(
+                relationshipTypeTO, "key"));
         key.addRequiredLabel();
         key.setEnabled(key.getModelObject() == null || key.getModelObject().isEmpty());
         form.add(key);
 
-        final AjaxTextFieldPanel description =
-                new AjaxTextFieldPanel("description", 
-                        getString("description"), new PropertyModel<String>(relationshipTypeTO, "description"));
+        final AjaxTextFieldPanel description = new AjaxTextFieldPanel("description",
+                getString("description"), new PropertyModel<String>(relationshipTypeTO, "description"));
         description.addRequiredLabel();
         form.add(description);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypeModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypeModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypeModalPanel.java
index dd11959..4cbfa5a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypeModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypeModalPanel.java
@@ -18,47 +18,27 @@
  */
 package org.apache.syncope.client.console.panels;
 
-import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.common.lib.to.RelationshipTypeTO;
-import org.apache.syncope.common.rest.api.service.RelationshipTypeService;
 import org.apache.wicket.PageReference;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.markup.html.form.Form;
 
-public class RelationshipTypeModalPanel extends AbstractModalPanel {
+public class RelationshipTypeModalPanel extends AbstractModalPanel<RelationshipTypeTO> {
 
     private static final long serialVersionUID = 1602285111803121341L;
 
-    private final boolean createFlag;
+    private final RelationshipTypeTO relationshipTypeTO;
 
     public RelationshipTypeModalPanel(
             final BaseModal<RelationshipTypeTO> modal,
-            final PageReference pageRef, final boolean createFlag) {
+            final RelationshipTypeTO relationshipTypeTO,
+            final PageReference pageRef) {
         super(modal, pageRef);
-
-        this.createFlag = createFlag;
-        add(new RelationshipTypeDetailsPanel("relationshipTypeDetails", modal));
+        this.relationshipTypeTO = relationshipTypeTO;
+        add(new RelationshipTypeDetailsPanel("relationshipTypeDetails", this.relationshipTypeTO));
     }
 
     @Override
-    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
-        try {
-            final RelationshipTypeTO updateRelationshipTypeTO = RelationshipTypeTO.class.cast(form.getModelObject());
-
-            if (createFlag) {
-                SyncopeConsoleSession.get().getService(RelationshipTypeService.class).create(updateRelationshipTypeTO);
-            } else {
-                SyncopeConsoleSession.get().getService(RelationshipTypeService.class).update(updateRelationshipTypeTO);
-            }
-
-            info(getString(Constants.OPERATION_SUCCEEDED));
-            modal.close(target);
-        } catch (Exception e) {
-            LOG.error("While creating or updating RelationshipTypeTO", e);
-            error(getString(Constants.ERROR) + ": " + e.getMessage());
-            modal.getNotificationPanel().refresh(target);
-        }
+    public RelationshipTypeTO getItem() {
+        return this.relationshipTypeTO;
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypePanel.java
index 2467a4a..f4c64e4 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypePanel.java
@@ -18,69 +18,137 @@
  */
 package org.apache.syncope.client.console.panels;
 
+import static org.apache.syncope.client.console.panels.AbstractModalPanel.LOG;
+
 import java.io.Serializable;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.commons.SearchableDataProvider;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
+import org.apache.syncope.client.console.panels.RelationshipTypePanel.RelationshipTypeProvider;
+import org.apache.syncope.client.console.rest.BaseRestClient;
 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.ActionLinksPanel;
+import org.apache.syncope.client.console.wizards.AbstractModalPanelBuilder;
+import org.apache.syncope.client.console.wizards.AjaxWizard;
+import org.apache.syncope.client.console.wizards.WizardMgtPanel;
 import org.apache.syncope.common.lib.to.RelationshipTypeTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.syncope.common.rest.api.service.RelationshipTypeService;
 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.event.Broadcast;
 import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
-import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
-import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
-import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-public class RelationshipTypePanel extends AbstractTypesPanel<RelationshipTypeTO> {
+public class RelationshipTypePanel extends AbstractTypesPanel<RelationshipTypeTO, RelationshipTypeProvider> {
 
     private static final long serialVersionUID = -3731778000138547357L;
 
-    private static final Logger LOG = LoggerFactory.getLogger(RelationshipTypePanel.class);
+    private final String pageID = "RelationshipTypes";
 
-    private static final String PAGINATOR_ROWS_KEYS = Constants.PREF_RELATIONSHIPTYPE_PAGINATOR_ROWS;
+    public RelationshipTypePanel(
+            final String id, final Builder<RelationshipTypeTO, RelationshipTypeTO, BaseRestClient> builder) {
+        super(id, builder);
+    }
 
-    private final BaseModal<RelationshipTypeTO> modal;
+    public RelationshipTypePanel(final String id, final PageReference pageRef) {
+        super(id, new Builder<RelationshipTypeTO, RelationshipTypeTO, BaseRestClient>(null, pageRef) {
 
-    public RelationshipTypePanel(
-            final String panelId,
-            final PageReference pageReference,
-            final BaseModal<RelationshipTypeTO> modal) {
-        super(panelId, pageReference);
+            private static final long serialVersionUID = 8769126634538601689L;
+
+            @Override
+            protected WizardMgtPanel<RelationshipTypeTO> newInstance(final String id) {
+                return new RelationshipTypePanel(id, this);
+            }
+        });
+
+        this.addNewItemPanelBuilder(new AbstractModalPanelBuilder<RelationshipTypeTO>(
+                BaseModal.CONTENT_ID, new RelationshipTypeTO(), pageRef) {
+
+            private static final long serialVersionUID = -6388405037134399367L;
+
+            @Override
+            public ModalPanel<RelationshipTypeTO> build(final int index, final boolean edit) {
+                final RelationshipTypeTO modelObject = newModelObject();
+                return new RelationshipTypeModalPanel(modal, modelObject, pageRef) {
+
+                    private static final long serialVersionUID = -6227956682141146094L;
+
+                    @Override
+                    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
+                        try {
+                            if (getOriginalItem() == null || StringUtils.isBlank(getOriginalItem().getKey())) {
+                                SyncopeConsoleSession.get().
+                                        getService(RelationshipTypeService.class).create(modelObject);
+                            } else {
+                                SyncopeConsoleSession.get().
+                                        getService(RelationshipTypeService.class).update(modelObject);
+                            }
+
+                            info(getString(Constants.OPERATION_SUCCEEDED));
+                            modal.close(target);
+                        } catch (Exception e) {
+                            LOG.error("While creating or updating RelationshipTypeTO", e);
+                            error(getString(Constants.ERROR) + ": " + e.getMessage());
+                            modal.getNotificationPanel().refresh(target);
+                        }
+                    }
+                };
+            }
+
+            @Override
+            protected void onCancelInternal(final RelationshipTypeTO modelObject) {
+            }
 
-        this.pageRows = prefMan.getPaginatorRows(getRequest(), PAGINATOR_ROWS_KEYS);
-        this.modal = modal;
+            @Override
+            protected void onApplyInternal(final RelationshipTypeTO modelObject) {
+            }
+        }, true);
 
-        final WebMarkupContainer container = new WebMarkupContainer("container");
-        container.setOutputMarkupId(true);
-        add(container);
+        initResultTable();
+        MetaDataRoleAuthorizationStrategy.authorize(addAjaxLink, ENABLE, StandardEntitlement.RELATIONSHIPTYPE_CREATE);
+    }
+
+    @Override
+    protected RelationshipTypeProvider dataProvider() {
+        return new RelationshipTypeProvider(rows);
+    }
+
+    @Override
+    protected String paginatorRowsKey() {
+        return Constants.PREF_RELATIONSHIPTYPE_PAGINATOR_ROWS;
+    }
+
+    @Override
+    protected Collection<ActionLink.ActionType> getBulkActions() {
+        return Collections.<ActionLink.ActionType>emptyList();
+    }
 
-        buildDataTable(container, getColumns(container, pageReference),
-                new RelationshipTypePanel.RelationshipTypeProvider(), PAGINATOR_ROWS_KEYS);
+    @Override
+    protected String getPageId() {
+        return pageID;
     }
 
-    private List<IColumn<RelationshipTypeTO, String>> getColumns(
-            final WebMarkupContainer webContainer, final PageReference pageReference) {
+    @Override
+    protected List<IColumn<RelationshipTypeTO, String>> getColumns() {
 
         final List<IColumn<RelationshipTypeTO, String>> columns = new ArrayList<>();
 
@@ -89,9 +157,8 @@ public class RelationshipTypePanel extends AbstractTypesPanel<RelationshipTypeTO
             if (field != null && !Modifier.isStatic(field.getModifiers())) {
                 final String fieldName = field.getName();
 
-                final IColumn<RelationshipTypeTO, String> column =
-                        new PropertyColumn<RelationshipTypeTO, String>(
-                                new ResourceModel(field.getName()), field.getName(), field.getName()) {
+                final IColumn<RelationshipTypeTO, String> column = new PropertyColumn<RelationshipTypeTO, String>(
+                        new ResourceModel(field.getName()), field.getName(), field.getName()) {
 
                     private static final long serialVersionUID = 3282547854226892169L;
 
@@ -126,7 +193,8 @@ public class RelationshipTypePanel extends AbstractTypesPanel<RelationshipTypeTO
 
                 final RelationshipTypeTO relationshipTypeTO = model.getObject();
 
-                final ActionLinksPanel.Builder<Serializable> actionLinks = ActionLinksPanel.builder(pageReference);
+                final ActionLinksPanel.Builder<Serializable> actionLinks
+                        = ActionLinksPanel.builder(page.getPageReference());
                 actionLinks.setDisableIndicator(true);
                 actionLinks.addWithRoles(new ActionLink<Serializable>() {
 
@@ -134,11 +202,8 @@ public class RelationshipTypePanel extends AbstractTypesPanel<RelationshipTypeTO
 
                     @Override
                     public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
-                        modal.header(Model.of(relationshipTypeTO.getKey()));
-                        modal.setFormModel(relationshipTypeTO);
-                        target.add(modal.setContent(new RelationshipTypeModalPanel(modal, pageReference, false)));
-                        modal.addSumbitButton();
-                        modal.show(true);
+                        send(RelationshipTypePanel.this, Broadcast.EXACT,
+                                new AjaxWizard.EditItemActionEvent<RelationshipTypeTO>(model.getObject(), target));
                     }
                 }, ActionLink.ActionType.EDIT, StandardEntitlement.RELATIONSHIPTYPE_UPDATE).addWithRoles(
                         new ActionLink<Serializable>() {
@@ -151,7 +216,7 @@ public class RelationshipTypePanel extends AbstractTypesPanel<RelationshipTypeTO
                             SyncopeConsoleSession.get().getService(
                                     RelationshipTypeService.class).delete(relationshipTypeTO.getKey());
                             info(getString(Constants.OPERATION_SUCCEEDED));
-                            target.add(webContainer);
+                            target.add(container);
                         } catch (Exception e) {
                             LOG.error("While deleting RelationshipType", e);
                             error(getString(Constants.ERROR) + ": " + e.getMessage());
@@ -168,22 +233,21 @@ public class RelationshipTypePanel extends AbstractTypesPanel<RelationshipTypeTO
 
     }
 
-    private final class RelationshipTypeProvider extends SortableDataProvider<RelationshipTypeTO, String> {
+    protected final class RelationshipTypeProvider extends SearchableDataProvider<RelationshipTypeTO> {
 
         private static final long serialVersionUID = -185944053385660794L;
 
         private final SortableDataProviderComparator<RelationshipTypeTO> comparator;
 
-        private RelationshipTypeProvider() {
-            super();
-            setSort("key", SortOrder.ASCENDING);
+        private RelationshipTypeProvider(final int paginatorRows) {
+            super(paginatorRows);
             comparator = new SortableDataProviderComparator<>(this);
         }
 
         @Override
         public Iterator<RelationshipTypeTO> iterator(final long first, final long count) {
-            final List<RelationshipTypeTO> list =
-                    SyncopeConsoleSession.get().getService(RelationshipTypeService.class).list();
+            final List<RelationshipTypeTO> list = SyncopeConsoleSession.get().getService(RelationshipTypeService.class).
+                    list();
             Collections.sort(list, comparator);
             return list.subList((int) first, (int) first + (int) count).iterator();
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java
index 3864322..f649ee0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java
@@ -48,8 +48,10 @@ import org.apache.wicket.model.ResourceModel;
 
 /**
  * Modal window with Resource form.
+ *
+ * @param <T>
  */
-public class ResourceModal extends AbstractResourceModal {
+public class ResourceModal<T extends Serializable> extends AbstractResourceModal<T> {
 
     private static final long serialVersionUID = 1734415311027284221L;
 
@@ -60,7 +62,7 @@ public class ResourceModal extends AbstractResourceModal {
     private final boolean createFlag;
 
     public ResourceModal(
-            final BaseModal<Serializable> modal,
+            final BaseModal<T> modal,
             final PageReference pageRef,
             final IModel<ResourceTO> model,
             final boolean createFlag) {
@@ -91,37 +93,39 @@ public class ResourceModal extends AbstractResourceModal {
         builder.setItems(model.getObject().getProvisions());
         builder.includes("anyType", "objectClass");
 
-        builder.addAction(new ActionLink<ProvisionTO>() {
+        builder.
+                addAction(new ActionLink<ProvisionTO>() {
 
-            private static final long serialVersionUID = -3722207913631435504L;
+                    private static final long serialVersionUID = -3722207913631435504L;
 
-            @Override
-            public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
-                send(pageRef.getPage(), Broadcast.DEPTH,
-                        new AjaxWizard.NewItemActionEvent<>(provisionTO, 2, target));
-            }
-        }, ActionLink.ActionType.MAPPING, StandardEntitlement.RESOURCE_UPDATE).addAction(new ActionLink<ProvisionTO>() {
+                    @Override
+                    public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
+                        send(pageRef.getPage(), Broadcast.DEPTH,
+                                new AjaxWizard.NewItemActionEvent<>(provisionTO, 2, target));
+                    }
+                }, ActionLink.ActionType.MAPPING, StandardEntitlement.RESOURCE_UPDATE).
+                addAction(new ActionLink<ProvisionTO>() {
 
-            private static final long serialVersionUID = -3722207913631435514L;
+                    private static final long serialVersionUID = -3722207913631435514L;
 
-            @Override
-            public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
-                send(pageRef.getPage(), Broadcast.DEPTH,
-                        new AjaxWizard.NewItemActionEvent<>(provisionTO, 3, target));
-            }
-        }, ActionLink.ActionType.ACCOUNT_LINK, StandardEntitlement.RESOURCE_UPDATE).addAction(
-                new ActionLink<ProvisionTO>() {
+                    @Override
+                    public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
+                        send(pageRef.getPage(), Broadcast.DEPTH,
+                                new AjaxWizard.NewItemActionEvent<>(provisionTO, 3, target));
+                    }
+                }, ActionLink.ActionType.ACCOUNT_LINK, StandardEntitlement.RESOURCE_UPDATE).
+                addAction(new ActionLink<ProvisionTO>() {
 
-            private static final long serialVersionUID = -3722207913631435524L;
+                    private static final long serialVersionUID = -3722207913631435524L;
 
-            @Override
-            public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
-                provisionTO.setSyncToken(null);
-                send(pageRef.getPage(), Broadcast.DEPTH,
-                        new AjaxWizard.NewItemFinishEvent<>(provisionTO, target));
-            }
-        }, ActionLink.ActionType.RESET_TIME, StandardEntitlement.RESOURCE_UPDATE).addAction(
-                        new ActionLink<ProvisionTO>() {
+                    @Override
+                    public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
+                        provisionTO.setSyncToken(null);
+                        send(pageRef.getPage(), Broadcast.DEPTH,
+                                new AjaxWizard.NewItemFinishEvent<>(provisionTO, target));
+                    }
+                }, ActionLink.ActionType.RESET_TIME, StandardEntitlement.RESOURCE_UPDATE).
+                addAction(new ActionLink<ProvisionTO>() {
 
                     private static final long serialVersionUID = -3722207913631435534L;
 
@@ -130,8 +134,8 @@ public class ResourceModal extends AbstractResourceModal {
                         send(pageRef.getPage(), Broadcast.DEPTH,
                                 new AjaxWizard.NewItemActionEvent<>(SerializationUtils.clone(provisionTO), target));
                     }
-                }, ActionLink.ActionType.CLONE, StandardEntitlement.RESOURCE_CREATE).addAction(
-                        new ActionLink<ProvisionTO>() {
+                }, ActionLink.ActionType.CLONE, StandardEntitlement.RESOURCE_CREATE).
+                addAction(new ActionLink<ProvisionTO>() {
 
                     private static final long serialVersionUID = -3722207913631435544L;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleSearchResultPanel.java
index c84ff3c..6e2492c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleSearchResultPanel.java
@@ -39,6 +39,7 @@ import org.apache.syncope.common.lib.to.RoleTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 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.event.Broadcast;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
@@ -54,8 +55,11 @@ public class RoleSearchResultPanel
 
     protected RoleSearchResultPanel(final String id, final Builder builder) {
         super(id, builder);
+
         modal.size(Modal.Size.Large);
         initResultTable();
+
+        MetaDataRoleAuthorizationStrategy.authorize(addAjaxLink, ENABLE, StandardEntitlement.ROLE_CREATE);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaModalPanel.java
index f822471..bb30f7b 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaModalPanel.java
@@ -32,7 +32,7 @@ import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.Model;
 
-public class SchemaModalPanel extends AbstractModalPanel {
+public class SchemaModalPanel extends AbstractModalPanel<AbstractSchemaTO> {
 
     private static final long serialVersionUID = -4681998932778822125L;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemasPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemasPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemasPanel.java
index 03899e9..48cdd9d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemasPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemasPanel.java
@@ -18,6 +18,8 @@
  */
 package org.apache.syncope.client.console.panels;
 
+import static org.apache.wicket.Component.ENABLE;
+
 import de.agilecoders.wicket.core.markup.html.bootstrap.tabs.Collapsible;
 import java.io.Serializable;
 import java.lang.reflect.Field;
@@ -41,12 +43,15 @@ import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.SelectChoiceRenderer;
 import org.apache.syncope.common.lib.to.AbstractSchemaTO;
+import org.apache.syncope.common.lib.to.PlainSchemaTO;
 import org.apache.syncope.common.lib.types.SchemaType;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
+import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
+import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink;
 import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
 import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
@@ -74,8 +79,7 @@ public class SchemasPanel extends Panel {
 
     private static final long serialVersionUID = -1140213992451232279L;
 
-    private static final Map<SchemaType, String> PAGINATOR_ROWS_KEYS =
-            new HashMap<SchemaType, String>() {
+    private static final Map<SchemaType, String> PAGINATOR_ROWS_KEYS = new HashMap<SchemaType, String>() {
 
         private static final long serialVersionUID = 3109256773218160485L;
 
@@ -106,15 +110,32 @@ public class SchemasPanel extends Panel {
 
     private final BaseModal<AbstractSchemaTO> modal;
 
-    public SchemasPanel(final String id, final PageReference pageReference, final BaseModal<AbstractSchemaTO> modal) {
+    public SchemasPanel(final String id, final PageReference pageRef, final BaseModal<AbstractSchemaTO> modal) {
         super(id);
 
-        this.pageReference = pageReference;
+        this.pageReference = pageRef;
         this.modal = modal;
 
         final Collapsible collapsible = new Collapsible("collapsePanel", buildTabList());
         collapsible.setOutputMarkupId(true);
         add(collapsible);
+
+        final IndicatingAjaxLink<Void> schemaLink = new IndicatingAjaxLink<Void>("createSchema") {
+
+            private static final long serialVersionUID = -7978723352517770644L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target) {
+                modal.header(new ResourceModel("createSchema"));
+                modal.setFormModel(new PlainSchemaTO());
+                target.add(modal.setContent(new SchemaModalPanel(modal, pageRef, true)));
+                modal.addSumbitButton();
+                modal.show(true);
+            }
+        };
+
+        add(schemaLink);
+        MetaDataRoleAuthorizationStrategy.authorize(schemaLink, ENABLE, StandardEntitlement.SCHEMA_CREATE);
     }
 
     private List<ITab> buildTabList() {
@@ -171,8 +192,8 @@ public class SchemasPanel extends Panel {
                         }
                     });
                 } else {
-                    final IColumn<AbstractSchemaTO, String> column =
-                            new PropertyColumn<AbstractSchemaTO, String>(new ResourceModel(field), field, field) {
+                    final IColumn<AbstractSchemaTO, String> column = new PropertyColumn<AbstractSchemaTO, String>(
+                            new ResourceModel(field), field, field) {
 
                         private static final long serialVersionUID = 3282547854226892169L;
 
@@ -291,9 +312,8 @@ public class SchemasPanel extends Panel {
             final List<IColumn<AbstractSchemaTO, String>> tableCols = getColumns(schemaContainer,
                     schemaType, COL_NAMES.get(schemaType));
 
-            final AjaxFallbackDataTable<AbstractSchemaTO, String> table =
-                    new AjaxFallbackDataTable<>("datatable",
-                            tableCols, new SchemaProvider(schemaType), pageRows, schemaContainer);
+            final AjaxFallbackDataTable<AbstractSchemaTO, String> table = new AjaxFallbackDataTable<>("datatable",
+                    tableCols, new SchemaProvider(schemaType), pageRows, schemaContainer);
             table.setOutputMarkupId(true);
             schemaContainer.add(table);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel.java
index b6ab809..d7a70a1 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionDetailsPanel.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.client.console.panels;
 
-import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.common.lib.to.SecurityQuestionTO;
 import org.apache.wicket.markup.html.WebMarkupContainer;
@@ -31,9 +30,7 @@ public class SecurityQuestionDetailsPanel extends Panel {
 
     private static final long serialVersionUID = 6278708606604582875L;
 
-    public SecurityQuestionDetailsPanel(
-            final String id,
-            final BaseModal<SecurityQuestionTO> modal) {
+    public SecurityQuestionDetailsPanel(final String id, final SecurityQuestionTO securityQuestionTO) {
         super(id);
 
         final WebMarkupContainer container = new WebMarkupContainer("container");
@@ -43,7 +40,6 @@ public class SecurityQuestionDetailsPanel extends Panel {
 
         final Form<SecurityQuestionTO> form = new Form<>("form");
 
-        final SecurityQuestionTO securityQuestionTO = modal.getFormModel();
         form.setModel(new CompoundPropertyModel<>(securityQuestionTO));
         container.add(form);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionModalPanel.java
index e3d083c..671a494 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionModalPanel.java
@@ -27,27 +27,30 @@ import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.form.Form;
 
-public class SecurityQuestionModalPanel extends AbstractModalPanel {
+public class SecurityQuestionModalPanel extends AbstractModalPanel<SecurityQuestionTO> {
 
     private static final long serialVersionUID = 4024126489500665435L;
 
-    private final boolean createFlag;
+    private final SecurityQuestionTO securityQuestionTO;
 
     public SecurityQuestionModalPanel(
             final BaseModal<SecurityQuestionTO> modal,
-            final PageReference pageRef,
-            final boolean createFlag) {
+            final SecurityQuestionTO securityQuestionTO,
+            final PageReference pageRef) {
         super(modal, pageRef);
-        this.createFlag = createFlag;
-        add(new SecurityQuestionDetailsPanel("securityQuestionDetailsPanel", modal));
+        this.securityQuestionTO = securityQuestionTO;
+        add(new SecurityQuestionDetailsPanel("securityQuestionDetailsPanel", getItem()));
+    }
+
+    @Override
+    public final SecurityQuestionTO getItem() {
+        return this.securityQuestionTO;
     }
 
     @Override
     public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
         try {
-            final SecurityQuestionTO securityQuestionTO = SecurityQuestionTO.class.cast(form.getModelObject());
-
-            if (createFlag) {
+            if (securityQuestionTO.getKey() == 0) {
                 SyncopeConsoleSession.get().getService(SecurityQuestionService.class).create(securityQuestionTO);
             } else {
                 SyncopeConsoleSession.get().getService(SecurityQuestionService.class).update(securityQuestionTO);

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/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 45e80fe..bc83d03 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
@@ -18,70 +18,120 @@
  */
 package org.apache.syncope.client.console.panels;
 
+import static org.apache.wicket.Component.ENABLE;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import java.io.Serializable;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.commons.SearchableDataProvider;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.AbstractBasePage;
+import org.apache.syncope.client.console.panels.SecurityQuestionsPanel.SecurityQuestionsProvider;
+import org.apache.syncope.client.console.rest.BaseRestClient;
 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.ActionLinksPanel;
+import org.apache.syncope.client.console.wizards.AbstractModalPanelBuilder;
+import org.apache.syncope.client.console.wizards.AjaxWizard;
+import org.apache.syncope.client.console.wizards.WizardMgtPanel;
 import org.apache.syncope.common.lib.to.SecurityQuestionTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.syncope.common.rest.api.service.SecurityQuestionService;
 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.event.Broadcast;
 import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
-import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
-import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
-import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-public class SecurityQuestionsPanel extends AbstractTypesPanel<SecurityQuestionTO> {
+public class SecurityQuestionsPanel extends AbstractSearchResultPanel<
+        SecurityQuestionTO, SecurityQuestionTO, SecurityQuestionsProvider, BaseRestClient> {
 
     private static final long serialVersionUID = 3323019773236588850L;
 
-    private static final Logger LOG = LoggerFactory.getLogger(SecurityQuestionsPanel.class);
+    private final String pageID = "SecurityQuestions";
+
+    public SecurityQuestionsPanel(final String id, final PageReference pageRef) {
+        super(id, new Builder<SecurityQuestionTO, SecurityQuestionTO, BaseRestClient>(null, pageRef) {
+
+            private static final long serialVersionUID = 8769126634538601689L;
+
+            @Override
+            protected WizardMgtPanel<SecurityQuestionTO> newInstance(final String id) {
+                return new SecurityQuestionsPanel(id, this);
+            }
+        });
+
+        this.addNewItemPanelBuilder(new AbstractModalPanelBuilder<SecurityQuestionTO>(
+                BaseModal.CONTENT_ID, new SecurityQuestionTO(), pageRef) {
+
+            private static final long serialVersionUID = -6388405037134399367L;
+
+            @Override
+            public ModalPanel<SecurityQuestionTO> build(final int index, final boolean edit) {
+                final SecurityQuestionTO modelObject = newModelObject();
+                return new SecurityQuestionModalPanel(modal, modelObject, pageRef);
+            }
+
+            @Override
+            protected void onCancelInternal(final SecurityQuestionTO modelObject) {
+            }
+
+            @Override
+            protected void onApplyInternal(final SecurityQuestionTO modelObject) {
+            }
+        }, true);
 
-    private static final String PAGINATOR_ROWS_KEYS = Constants.PREF_SECURITY_QUESTIONS_PAGINATOR_ROWS;
+        setFooterVisibility(true);
+        modal.addSumbitButton();
+        modal.size(Modal.Size.Large);
+        initResultTable();
 
-    private final BaseModal<SecurityQuestionTO> modal;
+        MetaDataRoleAuthorizationStrategy.authorize(addAjaxLink, ENABLE, StandardEntitlement.SECURITY_QUESTION_CREATE);
+    }
 
     public SecurityQuestionsPanel(
-            final String id, final PageReference pageReference, final BaseModal<SecurityQuestionTO> modal) {
-        super(id, pageReference);
-        this.pageRows = prefMan.getPaginatorRows(getRequest(), PAGINATOR_ROWS_KEYS);
-        this.modal = modal;
+            final String id, final Builder<SecurityQuestionTO, SecurityQuestionTO, BaseRestClient> builder) {
+        super(id, builder);
+    }
+
+    @Override
+    protected SecurityQuestionsProvider dataProvider() {
+        return new SecurityQuestionsProvider(rows);
+    }
 
-        final WebMarkupContainer container = new WebMarkupContainer("container");
-        container.setOutputMarkupId(true);
-        add(container);
+    @Override
+    protected String paginatorRowsKey() {
+        return Constants.PREF_SECURITY_QUESTIONS_PAGINATOR_ROWS;
+    }
 
-        buildDataTable(container,
-                getColumns(container, pageReference),
-                new SecurityQuestionsPanel.SecurityQuestionsProvider(),
-                PAGINATOR_ROWS_KEYS);
+    @Override
+    protected Collection<ActionLink.ActionType> getBulkActions() {
+        return Collections.<ActionLink.ActionType>emptyList();
+    }
 
+    @Override
+    protected String getPageId() {
+        return pageID;
     }
 
-    private List<IColumn<SecurityQuestionTO, String>> getColumns(
-            final WebMarkupContainer webContainer, final PageReference pageReference) {
+    @Override
+    protected List<IColumn<SecurityQuestionTO, String>> getColumns() {
 
         final List<IColumn<SecurityQuestionTO, String>> columns = new ArrayList<>();
 
@@ -145,7 +195,8 @@ public class SecurityQuestionsPanel extends AbstractTypesPanel<SecurityQuestionT
 
                 final SecurityQuestionTO securityQuestionTO = model.getObject();
 
-                final ActionLinksPanel.Builder<Serializable> actionLinks = ActionLinksPanel.builder(pageReference);
+                final ActionLinksPanel.Builder<Serializable> actionLinks
+                        = ActionLinksPanel.builder(page.getPageReference());
                 actionLinks.setDisableIndicator(true);
                 actionLinks
                         .addWithRoles(new ActionLink<Serializable>() {
@@ -154,12 +205,9 @@ public class SecurityQuestionsPanel extends AbstractTypesPanel<SecurityQuestionT
 
                             @Override
                             public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
-                                modal.header(Model.of(String.valueOf(securityQuestionTO.getKey())));
-                                modal.setFormModel(securityQuestionTO);
-                                target.add(modal.setContent(
-                                        new SecurityQuestionModalPanel(modal, pageReference, false)));
-                                modal.addSumbitButton();
-                                modal.show(true);
+                                send(SecurityQuestionsPanel.this, Broadcast.EXACT,
+                                        new AjaxWizard.EditItemActionEvent<SecurityQuestionTO>(
+                                                model.getObject(), target));
                             }
                         }, ActionLink.ActionType.EDIT, StandardEntitlement.SECURITY_QUESTION_UPDATE)
                         .addWithRoles(new ActionLink<Serializable>() {
@@ -172,7 +220,7 @@ public class SecurityQuestionsPanel extends AbstractTypesPanel<SecurityQuestionT
                                     SyncopeConsoleSession.get().getService(SecurityQuestionService.class
                                     ).delete(securityQuestionTO.getKey());
                                     info(getString(Constants.OPERATION_SUCCEEDED));
-                                    target.add(webContainer);
+                                    target.add(container);
                                 } catch (Exception e) {
                                     LOG.error("While deleting SecutiryQuestionTO", e);
                                     error(getString(Constants.ERROR) + ": " + e.getMessage());
@@ -190,15 +238,14 @@ public class SecurityQuestionsPanel extends AbstractTypesPanel<SecurityQuestionT
 
     }
 
-    private final class SecurityQuestionsProvider extends SortableDataProvider<SecurityQuestionTO, String> {
+    protected final class SecurityQuestionsProvider extends SearchableDataProvider<SecurityQuestionTO> {
 
         private static final long serialVersionUID = -185944053385660794L;
 
         private final SortableDataProviderComparator<SecurityQuestionTO> comparator;
 
-        private SecurityQuestionsProvider() {
-            super();
-            setSort("key", SortOrder.ASCENDING);
+        private SecurityQuestionsProvider(final int paginatorRows) {
+            super(paginatorRows);
             comparator = new SortableDataProviderComparator<>(this);
         }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java
index 6f5a985..c7501c6 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java
@@ -20,7 +20,6 @@ package org.apache.syncope.client.console.panels;
 
 import java.io.Serializable;
 import java.lang.reflect.Field;
-import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -126,15 +125,16 @@ public class UserSearchResultPanel extends AnyObjectSearchResultPanel<UserTO> {
 
                     @Override
                     public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
-                        final IModel<AnyHandler<UserTO>> formModel =
-                                new CompoundPropertyModel<>(new AnyHandler<UserTO>(model.getObject()));
+                        final IModel<AnyHandler<UserTO>> formModel
+                                = new CompoundPropertyModel<>(new AnyHandler<UserTO>(model.getObject()));
                         modal.setFormModel(formModel);
 
                         target.add(modal.setContent(new StatusModal<>(
                                 modal, page.getPageReference(), formModel.getObject().getInnerObject())));
 
-                        modal.header(new Model<>(MessageFormat.format(
-                                getString("any.edit"), model.getObject().getKey())));
+                        modal.header(new Model<>(
+                                getString("any.edit", new Model<>(new AnyHandler<UserTO>(model.getObject())))));
+
                         modal.show(true);
                     }
                 }, ActionLink.ActionType.MANAGE_RESOURCES, StandardEntitlement.USER_READ).add(new ActionLink<UserTO>() {
@@ -143,15 +143,16 @@ public class UserSearchResultPanel extends AnyObjectSearchResultPanel<UserTO> {
 
                     @Override
                     public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
-                        final IModel<AnyHandler<UserTO>> formModel =
-                                new CompoundPropertyModel<>(new AnyHandler<UserTO>(model.getObject()));
+                        final IModel<AnyHandler<UserTO>> formModel
+                                = new CompoundPropertyModel<>(new AnyHandler<UserTO>(model.getObject()));
                         modal.setFormModel(formModel);
 
                         target.add(modal.setContent(new StatusModal<>(
                                 modal, page.getPageReference(), formModel.getObject().getInnerObject(), true)));
 
-                        modal.header(new Model<>(MessageFormat.format(
-                                getString("any.edit"), model.getObject().getKey())));
+                        modal.header(new Model<>(
+                                getString("any.edit", new Model<>(new AnyHandler<UserTO>(model.getObject())))));
+
                         modal.show(true);
                     }
                 }, ActionLink.ActionType.ENABLE, StandardEntitlement.USER_READ).add(new ActionLink<UserTO>() {
@@ -209,7 +210,7 @@ public class UserSearchResultPanel extends AnyObjectSearchResultPanel<UserTO> {
 
                     @Override
                     public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
-                        target.add(modal.setContent(new UserDisplayAttributesModalPage(
+                        target.add(modal.setContent(new UserDisplayAttributesModalPage<>(
                                 modal, page.getPageReference(), schemaNames, dSchemaNames)));
 
                         modal.header(new ResourceModel("any.attr.display", ""));

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java
index 17ee0ce..2478b61 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java
@@ -24,7 +24,6 @@ import java.util.List;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Transformer;
 import org.apache.commons.lang3.tuple.Pair;
-import org.apache.syncope.client.console.panels.NotificationPanel;
 import org.apache.syncope.client.console.rest.AnyTypeRestClient;
 import org.apache.syncope.client.console.rest.ResourceRestClient;
 import org.apache.syncope.client.console.rest.SchemaRestClient;
@@ -64,8 +63,6 @@ public abstract class AbstractSearchPanel extends Panel {
 
     protected IModel<List<Pair<Long, String>>> groupNames;
 
-    protected NotificationPanel searchFeedback;
-
     protected IModel<List<SearchClause>> model;
 
     protected WebMarkupContainer searchFormContainer;
@@ -127,28 +124,6 @@ public abstract class AbstractSearchPanel extends Panel {
         searchFormContainer.setOutputMarkupId(true);
         add(searchFormContainer);
 
-//        searchFeedback = new NotificationPanel("searchFeedback", new IFeedbackMessageFilter() {
-//
-//            private static final long serialVersionUID = 6895024863321391672L;
-//
-//            @Override
-//            public boolean accept(final FeedbackMessage message) {
-//                boolean result;
-//
-//                // messages reported on the session have a null reporter
-//                if (message.getReporter() == null) {
-//                    result = false;
-//                } else {
-//                    // only accept messages coming from the children of the search form container
-//                    result = searchFormContainer.contains(message.getReporter(), true);
-//                }
-//
-//                return result;
-//            }
-//        });
-//        searchFeedback.setOutputMarkupId(true);
-//        add(searchFeedback);
-
         final SearchClausePanel searchClausePanel = new SearchClausePanel("panel", "panel",
                 Model.of(new SearchClause()),
                 required,
@@ -217,10 +192,6 @@ public abstract class AbstractSearchPanel extends Panel {
         };
     }
 
-    public NotificationPanel getSearchFeedback() {
-        return searchFeedback;
-    }
-
     public IModel<List<SearchClause>> getModel() {
         return this.model;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
index 6a6733e..e3bc2be 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
@@ -43,7 +43,7 @@ public class ResourceRestClient extends BaseRestClient {
         return new ArrayList<>(SyncopeConsoleSession.get().getSyncopeTO().getPropagationActions());
     }
 
-    public static List<ResourceTO> getAll() {
+    public List<ResourceTO> getAll() {
         List<ResourceTO> resources = null;
 
         try {

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java b/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
index e11e234..1a904a1 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
@@ -32,6 +32,7 @@ import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.panels.AbstractResourceModal.CreateEvent;
+import org.apache.syncope.client.console.panels.NotificationPanel;
 import org.apache.syncope.client.console.rest.BaseRestClient;
 import org.apache.syncope.client.console.rest.ConnectorRestClient;
 import org.apache.syncope.client.console.rest.ResourceRestClient;
@@ -92,48 +93,48 @@ public class Topology extends BasePage {
     private final LoadableDetachableModel<Map<String, List<ConnInstanceTO>>> connModel
             = new LoadableDetachableModel<Map<String, List<ConnInstanceTO>>>() {
 
-                private static final long serialVersionUID = 5275935387613157432L;
+        private static final long serialVersionUID = 5275935387613157432L;
 
-                @Override
-                protected Map<String, List<ConnInstanceTO>> load() {
-                    final Map<String, List<ConnInstanceTO>> res = new HashMap<>();
-
-                    for (ConnInstanceTO conn : connectorRestClient.getAllConnectors()) {
-                        final List<ConnInstanceTO> conns;
-                        if (res.containsKey(conn.getLocation())) {
-                            conns = res.get(conn.getLocation());
-                        } else {
-                            conns = new ArrayList<>();
-                            res.put(conn.getLocation(), conns);
-                        }
-                        conns.add(conn);
-                    }
-
-                    return res;
+        @Override
+        protected Map<String, List<ConnInstanceTO>> load() {
+            final Map<String, List<ConnInstanceTO>> res = new HashMap<>();
+
+            for (ConnInstanceTO conn : connectorRestClient.getAllConnectors()) {
+                final List<ConnInstanceTO> conns;
+                if (res.containsKey(conn.getLocation())) {
+                    conns = res.get(conn.getLocation());
+                } else {
+                    conns = new ArrayList<>();
+                    res.put(conn.getLocation(), conns);
                 }
-            };
+                conns.add(conn);
+            }
+
+            return res;
+        }
+    };
 
     private final LoadableDetachableModel<Pair<List<URI>, List<URI>>> csModel
             = new LoadableDetachableModel<Pair<List<URI>, List<URI>>>() {
 
-                private static final long serialVersionUID = 5275935387613157433L;
+        private static final long serialVersionUID = 5275935387613157433L;
 
-                @Override
-                protected Pair<List<URI>, List<URI>> load() {
-                    final List<URI> connectorServers = new ArrayList<>();
-                    final List<URI> filePaths = new ArrayList<>();
-
-                    for (String location : SyncopeConsoleSession.get().getSyncopeTO().getConnIdLocations()) {
-                        if (location.startsWith(CONNECTOR_SERVER_LOCATION_PREFIX)) {
-                            connectorServers.add(URI.create(location));
-                        } else {
-                            filePaths.add(URI.create(location));
-                        }
-                    }
-
-                    return Pair.of(connectorServers, filePaths);
+        @Override
+        protected Pair<List<URI>, List<URI>> load() {
+            final List<URI> connectorServers = new ArrayList<>();
+            final List<URI> filePaths = new ArrayList<>();
+
+            for (String location : SyncopeConsoleSession.get().getSyncopeTO().getConnIdLocations()) {
+                if (location.startsWith(CONNECTOR_SERVER_LOCATION_PREFIX)) {
+                    connectorServers.add(URI.create(location));
+                } else {
+                    filePaths.add(URI.create(location));
                 }
-            };
+            }
+
+            return Pair.of(connectorServers, filePaths);
+        }
+    };
 
     protected enum SupportedOperation {
 
@@ -144,7 +145,15 @@ public class Topology extends BasePage {
     }
 
     public Topology() {
-        modal = new BaseModal<>("resource-modal");
+        modal = new BaseModal<Serializable>("resource-modal") {
+
+            private static final long serialVersionUID = -5912673052161214766L;
+
+            @Override
+            public NotificationPanel getNotificationPanel() {
+                return Topology.this.notificationPanel;
+            }
+        };
         add(modal.size(Modal.Size.Large));
 
         modal.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {
@@ -154,11 +163,6 @@ public class Topology extends BasePage {
             @Override
             public void onClose(final AjaxRequestTarget target) {
                 modal.show(false);
-
-//                if (isModalResult()) {
-//                    info(getString(Constants.OPERATION_SUCCEEDED));
-//                    notificationPanel.refresh(target);
-//                }
             }
         });
 
@@ -398,37 +402,37 @@ public class Topology extends BasePage {
                 final ListView<TopologyNode> innerListView = new ListView<TopologyNode>("resources",
                         new ArrayList<>(connections.get(connectorId).values())) {
 
-                            private static final long serialVersionUID = 1L;
+                    private static final long serialVersionUID = 1L;
 
-                            private final int size = getModelObject().size() + 1;
+                    private final int size = getModelObject().size() + 1;
 
-                            @Override
-                            protected void populateItem(final ListItem<TopologyNode> item) {
-                                final TopologyNode topologynode = item.getModelObject();
-                                final TopologyNode parent = connectors.get(connectorId);
+                    @Override
+                    protected void populateItem(final ListItem<TopologyNode> item) {
+                        final TopologyNode topologynode = item.getModelObject();
+                        final TopologyNode parent = connectors.get(connectorId);
 
-                                // Set position
-                                int kx = size >= 16 ? 800 : (48 * size);
-                                int ky = size < 4 ? 100 : size < 6 ? 350 : 750;
+                        // Set position
+                        int kx = size >= 16 ? 800 : (48 * size);
+                        int ky = size < 4 ? 100 : size < 6 ? 350 : 750;
 
-                                final double hpos;
-                                if (parent == null || parent.getY() < syncopeTopologyNode.getY()) {
-                                    hpos = Math.PI;
-                                } else {
-                                    hpos = 0.0;
-                                }
+                        final double hpos;
+                        if (parent == null || parent.getY() < syncopeTopologyNode.getY()) {
+                            hpos = Math.PI;
+                        } else {
+                            hpos = 0.0;
+                        }
 
-                                int x = (int) Math.round((parent == null ? origX : parent.getX())
-                                        + kx * Math.cos(hpos + Math.PI * (item.getIndex() + 1) / size));
-                                int y = (int) Math.round((parent == null ? origY : parent.getY())
-                                        + ky * Math.sin(hpos + Math.PI * (item.getIndex() + 1) / size));
+                        int x = (int) Math.round((parent == null ? origX : parent.getX())
+                                + kx * Math.cos(hpos + Math.PI * (item.getIndex() + 1) / size));
+                        int y = (int) Math.round((parent == null ? origY : parent.getY())
+                                + ky * Math.sin(hpos + Math.PI * (item.getIndex() + 1) / size));
 
-                                topologynode.setX(x);
-                                topologynode.setY(y);
+                        topologynode.setX(x);
+                        topologynode.setY(y);
 
-                                item.add(topologyNodePanel("res", topologynode));
-                            }
-                        };
+                        item.add(topologyNodePanel("res", topologynode));
+                    }
+                };
 
                 innerListView.setOutputMarkupId(true);
                 item.add(innerListView);

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNodePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNodePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNodePanel.java
index 3c6f72c..a7bd832 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNodePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNodePanel.java
@@ -35,12 +35,15 @@ import org.apache.syncope.common.lib.to.ConnInstanceTO;
 import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.wicket.AttributeModifier;
+import org.apache.wicket.Component;
+import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.IAjaxIndicatorAware;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
 import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
 import org.apache.wicket.behavior.AttributeAppender;
+import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.panel.Fragment;
@@ -117,6 +120,21 @@ public class TopologyNodePanel extends Panel implements IAjaxIndicatorAware {
         BasePage.class.cast(pageRef.getPage()).setWindowClosedCallback(modal, null);
     }
 
+    @Override
+    public final MarkupContainer add(final Component... childs) {
+        return super.add(childs);
+    }
+
+    @Override
+    public final Component add(final Behavior... behaviors) {
+        return super.add(behaviors);
+    }
+
+    @Override
+    public final Component setMarkupId(final String markupId) {
+        return super.setMarkupId(markupId);
+    }
+
     private Fragment getSyncopeFragment() {
         return new Fragment("actions", "syncopeActions", this);
     }
@@ -173,7 +191,7 @@ public class TopologyNodePanel extends Panel implements IAjaxIndicatorAware {
                 ((AbstractBasePage) getPage()).getNotificationPanel().refresh(target);
             }
         };
-        
+
         fragment.add(delete);
         delete.add(new ConfirmationModalBehavior());
 
@@ -192,7 +210,7 @@ public class TopologyNodePanel extends Panel implements IAjaxIndicatorAware {
                 final IModel<ResourceTO> model = new CompoundPropertyModel<>(modelObject);
                 modal.setFormModel(model);
 
-                target.add(modal.setContent(new ResourceModal(modal, pageRef, model, true)));
+                target.add(modal.setContent(new ResourceModal<>(modal, pageRef, model, true)));
 
                 modal.header(new Model<>(MessageFormat.format(getString("resource.new"), node.getKey())));
 
@@ -271,7 +289,7 @@ public class TopologyNodePanel extends Panel implements IAjaxIndicatorAware {
                 final IModel<ResourceTO> model = new CompoundPropertyModel<>(modelObject);
                 modal.setFormModel(model);
 
-                target.add(modal.setContent(new ResourceModal(modal, pageRef, model, false)));
+                target.add(modal.setContent(new ResourceModal<>(modal, pageRef, model, false)));
 
                 modal.header(new Model<>(MessageFormat.format(getString("resource.edit"), node.getKey())));
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
index 566991e..ab602b6 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
@@ -33,8 +33,10 @@ import org.apache.syncope.client.console.panels.NotificationPanel;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.buttons.DefaultModalCloseButton;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.buttons.PrimaryModalButton;
 import org.apache.wicket.Component;
+import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow.WindowClosedCallback;
 import org.apache.wicket.markup.html.WebMarkupContainer;
@@ -82,7 +84,7 @@ public class BaseModal<T extends Serializable> extends Modal<T> implements Notif
         form = new Form<>(FORM);
         add(form);
 
-        content = new AbstractModalPanel(this, null) {
+        content = new AbstractModalPanel<T>(this, null) {
 
             private static final long serialVersionUID = 1L;
 
@@ -105,7 +107,21 @@ public class BaseModal<T extends Serializable> extends Modal<T> implements Notif
         addButton(new DefaultModalCloseButton());
         setUseKeyboard(true);
         setFadeIn(true);
+    }
 
+    @Override
+    public final Component add(final Behavior... behaviors) {
+        return super.add(behaviors);
+    }
+
+    @Override
+    public final MarkupContainer add(final Component... childs) {
+        return super.add(childs);
+    }
+
+    @Override
+    public final MarkupContainer addOrReplace(final Component... childs) {
+        return super.addOrReplace(childs);
     }
 
     @Override
@@ -131,11 +147,14 @@ public class BaseModal<T extends Serializable> extends Modal<T> implements Notif
         return form.getModelObject();
     }
 
-    public ModalPanel getContent() {
-        return ModalPanel.class.cast(content);
+    public ModalPanel<T> getContent() {
+        if (content instanceof ModalPanel) {
+            return (ModalPanel<T>) content;
+        }
+        throw new IllegalStateException();
     }
 
-    public BaseModal<T> setContent(final ModalPanel component) {
+    public BaseModal<T> setContent(final ModalPanel<T> component) {
         if (component instanceof Panel) {
             return setInternalContent(Panel.class.cast(component));
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/wizards/AbstractModalPanelBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AbstractModalPanelBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AbstractModalPanelBuilder.java
new file mode 100644
index 0000000..88b79c5
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AbstractModalPanelBuilder.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2015 The Apache Software Foundation.
+ *
+ * Licensed 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 org.apache.commons.lang3.SerializationUtils;
+import org.apache.syncope.client.console.panels.ModalPanel;
+import org.apache.wicket.PageReference;
+
+public abstract class AbstractModalPanelBuilder<T extends Serializable> implements Serializable {
+
+    private static final long serialVersionUID = 5241745929825564456L;
+
+    protected final String id;
+
+    protected final PageReference pageRef;
+
+    private final T defaultItem;
+
+    private T item;
+
+    /**
+     * Construct.
+     *
+     * @param id The component id
+     * @param defaultItem default item.
+     * @param pageRef Caller page reference.
+     */
+    public AbstractModalPanelBuilder(final String id, final T defaultItem, final PageReference pageRef) {
+        this.id = id;
+        this.defaultItem = defaultItem;
+        this.pageRef = pageRef;
+    }
+
+    public abstract ModalPanel<T> build(final int index, final boolean edit);
+
+    protected abstract void onCancelInternal(T modelObject);
+
+    protected abstract void onApplyInternal(T modelObject);
+
+    protected T getOriginalItem() {
+        return item;
+    }
+
+    public T getDefaultItem() {
+        return defaultItem;
+    }
+
+    protected T newModelObject() {
+        if (item == null) {
+            // keep the original item: the which one before the changes performed during wizard browsing
+            item = SerializationUtils.clone(defaultItem);
+        }
+
+        // instantiate a new model object and return it
+        return SerializationUtils.clone(item);
+    }
+
+    /**
+     * Replaces the default value provided with the constructor and nullify working item object.
+     *
+     * @param item new value.
+     * @return the current wizard factory instance.
+     */
+    public AbstractModalPanelBuilder<T> setItem(final T item) {
+        this.item = item;
+        return this;
+    }
+
+    public PageReference getPageReference() {
+        return pageRef;
+    }
+}


[2/4] syncope git commit: [SYNCOPE-156] provides material button for types by changing to be compliant to the standard use of search tables + fixes some notifications & icons

Posted by fm...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
index 54f9223..d868180 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
@@ -29,7 +29,7 @@ import org.apache.wicket.request.cycle.RequestCycle;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public abstract class AjaxWizard<T extends Serializable> extends Wizard implements ModalPanel {
+public abstract class AjaxWizard<T extends Serializable> extends Wizard implements ModalPanel<T> {
 
     private static final long serialVersionUID = -1272120742876833520L;
 
@@ -53,11 +53,8 @@ public abstract class AjaxWizard<T extends Serializable> extends Wizard implemen
         super(id);
         this.item = item;
         this.edit = edit;
-
         setOutputMarkupId(true);
-
         setDefaultModel(new CompoundPropertyModel<>(this));
-
         init(model);
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java
index 173e4d5..0afa9f4 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java
@@ -16,22 +16,13 @@
 package org.apache.syncope.client.console.wizards;
 
 import java.io.Serializable;
-import org.apache.commons.lang3.SerializationUtils;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.extensions.wizard.WizardModel;
 
-public abstract class AjaxWizardBuilder<T extends Serializable> implements Serializable {
+public abstract class AjaxWizardBuilder<T extends Serializable> extends AbstractModalPanelBuilder<T> {
 
     private static final long serialVersionUID = 5241745929825564456L;
 
-    private final String id;
-
-    protected final PageReference pageRef;
-
-    private final T defaultItem;
-
-    private T item;
-
     /**
      * Construct.
      *
@@ -40,11 +31,10 @@ public abstract class AjaxWizardBuilder<T extends Serializable> implements Seria
      * @param pageRef Caller page reference.
      */
     public AjaxWizardBuilder(final String id, final T defaultItem, final PageReference pageRef) {
-        this.id = id;
-        this.defaultItem = defaultItem;
-        this.pageRef = pageRef;
+        super(id, defaultItem, pageRef);
     }
 
+    @Override
     public AjaxWizard<T> build(final int index, final boolean edit) {
         final AjaxWizard<T> wizard = build(edit);
         for (int i = 1; i < index; i++) {
@@ -74,41 +64,4 @@ public abstract class AjaxWizardBuilder<T extends Serializable> implements Seria
     }
 
     protected abstract WizardModel buildModelSteps(final T modelObject, final WizardModel wizardModel);
-
-    protected abstract void onCancelInternal(T modelObject);
-
-    protected abstract void onApplyInternal(T modelObject);
-
-    protected T getOriginalItem() {
-        return item;
-    }
-
-    public T getDefaultItem() {
-        return defaultItem;
-    }
-
-    private T newModelObject() {
-        if (item == null) {
-            // keep the original item: the which one before the changes performed during wizard browsing
-            item = SerializationUtils.clone(defaultItem);
-        }
-
-        // instantiate a new model object and return it
-        return SerializationUtils.clone(item);
-    }
-
-    /**
-     * Replaces the default value provided with the constructor and nullify working item object.
-     *
-     * @param item new value.
-     * @return the current wizard factory instance.
-     */
-    public AjaxWizardBuilder<T> setItem(final T item) {
-        this.item = item;
-        return this;
-    }
-
-    public PageReference getPageReference() {
-        return pageRef;
-    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/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 56b1cc5..f9abcdc 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
@@ -20,8 +20,11 @@ package org.apache.syncope.client.console.wizards;
 
 import java.io.Serializable;
 import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.panels.ModalPanel;
 import org.apache.syncope.client.console.panels.NotificationPanel;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.wicket.Component;
+import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
@@ -45,12 +48,14 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
 
     private final Fragment initialFragment;
 
-    private final AjaxLink<?> addAjaxLink;
+    protected final AjaxLink<?> addAjaxLink;
 
-    private AjaxWizardBuilder<T> newItemPanelBuilder;
+    private AbstractModalPanelBuilder<T> newItemPanelBuilder;
 
     private NotificationPanel notificationPanel;
 
+    private boolean footerVisibility = false;
+
     /**
      * Modal window.
      */
@@ -61,7 +66,7 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
         @Override
         protected void onConfigure() {
             super.onConfigure();
-            setFooterVisible(false);
+            setFooterVisible(footerVisibility);
         }
 
     };
@@ -102,6 +107,15 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
     }
 
     @Override
+    public final MarkupContainer add(final Component... childs) {
+        return super.add(childs);
+    }
+
+    public void setFooterVisibility(final boolean footerVisibility) {
+        this.footerVisibility = footerVisibility;
+    }
+
+    @Override
     @SuppressWarnings("unchecked")
     public void onEvent(final IEvent<?> event) {
         if (event.getPayload() instanceof AjaxWizard.NewItemEvent) {
@@ -109,27 +123,27 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
             final AjaxRequestTarget target = newItemEvent.getTarget();
             final T item = newItemEvent.getItem();
 
-            if (event.getPayload() instanceof AjaxWizard.NewItemActionEvent) {
+            if (event.getPayload() instanceof AjaxWizard.NewItemActionEvent && newItemPanelBuilder != null) {
                 newItemPanelBuilder.setItem(item);
 
-                final AjaxWizard<T> wizard = newItemPanelBuilder.build(
+                final ModalPanel<T> modalPanel = newItemPanelBuilder.build(
                         ((AjaxWizard.NewItemActionEvent<T>) newItemEvent).getIndex(), item != null);
 
                 if (wizardInModal) {
                     final IModel<T> model = new CompoundPropertyModel<>(item);
                     modal.setFormModel(model);
 
-                    target.add(modal.setContent(wizard));
+                    target.add(modal.setContent(modalPanel));
 
                     modal.header(new StringResourceModel(
                             String.format("any.%s", newItemEvent.getEventDescription()),
                             this,
-                            new Model<T>(wizard.getItem())));
+                            new Model<T>(modalPanel.getItem())));
 
                     modal.show(true);
                 } else {
                     final Fragment fragment = new Fragment("content", "wizard", WizardMgtPanel.this);
-                    fragment.add(wizard);
+                    fragment.add(Component.class.cast(modalPanel));
                     container.addOrReplace(fragment);
                 }
             } else {
@@ -153,8 +167,8 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
         super.onEvent(event);
     }
 
-    private WizardMgtPanel<T> addNewItemPanelBuilder(
-            final AjaxWizardBuilder<T> panelBuilder, final boolean newItemDefaultButtonEnabled) {
+    protected <B extends AbstractModalPanelBuilder<T>> WizardMgtPanel<T> addNewItemPanelBuilder(
+            final B panelBuilder, final boolean newItemDefaultButtonEnabled) {
         this.newItemPanelBuilder = panelBuilder;
 
         if (this.newItemPanelBuilder != null) {
@@ -165,7 +179,7 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
         return this;
     }
 
-    private WizardMgtPanel<T> addNotificationPanel(final NotificationPanel notificationPanel) {
+    protected WizardMgtPanel<T> addNotificationPanel(final NotificationPanel notificationPanel) {
         this.notificationPanel = notificationPanel;
         return this;
     }
@@ -181,7 +195,7 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
 
         protected final PageReference pageRef;
 
-        private AjaxWizardBuilder<T> newItemPanelBuilder;
+        private AbstractModalPanelBuilder<T> newItemPanelBuilder;
 
         private boolean newItemDefaultButtonEnabled = true;
 
@@ -205,7 +219,7 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
                     addNotificationPanel(notificationPanel);
         }
 
-        public Builder<T> addNewItemPanelBuilder(final AjaxWizardBuilder<T> panelBuilder) {
+        public Builder<T> addNewItemPanelBuilder(final AbstractModalPanelBuilder<T> panelBuilder) {
             this.newItemPanelBuilder = panelBuilder;
             return this;
         }
@@ -218,7 +232,7 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
          * @return the current builder.
          */
         public Builder<T> addNewItemPanelBuilder(
-                final AjaxWizardBuilder<T> panelBuilder, final boolean newItemDefaultButtonEnabled) {
+                final AbstractModalPanelBuilder<T> panelBuilder, final boolean newItemDefaultButtonEnabled) {
             this.newItemDefaultButtonEnabled = newItemDefaultButtonEnabled;
             return addNewItemPanelBuilder(panelBuilder);
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/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 8d5a78a..ed4c227 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
@@ -56,7 +56,9 @@ public class GroupWizardBuilder extends AnyWizardBuilder<GroupTO> {
      */
     @Override
     public AjaxWizardBuilder<AnyHandler<GroupTO>> setItem(final AnyHandler<GroupTO> item) {
-        return item == null ? super.setItem(item) : super.setItem(new GroupHandler(item.getInnerObject()));
+        return (AjaxWizardBuilder<AnyHandler<GroupTO>>) (item == null
+                ? super.setItem(item)
+                : super.setItem(new GroupHandler(item.getInnerObject())));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Resources.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Resources.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Resources.java
index 86ad35f..d20636f 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Resources.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Resources.java
@@ -53,7 +53,7 @@ public class Resources extends WizardStep {
                 entityTO.getResources().addAll(object);
             }
         }, new ListModel<>(CollectionUtils.collect(
-                        ResourceRestClient.getAll(),
+                        new ResourceRestClient().getAll(),
                         new Transformer<ResourceTO, String>() {
 
                     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/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 b14bf7a..7801a6e 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
@@ -68,7 +68,9 @@ public class RoleWizardBuilder extends AjaxWizardBuilder<RoleHandler> {
      */
     @Override
     public AjaxWizardBuilder<RoleHandler> setItem(final RoleHandler item) {
-        return item == null ? super.setItem(item) : super.setItem(new RoleHandler(item.getInnerObject()));
+        return (AjaxWizardBuilder<RoleHandler>) (item == null
+                ? super.setItem(item)
+                : super.setItem(new RoleHandler(item.getInnerObject())));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/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 8db1214..7bae94e 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
@@ -95,23 +95,23 @@ under the License.
           <ul class="sidebar-menu">
             <li wicket:id="dashboardLI"><a href="#" wicket:id="dashboard"><i class="fa fa-dashboard"></i><span>Dashboard</span></a></li>
             <li wicket:id="realmsLI"><a href="#" wicket:id="realms"><i class="fa fa-folder-o"></i><span>Realms</span></a></li>
-            <li wicket:id="topologyLI"><a href="#" wicket:id="topology"><i class="fa fa-database"></i><span>Topology</span></a></li>
+            <li wicket:id="topologyLI"><a href="#" wicket:id="topology"><i class="fa fa-plug"></i><span>Topology</span></a></li>
             <li wicket:id="reportsLI"><a href="#" wicket:id="reports"><i class="fa fa-pie-chart"></i><span>Reports</span></a></li>
             <li wicket:id="configurationLI" class="treeview">
               <a href="#"><i class="fa fa-edit"></i><span>Configuration</span> <i class="fa fa-angle-left pull-right"></i></a>
               <ul wicket:id="configurationUL" class="treeview-menu">
                 <li wicket:id="rolesLI"><a href="#" wicket:id="roles"><i class="fa fa-users"></i>Roles</a></li>
-                <li wicket:id="policiesLI"><a href="#" wicket:id="policies"><i class="fa fa-circle-o"></i>Policies</a></li>
-                <li wicket:id="securityquestionsLI"><a href="#" wicket:id="securityquestions"><i class="fa fa-circle-o"></i>Security Questions</a></li>
-                <li wicket:id="workflowLI"><a href="#" wicket:id="workflow"><i class="fa fa-circle-o"></i>Workflow</a></li>
-                <li wicket:id="logsLI"><a href="#" wicket:id="logs"><i class="fa fa-circle-o"></i>Logs</a></li>
-                <li wicket:id="layoutsLI"><a href="#" wicket:id="layouts"><i class="fa fa-circle-o"></i>Layouts</a></li>
-                <li wicket:id="typesLI"><a href="#" wicket:id="types"><i class="fa fa-circle-o"></i><wicket:message key="types"/></a></li>
-                <li wicket:id="notificationsLI"><a href="#" wicket:id="notifications"><i class="fa fa-circle-o"></i>Notifications</a></li>
+                <li wicket:id="policiesLI"><a href="#" wicket:id="policies"><i class="fa fa-list"></i>Policies</a></li>
+                <li wicket:id="securityquestionsLI"><a href="#" wicket:id="securityquestions"><i class="fa fa-question"></i>Security Questions</a></li>
+                <li wicket:id="workflowLI"><a href="#" wicket:id="workflow"><i class="fa fa-share-alt"></i>Workflow</a></li>
+                <li wicket:id="logsLI"><a href="#" wicket:id="logs"><i class="fa fa-file-text-o"></i>Logs</a></li>
+                <li wicket:id="layoutsLI"><a href="#" wicket:id="layouts"><i class="fa fa-object-ungroup"></i>Layouts</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="notificationsLI"><a href="#" wicket:id="notifications"><i class="fa fa-envelope-o"></i>Notifications</a></li>
               </ul>
             </li>
             <li class="treeview">
-              <a href="#"><i class="fa fa-laptop"></i><span>Extensions</span> <i class="fa fa-angle-left pull-right"></i></a>
+              <a href="#"><i class="fa fa-puzzle-piece"></i><span>Extensions</span> <i class="fa fa-angle-left pull-right"></i></a>
               <ul class="treeview-menu">
                 <li wicket:id="camelroutesLI"><a href="#" wicket:id="camelroutes"><i class="fa fa-circle-o"></i>Camel Routes</a></li>
               </ul>

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/resources/org/apache/syncope/client/console/pages/Logs.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Logs.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Logs.html
index b68b8cd..142df33 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Logs.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Logs.html
@@ -30,7 +30,7 @@ under the License.
           </div>
           <div class="box-body">
             <div class="realms">
-              <form wicket:id="form">
+              <form>
                 <div wicket:id="tabbedPanel"></div>
               </form>
             </div>

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/resources/org/apache/syncope/client/console/pages/Roles.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Roles.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Roles.html
index 4180c56..852db68 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Roles.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Roles.html
@@ -27,13 +27,6 @@ under the License.
               <span wicket:id="header"></span>
             </h3>
             <div class="box-tools pull-right">
-              <ul class="nav navbar-nav actions">
-                <li>
-                  <a wicket:message="title:add" alt="add icon" wicket:id="add">
-                    <i class="glyphicon glyphicon-plus"></i>
-                  </a>                  
-                </li>
-              </ul>
             </div>
           </div>
           <div class="box-body">

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions.html
index 981a5c5..77d0675 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/SecurityQuestions.html
@@ -32,13 +32,6 @@ under the License.
           <div class="box-body">
             <div class="realms">
               <div wicket:id="securityQuestionPanel"></div>
-
-              <div class="modal-footer">
-                <a wicket:message="title:createSecurityQuestion" wicket:id="createSecurityQuestion" class="btn btn-primary btn-circle btn-lg">
-                  <i class="glyphicon glyphicon-plus"></i>
-                </a>                  
-              </div>
-
             </div>
           </div>
         </div>

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/resources/org/apache/syncope/client/console/pages/Types.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Types.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Types.html
index e04c84d..49062b3 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Types.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Types.html
@@ -27,28 +27,6 @@ under the License.
               <span wicket:id="header"></span>
             </h3>
             <div class="box-tools pull-right">
-              <ul class="nav navbar-nav actions">
-                <li>
-                  <a wicket:message="title:createRelationshipType" wicket:id="createRelationshipType">
-                    <i class="glyphicon glyphicon-link"></i>
-                  </a>                  
-                </li>
-                <li>
-                  <a wicket:message="title:createAnyType" wicket:id="createAnyType">
-                    <i class="glyphicon glyphicon-leaf"></i>
-                  </a>                  
-                </li>
-                <li>
-                  <a wicket:message="title:createAnyTypeClass" wicket:id="createAnyTypeClass">
-                    <i class="glyphicon glyphicon-duplicate"></i>
-                  </a>                  
-                </li>
-                <li>
-                  <a wicket:message="title:createSchema" wicket:id="createSchema">
-                    <i class="glyphicon glyphicon-list-alt"></i>
-                  </a>                  
-                </li>
-              </ul>
             </div>
           </div>
           <div class="box-body">
@@ -61,7 +39,5 @@ under the License.
     </div>
     <div wicket:id="schemaModal"></div>
     <div wicket:id="anyTypeClassModal"></div>
-    <div wicket:id="anyTypeModal"></div>
-    <div wicket:id="relationshipTypeModal"></div>
   </wicket:extend>
 </html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractTypesPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractTypesPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractTypesPanel.html
deleted file mode 100644
index ff35ea3..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractTypesPanel.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE html>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <wicket:panel>
-    <div wicket:id="container">
-      <div wicket:id="tableContainer" class="dataTable">
-        <table class="table table-bordered table-hover dataTable" wicket:id="datatable">[datatable]</table>
-      </div>
-      <div class="rowsChooser">
-        <form wicket:id="paginator">
-          <div>
-            <div class="dataTables_length">
-              <label>
-                <wicket:message key="displayRows"/>
-                <select class="form-control input-sm" wicket:id="rowsChooser"/>
-              </label>
-            </div>
-          </div>
-        </form>
-      </div>
-    </div>
-  </wicket:panel>
-</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/resources/org/apache/syncope/client/console/panels/AnyTypePanel.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/AnyTypePanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/AnyTypePanel.properties
new file mode 100644
index 0000000..2f30b82
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/AnyTypePanel.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.
+any.edit=Edit AnyType ${key}
+any.new=New AnyType

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/resources/org/apache/syncope/client/console/panels/AnyTypePanel_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/AnyTypePanel_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/AnyTypePanel_it.properties
new file mode 100644
index 0000000..396f3d8
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/AnyTypePanel_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.
+any.edit=Modifica AnyType ${key}
+any.new=Nuovo AnyType

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/resources/org/apache/syncope/client/console/panels/AnyTypePanel_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/AnyTypePanel_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/AnyTypePanel_pt_BR.properties
new file mode 100644
index 0000000..75418a3
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/AnyTypePanel_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.
+any.edit=Alterar AnyType ${key}
+any.new=Novo AnyType

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/resources/org/apache/syncope/client/console/panels/RelationshipTypePanel.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/RelationshipTypePanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/RelationshipTypePanel.properties
new file mode 100644
index 0000000..66ad3af
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/RelationshipTypePanel.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.
+any.edit=Edit RelationshipType ${key}
+any.new=New RelationshipType

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/resources/org/apache/syncope/client/console/panels/RelationshipTypePanel_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/RelationshipTypePanel_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/RelationshipTypePanel_it.properties
new file mode 100644
index 0000000..2882c37
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/RelationshipTypePanel_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.
+any.edit=Modifica RelationshipType ${key}
+any.new=Nuovo RelationshipType

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/resources/org/apache/syncope/client/console/panels/RelationshipTypePanel_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/RelationshipTypePanel_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/RelationshipTypePanel_pt_BR.properties
new file mode 100644
index 0000000..f884328
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/RelationshipTypePanel_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.
+any.edit=Alterar RelationshipType ${key}
+any.new=Novo RelationshipType

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/resources/org/apache/syncope/client/console/panels/SchemasPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/SchemasPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/SchemasPanel.html
index a006d12..2cea30f 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/SchemasPanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/SchemasPanel.html
@@ -23,6 +23,11 @@ under the License.
   <body>
     <wicket:panel>
       <div wicket:id="collapsePanel"></div>
+      <div class="modal-footer">
+        <a wicket:message="title:createSchema" wicket:id="createSchema">
+          <i class="glyphicon glyphicon-duplicate"></i>
+        </a>
+      </div>
     </wicket:panel>
   </body>
 </html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.properties
new file mode 100644
index 0000000..7323e05
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.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.
+any.edit=Edit Security Question ${key}
+any.new=New Security Question

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionsPanel_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionsPanel_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionsPanel_it.properties
new file mode 100644
index 0000000..6d55323
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionsPanel_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.
+any.edit=Modifica Domanda Segreta ${key}
+any.new=Nuova Domanda Segreta

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionsPanel_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionsPanel_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionsPanel_pt_BR.properties
new file mode 100644
index 0000000..930c3c2
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/SecurityQuestionsPanel_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.
+any.edit=Alterar Pergunta de Seguran\u00e7a ${key}
+any.new=Novo Pergunta de Seguran\u00e7a

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/resources/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.html
index 4de4c23..70ea03d 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.html
@@ -25,7 +25,6 @@ under the License.
     <wicket:panel>
       <span class="searchBox">
         <div class="col-xs-12">
-          <div wicket:id="searchFeedback"></div>
           <span wicket:id="searchFormContainer">
             <span wicket:id="search">[SEARCH]</span>
           </span>


[4/4] syncope git commit: [SYNCOPE-156] provides material button for types by changing to be compliant to the standard use of search tables + fixes some notifications & icons

Posted by fm...@apache.org.
[SYNCOPE-156] provides material button for types by changing to be compliant to the standard use of search tables + fixes some notifications & icons


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

Branch: refs/heads/master
Commit: 6a93860d8deab4a2c1e5cf2c8e75e64c8c5eb27d
Parents: e599033
Author: fmartelli <fa...@gmail.com>
Authored: Thu Dec 31 09:19:54 2015 +0100
Committer: fmartelli <fa...@gmail.com>
Committed: Thu Dec 31 09:19:54 2015 +0100

----------------------------------------------------------------------
 .../console/pages/AbstractStatusModalPage.java  |   5 +-
 .../pages/AnyDisplayAttributesModalPage.java    |   8 +-
 .../console/pages/BulkActionModalPage.java      |   7 +-
 .../pages/BulkActionResultModalPage.java        |  10 +-
 .../pages/DisplayAttributesModalPage.java       |  25 +--
 .../pages/GroupDisplayAttributesModalPage.java  |  11 +-
 .../syncope/client/console/pages/Realms.java    |   8 +-
 .../client/console/pages/ResultStatusModal.java | 168 +++++++++----------
 .../syncope/client/console/pages/Roles.java     |  25 +--
 .../client/console/pages/SecurityQuestions.java |  33 +---
 .../client/console/pages/StatusModal.java       |  14 +-
 .../syncope/client/console/pages/Types.java     | 109 +-----------
 .../pages/UserDisplayAttributesModalPage.java   |  11 +-
 .../console/panels/AbstractModalPanel.java      |  24 ++-
 .../console/panels/AbstractResourceModal.java   |   6 +-
 .../console/panels/AbstractTypesPanel.java      |  83 ++-------
 .../console/panels/ActionDataTablePanel.java    |   2 +-
 .../console/panels/AjaxDataTablePanel.java      |   6 +-
 .../console/panels/AnyTypeClassModalPanel.java  |   6 +-
 .../console/panels/AnyTypeClassesPanel.java     |  65 ++++---
 .../console/panels/AnyTypeDetailsPanel.java     |  19 +--
 .../console/panels/AnyTypeModalPanel.java       |  34 +---
 .../client/console/panels/AnyTypePanel.java     | 143 +++++++++++-----
 .../client/console/panels/ConnectorModal.java   |   2 +-
 .../client/console/panels/DataTablePanel.java   |   3 +-
 .../console/panels/FailureMessageModal.java     |   5 +-
 .../console/panels/GroupSearchResultPanel.java  |   2 +-
 .../client/console/panels/ModalPanel.java       |   5 +-
 .../console/panels/NotificationPanel.java       |   6 +-
 .../syncope/client/console/panels/Realm.java    |   7 +-
 .../client/console/panels/RealmModalPanel.java  |  14 +-
 .../panels/RelationshipTypeDetailsPanel.java    |  18 +-
 .../panels/RelationshipTypeModalPanel.java      |  36 +---
 .../console/panels/RelationshipTypePanel.java   | 144 +++++++++++-----
 .../client/console/panels/ResourceModal.java    |  62 +++----
 .../console/panels/RoleSearchResultPanel.java   |   4 +
 .../client/console/panels/SchemaModalPanel.java |   2 +-
 .../client/console/panels/SchemasPanel.java     |  38 ++++-
 .../panels/SecurityQuestionDetailsPanel.java    |   6 +-
 .../panels/SecurityQuestionModalPanel.java      |  21 ++-
 .../console/panels/SecurityQuestionsPanel.java  | 117 +++++++++----
 .../console/panels/UserSearchResultPanel.java   |  21 +--
 .../panels/search/AbstractSearchPanel.java      |  29 ----
 .../client/console/rest/ResourceRestClient.java |   2 +-
 .../client/console/topology/Topology.java       | 132 ++++++++-------
 .../console/topology/TopologyNodePanel.java     |  24 ++-
 .../markup/html/bootstrap/dialog/BaseModal.java |  27 ++-
 .../wizards/AbstractModalPanelBuilder.java      |  86 ++++++++++
 .../client/console/wizards/AjaxWizard.java      |   5 +-
 .../console/wizards/AjaxWizardBuilder.java      |  53 +-----
 .../client/console/wizards/WizardMgtPanel.java  |  42 +++--
 .../console/wizards/any/GroupWizardBuilder.java |   4 +-
 .../client/console/wizards/any/Resources.java   |   2 +-
 .../console/wizards/role/RoleWizardBuilder.java |   4 +-
 .../syncope/client/console/pages/BasePage.html  |  18 +-
 .../syncope/client/console/pages/Logs.html      |   2 +-
 .../syncope/client/console/pages/Roles.html     |   7 -
 .../client/console/pages/SecurityQuestions.html |   7 -
 .../syncope/client/console/pages/Types.html     |  24 ---
 .../console/panels/AbstractTypesPanel.html      |  40 -----
 .../console/panels/AnyTypePanel.properties      |  18 ++
 .../console/panels/AnyTypePanel_it.properties   |  18 ++
 .../panels/AnyTypePanel_pt_BR.properties        |  18 ++
 .../panels/RelationshipTypePanel.properties     |  18 ++
 .../panels/RelationshipTypePanel_it.properties  |  18 ++
 .../RelationshipTypePanel_pt_BR.properties      |  18 ++
 .../client/console/panels/SchemasPanel.html     |   5 +
 .../panels/SecurityQuestionsPanel.properties    |  18 ++
 .../panels/SecurityQuestionsPanel_it.properties |  18 ++
 .../SecurityQuestionsPanel_pt_BR.properties     |  18 ++
 .../panels/search/AbstractSearchPanel.html      |   1 -
 71 files changed, 1074 insertions(+), 937 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/pages/AbstractStatusModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/AbstractStatusModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/AbstractStatusModalPage.java
index f46ec67..20c71b7 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/AbstractStatusModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/AbstractStatusModalPage.java
@@ -18,16 +18,17 @@
  */
 package org.apache.syncope.client.console.pages;
 
+import java.io.Serializable;
 import org.apache.syncope.client.console.panels.AbstractModalPanel;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.markup.html.panel.Fragment;
 
-public class AbstractStatusModalPage extends AbstractModalPanel {
+public class AbstractStatusModalPage<T extends Serializable> extends AbstractModalPanel<T> {
 
     private static final long serialVersionUID = 6633408683036028540L;
 
-    public AbstractStatusModalPage(final BaseModal<?> modal, final PageReference pageRef) {
+    public AbstractStatusModalPage(final BaseModal<T> modal, final PageReference pageRef) {
         super(modal, pageRef);
         add(new Fragment("pwdMgtFields", "emptyFragment", this));
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/pages/AnyDisplayAttributesModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/AnyDisplayAttributesModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/AnyDisplayAttributesModalPage.java
index 1995014..ec43ddc 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/AnyDisplayAttributesModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/AnyDisplayAttributesModalPage.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.client.console.pages;
 
+import java.io.Serializable;
 import java.util.List;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
@@ -30,8 +31,7 @@ import org.apache.wicket.PageReference;
  *
  * @param <T> anyTO
  */
-@SuppressWarnings({ "unchecked", "rawtypes" })
-public class AnyDisplayAttributesModalPage<T extends AnyTO> extends DisplayAttributesModalPage {
+public class AnyDisplayAttributesModalPage<T extends Serializable> extends DisplayAttributesModalPage<T> {
 
     private static final long serialVersionUID = 5194630813773543054L;
 
@@ -40,7 +40,7 @@ public class AnyDisplayAttributesModalPage<T extends AnyTO> extends DisplayAttri
     private final String type;
 
     public AnyDisplayAttributesModalPage(
-            final BaseModal<?> modal,
+            final BaseModal<T> modal,
             final PageReference pageRef,
             final List<String> schemaNames,
             final List<String> dSchemaNames,
@@ -66,7 +66,7 @@ public class AnyDisplayAttributesModalPage<T extends AnyTO> extends DisplayAttri
     }
 
     @Override
-    public Class getTOClass() {
+    public Class<? extends AnyTO> getTOClass() {
         return AnyObjectTO.class;
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
index 9a16098..da5aac2 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
@@ -45,12 +45,12 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.ResourceModel;
 import org.springframework.beans.BeanUtils;
 
-public class BulkActionModalPage<T, S> extends AbstractModalPanel {
+public class BulkActionModalPage<T extends Serializable, S> extends AbstractModalPanel<T> {
 
     private static final long serialVersionUID = 4114026480146090962L;
 
     public BulkActionModalPage(
-            final BaseModal<?> modal,
+            final BaseModal<T> modal,
             final PageReference pageRef,
             final Collection<T> items,
             final List<IColumn<T, S>> columns,
@@ -88,8 +88,7 @@ public class BulkActionModalPage<T, S> extends AbstractModalPanel {
                 Integer.MAX_VALUE).setVisible(items != null && !items.isEmpty()));
 
         @SuppressWarnings("rawtypes")
-        final ActionLinksPanel<Serializable> actionPanel =
-                ActionLinksPanel.builder(pageRef).build("actions");
+        final ActionLinksPanel<Serializable> actionPanel = ActionLinksPanel.builder(pageRef).build("actions");
         add(actionPanel);
 
         for (ActionLink.ActionType action : actions) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionResultModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionResultModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionResultModalPage.java
index c659ddc..aa6a63e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionResultModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionResultModalPage.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.client.console.pages;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
@@ -39,15 +40,14 @@ import org.apache.wicket.model.IModel;
 /**
  * Show user or group status after performing a successful operation.
  *
- * @param <T> type of the object that will be rendered in columns
- * @param <S> type of the sorting parameter
+ * @param <E> type of the inner model object
  */
-public class BulkActionResultModalPage<T, S> extends AbstractModalPanel {
+public class BulkActionResultModalPage<E extends Serializable> extends AbstractModalPanel<E> {
 
     private static final long serialVersionUID = 2646115294319713724L;
 
-    public BulkActionResultModalPage(
-            final BaseModal<?> modal,
+    public <T extends Serializable, S> BulkActionResultModalPage(
+            final BaseModal<E> modal,
             final PageReference pageRef,
             final Collection<T> items,
             final List<IColumn<T, S>> columns,

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/pages/DisplayAttributesModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/DisplayAttributesModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/DisplayAttributesModalPage.java
index a6c0298..a1ea8b9 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/DisplayAttributesModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/DisplayAttributesModalPage.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.client.console.pages;
 
+import java.io.Serializable;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -49,8 +50,7 @@ import org.apache.wicket.model.ResourceModel;
  *
  * @param <T> anyTO
  */
-@SuppressWarnings({ "unchecked", "rawtypes" })
-public abstract class DisplayAttributesModalPage<T extends AnyTO> extends AbstractModalPanel {
+public abstract class DisplayAttributesModalPage<T extends Serializable> extends AbstractModalPanel<T> {
 
     private static final long serialVersionUID = -4274117450918385110L;
 
@@ -105,8 +105,8 @@ public abstract class DisplayAttributesModalPage<T extends AnyTO> extends Abstra
             }
         };
 
-        final Form form = new Form(FORM);
-        form.setModel(new CompoundPropertyModel(this));
+        final Form<DisplayAttributesModalPage<T>> form = new Form<>(FORM);
+        form.setModel(new CompoundPropertyModel<>(this));
 
         selectedDetails = prefMan.getList(getRequest(), getPrefDetailView());
 
@@ -114,7 +114,8 @@ public abstract class DisplayAttributesModalPage<T extends AnyTO> extends Abstra
 
         selectedDerSchemas = prefMan.getList(getRequest(), getPrefDerivedAttributeView());
 
-        final CheckGroup dgroup = new CheckGroup("dCheckGroup", new PropertyModel(this, "selectedDetails"));
+        final CheckGroup<String> dgroup
+                = new CheckGroup<>("dCheckGroup", new PropertyModel<List<String>>(this, "selectedDetails"));
         form.add(dgroup);
 
         final ListView<String> details = new ListView<String>("details", fnames) {
@@ -123,7 +124,7 @@ public abstract class DisplayAttributesModalPage<T extends AnyTO> extends Abstra
 
             @Override
             protected void populateItem(final ListItem<String> item) {
-                item.add(new Check("dcheck", item.getModel()));
+                item.add(new Check<>("dcheck", item.getModel()));
                 item.add(new Label("dname", new ResourceModel(item.getModelObject(), item.getModelObject())));
             }
         };
@@ -138,7 +139,8 @@ public abstract class DisplayAttributesModalPage<T extends AnyTO> extends Abstra
             final Fragment fragment = new Fragment("plainSchemas", "sfragment", form);
             form.add(fragment);
 
-            final CheckGroup sgroup = new CheckGroup("psCheckGroup", new PropertyModel(this, "selectedPlainSchemas"));
+            final CheckGroup<String> sgroup
+                    = new CheckGroup<>("psCheckGroup", new PropertyModel<List<String>>(this, "selectedPlainSchemas"));
             fragment.add(sgroup);
 
             final ListView<String> schemas = new ListView<String>("plainSchemas", names) {
@@ -147,7 +149,7 @@ public abstract class DisplayAttributesModalPage<T extends AnyTO> extends Abstra
 
                 @Override
                 protected void populateItem(final ListItem<String> item) {
-                    item.add(new Check("scheck", item.getModel()));
+                    item.add(new Check<>("scheck", item.getModel()));
                     item.add(new Label("sname", new ResourceModel(item.getModelObject(), item.getModelObject())));
                 }
             };
@@ -163,7 +165,8 @@ public abstract class DisplayAttributesModalPage<T extends AnyTO> extends Abstra
             final Fragment fragment = new Fragment("dschemas", "dsfragment", form);
             form.add(fragment);
 
-            final CheckGroup dsgroup = new CheckGroup("dsCheckGroup", new PropertyModel(this, "selectedDerSchemas"));
+            final CheckGroup<String> dsgroup
+                    = new CheckGroup<>("dsCheckGroup", new PropertyModel<List<String>>(this, "selectedDerSchemas"));
             fragment.add(dsgroup);
 
             final ListView<String> derSchemas = new ListView<String>("derSchemas", dsnames) {
@@ -172,7 +175,7 @@ public abstract class DisplayAttributesModalPage<T extends AnyTO> extends Abstra
 
                 @Override
                 protected void populateItem(final ListItem<String> item) {
-                    item.add(new Check("dscheck", item.getModel()));
+                    item.add(new Check<>("dscheck", item.getModel()));
                     item.add(new Label("dsname", new ResourceModel(item.getModelObject(), item.getModelObject())));
                 }
             };
@@ -237,6 +240,6 @@ public abstract class DisplayAttributesModalPage<T extends AnyTO> extends Abstra
 
     public abstract String getPrefDerivedAttributeView();
 
-    public abstract Class getTOClass();
+    public abstract Class<? extends AnyTO> getTOClass();
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/pages/GroupDisplayAttributesModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/GroupDisplayAttributesModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/GroupDisplayAttributesModalPage.java
index 09dbb06..6167c99 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/GroupDisplayAttributesModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/GroupDisplayAttributesModalPage.java
@@ -18,24 +18,27 @@
  */
 package org.apache.syncope.client.console.pages;
 
+import java.io.Serializable;
 import java.util.List;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.wicket.PageReference;
 
 /**
  * Modal window with Display group attributes form.
+ *
+ * @param <T>
  */
-@SuppressWarnings({ "unchecked", "rawtypes" })
-public class GroupDisplayAttributesModalPage extends DisplayAttributesModalPage {
+public class GroupDisplayAttributesModalPage<T extends Serializable> extends DisplayAttributesModalPage<T> {
 
     private static final long serialVersionUID = 5194630813773543054L;
 
     public static final String[] GROUP_DEFAULT_SELECTION = { "key", "name" };
 
     public GroupDisplayAttributesModalPage(
-            final BaseModal<?> modal,
+            final BaseModal<T> modal,
             final PageReference pageRef,
             final List<String> schemaNames,
             final List<String> dSchemaNames) {
@@ -58,7 +61,7 @@ public class GroupDisplayAttributesModalPage extends DisplayAttributesModalPage
     }
 
     @Override
-    public Class getTOClass() {
+    public Class<? extends AnyTO> getTOClass() {
         return GroupTO.class;
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
index 19c3e0a..25a2064 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
@@ -73,7 +73,6 @@ public class Realms extends BasePage {
             public void onClose(final AjaxRequestTarget target) {
                 target.add(realmSidebarPanel.reloadRealmTree());
                 target.add(updateRealmContent(realmSidebarPanel.getCurrentRealm()));
-
                 modal.show(false);
             }
         });
@@ -148,12 +147,13 @@ public class Realms extends BasePage {
                     realmRestClient.delete(realmTO.getFullPath());
                     target.add(realmSidebarPanel.reloadRealmTree());
                     target.add(updateRealmContent(realmSidebarPanel.getCurrentRealm()));
-                    info(getString(Constants.OPERATION_SUCCEEDED));
+                    getSession().info(getString(Constants.OPERATION_SUCCEEDED));
                 } catch (Exception e) {
                     LOG.error("While deleting realm", e);
-                    error(getString(Constants.ERROR) + ": " + e.getMessage());
+                    // Excape line breaks
+                    getSession().error(getString(Constants.ERROR) + ": " + e.getMessage().replace("\n", " "));
                 }
-                BasePage.class.cast(getPage()).getNotificationPanel().refresh(target);
+                getNotificationPanel().refresh(target);
             }
         });
         return content;

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/pages/ResultStatusModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/ResultStatusModal.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/ResultStatusModal.java
index bd90381..9507941 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/ResultStatusModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/ResultStatusModal.java
@@ -64,7 +64,7 @@ import org.apache.wicket.request.resource.ContextRelativeResource;
  *
  * @param <T> anyTO
  */
-public final class ResultStatusModal<T extends AnyTO> extends AbstractModalPanel {
+public final class ResultStatusModal<T extends AnyTO> extends AbstractModalPanel<T> {
 
     private static final long serialVersionUID = 2646115294319713723L;
 
@@ -157,87 +157,87 @@ public final class ResultStatusModal<T extends AnyTO> extends AbstractModalPanel
             final ListView<PropagationStatus> propRes = new ListView<PropagationStatus>("resources",
                     propagations) {
 
-                        private static final long serialVersionUID = -1020475259727720708L;
+                private static final long serialVersionUID = -1020475259727720708L;
+
+                @Override
+                protected void populateItem(final ListItem<PropagationStatus> item) {
+                    final PropagationStatus propTO = (PropagationStatus) item.getDefaultModelObject();
+
+                    final ListView<String> attributes = getConnObjectView(propTO);
+
+                    final Fragment attrhead;
+                    if (attributes.getModelObject() == null || attributes.getModelObject().isEmpty()) {
+                        attrhead = new Fragment("attrhead", "emptyAttrHeadFrag", this);
+                    } else {
+                        attrhead = new Fragment("attrhead", "attrHeadFrag", this);
+                    }
+
+                    item.add(attrhead);
+                    item.add(attributes);
+
+                    attrhead.add(new Label("resource", propTO.getResource()));
+
+                    attrhead.add(new Label("propagation", propTO.getStatus() == null
+                            ? "UNDEFINED" : propTO.getStatus().toString()));
+
+                    final Image image;
+                    final String alt, title;
+
+                    final BaseModal<T> failureWindow = new BaseModal<>("failureWindow");
+
+                    final AjaxLink<?> failureWindowLink = new AjaxLink<Void>("showFailureWindow") {
+
+                        private static final long serialVersionUID = -7978723352517770644L;
 
                         @Override
-                        protected void populateItem(final ListItem<PropagationStatus> item) {
-                            final PropagationStatus propTO = (PropagationStatus) item.getDefaultModelObject();
-
-                            final ListView<String> attributes = getConnObjectView(propTO);
-
-                            final Fragment attrhead;
-                            if (attributes.getModelObject() == null || attributes.getModelObject().isEmpty()) {
-                                attrhead = new Fragment("attrhead", "emptyAttrHeadFrag", this);
-                            } else {
-                                attrhead = new Fragment("attrhead", "attrHeadFrag", this);
-                            }
-
-                            item.add(attrhead);
-                            item.add(attributes);
-
-                            attrhead.add(new Label("resource", propTO.getResource()));
-
-                            attrhead.add(new Label("propagation", propTO.getStatus() == null
-                                                    ? "UNDEFINED" : propTO.getStatus().toString()));
-
-                            final Image image;
-                            final String alt, title;
-
-                            final BaseModal<?> failureWindow = new BaseModal<>("failureWindow");
-
-                            final AjaxLink<?> failureWindowLink = new AjaxLink<Void>("showFailureWindow") {
-
-                                private static final long serialVersionUID = -7978723352517770644L;
-
-                                @Override
-                                public void onClick(final AjaxRequestTarget target) {
-                                    failureWindow.show(target);
-                                }
-                            };
-
-                            switch (propTO.getStatus()) {
-
-                                case SUCCESS:
-                                case CREATED:
-                                    image = new Image("icon",
-                                            new ContextRelativeResource(IMG_PREFIX + Status.ACTIVE.toString()
-                                                    + Constants.PNG_EXT));
-                                    alt = "success icon";
-                                    title = "success";
-                                    failureWindow.setVisible(false);
-                                    failureWindowLink.setEnabled(false);
-                                    break;
-
-                                default:
-                                    image = new Image("icon",
-                                            new ContextRelativeResource(IMG_PREFIX + Status.SUSPENDED.toString()
-                                                    + Constants.PNG_EXT));
-                                    alt = "failure icon";
-                                    title = "failure";
-                            }
-
-                            image.add(new Behavior() {
-
-                                private static final long serialVersionUID = 1469628524240283489L;
-
-                                @Override
-                                public void onComponentTag(final Component component, final ComponentTag tag) {
-                                    tag.put("alt", alt);
-                                    tag.put("title", title);
-                                }
-                            });
-                            final FailureMessageModal executionFailureMessagePage;
-                            if (propTO.getFailureReason() == null) {
-                                executionFailureMessagePage = new FailureMessageModal(
-                                        modal, pageRef, StringUtils.EMPTY);
-                            } else {
-                                executionFailureMessagePage = new FailureMessageModal(
-                                        modal, pageRef, propTO.getFailureReason());
-                            }
-
-                            failureWindow.setContent(executionFailureMessagePage);
+                        public void onClick(final AjaxRequestTarget target) {
+                            failureWindow.show(target);
                         }
                     };
+
+                    switch (propTO.getStatus()) {
+
+                        case SUCCESS:
+                        case CREATED:
+                            image = new Image("icon",
+                                    new ContextRelativeResource(IMG_PREFIX + Status.ACTIVE.toString()
+                                            + Constants.PNG_EXT));
+                            alt = "success icon";
+                            title = "success";
+                            failureWindow.setVisible(false);
+                            failureWindowLink.setEnabled(false);
+                            break;
+
+                        default:
+                            image = new Image("icon",
+                                    new ContextRelativeResource(IMG_PREFIX + Status.SUSPENDED.toString()
+                                            + Constants.PNG_EXT));
+                            alt = "failure icon";
+                            title = "failure";
+                    }
+
+                    image.add(new Behavior() {
+
+                        private static final long serialVersionUID = 1469628524240283489L;
+
+                        @Override
+                        public void onComponentTag(final Component component, final ComponentTag tag) {
+                            tag.put("alt", alt);
+                            tag.put("title", title);
+                        }
+                    });
+                    final FailureMessageModal<T> executionFailureMessagePage;
+                    if (propTO.getFailureReason() == null) {
+                        executionFailureMessagePage = new FailureMessageModal<>(
+                                modal, pageRef, StringUtils.EMPTY);
+                    } else {
+                        executionFailureMessagePage = new FailureMessageModal<>(
+                                modal, pageRef, propTO.getFailureReason());
+                    }
+
+                    failureWindow.setContent(executionFailureMessagePage);
+                }
+            };
             fragment.add(propRes);
         }
 
@@ -343,14 +343,12 @@ public final class ResultStatusModal<T extends AnyTO> extends AbstractModalPanel
 
         if (attr == null || attr.getValues() == null || attr.getValues().isEmpty()) {
             value = "";
+        } else if (ConnIdSpecialAttributeName.PASSWORD.equals(attrName)) {
+            value = "********";
         } else {
-            if (ConnIdSpecialAttributeName.PASSWORD.equals(attrName)) {
-                value = "********";
-            } else {
-                value = attr.getValues().size() > 1
-                        ? attr.getValues().toString()
-                        : attr.getValues().get(0);
-            }
+            value = attr.getValues().size() > 1
+                    ? attr.getValues().toString()
+                    : attr.getValues().get(0);
         }
 
         Component label = new Label("value", value.length() > 50 ? value.substring(0, 50) + "..." : value).

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/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
index 7910c9a..8f7e7f1 100644
--- 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
@@ -18,20 +18,12 @@
  */
 package org.apache.syncope.client.console.pages;
 
-import static org.apache.wicket.Component.ENABLE;
-
 import org.apache.syncope.client.console.panels.RoleSearchResultPanel;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
-import org.apache.syncope.client.console.wizards.AjaxWizard;
 import org.apache.syncope.client.console.wizards.WizardMgtPanel;
 import org.apache.syncope.client.console.wizards.role.RoleHandler;
 import org.apache.syncope.client.console.wizards.role.RoleWizardBuilder;
 import org.apache.syncope.common.lib.to.RoleTO;
-import org.apache.syncope.common.lib.types.StandardEntitlement;
-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.event.Broadcast;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.model.Model;
@@ -54,21 +46,8 @@ public class Roles extends BasePage {
 
             private static final long serialVersionUID = -5960765294082359003L;
 
-        }.addNewItemPanelBuilder(new RoleWizardBuilder(BaseModal.CONTENT_ID, new RoleTO(), getPageReference()), false).
-                build("roles");
-
-        final AjaxLink<RoleTO> createLink = new AjaxLink<RoleTO>("add") {
-
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            public void onClick(final AjaxRequestTarget target) {
-                send(roleSearchResultPanel, Broadcast.EXACT, new AjaxWizard.NewItemActionEvent<RoleTO>(null, target));
-            }
-        };
-
-        content.add(createLink);
-        MetaDataRoleAuthorizationStrategy.authorize(createLink, ENABLE, StandardEntitlement.ROLE_CREATE);
+        }.addNewItemPanelBuilder(new RoleWizardBuilder(BaseModal.CONTENT_ID, new RoleTO(), getPageReference()), true)
+                .build("roles");
 
         content.add(roleSearchResultPanel);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/pages/SecurityQuestions.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/SecurityQuestions.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/SecurityQuestions.java
index 6b0df50..83686bc 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/SecurityQuestions.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/SecurityQuestions.java
@@ -18,21 +18,13 @@
  */
 package org.apache.syncope.client.console.pages;
 
-import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
-import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.console.panels.SecurityQuestionModalPanel;
 import org.apache.syncope.client.console.panels.SecurityQuestionsPanel;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.common.lib.to.SecurityQuestionTO;
-import org.apache.syncope.common.lib.types.StandardEntitlement;
 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.IndicatingAjaxLink;
 import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 
 public class SecurityQuestions extends BasePage {
@@ -55,30 +47,7 @@ public class SecurityQuestions extends BasePage {
         addWindowWindowClosedCallback(securityQuestionModal);
         add(securityQuestionModal);
 
-        final AjaxLink<Void> createLink = new IndicatingAjaxLink<Void>("createSecurityQuestion") {
-
-            private static final long serialVersionUID = -7978723352517770644L;
-
-            @Override
-            public void onClick(final AjaxRequestTarget target) {
-                securityQuestionModal.header(new ResourceModel("createSecurityQuestion"));
-                securityQuestionModal.setFormModel(new SecurityQuestionTO());
-                securityQuestionModal.size(Modal.Size.Large);
-                target.add(securityQuestionModal.setContent(
-                        new SecurityQuestionModalPanel(securityQuestionModal, getPageReference(), true)));
-                securityQuestionModal.addSumbitButton();
-                securityQuestionModal.show(true);
-            }
-        };
-        content.add(createLink);
-
-        if (SyncopeConsoleSession.get().owns(StandardEntitlement.SECURITY_QUESTION_CREATE)) {
-            MetaDataRoleAuthorizationStrategy.authorize(
-                    createLink, ENABLE, StandardEntitlement.SECURITY_QUESTION_CREATE);
-        }
-
-        securityQuestionsPanel = new SecurityQuestionsPanel(
-                "securityQuestionPanel", getPageReference(), securityQuestionModal);
+        securityQuestionsPanel = new SecurityQuestionsPanel("securityQuestionPanel", getPageReference());
         securityQuestionsPanel.setOutputMarkupId(true);
 
         content.add(securityQuestionsPanel);

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/pages/StatusModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/StatusModal.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/StatusModal.java
index d59088a..5718dab 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/StatusModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/StatusModal.java
@@ -64,7 +64,7 @@ import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.model.StringResourceModel;
 
-public class StatusModal<T extends AnyTO> extends AbstractStatusModalPage {
+public class StatusModal<T extends Serializable> extends AbstractStatusModalPage<T> {
 
     private static final long serialVersionUID = -9148734710505211261L;
 
@@ -103,15 +103,15 @@ public class StatusModal<T extends AnyTO> extends AbstractStatusModalPage {
     private final List<IColumn<StatusBean, String>> columns;
 
     public StatusModal(
-            final BaseModal<?> modal,
+            final BaseModal<T> modal,
             final PageReference pageRef,
-            final AnyTO attributableTO) {
+            final AnyTO anyTO) {
 
-        this(modal, pageRef, attributableTO, false);
+        this(modal, pageRef, anyTO, false);
     }
 
     public StatusModal(
-            final BaseModal<?> modal,
+            final BaseModal<T> modal,
             final PageReference pageRef,
             final AnyTO anyTO,
             final boolean statusOnly) {
@@ -547,8 +547,8 @@ public class StatusModal<T extends AnyTO> extends AbstractStatusModalPage {
             final ResourceAssociationAction type,
             final Collection<StatusBean> selection) {
 
-        final IndicatingAjaxButton goon =
-                new IndicatingAjaxButton("continue", new ResourceModel("continue", "Continue")) {
+        final IndicatingAjaxButton goon
+                = new IndicatingAjaxButton("continue", new ResourceModel("continue", "Continue")) {
 
             private static final long serialVersionUID = -2341391430136818027L;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/pages/Types.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Types.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Types.java
index f1d2bbb..4869a98 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/Types.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Types.java
@@ -18,39 +18,24 @@
  */
 package org.apache.syncope.client.console.pages;
 
-import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import de.agilecoders.wicket.core.markup.html.bootstrap.tabs.AjaxBootstrapTabbedPanel;
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.console.panels.AnyTypeClassModalPanel;
 import org.apache.syncope.client.console.panels.AnyTypeClassesPanel;
-import org.apache.syncope.client.console.panels.AnyTypeModalPanel;
 import org.apache.syncope.client.console.panels.AnyTypePanel;
-import org.apache.syncope.client.console.panels.ModalPanel;
-import org.apache.syncope.client.console.panels.RelationshipTypeModalPanel;
 import org.apache.syncope.client.console.panels.RelationshipTypePanel;
 import org.apache.syncope.client.console.panels.SchemasPanel;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.common.lib.to.AbstractSchemaTO;
 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.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.basic.Label;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.syncope.client.console.panels.SchemaModalPanel;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
-import org.apache.syncope.common.lib.to.AnyTypeTO;
-import org.apache.syncope.common.lib.to.PlainSchemaTO;
-import org.apache.syncope.common.lib.to.RelationshipTypeTO;
-import org.apache.syncope.common.lib.types.StandardEntitlement;
-import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink;
 import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 
 public class Types extends BasePage {
@@ -61,10 +46,6 @@ public class Types extends BasePage {
 
     private final BaseModal<AnyTypeClassTO> anyTypeClassModal;
 
-    private final BaseModal<AnyTypeTO> anyTypeModal;
-
-    private final BaseModal<RelationshipTypeTO> relationshipTypeModal;
-
     private final AjaxBootstrapTabbedPanel<ITab> tabbedPanel;
 
     private enum Type {
@@ -72,6 +53,7 @@ public class Types extends BasePage {
         ANYTYPECLASS,
         ANYTYPE,
         RELATIONSHIPTYPE;
+
     }
 
     public Types(final PageParameters parameters) {
@@ -79,8 +61,6 @@ public class Types extends BasePage {
 
         this.schemaModal = new BaseModal<>("schemaModal");
         this.anyTypeClassModal = new BaseModal<>("anyTypeClassModal");
-        this.anyTypeModal = new BaseModal<>("anyTypeModal");
-        this.relationshipTypeModal = new BaseModal<>("relationshipTypeModal");
 
         final WebMarkupContainer content = new WebMarkupContainer("content");
         content.add(new Label("header", "Types"));
@@ -88,50 +68,11 @@ public class Types extends BasePage {
         tabbedPanel = new AjaxBootstrapTabbedPanel<>("tabbedPanel", buildTabList());
         content.add(tabbedPanel);
 
-        final AjaxLink<Void> createSchemaLink =
-                buildCreateLink("createSchema", schemaModal, Type.SCHEMA);
-        content.add(createSchemaLink);
-
-        if (SyncopeConsoleSession.get().owns(StandardEntitlement.SCHEMA_CREATE)) {
-            MetaDataRoleAuthorizationStrategy.authorize(createSchemaLink, ENABLE, StandardEntitlement.SCHEMA_CREATE);
-        }
-
-        final AjaxLink<Void> createAnyTypeClassLink =
-                buildCreateLink("createAnyTypeClass", anyTypeClassModal, Type.ANYTYPECLASS);
-        content.add(createAnyTypeClassLink);
-
-        if (SyncopeConsoleSession.get().owns(StandardEntitlement.ANYTYPECLASS_CREATE)) {
-            MetaDataRoleAuthorizationStrategy.authorize(
-                    createAnyTypeClassLink, ENABLE, StandardEntitlement.ANYTYPECLASS_CREATE);
-        }
-
-        final AjaxLink<Void> createAnyTypeLink =
-                buildCreateLink("createAnyType", anyTypeModal, Type.ANYTYPE);
-        content.add(createAnyTypeLink);
-
-        if (SyncopeConsoleSession.get().owns(StandardEntitlement.ANYTYPE_CREATE)) {
-            MetaDataRoleAuthorizationStrategy.authorize(
-                    createAnyTypeLink, ENABLE, StandardEntitlement.ANYTYPE_CREATE);
-        }
-
-        final AjaxLink<Void> createRelationshipTypeLink =
-                buildCreateLink("createRelationshipType", relationshipTypeModal, Type.RELATIONSHIPTYPE);
-        content.add(createRelationshipTypeLink);
-
-        if (SyncopeConsoleSession.get().owns(StandardEntitlement.RELATIONSHIPTYPE_CREATE)) {
-            MetaDataRoleAuthorizationStrategy.authorize(
-                    createRelationshipTypeLink, ENABLE, StandardEntitlement.RELATIONSHIPTYPE_CREATE);
-        }
-
         add(content);
         addWindowWindowClosedCallback(schemaModal);
         addWindowWindowClosedCallback(anyTypeClassModal);
-        addWindowWindowClosedCallback(anyTypeModal);
-        addWindowWindowClosedCallback(relationshipTypeModal);
         add(schemaModal);
         add(anyTypeClassModal);
-        add(anyTypeModal);
-        add(relationshipTypeModal);
     }
 
     private List<ITab> buildTabList() {
@@ -144,7 +85,7 @@ public class Types extends BasePage {
 
             @Override
             public Panel getPanel(final String panelId) {
-                return new RelationshipTypePanel(panelId, getPageReference(), relationshipTypeModal);
+                return new RelationshipTypePanel(panelId, getPageReference());
             }
         });
 
@@ -154,7 +95,7 @@ public class Types extends BasePage {
 
             @Override
             public Panel getPanel(final String panelId) {
-                return new AnyTypePanel(panelId, getPageReference(), anyTypeModal);
+                return new AnyTypePanel(panelId, getPageReference());
             }
         });
 
@@ -181,50 +122,6 @@ public class Types extends BasePage {
         return tabs;
     }
 
-    private AjaxLink<Void> buildCreateLink(final String label, final BaseModal<?> modal, final Type type) {
-
-        final AjaxLink<Void> createLink = new IndicatingAjaxLink<Void>(label) {
-
-            private static final long serialVersionUID = -7978723352517770644L;
-
-            @Override
-            public void onClick(final AjaxRequestTarget target) {
-                modal.header(new ResourceModel(label));
-                target.add(modal.setContent(buildModalPanel(type)));
-                modal.addSumbitButton();
-                modal.show(true);
-            }
-        };
-
-        return createLink;
-    }
-
-    private ModalPanel buildModalPanel(final Type type) {
-        final ModalPanel panel;
-        switch (type) {
-            case ANYTYPECLASS:
-                anyTypeClassModal.setFormModel(new AnyTypeClassTO());
-                anyTypeClassModal.size(Modal.Size.Large);
-                panel = new AnyTypeClassModalPanel(anyTypeClassModal, getPageReference(), true);
-                break;
-            case ANYTYPE:
-                anyTypeModal.setFormModel(new AnyTypeTO());
-                anyTypeModal.size(Modal.Size.Large);
-                panel = new AnyTypeModalPanel(anyTypeModal, getPageReference(), true);
-                break;
-            case RELATIONSHIPTYPE:
-                relationshipTypeModal.setFormModel(new RelationshipTypeTO());
-                relationshipTypeModal.size(Modal.Size.Medium);
-                panel = new RelationshipTypeModalPanel(relationshipTypeModal, getPageReference(), true);
-                break;
-            case SCHEMA:
-            default:
-                schemaModal.setFormModel(new PlainSchemaTO());
-                panel = new SchemaModalPanel(schemaModal, getPageReference(), true);
-        }
-        return panel;
-    }
-
     private void addWindowWindowClosedCallback(final BaseModal<?> modal) {
         modal.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/pages/UserDisplayAttributesModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/UserDisplayAttributesModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/UserDisplayAttributesModalPage.java
index 0529f9f..307e61c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/UserDisplayAttributesModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/UserDisplayAttributesModalPage.java
@@ -18,24 +18,27 @@
  */
 package org.apache.syncope.client.console.pages;
 
+import java.io.Serializable;
 import java.util.List;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.wicket.PageReference;
 
 /**
  * Modal window with Display user attributes form.
+ *
+ * @param <T>
  */
-@SuppressWarnings({ "unchecked", "rawtypes" })
-public class UserDisplayAttributesModalPage extends DisplayAttributesModalPage {
+public class UserDisplayAttributesModalPage<T extends Serializable> extends DisplayAttributesModalPage<T> {
 
     private static final long serialVersionUID = 5194630813773543054L;
 
     public static final String[] USER_DEFAULT_SELECTION = { "key", "username", "status" };
 
     public UserDisplayAttributesModalPage(
-            final BaseModal<?> modal,
+            final BaseModal<T> modal,
             final PageReference pageRef,
             final List<String> schemaNames,
             final List<String> dSchemaNames) {
@@ -58,7 +61,7 @@ public class UserDisplayAttributesModalPage extends DisplayAttributesModalPage {
     }
 
     @Override
-    public Class getTOClass() {
+    public Class<? extends AnyTO> getTOClass() {
         return UserTO.class;
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java
index 3811873..dae4216 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java
@@ -18,8 +18,11 @@
  */
 package org.apache.syncope.client.console.panels;
 
+import java.io.Serializable;
 import org.apache.syncope.client.console.wicket.markup.head.MetaHeaderItem;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.wicket.Component;
+import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.head.HeaderItem;
@@ -30,13 +33,13 @@ import org.apache.wicket.markup.html.panel.Panel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class AbstractModalPanel extends Panel implements ModalPanel {
+public class AbstractModalPanel<T extends Serializable> extends Panel implements ModalPanel<T> {
 
     private static final long serialVersionUID = 8611724965544132636L;
 
     protected static final Logger LOG = LoggerFactory.getLogger(AbstractModalPanel.class);
 
-    protected final BaseModal<?> modal;
+    protected final BaseModal<T> modal;
 
     protected static final String CANCEL = "cancel";
 
@@ -50,13 +53,23 @@ public class AbstractModalPanel extends Panel implements ModalPanel {
 
     protected final HeaderItem meta = new MetaHeaderItem("X-UA-Compatible", "IE=edge");
 
-    public AbstractModalPanel(final BaseModal<?> modal, final PageReference pageRef) {
+    public AbstractModalPanel(final BaseModal<T> modal, final PageReference pageRef) {
         super(BaseModal.getContentId());
         this.pageRef = pageRef;
         this.modal = modal;
     }
 
     @Override
+    public final MarkupContainer add(final Component... childs) {
+        return super.add(childs);
+    }
+
+    @Override
+    public final MarkupContainer addOrReplace(final Component... childs) {
+        return super.addOrReplace(childs);
+    }
+
+    @Override
     public void renderHead(final IHeaderResponse response) {
         super.renderHead(response);
         response.render(new PriorityHeaderItem(meta));
@@ -75,4 +88,9 @@ public class AbstractModalPanel extends Panel implements ModalPanel {
     public void onError(final AjaxRequestTarget target, final Form<?> form) {
         modal.getNotificationPanel().refresh(target);
     }
+
+    @Override
+    public T getItem() {
+        return modal.getFormModel();
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractResourceModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractResourceModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractResourceModal.java
index 68fcc19..a4446ff 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractResourceModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractResourceModal.java
@@ -33,14 +33,16 @@ import org.apache.wicket.markup.html.form.Form;
 
 /**
  * Modal window with Resource form.
+ *
+ * @param <T>
  */
-public abstract class AbstractResourceModal extends AbstractModalPanel {
+public abstract class AbstractResourceModal<T extends Serializable> extends AbstractModalPanel<T> {
 
     private static final long serialVersionUID = 1734415311027284221L;
 
     protected final List<ITab> tabs;
 
-    public AbstractResourceModal(final BaseModal<?> modal, final PageReference pageRef) {
+    public AbstractResourceModal(final BaseModal<T> modal, final PageReference pageRef) {
         super(modal, pageRef);
 
         this.tabs = new ArrayList<>();

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractTypesPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractTypesPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractTypesPanel.java
index cad794e..fd9f547 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractTypesPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractTypesPanel.java
@@ -18,83 +18,20 @@
  */
 package org.apache.syncope.client.console.panels;
 
-import java.util.List;
-import org.apache.syncope.client.console.PreferenceManager;
-import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.AjaxFallbackDataTable;
-import org.apache.syncope.client.console.wicket.markup.html.form.SelectChoiceRenderer;
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import org.apache.syncope.client.console.commons.SearchableDataProvider;
+import org.apache.syncope.client.console.rest.BaseRestClient;
 import org.apache.syncope.common.lib.AbstractBaseBean;
-import org.apache.wicket.PageReference;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
-import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
-import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.form.DropDownChoice;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.model.PropertyModel;
 
-public class AbstractTypesPanel<T extends AbstractBaseBean> extends Panel {
+public abstract class AbstractTypesPanel<T extends AbstractBaseBean, DP extends SearchableDataProvider<T>>
+        extends AbstractSearchResultPanel<T, T, DP, BaseRestClient> {
 
     private static final long serialVersionUID = 7890071604330629259L;
 
-    protected final PreferenceManager prefMan = new PreferenceManager();
-
-    protected final PageReference pageRef;
-
-    protected int pageRows;
-
-    public AbstractTypesPanel(final String id, final PageReference pageRef) {
-        super(id);
-        this.pageRef = pageRef;
-    }
-
-    protected void buildDataTable(final WebMarkupContainer container, final List<IColumn<T, String>> tableCols,
-            final SortableDataProvider<T, String> provider, final String paginatorKey) {
-
-        final WebMarkupContainer tableContainer = new WebMarkupContainer("tableContainer");
-
-        tableContainer.setOutputMarkupId(true);
-        container.add(tableContainer);
-
-        final AjaxFallbackDataTable<T, String> table =
-                new AjaxFallbackDataTable<>("datatable",
-                        tableCols, provider, pageRows, tableContainer);
-
-        table.setOutputMarkupId(true);
-        tableContainer.add(table);
-        container.add(getPaginatorForm(tableContainer, table, "paginator", this, paginatorKey));
-    }
-
-    protected Form<Void> getPaginatorForm(final WebMarkupContainer webContainer,
-            final AjaxFallbackDataTable<T, String> dataTable,
-            final String formname, final Panel panel, final String rowsPerPagePrefName) {
-
-        final Form<Void> form = new Form<>(formname);
-
-        final DropDownChoice<Integer> rowChooser = new DropDownChoice<>("rowsChooser",
-                new PropertyModel<Integer>(panel, "pageRows"), prefMan.getPaginatorChoices(),
-                new SelectChoiceRenderer<Integer>());
-
-        rowChooser.add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
-
-            private static final long serialVersionUID = -1107858522700306810L;
-
-            @Override
-            protected void onUpdate(final AjaxRequestTarget target) {
-                prefMan.set(getRequest(), getResponse(), rowsPerPagePrefName, rowChooser.getInput());
-                dataTable.setItemsPerPage(rowChooser.getModelObject());
-                target.add(webContainer);
-            }
-        });
-
-        form.add(rowChooser);
-        return form;
-    }
-
-    protected int getPageRows() {
-        return pageRows;
+    public AbstractTypesPanel(final String id, final Builder<T, T, BaseRestClient> builder) {
+        super(id, builder);
+        setFooterVisibility(true);
+        modal.addSumbitButton();
+        modal.size(Modal.Size.Large);
     }
 }
-

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
index 8c063b2..65e9ca1 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
@@ -40,7 +40,7 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.model.ResourceModel;
 
-public class ActionDataTablePanel<T, S> extends DataTablePanel<T, S> {
+public class ActionDataTablePanel<T extends Serializable, S> extends DataTablePanel<T, S> {
 
     private static final long serialVersionUID = -8826989026203543957L;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
index f740fc3..6a5b596 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
@@ -45,11 +45,11 @@ import org.apache.wicket.markup.html.form.CheckGroup;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.panel.Fragment;
 
-public final class AjaxDataTablePanel<T, S> extends DataTablePanel<T, S> {
+public final class AjaxDataTablePanel<T extends Serializable, S> extends DataTablePanel<T, S> {
 
     private static final long serialVersionUID = -7264400471578272966L;
 
-    public static class Builder<T, S> implements Serializable {
+    public static class Builder<T extends Serializable, S> implements Serializable {
 
         private static final long serialVersionUID = 8876232177473972722L;
 
@@ -148,7 +148,7 @@ public final class AjaxDataTablePanel<T, S> extends DataTablePanel<T, S> {
 
         super(id);
 
-        final BaseModal<?> bulkModalWin = new BaseModal<>("bulkModal");
+        final BaseModal<T> bulkModalWin = new BaseModal<>("bulkModal");
         add(bulkModalWin);
 
         bulkModalWin.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassModalPanel.java
index a5eae89..02063f3 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassModalPanel.java
@@ -30,7 +30,7 @@ import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.PropertyModel;
 
-public class AnyTypeClassModalPanel extends AbstractModalPanel {
+public class AnyTypeClassModalPanel extends AbstractModalPanel<AnyTypeClassTO> {
 
     private static final long serialVersionUID = 1086997609984272599L;
 
@@ -51,8 +51,8 @@ public class AnyTypeClassModalPanel extends AbstractModalPanel {
         antTypeClassForm.setModel(new CompoundPropertyModel<>(anyTypeClassTO));
         antTypeClassForm.setOutputMarkupId(true);
 
-        final AjaxTextFieldPanel key =
-                new AjaxTextFieldPanel("key", getString("key"), new PropertyModel<String>(anyTypeClassTO, "key"));
+        final AjaxTextFieldPanel key = new AjaxTextFieldPanel("key", getString("key"), new PropertyModel<String>(
+                anyTypeClassTO, "key"));
         key.addRequiredLabel();
         key.setEnabled(anyTypeClassTO.getKey() == null || anyTypeClassTO.getKey().isEmpty());
         antTypeClassForm.add(key);

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
index f5dba79..1948904 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.client.console.panels;
 
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import java.io.Serializable;
 import java.util.List;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
@@ -38,6 +39,7 @@ import org.apache.wicket.markup.html.form.ListChoice;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
+import org.apache.wicket.model.ResourceModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -53,7 +55,6 @@ public class AnyTypeClassesPanel extends Panel {
 
     public AnyTypeClassesPanel(final String id, final PageReference pageRef, final BaseModal<AnyTypeClassTO> modal) {
         super(id);
-
         this.setOutputMarkupId(true);
 
         final WebMarkupContainer container = new WebMarkupContainer("container");
@@ -124,6 +125,20 @@ public class AnyTypeClassesPanel extends Panel {
 
             @Override
             public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
+                modal.header(new ResourceModel("createAnyTypeClass"));
+                modal.setFormModel(new AnyTypeClassTO());
+                modal.size(Modal.Size.Large);
+                target.add(modal.setContent(new AnyTypeClassModalPanel(modal, pageRef, true)));
+                modal.addSumbitButton();
+                modal.show(true);
+            }
+        }, ActionLink.ActionType.CREATE, StandardEntitlement.ANYTYPECLASS_CREATE).addWithRoles(
+                new ActionLink<Serializable>() {
+
+            private static final long serialVersionUID = -3722207913631435501L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
                 if (anyTypeClasses != null && anyTypeClasses.getModelObject() != null) {
                     modal.header(Model.of(anyTypeClasses.getModelObject().getKey()));
                     modal.setFormModel(anyTypeClasses.getModelObject());
@@ -133,30 +148,32 @@ public class AnyTypeClassesPanel extends Panel {
                 }
             }
         }, ActionLink.ActionType.EDIT, StandardEntitlement.ANYTYPECLASS_UPDATE).addWithRoles(
-                new ActionLink<Serializable>() {
-
-            private static final long serialVersionUID = -3722207913631435501L;
-
-            @Override
-            public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
-                try {
-                    if (anyTypeClasses != null && anyTypeClasses.getModelObject() != null) {
-                        SyncopeConsoleSession.get()
-                                .getService(AnyTypeClassService.class).delete(anyTypeClasses.getModelObject().getKey());
-                        anyTypeClasses.setModelObject(null);
-                        anyTypeClasses.setChoices(SyncopeConsoleSession.get().getService(AnyTypeClassService.class).
-                                list());
-                        target.add(anyTypeClasses);
-                        target.add(updateAnyTypeClassDetails(new AnyTypeClassTO(), true));
-                        info(getString(Constants.OPERATION_SUCCEEDED));
+                        new ActionLink<Serializable>() {
+
+                    private static final long serialVersionUID = -3722207913631435501L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
+                        try {
+                            if (anyTypeClasses != null && anyTypeClasses.getModelObject() != null) {
+                                SyncopeConsoleSession.get()
+                                        .getService(AnyTypeClassService.class).delete(anyTypeClasses.getModelObject().
+                                        getKey());
+                                anyTypeClasses.setModelObject(null);
+                                anyTypeClasses.setChoices(SyncopeConsoleSession.get().getService(
+                                        AnyTypeClassService.class).
+                                        list());
+                                target.add(anyTypeClasses);
+                                target.add(updateAnyTypeClassDetails(new AnyTypeClassTO(), true));
+                                info(getString(Constants.OPERATION_SUCCEEDED));
+                            }
+                        } catch (Exception e) {
+                            LOG.error("While deleting AnyTypeClass", e);
+                            error(getString(Constants.ERROR) + ": " + e.getMessage());
+                        }
+                        ((AbstractBasePage) getPage()).getNotificationPanel().refresh(target);
                     }
-                } catch (Exception e) {
-                    LOG.error("While deleting AnyTypeClass", e);
-                    error(getString(Constants.ERROR) + ": " + e.getMessage());
-                }
-                ((AbstractBasePage) getPage()).getNotificationPanel().refresh(target);
-            }
-        }, ActionLink.ActionType.DELETE, StandardEntitlement.ANYTYPECLASS_DELETE);
+                }, ActionLink.ActionType.DELETE, StandardEntitlement.ANYTYPECLASS_DELETE);
 
         container.add(actionLinks.build("editRemove"));
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeDetailsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeDetailsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeDetailsPanel.java
index f5d5a97..8bda922 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeDetailsPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeDetailsPanel.java
@@ -24,7 +24,6 @@ import java.util.List;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Transformer;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
@@ -43,32 +42,30 @@ public class AnyTypeDetailsPanel extends Panel {
 
     private static final long serialVersionUID = 8131650329622035501L;
 
-    private final AnyTypeTO anyTypeTO;
-
-    public AnyTypeDetailsPanel(final String id, final BaseModal<AnyTypeTO> modal) {
+    public AnyTypeDetailsPanel(final String id, final AnyTypeTO anyTypeTO) {
         super(id);
 
-        this.anyTypeTO = modal.getFormModel();
-
         final WebMarkupContainer container = new WebMarkupContainer("container");
         container.setOutputMarkupId(true);
         add(container);
 
         final Form<AnyTypeTO> form = new Form<>("form");
-        form.setModel(new CompoundPropertyModel<>(this.anyTypeTO));
+        form.setModel(new CompoundPropertyModel<>(anyTypeTO));
         container.add(form);
 
-        final AjaxTextFieldPanel key =
-                new AjaxTextFieldPanel("key", getString("key"), new PropertyModel<String>(this.anyTypeTO, "key"));
+        final AjaxTextFieldPanel key
+                = new AjaxTextFieldPanel("key", getString("key"), new PropertyModel<String>(anyTypeTO, "key"));
         key.addRequiredLabel();
         key.setEnabled(key.getModelObject() == null || key.getModelObject().isEmpty());
         form.add(key);
 
         final AjaxDropDownChoicePanel<AnyTypeKind> kind = new AjaxDropDownChoicePanel<>(
-                "kind", getString("kind"), new PropertyModel<AnyTypeKind>(this.anyTypeTO, "kind"));
+                "kind", getString("kind"), new PropertyModel<AnyTypeKind>(anyTypeTO, "kind"));
         kind.setChoices(Arrays.asList(AnyTypeKind.values()));
-        kind.setModelObject(AnyTypeKind.ANY_OBJECT);
         kind.setOutputMarkupId(true);
+        if (anyTypeTO.getKind() == null) {
+            kind.setModelObject(AnyTypeKind.ANY_OBJECT);
+        }
         kind.setEnabled(false);
         form.add(kind);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeModalPanel.java
index 76acff0..0ec02d0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeModalPanel.java
@@ -18,44 +18,24 @@
  */
 package org.apache.syncope.client.console.panels;
 
-import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.common.lib.to.AnyTypeTO;
-import org.apache.syncope.common.rest.api.service.AnyTypeService;
 import org.apache.wicket.PageReference;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.markup.html.form.Form;
 
-public class AnyTypeModalPanel extends AbstractModalPanel {
+public class AnyTypeModalPanel extends AbstractModalPanel<AnyTypeTO> {
 
     private static final long serialVersionUID = -4603032036433309900L;
 
-    private final boolean createFlag;
+    protected final AnyTypeTO anyTypeTO;
 
-    public AnyTypeModalPanel(final BaseModal<AnyTypeTO> modal, final PageReference pageRef, final boolean createFlag) {
+    public AnyTypeModalPanel(final BaseModal<AnyTypeTO> modal, final AnyTypeTO anyTypeTO, final PageReference pageRef) {
         super(modal, pageRef);
-
-        this.createFlag = createFlag;
-        add(new AnyTypeDetailsPanel("anyTypeDetailsPanel", modal));
+        this.anyTypeTO = anyTypeTO;
+        add(new AnyTypeDetailsPanel("anyTypeDetailsPanel", this.anyTypeTO));
     }
 
     @Override
-    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
-        try {
-            final AnyTypeTO updateAnyTypeTO = AnyTypeTO.class.cast(form.getModelObject());
-
-            if (createFlag) {
-                SyncopeConsoleSession.get().getService(AnyTypeService.class).create(updateAnyTypeTO);
-            } else {
-                SyncopeConsoleSession.get().getService(AnyTypeService.class).update(updateAnyTypeTO);
-            }
-            info(getString(Constants.OPERATION_SUCCEEDED));
-            modal.close(target);
-        } catch (Exception e) {
-            LOG.error("While creating or updating AnyTypeTO", e);
-            error(getString(Constants.ERROR) + ": " + e.getMessage());
-            modal.getNotificationPanel().refresh(target);
-        }
+    public AnyTypeTO getItem() {
+        return this.anyTypeTO;
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6a93860d/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypePanel.java
index ccdfd77..e445746 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypePanel.java
@@ -18,68 +18,135 @@
  */
 package org.apache.syncope.client.console.panels;
 
+import static org.apache.syncope.client.console.panels.AbstractModalPanel.LOG;
+import static org.apache.wicket.Component.ENABLE;
+
 import java.io.Serializable;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.commons.SearchableDataProvider;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.AbstractBasePage;
+import org.apache.syncope.client.console.panels.AnyTypePanel.AnyTypeProvider;
+import org.apache.syncope.client.console.rest.BaseRestClient;
 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.ActionLinksPanel;
+import org.apache.syncope.client.console.wizards.AbstractModalPanelBuilder;
+import org.apache.syncope.client.console.wizards.AjaxWizard;
+import org.apache.syncope.client.console.wizards.WizardMgtPanel;
 import org.apache.syncope.common.lib.to.AnyTypeTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.syncope.common.rest.api.service.AnyTypeService;
 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.event.Broadcast;
 import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
-import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
-import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
-import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-public class AnyTypePanel extends AbstractTypesPanel<AnyTypeTO> {
+public class AnyTypePanel extends AbstractTypesPanel<AnyTypeTO, AnyTypeProvider> {
 
     private static final long serialVersionUID = 3905038169553185171L;
 
-    private static final Logger LOG = LoggerFactory.getLogger(AnyTypePanel.class);
+    private final String pageID = "AnyTypes";
 
-    private static final String PAGINATOR_ROWS_KEYS = Constants.PREF_ANYTYPE_PAGINATOR_ROWS;
+    public AnyTypePanel(final String id, final Builder<AnyTypeTO, AnyTypeTO, BaseRestClient> builder) {
+        super(id, builder);
+    }
 
-    private final BaseModal<AnyTypeTO> modal;
+    public AnyTypePanel(final String id, final PageReference pageRef) {
+        super(id, new Builder<AnyTypeTO, AnyTypeTO, BaseRestClient>(null, pageRef) {
 
-    public AnyTypePanel(final String id, final PageReference pageReference, final BaseModal<AnyTypeTO> modal) {
-        super(id, pageReference);
+            private static final long serialVersionUID = 8769126634538601689L;
 
-        this.pageRows = prefMan.getPaginatorRows(getRequest(), PAGINATOR_ROWS_KEYS);
-        this.modal = modal;
+            @Override
+            protected WizardMgtPanel<AnyTypeTO> newInstance(final String id) {
+                return new AnyTypePanel(id, this);
+            }
+        });
 
-        final WebMarkupContainer container = new WebMarkupContainer("container");
-        container.setOutputMarkupId(true);
-        add(container);
+        this.addNewItemPanelBuilder(new AbstractModalPanelBuilder<AnyTypeTO>(
+                BaseModal.CONTENT_ID, new AnyTypeTO(), pageRef) {
 
-        buildDataTable(container,
-                getColumns(container, pageReference), new AnyTypePanel.AnyTypeProvider(), PAGINATOR_ROWS_KEYS);
+            private static final long serialVersionUID = -6388405037134399367L;
 
+            @Override
+            public ModalPanel<AnyTypeTO> build(final int index, final boolean edit) {
+                final AnyTypeTO modelObject = newModelObject();
+                return new AnyTypeModalPanel(modal, modelObject, pageRef) {
+
+                    private static final long serialVersionUID = -6227956682141146095L;
+
+                    @Override
+                    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
+                        try {
+                            if (getOriginalItem() == null || StringUtils.isBlank(getOriginalItem().getKey())) {
+                                SyncopeConsoleSession.get().getService(AnyTypeService.class).create(modelObject);
+                            } else {
+                                SyncopeConsoleSession.get().getService(AnyTypeService.class).update(modelObject);
+                            }
+                            info(getString(Constants.OPERATION_SUCCEEDED));
+                            modal.close(target);
+                        } catch (Exception e) {
+                            LOG.error("While creating or updating AnyTypeTO", e);
+                            error(getString(Constants.ERROR) + ": " + e.getMessage());
+                            modal.getNotificationPanel().refresh(target);
+                        }
+                    }
+                };
+            }
+
+            @Override
+            protected void onCancelInternal(final AnyTypeTO modelObject) {
+            }
+
+            @Override
+            protected void onApplyInternal(final AnyTypeTO modelObject) {
+            }
+        }, true);
+
+        initResultTable();
+        MetaDataRoleAuthorizationStrategy.authorize(addAjaxLink, ENABLE, StandardEntitlement.ANYTYPE_CREATE);
+    }
+
+    @Override
+    protected AnyTypeProvider dataProvider() {
+        return new AnyTypeProvider(rows);
+    }
+
+    @Override
+    protected String paginatorRowsKey() {
+        return Constants.PREF_ANYTYPE_PAGINATOR_ROWS;
+    }
+
+    @Override
+    protected Collection<ActionLink.ActionType> getBulkActions() {
+        return Collections.<ActionLink.ActionType>emptyList();
+    }
+
+    @Override
+    protected String getPageId() {
+        return pageID;
     }
 
-    private <T extends AnyTypeModalPanel> List<IColumn<AnyTypeTO, String>> getColumns(
-            final WebMarkupContainer webContainer, final PageReference pageReference) {
+    @Override
+    protected List<IColumn<AnyTypeTO, String>> getColumns() {
 
         final List<IColumn<AnyTypeTO, String>> columns = new ArrayList<>();
 
@@ -88,9 +155,8 @@ public class AnyTypePanel extends AbstractTypesPanel<AnyTypeTO> {
             if (field != null && !Modifier.isStatic(field.getModifiers())) {
                 final String fieldName = field.getName();
                 if (field.getType().isArray()) {
-                    final IColumn<AnyTypeTO, String> column =
-                            new PropertyColumn<AnyTypeTO, String>(
-                                    new ResourceModel(field.getName()), field.getName()) {
+                    final IColumn<AnyTypeTO, String> column = new PropertyColumn<AnyTypeTO, String>(
+                            new ResourceModel(field.getName()), field.getName()) {
 
                         private static final long serialVersionUID = 3282547854226892169L;
 
@@ -108,9 +174,8 @@ public class AnyTypePanel extends AbstractTypesPanel<AnyTypeTO> {
                     columns.add(column);
 
                 } else {
-                    final IColumn<AnyTypeTO, String> column =
-                            new PropertyColumn<AnyTypeTO, String>(
-                                    new ResourceModel(field.getName()), field.getName(), field.getName()) {
+                    final IColumn<AnyTypeTO, String> column = new PropertyColumn<AnyTypeTO, String>(
+                            new ResourceModel(field.getName()), field.getName(), field.getName()) {
 
                         private static final long serialVersionUID = 3282547854226892169L;
 
@@ -143,9 +208,8 @@ public class AnyTypePanel extends AbstractTypesPanel<AnyTypeTO> {
             public void populateItem(final Item<ICellPopulator<AnyTypeTO>> item, final String componentId,
                     final IModel<AnyTypeTO> model) {
 
-                final AnyTypeTO anyTypeTO = model.getObject();
-
-                final ActionLinksPanel.Builder<Serializable> actionLinks = ActionLinksPanel.builder(pageReference);
+                final ActionLinksPanel.Builder<Serializable> actionLinks
+                        = ActionLinksPanel.builder(page.getPageReference());
                 actionLinks.setDisableIndicator(true);
                 actionLinks.addWithRoles(new ActionLink<Serializable>() {
 
@@ -153,11 +217,8 @@ public class AnyTypePanel extends AbstractTypesPanel<AnyTypeTO> {
 
                     @Override
                     public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
-                        modal.header(Model.of(anyTypeTO.getKey()));
-                        modal.setFormModel(anyTypeTO);
-                        target.add(modal.setContent(new AnyTypeModalPanel(modal, pageReference, false)));
-                        modal.addSumbitButton();
-                        modal.show(true);
+                        send(AnyTypePanel.this, Broadcast.EXACT,
+                                new AjaxWizard.EditItemActionEvent<AnyTypeTO>(model.getObject(), target));
                     }
                 }, ActionLink.ActionType.EDIT, StandardEntitlement.ANYTYPE_UPDATE).addWithRoles(
                         new ActionLink<Serializable>() {
@@ -167,9 +228,10 @@ public class AnyTypePanel extends AbstractTypesPanel<AnyTypeTO> {
                     @Override
                     public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
                         try {
-                            SyncopeConsoleSession.get().getService(AnyTypeService.class).delete(anyTypeTO.getKey());
+                            SyncopeConsoleSession.get().
+                                    getService(AnyTypeService.class).delete(model.getObject().getKey());
                             info(getString(Constants.OPERATION_SUCCEEDED));
-                            target.add(webContainer);
+                            target.add(container);
                         } catch (Exception e) {
                             LOG.error("While deleting AnyTypeTO", e);
                             error(getString(Constants.ERROR) + ": " + e.getMessage());
@@ -186,15 +248,14 @@ public class AnyTypePanel extends AbstractTypesPanel<AnyTypeTO> {
 
     }
 
-    private final class AnyTypeProvider extends SortableDataProvider<AnyTypeTO, String> {
+    protected final class AnyTypeProvider extends SearchableDataProvider<AnyTypeTO> {
 
         private static final long serialVersionUID = -185944053385660794L;
 
         private final SortableDataProviderComparator<AnyTypeTO> comparator;
 
-        private AnyTypeProvider() {
-            super();
-            setSort("key", SortOrder.ASCENDING);
+        private AnyTypeProvider(final int paginatorRows) {
+            super(paginatorRows);
             comparator = new SortableDataProviderComparator<>(this);
         }