You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by ma...@apache.org on 2016/01/24 14:58:27 UTC

[2/2] syncope git commit: Parameters page, #SYNCOPE-156

Parameters page, #SYNCOPE-156


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

Branch: refs/heads/master
Commit: 143c8e6db2b49e696375e2f12fd3039650efad60
Parents: dde1cbc
Author: Massimiliano Perrone <ma...@tirasa.net>
Authored: Sun Jan 24 14:45:49 2016 +0100
Committer: Massimiliano Perrone <ma...@tirasa.net>
Committed: Sun Jan 24 14:45:49 2016 +0100

----------------------------------------------------------------------
 .../client/console/commons/Constants.java       |   2 +
 .../client/console/commons/SchemaUtils.java     |  66 +++++
 .../syncope/client/console/pages/BasePage.java  |  14 +-
 .../client/console/pages/Parameters.java        |  45 +++
 .../console/panels/AbstractModalPanel.java      |  12 -
 .../panels/ParametersCreateModalPanel.java      |  45 +++
 .../panels/ParametersCreateWizardAttrStep.java  | 148 ++++++++++
 .../panels/ParametersCreateWizardPanel.java     |  91 ++++++
 .../ParametersCreateWizardSchemaStep.java       |  54 ++++
 .../console/panels/ParametersDetailsPanel.java  | 133 +++++++++
 .../panels/ParametersEditModalPanel.java        |  65 +++++
 .../client/console/panels/ParametersPanel.java  | 285 +++++++++++++++++++
 .../console/panels/PlainSchemaDetails.java      |   4 +-
 .../panels/SecurityQuestionModalPanel.java      |  67 -----
 .../panels/SecurityQuestionsModalPanel.java     |  67 +++++
 .../console/panels/SecurityQuestionsPanel.java  |   9 +-
 .../console/panels/search/GroupSearchPanel.java |   2 +-
 .../markup/html/form/MultiFieldPanel.java       |  41 +--
 .../client/console/wizards/WizardMgtPanel.java  |   3 +-
 .../console/wizards/any/AnyWizardBuilder.java   |   5 +-
 .../client/console/wizards/any/PlainAttrs.java  |  68 ++---
 .../syncope/client/console/pages/BasePage.html  |   1 +
 .../client/console/pages/Parameters.html        |  41 +++
 .../client/console/pages/Parameters.properties  |  19 ++
 .../console/pages/Parameters_it.properties      |  19 ++
 .../console/pages/Parameters_pt_BR.properties   |  19 ++
 .../panels/ParametersCreateModalPanel.html      |  24 ++
 .../console/panels/ParametersCreateWizard.html  |  31 ++
 .../panels/ParametersCreateWizardAttrStep.html  |  28 ++
 .../ParametersCreateWizardAttrStep.properties   |  15 +
 ...ParametersCreateWizardAttrStep_it.properties |  15 +
 ...ametersCreateWizardAttrStep_pt_BR.properties |  15 +
 .../ParametersCreateWizardSchemaStep.html       |  27 ++
 .../ParametersCreateWizardSchemaStep.properties |  16 ++
 ...rametersCreateWizardSchemaStep_it.properties |  16 ++
 ...etersCreateWizardSchemaStep_pt_BR.properties |  16 ++
 .../console/panels/ParametersDetailsPanel.html  |  34 +++
 .../panels/ParametersDetailsPanel.properties    |  19 ++
 .../panels/ParametersDetailsPanel_it.properties |  19 ++
 .../ParametersDetailsPanel_pt_BR.properties     |  19 ++
 .../panels/ParametersEditModalPanel.html        |  24 ++
 .../client/console/panels/ParametersPanel.html  |  23 ++
 .../console/panels/ParametersPanel.properties   |  21 ++
 .../panels/ParametersPanel_it.properties        |  21 ++
 .../panels/ParametersPanel_pt_BR.properties     |  21 ++
 .../panels/SecurityQuestionModalPanel.html      |  24 --
 .../panels/SecurityQuestionsModalPanel.html     |  24 ++
 47 files changed, 1567 insertions(+), 210 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
