http://git-wip-us.apache.org/repos/asf/syncope/blob/39f8a069/client/old_console/src/main/java/org/apache/syncope/client/console/pages/ConfirmPasswordResetModalPage.java
----------------------------------------------------------------------
diff --git 
a/client/old_console/src/main/java/org/apache/syncope/client/console/pages/ConfirmPasswordResetModalPage.java
 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/ConfirmPasswordResetModalPage.java
new file mode 100644
index 0000000..ebc041d
--- /dev/null
+++ 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/ConfirmPasswordResetModalPage.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.pages;
+
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.commons.Mode;
+import 
org.apache.syncope.client.console.wicket.markup.html.form.AjaxPasswordFieldPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.FieldPanel;
+import org.apache.syncope.common.lib.to.UserTO;
+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.form.Form;
+import org.apache.wicket.markup.html.form.PasswordTextField;
+import org.apache.wicket.markup.html.form.StatelessForm;
+import 
org.apache.wicket.markup.html.form.validation.EqualPasswordInputValidator;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.ResourceModel;
+
+public class ConfirmPasswordResetModalPage extends BaseModalPage {
+
+    private static final long serialVersionUID = -8419445804421211904L;
+
+    public ConfirmPasswordResetModalPage(final ModalWindow window, final 
String token) {
+        super();
+        setOutputMarkupId(true);
+
+        final StatelessForm<?> form = new StatelessForm<Object>(FORM);
+        form.setOutputMarkupId(true);
+
+        final FieldPanel<String> password =
+                new AjaxPasswordFieldPanel("password", "password", new 
Model<String>()).setRequired(true);
+        ((PasswordTextField) password.getField()).setResetPassword(true);
+        form.add(password);
+
+        final FieldPanel<String> confirmPassword =
+                new AjaxPasswordFieldPanel("confirmPassword", 
"confirmPassword", new Model<String>());
+        ((PasswordTextField) 
confirmPassword.getField()).setResetPassword(true);
+        form.add(confirmPassword);
+
+        form.add(new EqualPasswordInputValidator(password.getField(), 
confirmPassword.getField()));
+
+        final AjaxButton submit = new IndicatingAjaxButton(APPLY, new 
ResourceModel(SUBMIT, SUBMIT)) {
+
+            private static final long serialVersionUID = -4804368561204623354L;
+
+            @Override
+            protected void onSubmit(final AjaxRequestTarget target, final 
Form<?> form) {
+                try {
+                    userSelfRestClient.confirmPasswordReset(token, 
password.getModelObject());
+
+                    setResponsePage(new ResultStatusModalPage.Builder(window, 
new UserTO()).mode(Mode.SELF).build());
+                } catch (Exception e) {
+                    LOG.error("While confirming password reset for {}", token, 
e);
+                    error(getString(Constants.ERROR) + ": " + e.getMessage());
+                    feedbackPanel.refresh(target);
+                }
+            }
+
+            @Override
+            protected void onError(final AjaxRequestTarget target, final 
Form<?> form) {
+                feedbackPanel.refresh(target);
+            }
+        };
+        form.add(submit);
+        form.setDefaultButton(submit);
+
+        final AjaxButton cancel = new IndicatingAjaxButton(CANCEL, new 
ResourceModel(CANCEL)) {
+
+            private static final long serialVersionUID = -958724007591692537L;
+
+            @Override
+            protected void onSubmit(final AjaxRequestTarget target, final 
Form<?> form) {
+                window.close(target);
+            }
+
+            @Override
+            protected void onError(final AjaxRequestTarget target, final 
Form<?> form) {
+            }
+        };
+        cancel.setDefaultFormProcessing(false);
+        form.add(cancel);
+
+        add(form);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/39f8a069/client/old_console/src/main/java/org/apache/syncope/client/console/pages/ConnObjectModalPage.java
----------------------------------------------------------------------
diff --git 
a/client/old_console/src/main/java/org/apache/syncope/client/console/pages/ConnObjectModalPage.java
 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/ConnObjectModalPage.java
new file mode 100644
index 0000000..cf1c405
--- /dev/null
+++ 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/ConnObjectModalPage.java
@@ -0,0 +1,101 @@
+/*
+ * 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 java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import org.apache.syncope.common.lib.to.AttrTO;
+import org.apache.syncope.common.lib.to.ConnObjectTO;
+import 
org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
+import 
org.apache.syncope.client.console.wicket.markup.html.form.MultiFieldPanel;
+import org.apache.syncope.client.console.wicket.markup.html.list.AltListView;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LoadableDetachableModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.util.ListModel;
+
+public class ConnObjectModalPage extends BaseModalPage {
+
+    private static final long serialVersionUID = -6469290753080058487L;
+
+    public ConnObjectModalPage(final ConnObjectTO connObjectTO) {
+        super();
+
+        final Form<Void> form = new Form<Void>(FORM);
+        form.setEnabled(false);
+        add(form);
+
+        IModel<List<AttrTO>> formProps = new 
LoadableDetachableModel<List<AttrTO>>() {
+
+            private static final long serialVersionUID = 5275935387613157437L;
+
+            @Override
+            protected List<AttrTO> load() {
+                List<AttrTO> attrs = connObjectTO.getPlainAttrs();
+                Collections.sort(attrs, new Comparator<AttrTO>() {
+
+                    @Override
+                    public int compare(final AttrTO attr1, final AttrTO attr2) 
{
+                        if (attr1 == null || attr1.getSchema() == null) {
+                            return -1;
+                        }
+                        if (attr2 == null || attr2.getSchema() == null) {
+                            return 1;
+                        }
+                        return attr1.getSchema().compareTo(attr2.getSchema());
+                    }
+                });
+
+                return attrs;
+            }
+        };
+        final ListView<AttrTO> propView = new AltListView<AttrTO>("propView", 
formProps) {
+
+            private static final long serialVersionUID = 3109256773218160485L;
+
+            @Override
+            protected void populateItem(final ListItem<AttrTO> item) {
+                final AttrTO prop = item.getModelObject();
+
+                Label label = new Label("key", prop.getSchema());
+                item.add(label);
+
+                Panel field;
+                if (prop.getValues().isEmpty()) {
+                    field = new AjaxTextFieldPanel("value",
+                            prop.getSchema(), new Model<String>());
+                } else if (prop.getValues().size() == 1) {
+                    field = new AjaxTextFieldPanel("value",
+                            prop.getSchema(), new 
Model<String>(prop.getValues().get(0)));
+                } else {
+                    field = new MultiFieldPanel<String>("value", new 
ListModel<String>(prop.getValues()),
+                            new AjaxTextFieldPanel("panel", prop.getSchema(), 
new Model<String>()));
+                }
+                item.add(field);
+            }
+        };
+        form.add(propView);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/39f8a069/client/old_console/src/main/java/org/apache/syncope/client/console/pages/ConnectorModalPage.java
----------------------------------------------------------------------
diff --git 
a/client/old_console/src/main/java/org/apache/syncope/client/console/pages/ConnectorModalPage.java
 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/ConnectorModalPage.java
new file mode 100644
index 0000000..8095591
--- /dev/null
+++ 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/ConnectorModalPage.java
@@ -0,0 +1,479 @@
+/*
+ * 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 java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.rest.ConnectorRestClient;
+import 
org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
+import 
org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
+import 
org.apache.syncope.client.console.wicket.markup.html.form.SpinnerFieldPanel;
+import 
org.apache.syncope.client.console.wicket.markup.html.list.ConnConfPropertyListView;
+import org.apache.syncope.common.lib.SyncopeClientException;
+import org.apache.syncope.common.lib.to.ConnBundleTO;
+import org.apache.syncope.common.lib.to.ConnInstanceTO;
+import org.apache.syncope.common.lib.to.ConnPoolConfTO;
+import org.apache.syncope.common.lib.types.ConnConfPropSchema;
+import org.apache.syncope.common.lib.types.ConnConfProperty;
+import org.apache.syncope.common.lib.types.ConnectorCapability;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
+import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
+import 
org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
+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.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.CheckBoxMultipleChoice;
+import org.apache.wicket.markup.html.form.DropDownChoice;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LoadableDetachableModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.apache.wicket.validation.validator.RangeValidator;
+
+/**
+ * Modal window with Connector form.
+ */
+public class ConnectorModalPage extends BaseModalPage {
+
+    private static final long serialVersionUID = -2025535531121434050L;
+
+    @SpringBean
+    private ConnectorRestClient restClient;
+
+    private final Map<String, Map<String, Map<String, ConnBundleTO>>> 
mapConnBundleTOs;
+
+    private final List<ConnectorCapability> selectedCapabilities;
+
+    private ConnBundleTO bundleTO;
+
+    private List<ConnConfProperty> properties;
+
+    private final WebMarkupContainer propertiesContainer;
+
+    public ConnectorModalPage(final PageReference pageRef, final ModalWindow 
window,
+            final ConnInstanceTO connInstanceTO) {
+
+        super();
+
+        this.add(new Label("new", connInstanceTO.getKey() == 0
+                ? new ResourceModel("new")
+                : new Model<>(StringUtils.EMPTY)));
+        this.add(new Label("key", connInstanceTO.getKey() == 0
+                ? StringUtils.EMPTY
+                : connInstanceTO.getKey()));
+
+        // general data setup
+        selectedCapabilities = new ArrayList<>(connInstanceTO.getKey() == 0
+                ? EnumSet.noneOf(ConnectorCapability.class)
+                : connInstanceTO.getCapabilities());
+
+        mapConnBundleTOs = new HashMap<>();
+        for (ConnBundleTO connBundleTO : restClient.getAllBundles()) {
+            // by location
+            if (!mapConnBundleTOs.containsKey(connBundleTO.getLocation())) {
+                mapConnBundleTOs.put(connBundleTO.getLocation(), new 
HashMap<String, Map<String, ConnBundleTO>>());
+            }
+            final Map<String, Map<String, ConnBundleTO>> byLocation = 
mapConnBundleTOs.get(connBundleTO.getLocation());
+
+            // by name
+            if (!byLocation.containsKey(connBundleTO.getBundleName())) {
+                byLocation.put(connBundleTO.getBundleName(), new 
HashMap<String, ConnBundleTO>());
+            }
+            final Map<String, ConnBundleTO> byName = 
byLocation.get(connBundleTO.getBundleName());
+
+            // by version
+            if (!byName.containsKey(connBundleTO.getVersion())) {
+                byName.put(connBundleTO.getVersion(), connBundleTO);
+            }
+        }
+
+        bundleTO = getSelectedBundleTO(connInstanceTO);
+        properties = fillProperties(bundleTO, connInstanceTO);
+
+        // form - first tab
+        final Form<ConnInstanceTO> connectorForm = new Form<>(FORM);
+        connectorForm.setModel(new CompoundPropertyModel<>(connInstanceTO));
+        connectorForm.setOutputMarkupId(true);
+        add(connectorForm);
+
+        propertiesContainer = new WebMarkupContainer("container");
+        propertiesContainer.setOutputMarkupId(true);
+        connectorForm.add(propertiesContainer);
+
+        final Form<ConnInstanceTO> connectorPropForm = new 
Form<>("connectorPropForm");
+        connectorPropForm.setModel(new 
CompoundPropertyModel<>(connInstanceTO));
+        connectorPropForm.setOutputMarkupId(true);
+        propertiesContainer.add(connectorPropForm);
+
+        final AjaxTextFieldPanel displayName = new AjaxTextFieldPanel(
+                "displayName", "display name", new 
PropertyModel<String>(connInstanceTO, "displayName"));
+        displayName.setOutputMarkupId(true);
+        displayName.addRequiredLabel();
+        connectorForm.add(displayName);
+
+        final AjaxDropDownChoicePanel<String> location =
+                new AjaxDropDownChoicePanel<>("location", "location",
+                        new Model<>(bundleTO == null ? null : 
bundleTO.getLocation()));
+        ((DropDownChoice<String>) location.getField()).setNullValid(true);
+        location.setStyleSheet("long_dynamicsize");
+        location.setChoices(new ArrayList<>(mapConnBundleTOs.keySet()));
+        location.setRequired(true);
+        location.addRequiredLabel();
+        location.setOutputMarkupId(true);
+        location.setEnabled(connInstanceTO.getKey() == 0);
+        location.getField().setOutputMarkupId(true);
+        connectorForm.add(location);
+
+        final AjaxDropDownChoicePanel<String> connectorName =
+                new AjaxDropDownChoicePanel<>("connectorName", "connectorName",
+                        new Model<>(bundleTO == null ? null : 
bundleTO.getBundleName()));
+        ((DropDownChoice<String>) connectorName.getField()).setNullValid(true);
+        connectorName.setStyleSheet("long_dynamicsize");
+        connectorName.setChoices(bundleTO == null
+                ? new ArrayList<String>()
+                : new 
ArrayList<>(mapConnBundleTOs.get(connInstanceTO.getLocation()).keySet()));
+        connectorName.setRequired(true);
+        connectorName.addRequiredLabel();
+        connectorName.setEnabled(connInstanceTO.getLocation() != null);
+        connectorName.setOutputMarkupId(true);
+        connectorName.setEnabled(connInstanceTO.getKey() == 0);
+        connectorName.getField().setOutputMarkupId(true);
+        connectorForm.add(connectorName);
+
+        final AjaxDropDownChoicePanel<String> version =
+                new AjaxDropDownChoicePanel<>("version", "version",
+                        new Model<>(bundleTO == null ? null : 
bundleTO.getVersion()));
+        version.setStyleSheet("long_dynamicsize");
+        version.setChoices(bundleTO == null
+                ? new ArrayList<String>()
+                : new 
ArrayList<>(mapConnBundleTOs.get(connInstanceTO.getLocation()).
+                        get(connInstanceTO.getBundleName()).keySet()));
+        version.setRequired(true);
+        version.addRequiredLabel();
+        version.setEnabled(connInstanceTO.getBundleName() != null);
+        version.setOutputMarkupId(true);
+        version.addRequiredLabel();
+        version.getField().setOutputMarkupId(true);
+        connectorForm.add(version);
+
+        final SpinnerFieldPanel<Integer> connRequestTimeout =
+                new SpinnerFieldPanel<>("connRequestTimeout", 
"connRequestTimeout", Integer.class,
+                        new PropertyModel<Integer>(connInstanceTO, 
"connRequestTimeout"), 0, null);
+        connRequestTimeout.getField().add(new RangeValidator<>(0, 
Integer.MAX_VALUE));
+        connectorForm.add(connRequestTimeout);
+
+        if (connInstanceTO.getPoolConf() == null) {
+            connInstanceTO.setPoolConf(new ConnPoolConfTO());
+        }
+        final SpinnerFieldPanel<Integer> poolMaxObjects =
+                new SpinnerFieldPanel<>("poolMaxObjects", "poolMaxObjects", 
Integer.class,
+                        new 
PropertyModel<Integer>(connInstanceTO.getPoolConf(), "maxObjects"), 0, null);
+        poolMaxObjects.getField().add(new RangeValidator<>(0, 
Integer.MAX_VALUE));
+        connectorForm.add(poolMaxObjects);
+        final SpinnerFieldPanel<Integer> poolMinIdle =
+                new SpinnerFieldPanel<>("poolMinIdle", "poolMinIdle", 
Integer.class,
+                        new 
PropertyModel<Integer>(connInstanceTO.getPoolConf(), "minIdle"), 0, null);
+        poolMinIdle.getField().add(new RangeValidator<>(0, Integer.MAX_VALUE));
+        connectorForm.add(poolMinIdle);
+        final SpinnerFieldPanel<Integer> poolMaxIdle =
+                new SpinnerFieldPanel<>("poolMaxIdle", "poolMaxIdle", 
Integer.class,
+                        new 
PropertyModel<Integer>(connInstanceTO.getPoolConf(), "maxIdle"), 0, null);
+        poolMaxIdle.getField().add(new RangeValidator<>(0, Integer.MAX_VALUE));
+        connectorForm.add(poolMaxIdle);
+        final SpinnerFieldPanel<Long> poolMaxWait =
+                new SpinnerFieldPanel<>("poolMaxWait", "poolMaxWait", 
Long.class,
+                        new PropertyModel<Long>(connInstanceTO.getPoolConf(), 
"maxWait"), 0L, null);
+        poolMaxWait.getField().add(new RangeValidator<>(0L, Long.MAX_VALUE));
+        connectorForm.add(poolMaxWait);
+        final SpinnerFieldPanel<Long> poolMinEvictableIdleTime =
+                new SpinnerFieldPanel<>("poolMinEvictableIdleTime", 
"poolMinEvictableIdleTime", Long.class,
+                        new PropertyModel<Long>(connInstanceTO.getPoolConf(), 
"minEvictableIdleTimeMillis"),
+                        0L, null);
+        poolMinEvictableIdleTime.getField().add(new RangeValidator<>(0L, 
Long.MAX_VALUE));
+        connectorForm.add(poolMinEvictableIdleTime);
+
+        // form - first tab - onchange()
+        location.getField().add(new 
AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+
+            private static final long serialVersionUID = -1107858522700306810L;
+
+            @Override
+            protected void onUpdate(final AjaxRequestTarget target) {
+                ((DropDownChoice<String>) 
location.getField()).setNullValid(false);
+                connInstanceTO.setLocation(location.getModelObject());
+                target.add(location);
+
+                connectorName.setChoices(new ArrayList<>(
+                        
mapConnBundleTOs.get(location.getModelObject()).keySet()));
+                connectorName.setEnabled(true);
+                connectorName.getField().setModelValue(null);
+                target.add(connectorName);
+
+                version.setChoices(new ArrayList<String>());
+                version.getField().setModelValue(null);
+                version.setEnabled(false);
+                target.add(version);
+
+                properties.clear();
+                target.add(propertiesContainer);
+            }
+        });
+        connectorName.getField().add(new 
AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+
+            private static final long serialVersionUID = -1107858522700306810L;
+
+            @Override
+            protected void onUpdate(final AjaxRequestTarget target) {
+                ((DropDownChoice<String>) 
connectorName.getField()).setNullValid(false);
+                connInstanceTO.setBundleName(connectorName.getModelObject());
+                target.add(connectorName);
+
+                List<String> versions = new ArrayList<>(
+                        
mapConnBundleTOs.get(location.getModelObject()).get(connectorName.getModelObject()).keySet());
+                version.setChoices(versions);
+                version.setEnabled(true);
+                if (versions.size() == 1) {
+                    selectVersion(target, connInstanceTO, version, 
versions.get(0));
+                    version.getField().setModelObject(versions.get(0));
+                } else {
+                    version.getField().setModelValue(null);
+                    properties.clear();
+                    target.add(propertiesContainer);
+                }
+                target.add(version);
+            }
+        });
+        version.getField().add(new 
AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+
+            private static final long serialVersionUID = -1107858522700306810L;
+
+            @Override
+            protected void onUpdate(final AjaxRequestTarget target) {
+                selectVersion(target, connInstanceTO, version, 
version.getModelObject());
+            }
+        });
+
+        // form - second tab (properties)
+        final ListView<ConnConfProperty> connPropView = new 
ConnConfPropertyListView("connectorProperties",
+                new PropertyModel<List<ConnConfProperty>>(this, "properties"),
+                true, connInstanceTO.getConfiguration());
+        connPropView.setOutputMarkupId(true);
+        connectorPropForm.add(connPropView);
+
+        final AjaxButton check = new IndicatingAjaxButton("check", new 
ResourceModel("check")) {
+
+            private static final long serialVersionUID = -7978723352517770644L;
+
+            @Override
+            public void onSubmit(final AjaxRequestTarget target, final Form<?> 
form) {
+                final ConnInstanceTO conn = (ConnInstanceTO) 
form.getModelObject();
+
+                // ensure that connector bundle information is in sync
+                conn.setBundleName(bundleTO.getBundleName());
+                conn.setVersion(bundleTO.getVersion());
+                conn.setConnectorName(bundleTO.getConnectorName());
+
+                if (restClient.check(conn)) {
+                    info(getString("success_connection"));
+                } else {
+                    error(getString("error_connection"));
+                }
+
+                feedbackPanel.refresh(target);
+            }
+        };
+        connectorPropForm.add(check);
+
+        // form - third tab (capabilities)
+        final IModel<List<ConnectorCapability>> capabilities =
+                new LoadableDetachableModel<List<ConnectorCapability>>() {
+
+                    private static final long serialVersionUID = 
5275935387613157437L;
+
+                    @Override
+                    protected List<ConnectorCapability> load() {
+                        return Arrays.asList(ConnectorCapability.values());
+                    }
+                };
+        CheckBoxMultipleChoice<ConnectorCapability> capabilitiesPalette =
+                new CheckBoxMultipleChoice<>("capabilitiesPalette",
+                        new PropertyModel<List<ConnectorCapability>>(this, 
"selectedCapabilities"), capabilities);
+
+        capabilitiesPalette.add(new AjaxFormChoiceComponentUpdatingBehavior() {
+
+            private static final long serialVersionUID = -1107858522700306810L;
+
+            @Override
+            protected void onUpdate(AjaxRequestTarget target) {
+            }
+        });
+
+        connectorForm.add(capabilitiesPalette);
+
+        // form - submit / cancel buttons
+        final AjaxButton submit = new IndicatingAjaxButton(APPLY, new 
Model<>(getString(SUBMIT))) {
+
+            private static final long serialVersionUID = -958724007591692537L;
+
+            @Override
+            protected void onSubmit(final AjaxRequestTarget target, final 
Form<?> form) {
+                final ConnInstanceTO conn = (ConnInstanceTO) 
form.getModelObject();
+
+                conn.setConnectorName(bundleTO.getConnectorName());
+                conn.setBundleName(bundleTO.getBundleName());
+                conn.setVersion(bundleTO.getVersion());
+                conn.getConfiguration().clear();
+                conn.getConfiguration().addAll(connPropView.getModelObject());
+
+                // Set the model object's capabilities to 
capabilitiesPalette's converted Set
+                conn.getCapabilities().clear();
+                conn.getCapabilities().addAll(selectedCapabilities.isEmpty()
+                        ? EnumSet.noneOf(ConnectorCapability.class)
+                        : EnumSet.copyOf(selectedCapabilities));
+
+                // Reset pool configuration if all fields are null
+                if (conn.getPoolConf() != null
+                        && conn.getPoolConf().getMaxIdle() == null
+                        && conn.getPoolConf().getMaxObjects() == null
+                        && conn.getPoolConf().getMaxWait() == null
+                        && conn.getPoolConf().getMinEvictableIdleTimeMillis() 
== null
+                        && conn.getPoolConf().getMinIdle() == null) {
+
+                    conn.setPoolConf(null);
+                }
+
+                try {
+                    if (connInstanceTO.getKey() == 0) {
+                        restClient.create(conn);
+                    } else {
+                        restClient.update(conn);
+                    }
+
+                    ((Resources) pageRef.getPage()).setModalResult(true);
+                    window.close(target);
+                } catch (SyncopeClientException e) {
+                    error(getString(Constants.ERROR) + ": " + e.getMessage());
+                    feedbackPanel.refresh(target);
+                    ((Resources) pageRef.getPage()).setModalResult(false);
+                    LOG.error("While creating or updating connector {}", conn, 
e);
+                }
+            }
+
+            @Override
+            protected void onError(final AjaxRequestTarget target, final 
Form<?> form) {
+                feedbackPanel.refresh(target);
+            }
+        };
+        String roles = connInstanceTO.getKey() == 0
+                ? xmlRolesReader.getEntitlement("Connectors", "create")
+                : xmlRolesReader.getEntitlement("Connectors", "update");
+        MetaDataRoleAuthorizationStrategy.authorize(submit, ENABLE, roles);
+        connectorForm.add(submit);
+
+        final IndicatingAjaxButton cancel = new IndicatingAjaxButton(CANCEL, 
new ResourceModel(CANCEL)) {
+
+            private static final long serialVersionUID = -958724007591692537L;
+
+            @Override
+            protected void onSubmit(final AjaxRequestTarget target, final 
Form<?> form) {
+                window.close(target);
+            }
+        };
+        cancel.setDefaultFormProcessing(false);
+        connectorForm.add(cancel);
+    }
+
+    private ConnBundleTO getSelectedBundleTO(final ConnInstanceTO 
connInstanceTO) {
+        ConnBundleTO result = null;
+        if (connInstanceTO != null
+                && StringUtils.isNotBlank(connInstanceTO.getLocation())
+                && StringUtils.isNotBlank(connInstanceTO.getBundleName())
+                && StringUtils.isNotBlank(connInstanceTO.getVersion())
+                && mapConnBundleTOs.containsKey(connInstanceTO.getLocation())) 
{
+
+            Map<String, Map<String, ConnBundleTO>> byLocation = 
mapConnBundleTOs.get(connInstanceTO.getLocation());
+            if (byLocation.containsKey(connInstanceTO.getBundleName())) {
+                Map<String, ConnBundleTO> byName = 
byLocation.get(connInstanceTO.getBundleName());
+                if (byName.containsKey(connInstanceTO.getVersion())) {
+                    result = byName.get(connInstanceTO.getVersion());
+                }
+            }
+        }
+        return result;
+    }
+
+    private List<ConnConfProperty> fillProperties(final ConnBundleTO bundleTO, 
final ConnInstanceTO connInstanceTO) {
+        final List<ConnConfProperty> props = new ArrayList<>();
+
+        if (bundleTO != null) {
+            for (ConnConfPropSchema key : bundleTO.getProperties()) {
+                final ConnConfProperty property = new ConnConfProperty();
+                property.setSchema(key);
+                if (connInstanceTO.getKey() != 0
+                        && 
connInstanceTO.getConfigurationMap().containsKey(key.getName())
+                        && 
connInstanceTO.getConfigurationMap().get(key.getName()).getValues() != null) {
+
+                    
property.getValues().addAll(connInstanceTO.getConfigurationMap().get(key.getName()).getValues());
+                    
property.setOverridable(connInstanceTO.getConfigurationMap().get(key.getName()).isOverridable());
+                }
+
+                if (property.getValues().isEmpty() && 
!key.getDefaultValues().isEmpty()) {
+                    property.getValues().addAll(key.getDefaultValues());
+                }
+
+                props.add(property);
+            }
+        }
+
+        // re-order properties (implements Comparable)
+        Collections.sort(props);
+        return props;
+    }
+
+    private void selectVersion(final AjaxRequestTarget target, final 
ConnInstanceTO connInstanceTO,
+            final AjaxDropDownChoicePanel<String> version, final String 
versionValue) {
+
+        connInstanceTO.setVersion(versionValue);
+        target.add(version);
+
+        bundleTO = getSelectedBundleTO(connInstanceTO);
+        properties = fillProperties(bundleTO, connInstanceTO);
+        target.add(propertiesContainer);
+    }
+
+    public List<ConnConfProperty> getProperties() {
+        return properties;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/39f8a069/client/old_console/src/main/java/org/apache/syncope/client/console/pages/DerSchemaModalPage.java
----------------------------------------------------------------------
diff --git 
a/client/old_console/src/main/java/org/apache/syncope/client/console/pages/DerSchemaModalPage.java
 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/DerSchemaModalPage.java
new file mode 100644
index 0000000..1abe744
--- /dev/null
+++ 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/DerSchemaModalPage.java
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.pages;
+
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.commons.JexlHelpUtils;
+import 
org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
+import org.apache.syncope.common.lib.SyncopeClientException;
+import org.apache.syncope.common.lib.to.DerSchemaTO;
+import org.apache.syncope.common.lib.types.AttributableType;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
+import 
org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
+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.WebMarkupContainer;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.model.ResourceModel;
+
+/**
+ * Modal window with Schema form.
+ */
+public class DerSchemaModalPage extends AbstractSchemaModalPage<DerSchemaTO> {
+
+    private static final long serialVersionUID = 6668789770131753386L;
+
+    public DerSchemaModalPage(final AttributableType kind) {
+        super(kind);
+    }
+
+    @Override
+    public void setSchemaModalPage(final PageReference pageRef, final 
ModalWindow window,
+            DerSchemaTO schema, final boolean createFlag) {
+
+        if (schema == null) {
+            schema = new DerSchemaTO();
+        }
+
+        final Form<DerSchemaTO> schemaForm = new Form<>(FORM);
+
+        schemaForm.setModel(new CompoundPropertyModel<>(schema));
+
+        final AjaxTextFieldPanel name =
+                new AjaxTextFieldPanel("key", getString("key"), new 
PropertyModel<String>(schema, "key"));
+        name.addRequiredLabel();
+
+        final AjaxTextFieldPanel expression = new 
AjaxTextFieldPanel("expression", getString("expression"),
+                new PropertyModel<String>(schema, "expression"));
+        expression.addRequiredLabel();
+
+        final WebMarkupContainer jexlHelp = 
JexlHelpUtils.getJexlHelpWebContainer("jexlHelp");
+
+        final AjaxLink<Void> questionMarkJexlHelp = 
JexlHelpUtils.getAjaxLink(jexlHelp, "questionMarkJexlHelp");
+        schemaForm.add(questionMarkJexlHelp);
+        questionMarkJexlHelp.add(jexlHelp);
+
+        name.setEnabled(createFlag);
+
+        final AjaxButton submit = new IndicatingAjaxButton(APPLY, new 
ResourceModel(SUBMIT)) {
+
+            private static final long serialVersionUID = -958724007591692537L;
+
+            @Override
+            protected void onSubmit(final AjaxRequestTarget target, final Form 
form) {
+                DerSchemaTO schemaTO = (DerSchemaTO) 
form.getDefaultModelObject();
+
+                try {
+                    if (createFlag) {
+                        schemaRestClient.createDerSchema(kind, schemaTO);
+                    } else {
+                        schemaRestClient.updateDerSchema(kind, schemaTO);
+                    }
+
+                    if (pageRef.getPage() instanceof BasePage) {
+                        ((BasePage) pageRef.getPage()).setModalResult(true);
+                    }
+
+                    window.close(target);
+                } catch (SyncopeClientException e) {
+                    error(getString(Constants.ERROR) + ": " + e.getMessage());
+                    feedbackPanel.refresh(target);
+                }
+            }
+
+            @Override
+            protected void onError(final AjaxRequestTarget target, final 
Form<?> form) {
+                feedbackPanel.refresh(target);
+            }
+        };
+
+        final AjaxButton cancel = new IndicatingAjaxButton(CANCEL, new 
ResourceModel(CANCEL)) {
+
+            private static final long serialVersionUID = -958724007591692537L;
+
+            @Override
+            protected void onSubmit(final AjaxRequestTarget target, final 
Form<?> form) {
+                window.close(target);
+            }
+        };
+
+        cancel.setDefaultFormProcessing(
+                false);
+
+        String allowedRoles = createFlag
+                ? xmlRolesReader.getEntitlement("Schema", "create")
+                : xmlRolesReader.getEntitlement("Schema", "update");
+
+        MetaDataRoleAuthorizationStrategy.authorize(submit, ENABLE, 
allowedRoles);
+
+        schemaForm.add(name);
+
+        schemaForm.add(expression);
+
+        schemaForm.add(submit);
+
+        schemaForm.add(cancel);
+
+        add(schemaForm);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/39f8a069/client/old_console/src/main/java/org/apache/syncope/client/console/pages/DisplayAttributesModalPage.java
----------------------------------------------------------------------
diff --git 
a/client/old_console/src/main/java/org/apache/syncope/client/console/pages/DisplayAttributesModalPage.java
 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/DisplayAttributesModalPage.java
new file mode 100644
index 0000000..6f89ec3
--- /dev/null
+++ 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/DisplayAttributesModalPage.java
@@ -0,0 +1,273 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.pages;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.commons.PreferenceManager;
+import org.apache.syncope.common.lib.search.SearchableFields;
+import org.apache.syncope.common.lib.to.UserTO;
+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;
+import org.apache.wicket.markup.html.form.Form;
+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.CompoundPropertyModel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LoadableDetachableModel;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+
+/**
+ * Modal window with Display attributes form.
+ */
+@SuppressWarnings({ "unchecked", "rawtypes" })
+public class DisplayAttributesModalPage extends BaseModalPage {
+
+    private static final long serialVersionUID = -4274117450918385110L;
+
+    /**
+     * Max allowed selections.
+     */
+    private static final int MAX_SELECTIONS = 9;
+
+    public static final String[] DEFAULT_SELECTION = { "key", "username", 
"status" };
+
+    @SpringBean
+    private PreferenceManager prefMan;
+
+    private final List<String> selectedDetails;
+
+    private final List<String> selectedPlainSchemas;
+
+    private final List<String> selectedDerSchemas;
+
+    private final List<String> selectedVirSchemas;
+
+    public DisplayAttributesModalPage(final PageReference pageRef, final 
ModalWindow window,
+            final List<String> schemaNames, final List<String> dSchemaNames, 
final List<String> vSchemaNames) {
+
+        super();
+
+        final IModel<List<String>> fnames = new 
LoadableDetachableModel<List<String>>() {
+
+            private static final long serialVersionUID = 5275935387613157437L;
+
+            @Override
+            protected List<String> load() {
+                return SearchableFields.get(UserTO.class);
+            }
+        };
+
+        final IModel<List<String>> names = new 
LoadableDetachableModel<List<String>>() {
+
+            private static final long serialVersionUID = 5275935387613157437L;
+
+            @Override
+            protected List<String> load() {
+                return schemaNames;
+            }
+        };
+
+        final IModel<List<String>> dsnames = new 
LoadableDetachableModel<List<String>>() {
+
+            private static final long serialVersionUID = 5275935387613157437L;
+
+            @Override
+            protected List<String> load() {
+                return dSchemaNames;
+            }
+        };
+
+        final IModel<List<String>> vsnames = new 
LoadableDetachableModel<List<String>>() {
+
+            private static final long serialVersionUID = 5275935387613157437L;
+
+            @Override
+            protected List<String> load() {
+                return vSchemaNames;
+            }
+        };
+
+        final Form form = new Form(FORM);
+        form.setModel(new CompoundPropertyModel(this));
+
+        selectedDetails = prefMan.getList(getRequest(), 
Constants.PREF_USERS_DETAILS_VIEW);
+
+        selectedPlainSchemas = prefMan.getList(getRequest(), 
Constants.PREF_USERS_ATTRIBUTES_VIEW);
+
+        selectedDerSchemas = prefMan.getList(getRequest(), 
Constants.PREF_USERS_DERIVED_ATTRIBUTES_VIEW);
+
+        selectedVirSchemas = prefMan.getList(getRequest(), 
Constants.PREF_USERS_VIRTUAL_ATTRIBUTES_VIEW);
+
+        final CheckGroup dgroup = new CheckGroup("dCheckGroup", new 
PropertyModel(this, "selectedDetails"));
+        form.add(dgroup);
+
+        final ListView<String> details = new ListView<String>("details", 
fnames) {
+
+            private static final long serialVersionUID = 9101744072914090143L;
+
+            @Override
+            protected void populateItem(final ListItem<String> item) {
+                item.add(new Check("dcheck", item.getModel()));
+                item.add(new Label("dname", new 
ResourceModel(item.getModelObject(), item.getModelObject())));
+            }
+        };
+        dgroup.add(details);
+
+        if (names.getObject() == null || names.getObject().isEmpty()) {
+            final Fragment fragment = new Fragment("plainSchemas", 
"emptyFragment", form);
+            form.add(fragment);
+
+            selectedPlainSchemas.clear();
+        } else {
+            final Fragment fragment = new Fragment("plainSchemas", 
"sfragment", form);
+            form.add(fragment);
+
+            final CheckGroup sgroup = new CheckGroup("psCheckGroup", new 
PropertyModel(this, "selectedPlainSchemas"));
+            fragment.add(sgroup);
+
+            final ListView<String> schemas = new 
ListView<String>("plainSchemas", names) {
+
+                private static final long serialVersionUID = 
9101744072914090143L;
+
+                @Override
+                protected void populateItem(final ListItem<String> item) {
+                    item.add(new Check("scheck", item.getModel()));
+                    item.add(new Label("sname", new 
ResourceModel(item.getModelObject(), item.getModelObject())));
+                }
+            };
+            sgroup.add(schemas);
+        }
+
+        if (dsnames.getObject() == null || dsnames.getObject().isEmpty()) {
+            final Fragment fragment = new Fragment("dschemas", 
"emptyFragment", form);
+            form.add(fragment);
+
+            selectedDerSchemas.clear();
+        } else {
+            final Fragment fragment = new Fragment("dschemas", "dsfragment", 
form);
+            form.add(fragment);
+
+            final CheckGroup dsgroup = new CheckGroup("dsCheckGroup", new 
PropertyModel(this, "selectedDerSchemas"));
+            fragment.add(dsgroup);
+
+            final ListView<String> derSchemas = new 
ListView<String>("derSchemas", dsnames) {
+
+                private static final long serialVersionUID = 
9101744072914090143L;
+
+                @Override
+                protected void populateItem(ListItem<String> item) {
+                    item.add(new Check("dscheck", item.getModel()));
+                    item.add(new Label("dsname", new 
ResourceModel(item.getModelObject(), item.getModelObject())));
+                }
+            };
+            dsgroup.add(derSchemas);
+        }
+
+        if (vsnames.getObject() == null || vsnames.getObject().isEmpty()) {
+            final Fragment fragment = new Fragment("vschemas", 
"emptyFragment", form);
+            form.add(fragment);
+
+            selectedVirSchemas.clear();
+        } else {
+            final Fragment fragment = new Fragment("vschemas", "vsfragment", 
form);
+            form.add(fragment);
+
+            final CheckGroup vsgroup = new CheckGroup("vsCheckGroup", new 
PropertyModel(this, "selectedVirSchemas"));
+            fragment.add(vsgroup);
+
+            final ListView<String> virSchemas = new 
ListView<String>("virSchemas", vsnames) {
+
+                private static final long serialVersionUID = 
9101744072914090143L;
+
+                @Override
+                protected void populateItem(ListItem<String> item) {
+                    item.add(new Check("vscheck", item.getModel()));
+                    item.add(new Label("vsname", new 
ResourceModel(item.getModelObject(), item.getModelObject())));
+                }
+            };
+            vsgroup.add(virSchemas);
+        }
+
+        final AjaxButton submit = new IndicatingAjaxButton(SUBMIT, new 
ResourceModel(SUBMIT)) {
+
+            private static final long serialVersionUID = -4804368561204623354L;
+
+            @Override
+            protected void onSubmit(final AjaxRequestTarget target, final 
Form<?> form) {
+                if (selectedDetails.size() + selectedPlainSchemas.size() + 
selectedVirSchemas.size() + selectedDerSchemas.
+                        size()
+                        > MAX_SELECTIONS) {
+
+                    error(getString("tooManySelections"));
+                    onError(target, form);
+                } else {
+                    final Map<String, List<String>> prefs = new 
HashMap<String, List<String>>();
+
+                    prefs.put(Constants.PREF_USERS_DETAILS_VIEW, 
selectedDetails);
+
+                    prefs.put(Constants.PREF_USERS_ATTRIBUTES_VIEW, 
selectedPlainSchemas);
+
+                    prefs.put(Constants.PREF_USERS_DERIVED_ATTRIBUTES_VIEW, 
selectedDerSchemas);
+
+                    prefs.put(Constants.PREF_USERS_VIRTUAL_ATTRIBUTES_VIEW, 
selectedVirSchemas);
+
+                    prefMan.setList(getRequest(), getResponse(), prefs);
+
+                    ((BasePage) pageRef.getPage()).setModalResult(true);
+
+                    window.close(target);
+                }
+            }
+
+            @Override
+            protected void onError(final AjaxRequestTarget target, final 
Form<?> form) {
+                feedbackPanel.refresh(target);
+            }
+        };
+
+        form.add(submit);
+
+        final AjaxButton cancel = new IndicatingAjaxButton(CANCEL, new 
ResourceModel(CANCEL)) {
+
+            private static final long serialVersionUID = -958724007591692537L;
+
+            @Override
+            protected void onSubmit(final AjaxRequestTarget target, final 
Form<?> form) {
+                window.close(target);
+            }
+        };
+
+        cancel.setDefaultFormProcessing(false);
+        form.add(cancel);
+
+        add(form);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/39f8a069/client/old_console/src/main/java/org/apache/syncope/client/console/pages/EditUserModalPage.java
----------------------------------------------------------------------
diff --git 
a/client/old_console/src/main/java/org/apache/syncope/client/console/pages/EditUserModalPage.java
 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/EditUserModalPage.java
new file mode 100644
index 0000000..af502d2
--- /dev/null
+++ 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/EditUserModalPage.java
@@ -0,0 +1,105 @@
+/*
+ * 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 java.util.ArrayList;
+import org.apache.commons.lang3.SerializationUtils;
+import org.apache.syncope.client.console.commons.Mode;
+import org.apache.syncope.client.console.commons.status.StatusBean;
+import org.apache.syncope.client.console.panels.AccountInformationPanel;
+import org.apache.syncope.client.console.panels.MembershipsPanel;
+import org.apache.syncope.client.console.panels.ResourcesPanel;
+import org.apache.syncope.client.console.panels.StatusPanel;
+import org.apache.syncope.common.lib.AttributableOperations;
+import org.apache.syncope.common.lib.mod.UserMod;
+import org.apache.syncope.common.lib.to.UserTO;
+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.ajax.markup.html.modal.ModalWindow;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.model.ResourceModel;
+
+/**
+ * Modal window with User form.
+ */
+public class EditUserModalPage extends UserModalPage {
+
+    private static final long serialVersionUID = -6479209496805705739L;
+
+    protected Form form;
+
+    private final UserTO initialUserTO;
+
+    private StatusPanel statusPanel;
+
+    public EditUserModalPage(final PageReference pageRef, final ModalWindow 
window, final UserTO userTO) {
+        super(pageRef, window, userTO, Mode.ADMIN, true);
+
+        this.initialUserTO = SerializationUtils.clone(userTO);
+
+        form = setupEditPanel();
+
+        // add resource assignment details in case of update
+        if (userTO.getKey() != 0) {
+            form.addOrReplace(new Label("pwdChangeInfo", new 
ResourceModel("pwdChangeInfo")));
+
+            statusPanel = new StatusPanel("statuspanel", userTO, new 
ArrayList<StatusBean>(), getPageReference());
+            statusPanel.setOutputMarkupId(true);
+            MetaDataRoleAuthorizationStrategy.authorize(
+                    statusPanel, RENDER, 
xmlRolesReader.getEntitlement("Resources", "getConnectorObject"));
+            form.addOrReplace(statusPanel);
+
+            form.addOrReplace(new 
AccountInformationPanel("accountinformation", userTO));
+
+            form.addOrReplace(new 
ResourcesPanel.Builder("resources").attributableTO(userTO).
+                    statusPanel(statusPanel).build());
+
+            form.addOrReplace(new MembershipsPanel("memberships", userTO, 
mode, statusPanel, getPageReference()));
+        }
+    }
+
+    @SuppressWarnings("rawtypes")
+    @Override
+    protected void submitAction(final AjaxRequestTarget target, final Form 
form) {
+        final UserTO updatedUserTO = (UserTO) form.getModelObject();
+
+        if (updatedUserTO.getKey() == 0) {
+            userTO = userRestClient.create(updatedUserTO, 
storePassword.getModelObject());
+        } else {
+            final UserMod userMod = AttributableOperations.diff(updatedUserTO, 
initialUserTO);
+
+            if (statusPanel != null) {
+                userMod.setPwdPropRequest(statusPanel.getStatusMod());
+            }
+
+            // update user just if it is changed
+            if (!userMod.isEmpty()) {
+                userTO = userRestClient.update(initialUserTO.getETagValue(), 
userMod);
+            }
+        }
+    }
+
+    @SuppressWarnings("rawtypes")
+    @Override
+    protected void closeAction(final AjaxRequestTarget target, final Form 
form) {
+        setResponsePage(new ResultStatusModalPage.Builder(window, 
userTO).mode(mode).build());
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/39f8a069/client/old_console/src/main/java/org/apache/syncope/client/console/pages/ErrorPage.java
----------------------------------------------------------------------
diff --git 
a/client/old_console/src/main/java/org/apache/syncope/client/console/pages/ErrorPage.java
 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/ErrorPage.java
new file mode 100644
index 0000000..db46171
--- /dev/null
+++ 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/ErrorPage.java
@@ -0,0 +1,42 @@
+/*
+ * 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.Page;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.link.BookmarkablePageLink;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+/**
+ * Error WebPage.
+ */
+public class ErrorPage extends BasePage {
+
+    private static final long serialVersionUID = -390761262038796657L;
+
+    public ErrorPage(final PageParameters parameters) {
+        super(parameters);
+
+        add(new Label("errorTitle", new 
Model<String>(parameters.get("errorTitle").toString())));
+        add(new Label("errorMessage", new 
Model<String>(parameters.get("errorMessage").toString())));
+
+        add(new BookmarkablePageLink<Page>("home", 
getApplication().getHomePage()));
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/39f8a069/client/old_console/src/main/java/org/apache/syncope/client/console/pages/ExecMessageModalPage.java
----------------------------------------------------------------------
diff --git 
a/client/old_console/src/main/java/org/apache/syncope/client/console/pages/ExecMessageModalPage.java
 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/ExecMessageModalPage.java
new file mode 100644
index 0000000..e39f3fc
--- /dev/null
+++ 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/ExecMessageModalPage.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.pages;
+
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.model.Model;
+
+public class ExecMessageModalPage extends BaseModalPage {
+
+    private static final long serialVersionUID = 3163146190501510888L;
+
+    public ExecMessageModalPage(final String message) {
+        final Label dialogContent = new Label("message", new 
Model<String>(message));
+        add(dialogContent.setOutputMarkupId(true));
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/39f8a069/client/old_console/src/main/java/org/apache/syncope/client/console/pages/FailureMessageModalPage.java
----------------------------------------------------------------------
diff --git 
a/client/old_console/src/main/java/org/apache/syncope/client/console/pages/FailureMessageModalPage.java
 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/FailureMessageModalPage.java
new file mode 100644
index 0000000..c0ee7ec
--- /dev/null
+++ 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/FailureMessageModalPage.java
@@ -0,0 +1,37 @@
+/*
+ * 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.markup.html.basic.Label;
+import org.apache.wicket.model.Model;
+
+public class FailureMessageModalPage extends BaseModalPage {
+
+    private static final long serialVersionUID = 9216117990503199258L;
+
+    public FailureMessageModalPage(final String message, final String 
failureMessage) {
+        final Label executionFailureMessage;
+        if (!failureMessage.isEmpty()) {
+            executionFailureMessage = new Label("failureMessage", new 
Model<String>(failureMessage));
+        } else {
+            executionFailureMessage = new Label("failureMessage");
+        }
+        add(executionFailureMessage.setOutputMarkupId(true));
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/39f8a069/client/old_console/src/main/java/org/apache/syncope/client/console/pages/GroupModalPage.java
----------------------------------------------------------------------
diff --git 
a/client/old_console/src/main/java/org/apache/syncope/client/console/pages/GroupModalPage.java
 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/GroupModalPage.java
new file mode 100644
index 0000000..8b4daa9
--- /dev/null
+++ 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/GroupModalPage.java
@@ -0,0 +1,164 @@
+/*
+ * 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 java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.lang3.SerializationUtils;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.commons.Mode;
+import org.apache.syncope.client.console.panels.GroupPanel;
+import org.apache.syncope.common.lib.AttributableOperations;
+import org.apache.syncope.common.lib.mod.GroupMod;
+import org.apache.syncope.common.lib.to.GroupTO;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
+import 
org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
+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.Form;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.ResourceModel;
+
+/**
+ * Modal window with Group form.
+ */
+public class GroupModalPage extends BaseModalPage {
+
+    private static final long serialVersionUID = -1732493223434085205L;
+
+    protected final PageReference pageRef;
+
+    protected final ModalWindow window;
+
+    protected final Mode mode;
+
+    protected final boolean createFlag;
+
+    protected final GroupPanel groupPanel;
+
+    protected GroupTO originalGroupTO;
+
+    public GroupModalPage(final PageReference pageRef, final ModalWindow 
window, final GroupTO groupTO) {
+        this(pageRef, window, groupTO, Mode.ADMIN);
+    }
+
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    public GroupModalPage(
+            final PageReference pageRef, final ModalWindow window, final 
GroupTO groupTO, final Mode mode) {
+        
+        super();
+
+        this.pageRef = pageRef;
+        this.window = window;
+        this.mode = mode;
+
+        this.createFlag = groupTO.getKey() == 0;
+        if (!createFlag) {
+            originalGroupTO = SerializationUtils.clone(groupTO);
+        }
+
+        final Form<GroupTO> form = new Form<GroupTO>("groupForm");
+        form.setMultiPart(true);
+
+        add(new Label("displayName", groupTO.getKey() == 0 ? "" : 
groupTO.getDisplayName()));
+
+        form.setModel(new CompoundPropertyModel<GroupTO>(groupTO));
+
+        this.groupPanel = new GroupPanel.Builder("groupPanel").
+                
form(form).groupTO(groupTO).groupModalPageMode(mode).pageRef(getPageReference()).build();
+        form.add(groupPanel);
+
+        final AjaxButton submit = new IndicatingAjaxButton(SUBMIT, new 
ResourceModel(SUBMIT)) {
+
+            private static final long serialVersionUID = -958724007591692537L;
+
+            @Override
+            protected void onSubmit(final AjaxRequestTarget target, final 
Form<?> form) {
+                try {
+                    submitAction(target, form);
+
+                    if (pageRef.getPage() instanceof BasePage) {
+                        ((BasePage) pageRef.getPage()).setModalResult(true);
+                    }
+
+                    closeAction(target, form);
+                } catch (Exception e) {
+                    error(getString(Constants.ERROR) + ": " + e.getMessage());
+                    feedbackPanel.refresh(target);
+                }
+            }
+
+            @Override
+            protected void onError(final AjaxRequestTarget target, final 
Form<?> form) {
+                feedbackPanel.refresh(target);
+            }
+        };
+        form.add(submit);
+        form.setDefaultButton(submit);
+
+        final AjaxButton cancel = new IndicatingAjaxButton(CANCEL, new 
ResourceModel(CANCEL)) {
+
+            private static final long serialVersionUID = -958724007591692537L;
+
+            @Override
+            protected void onSubmit(final AjaxRequestTarget target, final 
Form<?> form) {
+                closeAction(target, form);
+            }
+        };
+        cancel.setDefaultFormProcessing(false);
+        form.add(cancel);
+
+        MetaDataRoleAuthorizationStrategy.authorize(submit, ENABLE, 
xmlRolesReader.getEntitlement("Groups",
+                createFlag
+                        ? "create"
+                        : "update"));
+
+        add(form);
+    }
+
+    protected void submitAction(final AjaxRequestTarget target, final Form<?> 
form) {
+        final GroupTO groupTO = (GroupTO) form.getDefaultModelObject();
+        final List<String> entitlementList = new 
ArrayList<String>(groupPanel.getSelectedEntitlements());
+        groupTO.getEntitlements().clear();
+        groupTO.getEntitlements().addAll(entitlementList);
+
+        GroupTO result;
+        if (createFlag) {
+            result = groupRestClient.create(groupTO);
+        } else {
+            GroupMod groupMod = AttributableOperations.diff(groupTO, 
originalGroupTO);
+
+            // update group just if it is changed
+            if (groupMod.isEmpty()) {
+                result = groupTO;
+            } else {
+                result = 
groupRestClient.update(originalGroupTO.getETagValue(), groupMod);
+            }
+        }
+
+        setResponsePage(new ResultStatusModalPage.Builder(window, 
result).build());
+    }
+
+    protected void closeAction(final AjaxRequestTarget target, final Form<?> 
form) {
+        window.close(target);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/39f8a069/client/old_console/src/main/java/org/apache/syncope/client/console/pages/GroupSelectModalPage.java
----------------------------------------------------------------------
diff --git 
a/client/old_console/src/main/java/org/apache/syncope/client/console/pages/GroupSelectModalPage.java
 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/GroupSelectModalPage.java
new file mode 100644
index 0000000..97b7abf
--- /dev/null
+++ 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/GroupSelectModalPage.java
@@ -0,0 +1,105 @@
+/*
+ * 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 java.lang.reflect.Constructor;
+import javax.swing.tree.DefaultMutableTreeNode;
+import org.apache.syncope.client.console.commons.GroupTreeBuilder;
+import 
org.apache.syncope.client.console.wicket.markup.html.tree.DefaultMutableTreeNodeExpansion;
+import 
org.apache.syncope.client.console.wicket.markup.html.tree.DefaultMutableTreeNodeExpansionModel;
+import 
org.apache.syncope.client.console.wicket.markup.html.tree.TreeGroupProvider;
+import org.apache.syncope.common.lib.to.GroupTO;
+import org.apache.wicket.Component;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
+import 
org.apache.wicket.extensions.markup.html.repeater.tree.DefaultNestedTree;
+import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider;
+import org.apache.wicket.extensions.markup.html.repeater.tree.NestedTree;
+import org.apache.wicket.extensions.markup.html.repeater.tree.content.Folder;
+import 
org.apache.wicket.extensions.markup.html.repeater.tree.theme.WindowsTheme;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+
+public class GroupSelectModalPage extends BaseModalPage {
+
+    private static final long serialVersionUID = 2106489458494696439L;
+
+    @SpringBean
+    private GroupTreeBuilder groupTreeBuilder;
+
+    private final NestedTree<DefaultMutableTreeNode> tree;
+
+    public GroupSelectModalPage(final PageReference pageRef, final ModalWindow 
window, final Class<?> payloadClass) {
+        super();
+
+        final ITreeProvider<DefaultMutableTreeNode> treeProvider = new 
TreeGroupProvider(groupTreeBuilder, true);
+        final DefaultMutableTreeNodeExpansionModel treeModel = new 
DefaultMutableTreeNodeExpansionModel();
+
+        tree = new DefaultNestedTree<DefaultMutableTreeNode>("treeTable", 
treeProvider, treeModel) {
+
+            private static final long serialVersionUID = 7137658050662575546L;
+
+            @Override
+            protected Component newContentComponent(final String id, final 
IModel<DefaultMutableTreeNode> node) {
+                final DefaultMutableTreeNode treeNode = node.getObject();
+                final GroupTO groupTO = (GroupTO) treeNode.getUserObject();
+
+                return new Folder<DefaultMutableTreeNode>(id, 
GroupSelectModalPage.this.tree, node) {
+
+                    private static final long serialVersionUID = 
9046323319920426493L;
+
+                    @Override
+                    protected boolean isClickable() {
+                        return true;
+                    }
+
+                    @Override
+                    protected IModel<?> newLabelModel(final 
IModel<DefaultMutableTreeNode> model) {
+                        return new Model<>(groupTO.getDisplayName());
+                    }
+
+                    @Override
+                    protected void onClick(final AjaxRequestTarget target) {
+                        super.onClick(target);
+
+                        try {
+                            Constructor<?> constructor = 
payloadClass.getConstructor(Long.class);
+                            Object payload = 
constructor.newInstance(groupTO.getKey());
+
+                            send(pageRef.getPage(), Broadcast.BREADTH, 
payload);
+                        } catch (Exception e) {
+                            LOG.error("Could not send group select event", e);
+                        }
+
+                        window.close(target);
+                    }
+                };
+            }
+        };
+        tree.add(new WindowsTheme());
+        tree.setOutputMarkupId(true);
+
+        DefaultMutableTreeNodeExpansion.get().expandAll();
+
+        this.add(tree);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/39f8a069/client/old_console/src/main/java/org/apache/syncope/client/console/pages/GroupTemplateModalPage.java
----------------------------------------------------------------------
diff --git 
a/client/old_console/src/main/java/org/apache/syncope/client/console/pages/GroupTemplateModalPage.java
 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/GroupTemplateModalPage.java
new file mode 100644
index 0000000..293e402
--- /dev/null
+++ 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/GroupTemplateModalPage.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.pages;
+
+import org.apache.syncope.client.console.commons.Mode;
+import org.apache.syncope.common.lib.to.GroupTO;
+import org.apache.syncope.common.lib.to.SyncTaskTO;
+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.markup.html.form.Form;
+
+public class GroupTemplateModalPage extends GroupModalPage {
+
+    private static final long serialVersionUID = -3849135555203409845L;
+
+    private final SyncTaskTO syncTaskTO;
+
+    public GroupTemplateModalPage(final PageReference callerPageRef, final 
ModalWindow window,
+            final SyncTaskTO syncTaskTO) {
+
+        super(callerPageRef, window, syncTaskTO.getGroupTemplate() == null
+                ? new GroupTO()
+                : syncTaskTO.getGroupTemplate(), Mode.TEMPLATE);
+
+        this.syncTaskTO = syncTaskTO;
+    }
+
+    @Override
+    protected void submitAction(final AjaxRequestTarget target, final Form 
form) {
+        syncTaskTO.setGroupTemplate((GroupTO) form.getModelObject());
+        taskRestClient.updateSyncTask(syncTaskTO);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/39f8a069/client/old_console/src/main/java/org/apache/syncope/client/console/pages/Groups.java
----------------------------------------------------------------------
diff --git 
a/client/old_console/src/main/java/org/apache/syncope/client/console/pages/Groups.java
 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/Groups.java
new file mode 100644
index 0000000..2e92940
--- /dev/null
+++ 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/Groups.java
@@ -0,0 +1,186 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.pages;
+
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.panels.AbstractSearchResultPanel;
+import org.apache.syncope.client.console.panels.GroupSearchPanel;
+import org.apache.syncope.client.console.panels.GroupSearchResultPanel;
+import org.apache.syncope.client.console.panels.GroupSummaryPanel;
+import org.apache.syncope.client.console.rest.GroupRestClient;
+import 
org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxButton;
+import 
org.apache.syncope.client.console.wicket.markup.html.tree.TreeGroupPanel;
+import org.apache.wicket.Session;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.event.IEvent;
+import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+
+/**
+ * Groups WebPage.
+ */
+public class Groups extends BasePage {
+
+    private static final long serialVersionUID = -2147758241610831969L;
+
+    private static final int WIN_HEIGHT = 500;
+
+    private static final int WIN_WIDTH = 800;
+
+    @SpringBean
+    private GroupRestClient restClient;
+
+    private final ModalWindow editGroupWin;
+
+    private final WebMarkupContainer groupTabsContainer;
+
+    public Groups(final PageParameters parameters) {
+        super(parameters);
+
+        groupTabsContainer = new WebMarkupContainer("groupTabsContainer");
+        groupTabsContainer.setOutputMarkupId(true);
+        add(groupTabsContainer);
+
+        editGroupWin = new ModalWindow("editGroupWin");
+        editGroupWin.setCssClassName(ModalWindow.CSS_CLASS_GRAY);
+        editGroupWin.setInitialHeight(WIN_HEIGHT);
+        editGroupWin.setInitialWidth(WIN_WIDTH);
+        editGroupWin.setCookieName("edit-group-modal");
+        add(editGroupWin);
+
+        final TreeGroupPanel treePanel = new TreeGroupPanel("treePanel");
+        treePanel.setOutputMarkupId(true);
+        groupTabsContainer.add(treePanel);
+
+        final GroupSummaryPanel summaryPanel = new 
GroupSummaryPanel.Builder("summaryPanel")
+                
.window(editGroupWin).callerPageRef(Groups.this.getPageReference()).build();
+        groupTabsContainer.add(summaryPanel);
+
+        editGroupWin.setWindowClosedCallback(new 
ModalWindow.WindowClosedCallback() {
+
+            private static final long serialVersionUID = 8804221891699487139L;
+
+            @Override
+            public void onClose(final AjaxRequestTarget target) {
+                final GroupSummaryPanel summaryPanel = (GroupSummaryPanel) 
groupTabsContainer.get("summaryPanel");
+
+                final TreeNodeClickUpdate data = new 
TreeNodeClickUpdate(target,
+                        summaryPanel == null || summaryPanel.getSelectedNode() 
== null
+                        ? 0
+                        : summaryPanel.getSelectedNode().getKey());
+
+                send(getPage(), Broadcast.BREADTH, data);
+
+                if (modalResult) {
+                    
getSession().info(getString(Constants.OPERATION_SUCCEEDED));
+                    feedbackPanel.refresh(target);
+                    modalResult = false;
+                }
+
+            }
+        });
+
+        final AbstractSearchResultPanel searchResult =
+                new GroupSearchResultPanel("searchResult", true, null, 
getPageReference(), restClient);
+        add(searchResult);
+
+        final Form searchForm = new Form("searchForm");
+        add(searchForm);
+
+        final GroupSearchPanel searchPanel = new 
GroupSearchPanel.Builder("searchPanel").build();
+        searchForm.add(searchPanel);
+
+        searchForm.add(new ClearIndicatingAjaxButton("search", new 
ResourceModel("search"), getPageReference()) {
+
+            private static final long serialVersionUID = -958724007591692537L;
+
+            @Override
+            protected void onSubmitInternal(final AjaxRequestTarget target, 
final Form<?> form) {
+                final String fiql = searchPanel.buildFIQL();
+                LOG.debug("Node condition {}", fiql);
+
+                doSearch(target, fiql, searchResult);
+
+                Session.get().getFeedbackMessages().clear();
+                searchPanel.getSearchFeedback().refresh(target);
+            }
+
+            @Override
+            protected void onError(final AjaxRequestTarget target, final 
Form<?> form) {
+                searchPanel.getSearchFeedback().refresh(target);
+            }
+        });
+    }
+
+    private void doSearch(final AjaxRequestTarget target, final String fiql,
+            final AbstractSearchResultPanel resultsetPanel) {
+
+        if (fiql == null) {
+            error(getString(Constants.SEARCH_ERROR));
+            return;
+        }
+
+        resultsetPanel.search(fiql, target);
+    }
+
+    @Override
+    public void onEvent(final IEvent<?> event) {
+        super.onEvent(event);
+
+        if (event.getPayload() instanceof TreeNodeClickUpdate) {
+            final TreeNodeClickUpdate update = (TreeNodeClickUpdate) 
event.getPayload();
+
+            final GroupSummaryPanel summaryPanel = new 
GroupSummaryPanel.Builder("summaryPanel")
+                    
.window(editGroupWin).callerPageRef(Groups.this.getPageReference())
+                    .selectedNodeId(update.getSelectedNodeId()).build();
+
+            groupTabsContainer.addOrReplace(summaryPanel);
+            update.getTarget().add(groupTabsContainer);
+        }
+    }
+
+    public static class TreeNodeClickUpdate {
+
+        private final AjaxRequestTarget target;
+
+        private Long selectedNodeId;
+
+        public TreeNodeClickUpdate(final AjaxRequestTarget target, final Long 
selectedNodeId) {
+            this.target = target;
+            this.selectedNodeId = selectedNodeId;
+        }
+
+        public AjaxRequestTarget getTarget() {
+            return target;
+        }
+
+        public Long getSelectedNodeId() {
+            return selectedNodeId;
+        }
+
+        public void setSelectedNodeId(final Long selectedNodeId) {
+            this.selectedNodeId = selectedNodeId;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/39f8a069/client/old_console/src/main/java/org/apache/syncope/client/console/pages/HomePage.java
----------------------------------------------------------------------
diff --git 
a/client/old_console/src/main/java/org/apache/syncope/client/console/pages/HomePage.java
 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/HomePage.java
new file mode 100644
index 0000000..7b4ba68
--- /dev/null
+++ 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/HomePage.java
@@ -0,0 +1,33 @@
+/*
+ * 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.request.mapper.parameter.PageParameters;
+
+/**
+ * Syncope Home-Page.
+ */
+public class HomePage extends BasePage {
+
+    private static final long serialVersionUID = -6712990478380766293L;
+
+    public HomePage(final PageParameters parameters) {
+        super(parameters);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/39f8a069/client/old_console/src/main/java/org/apache/syncope/client/console/pages/InfoModalPage.java
----------------------------------------------------------------------
diff --git 
a/client/old_console/src/main/java/org/apache/syncope/client/console/pages/InfoModalPage.java
 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/InfoModalPage.java
new file mode 100644
index 0000000..83e0163
--- /dev/null
+++ 
b/client/old_console/src/main/java/org/apache/syncope/client/console/pages/InfoModalPage.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.pages;
+
+import org.apache.syncope.client.console.SyncopeSession;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.link.ExternalLink;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+
+public class InfoModalPage extends BaseModalPage {
+
+    private static final long serialVersionUID = 5558354927844399580L;
+
+    @SpringBean(name = "site")
+    private String siteUrl;
+
+    @SpringBean(name = "license")
+    private String licenseUrl;
+
+    public InfoModalPage() {
+        super();
+
+        add(new ExternalLink("syncopeLink", siteUrl));
+        add(new ExternalLink("licenseLink", licenseUrl));
+        add(new Label("version", SyncopeSession.get().getVersion()));
+    }
+}

Reply via email to