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/10/01 11:34:41 UTC

[5/6] syncope git commit: [SYNCOPE-156] removed every reference to the oldest modal mechanisms

[SYNCOPE-156] removed every reference to the oldest modal mechanisms


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

Branch: refs/heads/SYNCOPE-156
Commit: 1e15b05e3e3dafa4436edbb6f2585dc68aa855f6
Parents: 2a7cf5a
Author: fmartelli <fa...@gmail.com>
Authored: Thu Oct 1 11:33:23 2015 +0200
Committer: fmartelli <fa...@gmail.com>
Committed: Thu Oct 1 11:33:23 2015 +0200

----------------------------------------------------------------------
 .../commons/status/ConnObjectWrapper.java       |   4 +-
 .../console/commons/status/StatusBean.java      |   3 +-
 .../console/pages/AbstractStatusModalPage.java  |   8 +-
 .../pages/AnyDisplayAttributesModalPage.java    |  15 +-
 .../client/console/pages/BaseModalPage.java     |  63 ---
 .../console/pages/BulkActionModalPage.java      |  23 +-
 .../pages/BulkActionResultModalPage.java        |  13 +-
 .../pages/DisplayAttributesModalPage.java       |  25 +-
 .../pages/GroupDisplayAttributesModalPage.java  |  11 +-
 .../console/pages/ProvisioningModalPage.java    |  27 +-
 .../client/console/pages/ResultStatusModal.java | 428 +++++++++++++++++++
 .../client/console/pages/StatusModalPage.java   |  85 ++--
 .../pages/UserDisplayAttributesModalPage.java   |  13 +-
 .../panels/AbstractSearchResultPanel.java       |  78 +---
 .../console/panels/ActionDataTablePanel.java    |   6 +-
 .../console/panels/AjaxDataTablePanel.java      |  37 +-
 .../console/panels/AnySearchResultPanel.java    |  82 ++--
 .../console/panels/GroupSearchResultPanel.java  |  79 ++--
 .../client/console/panels/ImagePanel.java       |   4 +-
 .../console/panels/UserSearchResultPanel.java   | 102 ++---
 .../console/rest/AbstractAnyRestClient.java     |  11 +
 .../console/rest/AnyObjectRestClient.java       |  11 +-
 .../client/console/rest/BaseRestClient.java     |   1 -
 .../client/console/rest/GroupRestClient.java    |   8 +-
 .../client/console/rest/UserRestClient.java     |  10 +-
 .../markup/html/form/BinaryFieldPanel.java      |   4 +-
 .../pages/AbstractStatusModalPage.properties    |   4 +
 .../pages/AbstractStatusModalPage_it.properties |   5 +
 .../AbstractStatusModalPage_pt_BR.properties    |   5 +
 .../client/console/pages/BaseModalPage.html     |  55 ---
 .../console/pages/BaseModalPage.properties      |  20 -
 .../console/pages/BaseModalPage_it.properties   |  20 -
 .../pages/BaseModalPage_pt_BR.properties        |  20 -
 .../client/console/pages/ResourceModalPage.html |  56 ---
 .../console/pages/ResourceModalPage.properties  |  60 ---
 .../pages/ResourceModalPage_it.properties       |  60 ---
 .../pages/ResourceModalPage_pt_BR.properties    |  60 ---
 .../client/console/pages/ResultStatusModal.html | 226 ++++++++++
 .../console/pages/ResultStatusModal.properties  |  26 ++
 .../pages/ResultStatusModal_it.properties       |  26 ++
 .../pages/ResultStatusModal_pt_BR.properties    |  26 ++
 .../panels/AbstractSearchResultPanel.html       |  49 ++-
 .../panels/AbstractSearchResultPanel.properties |   4 +
 .../AbstractSearchResultPanel_it.properties     |   4 +
 .../AbstractSearchResultPanel_pt_BR.properties  |  14 +-
 .../client/console/panels/ImagePanel.html       |  28 ++
 .../ProvisionWizardBuilder$ConnObjectLink.html  |   4 +-
 .../console/pages/CamelRouteModalPage.java      |  23 +-
 48 files changed, 1114 insertions(+), 832 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/1e15b05e/client/console/src/main/java/org/apache/syncope/client/console/commons/status/ConnObjectWrapper.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/status/ConnObjectWrapper.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/status/ConnObjectWrapper.java