index 60a1f58..69b0930 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
@@ -60,6 +60,8 @@ public final class Constants {
 
     public static final String PREF_SECURITY_QUESTIONS_PAGINATOR_ROWS = "security.questions.paginator.rows";
 
+    public static final String PREF_PARAMETERS_PAGINATOR_ROWS = "parameters.paginator.rows";
+
     public static final String PREF_RELATIONSHIPTYPE_PAGINATOR_ROWS = "relationshiptype.painator.rows";
 
     public static final String PREF_GROUP_DETAILS_VIEW = "group.details.view";

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/java/org/apache/syncope/client/console/commons/SchemaUtils.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/SchemaUtils.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/SchemaUtils.java
new file mode 100644
index 0000000..2057605
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/SchemaUtils.java
@@ -0,0 +1,66 @@
+/*
+ * 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.commons;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.common.lib.SyncopeConstants;
+import org.apache.syncope.common.lib.to.PlainSchemaTO;
+
+public final class SchemaUtils {
+
+    private SchemaUtils() {
+        // private constructor for static utility class
+    }
+
+    public static List<String> getEnumeratedValues(final PlainSchemaTO schemaTO) {
+        final List<String> res = new ArrayList<>();
+
+        final String[] values = StringUtils.isBlank(schemaTO.getEnumerationValues())
+                ? new String[0]
+                : schemaTO.getEnumerationValues().split(SyncopeConstants.ENUM_VALUES_SEPARATOR);
+
+        for (String value : values) {
+            res.add(value.trim());
+        }
+
+        return res;
+    }
+
+    public static Map<String, String> getEnumeratedKeyValues(final PlainSchemaTO schemaTO) {
+        final Map<String, String> res = new HashMap<>();
+
+        final String[] values = StringUtils.isBlank(schemaTO.getEnumerationValues())
+                ? new String[0]
+                : schemaTO.getEnumerationValues().split(SyncopeConstants.ENUM_VALUES_SEPARATOR);
+
+        final String[] keys = StringUtils.isBlank(schemaTO.getEnumerationKeys())
+                ? new String[0]
+                : schemaTO.getEnumerationKeys().split(SyncopeConstants.ENUM_VALUES_SEPARATOR);
+
+        for (int i = 0; i < values.length; i++) {
+            res.put(values[i].trim(), keys.length > i ? keys[i].trim() : null);
+        }
+
+        return res;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
index 76ea15d..4d4b01a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
@@ -141,8 +141,8 @@ public class BasePage extends WebPage implements NotificationAwareComponent, IAj
 
         liContainer = new WebMarkupContainer(getLIContainerId("securityquestions"));
         confULContainer.add(liContainer);
-        BookmarkablePageLink<Page> secuityQuestionsLink =
-                new BookmarkablePageLink<>("securityquestions", SecurityQuestions.class);
+        BookmarkablePageLink<Page> secuityQuestionsLink = new BookmarkablePageLink<>("securityquestions",
+                SecurityQuestions.class);
         liContainer.add(secuityQuestionsLink);
 
         liContainer = new WebMarkupContainer(getLIContainerId("types"));
@@ -170,6 +170,12 @@ public class BasePage extends WebPage implements NotificationAwareComponent, IAj
         liContainer.add(new BookmarkablePageLink<>("notifications", Notifications.class));
         MetaDataRoleAuthorizationStrategy.authorize(liContainer, WebPage.RENDER, StandardEntitlement.NOTIFICATION_LIST);
 
+        liContainer = new WebMarkupContainer(getLIContainerId("parameters"));
+        confULContainer.add(liContainer);
+        liContainer.add(new BookmarkablePageLink<>("parameters", Parameters.class));
+        MetaDataRoleAuthorizationStrategy.authorize(
+                liContainer, WebPage.RENDER, StandardEntitlement.CONFIGURATION_LIST);
+
         add(new Label("domain", SyncopeConsoleSession.get().getDomain()));
         add(new BookmarkablePageLink<Page>("logout", Logout.class));
 
@@ -218,8 +224,8 @@ public class BasePage extends WebPage implements NotificationAwareComponent, IAj
         }
 
         // Extensions
-        ClassPathScanImplementationLookup classPathScanImplementationLookup =
-                (ClassPathScanImplementationLookup) SyncopeConsoleApplication.get().
+        ClassPathScanImplementationLookup classPathScanImplementationLookup
+                = (ClassPathScanImplementationLookup) SyncopeConsoleApplication.get().
                 getServletContext().getAttribute(ConsoleInitializer.CLASSPATH_LOOKUP);
         List<Class<? extends AbstractExtPage>> extPageClasses = classPathScanImplementationLookup.getExtPageClasses();
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/java/org/apache/syncope/client/console/pages/Parameters.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Parameters.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Parameters.java
new file mode 100644
index 0000000..f70b99d
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Parameters.java
@@ -0,0 +1,45 @@
+/*
+ * 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.panels.ParametersPanel;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+public class Parameters extends BasePage {
+
+    private static final long serialVersionUID = 4116733316105009166L;
+    
+    private final ParametersPanel parametersPanel;
+
+    public Parameters(final PageParameters parameters) {
+        super(parameters);
+        
+        final WebMarkupContainer content = new WebMarkupContainer("content");
+        content.add(new Label("header", getString("header_title")));
+        content.setOutputMarkupId(true);
+        add(content);
+
+        parametersPanel = new ParametersPanel("parametersPanel", getPageReference());
+        parametersPanel.setOutputMarkupId(true);
+
+        content.add(parametersPanel);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java
index dcb4553..cc39886 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java
@@ -21,8 +21,6 @@ package org.apache.syncope.client.console.panels;
 import java.io.Serializable;
 import org.apache.syncope.client.console.wicket.markup.head.MetaHeaderItem;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
-import org.apache.wicket.Component;
-import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.head.HeaderItem;
@@ -60,16 +58,6 @@ public class AbstractModalPanel<T extends Serializable> extends Panel implements
     }
 
     @Override
-    public final MarkupContainer add(final Component... childs) {
-        return super.add(childs);
-    }
-
-    @Override
-    public final MarkupContainer addOrReplace(final Component... childs) {
-        return super.addOrReplace(childs);
-    }
-
-    @Override
     public void renderHead(final IHeaderResponse response) {
         super.renderHead(response);
         response.render(new PriorityHeaderItem(meta));

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateModalPanel.java
new file mode 100644
index 0000000..4f73fab
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateModalPanel.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.panels;
+
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.common.lib.to.AttrTO;
+import org.apache.wicket.PageReference;
+
+public class ParametersCreateModalPanel extends AbstractModalPanel<AttrTO> {
+
+    private static final long serialVersionUID = 4024126489500665435L;
+
+    private final AttrTO attrTO;
+
+    public ParametersCreateModalPanel(
+            final BaseModal<AttrTO> modal,
+            final AttrTO attrTO,
+            final PageReference pageRef) {
+        super(modal, pageRef);
+        this.attrTO = attrTO;
+        add(new ParametersCreateWizardPanel("parametersCreateWizardPanel",
+                new ParametersCreateWizardPanel.ParametersForm(), pageRef).build(false));
+    }
+
+    @Override
+    public final AttrTO getItem() {
+        return this.attrTO;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardAttrStep.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardAttrStep.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardAttrStep.java
new file mode 100644
index 0000000..c86d4ae
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardAttrStep.java
@@ -0,0 +1,148 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.panels;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import org.apache.syncope.client.console.commons.SchemaUtils;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDateFieldPanel;
+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.FieldPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.MultiFieldPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.SpinnerFieldPanel;
+import org.apache.syncope.common.lib.to.AttrTO;
+import org.apache.syncope.common.lib.to.PlainSchemaTO;
+import org.apache.wicket.extensions.wizard.WizardStep;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.form.IChoiceRenderer;
+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.PropertyModel;
+
+public class ParametersCreateWizardAttrStep extends WizardStep {
+
+    private static final long serialVersionUID = -7843275202297616553L;
+
+    public ParametersCreateWizardAttrStep(final ParametersCreateWizardPanel.ParametersForm modelObject) {
+        this.setOutputMarkupId(true);
+
+        final WebMarkupContainer content = new WebMarkupContainer("content");
+        content.setOutputMarkupId(true);
+        add(content);
+
+        final AjaxTextFieldPanel schema = new AjaxTextFieldPanel(
+                "schema", getString("schema"), new PropertyModel<String>(modelObject.getAttrTO(), "schema"));
+        content.add(schema);
+
+        final LoadableDetachableModel<List<PlainSchemaTO>> loadableDetachableModel
+                = new LoadableDetachableModel<List<PlainSchemaTO>>() {
+
+            private static final long serialVersionUID = 7172461137064525667L;
+
+            @Override
+            protected List<PlainSchemaTO> load() {
+                return Arrays.asList(modelObject.getPlainSchemaTO());
+            }
+
+        };
+
+        final ListView<PlainSchemaTO> listView = new ListView<PlainSchemaTO>("attrs", loadableDetachableModel) {
+
+            private static final long serialVersionUID = 9101744072914090143L;
+
+            @Override
+            protected void populateItem(final ListItem<PlainSchemaTO> item) {
+                final Panel panel = getFieldPanel("panel", modelObject.getAttrTO(), item.getModelObject());
+                panel.setEnabled(true);
+                panel.setVisible(true);
+                item.add(panel);
+            }
+        };
+
+        content.add(listView);
+    }
+
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    private Panel getFieldPanel(final String id, final AttrTO attrTO, final PlainSchemaTO plainSchemaTO) {
+
+        final String valueHeaderName = getString("values");
+
+        final FieldPanel panel;
+        switch (plainSchemaTO.getType()) {
+            case Date:
+                panel = new AjaxDateFieldPanel(
+                        id, valueHeaderName, new Model<Date>(), plainSchemaTO.getConversionPattern());
+                break;
+            case Enum:
+                panel = new AjaxDropDownChoicePanel<>(id, valueHeaderName, new Model<String>(), false);
+                ((AjaxDropDownChoicePanel<String>) panel).setChoices(SchemaUtils.getEnumeratedValues(plainSchemaTO));
+
+                if (!attrTO.getValues().isEmpty()) {
+                    ((AjaxDropDownChoicePanel) panel).setChoiceRenderer(new IChoiceRenderer<String>() {
+
+                        private static final long serialVersionUID = -3724971416312135885L;
+
+                        @Override
+                        public String getDisplayValue(final String value) {
+                            return value;
+                        }
+
+                        @Override
+                        public String getIdValue(final String value, final int i) {
+                            return value;
+                        }
+
+                        @Override
+                        public String getObject(
+                                final String id, final IModel<? extends List<? extends String>> choices) {
+                            return id;
+                        }
+                    });
+                }
+                break;
+
+            case Long:
+                panel = new SpinnerFieldPanel<>(id, valueHeaderName, Long.class, new Model<Long>());
+                break;
+
+            case Double:
+                panel = new SpinnerFieldPanel<>(id, valueHeaderName, Double.class, new Model<Double>());
+                break;
+
+            default:
+                panel = new AjaxTextFieldPanel(id, valueHeaderName, new Model<String>(), false);
+        }
+        if (plainSchemaTO.isMultivalue()) {
+            return new MultiFieldPanel.Builder<>(
+                    new PropertyModel<List<String>>(attrTO, "values")).build(id, valueHeaderName, panel);
+        } else {
+            panel.setNewModel(attrTO.getValues());
+        }
+        if (plainSchemaTO.getMandatoryCondition().equalsIgnoreCase("true")) {
+            panel.setRequired(true);
+        }
+        return panel;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardPanel.java
new file mode 100644
index 0000000..04d6973
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardPanel.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.panels;
+
+import static org.apache.syncope.client.console.panels.AbstractSearchResultPanel.LOG;
+
+import java.io.Serializable;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.wizards.AjaxWizardBuilder;
+import org.apache.syncope.common.lib.to.AttrTO;
+import org.apache.syncope.common.lib.to.PlainSchemaTO;
+import org.apache.syncope.common.lib.types.SchemaType;
+import org.apache.syncope.common.rest.api.service.ConfigurationService;
+import org.apache.syncope.common.rest.api.service.SchemaService;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.extensions.wizard.WizardModel;
+
+public class ParametersCreateWizardPanel extends AjaxWizardBuilder<ParametersCreateWizardPanel.ParametersForm> {
+
+    private static final long serialVersionUID = -2868592590785581481L;
+
+    public ParametersCreateWizardPanel(final String id, final ParametersForm defaultItem, final PageReference pageRef) {
+        super(id, defaultItem, pageRef);
+
+    }
+
+    @Override
+    protected WizardModel buildModelSteps(final ParametersForm modelObject, final WizardModel wizardModel) {
+        wizardModel.add(new ParametersCreateWizardSchemaStep(modelObject));
+        wizardModel.add(new ParametersCreateWizardAttrStep(modelObject));
+        return wizardModel;
+    }
+
+    @Override
+    protected void onCancelInternal(final ParametersForm modelObject) {
+        //do nothing
+    }
+
+    @Override
+    protected Serializable onApplyInternal(final ParametersForm modelObject) {
+        try {
+            final PlainSchemaTO finalpPlainSchemaTO = modelObject.getPlainSchemaTO();
+            finalpPlainSchemaTO.setKey(modelObject.getAttrTO().getSchema());
+            SyncopeConsoleSession.get().getService(SchemaService.class).create(
+                    SchemaType.PLAIN, finalpPlainSchemaTO);
+            SyncopeConsoleSession.get().getService(ConfigurationService.class).set(modelObject.getAttrTO());
+        } catch (Exception e) {
+            LOG.error("While deleting SecutiryQuestionTO", e);
+        }
+        return modelObject.getAttrTO();
+    }
+
+    public static class ParametersForm implements Serializable {
+
+        private static final long serialVersionUID = 412294016850871853L;
+
+        private final PlainSchemaTO plainSchemaTO;
+
+        private final AttrTO attrTO;
+
+        public ParametersForm() {
+            plainSchemaTO = new PlainSchemaTO();
+            attrTO = new AttrTO();
+        }
+
+        public PlainSchemaTO getPlainSchemaTO() {
+            return plainSchemaTO;
+        }
+
+        public AttrTO getAttrTO() {
+            return attrTO;
+        }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardSchemaStep.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardSchemaStep.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardSchemaStep.java
new file mode 100644
index 0000000..a5b4eaf
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardSchemaStep.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.panels;
+
+import java.util.Arrays;
+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.common.lib.types.AttrSchemaType;
+import org.apache.wicket.extensions.wizard.WizardStep;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.model.PropertyModel;
+
+public class ParametersCreateWizardSchemaStep extends WizardStep {
+
+    private static final long serialVersionUID = -7843275202297616553L;
+
+    public ParametersCreateWizardSchemaStep(final ParametersCreateWizardPanel.ParametersForm modelObject) {
+        final WebMarkupContainer content = new WebMarkupContainer("content");
+        this.setOutputMarkupId(true);
+        content.setOutputMarkupId(true);
+        add(content);
+        final AjaxDropDownChoicePanel<AttrSchemaType> type = new AjaxDropDownChoicePanel<>(
+                "type", getString("type"), new PropertyModel<AttrSchemaType>(modelObject.getPlainSchemaTO(), "type"));
+        type.setChoices(Arrays.asList(AttrSchemaType.values()));
+        content.add(type);
+
+        final AjaxTextFieldPanel mandatoryCondition = new AjaxTextFieldPanel(
+                "mandatoryCondition", getString("mandatoryCondition"),
+                new PropertyModel<String>(modelObject.getPlainSchemaTO(), "mandatoryCondition"));
+        content.add(mandatoryCondition);
+
+        final AjaxCheckBoxPanel multiValue = new AjaxCheckBoxPanel("panel", getString("multivalue"),
+                new PropertyModel<Boolean>(modelObject.getPlainSchemaTO(), "multivalue"), false);
+        content.add(multiValue);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersDetailsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersDetailsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersDetailsPanel.java
new file mode 100644
index 0000000..eae63bc
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersDetailsPanel.java
@@ -0,0 +1,133 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.panels;
+
+import java.util.Date;
+import java.util.List;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.commons.SchemaUtils;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDateFieldPanel;
+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.FieldPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.MultiFieldPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.SpinnerFieldPanel;
+import org.apache.syncope.common.lib.to.AttrTO;
+import org.apache.syncope.common.lib.to.PlainSchemaTO;
+import org.apache.syncope.common.lib.types.SchemaType;
+import org.apache.syncope.common.rest.api.service.SchemaService;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.IChoiceRenderer;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.PropertyModel;
+
+public class ParametersDetailsPanel extends Panel {
+
+    private static final long serialVersionUID = 7708288006191496557L;
+
+    public ParametersDetailsPanel(final String id, final AttrTO attrTO) {
+        super(id);
+
+        final WebMarkupContainer container = new WebMarkupContainer("container");
+
+        container.setOutputMarkupId(true);
+        add(container);
+
+        final Form<AttrTO> form = new Form<>("form");
+
+        form.setModel(new CompoundPropertyModel<>(attrTO));
+        container.add(form);
+
+        final AjaxTextFieldPanel schema = new AjaxTextFieldPanel(
+                "schema", getString("schema"), new PropertyModel<String>(attrTO, "schema"));
+        schema.setEnabled(false);
+        form.add(schema);
+
+        form.add(getFieldPanel("panel", attrTO));
+    }
+
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    private Panel getFieldPanel(final String id, final AttrTO attrTO) {
+
+        final String valueHeaderName = getString("values");
+
+        final PlainSchemaTO schemaTO = SyncopeConsoleSession.get().getService(SchemaService.class).
+                read(SchemaType.PLAIN, attrTO.getSchema());
+
+        final FieldPanel panel;
+        switch (schemaTO.getType()) {
+            case Date:
+                panel = new AjaxDateFieldPanel(
+                        id, valueHeaderName, new Model<Date>(), schemaTO.getConversionPattern());
+                break;
+            case Enum:
+                panel = new AjaxDropDownChoicePanel<>(id, valueHeaderName, new Model<String>(), false);
+                ((AjaxDropDownChoicePanel<String>) panel).setChoices(SchemaUtils.getEnumeratedValues(schemaTO));
+
+                if (!attrTO.getValues().isEmpty()) {
+                    ((AjaxDropDownChoicePanel) panel).setChoiceRenderer(new IChoiceRenderer<String>() {
+
+                        private static final long serialVersionUID = -3724971416312135885L;
+
+                        @Override
+                        public String getDisplayValue(final String value) {
+                            return value;
+                        }
+
+                        @Override
+                        public String getIdValue(final String value, final int i) {
+                            return value;
+                        }
+
+                        @Override
+                        public String getObject(
+                                final String id, final IModel<? extends List<? extends String>> choices) {
+                            return id;
+                        }
+                    });
+                }
+                break;
+
+            case Long:
+                panel = new SpinnerFieldPanel<>(id, valueHeaderName, Long.class, new Model<Long>());
+                break;
+
+            case Double:
+                panel = new SpinnerFieldPanel<>(id, valueHeaderName, Double.class, new Model<Double>());
+                break;
+
+            default:
+                panel = new AjaxTextFieldPanel(id, valueHeaderName, new Model<String>(), false);
+        }
+        if (schemaTO.isMultivalue()) {
+            return new MultiFieldPanel.Builder<>(
+                    new PropertyModel<List<String>>(attrTO, "values")).build(id, valueHeaderName, panel);
+        } else {
+            panel.setNewModel(attrTO.getValues());
+        }
+        if (schemaTO.getMandatoryCondition().equalsIgnoreCase("true")) {
+            panel.setRequired(true);
+        }
+        return panel;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersEditModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersEditModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersEditModalPanel.java
new file mode 100644
index 0000000..6f0ec76
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersEditModalPanel.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.panels;
+
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.common.lib.to.AttrTO;
+import org.apache.syncope.common.rest.api.service.ConfigurationService;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.html.form.Form;
+
+public class ParametersEditModalPanel extends AbstractModalPanel<AttrTO> {
+
+    private static final long serialVersionUID = 4024126489500665435L;
+
+    private final AttrTO attrTO;
+
+    private final BaseModal<AttrTO> parametersModal;
+
+    public ParametersEditModalPanel(
+            final BaseModal<AttrTO> modal,
+            final AttrTO attrTO,
+            final PageReference pageRef) {
+        super(modal, pageRef);
+        this.attrTO = attrTO;
+        this.parametersModal = modal;
+        add(new ParametersDetailsPanel("parametersDetailsPanel", getItem()));
+    }
+
+    @Override
+    public final AttrTO getItem() {
+        return this.attrTO;
+    }
+
+    @Override
+    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
+        try {
+            SyncopeConsoleSession.get().getService(ConfigurationService.class).set(attrTO);
+            info(getString(Constants.OPERATION_SUCCEEDED));
+            parametersModal.close(target);
+        } catch (Exception e) {
+            LOG.error("While creating or updating AttrTO", e);
+            error(getString(Constants.ERROR) + ": " + e.getMessage());
+        }
+        parametersModal.getNotificationPanel().refresh(target);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersPanel.java
new file mode 100644
index 0000000..b67305c
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersPanel.java
@@ -0,0 +1,285 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.panels;
+
+import static org.apache.wicket.Component.ENABLE;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import java.io.Serializable;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.commons.SearchableDataProvider;
+import org.apache.syncope.client.console.pages.BasePage;
+import org.apache.syncope.client.console.panels.ParametersPanel.ParametersProvider;
+import org.apache.syncope.client.console.rest.BaseRestClient;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
+import org.apache.syncope.client.console.wizards.AbstractModalPanelBuilder;
+import org.apache.syncope.client.console.wizards.WizardMgtPanel;
+import org.apache.syncope.common.lib.to.AttrTO;
+import org.apache.syncope.common.lib.types.StandardEntitlement;
+import org.apache.syncope.common.rest.api.service.ConfigurationService;
+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.WindowClosedCallback;
+import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
+import org.apache.wicket.markup.repeater.Item;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.model.StringResourceModel;
+
+public class ParametersPanel extends AbstractSearchResultPanel<
+        AttrTO, AttrTO, ParametersProvider, BaseRestClient> {
+
+    private static final long serialVersionUID = 2765863608539154422L;
+
+    private final BaseModal<AttrTO> modalDetails = new BaseModal<AttrTO>("modalDetails") {
+
+        private static final long serialVersionUID = 389935548143327858L;
+
+        @Override
+        protected void onConfigure() {
+            super.onConfigure();
+            setFooterVisible(true);
+        }
+    };
+
+    public ParametersPanel(final String id, final PageReference pageRef) {
+        super(id, new Builder<AttrTO, AttrTO, BaseRestClient>(null, pageRef) {
+
+            private static final long serialVersionUID = 8769126634538601689L;
+
+            @Override
+            protected WizardMgtPanel<AttrTO> newInstance(final String id) {
+                return new ParametersPanel(id, this);
+            }
+        });
+
+        modalDetails.setWindowClosedCallback(new WindowClosedCallback() {
+
+            private static final long serialVersionUID = 8804221891699487139L;
+
+            @Override
+            public void onClose(final AjaxRequestTarget target) {
+                modal.show(false);
+                target.add(container);
+            }
+        });
+
+        add(modalDetails);
+
+        this.addNewItemPanelBuilder(new AbstractModalPanelBuilder<AttrTO>(
+                BaseModal.CONTENT_ID, new AttrTO(), pageRef) {
+
+            private static final long serialVersionUID = 1995192603527154740L;
+
+            @Override
+            public ModalPanel<AttrTO> build(final int index, final boolean edit) {
+                return new ParametersCreateModalPanel(modal, newModelObject(), pageRef);
+            }
+
+            @Override
+            protected void onCancelInternal(final AttrTO modelObject) {
+            }
+
+            @Override
+            protected Serializable onApplyInternal(final AttrTO modelObject) {
+                return null;
+            }
+
+        }, true);
+        modal.size(Modal.Size.Medium);
+        initResultTable();
+
+        MetaDataRoleAuthorizationStrategy.authorize(addAjaxLink, ENABLE, StandardEntitlement.CONFIGURATION_SET);
+    }
+
+    public ParametersPanel(
+            final String id, final Builder<AttrTO, AttrTO, BaseRestClient> builder) {
+        super(id, builder);
+    }
+
+    @Override
+    protected ParametersProvider dataProvider() {
+        return new ParametersProvider(rows);
+    }
+
+    @Override
+    protected String paginatorRowsKey() {
+        return Constants.PREF_PARAMETERS_PAGINATOR_ROWS;
+    }
+
+    @Override
+    protected Collection<ActionLink.ActionType> getBulkActions() {
+        return Collections.<ActionLink.ActionType>emptyList();
+    }
+
+    @Override
+    protected List<IColumn<AttrTO, String>> getColumns() {
+
+        final List<IColumn<AttrTO, String>> columns = new ArrayList<>();
+
+        for (final Field field : AttrTO.class.getDeclaredFields()) {
+
+            if (field != null && !Modifier.isStatic(field.getModifiers())) {
+                final String fieldName = field.getName();
+                if (field.getType().isArray()) {
+                    final IColumn<AttrTO, String> column = new PropertyColumn<AttrTO, String>(
+                            new ResourceModel(field.getName()), field.getName()) {
+
+                        private static final long serialVersionUID = 377850700587306254L;
+
+                        @Override
+                        public String getCssClass() {
+                            String css = super.getCssClass();
+                            if ("schema".equals(fieldName)) {
+                                css = StringUtils.isBlank(css)
+                                        ? "medium_fixedsize"
+                                        : css + " medium_fixedsize";
+                            }
+                            return css;
+                        }
+                    };
+                    columns.add(column);
+
+                } else {
+                    final IColumn<AttrTO, String> column = new PropertyColumn<AttrTO, String>(
+                            new ResourceModel(field.getName()), field.getName(), field.getName()) {
+
+                        private static final long serialVersionUID = -6902459669035442212L;
+
+                        @Override
+                        public String getCssClass() {
+                            String css = super.getCssClass();
+                            if ("schema".equals(fieldName)) {
+                                css = StringUtils.isBlank(css)
+                                        ? "medium_fixedsize"
+                                        : css + " medium_fixedsize";
+                            }
+                            return css;
+                        }
+                    };
+                    columns.add(column);
+                }
+            }
+        }
+
+        columns.add(new AbstractColumn<AttrTO, String>(new ResourceModel("actions", "")) {
+
+            private static final long serialVersionUID = -3503023501954863131L;
+
+            @Override
+            public String getCssClass() {
+                return "action";
+            }
+
+            @Override
+            public void populateItem(
+                    final Item<ICellPopulator<AttrTO>> item,
+                    final String componentId,
+                    final IModel<AttrTO> model) {
+
+                final AttrTO attrTO = model.getObject();
+
+                final ActionLinksPanel.Builder<Serializable> actionLinks
+                        = ActionLinksPanel.builder(page.getPageReference());
+                actionLinks.setDisableIndicator(true);
+                ActionLinksPanel.Builder<Serializable> addWithRoles = actionLinks
+                        .addWithRoles(new ActionLink<Serializable>() {
+
+                            private static final long serialVersionUID = 3257738274365467945L;
+
+                            @Override
+                            public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
+                                target.add(modalDetails);
+                                modalDetails.addSumbitButton();
+                                modalDetails.header(new StringResourceModel("any.edit"));
+                                modalDetails.setContent(new ParametersEditModalPanel(modalDetails, attrTO, pageRef));
+                                modalDetails.show(true);
+                            }
+                        }, ActionLink.ActionType.EDIT, StandardEntitlement.CONFIGURATION_SET
+                        )
+                        .addWithRoles(new ActionLink<Serializable>() {
+
+                            private static final long serialVersionUID = 3257738274365467945L;
+
+                            @Override
+                            public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
+                                try {
+                                    SyncopeConsoleSession.get().getService(
+                                            ConfigurationService.class).delete(attrTO.getSchema());
+                                    info(getString(Constants.OPERATION_SUCCEEDED));
+                                    target.add(container);
+                                } catch (Exception e) {
+                                    LOG.error("While deleting AttrTO", e);
+                                    error(getString(Constants.ERROR) + ": " + e.getMessage());
+                                }
+                                ((BasePage) getPage()).getNotificationPanel().refresh(target);
+
+                            }
+                        }, ActionLink.ActionType.DELETE, StandardEntitlement.CONFIGURATION_DELETE);
+
+                item.add(actionLinks.build(componentId));
+            }
+        }
+        );
+
+        return columns;
+
+    }
+
+    protected final class ParametersProvider extends SearchableDataProvider<AttrTO> {
+
+        private static final long serialVersionUID = -185944053385660794L;
+
+        private ParametersProvider(final int paginatorRows) {
+            super(paginatorRows);
+        }
+
+        @Override
+        public Iterator<AttrTO> iterator(final long first, final long count) {
+            final List<AttrTO> list = SyncopeConsoleSession.get().getService(ConfigurationService.class).list();
+            return list.subList((int) first, (int) first + (int) count).iterator();
+        }
+
+        @Override
+        public long size() {
+            return SyncopeConsoleSession.get().getService(ConfigurationService.class).list().size();
+        }
+
+        @Override
+        public IModel<AttrTO> model(final AttrTO object) {
+            return new CompoundPropertyModel<>(object);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/java/org/apache/syncope/client/console/panels/PlainSchemaDetails.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/PlainSchemaDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/PlainSchemaDetails.java
index 2f6ed23..2c1f259 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/PlainSchemaDetails.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/PlainSchemaDetails.java
@@ -246,8 +246,8 @@ public class PlainSchemaDetails extends AbstractSchemaDetailsPanel {
         validatorClass.setChoices(validatorsList.getObject());
         schemaForm.add(validatorClass);
 
-        final AutoCompleteTextField<String> mandatoryCondition =
-                new AutoCompleteTextField<String>("mandatoryCondition") {
+        final AutoCompleteTextField<String> mandatoryCondition
+                = new AutoCompleteTextField<String>("mandatoryCondition") {
 
             private static final long serialVersionUID = -2428903969518079100L;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionModalPanel.java
deleted file mode 100644
index 671a494..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionModalPanel.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.client.console.panels;
-
-import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
-import org.apache.syncope.common.lib.to.SecurityQuestionTO;
-import org.apache.syncope.common.rest.api.service.SecurityQuestionService;
-import org.apache.wicket.PageReference;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.markup.html.form.Form;
-
-public class SecurityQuestionModalPanel extends AbstractModalPanel<SecurityQuestionTO> {
-
-    private static final long serialVersionUID = 4024126489500665435L;
-
-    private final SecurityQuestionTO securityQuestionTO;
-
-    public SecurityQuestionModalPanel(
-            final BaseModal<SecurityQuestionTO> modal,
-            final SecurityQuestionTO securityQuestionTO,
-            final PageReference pageRef) {
-        super(modal, pageRef);
-        this.securityQuestionTO = securityQuestionTO;
-        add(new SecurityQuestionDetailsPanel("securityQuestionDetailsPanel", getItem()));
-    }
-
-    @Override
-    public final SecurityQuestionTO getItem() {
-        return this.securityQuestionTO;
-    }
-
-    @Override
-    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
-        try {
-            if (securityQuestionTO.getKey() == 0) {
-                SyncopeConsoleSession.get().getService(SecurityQuestionService.class).create(securityQuestionTO);
-            } else {
-                SyncopeConsoleSession.get().getService(SecurityQuestionService.class).update(securityQuestionTO);
-            }
-
-            info(getString(Constants.OPERATION_SUCCEEDED));
-            modal.close(target);
-        } catch (Exception e) {
-            LOG.error("While creating or updating SecutiryQuestionTO", e);
-            error(getString(Constants.ERROR) + ": " + e.getMessage());
-            modal.getNotificationPanel().refresh(target);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsModalPanel.java
new file mode 100644
index 0000000..773c8de
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsModalPanel.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.panels;
+
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.common.lib.to.SecurityQuestionTO;
+import org.apache.syncope.common.rest.api.service.SecurityQuestionService;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.html.form.Form;
+
+public class SecurityQuestionsModalPanel extends AbstractModalPanel<SecurityQuestionTO> {
+
+    private static final long serialVersionUID = 4024126489500665435L;
+
+    private final SecurityQuestionTO securityQuestionTO;
+
+    public SecurityQuestionsModalPanel(
+            final BaseModal<SecurityQuestionTO> modal,
+            final SecurityQuestionTO securityQuestionTO,
+            final PageReference pageRef) {
+        super(modal, pageRef);
+        this.securityQuestionTO = securityQuestionTO;
+        add(new SecurityQuestionDetailsPanel("securityQuestionDetailsPanel", getItem()));
+    }
+
+    @Override
+    public final SecurityQuestionTO getItem() {
+        return this.securityQuestionTO;
+    }
+
+    @Override
+    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
+        try {
+            if (securityQuestionTO.getKey() == 0) {
+                SyncopeConsoleSession.get().getService(SecurityQuestionService.class).create(securityQuestionTO);
+            } else {
+                SyncopeConsoleSession.get().getService(SecurityQuestionService.class).update(securityQuestionTO);
+            }
+
+            info(getString(Constants.OPERATION_SUCCEEDED));
+            modal.close(target);
+        } catch (Exception e) {
+            LOG.error("While creating or updating SecutiryQuestionTO", e);
+            error(getString(Constants.ERROR) + ": " + e.getMessage());
+        }
+        modal.getNotificationPanel().refresh(target);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
index 64b71da..4d0bd42 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
@@ -81,7 +81,7 @@ public class SecurityQuestionsPanel extends AbstractSearchResultPanel<
             @Override
             public ModalPanel<SecurityQuestionTO> build(final int index, final boolean edit) {
                 final SecurityQuestionTO modelObject = newModelObject();
-                return new SecurityQuestionModalPanel(modal, modelObject, pageRef);
+                return new SecurityQuestionsModalPanel(modal, modelObject, pageRef);
             }
 
             @Override
@@ -188,8 +188,8 @@ public class SecurityQuestionsPanel extends AbstractSearchResultPanel<
             public void populateItem(final Item<ICellPopulator<SecurityQuestionTO>> item, final String componentId,
                     final IModel<SecurityQuestionTO> model) {
 
-                final ActionLinksPanel.Builder<Serializable> actionLinks =
-                        ActionLinksPanel.builder(page.getPageReference());
+                final ActionLinksPanel.Builder<Serializable> actionLinks = ActionLinksPanel.builder(page.
+                        getPageReference());
                 actionLinks.setDisableIndicator(true);
                 actionLinks
                         .addWithRoles(new ActionLink<Serializable>() {
@@ -199,8 +199,7 @@ public class SecurityQuestionsPanel extends AbstractSearchResultPanel<
                             @Override
                             public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
                                 send(SecurityQuestionsPanel.this, Broadcast.EXACT,
-                                        new AjaxWizard.EditItemActionEvent<>(
-                                                model.getObject(), target));
+                                        new AjaxWizard.EditItemActionEvent<>(model.getObject(), target));
                             }
                         }, ActionLink.ActionType.EDIT, StandardEntitlement.SECURITY_QUESTION_UPDATE)
                         .addWithRoles(new ActionLink<Serializable>() {

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/java/org/apache/syncope/client/console/panels/search/GroupSearchPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/GroupSearchPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/GroupSearchPanel.java
index 2e3de8f..0c68d8b 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/GroupSearchPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/GroupSearchPanel.java
@@ -58,7 +58,7 @@ public final class GroupSearchPanel extends AbstractSearchPanel {
 
             @Override
             protected List<SearchClause.Type> load() {
-                final List<SearchClause.Type> result = new ArrayList<SearchClause.Type>();
+                final List<SearchClause.Type> result = new ArrayList<>();
                 result.add(SearchClause.Type.ATTRIBUTE);
                 result.add(SearchClause.Type.RESOURCE);
                 return result;

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/MultiFieldPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/MultiFieldPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/MultiFieldPanel.java
index ab99f2b..07a1311 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/MultiFieldPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/MultiFieldPanel.java
@@ -38,7 +38,7 @@ public abstract class MultiFieldPanel<E extends Serializable> extends AbstractFi
 
     private static final long serialVersionUID = -6322397761456513324L;
 
-    private ListView<E> view;
+    private final ListView<E> view;
 
     private final FieldPanel<? extends Serializable> panelTemplate;
 
@@ -156,12 +156,6 @@ public abstract class MultiFieldPanel<E extends Serializable> extends AbstractFi
 
         private final IModel<List<E>> model;
 
-        private boolean plusAlwaysAvailable;
-
-        private boolean minusAwaysAvailable;
-
-        private boolean multivalue;
-
         private boolean eventTemplate = false;
 
         public Builder(final IModel<List<E>> model) {
@@ -169,39 +163,6 @@ public abstract class MultiFieldPanel<E extends Serializable> extends AbstractFi
         }
 
         /**
-         * Show plus button icon to ad more elements.
-         *
-         * @param plusAlwaysAvailable whether plus button must always available
-         * @return this instance, for fluent building
-         */
-        public Builder<E> setPlusAlwaysAvailable(final boolean plusAlwaysAvailable) {
-            this.plusAlwaysAvailable = plusAlwaysAvailable;
-            return this;
-        }
-
-        /**
-         * Show minus button icon to remove elements included the latest one in order to empty the list explicitly.
-         *
-         * @param minusAwaysAvailable whether minus button must always available
-         * @return this instance, for fluent building
-         */
-        public Builder<E> setMinusAwaysAvailable(final boolean minusAwaysAvailable) {
-            this.minusAwaysAvailable = minusAwaysAvailable;
-            return this;
-        }
-
-        /**
-         * Set multivalue field.
-         *
-         * @param multivalue whether this field is multivalue
-         * @return this instance, for fluent building
-         */
-        public Builder<E> setMultivalue(final boolean multivalue) {
-            this.multivalue = multivalue;
-            return this;
-        }
-
-        /**
          * Set on_change event in order to send MultiValueSelectorEvent to page.
          *
          * @see MultiValueSelectorEvent

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
index c1e7c96..cd4c0eb 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
@@ -153,8 +153,7 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
                     modal.header(new StringResourceModel(
                             String.format("any.%s", newItemEvent.getEventDescription()),
                             this,
-                            new Model<T>(modalPanel.getItem())));
-
+                            new Model<>(modalPanel.getItem())));
                     modal.show(true);
                 } else {
                     final Fragment fragment = new Fragment("content", "wizard", WizardMgtPanel.this);

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
index 92f4116..45426b6 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
@@ -50,7 +50,6 @@ public abstract class AnyWizardBuilder<T extends AnyTO> extends AjaxWizardBuilde
      */
     public AnyWizardBuilder(
             final String id, final T anyTO, final List<String> anyTypeClasses, final PageReference pageRef) {
-
         super(id, new AnyHandler<>(anyTO), pageRef);
         this.anyTypeClasses = anyTypeClasses;
     }
@@ -74,7 +73,7 @@ public abstract class AnyWizardBuilder<T extends AnyTO> extends AjaxWizardBuilde
 
     @Override
     protected WizardModel buildModelSteps(final AnyHandler<T> modelObject, final WizardModel wizardModel) {
-        final String[] clazzes = anyTypeClasses.toArray(new String[] {});
+        final String[] clazzes = anyTypeClasses.toArray(new String[]{});
         // optional details panel step
         addOptionalDetailsPanel(modelObject, wizardModel);
 
@@ -113,7 +112,7 @@ public abstract class AnyWizardBuilder<T extends AnyTO> extends AjaxWizardBuilde
     protected AnyWizardBuilder<T> addOptionalDetailsPanel(
             final AnyHandler<T> modelObject, final WizardModel wizardModel) {
         if (modelObject.getInnerObject().getKey() > 0) {
-            wizardModel.add(new Details<T>(
+            wizardModel.add(new Details<>(
                     modelObject, new ListModel<>(Collections.<StatusBean>emptyList()), pageRef, true));
         }
         return this;

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/PlainAttrs.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/PlainAttrs.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/PlainAttrs.java
index cf16792..9c8a83e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/PlainAttrs.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/PlainAttrs.java
@@ -32,6 +32,7 @@ import org.apache.commons.collections4.Transformer;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.commons.JexlHelpUtils;
 import org.apache.syncope.client.console.commons.Mode;
+import org.apache.syncope.client.console.commons.SchemaUtils;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxCheckBoxPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDateFieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
@@ -40,7 +41,6 @@ import org.apache.syncope.client.console.wicket.markup.html.form.BinaryFieldPane
 import org.apache.syncope.client.console.wicket.markup.html.form.FieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.MultiFieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.SpinnerFieldPanel;
-import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
 import org.apache.syncope.common.lib.to.AttrTO;
@@ -83,11 +83,11 @@ public class PlainAttrs extends AbstractAttrs {
                         anyTypeClassRestClient.list(getAllAuxClasses()),
                         new Transformer<AnyTypeClassTO, String>() {
 
-                            @Override
-                            public String transform(final AnyTypeClassTO input) {
-                                return input.getKey();
-                            }
-                        }, new ArrayList<>(Arrays.asList(anyTypeClass))));
+                    @Override
+                    public String transform(final AnyTypeClassTO input) {
+                        return input.getKey();
+                    }
+                }, new ArrayList<>(Arrays.asList(anyTypeClass))));
                 setAttrs();
                 return new ArrayList<>(entityTO.getPlainAttrs());
             }
