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 2016/04/18 10:05:56 UTC

[4/7] syncope git commit: [SYNCOPE-156, SYNCOPE-817] provides wizard to manage resources and connectors

http://git-wip-us.apache.org/repos/asf/syncope/blob/1735c44c/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.java
new file mode 100644
index 0000000..281b0b7
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.java
@@ -0,0 +1,642 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.wizards.resources;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipConfig;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.apache.commons.collections4.IterableUtils;
+import org.apache.commons.collections4.Predicate;
+import org.apache.syncope.client.console.commons.ConnIdSpecialAttributeName;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.rest.AnyTypeClassRestClient;
+import org.apache.syncope.client.console.rest.AnyTypeRestClient;
+import org.apache.syncope.client.console.rest.ConnectorRestClient;
+import org.apache.syncope.client.console.wicket.ajax.form.IndicatorAjaxFormComponentUpdatingBehavior;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxCheckBoxPanel;
+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.MappingPurposePanel;
+import org.apache.syncope.common.lib.to.AnyTypeClassTO;
+import org.apache.syncope.common.lib.to.AnyTypeTO;
+import org.apache.syncope.common.lib.to.ConnIdObjectClassTO;
+import org.apache.syncope.common.lib.to.ConnInstanceTO;
+import org.apache.syncope.common.lib.to.MappingItemTO;
+import org.apache.syncope.common.lib.to.MappingTO;
+import org.apache.syncope.common.lib.to.ProvisionTO;
+import org.apache.syncope.common.lib.to.ResourceTO;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
+import org.apache.syncope.common.lib.types.ConnConfProperty;
+import org.apache.syncope.common.lib.types.IntMappingType;
+import org.apache.syncope.common.lib.types.MappingPurpose;
+import org.apache.syncope.common.lib.types.StandardEntitlement;
+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.markup.html.WebMarkupContainer;
+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.Model;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.model.ResourceModel;
+
+/**
+ * Resource mapping panel.
+ */
+public class ResourceMappingPanel extends Panel {
+
+    private static final long serialVersionUID = -7982691107029848579L;
+
+    /**
+     * Mapping field style sheet.
+     */
+    private static final String DEF_FIELD_STYLE = "";
+
+    /**
+     * Any type rest client.
+     */
+    private final AnyTypeRestClient anyTypeRestClient = new AnyTypeRestClient();
+
+    /**
+     * Any type class rest client.
+     */
+    private final AnyTypeClassRestClient anyTypeClassRestClient = new AnyTypeClassRestClient();
+
+    /**
+     * ConnInstance rest client.
+     */
+    private final ConnectorRestClient connRestClient = new ConnectorRestClient();
+
+    /**
+     * Resource schema name.
+     */
+    private final List<String> schemaNames;
+
+    private final Label passwordLabel;
+
+    /**
+     * Add mapping button.
+     */
+    private final AjaxButton addMappingBtn;
+
+    /**
+     * All mappings.
+     */
+    private final ListView<MappingItemTO> mappings;
+
+    /**
+     * External resource to be updated.
+     */
+    private final ResourceTO resourceTO;
+
+    /**
+     * External resource provisioning configuration instance to be updated.
+     */
+    private final ProvisionTO provisionTO;
+
+    /**
+     * Mapping container.
+     */
+    private final WebMarkupContainer mappingContainer;
+
+    private MappingTO getMapping() {
+        if (provisionTO.getMapping() == null) {
+            provisionTO.setMapping(new MappingTO());
+        }
+
+        return provisionTO.getMapping();
+    }
+
+    /**
+     * Attribute Mapping Panel.
+     *
+     * @param id panel id
+     * @param resourceTO external resource to be updated.
+     * @param provisionTO external resource provisioning configuration instance.
+     */
+    public ResourceMappingPanel(final String id, final ResourceTO resourceTO, final ProvisionTO provisionTO) {
+        super(id);
+        setOutputMarkupId(true);
+
+        this.resourceTO = resourceTO;
+        this.provisionTO = provisionTO == null ? new ProvisionTO() : provisionTO;
+
+        this.mappingContainer = new WebMarkupContainer("mappingContainer");
+        this.mappingContainer.setOutputMarkupId(true);
+        add(this.mappingContainer);
+
+        if (resourceTO.getConnector() != null && resourceTO.getConnector() > 0) {
+            schemaNames = getSchemaNames(resourceTO.getConnector(), resourceTO.getConfOverride());
+            setEnabled();
+        } else {
+            schemaNames = Collections.<String>emptyList();
+        }
+
+        mappingContainer.add(Constants.getJEXLPopover(this, TooltipConfig.Placement.bottom));
+
+        passwordLabel = new Label("passwordLabel", new ResourceModel("password"));
+        mappingContainer.add(passwordLabel);
+
+        Collections.sort(getMapping().getItems(), new Comparator<MappingItemTO>() {
+
+            @Override
+            public int compare(final MappingItemTO left, final MappingItemTO right) {
+                int compared;
+                if (left == null && right == null) {
+                    compared = 0;
+                } else if (left == null) {
+                    compared = 1;
+                } else if (right == null) {
+                    compared = -1;
+                } else if (left.getPurpose() == MappingPurpose.BOTH && right.getPurpose() != MappingPurpose.BOTH) {
+                    compared = -1;
+                } else if (left.getPurpose() != MappingPurpose.BOTH && right.getPurpose() == MappingPurpose.BOTH) {
+                    compared = 1;
+                } else if (left.getPurpose() == MappingPurpose.PROPAGATION
+                        && (right.getPurpose() == MappingPurpose.PULL
+                        || right.getPurpose() == MappingPurpose.NONE)) {
+                    compared = -1;
+                } else if (left.getPurpose() == MappingPurpose.PULL
+                        && right.getPurpose() == MappingPurpose.PROPAGATION) {
+                    compared = 1;
+                } else if (left.getPurpose() == MappingPurpose.PULL
+                        && right.getPurpose() == MappingPurpose.NONE) {
+                    compared = -1;
+                } else if (left.getPurpose() == MappingPurpose.NONE
+                        && right.getPurpose() != MappingPurpose.NONE) {
+                    compared = 1;
+                } else if (left.isConnObjectKey()) {
+                    compared = -1;
+                } else if (right.isConnObjectKey()) {
+                    compared = 1;
+                } else if (left.isPassword()) {
+                    compared = -1;
+                } else if (right.isPassword()) {
+                    compared = 1;
+                } else {
+                    compared = left.getIntAttrName().compareTo(right.getIntAttrName());
+                }
+                return compared;
+            }
+        });
+
+        mappings = new ListView<MappingItemTO>("mappings", getMapping().getItems()) {
+
+            private static final long serialVersionUID = 4949588177564901031L;
+
+            @Override
+            protected void populateItem(final ListItem<MappingItemTO> item) {
+                final MappingItemTO mapItem = item.getModelObject();
+                if (mapItem.getPurpose() == null) {
+                    mapItem.setPurpose(MappingPurpose.BOTH);
+                }
+
+                AnyTypeKind entity = null;
+                if (provisionTO.getAnyType().equals(AnyTypeKind.GROUP.name())) {
+                    // support for clone
+                    entity = AnyTypeKind.GROUP;
+                } else if (mapItem.getIntMappingType() != null) {
+                    entity = mapItem.getIntMappingType().getAnyTypeKind();
+                }
+
+                // it will happen just in case of clone to create a new mapping for group object
+                if (mapItem.getIntMappingType() != null && mapItem.getIntMappingType().getAnyTypeKind() != entity) {
+                    mapItem.setIntMappingType(null);
+                    mapItem.setIntAttrName(null);
+                }
+
+                //--------------------------------
+                // Entity
+                // -------------------------------
+                final AjaxDropDownChoicePanel<AnyTypeKind> entitiesPanel = new AjaxDropDownChoicePanel<>(
+                        "entities",
+                        new ResourceModel("entities", "entities").getObject(),
+                        new Model<>(entity));
+
+                entitiesPanel.hideLabel();
+                entitiesPanel.setChoices(provisionTO.getAnyType().equals(AnyTypeKind.GROUP.name())
+                        ? Collections.<AnyTypeKind>singletonList(AnyTypeKind.GROUP)
+                        : Arrays.asList(AnyTypeKind.values()));
+
+                entitiesPanel.setStyleSheet(false, DEF_FIELD_STYLE);
+                item.add(entitiesPanel);
+                // -------------------------------
+
+                //--------------------------------
+                // Internal attribute type
+                // -------------------------------
+                final List<IntMappingType> attrTypes = new ArrayList<>(getAttributeTypes(entity));
+                final AjaxDropDownChoicePanel<IntMappingType> intMappingTypes = new AjaxDropDownChoicePanel<>(
+                        "intMappingTypes",
+                        new ResourceModel("intMappingTypes", "intMappingTypes").getObject(),
+                        new PropertyModel<IntMappingType>(mapItem, "intMappingType"),
+                        false);
+                intMappingTypes.setNullValid(true).setRequired(true).hideLabel();
+                intMappingTypes.setChoices(attrTypes);
+                item.add(intMappingTypes);
+                // -------------------------------
+
+                //--------------------------------
+                // Internal attribute
+                // -------------------------------
+                final AjaxDropDownChoicePanel<String> intAttrNames = new AjaxDropDownChoicePanel<>(
+                        "intAttrNames",
+                        getString("intAttrNames"),
+                        new PropertyModel<String>(mapItem, "intAttrName"),
+                        false);
+                intAttrNames.setChoices(Collections.<String>emptyList());
+                intAttrNames.setNullValid(true).setRequired(true).hideLabel();
+                item.add(intAttrNames);
+                // -------------------------------
+
+                //--------------------------------
+                // External attribute
+                // -------------------------------
+                final AjaxTextFieldPanel extAttrNames = new AjaxTextFieldPanel(
+                        "extAttrName",
+                        new ResourceModel("extAttrNames", "extAttrNames").getObject(),
+                        new PropertyModel<String>(mapItem, "extAttrName"));
+                extAttrNames.setChoices(schemaNames);
+
+                boolean required = !mapItem.isPassword();
+                extAttrNames.setRequired(required).hideLabel();
+                extAttrNames.setEnabled(required);
+                item.add(extAttrNames);
+                // -------------------------------
+
+                //--------------------------------
+                // Mandatory
+                // -------------------------------
+                final AjaxTextFieldPanel mandatory = new AjaxTextFieldPanel(
+                        "mandatoryCondition",
+                        new ResourceModel("mandatoryCondition", "mandatoryCondition").getObject(),
+                        new PropertyModel<String>(mapItem, "mandatoryCondition"));
+                mandatory.hideLabel();
+                mandatory.setChoices(Arrays.asList(new String[] { "true", "false" }));
+                item.add(mandatory);
+                // -------------------------------
+
+                //--------------------------------
+                // Connector object key
+                // -------------------------------
+                final AjaxCheckBoxPanel connObjectKey = new AjaxCheckBoxPanel(
+                        "connObjectKey",
+                        new ResourceModel("connObjectKey", "connObjectKey").getObject(),
+                        new PropertyModel<Boolean>(mapItem, "connObjectKey"), false);
+                connObjectKey.hideLabel();
+                item.add(connObjectKey);
+                // -------------------------------
+
+                //--------------------------------
+                // Password
+                // -------------------------------
+                final AjaxCheckBoxPanel password = new AjaxCheckBoxPanel(
+                        "password",
+                        new ResourceModel("password", "password").getObject(),
+                        new PropertyModel<Boolean>(mapItem, "password"), false);
+                item.add(password.hideLabel());
+                // -------------------------------
+
+                //--------------------------------
+                // Purpose
+                // -------------------------------
+                final WebMarkupContainer purpose = new WebMarkupContainer("purpose");
+                purpose.setOutputMarkupId(Boolean.TRUE);
+
+                final MappingPurposePanel panel = new MappingPurposePanel(
+                        "purposeActions", new PropertyModel<MappingPurpose>(mapItem, "purpose"), purpose);
+
+                purpose.add(panel.setRenderBodyOnly(true));
+                item.add(purpose);
+                // -------------------------------
+
+                //--------------------------------
+                // Remove
+                // -------------------------------
+                final ActionLinksPanel.Builder<Serializable> actions = ActionLinksPanel.builder();
+                actions.add(new ActionLink<Serializable>() {
+
+                    private static final long serialVersionUID = -3722207913631435501L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
+                        int index = -1;
+                        for (int i = 0; i < getMapping().getItems().size() && index == -1; i++) {
+                            if (mapItem.equals(getMapping().getItems().get(i))) {
+                                index = i;
+                            }
+                        }
+
+                        if (index != -1) {
+                            getMapping().getItems().remove(index);
+                            item.getParent().removeAll();
+                            target.add(ResourceMappingPanel.this);
+                        }
+                    }
+                }, ActionLink.ActionType.DELETE, StandardEntitlement.RESOURCE_UPDATE);
+                item.add(actions.build("toRemove"));
+                // -------------------------------
+
+                entitiesPanel.getField().add(new IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+
+                    private static final long serialVersionUID = -1107858522700306810L;
+
+                    @Override
+                    protected void onUpdate(final AjaxRequestTarget target) {
+                        attrTypes.clear();
+                        attrTypes.addAll(getAttributeTypes(entitiesPanel.getModelObject()));
+                        intMappingTypes.setChoices(attrTypes);
+
+                        intAttrNames.setChoices(Collections.<String>emptyList());
+
+                        target.add(intMappingTypes);
+                        target.add(intAttrNames);
+                    }
+                });
+
+                intMappingTypes.getField().add(new IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+
+                    private static final long serialVersionUID = -1107858522700306810L;
+
+                    @Override
+                    protected void onUpdate(final AjaxRequestTarget target) {
+                        setAttrNames(intMappingTypes.getModelObject(), intAttrNames);
+                        target.add(intAttrNames);
+
+                        setConnObjectKey(intMappingTypes.getModelObject(), connObjectKey, password);
+                        target.add(connObjectKey);
+                    }
+                });
+
+                intAttrNames.getField().add(new IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+
+                    private static final long serialVersionUID = -1107858522700306810L;
+
+                    @Override
+                    protected void onUpdate(final AjaxRequestTarget target) {
+                    }
+                });
+
+                connObjectKey.getField().add(new IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+
+                    private static final long serialVersionUID = -1107858522700306810L;
+
+                    @Override
+                    protected void onUpdate(final AjaxRequestTarget target) {
+                        if (connObjectKey.getModelObject()) {
+                            mapItem.setMandatoryCondition("true");
+                            mandatory.setEnabled(false);
+                        } else {
+                            mapItem.setMandatoryCondition("false");
+                            mandatory.setEnabled(true);
+                        }
+                        target.add(mandatory);
+                    }
+                });
+
+                password.getField().add(new IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+
+                    private static final long serialVersionUID = -1107858522700306810L;
+
+                    @Override
+                    protected void onUpdate(final AjaxRequestTarget target) {
+                        extAttrNames.setEnabled(!mapItem.isConnObjectKey() && !password.getModelObject());
+                        extAttrNames.setModelObject(password.getModelObject()
+                                ? ConnIdSpecialAttributeName.PASSWORD : extAttrNames.getModelObject());
+                        extAttrNames.setRequired(!password.getModelObject());
+                        target.add(extAttrNames);
+
+                        setConnObjectKey(intMappingTypes.getModelObject(), connObjectKey, password);
+                        target.add(connObjectKey);
+                    }
+                });
+
+                setAttrNames(mapItem.getIntMappingType(), intAttrNames);
+                setConnObjectKey(mapItem.getIntMappingType(), connObjectKey, password);
+
+                if (!AnyTypeKind.USER.name().equals(provisionTO.getAnyType())) {
+                    password.setVisible(false);
+
+                    // Changes required by clone ....
+                    extAttrNames.setEnabled(!mapItem.isConnObjectKey());
+                    if (mapItem.isPassword()) {
+                        // re-enable if and only if cloned objec mapping item was a password
+                        intAttrNames.setEnabled(true);
+                    }
+                    mapItem.setPassword(false);
+                }
+            }
+        };
+
+        mappings.setReuseItems(true);
+        mappingContainer.add(mappings);
+
+        addMappingBtn = new IndicatingAjaxButton("addMappingBtn", new ResourceModel("add")) {
+
+            private static final long serialVersionUID = -4804368561204623354L;
+
+            @Override
+            protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
+                getMapping().getItems().add(new MappingItemTO());
+                target.add(ResourceMappingPanel.this);
+            }
+        };
+        addMappingBtn.setDefaultFormProcessing(false);
+        addMappingBtn.setEnabled(resourceTO.getConnector() != null && resourceTO.getConnector() > 0);
+        mappingContainer.add(addMappingBtn);
+    }
+
+    @Override
+    protected void onBeforeRender() {
+        super.onBeforeRender();
+        passwordLabel.setVisible(AnyTypeKind.USER.name().equals(this.provisionTO.getAnyType()));
+    }
+
+    private List<String> getSchemaNames(final Long connectorId, final Set<ConnConfProperty> conf) {
+        final ConnInstanceTO connInstanceTO = new ConnInstanceTO();
+        connInstanceTO.setKey(connectorId);
+        connInstanceTO.getConf().addAll(conf);
+
+        // SYNCOPE-156: use provided info to give schema names (and type!) by ObjectClass
+        ConnIdObjectClassTO clazz = IterableUtils.find(
+                connRestClient.buildObjectClassInfo(connInstanceTO, true), new Predicate<ConnIdObjectClassTO>() {
+
+            @Override
+            public boolean evaluate(final ConnIdObjectClassTO object) {
+                return object.getType().equalsIgnoreCase(ResourceMappingPanel.this.provisionTO.getObjectClass());
+            }
+        });
+
+        return clazz == null ? new ArrayList<String>()
+                : IterableUtils.toList(IterableUtils.filteredIterable(clazz.getAttributes(), new Predicate<String>() {
+
+                    @Override
+                    public boolean evaluate(final String object) {
+                        return !(ConnIdSpecialAttributeName.NAME.equals(object)
+                                || ConnIdSpecialAttributeName.ENABLE.equals(object)
+                                || ConnIdSpecialAttributeName.PASSWORD.equals(object));
+                    }
+                }));
+    }
+
+    private void setEnabled() {
+        ConnInstanceTO connInstanceTO = new ConnInstanceTO();
+        connInstanceTO.setKey(resourceTO.getConnector());
+        connInstanceTO.getConf().addAll(resourceTO.getConfOverride());
+
+        boolean enabled = provisionTO != null;
+
+        this.mappingContainer.setEnabled(enabled);
+        this.mappingContainer.setVisible(enabled);
+
+        if (!enabled) {
+            getMapping().getItems().clear();
+            getMapping().setConnObjectLink(null);
+        }
+    }
+
+    /**
+     * Set attribute names for a drop down choice list.
+     *
+     * @param type attribute type.
+     * @param toBeUpdated drop down choice to be updated.
+     */
+    private void setAttrNames(final IntMappingType type, final AjaxDropDownChoicePanel<String> toBeUpdated) {
+        toBeUpdated.setRequired(true);
+        toBeUpdated.setEnabled(true);
+
+        if (type == null || type.getAnyTypeKind() == null) {
+            toBeUpdated.setChoices(Collections.<String>emptyList());
+        } else {
+            AnyTypeTO anyTypeTO = anyTypeRestClient.read(provisionTO.getAnyType());
+
+            List<AnyTypeClassTO> anyTypeClassTOs = new ArrayList<>();
+            anyTypeClassTOs.addAll(anyTypeClassRestClient.list(anyTypeTO.getClasses()));
+            for (String auxClass : provisionTO.getAuxClasses()) {
+                anyTypeClassTOs.add(anyTypeClassRestClient.read(auxClass));
+            }
+
+            List<String> choices;
+            switch (type) {
+                case UserPlainSchema:
+                case GroupPlainSchema:
+                case AnyObjectPlainSchema:
+                    final Set<String> plains = new HashSet<>();
+                    for (AnyTypeClassTO anyTypeClassTO : anyTypeClassTOs) {
+                        plains.addAll(anyTypeClassTO.getPlainSchemas());
+                    }
+                    choices = new ArrayList<>(plains);
+                    break;
+
+                case UserDerivedSchema:
+                case GroupDerivedSchema:
+                case AnyObjectDerivedSchema:
+                    final Set<String> deriveds = new HashSet<>();
+                    for (AnyTypeClassTO anyTypeClassTO : anyTypeClassTOs) {
+                        deriveds.addAll(anyTypeClassTO.getDerSchemas());
+                    }
+                    choices = new ArrayList<>(deriveds);
+                    break;
+
+                case UserVirtualSchema:
+                case GroupVirtualSchema:
+                case AnyObjectVirtualSchema:
+                    final Set<String> virtuals = new HashSet<>();
+                    for (AnyTypeClassTO anyTypeClassTO : anyTypeClassTOs) {
+                        virtuals.addAll(anyTypeClassTO.getVirSchemas());
+                    }
+                    choices = new ArrayList<>(virtuals);
+                    break;
+
+                case UserKey:
+                case Password:
+                case Username:
+                case GroupKey:
+                case GroupName:
+                case AnyObjectKey:
+                default:
+                    toBeUpdated.setRequired(false);
+                    toBeUpdated.setEnabled(false);
+                    choices = Collections.<String>emptyList();
+            }
+            Collections.sort(choices);
+            toBeUpdated.setChoices(choices);
+        }
+    }
+
+    /**
+     * Enable/Disable connObjectKey checkbox.
+     *
+     * @param type attribute type.
+     * @param connObjectKey connObjectKey checkbox.
+     * @param password password checkbox.
+     */
+    private void setConnObjectKey(
+            final IntMappingType type, final AjaxCheckBoxPanel connObjectKey, final AjaxCheckBoxPanel password) {
+
+        if (type != null && type.getAnyTypeKind() != null) {
+            switch (type) {
+                case UserVirtualSchema:
+                case GroupVirtualSchema:
+                case AnyObjectVirtualSchema:
+                // Virtual connObjectKey is not permitted
+                case Password:
+                    // connObjectKey cannot be derived from password.
+                    connObjectKey.setReadOnly(true);
+                    connObjectKey.setModelObject(false);
+                    break;
+
+                default:
+                    if (password.getModelObject()) {
+                        connObjectKey.setReadOnly(true);
+                        connObjectKey.setModelObject(false);
+                    } else {
+                        connObjectKey.setReadOnly(false);
+                    }
+            }
+        }
+    }
+
+    /**
+     * Get all attribute types from a selected attribute type.
+     *
+     * @param kind entity.
+     * @return all attribute types.
+     */
+    private List<IntMappingType> getAttributeTypes(final AnyTypeKind kind) {
+        final List<IntMappingType> res = new ArrayList<>();
+
+        if (kind != null) {
+            res.addAll(IntMappingType.getAttributeTypes(kind));
+        }
+
+        return res;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/1735c44c/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java
new file mode 100644
index 0000000..67aaf9b
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.wizards.resources;
+
+import java.util.List;
+import org.apache.commons.collections4.IteratorUtils;
+import org.apache.commons.collections4.Predicate;
+import org.apache.commons.lang3.SerializationUtils;
+import org.apache.syncope.client.console.panels.ListViewPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
+import org.apache.syncope.client.console.wizards.AjaxWizard;
+import org.apache.syncope.common.lib.to.ProvisionTO;
+import org.apache.syncope.common.lib.to.ResourceTO;
+import org.apache.syncope.common.lib.types.StandardEntitlement;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.extensions.wizard.WizardStep;
+
+public class ResourceProvisionPanel extends WizardStep {
+
+    private static final long serialVersionUID = -7982691107029848579L;
+
+    public ResourceProvisionPanel(final ResourceTO resourceTO, final PageReference pageRef) {
+        super();
+        setOutputMarkupId(true);
+
+        final ListViewPanel.Builder<ProvisionTO> builder = new ListViewPanel.Builder<ProvisionTO>(
+                ProvisionTO.class, pageRef) {
+
+            private static final long serialVersionUID = 4907732721283972943L;
+
+            @Override
+            protected ProvisionTO getActualItem(final ProvisionTO item, final List<ProvisionTO> list) {
+                return item == null
+                        ? null
+                        : IteratorUtils.find(list.iterator(), new Predicate<ProvisionTO>() {
+
+                            @Override
+                            public boolean evaluate(final ProvisionTO in) {
+                                return ((item.getKey() == null && in.getKey() == null)
+                                        || (in.getKey() != null && in.getKey().equals(item.getKey())))
+                                        && ((item.getAnyType() == null && in.getAnyType() == null)
+                                        || (in.getAnyType() != null && in.getAnyType().equals(item.getAnyType())));
+                            }
+                        });
+            }
+        };
+
+        builder.setItems(resourceTO.getProvisions());
+        builder.includes("anyType", "objectClass", "auxClasses");
+        builder.setReuseItem(false);
+
+        builder.
+                addAction(new ActionLink<ProvisionTO>() {
+
+                    private static final long serialVersionUID = -3722207913631435504L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
+                        send(pageRef.getPage(), Broadcast.DEPTH,
+                                new AjaxWizard.NewItemActionEvent<>(provisionTO, 2, target));
+                    }
+                }, ActionLink.ActionType.MAPPING, StandardEntitlement.RESOURCE_UPDATE).
+                addAction(new ActionLink<ProvisionTO>() {
+
+                    private static final long serialVersionUID = -3722207913631435524L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
+                        provisionTO.setSyncToken(null);
+                        send(pageRef.getPage(), Broadcast.DEPTH, new ListViewPanel.ListViewReload(target));
+                    }
+                }, ActionLink.ActionType.RESET_TIME, StandardEntitlement.RESOURCE_UPDATE).
+                addAction(new ActionLink<ProvisionTO>() {
+
+                    private static final long serialVersionUID = -3722207913631435534L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
+                        final ProvisionTO clone = SerializationUtils.clone(provisionTO);
+                        clone.setKey(0L);
+                        clone.setAnyType(null);
+                        clone.setObjectClass(null);
+                        send(pageRef.getPage(), Broadcast.DEPTH, new AjaxWizard.NewItemActionEvent<>(clone, target));
+                    }
+                }, ActionLink.ActionType.CLONE, StandardEntitlement.RESOURCE_CREATE).
+                addAction(new ActionLink<ProvisionTO>() {
+
+                    private static final long serialVersionUID = -3722207913631435544L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
+                        resourceTO.getProvisions().remove(provisionTO);
+                        send(pageRef.getPage(), Broadcast.DEPTH, new ListViewPanel.ListViewReload(target));
+                    }
+                }, ActionLink.ActionType.DELETE, StandardEntitlement.RESOURCE_DELETE);
+
+        builder.addNewItemPanelBuilder(new ProvisionWizardBuilder(resourceTO, pageRef));
+        add(builder.build("provision"));
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/1735c44c/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceSecurityPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceSecurityPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceSecurityPanel.java
new file mode 100644
index 0000000..1661893
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceSecurityPanel.java
@@ -0,0 +1,137 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.wizards.resources;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.syncope.client.console.rest.PolicyRestClient;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.PolicyRenderer;
+import org.apache.syncope.common.lib.policy.AbstractPolicyTO;
+import org.apache.syncope.common.lib.to.ResourceTO;
+import org.apache.syncope.common.lib.types.PolicyType;
+import org.apache.wicket.extensions.wizard.WizardStep;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.form.DropDownChoice;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LoadableDetachableModel;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.model.ResourceModel;
+
+public class ResourceSecurityPanel extends WizardStep {
+
+    private static final long serialVersionUID = -7982691107029848579L;
+
+    private final PolicyRestClient policyRestClient = new PolicyRestClient();
+
+    private final IModel<Map<Long, String>> passwordPolicies = new LoadableDetachableModel<Map<Long, String>>() {
+
+        private static final long serialVersionUID = 5275935387613157437L;
+
+        @Override
+        protected Map<Long, String> load() {
+            Map<Long, String> res = new HashMap<>();
+            for (AbstractPolicyTO policyTO : policyRestClient.getPolicies(PolicyType.PASSWORD)) {
+                res.put(policyTO.getKey(), policyTO.getDescription());
+            }
+            return res;
+        }
+    };
+
+    private final IModel<Map<Long, String>> accountPolicies = new LoadableDetachableModel<Map<Long, String>>() {
+
+        private static final long serialVersionUID = -2012833443695917883L;
+
+        @Override
+        protected Map<Long, String> load() {
+            Map<Long, String> res = new HashMap<>();
+            for (AbstractPolicyTO policyTO : policyRestClient.getPolicies(PolicyType.ACCOUNT)) {
+                res.put(policyTO.getKey(), policyTO.getDescription());
+            }
+            return res;
+        }
+    };
+
+    private final IModel<Map<Long, String>> pullPolicies = new LoadableDetachableModel<Map<Long, String>>() {
+
+        private static final long serialVersionUID = -2012833443695917883L;
+
+        @Override
+        protected Map<Long, String> load() {
+            Map<Long, String> res = new HashMap<>();
+            for (AbstractPolicyTO policyTO : policyRestClient.getPolicies(PolicyType.PULL)) {
+                res.put(policyTO.getKey(), policyTO.getDescription());
+            }
+            return res;
+        }
+    };
+
+    public ResourceSecurityPanel(final ResourceTO resourceTO) {
+        super();
+        setOutputMarkupId(true);
+
+        final WebMarkupContainer container = new WebMarkupContainer("container");
+        container.setOutputMarkupId(true);
+        container.setRenderBodyOnly(true);
+        add(container);
+
+        // -------------------------------
+        // Password policy selection
+        // -------------------------------
+        AjaxDropDownChoicePanel<Long> passwordPolicy = new AjaxDropDownChoicePanel<>(
+                "passwordPolicy",
+                new ResourceModel("passwordPolicy", "passwordPolicy").getObject(),
+                new PropertyModel<Long>(resourceTO, "passwordPolicy"),
+                false);
+        passwordPolicy.setChoiceRenderer(new PolicyRenderer(passwordPolicies));
+        passwordPolicy.setChoices(new ArrayList<>(passwordPolicies.getObject().keySet()));
+        ((DropDownChoice<?>) passwordPolicy.getField()).setNullValid(true);
+        container.add(passwordPolicy);
+        // -------------------------------
+
+        // -------------------------------
+        // Account policy selection
+        // -------------------------------
+        AjaxDropDownChoicePanel<Long> accountPolicy = new AjaxDropDownChoicePanel<>(
+                "accountPolicy",
+                new ResourceModel("accountPolicy", "accountPolicy").getObject(),
+                new PropertyModel<Long>(resourceTO, "accountPolicy"),
+                false);
+        accountPolicy.setChoiceRenderer(new PolicyRenderer(accountPolicies));
+        accountPolicy.setChoices(new ArrayList<>(accountPolicies.getObject().keySet()));
+        ((DropDownChoice<?>) accountPolicy.getField()).setNullValid(true);
+        container.add(accountPolicy);
+        // -------------------------------
+
+        // -------------------------------
+        // Pull policy selection
+        // -------------------------------
+        AjaxDropDownChoicePanel<Long> pullPolicy = new AjaxDropDownChoicePanel<>(
+                "pullPolicy",
+                new ResourceModel("pullPolicy", "pullPolicy").getObject(),
+                new PropertyModel<Long>(resourceTO, "pullPolicy"),
+                false);
+        pullPolicy.setChoiceRenderer(new PolicyRenderer(pullPolicies));
+        pullPolicy.setChoices(new ArrayList<>(pullPolicies.getObject().keySet()));
+        ((DropDownChoice<?>) pullPolicy.getField()).setNullValid(true);
+        container.add(pullPolicy);
+        // -------------------------------
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/1735c44c/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceWizardBuilder.java
new file mode 100644
index 0000000..e46201f
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceWizardBuilder.java
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.wizards.resources;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import org.apache.commons.collections4.IterableUtils;
+import org.apache.commons.collections4.Predicate;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.rest.ConnectorRestClient;
+import org.apache.syncope.client.console.rest.ResourceRestClient;
+import org.apache.syncope.client.console.topology.TopologyNode;
+import org.apache.syncope.client.console.wizards.AjaxWizard;
+import org.apache.syncope.common.lib.to.MappingItemTO;
+import org.apache.syncope.common.lib.to.ProvisionTO;
+import org.apache.syncope.common.lib.to.ResourceTO;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.extensions.wizard.WizardModel;
+import org.apache.wicket.markup.ComponentTag;
+import org.apache.wicket.model.StringResourceModel;
+
+/**
+ * Resource wizard builder.
+ */
+public class ResourceWizardBuilder extends AbstractResourceWizardBuilder<ResourceTO> {
+
+    private static final long serialVersionUID = 1734415311027284221L;
+
+    private final ResourceRestClient resourceRestClient = new ResourceRestClient();
+
+    private final ConnectorRestClient connectorRestClient = new ConnectorRestClient();
+
+    private boolean createFlag;
+
+    public ResourceWizardBuilder(final ResourceTO resourceTO, final PageReference pageRef) {
+        super(resourceTO, pageRef);
+    }
+
+    @Override
+    public AjaxWizard<Serializable> build(final AjaxWizard.Mode mode) {
+        this.createFlag = mode == AjaxWizard.Mode.CREATE;
+        return super.build(mode);
+    }
+
+    @Override
+    protected WizardModel buildModelSteps(final Serializable modelObject, final WizardModel wizardModel) {
+        final ResourceTO resourceTO = ResourceTO.class.cast(modelObject);
+        wizardModel.add(new ResourceDetailsPanel(resourceTO, createFlag));
+        wizardModel.add(new ResourceProvisionPanel(resourceTO, pageRef));
+        wizardModel.add(new ResourceConnConfPanel(resourceTO, createFlag) {
+
+            private static final long serialVersionUID = -1128269449868933504L;
+
+            @Override
+            protected void check(final AjaxRequestTarget target) {
+                if (connectorRestClient.check(modelObject)) {
+                    info(getString(Constants.OPERATION_SUCCEEDED));
+                } else {
+                    error(getString("error_connection"));
+                }
+                SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
+            }
+
+            @Override
+            protected void onComponentTag(final ComponentTag tag) {
+                tag.append("class", "scrollable-tab-content", " ");
+            }
+
+        });
+        wizardModel.add(new ResourceConnCapabilitiesPanel(
+                resourceTO, connectorRestClient.read(resourceTO.getConnector()).getCapabilities()));
+
+        wizardModel.add(new ResourceSecurityPanel(resourceTO));
+        return wizardModel;
+    }
+
+    @Override
+    protected ResourceTO onApplyInternal(final Serializable modelObject) {
+        final ResourceTO resourceTO = ResourceTO.class.cast(modelObject);
+        boolean connObjectKeyError = false;
+
+        final Collection<ProvisionTO> provisions = new ArrayList<>(resourceTO.getProvisions());
+
+        for (ProvisionTO provision : provisions) {
+            if (provision != null) {
+                if (provision.getMapping() == null || provision.getMapping().getItems().isEmpty()) {
+                    resourceTO.getProvisions().remove(provision);
+                } else {
+                    long uConnObjectKeyCount = IterableUtils.countMatches(
+                            provision.getMapping().getItems(), new Predicate<MappingItemTO>() {
+
+                        @Override
+                        public boolean evaluate(final MappingItemTO item) {
+                            return item.isConnObjectKey();
+                        }
+                    });
+
+                    connObjectKeyError = uConnObjectKeyCount != 1;
+                }
+            }
+        }
+
+        final ResourceTO res;
+        if (connObjectKeyError) {
+            throw new RuntimeException(new StringResourceModel("connObjectKeyValidation").getString());
+        } else if (createFlag) {
+            res = resourceRestClient.create(resourceTO);
+        } else {
+            resourceRestClient.update(resourceTO);
+            res = resourceTO;
+        }
+        return res;
+    }
+
+    @Override
+    protected Serializable getCreateCustomPayloadEvent(final Serializable afterObject, final AjaxRequestTarget target) {
+        final ResourceTO actual = ResourceTO.class.cast(afterObject);
+        return new CreateEvent(
+                actual.getKey(),
+                actual.getKey(),
+                TopologyNode.Kind.RESOURCE,
+                actual.getConnector(),
+                target);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/1735c44c/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css b/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
index 05183af..fb8431a 100644
--- a/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
+++ b/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
@@ -163,7 +163,14 @@ div.wicket-modal div.w_content_3 {
 
 .scrollable-tab-content {
   overflow-y: auto;
-  max-height: 400px;
+  max-height: 480px;
+}
+
+.inner-scrollable-tab-content {
+  height: 440px;
+  margin-top: 40px;
+  overflow-x: hidden;
+  overflow-y: auto;
 }
 
 a.help {
@@ -229,6 +236,19 @@ a.help span a {
   padding: 0px 5px 0px 5px;
 }
 
+div.wizard-view div.wizard-view{
+  max-height: 380px;
+  height: 380px;
+  overflow-y: auto;
+  overflow-x: hidden;
+  padding: 50px 20px 50px 20px;
+}
+
+.wizard-view .wizard-form{
+  max-height: 450px;
+  height: 450px;
+}
+
 .modal-body .tab-content .wizard-view {
   max-height: 330px !important;
   height: 330px !important;

http://git-wip-us.apache.org/repos/asf/syncope/blob/1735c44c/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractConnConfPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractConnConfPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractConnConfPanel.html
deleted file mode 100644
index 974c9aa..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractConnConfPanel.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <wicket:panel>
-    <span wicket:id="connectorPropertiesContainer">
-      <div class="form-group" wicket:id="connectorProperties">
-        <span wicket:id="panel">[panel]</span>
-      </div>
-
-      <div>
-        <a style="position: fixed; top: 70px; right:60px;" wicket:id="check"  href="#">
-          <i class="fa fa-heartbeat fa-2x"></i>
-        </a>
-      </div>
-    </span>
-  </wicket:panel>
-</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/1735c44c/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractResourceModal.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractResourceModal.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractResourceModal.html
deleted file mode 100644
index bd4cd4b..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractResourceModal.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <wicket:extend>
-    <div wicket:id="tabbedPanel"></div>
-  </wicket:extend>
-</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/1735c44c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnCapabilitiesPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnCapabilitiesPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnCapabilitiesPanel.html
deleted file mode 100644
index ed50fa5..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnCapabilitiesPanel.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <wicket:panel>
-    <span wicket:id="capabilitiesPalette"/> 
-  </wicket:panel>
-</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/1735c44c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorDetailsPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorDetailsPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorDetailsPanel.html
deleted file mode 100644
index 87fc624..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorDetailsPanel.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <head>
-    <title>Connector details panel</title>
-  </head>
-  <body>
-    <wicket:panel>
-      <div class="form-group">
-        <span wicket:id="displayName">[displayName]</span>
-      </div>
-
-      <div class="form-group">
-        <span wicket:id="location">[location]</span>
-      </div>
-
-      <div class="form-group">
-        <span wicket:id="bundleName">[bundleName]</span>
-      </div>
-
-      <div class="form-group">
-        <span wicket:id="version">[version]</span>
-      </div>
-
-      <div class="form-group" style="padding: 30px 0px 0px 0px">
-        <table class="table">
-          <tbody>
-            <tr>
-              <td><span wicket:id="connRequestTimeout">[connRequestTimeout]</span></td>
-              <td><span wicket:id="poolMaxObjects">[poolMaxObjects]</span></td>
-            </tr>
-            <tr>
-              <td><span wicket:id="poolMinIdle">[poolMinIdle]</span></td>
-              <td><span wicket:id="poolMaxIdle">[poolMaxIdle]</span></td>
-            </tr>
-            <tr>
-              <td><span wicket:id="poolMaxWait">[poolMaxWait]</span></td>
-              <td><span wicket:id="poolMinEvictableIdleTime">[poolMinEvictableIdleTime]</span></td>
-            </tr>
-          </tbody>
-        </table>
-      </div>
-    </wicket:panel>
-  </body>
-</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/1735c44c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal.properties
deleted file mode 100644
index 91dae7b..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal.properties
+++ /dev/null
@@ -1,45 +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.
-general=General
-configuration=Configuration
-capabilities=Capabilities
-
-displayName=Display name
-bundleName=Bundle
-version=Version
-connRequestTimeout=Request timeout (sec)
-action=Action
-edit=Edit
-edit_attribute=Edit attribute
-serviceName=Service name
-endpoint=Endpoint
-title=Connector
-overridable=Overridable
-property=Property
-value=Value
-
-success_connection=Successful connection
-error_connection=Connection failure
-check=Check connection
-location=Location
-poolMaxObjects=Max objects (idle+active)
-poolMinIdle=Min idle objects
-poolMaxIdle=Max idle objects
-poolMaxWait=Max waiting time (msec)
-poolMinEvictableIdleTime=Min eviction time (msec)
-new=New
-connectorName=Connector Bundle

http://git-wip-us.apache.org/repos/asf/syncope/blob/1735c44c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal_it.properties
deleted file mode 100644
index b012649..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal_it.properties
+++ /dev/null
@@ -1,45 +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.
-general=Generale
-configuration=Configurazione
-capabilities=Capability
-
-bundleName=Bundle
-version=Versione
-connRequestTimeout=Timeout richiesta (sec)
-action=Azione
-edit=Edit
-edit_attribute=Edit attribute
-serviceName=Nome servizio
-endpoint=Endpoint
-title=Connettore
-displayName=Nome visualizzato
-overridable=Sovrascrivibile
-property=Propriet\u00e0
-value=Valore
-
-success_connection=Connessione avvenuta con successo
-error_connection=Connessione non riuscita
-check=Verifica connessione
-location=Posizione
-poolMaxObjects=Max oggetti (attivi e non)
-poolMinIdle=Max oggetti attivi
-poolMaxIdle=Max oggetti inattivi
-poolMaxWait=Tempo max attesa
-poolMinEvictableIdleTime=Tempo min espulsione
-new=Nuovo
-connectorName=Connector Bundle

http://git-wip-us.apache.org/repos/asf/syncope/blob/1735c44c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal_pt_BR.properties
deleted file mode 100644
index a209703..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal_pt_BR.properties
+++ /dev/null
@@ -1,45 +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.
-general=Geral
-configuration=Configura\u00e7\u00e3o
-capabilities=Capacidades
-
-displayName=Mostrar Nome
-bundleName=Bundle
-version=Vers\u00e3o
-connRequestTimeout=Timeout da Requisi\u00e7\u00e3o (seg)
-action=A\u00e7\u00e3o
-edit=Alterar
-edit_attribute=Alterar Atributo
-serviceName=Nome de Servi\u00e7o
-endpoint=Endpoint
-title=Conector
-overridable=Alter\u00e1vel
-property=Propriedade
-value=Valor
-
-success_connection=Sucesso na Conex\u00e3o
-error_connection=Falha na Conex\u00e3o
-check=Verificar a Conex\u00e3o
-location=Localiza\u00e7\u00e3o
-poolMaxObjects=Max objects (idle+active)
-poolMinIdle=Min idle objects
-poolMaxIdle=Max idle objects
-poolMaxWait=Max waiting time (msec)
-poolMinEvictableIdleTime=Min eviction time (msec)
-new=Novo
-connectorName=Connector Bundle

http://git-wip-us.apache.org/repos/asf/syncope/blob/1735c44c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal_ru.properties
deleted file mode 100644
index 8b27977..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal_ru.properties
+++ /dev/null
@@ -1,73 +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.
-#
-# general=Основное
-general=\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435
-# configuration=Конфигурация
-configuration=\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f
-# capabilities=Действия
-capabilities=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f
-
-# displayName=Название
-displayName=\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435
-# bundleName=Название пакета
-bundleName=\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430
-# version=Версия
-version=\u0412\u0435\u0440\u0441\u0438\u044f
-# connRequestTimeout=Таймаут запроса (сек)
-connRequestTimeout=\u0422\u0430\u0439\u043c\u0430\u0443\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (\u0441\u0435\u043a)
-# action=Действие
-action=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435
-# edit=Изменить
-edit=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c
-# edit_attribute=Изменить атрибут
-edit_attribute=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442
-# serviceName=Наименование сервиса
-serviceName=\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430
-# endpoint=Конечная точка подключения
-endpoint=\u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f
-# title=Коннектор
-title=\u041a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440
-# overridable=Переопределяемый
-overridable=\u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0439
-# property=Параметр
-property=\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440
-# value=Значение
-value=\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435
-
-# success_connection=Подключение выполнено успешно
-success_connection=\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e
-# error_connection=Во время подключения произошла ошибка
-error_connection=\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430
-# check=Проверить подключение
-check=\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435
-# location=Расположение
-location=\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435
-# poolMaxObjects=Максимум объектов (в ожидании + активные)
-poolMaxObjects=\u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (\u0432 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 + \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435)
-# poolMinIdle=Минимум объектов в ожидании
-poolMinIdle=\u041c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438
-# poolMaxIdle=Максимум объектов в ожидании
-poolMaxIdle=\u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438
-# poolMaxWait=Максимальное время ожидания (мс)
-poolMaxWait=\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f (\u043c\u0441)
-# poolMinEvictableIdleTime=Минимальное время ожидания (мс)
-poolMinEvictableIdleTime=\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f (\u043c\u0441)
-# new=Создать
-new=\u0421\u043e\u0437\u0434\u0430\u0442\u044c
-# connectorName=Название пакета
-connectorName=\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430

http://git-wip-us.apache.org/repos/asf/syncope/blob/1735c44c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceConnCapabilitiesPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceConnCapabilitiesPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceConnCapabilitiesPanel.html
deleted file mode 100644
index a37390e..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceConnCapabilitiesPanel.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <wicket:panel>
-    <div class="form-group">
-      <span wicket:id="overrideCapabilities">[overrideCapabilities]</span>
-    </div>
-
-    <div class="form-group">
-      <span wicket:id="capabilitiesOverride">[capabilitiesOverride]</span>
-    </div>
-  </wicket:panel>
-</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/1735c44c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceConnCapabilitiesPanel.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceConnCapabilitiesPanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceConnCapabilitiesPanel.properties
deleted file mode 100644
index 7e36b0c..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceConnCapabilitiesPanel.properties
+++ /dev/null
@@ -1,17 +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.
-overrideCapabilities=Override Capabilities?

http://git-wip-us.apache.org/repos/asf/syncope/blob/1735c44c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceConnCapabilitiesPanel_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceConnCapabilitiesPanel_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceConnCapabilitiesPanel_it.properties
deleted file mode 100644
index 7e36b0c..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceConnCapabilitiesPanel_it.properties
+++ /dev/null
@@ -1,17 +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.
-overrideCapabilities=Override Capabilities?

http://git-wip-us.apache.org/repos/asf/syncope/blob/1735c44c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceConnCapabilitiesPanel_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceConnCapabilitiesPanel_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceConnCapabilitiesPanel_pt_BR.properties
deleted file mode 100644
index 7e36b0c..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceConnCapabilitiesPanel_pt_BR.properties
+++ /dev/null
@@ -1,17 +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.
-overrideCapabilities=Override Capabilities?

http://git-wip-us.apache.org/repos/asf/syncope/blob/1735c44c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceConnCapabilitiesPanel_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceConnCapabilitiesPanel_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceConnCapabilitiesPanel_ru.properties
deleted file mode 100644
index c23bd33..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceConnCapabilitiesPanel_ru.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-# overrideCapabilities=Переопределить действия?
-overrideCapabilities=\u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f?

http://git-wip-us.apache.org/repos/asf/syncope/blob/1735c44c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceDetailsPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceDetailsPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceDetailsPanel.html
deleted file mode 100644
index caefa9a..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceDetailsPanel.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <wicket:panel>
-
-    <div wicket:id="container" class="summarize">
-      <div class="form-group">
-        <span wicket:id="name">[name]</span>
-      </div>
-
-      <div class="form-group">
-        <span wicket:id="connector">[connector]</span>
-      </div>
-
-      <div class="form-group">
-        <span wicket:id="enforceMandatoryCondition">[enforceMandatoryCondition]</span>
-      </div>
-
-      <div class="form-group">
-        <span wicket:id="propagationPriority">[propagationPriority]</span>
-      </div>
-
-      <div class="form-group">
-        <span wicket:id="randomPwdIfNotProvided">[randomPwdIfNotProvided]</span>
-      </div>
-
-      <div class="form-group form-palette">
-        <span wicket:id="propagationActionsClassNames">[propagationActionsClassNames]</span>
-      </div>
-
-      <div class="form-group">
-        <span wicket:id="createTraceLevel">[createTraceLevel]</span>
-      </div>
-
-      <div class="form-group">
-        <span wicket:id="updateTraceLevel">[updateTraceLevel]</span>
-      </div>
-
-      <div class="form-group">
-        <span wicket:id="deleteTraceLevel">[deleteTraceLevel]</span>
-      </div>
-
-      <div class="form-group">
-        <span wicket:id="pullTraceLevel">[pullTraceLevel]</span>
-      </div>
-    </div>
-
-    <span wicket:id="systeminformation">[System Information]</span>
-  </wicket:panel>
-</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/1735c44c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceMappingPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceMappingPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceMappingPanel.html
deleted file mode 100644
index 2b717e2..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceMappingPanel.html
+++ /dev/null
@@ -1,86 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <wicket:panel>
-    <div class="table-responsive no-padding">
-      <table id="mappings"
-             class="table table-hover"
-             style="font-size: 1em;margin-top:2px;"
-             wicket:id="mappingContainer">
-        <tbody>
-          <tr>
-            <th><wicket:message key="entity"/></th>
-            <th><wicket:message key="intMappingTypes"/></th>
-            <th><wicket:message key="intAttrNames"/></th>
-            <th><wicket:message key="extAttrNames"/></th>
-            <th>
-              <wicket:message key="mandatoryCondition"/>
-              <span id="popover" wicket:id="jexlInfo" class="glyphicon glyphicon-info-sign"></span>
-            </th>
-            <th><wicket:message key="connObjectKey"/></th>
-            <th><label wicket:id="passwordLabel"/></th>
-            <th><wicket:message key="purpose"/></th>
-            <th><i class="fa fa-trash"></i></th>
-          </tr>
-          <tr wicket:id="mappings">
-            <td>
-              <span wicket:id="entities">[entities]</span>
-            </td>
-            <td>
-              <span wicket:id="intMappingTypes">[intMappingTypes]</span>
-            </td>
-            <td>
-              <span wicket:id="intAttrNames">[intAttrNames]</span>
-            </td>
-            <td>
-              <span wicket:id="extAttrName">[extAttrName]</span>
-            </td>
-            <td>
-              <span wicket:id="mandatoryCondition">[mandatoryCondition]</span>
-            </td>
-            <td>
-              <span wicket:id="connObjectKey">[connObjectKey]</span>
-            </td>
-            <td>
-              <span wicket:id="password">[password]</span>
-            </td>
-            <td>
-              <div wicket:id="purpose" style="margin: 10px 0px 10px 0px">
-                <span wicket:id="purposeActions">[purpose]</span>
-              </div>
-            </td>
-            <td>
-              <div style="margin: 10px 0px 10px 0px">
-                <span  wicket:id="toRemove"/>
-              </div>
-            </td>
-          </tr>
-        </tbody>
-
-        <tfoot>
-          <tr>
-            <td colspan="9" style="padding: 5px; text-align: right">
-              <input type="submit" class="btn btn-primary" wicket:id="addMappingBtn" />
-            </td>
-          </tr>
-        </tfoot>
-      </table>
-    </div>
-  </wicket:panel>
-</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/1735c44c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties
deleted file mode 100644
index 9a91557..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties
+++ /dev/null
@@ -1,68 +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.
-general=Resource details
-provisions=Provisioning
-connectorProperties=Connector Properties
-security=Security
-
-umapping=User mapping
-required_alert=All form fields are required
-connector=Connector
-existing_resources=Existing resources
-action=Action
-edit_attribute=Edit resource
-title=Resource
-extAttrNames=External attributes
-intMappingTypes=Internal mapping types
-entity=Entity
-groupSchema=Group Schema
-connObjectKey=ConnObjectKey
-mandatoryCondition=Mandatory
-password=Password
-purpose=Purpose
-mappingUserSchema=Mapping User Schema
-mappingGroupSchema=Mapping Group Schema
-delete=Delete
-intAttrNames=Internal attributes
-enforceMandatoryCondition=Enforce mandatory condition
-fieldName=Field name
-
-connObjectKeyValidation=There must be exactly one ConnObjectKey
-propagationMode=Propagation mode
-connObjectLink=ConnObjectLink
-enable=Enable
-
-createTraceLevel=Create trace level
-updateTraceLevel=Update trace level
-deleteTraceLevel=Delete trace level
-pullTraceLevel=Pull trace level
-propagationPriority=Propagation priority
-
-success_connection=Successful connection
-error_connection=Connection failure
-check=Check connection
-propagationActionsClassNames=Propagation Actions
-gmapping=Group mapping
-new=New resource
-randomPwdIfNotProvided=Generate random passwords when missing
-
-anyType=Object Type
-objectClass= Object Class
-__ACCOUNT__=ACCOUNT
-__GROUP__=GROUP
-connectorCapabilities=Connector Capabilities
-auxClasses=Auxiliary Classes