index 199b262..06ccac7 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/status/ConnObjectWrapper.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/status/ConnObjectWrapper.java
@@ -32,9 +32,7 @@ public class ConnObjectWrapper implements Serializable {
 
     private final ConnObjectTO connObjectTO;
 
-    public ConnObjectWrapper(final AnyTO any, final String resourceName,
-            final ConnObjectTO connObjectTO) {
-
+    public ConnObjectWrapper(final AnyTO any, final String resourceName, final ConnObjectTO connObjectTO) {
         this.any = any;
         this.resourceName = resourceName;
         this.connObjectTO = connObjectTO;

http://git-wip-us.apache.org/repos/asf/syncope/blob/1e15b05e/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusBean.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusBean.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusBean.java
index adb6040..893b8aa 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusBean.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusBean.java
@@ -45,8 +45,7 @@ public class StatusBean implements Serializable {
 
     public StatusBean(final AnyTO any, final String resourceName) {
         this.anyKey = any.getKey();
-        this.anyName = any instanceof UserTO
-                ? ((UserTO) any).getUsername() : ((GroupTO) any).getName();
+        this.anyName = any instanceof UserTO ? ((UserTO) any).getUsername() : ((GroupTO) any).getName();
         this.resourceName = resourceName;
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1e15b05e/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 f5dfbca..f46ec67 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,13 +18,17 @@
  */
 package org.apache.syncope.client.console.pages;
 
+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 BaseModalPage {
+public class AbstractStatusModalPage extends AbstractModalPanel {
 
     private static final long serialVersionUID = 6633408683036028540L;
 
-    public AbstractStatusModalPage() {
+    public AbstractStatusModalPage(final BaseModal<?> modal, final PageReference pageRef) {
+        super(modal, pageRef);
         add(new Fragment("pwdMgtFields", "emptyFragment", this));
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1e15b05e/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 63223a0..b1214f7 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
@@ -20,23 +20,28 @@ package org.apache.syncope.client.console.pages;
 
 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.AnyObjectTO;
+import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.wicket.PageReference;
-import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 
 /**
  * Modal window with Display user attributes form.
+ * @param <T>
  */
 @SuppressWarnings({ "unchecked", "rawtypes" })
-public class AnyDisplayAttributesModalPage extends DisplayAttributesModalPage {
+public class AnyDisplayAttributesModalPage<T extends AnyTO> extends DisplayAttributesModalPage {
 
     private static final long serialVersionUID = 5194630813773543054L;
 
     public static final String[] ANY_DEFAULT_SELECTION = { "key" };
 
-    public AnyDisplayAttributesModalPage(final PageReference pageRef, final ModalWindow window,
-            final List<String> schemaNames, final List<String> dSchemaNames) {
-        super(pageRef, window, schemaNames, dSchemaNames);
+    public AnyDisplayAttributesModalPage(
+            final BaseModal<T> modal,
+            final PageReference pageRef,
+            final List<String> schemaNames,
+            final List<String> dSchemaNames) {
+        super(modal, pageRef, schemaNames, dSchemaNames);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/1e15b05e/client/console/src/main/java/org/apache/syncope/client/console/pages/BaseModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/BaseModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/BaseModalPage.java
deleted file mode 100644
index 6da298a..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/BaseModalPage.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.client.console.pages;
-
-import org.apache.wicket.Component;
-import org.apache.wicket.ajax.AjaxEventBehavior;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.attributes.AjaxCallListener;
-import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
-import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
-
-/**
- * Syncope Modal Window.
- */
-public abstract class BaseModalPage extends AbstractBasePage {
-
-    private static final long serialVersionUID = -1443079028368471943L;
-
-    public BaseModalPage() {
-        super();
-
-        add(new AjaxEventBehavior("keyup") {
-
-            private static final long serialVersionUID = -7133385027739964990L;
-
-            @Override
-            protected void onEvent(final AjaxRequestTarget target) {
-                ModalWindow.closeCurrent(target);
-            }
-
-            @Override
-            protected void updateAjaxAttributes(final AjaxRequestAttributes attributes) {
-                super.updateAjaxAttributes(attributes);
-
-                attributes.getAjaxCallListeners().add(new AjaxCallListener() {
-
-                    private static final long serialVersionUID = 7160235486520935153L;
-
-                    @Override
-                    public CharSequence getPrecondition(final Component aComponent) {
-                        return " if(Wicket.Event.keyCode(attrs.event) != 27){return false;}";
-                    }
-                });
-            }
-        });
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/1e15b05e/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 5c1d31f..7d98e51 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
@@ -25,15 +25,17 @@ import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.panels.AbstractModalPanel;
 import org.apache.syncope.client.console.rest.BaseRestClient;
 import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxButton;
+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.common.lib.to.BulkAction;
 import org.apache.syncope.common.lib.to.BulkActionResult;
+import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
-import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackDefaultDataTable;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
@@ -43,12 +45,13 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.ResourceModel;
 import org.springframework.beans.BeanUtils;
 
-public class BulkActionModalPage<T, S> extends BaseModalPage {
+public class BulkActionModalPage<T, S> extends AbstractModalPanel {
 
     private static final long serialVersionUID = 4114026480146090962L;
 
     public BulkActionModalPage(
-            final ModalWindow window,
+            final BaseModal<?> modal,
+            final PageReference pageRef,
             final Collection<T> items,
             final List<IColumn<T, S>> columns,
             final Collection<ActionLink.ActionType> actions,
@@ -56,7 +59,7 @@ public class BulkActionModalPage<T, S> extends BaseModalPage {
             final String keyFieldName,
             final String pageId) {
 
-        super();
+        super(modal, pageRef);
 
         final SortableDataProvider<T, S> dataProvider = new SortableDataProvider<T, S>() {
 
@@ -86,7 +89,7 @@ public class BulkActionModalPage<T, S> extends BaseModalPage {
 
         @SuppressWarnings("rawtypes")
         final ActionLinksPanel<Serializable> actionPanel
-                = ActionLinksPanel.builder(getPageReference()).build("actions");
+                = ActionLinksPanel.builder(pageRef).build("actions");
         add(actionPanel);
 
         for (ActionLink.ActionType action : actions) {
@@ -129,12 +132,14 @@ public class BulkActionModalPage<T, S> extends BaseModalPage {
                         final BulkActionResult res = (BulkActionResult) bulkActionExecutor.getClass().
                                 getMethod("bulkAction", BulkAction.class).invoke(bulkActionExecutor, bulkAction);
 
-                        setResponsePage(new BulkActionResultModalPage<>(window, items, columns, res, keyFieldName));
+                        modal.setContent(new BulkActionResultModalPage<>(
+                                modal, pageRef, items, columns, res, keyFieldName));
+                        target.add(modal);
                     } catch (NoSuchMethodException | SecurityException | IllegalAccessException 
                             | IllegalArgumentException | InvocationTargetException e) {
                         error(getString(Constants.ERROR)
                                 + ": Operation " + bulkAction.getType() + " not supported");
-                        feedbackPanel.refresh(target);
+                        modal.getFeedbackPanel().refresh(target);
                     }
 
                 }
@@ -144,13 +149,13 @@ public class BulkActionModalPage<T, S> extends BaseModalPage {
         final Form<Void> form = new Form<>(FORM);
         add(form);
 
-        final AjaxButton cancel = new ClearIndicatingAjaxButton(CANCEL, new ResourceModel(CANCEL), getPageReference()) {
+        final AjaxButton cancel = new ClearIndicatingAjaxButton(CANCEL, new ResourceModel(CANCEL), pageRef) {
 
             private static final long serialVersionUID = -958724007591692537L;
 
             @Override
             protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
-                window.close(target);
+                modal.close(target);
             }
         };
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1e15b05e/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 98ac15c..00574c4 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
@@ -22,12 +22,14 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
+import org.apache.syncope.client.console.panels.AbstractModalPanel;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.ActionResultColumn;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.common.lib.to.BulkActionResult;
+import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
 import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink;
-import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackDefaultDataTable;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
@@ -40,18 +42,19 @@ import org.apache.wicket.model.IModel;
  * @param <T>
  * @param <S>
  */
-public class BulkActionResultModalPage<T, S> extends BaseModalPage {
+public class BulkActionResultModalPage<T, S> extends AbstractModalPanel {
 
     private static final long serialVersionUID = 2646115294319713724L;
 
     public BulkActionResultModalPage(
-            final ModalWindow window,
+            final BaseModal<?> modal,
+            final PageReference pageRef,
             final Collection<T> items,
             final List<IColumn<T, S>> columns,
             final BulkActionResult results,
             final String keyFieldName) {
 
-        super();
+        super(modal, pageRef);
 
         final List<IColumn<T, S>> newColumnList = new ArrayList<>(columns.subList(1, columns.size() - 1));
         newColumnList.add(newColumnList.size(), new ActionResultColumn<T, S>(results, keyFieldName));
@@ -88,7 +91,7 @@ public class BulkActionResultModalPage<T, S> extends BaseModalPage {
 
             @Override
             public void onClick(final AjaxRequestTarget target) {
-                window.close(target);
+                modal.close(target);
             }
         };
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1e15b05e/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 769cb45..432c510 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
@@ -22,12 +22,14 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import org.apache.syncope.client.console.PreferenceManager;
+import org.apache.syncope.client.console.panels.AbstractModalPanel;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.common.lib.search.SearchableFields;
+import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
-import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.Check;
 import org.apache.wicket.markup.html.form.CheckGroup;
@@ -44,9 +46,11 @@ import org.apache.wicket.spring.injection.annot.SpringBean;
 
 /**
  * Modal window with Display attributes form.
+ *
+ * @param <T>
  */
 @SuppressWarnings({ "unchecked", "rawtypes" })
-public abstract class DisplayAttributesModalPage extends BaseModalPage {
+public abstract class DisplayAttributesModalPage<T extends AnyTO> extends AbstractModalPanel {
 
     private static final long serialVersionUID = -4274117450918385110L;
 
@@ -64,10 +68,13 @@ public abstract class DisplayAttributesModalPage extends BaseModalPage {
 
     private final List<String> selectedDerSchemas;
 
-    public DisplayAttributesModalPage(final PageReference pageRef, final ModalWindow window,
-            final List<String> schemaNames, final List<String> dSchemaNames) {
+    public DisplayAttributesModalPage(
+            final BaseModal<T> modal,
+            final PageReference pageRef,
+            final List<String> schemaNames,
+            final List<String> dSchemaNames) {
 
-        super();
+        super(modal, pageRef);
 
         final IModel<List<String>> fnames = new LoadableDetachableModel<List<String>>() {
 
@@ -197,13 +204,13 @@ public abstract class DisplayAttributesModalPage extends BaseModalPage {
 
                     ((BasePage) pageRef.getPage()).setModalResult(true);
 
-                    window.close(target);
+                    modal.close(target);
                 }
             }
 
             @Override
             protected void onError(final AjaxRequestTarget target, final Form<?> form) {
-                feedbackPanel.refresh(target);
+                modal.getFeedbackPanel().refresh(target);
             }
         };
 
@@ -215,7 +222,7 @@ public abstract class DisplayAttributesModalPage extends BaseModalPage {
 
             @Override
             protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
-                window.close(target);
+                modal.close(target);
             }
         };
 
@@ -230,7 +237,7 @@ public abstract class DisplayAttributesModalPage extends BaseModalPage {
     public abstract String getPrefAttributeView();
 
     public abstract String getPrefDerivedAttributeView();
-    
+
     public abstract Class getTOClass();
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1e15b05e/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 0e5e10f..9b33379 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
@@ -20,9 +20,9 @@ package org.apache.syncope.client.console.pages;
 
 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.GroupTO;
 import org.apache.wicket.PageReference;
-import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 
 /**
  * Modal window with Display group attributes form.
@@ -34,9 +34,12 @@ public class GroupDisplayAttributesModalPage extends DisplayAttributesModalPage
 
     public static final String[] GROUP_DEFAULT_SELECTION = { "key", "name" };
 
-    public GroupDisplayAttributesModalPage(final PageReference pageRef, final ModalWindow window,
-            final List<String> schemaNames, final List<String> dSchemaNames) {
-        super(pageRef, window, schemaNames, dSchemaNames);
+    public GroupDisplayAttributesModalPage(
+            final BaseModal<GroupTO> modal,
+            final PageReference pageRef,
+            final List<String> schemaNames,
+            final List<String> dSchemaNames) {
+        super(modal, pageRef, schemaNames, dSchemaNames);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/1e15b05e/client/console/src/main/java/org/apache/syncope/client/console/pages/ProvisioningModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/ProvisioningModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/ProvisioningModalPage.java
index b631210..95ec54f 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/ProvisioningModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/ProvisioningModalPage.java
@@ -30,6 +30,7 @@ import org.apache.syncope.client.console.commons.status.ConnObjectWrapper;
 import org.apache.syncope.client.console.commons.status.StatusBean;
 import org.apache.syncope.client.console.commons.status.StatusUtils;
 import org.apache.syncope.client.console.panels.ActionDataTablePanel;
+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.lib.SyncopeClient;
 import org.apache.syncope.common.lib.to.AnyTO;
@@ -41,7 +42,6 @@ import org.apache.syncope.common.lib.wrap.AbstractWrappable;
 import org.apache.syncope.common.lib.wrap.AnyKey;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
@@ -63,24 +63,18 @@ public class ProvisioningModalPage<T extends AnyTO> extends AbstractStatusModalP
 
     private final AnyTypeKind anyTypeKind;
 
-    private final PageReference pageRef;
-
-    private final ModalWindow window;
-
     private final StatusUtils statusUtils;
 
     private final String realm = "/";
 
     public ProvisioningModalPage(
+            final BaseModal<?> modal,
             final PageReference pageRef,
-            final ModalWindow window,
             final ResourceTO resourceTO,
             final AnyTypeKind anyTypeKind) {
 
-        super();
+        super(modal, pageRef);
 
-        this.pageRef = pageRef;
-        this.window = window;
         this.resourceTO = resourceTO;
         this.anyTypeKind = anyTypeKind;
 
@@ -141,7 +135,7 @@ public class ProvisioningModalPage<T extends AnyTO> extends AbstractStatusModalP
                 } catch (Exception e) {
                     LOG.error("Error unlinkink resources", e);
                     error(getString(Constants.ERROR) + ": " + e.getMessage());
-                    feedbackPanel.refresh(target);
+                    modal.getFeedbackPanel().refresh(target);
                 }
             }
         }, ActionLink.ActionType.UNLINK, pageId);
@@ -157,7 +151,7 @@ public class ProvisioningModalPage<T extends AnyTO> extends AbstractStatusModalP
                 } catch (Exception e) {
                     LOG.error("Error de-provisioning user", e);
                     error(getString(Constants.ERROR) + ": " + e.getMessage());
-                    feedbackPanel.refresh(target);
+                    modal.getFeedbackPanel().refresh(target);
                 }
             }
         }, ActionLink.ActionType.DEPROVISION, pageId);
@@ -173,12 +167,12 @@ public class ProvisioningModalPage<T extends AnyTO> extends AbstractStatusModalP
                 } catch (Exception e) {
                     LOG.error("Error unassigning resources", e);
                     error(getString(Constants.ERROR) + ": " + e.getMessage());
-                    feedbackPanel.refresh(target);
+                    modal.getFeedbackPanel().refresh(target);
                 }
             }
         }, ActionLink.ActionType.UNASSIGN, pageId);
 
-        table.addCancelButton(window);
+        table.addCancelButton(modal);
 
         add(table);
     }
@@ -188,7 +182,7 @@ public class ProvisioningModalPage<T extends AnyTO> extends AbstractStatusModalP
         private static final long serialVersionUID = 4287357360778016173L;
 
         public StatusBeanProvider() {
-            super("accountLink");
+            super("connObjectLink");
         }
 
         @SuppressWarnings("unchecked")
@@ -239,14 +233,15 @@ public class ProvisioningModalPage<T extends AnyTO> extends AbstractStatusModalP
         }
 
         if (beans.isEmpty()) {
-            window.close(target);
+            modal.close(target);
         } else {
             final BulkActionResult res = resourceRestClient.bulkAssociationAction(
                     resourceTO.getKey(), anyTypeKind.name(), type, subjectKeys);
 
             ((BasePage) pageRef.getPage()).setModalResult(true);
 
-            setResponsePage(new BulkActionResultModalPage<>(window, beans, columns, res, "anyKey"));
+            target.add(modal.setContent(
+                    new BulkActionResultModalPage<>(modal, pageRef, beans, columns, res, "anyKey")));
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1e15b05e/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
new file mode 100644
index 0000000..855a61f
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/ResultStatusModal.java
@@ -0,0 +1,428 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.pages;
+
+import static org.apache.syncope.client.console.commons.status.Status.ACTIVE;
+import static org.apache.syncope.client.console.commons.status.Status.SUSPENDED;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.console.commons.ConnIdSpecialAttributeName;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.commons.Mode;
+import org.apache.syncope.client.console.commons.status.Status;
+import org.apache.syncope.client.console.commons.status.StatusUtils;
+import org.apache.syncope.client.console.panels.AbstractModalPanel;
+import org.apache.syncope.client.console.panels.FailureMessageModal;
+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.AttrTO;
+import org.apache.syncope.common.lib.to.ConnObjectTO;
+import org.apache.syncope.common.lib.to.PropagationStatus;
+import org.apache.syncope.common.lib.to.GroupTO;
+import org.apache.syncope.common.lib.to.UserTO;
+import org.apache.syncope.common.lib.types.PropagationTaskExecStatus;
+import org.apache.wicket.Component;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink;
+import org.apache.wicket.markup.ComponentTag;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.image.Image;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.markup.html.panel.Fragment;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.request.resource.ContextRelativeResource;
+
+/**
+ * Show user or group status after performing a successful operation.
+ *
+ * @param <T>
+ */
+public final class ResultStatusModal<T extends AnyTO> extends AbstractModalPanel {
+
+    private static final long serialVersionUID = 2646115294319713723L;
+
+    private static final String IMG_PREFIX = "/img/statuses/";
+
+    private final AnyTO subject;
+
+    private final Mode mode;
+
+    /**
+     * Status management utilities.
+     */
+    private final StatusUtils statusUtils;
+
+    public static class Builder<T extends AnyTO> implements Serializable {
+
+        private static final long serialVersionUID = 220361441802274899L;
+
+        private Mode mode;
+
+        private AnyTO subject;
+
+        private final BaseModal<T> modal;
+
+        private final PageReference pageRef;
+
+        public Builder(
+                final BaseModal<T> modal,
+                final PageReference pageRef,
+                final AnyTO attributable) {
+            this.subject = attributable;
+            this.modal = modal;
+            this.pageRef = pageRef;
+        }
+
+        public ResultStatusModal.Builder<T> mode(final Mode mode) {
+            this.mode = mode;
+            return this;
+        }
+
+        public ResultStatusModal<T> build() {
+            return new ResultStatusModal<T>(modal, pageRef, this);
+        }
+    }
+
+    private ResultStatusModal(
+            final BaseModal<T> modal,
+            final PageReference pageRef,
+            final Builder<T> builder) {
+        super(modal, pageRef);
+
+        this.subject = builder.subject;
+        statusUtils = new StatusUtils(this.userRestClient);
+        if (builder.mode == null) {
+            this.mode = Mode.ADMIN;
+        } else {
+            this.mode = builder.mode;
+        }
+
+        final WebMarkupContainer container = new WebMarkupContainer("container");
+        container.setOutputMarkupId(true);
+        add(container);
+
+        final Fragment fragment = new Fragment("resultFrag", mode == Mode.SELF
+                ? "userSelfResultFrag"
+                : "propagationResultFrag", this);
+        fragment.setOutputMarkupId(true);
+        container.add(fragment);
+
+        if (mode == Mode.ADMIN) {
+            // add Syncope propagation status
+            PropagationStatus syncope = new PropagationStatus();
+            syncope.setResource("Syncope");
+            syncope.setStatus(PropagationTaskExecStatus.SUCCESS);
+
+            List<PropagationStatus> propagations = new ArrayList<PropagationStatus>();
+            propagations.add(syncope);
+            propagations.addAll(subject.getPropagationStatusTOs());
+
+            fragment.add(new Label("info",
+                    ((subject instanceof UserTO) && ((UserTO) subject).getUsername() != null)
+                            ? ((UserTO) subject).getUsername()
+                            : ((subject instanceof GroupTO) && ((GroupTO) subject).getName() != null)
+                                    ? ((GroupTO) subject).getName()
+                                    : String.valueOf(subject.getKey())));
+
+            final ListView<PropagationStatus> propRes = new ListView<PropagationStatus>("resources",
+                    propagations) {
+
+                        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<?> 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);
+                        }
+                    };
+            fragment.add(propRes);
+        }
+
+        final AjaxLink<Void> close = new IndicatingAjaxLink<Void>("close") {
+
+            private static final long serialVersionUID = -7978723352517770644L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target) {
+                builder.modal.close(target);
+            }
+        };
+        container.add(close);
+
+        setOutputMarkupId(true);
+    }
+
+    /**
+     * Get remote attributes list view.
+     *
+     * @param propTO propagation TO.
+     * @return list view.
+     */
+    private ListView<String> getConnObjectView(final PropagationStatus propTO) {
+        final ConnObjectTO before = propTO.getBeforeObj();
+        final ConnObjectTO after = propTO.getAfterObj();
+
+        // sorted in reversed presentation order
+        final List<String> head = new ArrayList<String>();
+        if (subject instanceof UserTO) {
+            head.add(ConnIdSpecialAttributeName.PASSWORD);
+            head.add(ConnIdSpecialAttributeName.ENABLE);
+        }
+        head.add(ConnIdSpecialAttributeName.UID);
+        head.add(ConnIdSpecialAttributeName.NAME);
+
+        final Map<String, AttrTO> beforeAttrMap = before == null
+                ? Collections.<String, AttrTO>emptyMap()
+                : before.getPlainAttrMap();
+
+        final Map<String, AttrTO> afterAttrMap = after == null
+                ? Collections.<String, AttrTO>emptyMap()
+                : after.getPlainAttrMap();
+
+        final Set<String> attributes = new HashSet<String>();
+        attributes.addAll(beforeAttrMap.keySet());
+        attributes.addAll(afterAttrMap.keySet());
+
+        if (!(subject instanceof UserTO)) {
+            attributes.remove(ConnIdSpecialAttributeName.PASSWORD);
+            attributes.remove(ConnIdSpecialAttributeName.ENABLE);
+        }
+
+        final List<String> profile = new ArrayList<String>();
+        profile.addAll(attributes);
+        profile.removeAll(head);
+        Collections.sort(profile);
+
+        for (String attr : head) {
+            if (attributes.contains(attr)) {
+                profile.add(0, attr);
+            }
+        }
+
+        return new ListView<String>("attrs", profile) {
+
+            private static final long serialVersionUID = 4949588177564901031L;
+
+            @Override
+            protected void populateItem(final ListItem<String> item) {
+                String name = item.getModelObject();
+
+                final Fragment beforeValue;
+                final Fragment afterValue;
+                if (ConnIdSpecialAttributeName.ENABLE.equals(name)) {
+                    beforeValue = getStatusIcon("beforeValue", propTO.getResource(), before);
+                    afterValue = getStatusIcon("afterValue", propTO.getResource(), after);
+                } else {
+                    beforeValue = getLabelValue("beforeValue", name, beforeAttrMap);
+                    afterValue = getLabelValue("afterValue", name, afterAttrMap);
+                }
+
+                item.add(new Label("attrName", new ResourceModel(name, name)));
+
+                item.add(beforeValue);
+                item.add(afterValue);
+            }
+        };
+    }
+
+    /**
+     * Get fragment for attribute value (not remote status).
+     *
+     * @param id component id to be replaced with the fragment content.
+     * @param attrName remote attribute name
+     * @param attrMap remote attributes map.
+     * @return fragment.
+     */
+    private Fragment getLabelValue(final String id, final String attrName, final Map<String, AttrTO> attrMap) {
+        final String value;
+
+        final AttrTO attr = attrMap.get(attrName);
+
+        if (attr == null || attr.getValues() == null || attr.getValues().isEmpty()) {
+            value = "";
+        } else {
+            if (ConnIdSpecialAttributeName.PASSWORD.equals(attrName)) {
+                value = "********";
+            } else {
+                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).
+                add(new Behavior() {
+
+                    private static final long serialVersionUID = 1469628524240283489L;
+
+                    @Override
+                    public void onComponentTag(final Component component, final ComponentTag tag) {
+                        tag.put("title", value);
+                    }
+                });
+
+        final Fragment frag = new Fragment(id, "attrValueFrag", this);
+        frag.add(label);
+
+        return frag;
+    }
+
+    /**
+     * Get fragment for user status icon.
+     *
+     * @param id component id to be replaced with the fragment content
+     * @param resourceName resource name
+     * @param objectTO connector object TO
+     * @return fragment.
+     */
+    private Fragment getStatusIcon(final String id, final String resourceName, final ConnObjectTO objectTO) {
+        final Image image;
+        final String alt, title;
+        switch (statusUtils.getStatusBean(
+                subject, resourceName, objectTO, this.subject instanceof GroupTO).getStatus()) {
+
+            case ACTIVE:
+                image = new Image("status",
+                        new ContextRelativeResource(IMG_PREFIX + Status.ACTIVE.toString() + Constants.PNG_EXT));
+                alt = "active icon";
+                title = "Enabled";
+                break;
+
+            case SUSPENDED:
+                image = new Image("status",
+                        new ContextRelativeResource(IMG_PREFIX + Status.SUSPENDED.toString() + Constants.PNG_EXT));
+                alt = "inactive icon";
+                title = "Disabled";
+                break;
+
+            default:
+                image = null;
+                alt = null;
+                title = null;
+        }
+
+        final Fragment frag;
+        if (image == null) {
+            frag = new Fragment(id, "emptyFrag", this);
+        } else {
+            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);
+                    tag.put("width", "12px");
+                    tag.put("height", "12px");
+                }
+            });
+
+            frag = new Fragment(id, "remoteStatusFrag", this);
+            frag.add(image);
+        }
+
+        return frag;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/1e15b05e/client/console/src/main/java/org/apache/syncope/client/console/pages/StatusModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/StatusModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/StatusModalPage.java
index 1357cad..f70c1c5 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/StatusModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/StatusModalPage.java
@@ -32,6 +32,7 @@ import org.apache.syncope.client.console.commons.status.StatusBean;
 import org.apache.syncope.client.console.commons.status.StatusUtils;
 import org.apache.syncope.client.console.panels.ActionDataTablePanel;
 import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxButton;
+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.AjaxCheckBoxPanel;
 import org.apache.syncope.common.lib.to.AnyTO;
@@ -43,7 +44,6 @@ import org.apache.syncope.common.lib.types.ResourceAssociationAction;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
-import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
@@ -89,32 +89,26 @@ public class StatusModalPage<T extends AnyTO> extends AbstractStatusModalPage {
     private final PasswordTextField confirm;
     // --------------------------------
 
-    private final PageReference pageRef;
-
-    private final ModalWindow window;
-
     private final ActionDataTablePanel<StatusBean, String> table;
 
     private final List<IColumn<StatusBean, String>> columns;
 
     public StatusModalPage(
+            final BaseModal<T> modal,
             final PageReference pageRef,
-            final ModalWindow window,
             final AnyTO attributableTO) {
 
-        this(pageRef, window, attributableTO, false);
+        this(modal, pageRef, attributableTO, false);
     }
 
     public StatusModalPage(
+            final BaseModal<T> modal,
             final PageReference pageRef,
-            final ModalWindow window,
             final AnyTO anyTO,
             final boolean statusOnly) {
 
-        super();
+        super(modal, pageRef);
 
-        this.pageRef = pageRef;
-        this.window = window;
         this.statusOnly = statusOnly;
         this.anyTO = anyTO;
 
@@ -152,7 +146,7 @@ public class StatusModalPage<T extends AnyTO> extends AbstractStatusModalPage {
                 });
 
         columns.add(new PropertyColumn<StatusBean, String>(
-                new StringResourceModel("accountLink", this, null), "accountLink", "accountLink"));
+                new StringResourceModel("connObjectLink", this, null), "connObjectLink", "connObjectLink"));
 
         columns.add(new AbstractColumn<StatusBean, String>(
                 new StringResourceModel("status", this, null)) {
@@ -236,14 +230,14 @@ public class StatusModalPage<T extends AnyTO> extends AbstractStatusModalPage {
             @Override
             protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
                 // ignore
-                window.close(target);
+                modal.close(target);
             }
         }.feedbackPanelAutomaticReload(false);
 
         pwdMgtForm.add(cancel);
 
-        final ClearIndicatingAjaxButton goon =
-                new ClearIndicatingAjaxButton("continue", new ResourceModel("continue"), pageRef) {
+        final ClearIndicatingAjaxButton goon = new ClearIndicatingAjaxButton("continue", new ResourceModel("continue"),
+                pageRef) {
 
                     private static final long serialVersionUID = -2341391430136818027L;
 
@@ -270,11 +264,11 @@ public class StatusModalPage<T extends AnyTO> extends AbstractStatusModalPage {
 
                         ((BasePage) pageRef.getPage()).setModalResult(true);
 
-                        window.close(target);
+                        modal.close(target);
                     } catch (Exception e) {
                         LOG.error("Error enabling resources", e);
                         error(getString(Constants.ERROR) + ": " + e.getMessage());
-                        feedbackPanel.refresh(target);
+                        modal.getFeedbackPanel().refresh(target);
                     }
                 }
             }, ActionLink.ActionType.REACTIVATE, pageId);
@@ -295,11 +289,11 @@ public class StatusModalPage<T extends AnyTO> extends AbstractStatusModalPage {
                             ((BasePage) pageRef.getPage()).setModalResult(true);
                         }
 
-                        window.close(target);
+                        modal.close(target);
                     } catch (Exception e) {
                         LOG.error("Error disabling resources", e);
                         error(getString(Constants.ERROR) + ": " + e.getMessage());
-                        feedbackPanel.refresh(target);
+                        modal.getFeedbackPanel().refresh(target);
                     }
                 }
             }, ActionLink.ActionType.SUSPEND, pageId);
@@ -324,11 +318,11 @@ public class StatusModalPage<T extends AnyTO> extends AbstractStatusModalPage {
                         }
 
                         ((BasePage) pageRef.getPage()).setModalResult(true);
-                        window.close(target);
+                        modal.close(target);
                     } catch (Exception e) {
                         LOG.error("Error unlinking resources", e);
                         error(getString(Constants.ERROR) + ": " + e.getMessage());
-                        feedbackPanel.refresh(target);
+                        modal.getFeedbackPanel().refresh(target);
                     }
                 }
             }, ActionLink.ActionType.UNLINK, pageId);
@@ -353,11 +347,11 @@ public class StatusModalPage<T extends AnyTO> extends AbstractStatusModalPage {
                         }
 
                         ((BasePage) pageRef.getPage()).setModalResult(true);
-                        window.close(target);
+                        modal.close(target);
                     } catch (Exception e) {
                         LOG.error("Error linking resources", e);
                         error(getString(Constants.ERROR) + ": " + e.getMessage());
-                        feedbackPanel.refresh(target);
+                        modal.getFeedbackPanel().refresh(target);
                     }
                 }
             }, ActionLink.ActionType.LINK, pageId);
@@ -383,11 +377,11 @@ public class StatusModalPage<T extends AnyTO> extends AbstractStatusModalPage {
                         }
 
                         ((BasePage) pageRef.getPage()).setModalResult(true);
-                        loadBulkActionResultPage(table.getModelObject(), bulkActionResult);
+                        loadBulkActionResultPage(target, table.getModelObject(), bulkActionResult);
                     } catch (Exception e) {
                         LOG.error("Error de-provisioning user", e);
                         error(getString(Constants.ERROR) + ": " + e.getMessage());
-                        feedbackPanel.refresh(target);
+                        modal.getFeedbackPanel().refresh(target);
                     }
                 }
             }, ActionLink.ActionType.DEPROVISION, pageId);
@@ -410,11 +404,11 @@ public class StatusModalPage<T extends AnyTO> extends AbstractStatusModalPage {
                                     new ArrayList<>(table.getModelObject()));
 
                             ((BasePage) pageRef.getPage()).setModalResult(true);
-                            loadBulkActionResultPage(table.getModelObject(), bulkActionResult);
+                            loadBulkActionResultPage(target, table.getModelObject(), bulkActionResult);
                         } catch (Exception e) {
                             LOG.error("Error provisioning user", e);
                             error(getString(Constants.ERROR) + ": " + e.getMessage());
-                            feedbackPanel.refresh(target);
+                            modal.getFeedbackPanel().refresh(target);
                         }
                     }
                 }
@@ -441,11 +435,11 @@ public class StatusModalPage<T extends AnyTO> extends AbstractStatusModalPage {
                         }
 
                         ((BasePage) pageRef.getPage()).setModalResult(true);
-                        loadBulkActionResultPage(table.getModelObject(), bulkActionResult);
+                        loadBulkActionResultPage(target, table.getModelObject(), bulkActionResult);
                     } catch (Exception e) {
                         LOG.error("Error unassigning resources", e);
                         error(getString(Constants.ERROR) + ": " + e.getMessage());
-                        feedbackPanel.refresh(target);
+                        modal.getFeedbackPanel().refresh(target);
                     }
                 }
             }, ActionLink.ActionType.UNASSIGN, pageId);
@@ -467,18 +461,18 @@ public class StatusModalPage<T extends AnyTO> extends AbstractStatusModalPage {
                                     new ArrayList<>(table.getModelObject()));
 
                             ((BasePage) pageRef.getPage()).setModalResult(true);
-                            loadBulkActionResultPage(table.getModelObject(), bulkActionResult);
+                            loadBulkActionResultPage(target, table.getModelObject(), bulkActionResult);
                         } catch (Exception e) {
                             LOG.error("Error assigning resources", e);
                             error(getString(Constants.ERROR) + ": " + e.getMessage());
-                            feedbackPanel.refresh(target);
+                            modal.getFeedbackPanel().refresh(target);
                         }
                     }
                 }
             }.feedbackPanelAutomaticReload(!(anyTO instanceof UserTO)), ActionLink.ActionType.ASSIGN, pageId);
         }
 