@@ -98,7 +98,7 @@ public class PlainAttrs extends AbstractAttrs {
             private static final long serialVersionUID = 9101744072914090143L;
 
             @Override
-            @SuppressWarnings({ "unchecked", "rawtypes" })
+            @SuppressWarnings({"unchecked", "rawtypes"})
             protected void populateItem(final ListItem<AttrTO> item) {
                 final AttrTO attributeTO = (AttrTO) item.getDefaultModelObject();
 
@@ -112,7 +112,7 @@ public class PlainAttrs extends AbstractAttrs {
                     questionMarkJexlHelp.setVisible(false);
                 }
 
-                final FieldPanel panel = getFieldPanel(schemas.get(attributeTO.getSchema()), form, attributeTO);
+                final FieldPanel panel = getFieldPanel(schemas.get(attributeTO.getSchema()));
 
                 if (mode == Mode.TEMPLATE || !schemas.get(attributeTO.getSchema()).isMultivalue()) {
                     item.add(panel);
@@ -120,9 +120,9 @@ public class PlainAttrs extends AbstractAttrs {
                 } else {
                     item.add(new MultiFieldPanel.Builder<>(
                             new PropertyModel<List<String>>(attributeTO, "values")).build(
-                                    "panel",
-                                    attributeTO.getSchema(),
-                                    panel));
+                            "panel",
+                            attributeTO.getSchema(),
+                            panel));
                 }
             }
         });
