http://git-wip-us.apache.org/repos/asf/ignite/blob/cca10d0c/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general.pug
 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general.pug
index a7eb99e..26a949a 100644
--- 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general.pug
+++ 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general.pug
@@ -42,7 +42,6 @@ panel-collapsible(opened=`::true` ng-form=form)
                     label: 'Name:',
                     model: `${model}.name`,
                     name: '"clusterName"',
-                    disabled: 'false',
                     placeholder: 'Input name',
                     required: true,
                     tip: 'Instance name allows to indicate to what grid this 
particular grid instance belongs to'
@@ -51,28 +50,40 @@ panel-collapsible(opened=`::true` ng-form=form)
                     ignite-unique-property='name'
                     ignite-unique-skip=`["_id", ${model}]`
                 )
-                    +unique-feedback(`${model}.name`, 'Cluster name should be 
unique.')
+                    +form-field__error({ error: 'igniteUnique', message: 
'Cluster name should be unique.' })
 
             .pc-form-grid-col-30
-                +text-ip-address('Local host:', `${model}.localHost`, 
'"localHost"', 'true', '0.0.0.0',
-                    'System-wide local address or host for all Ignite 
components to bind to<br/>\
-                    If not defined then Ignite tries to use local wildcard 
address<br/>\
-                    That means that all services will be available on all 
network interfaces of the host machine')
+                +form-field__ip-address({
+                    label: 'Local host:',
+                    model: `${model}.localHost`,
+                    name: '"localHost"',
+                    enabled: 'true',
+                    placeholder: '0.0.0.0',
+                    tip: 'System-wide local address or host for all Ignite 
components to bind to<br/>\
+                          If not defined then Ignite tries to use local 
wildcard address<br/>\
+                          That means that all services will be available on 
all network interfaces of the host machine'
+                })
 
             .pc-form-grid-col-60
-                +dropdown('Discovery:', `${model}.discovery.kind`, 
'"discovery"', 'true', 'Choose discovery', '$ctrl.Clusters.discoveries',
-                'Discovery allows to discover remote nodes in grid\
-                <ul>\
-                    <li>Static IPs - IP Finder which works only with pre 
configured list of IP addresses specified</li>\
-                    <li>Multicast - Multicast based IP finder</li>\
-                    <li>AWS S3 - AWS S3 based IP finder that automatically 
discover cluster nodes on Amazon EC2 cloud</li>\
-                    <li>Apache jclouds - Apache jclouds multi cloud toolkit 
based IP finder for cloud platforms with unstable IP addresses</li>\
-                    <li>Google cloud storage - Google Cloud Storage based IP 
finder that automatically discover cluster nodes on Google Compute Engine 
cluster</li>\
-                    <li>JDBC - JDBC based IP finder that use database to store 
node IP address</li>\
-                    <li>Shared filesystem - Shared filesystem based IP finder 
that use file to store node IP address</li>\
-                    <li>Apache ZooKeeper - Apache ZooKeeper based IP finder 
when you use ZooKeeper to coordinate your distributed environment</li>\
-                    <li>Kubernetes - IP finder for automatic lookup of Ignite 
nodes running in Kubernetes environment</li>\
-                </ul>')
+                +form-field__dropdown({
+                    label: 'Discovery:',
+                    model: `${model}.discovery.kind`,
+                    name: '"discovery"',
+                    placeholder: 'Choose discovery',
+                    options: '$ctrl.Clusters.discoveries',
+                    tip: 'Discovery allows to discover remote nodes in grid\
+                        <ul>\
+                            <li>Static IPs - IP Finder which works only with 
pre configured list of IP addresses specified</li>\
+                            <li>Multicast - Multicast based IP finder</li>\
+                            <li>AWS S3 - AWS S3 based IP finder that 
automatically discover cluster nodes on Amazon EC2 cloud</li>\
+                            <li>Apache jclouds - Apache jclouds multi cloud 
toolkit based IP finder for cloud platforms with unstable IP addresses</li>\
+                            <li>Google cloud storage - Google Cloud Storage 
based IP finder that automatically discover cluster nodes on Google Compute 
Engine cluster</li>\
+                            <li>JDBC - JDBC based IP finder that use database 
to store node IP address</li>\
+                            <li>Shared filesystem - Shared filesystem based IP 
finder that use file to store node IP address</li>\
+                            <li>Apache ZooKeeper - Apache ZooKeeper based IP 
finder when you use ZooKeeper to coordinate your distributed environment</li>\
+                            <li>Kubernetes - IP finder for automatic lookup of 
Ignite nodes running in Kubernetes environment</li>\
+                        </ul>'
+                })
             .pc-form-group
                 +discovery-cloud()(ng-if=`${modelDiscoveryKind} === 'Cloud'`)
                 +discovery-google()(ng-if=`${modelDiscoveryKind} === 
'GoogleStorage'`)

http://git-wip-us.apache.org/repos/asf/ignite/blob/cca10d0c/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/cloud.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/cloud.pug
 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/cloud.pug
index 074756e..800302a 100644
--- 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/cloud.pug
+++ 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/cloud.pug
@@ -28,19 +28,42 @@ mixin discovery-cloud(modelAt='$ctrl.clonedCluster')
 
     div.pc-form-grid-row&attributes(attributes=attributes)
         .pc-form-grid-col-30
-            +text('Credential:', `${model}.credential`, '"credential"', 
'false', 'Input cloud credential',
-                'Credential that is used during authentication on the 
cloud<br/>\
-                Depending on a cloud platform it can be a password or access 
key')
+            +form-field__text({
+                label: 'Credential:',
+                model: `${model}.credential`,
+                name: '"credential"',
+                placeholder: 'Input cloud credential',
+                tip: 'Credential that is used during authentication on the 
cloud<br/>\
+                      Depending on a cloud platform it can be a password or 
access key'
+            })
         .pc-form-grid-col-30
-            +text('Path to credential:', `${model}.credentialPath`, 
'"credentialPath"', 'false', 'Input path to credential',
-                'Path to a credential that is used during authentication on 
the cloud<br/>\
-                Access key or private key should be stored in a plain or PEM 
file without a passphrase')
+            +form-field__text({
+                label: 'Path to credential:',
+                model: `${model}.credentialPath`,
+                name: '"credentialPath"',
+                placeholder: 'Input path to credential',
+                tip: 'Path to a credential that is used during authentication 
on the cloud<br/>\
+                     Access key or private key should be stored in a plain or 
PEM file without a passphrase'
+            })
         .pc-form-grid-col-30
-            +text('Identity:', `${model}.identity`, '"' + discoveryKind + 
'Identity"', required, 'Input identity',
-                'Identity that is used as a user name during a connection to 
the cloud<br/>\
-                Depending on a cloud platform it can be an email address, user 
name, etc')
+            +form-field__text({
+                label: 'Identity:',
+                model: `${model}.identity`,
+                name: '"' + discoveryKind + 'Identity"',
+                required: required,
+                placeholder: 'Input identity',
+                tip: 'Identity that is used as a user name during a connection 
to the cloud<br/>\
+                     Depending on a cloud platform it can be an email address, 
user name, etc'
+            })
         .pc-form-grid-col-30
-            +text('Provider:', `${model}.provider`, '"' + discoveryKind + 
'Provider"', required, 'Input provider', 'Cloud provider to use')
+            +form-field__text({
+                label:'Provider:',
+                model: `${model}.provider`,
+                name: '"' + discoveryKind + 'Provider"',
+                required: required,
+                placeholder: 'Input provider',
+                tip: 'Cloud provider to use'
+            })
         .pc-form-grid-col-60
             .ignite-form-field
                 +list-text-field({
@@ -57,8 +80,7 @@ mixin discovery-cloud(modelAt='$ctrl.clonedCluster')
                         Note, that some cloud providers, like Google Compute 
Engine, doesn't have a notion of a region. For such providers regions are 
redundant"
                     }]`
                 )
-                    +unique-feedback(_, 'Such region already exists!')
-
+                    +form-field__error({ error: 'igniteUnique', message: 'Such 
region already exists!' })
         .pc-form-grid-col-60
             .ignite-form-field
                 +list-text-field({
@@ -75,4 +97,4 @@ mixin discovery-cloud(modelAt='$ctrl.clonedCluster')
                         Note, that some cloud providers, like Rackspace, 
doesn't have a notion of a zone. For such providers zones are redundant"
                     }]`
                 )
-                    +unique-feedback(_, 'Such zone already exists!')
+                    +form-field__error({ error: 'igniteUnique', message: 'Such 
zone already exists!' })

http://git-wip-us.apache.org/repos/asf/ignite/blob/cca10d0c/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/google.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/google.pug
 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/google.pug
index 7de3843..01996ac 100644
--- 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/google.pug
+++ 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/google.pug
@@ -23,16 +23,41 @@ mixin discovery-google(modelAt = '$ctrl.clonedCluster')
 
     .pc-form-grid-row&attributes(attributes=attributes)
         .pc-form-grid-col-30
-            +text('Project name:', `${model}.projectName`, 
`'${discoveryKind}ProjectName'`, required, 'Input project name', '' +
-                'Google Cloud Platforms project name<br/>\
-                Usually this is an auto generated project number(ex. 
208709979073) that can be found in "Overview" section of Google Developer 
Console')
+            +form-field__text({
+                label: 'Project name:',
+                model: `${model}.projectName`,
+                name: `'${discoveryKind}ProjectName'`,
+                required: required,
+                placeholder: 'Input project name',
+                tip: 'Google Cloud Platforms project name<br/>\
+                     Usually this is an auto generated project number(ex. 
208709979073) that can be found in "Overview" section of Google Developer 
Console'
+            })
         .pc-form-grid-col-30
-            +text('Bucket name:', `${model}.bucketName`, 
`'${discoveryKind}BucketName'`, required, 'Input bucket name',
-                'Google Cloud Storage bucket name<br/>\
-                If the bucket does not exist Ignite will automatically create 
it<br/>\
-                However the name must be unique across whole Google Cloud 
Storage and Service Account Id must be authorized to perform this operation')
+            +form-field__text({
+                label: 'Bucket name:',
+                model: `${model}.bucketName`,
+                name: `'${discoveryKind}BucketName'`,
+                required: required,
+                placeholder: 'Input bucket name',
+                tip: 'Google Cloud Storage bucket name<br/>\
+                     If the bucket does not exist Ignite will automatically 
create it<br/>\
+                     However the name must be unique across whole Google Cloud 
Storage and Service Account Id must be authorized to perform this operation'
+            })
         .pc-form-grid-col-30
-            +text('Private key path:', `${model}.serviceAccountP12FilePath`, 
`'${discoveryKind}ServiceAccountP12FilePath'`, required, 'Input private key 
path',
-                'Full path to the private key in PKCS12 format of the Service 
Account')
+            +form-field__text({
+                label: 'Private key path:',
+                model: `${model}.serviceAccountP12FilePath`,
+                name: `'${discoveryKind}ServiceAccountP12FilePath'`,
+                required: required,
+                placeholder: 'Input private key path',
+                tip: 'Full path to the private key in PKCS12 format of the 
Service Account'
+            })
         .pc-form-grid-col-30
-            +text('Account id:', `${model}.serviceAccountId`, 
`'${discoveryKind}ServiceAccountId'`, required, 'Input account id', 'Service 
account ID (typically an e-mail address)')
+            +form-field__text({
+                label: 'Account id:',
+                model: `${model}.serviceAccountId`,
+                name: `'${discoveryKind}ServiceAccountId'`,
+                required: required,
+                placeholder: 'Input account id',
+                tip: 'Service account ID (typically an e-mail address)'
+            })

http://git-wip-us.apache.org/repos/asf/ignite/blob/cca10d0c/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/jdbc.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/jdbc.pug
 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/jdbc.pug
index 8a8f4f4..eb9f0aa 100644
--- 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/jdbc.pug
+++ 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/jdbc.pug
@@ -22,11 +22,24 @@ mixin discovery-jdbc(modelAt = '$ctrl.clonedCluster')
 
     .pc-form-grid-row&attributes(attributes=attributes)
         .pc-form-grid-col-30
-            +text('Data source bean name:', `${model}.dataSourceBean`,
-                '"dataSourceBean"', required, 'Input bean name', 'Name of the 
data source bean in Spring context')
+            +form-field__text({
+                label: 'Data source bean name:',
+                model: `${model}.dataSourceBean`,
+                name: '"dataSourceBean"',
+                required: required,
+                placeholder:'Input bean name',
+                tip: 'Name of the data source bean in Spring context'
+            })
         .pc-form-grid-col-30
-            +dialect('Dialect:', `${model}.dialect`, '"dialect"', required,
-                'Dialect of SQL implemented by a particular RDBMS:', 'Generic 
JDBC dialect', 'Choose JDBC dialect')
+            +form-field__dialect({
+                label: 'Dialect:',
+                model: `${model}.dialect`,
+                name: '"dialect"',
+                required,
+                tip: 'Dialect of SQL implemented by a particular RDBMS:',
+                genericDialectName: 'Generic JDBC dialect',
+                placeholder: 'Choose JDBC dialect'
+            })
         .pc-form-grid-col-60
             +form-field__checkbox({
                 label: 'DB schema should be initialized by Ignite',

http://git-wip-us.apache.org/repos/asf/ignite/blob/cca10d0c/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/kubernetes.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/kubernetes.pug
 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/kubernetes.pug
index 9232022..32d94fc 100644
--- 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/kubernetes.pug
+++ 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/kubernetes.pug
@@ -22,17 +22,38 @@ mixin discovery-kubernetes(modelAt = '$ctrl.clonedCluster')
 
     .pc-form-grid-row&attributes(attributes=attributes)
         .pc-form-grid-col-30
-            +text('Service name:', `${model}.serviceName`, 
`'${discoveryKind}ServiceName'`, 'false', 'ignite',
-                "The name of Kubernetes service for Ignite pods' IP addresses 
lookup.<br/>\
-                The name of the service must be equal to the name set in 
service's Kubernetes configuration.<br/>\
-                If this parameter is not changed then the name of the service 
has to be set to 'ignite' in the corresponding Kubernetes configuration.")
+            +form-field__text({
+                label: 'Service name:',
+                model: `${model}.serviceName`,
+                name: `'${discoveryKind}ServiceName'`,
+                placeholder: 'ignite',
+                tip: "The name of Kubernetes service for Ignite pods' IP 
addresses lookup.<br/>\
+                     The name of the service must be equal to the name set in 
service's Kubernetes configuration.<br/>\
+                     If this parameter is not changed then the name of the 
service has to be set to 'ignite' in the corresponding Kubernetes 
configuration."
+            })
         .pc-form-grid-col-30
-            +text('Namespace:', `${model}.namespace`, 
`'${discoveryKind}Namespace'`, 'false', 'default',
-                "The namespace the Kubernetes service belongs to.<br/>\
-                By default, it's supposed that the service is running under 
Kubernetes `default` namespace.")
+            +form-field__text({
+                label: 'Namespace:',
+                model: `${model}.namespace`,
+                name: `'${discoveryKind}Namespace'`,
+                placeholder: 'default',
+                tip: "The namespace the Kubernetes service belongs to.<br/>\
+                      By default, it's supposed that the service is running 
under Kubernetes `default` namespace."
+            })
         .pc-form-grid-col-60
-            +url('Kubernetes server:', `${model}.masterUrl`, 
`'${discoveryKind}MasterUrl'`, 'true', 'false', 
'https://kubernetes.default.svc.cluster.local:443',
-                'The host name of the Kubernetes API server')
+            +form-field__url({
+                label: 'Kubernetes server:',
+                model: `${model}.masterUrl`,
+                name: `'${discoveryKind}MasterUrl'`,
+                enabled: 'true',
+                placeholder: 
'https://kubernetes.default.svc.cluster.local:443',
+                tip: 'The host name of the Kubernetes API server'
+            })
         .pc-form-grid-col-60
-            +text('Service token file:', `${model}.accountToken`, 
`'${discoveryKind}AccountToken'`, 'false', 
'/var/run/secrets/kubernetes.io/serviceaccount/token',
-                'The path to the service token file')
+            +form-field__text({
+                label: 'Service token file:',
+                model: `${model}.accountToken`,
+                name: `'${discoveryKind}AccountToken'`,
+                placeholder: 
'/var/run/secrets/kubernetes.io/serviceaccount/token',
+                tip: 'The path to the service token file'
+            })

http://git-wip-us.apache.org/repos/asf/ignite/blob/cca10d0c/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/multicast.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/multicast.pug
 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/multicast.pug
index d4f3173..b767e9c 100644
--- 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/multicast.pug
+++ 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/multicast.pug
@@ -22,21 +22,54 @@ mixin discovery-multicast(modelAt = '$ctrl.clonedCluster')
 
     .pc-form-grid-row&attributes(attributes=attributes)
         .pc-form-grid-col-30
-            +text-ip-address('IP address:', `${model}.multicastGroup`, 
'"multicastGroup"', 'true', '228.1.2.4', 'IP address of multicast group')
+            +form-field__ip-address({
+                label: 'IP address:',
+                model: `${model}.multicastGroup`,
+                name: '"multicastGroup"',
+                enabled: 'true',
+                placeholder: '228.1.2.4',
+                tip: 'IP address of multicast group'
+            })
         .pc-form-grid-col-30
-            +number-min-max('Port number:', `${model}.multicastPort`, 
'"multicastPort"', 'true', '47400', '0', '65535', 'Port number which multicast 
messages are sent to')
+            +form-field__number({
+                label: 'Port number:',
+                model: `${model}.multicastPort`,
+                name: '"multicastPort"',
+                placeholder: '47400',
+                min: '0',
+                max: '65535',
+                tip: 'Port number which multicast messages are sent to'
+            })
         .pc-form-grid-col-20
-            +number('Waits for reply:', `${model}.responseWaitTime`, 
'"responseWaitTime"', 'true', '500', '0',
-                'Time in milliseconds IP finder waits for reply to multicast 
address request')
+            +form-field__number({
+                label: 'Waits for reply:',
+                model: `${model}.responseWaitTime`,
+                name: '"responseWaitTime"',
+                placeholder: '500',
+                min: '0',
+                tip: 'Time in milliseconds IP finder waits for reply to 
multicast address request'
+            })
         .pc-form-grid-col-20
-            +number('Attempts count:', `${model}.addressRequestAttempts`, 
'"addressRequestAttempts"', 'true', '2', '0',
-                'Number of attempts to send multicast address request<br/>\
-                IP finder re - sends request only in case if no reply for 
previous request is received')
+            +form-field__number({
+                label: 'Attempts count:',
+                model: `${model}.addressRequestAttempts`,
+                name: '"addressRequestAttempts"',
+                placeholder: '2',
+                min: '0',
+                tip: 'Number of attempts to send multicast address 
request<br/>\
+                     IP finder re - sends request only in case if no reply for 
previous request is received'
+            })
         .pc-form-grid-col-20.pc-form-grid-col-free
-            +text-ip-address('Local address:', `${model}.localAddress`, 
'"localAddress"', 'true', '0.0.0.0',
-                'Local host address used by this IP finder<br/>\
-                If provided address is non - loopback then multicast socket is 
bound to this interface<br/>\
-                If local address is not set or is any local address then IP 
finder creates multicast sockets for all found non - loopback addresses')
+            +form-field__ip-address({
+                label: 'Local address:',
+                model: `${model}.localAddress`,
+                name: '"localAddress"',
+                enabled: 'true',
+                placeholder: '0.0.0.0',
+                tip: 'Local host address used by this IP finder<br/>\
+                     If provided address is non - loopback then multicast 
socket is bound to this interface<br/>\
+                     If local address is not set or is any local address then 
IP finder creates multicast sockets for all found non - loopback addresses'
+            })
         .pc-form-grid-col-60
             .ignite-form-field
                 +list-addresses({

http://git-wip-us.apache.org/repos/asf/ignite/blob/cca10d0c/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/s3.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/s3.pug
 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/s3.pug
index 41d45ac..dc18824 100644
--- 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/s3.pug
+++ 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/s3.pug
@@ -24,15 +24,32 @@ mixin discovery-s3(modelAt = '$ctrl.clonedCluster')
 
     .pc-form-grid-row&attributes(attributes=attributes)
         .pc-form-grid-col-30
-            +text('Bucket name:', `${model}.bucketName`, 
`'${discoveryKind}BucketName'`, required, 'Input bucket name', 'Bucket name for 
IP finder')
+            +form-field__text({
+                label: 'Bucket name:',
+                model: `${model}.bucketName`,
+                name: `'${discoveryKind}BucketName'`,
+                required: required,
+                placeholder: 'Input bucket name',
+                tip: 'Bucket name for IP finder'
+            })
         .pc-form-grid-col-30
             .pc-form-grid__text-only-item(style='font-style: italic;color: 
#424242;')
                 | AWS credentials will be generated as stub
         .pc-form-grid-col-40(ng-if-start=`$ctrl.available("2.4.0")`)
-            +text('Bucket endpoint:', `${model}.bucketEndpoint`, 
`'${discoveryKind}BucketEndpoint'`, false, 'Input bucket endpoint',
-            'Bucket endpoint for IP finder<br/> \
-            For information about possible endpoint names visit <a 
href="http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region";>docs.aws.amazon.com</a>')
+            +form-field__text({
+                label: 'Bucket endpoint:',
+                model: `${model}.bucketEndpoint`,
+                name: `'${discoveryKind}BucketEndpoint'`,
+                placeholder: 'Input bucket endpoint',
+                tip: 'Bucket endpoint for IP finder<br/> \
+                      For information about possible endpoint names visit <a 
href="http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region";>docs.aws.amazon.com</a>'
+            })
         .pc-form-grid-col-20(ng-if-end)
-            +text('SSE algorithm:', `${model}.SSEAlgorithm`, 
`'${discoveryKind}SSEAlgorithm'`, false, 'Input SSE algorithm',
-            'Server-side encryption algorithm for Amazon S3-managed encryption 
keys<br/> \
-            For information about possible S3-managed encryption keys visit <a 
href="http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html";>docs.aws.amazon.com</a>')
\ No newline at end of file
+            +form-field__text({
+                label: 'SSE algorithm:',
+                model: `${model}.SSEAlgorithm`,
+                name: `'${discoveryKind}SSEAlgorithm'`,
+                placeholder: 'Input SSE algorithm',
+                tip: 'Server-side encryption algorithm for Amazon S3-managed 
encryption keys<br/> \
+                      For information about possible S3-managed encryption 
keys visit <a 
href="http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html";>docs.aws.amazon.com</a>'
+            })
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/cca10d0c/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/shared.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/shared.pug
 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/shared.pug
index 83e8f2a..e5b86c3 100644
--- 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/shared.pug
+++ 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/shared.pug
@@ -21,4 +21,10 @@ mixin discovery-shared(modelAt = '$ctrl.clonedCluster')
 
     .pc-form-grid-row&attributes(attributes=attributes)
         .pc-form-grid-col-60
-            +text('File path:', `${model}.path`, '"path"', 'false', 
'disco/tcp', 'Shared path')
+            +form-field__text({
+                label: 'File path:',
+                model: `${model}.path`,
+                name: '"path"',
+                placeholder: 'disco/tcp',
+                tip: 'Shared path'
+            })

http://git-wip-us.apache.org/repos/asf/ignite/blob/cca10d0c/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/vm.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/vm.pug
 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/vm.pug
index 133de43..aee3a1b 100644
--- 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/vm.pug
+++ 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/vm.pug
@@ -45,7 +45,8 @@ mixin discovery-vm(modelAt = '$ctrl.clonedCluster')
                         </ul>`
                 })(
                     ng-required='true'
-                    expose-ignite-form-field-control='$vmAddresses'
+                    ng-ref='$vmAddresses'
+                    ng-ref-read='ngModel'
                 )
                 .form-field__errors(
                     ng-messages=`$vmAddresses.$error`

http://git-wip-us.apache.org/repos/asf/ignite/blob/cca10d0c/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper.pug
 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper.pug
index 826e09b..53d704f 100644
--- 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper.pug
+++ 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper.pug
@@ -25,36 +25,52 @@ mixin discovery-zookeeper(modelAt = '$ctrl.clonedCluster')
 
     .pc-form-grid-row&attributes(attributes=attributes)
         .pc-form-grid-col-60
-            +java-class('Curator:', `${model}.curator`, '"curator"', 'true', 
'false',
-                'The Curator framework in use<br/>\
-                By default generates curator of org.apache.curator. 
framework.imps.CuratorFrameworkImpl\
-                class with configured connect string, retry policy, and 
default session and connection timeouts', required)
+            +form-field__java-class({
+                label: 'Curator:',
+                model: `${model}.curator`,
+                name: '"curator"',
+                tip: 'The Curator framework in use<br/>\
+                     By default generates curator of org.apache.curator. 
framework.imps.CuratorFrameworkImpl\
+                     class with configured connect string, retry policy, and 
default session and connection timeouts',
+                validationActive: required
+            })
         .pc-form-grid-col-60
-            +text('Connect string:', `${model}.zkConnectionString`, 
`'${discoveryKind}ConnectionString'`, required, 
'host:port[chroot][,host:port[chroot]]',
-                'When <b>IGNITE_ZK_CONNECTION_STRING</b> system property is 
not configured this property will be used.<br><br>This should be a comma 
separated host:port pairs, each corresponding to a zk server. e.g. 
"127.0.0.1:3000,127.0.0.1:3001".<br>If the optional chroot suffix is used the 
example would look like: "127.0.0.1:3000,127.0.0.1:3002/app/a".<br><br>Where 
the client would be rooted at "/app/a" and all paths would be relative to this 
root - ie getting/setting/etc... "/foo/bar" would result in operations being 
run on "/app/a/foo/bar" (from the server perspective).<br><br><a 
href="https://zookeeper.apache.org/doc/r3.2.2/api/org/apache/zookeeper/ZooKeeper.html#ZooKeeper(java.lang.String,%20int,%20org.apache.zookeeper.Watcher)">Zookeeper
 docs</a>')
+            +form-field__text({
+                label: 'Connect string:',
+                model: `${model}.zkConnectionString`,
+                name: `'${discoveryKind}ConnectionString'`,
+                required: required,
+                placeholder: 'host:port[chroot][,host:port[chroot]]',
+                tip: 'When <b>IGNITE_ZK_CONNECTION_STRING</b> system property 
is not configured this property will be used.<br><br>This should be a comma 
separated host:port pairs, each corresponding to a zk server. e.g. 
"127.0.0.1:3000,127.0.0.1:3001".<br>If the optional chroot suffix is used the 
example would look like: "127.0.0.1:3000,127.0.0.1:3002/app/a".<br><br>Where 
the client would be rooted at "/app/a" and all paths would be relative to this 
root - ie getting/setting/etc... "/foo/bar" would result in operations being 
run on "/app/a/foo/bar" (from the server perspective).<br><br><a 
href="https://zookeeper.apache.org/doc/r3.2.2/api/org/apache/zookeeper/ZooKeeper.html#ZooKeeper(java.lang.String,%20int,%20org.apache.zookeeper.Watcher)">Zookeeper
 docs</a>'
+            })
         .pc-form-grid-col-60
-            +dropdown('Retry policy:', `${model}.retryPolicy.kind`, 
'"retryPolicy"', 'true', 'Default',
-            '[\
-                {value: "ExponentialBackoff", label: "Exponential backoff"},\
-                {value: "BoundedExponentialBackoff", label: "Bounded 
exponential backoff"},\
-                {value: "UntilElapsed", label: "Until elapsed"},\
-                {value: "NTimes", label: "Max number of times"},\
-                {value: "OneTime", label: "Only once"},\
-                {value: "Forever", label: "Always allow retry"},\
-                {value: "Custom", label: "Custom"},\
-                {value: null, label: "Default"}\
-            ]',
-            'Available retry policies:\
-            <ul>\
-                <li>Exponential backoff - retries a set number of times with 
increasing sleep time between retries</li>\
-                <li>Bounded exponential backoff - retries a set number of 
times with an increasing (up to a maximum bound) sleep time between 
retries</li>\
-                <li>Until elapsed - retries until a given amount of time 
elapses</li>\
-                <li>Max number of times - retries a max number of times</li>\
-                <li>Only once - retries only once</li>\
-                <li>Always allow retry - retries infinitely</li>\
-                <li>Custom - custom retry policy implementation</li>\
-                <li>Default - exponential backoff retry policy with configured 
base sleep time equal to 1000ms and max retry count equal to 10</li>\
-            </ul>')
+            +form-field__dropdown({
+                label: 'Retry policy:',
+                model: `${model}.retryPolicy.kind`,
+                name: '"retryPolicy"',
+                placeholder: 'Default',
+                options: '[\
+                                {value: "ExponentialBackoff", label: 
"Exponential backoff"},\
+                                {value: "BoundedExponentialBackoff", label: 
"Bounded exponential backoff"},\
+                                {value: "UntilElapsed", label: "Until 
elapsed"},\
+                                {value: "NTimes", label: "Max number of 
times"},\
+                                {value: "OneTime", label: "Only once"},\
+                                {value: "Forever", label: "Always allow 
retry"},\
+                                {value: "Custom", label: "Custom"},\
+                                {value: null, label: "Default"}\
+                            ]',
+                tip: 'Available retry policies:\
+                            <ul>\
+                                <li>Exponential backoff - retries a set number 
of times with increasing sleep time between retries</li>\
+                                <li>Bounded exponential backoff - retries a 
set number of times with an increasing (up to a maximum bound) sleep time 
between retries</li>\
+                                <li>Until elapsed - retries until a given 
amount of time elapses</li>\
+                                <li>Max number of times - retries a max number 
of times</li>\
+                                <li>Only once - retries only once</li>\
+                                <li>Always allow retry - retries 
infinitely</li>\
+                                <li>Custom - custom retry policy 
implementation</li>\
+                                <li>Default - exponential backoff retry policy 
with configured base sleep time equal to 1000ms and max retry count equal to 
10</li>\
+                            </ul>'
+            })
 
         .pc-form-grid__break
 
@@ -69,16 +85,31 @@ mixin discovery-zookeeper(modelAt = '$ctrl.clonedCluster')
         .pc-form-grid-col-30
             -var model = `${modelAt}.discovery.ZooKeeper`
 
-            +text('Base path:', `${model}.basePath`, '"basePath"', 'false', 
'/services', 'Base path for service registration')
+            +form-field__text({
+                label: 'Base path:',
+                model: `${model}.basePath`,
+                name: '"basePath"',
+                placeholder: '/services',
+                tip: 'Base path for service registration'
+            })
         .pc-form-grid-col-30
-            +text('Service name:', `${model}.serviceName`, '"serviceName"', 
'false', 'ignite',
-                'Service name to use, as defined by Curator&#39;s 
ServiceDiscovery recipe<br/>\
-                In physical ZooKeeper terms, it represents the node under 
basePath, under which services will be registered')
+            +form-field__text({
+                label:'Service name:',
+                model: `${model}.serviceName`,
+                name: '"serviceName"',
+                placeholder: 'ignite',
+                tip: 'Service name to use, as defined by Curator&#39;s 
ServiceDiscovery recipe<br/>\
+                      In physical ZooKeeper terms, it represents the node 
under basePath, under which services will be registered'
+            })
 
         .pc-form-grid__break
 
         .pc-form-grid-col-60
-            +checkbox('Allow duplicate registrations', 
`${model}.allowDuplicateRegistrations`, '"allowDuplicateRegistrations"',
-                'Whether to register each node only once, or if duplicate 
registrations are allowed<br/>\
-                Nodes will attempt to register themselves, plus those they 
know about<br/>\
-                By default, duplicate registrations are not allowed, but you 
might want to set this property to <b>true</b> if you have multiple network 
interfaces or if you are facing troubles')
+            +form-field__checkbox({
+                label: 'Allow duplicate registrations',
+                model: `${model}.allowDuplicateRegistrations`,
+                name: '"allowDuplicateRegistrations"',
+                tip: 'Whether to register each node only once, or if duplicate 
registrations are allowed<br/>\
+                     Nodes will attempt to register themselves, plus those 
they know about<br/>\
+                     By default, duplicate registrations are not allowed, but 
you might want to set this property to <b>true</b> if you have multiple network 
interfaces or if you are facing troubles'
+            })

http://git-wip-us.apache.org/repos/asf/ignite/blob/cca10d0c/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/bounded-exponential-backoff.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/bounded-exponential-backoff.pug
 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/bounded-exponential-backoff.pug
index 0ddc1e9..84f7f2d 100644
--- 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/bounded-exponential-backoff.pug
+++ 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/bounded-exponential-backoff.pug
@@ -19,8 +19,30 @@ include /app/helpers/jade/mixins
 -var model = 
`${modelAt}.discovery.ZooKeeper.retryPolicy.BoundedExponentialBackoff`
 
 .pc-form-grid-col-20(ng-if-start=`${modelRetryPolicyKind} === 
'BoundedExponentialBackoff'`)
-    +number('Base interval:', `${model}.baseSleepTimeMs`, 
'"beBaseSleepTimeMs"', 'true', '1000', '0', 'Initial amount of time in ms to 
wait between retries')
+    +form-field__number({
+        label: 'Base interval:',
+        model: `${model}.baseSleepTimeMs`,
+        name: '"beBaseSleepTimeMs"',
+        placeholder: '1000',
+        min: '0',
+        tip: 'Initial amount of time in ms to wait between retries'
+    })
 .pc-form-grid-col-20
-    +number('Max interval:', `${model}.maxSleepTimeMs`, '"beMaxSleepTimeMs"', 
'true', 'Integer.MAX_VALUE', '0', 'Max time in ms to sleep on each retry')
+    +form-field__number({
+        label: 'Max interval:',
+        model: `${model}.maxSleepTimeMs`,
+        name: '"beMaxSleepTimeMs"',
+        placeholder: 'Integer.MAX_VALUE',
+        min: '0',
+        tip: 'Max time in ms to sleep on each retry'
+    })
 .pc-form-grid-col-20(ng-if-end)
-    +number-min-max('Max retries:', `${model}.maxRetries`, '"beMaxRetries"', 
'true', '10', '0', '29', 'Max number of times to retry')
+    +form-field__number({
+        label: 'Max retries:',
+        model: `${model}.maxRetries`,
+        name: '"beMaxRetries"',
+        placeholder: '10',
+        min: '0',
+        max: '29',
+        tip: 'Max number of times to retry'
+    })

http://git-wip-us.apache.org/repos/asf/ignite/blob/cca10d0c/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/custom.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/custom.pug
 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/custom.pug
index 6a1bcfb..1cac6b8 100644
--- 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/custom.pug
+++ 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/custom.pug
@@ -21,5 +21,12 @@ include /app/helpers/jade/mixins
 -var required = `${modelAt}.discovery.kind === "ZooKeeper" && 
${modelAt}.discovery.ZooKeeper.retryPolicy.kind === "Custom"`
 
 .pc-form-grid-col-60(ng-if-start=`${modelRetryPolicyKind} === 'Custom'`)
-    +java-class('Class name:', `${retry}.className`, '"customClassName"', 
'true', required, 'Custom retry policy implementation class name', required)
-.pc-form-grid__break(ng-if-end)
\ No newline at end of file
+    +form-field__java-class({
+        label: 'Class name:',
+        model: `${retry}.className`,
+        name: '"customClassName"',
+        required: required,
+        tip: 'Custom retry policy implementation class name',
+        validationActive: required
+    })
+.pc-form-grid__break(ng-if-end)

http://git-wip-us.apache.org/repos/asf/ignite/blob/cca10d0c/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/exponential-backoff.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/exponential-backoff.pug
 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/exponential-backoff.pug
index bfc3c02..ed0b5ff 100644
--- 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/exponential-backoff.pug
+++ 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/exponential-backoff.pug
@@ -19,8 +19,30 @@ include /app/helpers/jade/mixins
 -var model = `${modelAt}.discovery.ZooKeeper.retryPolicy.ExponentialBackoff`
 
 .pc-form-grid-col-20(ng-if-start=`${modelRetryPolicyKind} === 
'ExponentialBackoff'`)
-    +number('Base interval:', `${model}.baseSleepTimeMs`, 
'"expBaseSleepTimeMs"', 'true', '1000', '0', 'Initial amount of time in ms to 
wait between retries')
+    +form-field__number({
+        label: 'Base interval:',
+        model: `${model}.baseSleepTimeMs`,
+        name: '"expBaseSleepTimeMs"',
+        placeholder: '1000',
+        min: '0',
+        tip: 'Initial amount of time in ms to wait between retries'
+    })
 .pc-form-grid-col-20
-    +number-min-max('Max retries:', `${model}.maxRetries`, '"expMaxRetries"', 
'true', '10', '0', '29', 'Max number of times to retry')
+    +form-field__number({
+        label: 'Max retries:',
+        model: `${model}.maxRetries`,
+        name: '"expMaxRetries"',
+        placeholder: '10',
+        min: '0',
+        max: '29',
+        tip: 'Max number of times to retry'
+    })
 .pc-form-grid-col-20(ng-if-end)
-    +number('Max interval:', `${model}.maxSleepMs`, '"expMaxSleepMs"', 'true', 
'Integer.MAX_VALUE', '0', 'Max time in ms to sleep on each retry')
+    +form-field__number({
+        label: 'Max interval:',
+        model: `${model}.maxSleepMs`,
+        name: '"expMaxSleepMs"',
+        placeholder: 'Integer.MAX_VALUE',
+        min: '0',
+        tip: 'Max time in ms to sleep on each retry'
+    })

http://git-wip-us.apache.org/repos/asf/ignite/blob/cca10d0c/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/forever.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/forever.pug
 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/forever.pug
index 575106b..e61a3c6 100644
--- 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/forever.pug
+++ 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/forever.pug
@@ -19,5 +19,12 @@ include /app/helpers/jade/mixins
 -var model = `${modelAt}.discovery.ZooKeeper.retryPolicy.Forever`
 
 .pc-form-grid-col-30(ng-if-start=`${modelRetryPolicyKind} === 'Forever'`)
-    +number('Interval:', `${model}.retryIntervalMs`, '"feRetryIntervalMs"', 
'true', '1000', '0', 'Time in ms between retry attempts')
+    +form-field__number({
+        label: 'Interval:',
+        model: `${model}.retryIntervalMs`,
+        name: '"feRetryIntervalMs"',
+        placeholder: '1000',
+        min: '0',
+        tip: 'Time in ms between retry attempts'
+    })
 .pc-form-grid__break(ng-if-end)

http://git-wip-us.apache.org/repos/asf/ignite/blob/cca10d0c/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/n-times.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/n-times.pug
 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/n-times.pug
index dbb54e5..e44d030 100644
--- 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/n-times.pug
+++ 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/n-times.pug
@@ -19,6 +19,20 @@ include /app/helpers/jade/mixins
 -var model = `${modelAt}.discovery.ZooKeeper.retryPolicy.NTimes`
 
 .pc-form-grid-col-30(ng-if-start=`${modelRetryPolicyKind} === 'NTimes'`)
-    +number('Retries:', `${model}.n`, '"n"', 'true', '10', '0', 'Number of 
times to retry')
+    +form-field__number({
+        label: 'Retries:',
+        model: `${model}.n`,
+        name: '"n"',
+        placeholder: '10',
+        min: '0',
+        tip: 'Number of times to retry'
+    })
 .pc-form-grid-col-30(ng-if-end)
-    +number('Interval:', `${model}.sleepMsBetweenRetries`, 
'"ntSleepMsBetweenRetries"', 'true', '1000', '0', 'Time in ms between retry 
attempts')
+    +form-field__number({
+        label: 'Interval:',
+        model: `${model}.sleepMsBetweenRetries`,
+        name: '"ntSleepMsBetweenRetries"',
+        placeholder: '1000',
+        min: '0',
+        tip: 'Time in ms between retry attempts'
+    })

http://git-wip-us.apache.org/repos/asf/ignite/blob/cca10d0c/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/one-time.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/one-time.pug
 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/one-time.pug
index 4ff1644..4d86f5c 100644
--- 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/one-time.pug
+++ 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/one-time.pug
@@ -19,5 +19,12 @@ include /app/helpers/jade/mixins
 -var model = `${modelAt}.discovery.ZooKeeper.retryPolicy.OneTime`
 
 .pc-form-grid-col-30(ng-if-start=`${modelRetryPolicyKind} === 'OneTime'`)
-    +number('Interval:', `${model}.sleepMsBetweenRetry`, 
'"oneSleepMsBetweenRetry"', 'true', '1000', '0', 'Time in ms to retry attempt')
-.pc-form-grid__break(ng-if-end)
\ No newline at end of file
+    +form-field__number({
+        label: 'Interval:',
+        model: `${model}.sleepMsBetweenRetry`,
+        name: '"oneSleepMsBetweenRetry"',
+        placeholder: '1000',
+        min: '0',
+        tip: 'Time in ms to retry attempt'
+    })
+.pc-form-grid__break(ng-if-end)

http://git-wip-us.apache.org/repos/asf/ignite/blob/cca10d0c/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/until-elapsed.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/until-elapsed.pug
 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/until-elapsed.pug
index ebde01c..acb1dff 100644
--- 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/until-elapsed.pug
+++ 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/zookeeper/retrypolicy/until-elapsed.pug
@@ -19,6 +19,20 @@ include /app/helpers/jade/mixins
 -var model = `${modelAt}.discovery.ZooKeeper.retryPolicy.UntilElapsed`
 
 .pc-form-grid-col-30(ng-if-start=`${modelRetryPolicyKind} === 'UntilElapsed'`)
-    +number('Total time:', `${model}.maxElapsedTimeMs`, 
'"ueMaxElapsedTimeMs"', 'true', '60000', '0', 'Total time in ms for execution 
of retry attempt')
+    +form-field__number({
+        label: 'Total time:',
+        model: `${model}.maxElapsedTimeMs`,
+        name: '"ueMaxElapsedTimeMs"',
+        placeholder: '60000',
+        min: '0',
+        tip: 'Total time in ms for execution of retry attempt'
+    })
 .pc-form-grid-col-30(ng-if-end)
-    +number('Interval:', `${model}.sleepMsBetweenRetries`, 
'"ueSleepMsBetweenRetries"', 'true', '1000', '0', 'Time in ms between retry 
attempts')
+    +form-field__number({
+        label: 'Interval:',
+        model: `${model}.sleepMsBetweenRetries`,
+        name: '"ueSleepMsBetweenRetries"',
+        placeholder: '1000',
+        min: '0',
+        tip: 'Time in ms between retry attempts'
+    })

http://git-wip-us.apache.org/repos/asf/ignite/blob/cca10d0c/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/hadoop.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/hadoop.pug
 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/hadoop.pug
index 16a072c..082f7bd 100644
--- 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/hadoop.pug
+++ 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/hadoop.pug
@@ -25,51 +25,110 @@ include /app/helpers/jade/mixins
 -var libs = model + '.nativeLibraryNames'
 
 panel-collapsible(ng-form=form on-open=`ui.loadPanel('${form}')`)
-    -var uniqueTip = 'Such native library already exists!'
-
     panel-title Hadoop configuration
     panel-description Hadoop Accelerator configuration.
     panel-content.pca-form-row(ng-if=`ui.isPanelLoaded('${form}')`)
         .pca-form-column-6.pc-form-grid-row
             .pc-form-grid-col-60
-                +dropdown('Map reduce planner:', plannerModel + '.kind', 
'"MapReducePlanner"', 'true', 'Default', '[\
-                    {value: "Weighted", label: "Weighted"},\
-                    {value: "Custom", label: "Custom"},\
-                    {value: null, label: "Default"}\
-                ]', 'Implementation of map reduce planner\
-                <ul>\
-                    <li>Weighted - Planner which assigns mappers and reducers 
based on their "weights"</li>\
-                    <li>Custom - Custom planner implementation</li>\
-                    <li>Default - Default planner implementation</li>\
-                </ul>')
+                +form-field__dropdown({
+                    label: 'Map reduce planner:',
+                    model: `${plannerModel}.kind`,
+                    name: '"MapReducePlanner"',
+                    placeholder: 'Default',
+                    options: '[\
+                        {value: "Weighted", label: "Weighted"},\
+                        {value: "Custom", label: "Custom"},\
+                        {value: null, label: "Default"}\
+                    ]',
+                    tip: 'Implementation of map reduce planner\
+                        <ul>\
+                            <li>Weighted - Planner which assigns mappers and 
reducers based on their "weights"</li>\
+                            <li>Custom - Custom planner implementation</li>\
+                            <li>Default - Default planner implementation</li>\
+                        </ul>'
+                })
             .pc-form-group.pc-form-grid-row(ng-show=weightedPlanner)
                 .pc-form-grid-col-20
-                    +number('Local mapper weight:', weightedModel + 
'.localMapperWeight', '"LocalMapperWeight"', 'true', 100, '0',
-                        'This weight is added to a node when a mapper is 
assigned and it is input split data is located on this node')
+                    +form-field__number({
+                        label: 'Local mapper weight:',
+                        model: `${weightedModel}.localMapperWeight`,
+                        name: '"LocalMapperWeight"',
+                        placeholder: '100',
+                        min: '0',
+                        tip: 'This weight is added to a node when a mapper is 
assigned and it is input split data is located on this node'
+                    })
                 .pc-form-grid-col-20
-                    +number('Remote mapper weight:', weightedModel + 
'.remoteMapperWeight', '"remoteMapperWeight"', 'true', 100, '0',
-                        'This weight is added to a node when a mapper is 
assigned, but it is input split data is not located on this node')
+                    +form-field__number({
+                        label: 'Remote mapper weight:',
+                        model: `${weightedModel}.remoteMapperWeight`,
+                        name: '"remoteMapperWeight"',
+                        placeholder: '100',
+                        min: '0',
+                        tip: 'This weight is added to a node when a mapper is 
assigned, but it is input split data is not located on this node'
+                    })
                 .pc-form-grid-col-20
-                    +number('Local reducer weight:', weightedModel + 
'.localReducerWeight', '"localReducerWeight"', 'true', 100, '0',
-                        'This weight is added to a node when a reducer is 
assigned and the node have at least one assigned mapper')
+                    +form-field__number({
+                        label: 'Local reducer weight:',
+                        model: `${weightedModel}.localReducerWeight`,
+                        name: '"localReducerWeight"',
+                        placeholder: '100',
+                        min: '0',
+                        tip: 'This weight is added to a node when a reducer is 
assigned and the node have at least one assigned mapper'
+                    })
                 .pc-form-grid-col-30
-                    +number('Remote reducer weight:', weightedModel + 
'.remoteReducerWeight', '"remoteReducerWeight"', 'true', 100, '0',
-                        'This weight is added to a node when a reducer is 
assigned, but the node does not have any assigned mappers')
+                    +form-field__number({
+                        label: 'Remote reducer weight:',
+                        model: `${weightedModel}.remoteReducerWeight`,
+                        name: '"remoteReducerWeight"',
+                        placeholder: '100',
+                        min: '0',
+                        tip: 'This weight is added to a node when a reducer is 
assigned, but the node does not have any assigned mappers'
+                    })
                 .pc-form-grid-col-30
-                    +number('Local mapper weight:', weightedModel + 
'.preferLocalReducerThresholdWeight', '"preferLocalReducerThresholdWeight"', 
'true', 200, '0',
-                        "When threshold is reached, a node with mappers is no 
longer considered as preferred for further reducer assignments")
+                    +form-field__number({
+                        label: 'Local mapper weight:',
+                        model: 
`${weightedModel}.preferLocalReducerThresholdWeight`,
+                        name: '"preferLocalReducerThresholdWeight"',
+                        placeholder: '200',
+                        min: '0',
+                        tip: 'When threshold is reached, a node with mappers 
is no longer considered as preferred for further reducer assignments'
+                    })
             .pc-form-group.pc-form-grid-row(ng-show=customPlanner)
                 .pc-form-grid-col-60
-                    +java-class('Class name:', plannerModel + 
'.Custom.className', '"MapReducePlannerCustomClass"', 'true', customPlanner,
-                        'Custom planner implementation')
+                    +form-field__java-class({
+                        label: 'Class name:',
+                        model: `${plannerModel}.Custom.className`,
+                        name: '"MapReducePlannerCustomClass"',
+                        required: customPlanner,
+                        tip: 'Custom planner implementation'
+                    })
             .pc-form-grid-col-30
-                +number('Finished job info TTL:', model + 
'.finishedJobInfoTtl', '"finishedJobInfoTtl"', 'true', '30000', '0',
-                    'Finished job info time-to-live in milliseconds')
+                +form-field__number({
+                    label: 'Finished job info TTL:',
+                    model: `${model}.finishedJobInfoTtl`,
+                    name: '"finishedJobInfoTtl"',
+                    placeholder: '30000',
+                    min: '0',
+                    tip: 'Finished job info time-to-live in milliseconds'
+                })
             .pc-form-grid-col-30
-                +number('Max parallel tasks:', model + '.maxParallelTasks', 
'"maxParallelTasks"', 'true', 'availableProcessors * 2', '1',
-                    'Max number of local tasks that may be executed in 
parallel')
+                +form-field__number({
+                    label: 'Max parallel tasks:',
+                    model: `${model}.maxParallelTasks`,
+                    name: '"maxParallelTasks"',
+                    placeholder: 'availableProcessors * 2',
+                    min: '1',
+                    tip: 'Max number of local tasks that may be executed in 
parallel'
+                })
             .pc-form-grid-col-30
-                +number('Max task queue size:', model + '.maxTaskQueueSize', 
'"maxTaskQueueSize"', 'true', '8192', '1', 'Max task queue size')
+                +form-field__number({
+                    label: 'Max task queue size:',
+                    model: `${model}.maxTaskQueueSize`,
+                    name: '"maxTaskQueueSize"',
+                    placeholder: '8192',
+                    min: '1',
+                    tip: 'Max task queue size'
+                })
             .pc-form-grid-col-60
                 .ignite-form-field
                     +list-text-field({
@@ -81,7 +140,7 @@ panel-collapsible(ng-form=form 
on-open=`ui.loadPanel('${form}')`)
                     })(
                         list-editable-cols=`::[{name: 'Native libraries:'}]`
                     )
-                        +unique-feedback(_, `${uniqueTip}`)
+                        +form-field__error({ error: 'igniteUnique', message: 
'Such native library already exists!' })
 
         .pca-form-column-6
             +preview-xml-java(model, 'clusterHadoop')

http://git-wip-us.apache.org/repos/asf/ignite/blob/cca10d0c/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/load-balancing.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/load-balancing.pug
 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/load-balancing.pug
index 390952c..e96b016 100644
--- 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/load-balancing.pug
+++ 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/load-balancing.pug
@@ -25,7 +25,7 @@ include /app/helpers/jade/mixins
 panel-collapsible(ng-form=form on-open=`ui.loadPanel('${form}')`)
     panel-title Load balancing configuration
     panel-description
-        | Load balancing component balances job distribution among cluster 
nodes. 
+        | Load balancing component balances job distribution among cluster 
nodes.
         | 
#[a.link-success(href="https://apacheignite.readme.io/docs/load-balancing"; 
target="_blank") More info]
     panel-content.pca-form-row(ng-if=`ui.isPanelLoaded('${form}')`)
         .pca-form-column-6
@@ -59,50 +59,115 @@ panel-collapsible(ng-form=form 
on-open=`ui.loadPanel('${form}')`)
                                     ignite-unique=`${loadBalancingSpi}`
                                     ignite-unique-property='kind'
                                 )
-                                    +unique-feedback('"loadBalancingKind"', 
'Load balancing SPI of that type is already configured')
+                                    +form-field__error({ error: 
'igniteUnique', message: 'Load balancing SPI of that type is already 
configured' })
                             .settings-row(ng-show='$item.kind === 
"RoundRobin"')
-                                +checkbox('Per task', 
'$item.RoundRobin.perTask', '"loadBalancingRRPerTask"', 'A new round robin 
order should be created for every task flag')
+                                +form-field__checkbox({
+                                    label: 'Per task',
+                                    model: '$item.RoundRobin.perTask',
+                                    name: '"loadBalancingRRPerTask"',
+                                    tip: 'A new round robin order should be 
created for every task flag'
+                                })
                             .settings-row(ng-show='$item.kind === "Adaptive"')
-                                +dropdown('Load probe:', 
'$item.Adaptive.loadProbe.kind', '"loadBalancingAdaptiveLoadProbeKind"', 
'true', 'Default', '[\
+                                +form-field__dropdown({
+                                    label: 'Load probe:',
+                                    model: '$item.Adaptive.loadProbe.kind',
+                                    name: 
'"loadBalancingAdaptiveLoadProbeKind"',
+                                    placeholder: 'Default',
+                                    options: '[\
                                         {value: "Job", label: "Job count"},\
                                         {value: "CPU", label: "CPU load"},\
                                         {value: "ProcessingTime", label: 
"Processing time"},\
                                         {value: "Custom", label: "Custom"},\
                                         {value: null, label: "Default"}\
-                                    ]', 'Implementation of node load probing\
-                                    <ul>\
-                                        <li>Job count - Based on active and 
waiting job count</li>\
-                                        <li>CPU load - Based on CPU load</li>\
-                                        <li>Processing time - Based on total 
job processing time</li>\
-                                        <li>Custom - Custom load probing 
implementation</li>\
-                                        <li>Default - Default load probing 
implementation</li>\
-                                    </ul>')
+                                    ]',
+                                    tip: 'Implementation of node load probing\
+                                        <ul>\
+                                            <li>Job count - Based on active 
and waiting job count</li>\
+                                            <li>CPU load - Based on CPU 
load</li>\
+                                            <li>Processing time - Based on 
total job processing time</li>\
+                                            <li>Custom - Custom load probing 
implementation</li>\
+                                            <li>Default - Default load probing 
implementation</li>\
+                                        </ul>'
+                                })
                             .settings-row(ng-show='$item.kind === "Adaptive" 
&& $item.Adaptive.loadProbe.kind')
                                 
.panel-details(ng-show='$item.Adaptive.loadProbe.kind === "Job"')
                                     .details-row
-                                        +checkbox('Use average', 
'$item.Adaptive.loadProbe.Job.useAverage', 
'"loadBalancingAdaptiveJobUseAverage"', 'Use average CPU load vs. current')
+                                        +form-field__checkbox({
+                                            label: 'Use average',
+                                            model: 
'$item.Adaptive.loadProbe.Job.useAverage',
+                                            name: 
'"loadBalancingAdaptiveJobUseAverage"',
+                                            tip: 'Use average CPU load vs. 
current'
+                                        })
                                 
.panel-details(ng-show='$item.Adaptive.loadProbe.kind === "CPU"')
                                     .details-row
-                                        +checkbox('Use average', 
'$item.Adaptive.loadProbe.CPU.useAverage', 
'"loadBalancingAdaptiveCPUUseAverage"', 'Use average CPU load vs. current')
+                                        +form-field__checkbox({
+                                            label: 'Use average',
+                                            model: 
'$item.Adaptive.loadProbe.CPU.useAverage',
+                                            name: 
'"loadBalancingAdaptiveCPUUseAverage"',
+                                            tip: 'Use average CPU load vs. 
current'
+                                        })
                                     .details-row
-                                        +checkbox('Use processors', 
'$item.Adaptive.loadProbe.CPU.useProcessors', 
'"loadBalancingAdaptiveCPUUseProcessors"', "divide each node's CPU load by the 
number of processors on that node")
+                                        +form-field__checkbox({
+                                            label: 'Use processors',
+                                            model: 
'$item.Adaptive.loadProbe.CPU.useProcessors',
+                                            name: 
'"loadBalancingAdaptiveCPUUseProcessors"',
+                                            tip: 'Divide each node\'s CPU load 
by the number of processors on that node'
+                                        })
                                     .details-row
-                                        +number-min-max-step('Processor 
coefficient:', '$item.Adaptive.loadProbe.CPU.processorCoefficient',
-                                            
'"loadBalancingAdaptiveCPUProcessorCoefficient"', 'true', '1', '0.001', '1', 
'0.05', 'Coefficient of every CPU')
+                                        +form-field__number({
+                                            label: 'Processor coefficient:',
+                                            model: 
'$item.Adaptive.loadProbe.CPU.processorCoefficient',
+                                            name: 
'"loadBalancingAdaptiveCPUProcessorCoefficient"',
+                                            placeholder: '1',
+                                            min: '0.001',
+                                            max: '1',
+                                            step: '0.05',
+                                            tip: 'Coefficient of every CPU'
+                                        })
                                 
.panel-details(ng-show='$item.Adaptive.loadProbe.kind === "ProcessingTime"')
                                     .details-row
-                                        +checkbox('Use average', 
'$item.Adaptive.loadProbe.ProcessingTime.useAverage', 
'"loadBalancingAdaptiveJobUseAverage"', 'Use average execution time vs. 
current')
+                                        +form-field__checkbox({
+                                            label: 'Use average',
+                                            model: 
'$item.Adaptive.loadProbe.ProcessingTime.useAverage',
+                                            name: 
'"loadBalancingAdaptiveJobUseAverage"',
+                                            tip: 'Use average execution time 
vs. current'
+                                        })
                                 .panel-details(ng-show=loadProbeCustom)
                                     .details-row
-                                        +java-class('Load brobe 
implementation:', '$item.Adaptive.loadProbe.Custom.className', 
'"loadBalancingAdaptiveJobUseClass"', 'true', loadProbeCustom,
-                                            'Custom load balancing SPI 
implementation class name.', loadProbeCustom)
+                                        +form-field__java-class({
+                                            label: 'Load brobe 
implementation:',
+                                            model: 
'$item.Adaptive.loadProbe.Custom.className',
+                                            name: 
'"loadBalancingAdaptiveJobUseClass"',
+                                            required: loadProbeCustom,
+                                            tip: 'Custom load balancing SPI 
implementation class name.',
+                                            validationActive: loadProbeCustom
+                                        })
+
                             .settings-row(ng-show='$item.kind === 
"WeightedRandom"')
-                                +number('Node weight:', 
'$item.WeightedRandom.nodeWeight', '"loadBalancingWRNodeWeight"', 'true', 10, 
'1', 'Weight of node')
+                                +form-field__number({
+                                    label: 'Node weight:',
+                                    model: '$item.WeightedRandom.nodeWeight',
+                                    name: '"loadBalancingWRNodeWeight"',
+                                    placeholder: '10',
+                                    min: '1',
+                                    tip: 'Weight of node'
+                                })
                             .settings-row(ng-show='$item.kind === 
"WeightedRandom"')
-                                +checkbox('Use weights', 
'$item.WeightedRandom.useWeights', '"loadBalancingWRUseWeights"', 'Node weights 
should be checked when doing random load balancing')
+                                +form-field__checkbox({
+                                    label: 'Use weights',
+                                    model: '$item.WeightedRandom.useWeights',
+                                    name: '"loadBalancingWRUseWeights"',
+                                    tip: 'Node weights should be checked when 
doing random load balancing'
+                                })
                             .settings-row(ng-show=loadBalancingCustom)
-                                +java-class('Load balancing SPI 
implementation:', '$item.Custom.className', '"loadBalancingClass"', 'true', 
loadBalancingCustom,
-                                    'Custom load balancing SPI implementation 
class name.', loadBalancingCustom)
+                                +form-field__java-class({
+                                    label: 'Load balancing SPI 
implementation:',
+                                    model: '$item.Custom.className',
+                                    name: '"loadBalancingClass"',
+                                    required: loadBalancingCustom,
+                                    tip: 'Custom load balancing SPI 
implementation class name.',
+                                    validationActive: loadBalancingCustom
+                                })
 
                         list-editable-no-items
                             list-editable-add-item-button(

http://git-wip-us.apache.org/repos/asf/ignite/blob/cca10d0c/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/logger.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/logger.pug
 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/logger.pug
index 7b4b9aa..c30448c 100644
--- 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/logger.pug
+++ 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/logger.pug
@@ -26,8 +26,12 @@ panel-collapsible(ng-form=form 
on-open=`ui.loadPanel('${form}')`)
     panel-content.pca-form-row(ng-if=`ui.isPanelLoaded('${form}')`)
         .pca-form-column-6.pc-form-grid-row
             .pc-form-grid-col-60
-                +dropdown('Logger:', kind, '"logger"', 'true', 'Default',
-                    '[\
+                +form-field__dropdown({
+                    label: 'Logger:',
+                    model: kind,
+                    name: '"logger"',
+                    placeholder: 'Default',
+                    options: '[\
                         {value: "Log4j", label: "Apache Log4j"},\
                         {value: "Log4j2", label: "Apache Log4j 2"},\
                         {value: "SLF4J", label: "Simple Logging Facade 
(SLF4J)"},\
@@ -37,17 +41,18 @@ panel-collapsible(ng-form=form 
on-open=`ui.loadPanel('${form}')`)
                         {value: "Custom", label: "Custom"},\
                         {value: null, label: "Default"}\
                     ]',
-                    'Logger implementations\
-                    <ul>\
-                        <li>Apache Log4j - log4j-based logger</li>\
-                        <li>Apache Log4j 2 - Log4j2-based logger</li>\
-                        <li>Simple Logging Facade (SLF4J) - SLF4j-based 
logger</li>\
-                        <li>Java logger (JUL) - built in java logger</li>\
-                        <li>Jakarta Commons Logging (JCL) - wraps any JCL 
(Jakarta Commons Logging) loggers</li>\
-                        <li>Null logger - logger which does not output 
anything</li>\
-                        <li>Custom - custom logger implementation</li>\
-                        <li>Default - Apache Log4j if awailable on classpath 
or Java logger otherwise</li>\
-                    </ul>')
+                    tip: 'Logger implementations\
+                       <ul>\
+                           <li>Apache Log4j - log4j-based logger</li>\
+                           <li>Apache Log4j 2 - Log4j2-based logger</li>\
+                           <li>Simple Logging Facade (SLF4J) - SLF4j-based 
logger</li>\
+                           <li>Java logger (JUL) - built in java logger</li>\
+                           <li>Jakarta Commons Logging (JCL) - wraps any JCL 
(Jakarta Commons Logging) loggers</li>\
+                           <li>Null logger - logger which does not output 
anything</li>\
+                           <li>Custom - custom logger implementation</li>\
+                           <li>Default - Apache Log4j if awailable on 
classpath or Java logger otherwise</li>\
+                       </ul>'
+                })
             .pc-form-group(ng-show=`${kind} && (${kind} === 'Log4j2' || 
${kind} === 'Log4j' || ${kind} === 'Custom')`)
                 .pc-form-grid-row(ng-show=`${kind} === 'Log4j2'`)
                     include ./logger/log4j2

http://git-wip-us.apache.org/repos/asf/ignite/blob/cca10d0c/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/logger/custom.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/logger/custom.pug
 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/logger/custom.pug
index a717754..589a9c0 100644
--- 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/logger/custom.pug
+++ 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/logger/custom.pug
@@ -21,4 +21,11 @@ include /app/helpers/jade/mixins
 -var required = '$ctrl.clonedCluster.logger.kind === "Custom"'
 
 .pc-form-grid-col-60
-    +java-class('Class:', `${model}.class`, '"customLogger"', 'true', 
required, 'Logger implementation class name', required)
+    +form-field__java-class({
+        label: 'Class:',
+        model: `${model}.class`,
+        name: '"customLogger"',
+        required: required,
+        tip: 'Logger implementation class name',
+        validationActive: required
+    })

http://git-wip-us.apache.org/repos/asf/ignite/blob/cca10d0c/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/logger/log4j.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/logger/log4j.pug
 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/logger/log4j.pug
index a1cab60..1f216b7 100644
--- 
a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/logger/log4j.pug
+++ 
b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/logger/log4j.pug
@@ -21,29 +21,48 @@ include /app/helpers/jade/mixins
 -var pathRequired = model + '.mode === "Path" && 
$ctrl.clonedCluster.logger.kind === "Log4j"'
 
 .pc-form-grid-col-30
-    +dropdown('Level:', `${model}.level`, '"log4jLevel"', 'true', 'Default',
-        '[\
-            {value: "OFF", label: "OFF"},\
-            {value: "FATAL", label: "FATAL"},\
-            {value: "ERROR", label: "ERROR"},\
-            {value: "WARN", label: "WARN"},\
-            {value: "INFO", label: "INFO"},\
-            {value: "DEBUG", label: "DEBUG"},\
-            {value: "TRACE", label: "TRACE"},\
-            {value: "ALL", label: "ALL"},\
-            {value: null, label: "Default"}\
-        ]',
-        'Level for internal log4j implementation')
+    +form-field__dropdown({
+        label: 'Level:',
+        model: `${model}.level`,
+        name: '"log4jLevel"',
+        placeholder: 'Default',
+        options: '[\
+                    {value: "OFF", label: "OFF"},\
+                    {value: "FATAL", label: "FATAL"},\
+                    {value: "ERROR", label: "ERROR"},\
+                    {value: "WARN", label: "WARN"},\
+                    {value: "INFO", label: "INFO"},\
+                    {value: "DEBUG", label: "DEBUG"},\
+                    {value: "TRACE", label: "TRACE"},\
+                    {value: "ALL", label: "ALL"},\
+                    {value: null, label: "Default"}\
+                ]',
+        tip: 'Level for internal log4j implementation'
+    })
+
 .pc-form-grid-col-30
-    +dropdown-required('Logger configuration:', `${model}.mode`, 
'"log4jMode"', 'true', 'true', 'Choose logger mode',
-        '[\
-            {value: "Default", label: "Default"},\
-            {value: "Path", label: "Path"}\
-        ]',
-        'Choose logger configuration\
-        <ul>\
-            <li>Default - default logger</li>\
-            <li>Path - path or URI to XML configuration</li>\
-        </ul>')
+    +form-field__dropdown({
+        label: 'Logger configuration:',
+        model: `${model}.mode`,
+        name: '"log4jMode"',
+        required: 'true',
+        placeholder: 'Choose logger mode',
+        options: '[\
+                    {value: "Default", label: "Default"},\
+                    {value: "Path", label: "Path"}\
+                ]',
+        tip: 'Choose logger configuration\
+                <ul>\
+                    <li>Default - default logger</li>\
+                    <li>Path - path or URI to XML configuration</li>\
+                </ul>'
+    })
 .pc-form-grid-col-60(ng-show=pathRequired)
-    +text('Path:', `${model}.path`, '"log4jPath"', pathRequired, 'Input path', 
'Path or URI to XML configuration')
+    +form-field__text({
+        label: 'Path:',
+        model: `${model}.path`,
+        name: '"log4jPath"',
+        required: pathRequired,
+        placeholder: 'Input path',
+        tip: 'Path or URI to XML configuration'
+    })

Reply via email to