-        table.addCancelButton(window);
+        table.addCancelButton(modal);
         add(table);
     }
 
@@ -487,7 +481,7 @@ public class StatusModalPage<T extends AnyTO> extends AbstractStatusModalPage {
         private static final long serialVersionUID = 4586969457669796621L;
 
         public AttributableStatusProvider() {
-            super(statusOnly ? "resourceName" : "accountLink");
+            super(statusOnly ? "resourceName" : "connObjectLink");
         }
 
         @SuppressWarnings("unchecked")
@@ -549,8 +543,8 @@ public class StatusModalPage<T extends AnyTO> extends AbstractStatusModalPage {
             final ResourceAssociationAction type,
             final Collection<StatusBean> selection) {
 
-        final ClearIndicatingAjaxButton goon =
-                new ClearIndicatingAjaxButton("continue", new ResourceModel("continue", "Continue"), pageRef) {
+        final ClearIndicatingAjaxButton goon = new ClearIndicatingAjaxButton("continue", new ResourceModel("continue",
+                "Continue"), pageRef) {
 
                     private static final long serialVersionUID = -2341391430136818027L;
 
@@ -588,16 +582,16 @@ public class StatusModalPage<T extends AnyTO> extends AbstractStatusModalPage {
                             ((BasePage) pageRef.getPage()).setModalResult(true);
 
                             if (bulkActionResult != null) {
-                                loadBulkActionResultPage(selection, bulkActionResult);
+                                loadBulkActionResultPage(target, selection, bulkActionResult);
                             } else {
 
                                 target.add(((BasePage) pageRef.getPage()).getFeedbackPanel());
-                                window.close(target);
+                                modal.close(target);
                             }
                         } catch (Exception e) {
                             LOG.error("Error provisioning resources", e);
                             error(getString(Constants.ERROR) + ": " + e.getMessage());
-                            feedbackPanel.refresh(target);
+                            modal.getFeedbackPanel().refresh(target);
                         }
                     }
                 }.feedbackPanelAutomaticReload(false);
@@ -612,14 +606,16 @@ public class StatusModalPage<T extends AnyTO> extends AbstractStatusModalPage {
     }
 
     private void loadBulkActionResultPage(
-            final Collection<StatusBean> selection, final BulkActionResult bulkActionResult) {
+            final AjaxRequestTarget target,
+            final Collection<StatusBean> selection,
+            final BulkActionResult bulkActionResult) {
         final List<String> resources = new ArrayList<String>(selection.size());
         for (StatusBean statusBean : selection) {
             resources.add(statusBean.getResourceName());
         }
 
-        final List<ConnObjectWrapper> connObjects =
-                statusUtils.getConnectorObjects(Collections.singletonList(anyTO), resources);
+        final List<ConnObjectWrapper> connObjects = statusUtils.getConnectorObjects(Collections.singletonList(anyTO),
+                resources);
 
         final List<StatusBean> statusBeans = new ArrayList<StatusBean>(connObjects.size());
 
@@ -632,11 +628,12 @@ public class StatusModalPage<T extends AnyTO> extends AbstractStatusModalPage {
             statusBeans.add(statusBean);
         }
 
-        setResponsePage(new BulkActionResultModalPage<StatusBean, String>(
-                window,
+        target.add(modal.setContent(new BulkActionResultModalPage<StatusBean, String>(
+                modal,
+                pageRef,
                 statusBeans,
                 columns,
                 bulkActionResult,
-                "resourceName"));
+                "resourceName")));
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1e15b05e/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 0eeaa42..2ce0a30 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
@@ -20,9 +20,9 @@ package org.apache.syncope.client.console.pages;
 
 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.UserTO;
 import org.apache.wicket.PageReference;
-import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 
 /**
  * Modal window with Display user attributes form.
@@ -33,10 +33,13 @@ public class UserDisplayAttributesModalPage extends DisplayAttributesModalPage {
     private static final long serialVersionUID = 5194630813773543054L;
 
     public static final String[] USER_DEFAULT_SELECTION = { "key", "username", "status" };
-    
-    public UserDisplayAttributesModalPage(final PageReference pageRef, final ModalWindow window,
-            final List<String> schemaNames, final List<String> dSchemaNames) {
-        super(pageRef, window, schemaNames, dSchemaNames);
+
+    public UserDisplayAttributesModalPage(
+            final BaseModal<UserTO> modal,
+            final PageReference pageRef,
+            final List<String> schemaNames,
+            final List<String> dSchemaNames) {
+        super(modal, pageRef, schemaNames, dSchemaNames);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/1e15b05e/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
index 5bda1fd..c55d6bd 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
@@ -25,6 +25,7 @@ import org.apache.syncope.client.console.commons.AnyDataProvider;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.pages.AbstractBasePage;
 import org.apache.syncope.client.console.rest.AbstractAnyRestClient;
+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.common.lib.to.AnyTO;
 import org.apache.wicket.PageReference;
@@ -44,7 +45,7 @@ import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public abstract class AbstractSearchResultPanel extends Panel implements IEventSource {
+public abstract class AbstractSearchResultPanel<T extends AnyTO> extends Panel implements IEventSource {
 
     private static final long serialVersionUID = -9170191461250434024L;
 
@@ -54,36 +55,6 @@ public abstract class AbstractSearchResultPanel extends Panel implements IEventS
     protected static final Logger LOG = LoggerFactory.getLogger(AbstractSearchResultPanel.class);
 
     /**
-     * Edit modal window height.
-     */
-    private static final int EDIT_MODAL_WIN_HEIGHT = 550;
-
-    /**
-     * Edit modal window width.
-     */
-    private static final int EDIT_MODAL_WIN_WIDTH = 800;
-
-    /**
-     * Schemas to be shown modal window height.
-     */
-    private static final int DISPLAYATTRS_MODAL_WIN_HEIGHT = 550;
-
-    /**
-     * Schemas to be shown modal window width.
-     */
-    private static final int DISPLAYATTRS_MODAL_WIN_WIDTH = 550;
-
-    /**
-     * Schemas to be shown modal window height.
-     */
-    private static final int STATUS_MODAL_WIN_HEIGHT = 500;
-
-    /**
-     * Schemas to be shown modal window width.
-     */
-    private static final int STATUS_MODAL_WIN_WIDTH = 700;
-
-    /**
      * Application preferences.
      */
     @SpringBean
@@ -128,19 +99,10 @@ public abstract class AbstractSearchResultPanel extends Panel implements IEventS
     private AnyDataProvider dataProvider;
 
     /**
-     * Modal window to be used for user profile editing. Global visibility is required ...
-     */
-    protected final ModalWindow editmodal = new ModalWindow("editModal");
-
-    /**
-     * Modal window to be used for attributes choosing to display in tables.
-     */
-    protected final ModalWindow displaymodal = new ModalWindow("displayModal");
-
-    /**
-     * Modal window to be used for user status management.
+     * Modal window to be used for: user profile editing (Global visibility is required); attributes choosing to
+     * display in tables; user status management.
      */
-    protected final ModalWindow statusmodal = new ModalWindow("statusModal");
+    protected final BaseModal<T> modal = new BaseModal<>("modal");
 
     /**
      * Owner page.
@@ -163,6 +125,8 @@ public abstract class AbstractSearchResultPanel extends Panel implements IEventS
 
         super(id);
 
+        add(modal);
+
         setOutputMarkupId(true);
 
         this.page = (AbstractBasePage) pageRef.getPage();
@@ -173,24 +137,6 @@ public abstract class AbstractSearchResultPanel extends Panel implements IEventS
 
         this.restClient = restClient;
 
-        editmodal.setCssClassName(ModalWindow.CSS_CLASS_GRAY);
-        editmodal.setInitialHeight(EDIT_MODAL_WIN_HEIGHT);
-        editmodal.setInitialWidth(EDIT_MODAL_WIN_WIDTH);
-        editmodal.setCookieName("edit-modal");
-        add(editmodal);
-
-        displaymodal.setCssClassName(ModalWindow.CSS_CLASS_GRAY);
-        displaymodal.setInitialHeight(DISPLAYATTRS_MODAL_WIN_HEIGHT);
-        displaymodal.setInitialWidth(DISPLAYATTRS_MODAL_WIN_WIDTH);
-        displaymodal.setCookieName("display-modal");
-        add(displaymodal);
-
-        statusmodal.setCssClassName(ModalWindow.CSS_CLASS_GRAY);
-        statusmodal.setInitialHeight(STATUS_MODAL_WIN_HEIGHT);
-        statusmodal.setInitialWidth(STATUS_MODAL_WIN_WIDTH);
-        statusmodal.setCookieName("status-modal");
-        add(statusmodal);
-
         // Container for user search result
         container = new WebMarkupContainer("container");
         container.setOutputMarkupId(true);
@@ -236,9 +182,7 @@ public abstract class AbstractSearchResultPanel extends Panel implements IEventS
         paginatorForm.add(rowsChooser);
         // ---------------------------
 
-        setWindowClosedReloadCallback(statusmodal);
-        setWindowClosedReloadCallback(editmodal);
-        setWindowClosedReloadCallback(displaymodal);
+        setWindowClosedReloadCallback(modal);
     }
 
     public void search(final String fiql, final AjaxRequestTarget target) {
@@ -297,13 +241,15 @@ public abstract class AbstractSearchResultPanel extends Panel implements IEventS
         }
     }
 
-    private void setWindowClosedReloadCallback(final ModalWindow window) {
-        window.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {
+    private void setWindowClosedReloadCallback(final BaseModal<?> modal) {
+        modal.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {
 
             private static final long serialVersionUID = 8804221891699487139L;
 
             @Override
             public void onClose(final AjaxRequestTarget target) {
+                modal.show(false);
+
                 final EventDataWrapper data = new EventDataWrapper();
                 data.setTarget(target);
                 data.setRows(rows);

http://git-wip-us.apache.org/repos/asf/syncope/blob/1e15b05e/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 289cf26..73748c0 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
@@ -25,6 +25,7 @@ import org.apache.syncope.client.console.commons.ActionTableCheckGroup;
 import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxButton;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.AjaxFallbackDataTable;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.CheckGroupColumn;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink.ActionType;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
@@ -33,7 +34,6 @@ import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
-import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider;
 import org.apache.wicket.markup.html.WebMarkupContainer;
@@ -121,7 +121,7 @@ public class ActionDataTablePanel<T, S> extends DataTablePanel<T, S> {
         actionPanel.add(action, type, pageId, enabled);
     }
 
-    public void addCancelButton(final ModalWindow window) {
+    public void addCancelButton(final BaseModal<?> modal) {
 
         final AjaxButton cancel = new ClearIndicatingAjaxButton(CANCEL, new ResourceModel(CANCEL), pageRef) {
 
@@ -129,7 +129,7 @@ public class ActionDataTablePanel<T, S> extends DataTablePanel<T, S> {
 
             @Override
             protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
-                window.close(target);
+                modal.close(target);
             }
         }.feedbackPanelAutomaticReload(false);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1e15b05e/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 b98ba71..5041c6e 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
@@ -25,12 +25,12 @@ import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import org.apache.syncope.client.console.panels.AbstractSearchResultPanel.EventDataWrapper;
 import org.apache.syncope.client.console.pages.AbstractBasePage;
 import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.pages.BulkActionModalPage;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.CheckGroupColumn;
 import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxButton;
-import org.apache.syncope.client.console.pages.BulkActionModalPage;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.AjaxFallbackDataTable;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.wicket.AttributeModifier;
-import org.apache.wicket.Page;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
@@ -61,11 +61,7 @@ public class AjaxDataTablePanel<T, S> extends DataTablePanel<T, S> {
 
         super(id);
 
-        final ModalWindow bulkModalWin = new ModalWindow("bulkModal");
-        bulkModalWin.setCssClassName(ModalWindow.CSS_CLASS_GRAY);
-        bulkModalWin.setInitialHeight(600);
-        bulkModalWin.setInitialWidth(900);
-        bulkModalWin.setCookieName("bulk-modal");
+        final BaseModal<?> bulkModalWin = new BaseModal("bulkModal");
         add(bulkModalWin);
 
         bulkModalWin.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {
@@ -114,7 +110,7 @@ public class AjaxDataTablePanel<T, S> extends DataTablePanel<T, S> {
         columns.add(0, new CheckGroupColumn<T, S>(group));
         dataTable = new AjaxFallbackDataTable<>("dataTable", columns, dataProvider, rowsPerPage, container);
         dataTable.add(new AttributeModifier("class", "table table-bordered table-hover dataTable"));
-        
+
         group.add(dataTable);
 
         fragment.add(new ClearIndicatingAjaxButton("bulkActionLink", bulkActionForm, pageRef) {
@@ -123,22 +119,15 @@ public class AjaxDataTablePanel<T, S> extends DataTablePanel<T, S> {
 
             @Override
             protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
-                bulkModalWin.setPageCreator(new ModalWindow.PageCreator() {
-
-                    private static final long serialVersionUID = -7834632442532690941L;
-
-                    @Override
-                    public Page createPage() {
-                        return new BulkActionModalPage<>(
-                                bulkModalWin,
-                                group.getModelObject(),
-                                columns,
-                                actions,
-                                bulkActionExecutor,
-                                itemKeyField,
-                                pageId);
-                    }
-                });
+                bulkModalWin.setContent(new BulkActionModalPage<>(
+                        bulkModalWin,
+                        pageRef,
+                        group.getModelObject(),
+                        columns,
+                        actions,
+                        bulkActionExecutor,
+                        itemKeyField,
+                        pageId));
 
                 bulkModalWin.show(target);
             }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1e15b05e/client/console/src/main/java/org/apache/syncope/client/console/panels/AnySearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnySearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnySearchResultPanel.java
index e9b137d..0940698 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnySearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnySearchResultPanel.java
@@ -20,12 +20,14 @@ 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.Collection;
 import java.util.Date;
 import java.util.List;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.pages.AnyDisplayAttributesModalPage;
+import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.rest.AbstractAnyRestClient;
 import org.apache.syncope.client.console.rest.AnyObjectRestClient;
 import org.apache.syncope.client.console.rest.SchemaRestClient;
@@ -38,26 +40,22 @@ import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.types.SchemaType;
-import org.apache.wicket.Page;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
 import org.apache.wicket.markup.html.basic.Label;
+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.apache.wicket.spring.injection.annot.SpringBean;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.util.ReflectionUtils;
 
-public class AnySearchResultPanel extends AbstractSearchResultPanel {
+public class AnySearchResultPanel<T extends AnyTO> extends AbstractSearchResultPanel<T> {
 
     private static final long serialVersionUID = -1100228004207271270L;
 
-    protected static final Logger LOG = LoggerFactory.getLogger(AnySearchResultPanel.class);
-
     @SpringBean
     protected SchemaRestClient schemaRestClient;
 
@@ -66,7 +64,7 @@ public class AnySearchResultPanel extends AbstractSearchResultPanel {
     protected final List<String> dSchemaNames;
 
     protected final String pageID = "Any";
-    
+
     private final String entitlement = "USER_LIST";
 
     public AnySearchResultPanel(final String type, final String parentId, final boolean filtered,
@@ -91,8 +89,7 @@ public class AnySearchResultPanel extends AbstractSearchResultPanel {
     @Override
     protected List<IColumn<AnyTO, String>> getColumns() {
 
-        final List<IColumn<AnyTO, String>> columns =
-                new ArrayList<IColumn<AnyTO, String>>();
+        final List<IColumn<AnyTO, String>> columns = new ArrayList<IColumn<AnyTO, String>>();
 
         for (String name : prefMan.getList(getRequest(), Constants.PREF_ANY_DETAILS_VIEW)) {
             final Field field = ReflectionUtils.findField(AnyObjectTO.class, name);
@@ -133,7 +130,7 @@ public class AnySearchResultPanel extends AbstractSearchResultPanel {
             private static final long serialVersionUID = -3503023501954863131L;
 
             @Override
-            public ActionLinksPanel getActions(final String componentId, final IModel<AnyTO> model) {
+            public ActionLinksPanel<AnyTO> getActions(final String componentId, final IModel<AnyTO> model) {
 
                 final ActionLinksPanel.Builder<AnyTO> panel = ActionLinksPanel.builder(page.getPageReference());
 
@@ -143,19 +140,16 @@ public class AnySearchResultPanel extends AbstractSearchResultPanel {
 
                     @Override
                     public void onClick(final AjaxRequestTarget target, final AnyTO anyTO) {
-                        editmodal.setPageCreator(new ModalWindow.PageCreator() {
+                        final T modelObject = ((AnyObjectRestClient) restClient).<T>read(anyTO.getKey());
 
-                            private static final long serialVersionUID = -7834632442532690940L;
+                        final IModel<T> model = new CompoundPropertyModel<>(modelObject);
+                        modal.setFormModel(model);
 
-                            @Override
-                            public Page createPage() {
-                                // SYNCOPE-294: re-read anyTO before edit
-                                AnyObjectTO anyTO = ((AnyObjectRestClient) restClient).read(model.getObject().getKey());
-                                return null;
-                            }
-                        });
+                        // still missing content
+                        target.add(modal);
 
-                        editmodal.show(target);
+                        modal.header(new Model<String>(MessageFormat.format(getString("any.edit"), anyTO.getKey())));
+                        modal.show(true);
                     }
                 }, ActionLink.ActionType.EDIT, entitlement).add(new ActionLink<AnyTO>() {
 
@@ -164,34 +158,22 @@ public class AnySearchResultPanel extends AbstractSearchResultPanel {
                     @Override
                     public void onClick(final AjaxRequestTarget target, final AnyTO anyTO) {
                         try {
-                            AnyTO deleteAnyTO =
-                                    restClient.delete(model.getObject().getETagValue(), model.getObject().getKey());
-
-                            page.setModalResult(true);
-
-                            editmodal.setPageCreator(new ModalWindow.PageCreator() {
-
-                                private static final long serialVersionUID = -7834632442532690940L;
-
-                                @Override
-                                public Page createPage() {
-                                    return null;
-                                }
-                            });
-
-                            editmodal.show(target);
-                        } catch (SyncopeClientException scce) {
-                            error(getString(Constants.OPERATION_ERROR) + ": " + scce.getMessage());
-                            feedbackPanel.refresh(target);
+                            restClient.delete(model.getObject().getETagValue(), model.getObject().getKey());
+                            info(getString(Constants.OPERATION_SUCCEEDED));
+                            target.add(container);
+                        } catch (SyncopeClientException e) {
+                            error(getString(Constants.ERROR) + ": " + e.getMessage());
+                            LOG.error("While deleting object {}", anyTO.getKey(), e);
                         }
+                        ((BasePage) getPage()).getFeedbackPanel().refresh(target);
                     }
                 }, ActionLink.ActionType.DELETE, entitlement);
 
-                return panel.build(componentId);
+                return panel.build(componentId, model.getObject());
             }
 
             @Override
-            public ActionLinksPanel getHeader(final String componentId) {
+            public ActionLinksPanel<Serializable> getHeader(final String componentId) {
                 final ActionLinksPanel.Builder<Serializable> panel = ActionLinksPanel.builder(page.getPageReference());
 
                 panel.add(new ActionLink<Serializable>() {
@@ -200,18 +182,12 @@ public class AnySearchResultPanel extends AbstractSearchResultPanel {
 
                     @Override
                     public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
-                        displaymodal.setPageCreator(new ModalWindow.PageCreator() {
-
-                            private static final long serialVersionUID = -7834632442532690940L;
-
-                            @Override
-                            public Page createPage() {
-                                return new AnyDisplayAttributesModalPage(
-                                        page.getPageReference(), displaymodal, schemaNames, dSchemaNames);
-                            }
-                        });
+                        // still missing content
+                        target.add(modal.setContent(new AnyDisplayAttributesModalPage<T>(
+                                modal, page.getPageReference(), schemaNames, dSchemaNames)));
 
-                        displaymodal.show(target);
+                        modal.header(new ResourceModel("any.attr.display", ""));
+                        modal.show(true);
                     }
                 }, ActionLink.ActionType.CHANGE_VIEW, entitlement).add(new ActionLink<Serializable>() {