@@ -132,7 +132,7 @@ public class PlainAttrs extends AbstractAttrs {
 
         AttrTO attrLayout = null;
         final List<PlainSchemaTO> schemaTOs
-                = schemaRestClient.getSchemas(SchemaType.PLAIN, anyTypeClasses.toArray(new String[] {}));
+                = schemaRestClient.getSchemas(SchemaType.PLAIN, anyTypeClasses.toArray(new String[]{}));
 
         schemas.clear();
 
@@ -189,8 +189,8 @@ public class PlainAttrs extends AbstractAttrs {
         entityTO.getPlainAttrs().addAll(entityData);
     }
 
-    @SuppressWarnings({ "rawtypes", "unchecked" })
-    private FieldPanel getFieldPanel(final PlainSchemaTO schemaTO, final Form form, final AttrTO attributeTO) {
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    private FieldPanel getFieldPanel(final PlainSchemaTO schemaTO) {
         final boolean required = mode == Mode.TEMPLATE
                 ? false
                 : schemaTO.getMandatoryCondition().equalsIgnoreCase("true");
@@ -212,14 +212,14 @@ public class PlainAttrs extends AbstractAttrs {
                 break;
             case Enum:
                 panel = new AjaxDropDownChoicePanel<>("panel", schemaTO.getKey(), new Model<String>(), false);
-                ((AjaxDropDownChoicePanel<String>) panel).setChoices(getEnumeratedValues(schemaTO));
+                ((AjaxDropDownChoicePanel<String>) panel).setChoices(SchemaUtils.getEnumeratedValues(schemaTO));
 
                 if (StringUtils.isNotBlank(schemaTO.getEnumerationKeys())) {
                     ((AjaxDropDownChoicePanel) panel).setChoiceRenderer(new IChoiceRenderer<String>() {
 
                         private static final long serialVersionUID = -3724971416312135885L;
 
-                        private final Map<String, String> valueMap = getEnumeratedKeyValues(schemaTO);
+                        private final Map<String, String> valueMap = SchemaUtils.getEnumeratedKeyValues(schemaTO);
 
                         @Override
                         public String getDisplayValue(final String value) {
@@ -263,8 +263,8 @@ public class PlainAttrs extends AbstractAttrs {
             case Binary:
                 panel = new BinaryFieldPanel("panel", schemaTO.getKey(), new Model<String>(),
                         schemas.containsKey(schemaTO.getKey())
-                                ? schemas.get(schemaTO.getKey()).getMimeType()
-                                : null);
+                        ? schemas.get(schemaTO.getKey()).getMimeType()
+                        : null);
 
                 if (required) {
                     panel.addRequiredLabel();
@@ -283,36 +283,4 @@ public class PlainAttrs extends AbstractAttrs {
 
         return panel;
     }
-
-    private Map<String, String> getEnumeratedKeyValues(final PlainSchemaTO schemaTO) {
-        final Map<String, String> res = new HashMap<>();
-
-        final String[] values = StringUtils.isBlank(schemaTO.getEnumerationValues())
-                ? new String[0]
-                : schemaTO.getEnumerationValues().split(SyncopeConstants.ENUM_VALUES_SEPARATOR);
-
-        final String[] keys = StringUtils.isBlank(schemaTO.getEnumerationKeys())
-                ? new String[0]
-                : schemaTO.getEnumerationKeys().split(SyncopeConstants.ENUM_VALUES_SEPARATOR);
-
-        for (int i = 0; i < values.length; i++) {
-            res.put(values[i].trim(), keys.length > i ? keys[i].trim() : null);
-        }
-
-        return res;
-    }
-
-    private List<String> getEnumeratedValues(final PlainSchemaTO schemaTO) {
-        final List<String> res = new ArrayList<>();
-
-        final String[] values = StringUtils.isBlank(schemaTO.getEnumerationValues())
-                ? new String[0]
-                : schemaTO.getEnumerationValues().split(SyncopeConstants.ENUM_VALUES_SEPARATOR);
-
-        for (String value : values) {
-            res.add(value.trim());
-        }
-
-        return res;
-    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
index f219b8a..ca7abd7 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
@@ -107,6 +107,7 @@ under the License.
                 <li wicket:id="layoutsLI"><a href="#" wicket:id="layouts"><i class="fa fa-object-ungroup"></i>Layouts</a></li>
                 <li wicket:id="typesLI"><a href="#" wicket:id="types"><i class="fa fa-wrench"></i><wicket:message key="types"/></a></li>
                 <li wicket:id="notificationsLI"><a href="#" wicket:id="notifications"><i class="fa fa-envelope-o"></i>Notifications</a></li>
+                <li wicket:id="parametersLI"><a href="#" wicket:id="parameters"><i class="fa fa-cog"></i>Parameters</a></li>
               </ul>
             </li>
             <li wicket:id="extensionsLI" class="treeview">

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/resources/org/apache/syncope/client/console/pages/Parameters.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Parameters.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Parameters.html
new file mode 100644
index 0000000..9729c72
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Parameters.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
+  <wicket:extend>
+    <div class="wrapper">
+      <div class="admin-content-page" wicket:id="content">
+        <div class="box box-solid box-primary">
+          <div class="box-header with-border">
+            <h3 class="box-title">
+              <span wicket:id="header"></span>
+            </h3>
+            <div class="box-tools pull-right">
+            </div>
+          </div>
+          <div class="box-body">
+            <div class="realms">
+              <div wicket:id="parametersPanel"></div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </wicket:extend>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/resources/org/apache/syncope/client/console/pages/Parameters.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Parameters.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Parameters.properties
new file mode 100644
index 0000000..f9a68f1
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Parameters.properties
@@ -0,0 +1,19 @@
+# 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.
+header_title=Parameters
+createParameter=Create new Parameter
+content=Content

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/resources/org/apache/syncope/client/console/pages/Parameters_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Parameters_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Parameters_it.properties
new file mode 100644
index 0000000..12fc219
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Parameters_it.properties
@@ -0,0 +1,19 @@
+# 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.
+header_title=Parametri di configurazione
+createParameter=Crea un nuovo parametro
+content=Contenuto

http://git-wip-us.apache.org/repos/asf/syncope/blob/143c8e6d/client/console/src/main/resources/org/apache/syncope/client/console/pages/Parameters_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Parameters_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Parameters_pt_BR.properties
new file mode 100644
index 0000000..682871d
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Parameters_pt_BR.properties
@@ -0,0 +1,19 @@
+# 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.
+header_title=Par\u00e2metros
+createParameter=Cria um novo par\u00e2metros
+content=Conte\u00fado

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