http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint.jade
new file mode 100644
index 0000000..d2552a8
--- /dev/null
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint.jade
@@ -0,0 +1,85 @@
+//-
+    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.
+
+include ../../../../../app/helpers/jade/mixins.jade
+
+-var form = 'checkpoint'
+-var model = 'backupItem.checkpointSpi'
+-var CustomCheckpoint = 'model.kind === "Custom"'
+
+.panel.panel-default(ng-form=form novalidate)
+    .panel-heading(bs-collapse-toggle ng-click='ui.loadPanel("#{form}")')
+        ignite-form-panel-chevron
+        label Checkpointing
+        ignite-form-field-tooltip.tipLabel
+            | Checkpointing provides an ability to save an intermediate job 
state#[br]
+            | #[a(href="http://apacheignite.gridgain.org/docs/checkpointing"; 
target="_blank") More info]
+        ignite-form-revert
+    .panel-collapse(role='tabpanel' bs-collapse-target id=form)
+        .panel-body(ng-if='ui.isPanelLoaded("#{form}")')
+            .col-sm-6
+                .settings-row(ng-init='checkpointSpiTbl={type: 
"checkpointSpi", model: "checkpointSpi", focusId: "kind", ui: 
"checkpoint-table"}')
+                    +ignite-form-group()
+                        ignite-form-field-label
+                            | Checkpoint SPI configurations
+                        ignite-form-group-tooltip
+                            | Checkpoint SPI configurations
+                        
ignite-form-group-add(ng-click='tableNewItem(checkpointSpiTbl)')
+                            | Add checkpoint SPI
+                        .group-content-empty(ng-if='!(#{model} && 
#{model}.length > 0)')
+                            | Not defined
+                        .group-content(ng-show='#{model} && #{model}.length > 
0' ng-repeat='model in #{model} track by $index')
+                            hr(ng-if='$index != 0')
+                            .settings-row
+                                +dropdown-required('Checkpoint SPI:', 
'model.kind', '"checkpointKind" + $index', 'true', 'true', 'Choose checkpoint 
configuration variant', '[\
+                                        {value: "FS", label: "File System"},\
+                                        {value: "Cache", label: "Cache"},\
+                                        {value: "S3", label: "Amazon S3"},\
+                                        {value: "JDBC", label: "Database"},\
+                                        {value: "Custom", label: "Custom"}\
+                                    ]',
+                                    'Provides an ability to save an 
intermediate job state\
+                                    <ul>\
+                                        <li>File System - Uses a shared file 
system to store checkpoints</li>\
+                                        <li>Cache - Uses a cache to store 
checkpoints</li>\
+                                        <li>Amazon S3 - Uses Amazon S3 to 
store checkpoints</li>\
+                                        <li>Database - Uses a database to 
store checkpoints</li>\
+                                        <li>Custom - Custom checkpoint SPI 
implementation</li>\
+                                    </ul>')
+                                    +table-remove-button(model, 'Remove 
Checkpoint SPI')
+
+                            div(ng-if='model.kind === "FS"')
+                                include ./checkpoint/fs.jade
+
+                            div(ng-if='model.kind === "Cache"')
+                                .settings-row
+                                    +dropdown-required-empty('Cache:', 
'model.Cache.cache', '"checkpointCacheCache"+ $index', 'true', 'true',
+                                        'Choose cache', 'No caches configured 
for current cluster', 'clusterCaches', 'Cache to use for storing checkpoints')
+                                .settings-row
+                                    +java-class('Listener:', 
'model.Cache.checkpointListener', '"checkpointCacheListener" + $index', 'true', 
'false',
+                                        'Checkpoint listener implementation 
class name')
+
+                            div(ng-show='model.kind === "S3"')
+                                include ./checkpoint/s3.jade
+
+                            div(ng-show='model.kind === "JDBC"')
+                                include ./checkpoint/jdbc.jade
+
+                            .settings-row(ng-show=CustomCheckpoint)
+                                +java-class('Class name:', 
'model.Custom.className', '"checkpointCustomClassName" + $index', 'true', 
CustomCheckpoint,
+                                'Custom CheckpointSpi implementation class')
+            .col-sm-6
+                +preview-xml-java('backupItem', 'clusterCheckpoint', 'caches')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/fs.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/fs.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/fs.jade
new file mode 100644
index 0000000..01f14f4
--- /dev/null
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/fs.jade
@@ -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.
+
+include ../../../../../../app/helpers/jade/mixins.jade
+
+-var form = 'checkpointFsPaths'
+-var dirPaths = 'model.FS.directoryPaths'
+
+.details-row
+    +ignite-form-group(ng-form=form ng-model=dirPaths)
+        -var uniqueTip = 'Such path already exists!'
+
+        ignite-form-field-label
+            | Paths
+        ignite-form-group-tooltip
+            | Paths to a shared directory where checkpoints will be stored
+        ignite-form-group-add(ng-click='(group.add = [{}])')
+            | Add new path
+
+        .group-content(ng-if='#{dirPaths}.length')
+            -var model = 'obj.model';
+            -var name = '"edit" + $index'
+            -var valid = form + '[' + name + '].$valid'
+            -var save = dirPaths + '[$index] = ' + model
+
+            div(ng-repeat='model in #{dirPaths} track by $index' ng-init='obj 
= {}')
+                label.col-xs-12.col-sm-12.col-md-12
+                    .indexField
+                        | {{ $index+1 }})
+                    +table-remove-conditional-button(dirPaths, 'true', 'Remove 
path')
+                    span(ng-hide='field.edit')
+                        a.labelFormField(ng-click='(field.edit = true) && 
(#{model} = model)') {{ model }}
+                    span(ng-if='field.edit')
+                        +table-text-field(name, model, dirPaths, valid, save, 
'Input directory path', false)
+                            +table-save-button(valid, save, false)
+                            +unique-feedback(name, uniqueTip)
+        .group-content(ng-repeat='field in group.add')
+            -var model = 'new';
+            -var name = '"new"'
+            -var valid = form + '[' + name + '].$valid'
+            -var save = dirPaths + '.push(' + model + ')'
+
+            div
+                label.col-xs-12.col-sm-12.col-md-12
+                    +table-text-field(name, model, dirPaths, valid, save, 
'Input directory path', true)
+                        +table-save-button(valid, save, true)
+                        +unique-feedback(name, uniqueTip)
+        .group-content-empty(ng-if='!(#{dirPaths}.length) && 
!group.add.length')
+            | Not defined
+
+.settings-row
+    +java-class('Listener:', 'model.FS.checkpointListener', 
'"checkpointFsListener" + $index', 'true', 'false',
+        'Checkpoint listener implementation class name')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/jdbc.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/jdbc.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/jdbc.jade
new file mode 100644
index 0000000..a7b217f
--- /dev/null
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/jdbc.jade
@@ -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.
+
+include ../../../../../../app/helpers/jade/mixins.jade
+
+.settings-row
+    +text('Data source bean name:', 'model.JDBC.dataSourceBean', 
'"checkpointJdbcDataSourceBean" + $index', 'model.kind === "JDBC"', 'Input bean 
name',
+    'Name of the data source bean in Spring context')
+.settings-row
+    +dialect('Dialect:', 'model.JDBC.dialect', '"checkpointJdbcDialect" + 
$index', 'model.kind === "JDBC"',
+    'Dialect of SQL implemented by a particular RDBMS:', 'Generic JDBC 
dialect', 'Choose JDBC dialect')
+.settings-row
+    +text('User:', 'model.JDBC.user', '"checkpointJdbcUser" + $index', 
'false', 'Input user name', 'Checkpoint jdbc user name')
+.settings-row
+    +text('Table name:', 'model.JDBC.checkpointTableName', 
'"checkpointJdbcCheckpointTableName" + $index', 'false', 'CHECKPOINTS', 
'Checkpoint table name')
+.settings-row
+    +text('Key field name:', 'model.JDBC.keyFieldName', 
'"checkpointJdbcKeyFieldName" + $index', 'false', 'NAME', 'Checkpoint key field 
name')
+.settings-row
+    +dropdown('Key field type:', 'model.JDBC.keyFieldType', 
'"checkpointJdbcKeyFieldType" + $index', 'true', 'VARCHAR', 
'supportedJdbcTypes', 'Checkpoint key field type')
+.settings-row
+    +text('Value field name:', 'model.JDBC.valueFieldName', 
'"checkpointJdbcValueFieldName" + $index', 'false', 'VALUE', 'Checkpoint value 
field name')
+.settings-row
+    +dropdown('Value field type:', 'model.JDBC.valueFieldType', 
'"checkpointJdbcValueFieldType" + $index', 'true', 'BLOB', 
'supportedJdbcTypes', 'Checkpoint value field type')
+.settings-row
+    +text('Expire date field name:', 'model.JDBC.expireDateFieldName', 
'"checkpointJdbcExpireDateFieldName" + $index', 'false', 'EXPIRE_DATE', 
'Checkpoint expire date field name')
+.settings-row
+    +dropdown('Expire date field type:', 'model.JDBC.expireDateFieldType', 
'"checkpointJdbcExpireDateFieldType"', 'true', 'DATETIME', 
'supportedJdbcTypes', 'Checkpoint expire date field type')
+.settings-row
+    +number('Number of retries:', 'model.JDBC.numberOfRetries', 
'"checkpointJdbcNumberOfRetries"', 'true', '2', '0', 'Number of retries in case 
of DB failure')
+.settings-row
+    +java-class('Listener:', 'model.JDBC.checkpointListener', 
'"checkpointJdbcListener" + $index', 'true', 'false',
+    'Checkpoint listener implementation class name')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/s3.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/s3.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/s3.jade
new file mode 100644
index 0000000..8373b03
--- /dev/null
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint/s3.jade
@@ -0,0 +1,174 @@
+//-
+    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.
+
+include ../../../../../../app/helpers/jade/mixins.jade
+
+-var credentialsModel = 'model.S3.awsCredentials'
+-var clientCfgModel = 'model.S3.clientConfiguration'
+-var checkpointS3Path = 'model.S3.awsCredentials.kind === "Properties"'
+-var checkpointS3Custom = 'model.S3.awsCredentials.kind === "Custom"'
+
+-var clientRetryModel = clientCfgModel + '.retryPolicy'
+-var checkpointS3DefaultMaxRetry = clientRetryModel + '.kind === 
"DefaultMaxRetries"'
+-var checkpointS3DynamoDbMaxRetry = clientRetryModel + '.kind === 
"DynamoDBMaxRetries"'
+-var checkpointS3CustomRetry = clientRetryModel + '.kind === "Custom"'
+
+.settings-row
+    +dropdown-required('AWS credentials:', 'model.S3.awsCredentials.kind', 
'"checkpointS3AwsCredentials"', 'true', 'model.kind === "S3"', 'Custom', '[\
+        {value: "Basic", label: "Basic"},\
+        {value: "Properties", label: "Properties"},\
+        {value: "Anonymous", label: "Anonymous"},\
+        {value: "BasicSession", label: "Basic with session"},\
+        {value: "Custom", label: "Custom"}\
+    ]',
+    'AWS credentials\
+    <ul>\
+        <li>Basic - Allows callers to pass in the AWS access key and secret 
access in the constructor</li>\
+        <li>Properties - Reads in AWS access keys from a properties file</li>\
+        <li>Anonymous - Allows use of "anonymous" credentials</li>\
+        <li>Database - Session credentials with keys and session token</li>\
+        <li>Custom - Custom AWS credentials provider</li>\
+    </ul>')
+.panel-details(ng-show=checkpointS3Path)
+    .details-row
+        +text('Path:', credentialsModel + '.Properties.path', 
'"checkpointS3PropertiesPath"', checkpointS3Path, 'Input properties file path',
+        'The file from which to read the AWS credentials properties')
+.panel-details(ng-show=checkpointS3Custom)
+    .details-row
+        +java-class('Class name:', credentialsModel + '.Custom.className', 
'"checkpointS3CustomClassName" + $index', 'true', checkpointS3Custom,
+        'Custom AWS credentials provider implementation class')
+.settings-row
+    +text('Bucket name suffix:', 'model.S3.bucketNameSuffix', 
'"checkpointS3BucketNameSuffix"', 'false', 'default-bucket', 'Bucket name 
suffix')
+.settings-row
+    +dropdown('Protocol:', clientCfgModel + '.protocol', 
'"checkpointS3Protocol"', 'true', 'HTTPS', '[\
+                                            {value: "HTTP", label: "HTTP"},\
+                                            {value: "HTTPS", label: "HTTPS"}\
+                                        ]',
+    'Provides an ability to save an intermediate job state\
+    <ul>\
+        <li>HTTP - Using the HTTP protocol is less secure than HTTPS, but can 
slightly reduce\
+            the system resources used when communicating with AWS</li>\
+        <li>HTTPS - Using the HTTPS protocol is more secure than using the 
HTTP protocol, but\
+            may use slightly more system resources. AWS recommends using HTTPS 
for maximize security</li>\
+    </ul>')
+.settings-row
+    +number('Maximum connections:', clientCfgModel + '.maxConnections', 
'"checkpointS3MaxConnections"',
+    'true', '50', '1', 'Maximum number of allowed open HTTP connections')
+.settings-row
+    +text('User agent:', clientCfgModel + '.userAgent', 
'"checkpointS3UserAgent"', 'false', 'System specific header',
+    'HTTP user agent header to send with all requests')
+.settings-row
+    +text-ip-address('Local address:', clientCfgModel + '.localAddress', 
'"checkpointS3LocalAddress"', 'true', 'Not specified',
+    'Optionally specifies the local address to bind to')
+.settings-row
+    +text('Proxy host:', clientCfgModel + '.proxyHost', 
'"checkpointS3ProxyHost"', 'false', 'Not specified',
+    'Optional proxy host the client will connect through')
+.settings-row
+    +number('Proxy port:', clientCfgModel + '.proxyPort', 
'"checkpointS3ProxyPort"', 'true', 'Not specified', '0',
+    'Optional proxy port the client will connect through')
+.settings-row
+    +text('Proxy user:', clientCfgModel + '.proxyUsername', 
'"checkpointS3ProxyUsername"', 'false', 'Not specified',
+    'Optional proxy user name to use if connecting through a proxy')
+.settings-row
+    +text('Proxy domain:', clientCfgModel + '.proxyDomain', 
'"checkpointS3ProxyDomain"', 'false', 'Not specified',
+    'Optional Windows domain name for configuring an NTLM proxy')
+.settings-row
+    +text('Proxy workstation:', clientCfgModel + '.proxyWorkstation', 
'"checkpointS3ProxyWorkstation"', 'false', 'Not specified',
+    'Optional Windows workstation name for configuring NTLM proxy support')
+.settings-row
+    +dropdown('Retry policy:', clientRetryModel + '.kind', 
'"checkpointS3RetryPolicy"', 'true', 'Default', '[\
+                                        {value: "Default", label: "Default SDK 
retry policy"},\
+                                        {value: "DefaultMaxRetries", label: 
"Default with the specified max retry count"},\
+                                        {value: "DynamoDB", label: "Default 
for DynamoDB client"},\
+                                        {value: "DynamoDBMaxRetries", label: 
"DynamoDB with the specified max retry count"},\
+                                        {value: "Custom", label: "Custom 
configured"}\
+                                    ]',
+    'Provides an ability to save an intermediate job state\
+    <ul>\
+        <li>SDK default retry policy - This policy will honor the 
maxErrorRetry set in ClientConfiguration</li>\
+        <li>Default with the specified max retry count - Default SDK retry 
policy with the specified max retry count</li>\
+        <li>Default for DynamoDB client - This policy will honor the 
maxErrorRetry set in ClientConfiguration</li>\
+        <li>DynamoDB with the specified max retry count - This policy will 
honor the maxErrorRetry set in ClientConfiguration with the specified max retry 
count</li>\
+        <li>Custom configured - Custom configured SDK retry policy</li>\
+    </ul>')
+.panel-details(ng-show=checkpointS3DefaultMaxRetry)
+    .details-row
+        +number-required('Maximum retry attempts:', clientRetryModel + 
'.DefaultMaxRetries.maxErrorRetry', '"checkpointS3DefaultMaxErrorRetry"', 
'true', checkpointS3DefaultMaxRetry, '-1', '1',
+        'Maximum number of retry attempts for failed requests')
+.panel-details(ng-show=checkpointS3DynamoDbMaxRetry)
+    .details-row
+        +number-required('Maximum retry attempts:', clientRetryModel + 
'.DynamoDBMaxRetries.maxErrorRetry', '"checkpointS3DynamoDBMaxErrorRetry"', 
'true', checkpointS3DynamoDbMaxRetry, '-1', '1',
+        'Maximum number of retry attempts for failed requests')
+.panel-details(ng-show=checkpointS3CustomRetry)
+    .details-row
+        +java-class('Retry condition:', clientRetryModel + 
'.Custom.retryCondition', '"checkpointS3CustomRetryPolicy" + $index', 'true', 
checkpointS3CustomRetry,
+        'Retry condition on whether a specific request and exception should be 
retried')
+    .details-row
+        +java-class('Backoff strategy:', clientRetryModel + 
'.Custom.backoffStrategy', '"checkpointS3CustomBackoffStrategy" + $index', 
'true', checkpointS3CustomRetry,
+        'Back-off strategy for controlling how long the next retry should 
wait')
+    .details-row
+        +number-required('Maximum retry attempts:', clientRetryModel + 
'.Custom.maxErrorRetry', '"checkpointS3CustomMaxErrorRetry"', 'true', 
checkpointS3CustomRetry, '-1', '1',
+        'Maximum number of retry attempts for failed requests')
+    .details-row
+        +checkbox('Honor the max error retry set', clientRetryModel + 
'.Custom.honorMaxErrorRetryInClientConfig', 
'"checkpointS3CustomHonorMaxErrorRetryInClientConfig"',
+        'Whether this retry policy should honor the max error retry set by 
ClientConfiguration#setMaxErrorRetry(int)')
+.settings-row
+    +number('Maximum retry attempts:', clientCfgModel + '.maxErrorRetry', 
'"checkpointS3MaxErrorRetry"', 'true', '-1', '0',
+    'Maximum number of retry attempts for failed retryable requests<br/>\
+    If -1 the configured RetryPolicy will be used to control the retry count')
+.settings-row
+    +number('Socket timeout:', clientCfgModel + '.socketTimeout', 
'"checkpointS3SocketTimeout"', 'true', '50000', '0',
+    'Amount of time in milliseconds to wait for data to be transfered over an 
established, open connection before the connection times out and is closed<br/>\
+    A value of <b>0</b> means infinity')
+.settings-row
+    +number('Connection timeout:', clientCfgModel + '.connectionTimeout', 
'"checkpointS3ConnectionTimeout"', 'true', '50000', '0',
+    'Amount of time in milliseconds to wait when initially establishing a 
connection before giving up and timing out<br/>\
+    A value of <b>0</b> means infinity')
+.settings-row
+    +number('Request timeout:', clientCfgModel + '.requestTimeout', 
'"checkpointS3RequestTimeout"', 'true', '0', '-1',
+    'Amount of time in milliseconds to wait for the request to complete before 
giving up and timing out<br/>\
+    A non - positive value means infinity')
+.settings-row
+    +text('Signature algorithm:', clientCfgModel + '.signerOverride', 
'"checkpointS3SignerOverride"', 'false', 'Not specified',
+    'Name of the signature algorithm to use for signing requests made by this 
client')
+.settings-row
+    +number('Connection TTL:', clientCfgModel + '.connectionTTL', 
'"checkpointS3ConnectionTTL"', 'true', '-1', '-1',
+    'Expiration time in milliseconds for a connection in the connection 
pool<br/>\
+    By default, it is set to <b>-1</b>, i.e. connections do not expire')
+.settings-row
+    +number('Idle timeout:', clientCfgModel + '.connectionMaxIdleMillis', 
'"checkpointS3ConnectionMaxIdleMillis"', 'true', '60000', '0',
+    'Maximum amount of time that an idle connection may sit in the connection 
pool and still be eligible for reuse')
+.settings-row
+    +java-class('DNS resolver:', clientCfgModel + '.dnsResolver', 
'"checkpointS3DnsResolver" + $index', 'true', 'false',
+    'DNS Resolver that should be used to for resolving AWS IP addresses')
+.settings-row
+    +number('Response metadata cache size:', clientCfgModel + 
'.responseMetadataCacheSize', '"checkpointS3ResponseMetadataCacheSize"', 
'true', '50', '0',
+    'Response metadata cache size')
+.settings-row
+    +java-class('SecureRandom class name:', clientCfgModel + '.secureRandom', 
'"checkpointS3SecureRandom" + $index', 'true', 'false',
+    'SecureRandom to be used by the SDK class name')
+.settings-row
+    +checkbox('Use reaper', clientCfgModel + '.useReaper', 
'"checkpointS3UseReaper"', 'Checks if the IdleConnectionReaper is to be 
started')
+.settings-row
+    +checkbox('Use GZIP', clientCfgModel + '.useGzip', 
'"checkpointS3UseGzip"', 'Checks if gzip compression is used')
+.settings-row
+    +checkbox('Preemptively basic authentication', clientCfgModel + 
'.preemptiveBasicProxyAuth', '"checkpointS3PreemptiveBasicProxyAuth"',
+    'Attempt to authenticate preemptively against proxy servers using basic 
authentication')
+.settings-row
+    +checkbox('TCP KeepAlive', clientCfgModel + '.useTcpKeepAlive', 
'"checkpointS3UseTcpKeepAlive"', 'TCP KeepAlive support is enabled')
+.settings-row
+    +java-class('Listener:', 'model.S3.checkpointListener', 
'"checkpointS3Listener" + $index', 'true', 'false',
+    'Checkpoint listener implementation class name')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/collision.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/collision.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/collision.jade
index 491e4f1..1a5d6d6 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/collision.jade
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/collision.jade
@@ -25,7 +25,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-panel-chevron
         label Collision configuration
         ignite-form-field-tooltip.tipLabel
-            | Configuration Collision SPI allows to regulate how grid jobs get 
executed when they arrive on a destination node for execution
+            | Configuration Collision SPI allows to regulate how grid jobs get 
executed when they arrive on a destination node for execution#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/job-scheduling"; 
target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')
@@ -47,15 +48,15 @@ include ../../../../../app/helpers/jade/mixins.jade
                             <li>Custom - custom CollisionSpi 
implementation</li>\
                             <li>Default - jobs are activated immediately on 
arrival to mapped node</li>\
                         </ul>')
-                .settings-row(ng-show='#{modelCollisionKind} !== "Noop"')
+                .settings-row(ng-if='#{modelCollisionKind} !== "Noop"')
                     .panel-details
-                        div(ng-show='#{modelCollisionKind} === "JobStealing"')
+                        div(ng-if='#{modelCollisionKind} === "JobStealing"')
                             include ./collision/job-stealing.jade
-                        div(ng-show='#{modelCollisionKind} === "FifoQueue"')
+                        div(ng-if='#{modelCollisionKind} === "FifoQueue"')
                             include ./collision/fifo-queue.jade
-                        div(ng-show='#{modelCollisionKind} === 
"PriorityQueue"')
+                        div(ng-if='#{modelCollisionKind} === "PriorityQueue"')
                             include ./collision/priority-queue.jade
-                        div(ng-show='#{modelCollisionKind} === "Custom"')
+                        div(ng-if='#{modelCollisionKind} === "Custom"')
                             include ./collision/custom.jade
             .col-sm-6
                 -var model = 'backupItem.collision'

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/collision/job-stealing.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/collision/job-stealing.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/collision/job-stealing.jade
index 3e6d428..3659115 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/collision/job-stealing.jade
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/collision/job-stealing.jade
@@ -39,7 +39,7 @@ div
         +java-class('External listener:', model + 
'.externalCollisionListener', '"jsExternalCollisionListener"', 'true', 'false',
             'Listener to be set for notification of external collision events')
     .details-row
-        +ignite-form-group(ng-model='#{stealingAttributes}' ng-form='#{form}')
+        +ignite-form-group
             ignite-form-field-label
                 | Stealing attributes
             ignite-form-group-tooltip

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/communication.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/communication.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/communication.jade
index 2c60478..55bf909 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/communication.jade
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/communication.jade
@@ -26,7 +26,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         label Communication
         ignite-form-field-tooltip.tipLabel
             | Configuration of communication with other nodes by TCP/IP
-            | Provide basic plumbing to send and receive grid messages and is 
utilized for all distributed grid operations
+            | Provide basic plumbing to send and receive grid messages and is 
utilized for all distributed grid operations#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/network-config"; 
target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/connector.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/connector.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/connector.jade
index baec54f..6e75283 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/connector.jade
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/connector.jade
@@ -26,7 +26,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-panel-chevron
         label Connector configuration
         ignite-form-field-tooltip.tipLabel
-            | Configure HTTP REST configuration to enable HTTP server features
+            | Configure HTTP REST configuration to enable HTTP server 
features#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/configuration"; 
target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/deployment.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/deployment.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/deployment.jade
index 6cfa82d..67b6b4f 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/deployment.jade
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/deployment.jade
@@ -26,7 +26,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-panel-chevron
         label Class deployment
         ignite-form-field-tooltip.tipLabel
-            | Task and resources deployment in cluster
+            | Task and resources deployment in cluster#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/deployment-modes"; 
target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id='deployment')
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/discovery.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/discovery.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/discovery.jade
index 1fdcbec..c9a2be3 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/discovery.jade
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/discovery.jade
@@ -24,7 +24,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-panel-chevron
         label Discovery
         ignite-form-field-tooltip.tipLabel
-            | TCP/IP discovery configuration
+            | TCP/IP discovery configuration#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/cluster-config"; 
target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/events.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/events.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/events.jade
index 412714c..42c319c 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/events.jade
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/events.jade
@@ -18,20 +18,51 @@ include ../../../../../app/helpers/jade/mixins.jade
 
 -var form = 'events'
 -var model = 'backupItem'
+-var modelEventStorage = model + '.eventStorage'
+-var modelEventStorageKind = modelEventStorage + '.kind'
+-var eventStorageMemory = modelEventStorageKind + ' === "Memory"'
+-var eventStorageCustom = modelEventStorageKind + ' === "Custom"'
 
 .panel.panel-default(ng-form=form novalidate)
     .panel-heading(bs-collapse-toggle ng-click='ui.loadPanel("#{form}")')
         ignite-form-panel-chevron
         label Events
         ignite-form-field-tooltip.tipLabel
-            | Grid events are used for notification about what happens within 
the grid
+            | Grid events are used for notification about what happens within 
the grid#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/events"; 
target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')
             .col-sm-6
                 .settings-row
                     +dropdown-multiple('Include type:', model + 
'.includeEventTypes', '"includeEventTypes"', true, 'Choose recorded event 
types', '', 'eventGroups',
-                        'Array of event types, which will be recorded by 
GridEventStorageManager#record(Event)<br/>\
-                        Note, that either the include event types or the 
exclude event types can be established')
+                    'Array of event types, which will be recorded by 
GridEventStorageManager#record(Event)<br/>\
+                    Note, that either the include event types or the exclude 
event types can be established')
+
+                .settings-row
+                    +dropdown('Event storage:', modelEventStorageKind, 
'"eventStorageKind"', 'true', '',
+                    '[\
+                        {value: "Memory", label: "Memory"},\
+                        {value: "Custom", label: "Custom"}\
+                    ]',
+                    'Regulate how grid store events locally on node\
+                    <ul>\
+                        <li>Memory - All events are kept in the FIFO queue 
in-memory</li>\
+                        <li>Custom - Custom implementation of event storage 
SPI</li>\
+                    </ul>')
+
+                div(ng-show=eventStorageMemory)
+                    .settings-row
+                        +number('Events expiration time:', modelEventStorage + 
'.Memory.expireAgeMs', '"EventStorageExpireAgeMs"', 'true', 'Long.MAX_VALUE', 
'1', 'All events that exceed this value will be removed from the queue when 
next event comes')
+                    .settings-row
+                        +number('Events queue size:', modelEventStorage + 
'.Memory.expireCount', '"EventStorageExpireCount"', 'true', '10000', '1', 
'Events will be filtered out when new request comes')
+                    .settings-row
+                        +java-class('Filter:', modelEventStorage + 
'.Memory.filter', '"EventStorageFilter"', 'true', 'false',
+                        'Filter for events to be recorded<br/>\
+                        Should be implementation of 
o.a.i.lang.IgnitePredicate&lt;o.a.i.events.Event&gt;')
+
+                .settings-row(ng-show=eventStorageCustom)
+                    +java-class('Class:', modelEventStorage + 
'.Custom.className', '"EventStorageCustom"', 'true', eventStorageCustom, 'Event 
storage implementation class name')
+
             .col-sm-6
                 +preview-xml-java(model, 'clusterEvents')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/failover.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/failover.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/failover.jade
index 85f0f54..b29701d 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/failover.jade
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/failover.jade
@@ -19,14 +19,15 @@ include ../../../../../app/helpers/jade/mixins.jade
 -var model = 'backupItem'
 -var form = 'failoverSpi'
 -var failoverSpi = model + '.failoverSpi'
--var failoverCustom = 'failover.kind === "Custom"'
+-var failoverCustom = 'model.kind === "Custom"'
 
 .panel.panel-default(ng-form=form novalidate)
     .panel-heading(bs-collapse-toggle ng-click='ui.loadPanel("#{form}")')
         ignite-form-panel-chevron
         label Failover configuration
         ignite-form-field-tooltip.tipLabel
-            | Failover SPI provides ability to supply custom logic for 
handling failed execution of a grid job
+            | Failover SPI provides ability to supply custom logic for 
handling failed execution of a grid job#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/fault-tolerance"; 
target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')
@@ -41,10 +42,10 @@ include ../../../../../app/helpers/jade/mixins.jade
                             | Add failover SPI
                         .group-content-empty(ng-if='!(#{failoverSpi} && 
#{failoverSpi}.length > 0)')
                             | Not defined
-                        .group-content(ng-show='#{failoverSpi} && 
#{failoverSpi}.length > 0' ng-repeat='failover in #{failoverSpi} track by 
$index')
+                        .group-content(ng-show='#{failoverSpi} && 
#{failoverSpi}.length > 0' ng-repeat='model in #{failoverSpi} track by $index')
                             hr(ng-if='$index != 0')
                             .settings-row
-                                +dropdown('Failover SPI:', 'failover.kind', 
'"failoverKind" + $index', 'true', 'Choose Failover SPI', '[\
+                                +dropdown-required('Failover SPI:', 
'model.kind', '"failoverKind" + $index', 'true', 'true', 'Choose Failover SPI', 
'[\
                                         {value: "JobStealing", label: "Job 
stealing"},\
                                         {value: "Never", label: "Never"},\
                                         {value: "Always", label: "Always"},\
@@ -59,14 +60,14 @@ include ../../../../../app/helpers/jade/mixins.jade
                                     </ul>')
 
                                     +table-remove-button(failoverSpi, 'Remove 
Failover SPI')
-                            .settings-row(ng-show='failover.kind === 
"JobStealing"')
-                                +number('Maximum failover attempts:', 
'failover.JobStealing.maximumFailoverAttempts', '"jsMaximumFailoverAttempts" + 
$index', 'true', '5', '0',
+                            .settings-row(ng-show='model.kind === 
"JobStealing"')
+                                +number('Maximum failover attempts:', 
'model.JobStealing.maximumFailoverAttempts', '"jsMaximumFailoverAttempts" + 
$index', 'true', '5', '0',
                                     'Maximum number of attempts to execute a 
failed job on another node')
-                            .settings-row(ng-show='failover.kind === "Always"')
-                                +number('Maximum failover attempts:', 
'failover.Always.maximumFailoverAttempts', '"alwaysMaximumFailoverAttempts" + 
$index', 'true', '5', '0',
+                            .settings-row(ng-show='model.kind === "Always"')
+                                +number('Maximum failover attempts:', 
'model.Always.maximumFailoverAttempts', '"alwaysMaximumFailoverAttempts" + 
$index', 'true', '5', '0',
                                     'Maximum number of attempts to execute a 
failed job on another node')
                             .settings-row(ng-show=failoverCustom)
-                                +java-class('SPI implementation', 
'failover.Custom.class', '"failoverSpiClass" + $index', 'true', failoverCustom,
+                                +java-class('SPI implementation', 
'model.Custom.class', '"failoverSpiClass" + $index', 'true', failoverCustom,
                                     'Custom FailoverSpi implementation class 
name.')
             .col-sm-6
                 +preview-xml-java(model, 'clusterFailover')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/general.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/general.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/general.jade
index d0d390f..8ec9b13 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/general.jade
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/general.jade
@@ -24,6 +24,9 @@ include ../../../../../app/helpers/jade/mixins.jade
     .panel-heading(bs-collapse-toggle)
         ignite-form-panel-chevron
         label General
+        ignite-form-field-tooltip.tipLabel
+            | Common cluster configuration#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/clustering"; 
target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/general/discovery/zookeeper.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/general/discovery/zookeeper.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/general/discovery/zookeeper.jade
index afd3ecd..da36993 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/general/discovery/zookeeper.jade
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/general/discovery/zookeeper.jade
@@ -71,6 +71,8 @@ div
                 div(ng-show='#{modelRetryPolicyKind} === "Custom"')
                     include ./zookeeper/retrypolicy/custom.jade
     .details-row
+        -var model = 'backupItem.discovery.ZooKeeper'
+
         +text('Base path:', model + '.basePath', '"basePath"', 'false', 
'/services', 'Base path for service registration')
     .details-row
         +text('Service name:', model + '.serviceName', '"serviceName"', 
'false', 'ignite',

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/igfs.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/igfs.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/igfs.jade
index 181b44f..7eb1505 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/igfs.jade
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/igfs.jade
@@ -24,7 +24,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-panel-chevron
         label IGFS
         ignite-form-field-tooltip.tipLabel
-            | IGFS (Ignite In-Memory File System) configurations assigned to 
cluster
+            | IGFS (Ignite In-Memory File System) configurations assigned to 
cluster#[br]
+            | 
#[a(href="https://apacheignite-fs.readme.io/docs/in-memory-file-system"; 
target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/load-balancing.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/load-balancing.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/load-balancing.jade
new file mode 100644
index 0000000..916504b
--- /dev/null
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/load-balancing.jade
@@ -0,0 +1,104 @@
+//-
+    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.
+
+include ../../../../../app/helpers/jade/mixins.jade
+
+-var model = 'backupItem'
+-var form = 'loadBalancing'
+-var loadBalancingSpi = model + '.loadBalancingSpi'
+-var loadBalancingCustom = 'model.kind === "Custom"'
+-var loadProbeCustom = 'model.kind === "Adaptive" && 
model.Adaptive.loadProbe.kind === "Custom"'
+
+.panel.panel-default(ng-form=form novalidate)
+    .panel-heading(bs-collapse-toggle ng-click='ui.loadPanel("#{form}")')
+        ignite-form-panel-chevron
+        label Load balancing configuration
+        ignite-form-field-tooltip.tipLabel
+            | Load balancing component balances job distribution among cluster 
nodes#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/load-balancing"; 
target="_blank") More info]
+        ignite-form-revert
+    .panel-collapse(role='tabpanel' bs-collapse-target id=form)
+        .panel-body(ng-if='ui.isPanelLoaded("#{form}")')
+            .col-sm-6
+                .settings-row(ng-init='loadBalancingSpiTbl={type: 
"loadBalancingSpi", model: "loadBalancingSpi", focusId: "kind", ui: 
"load-balancing-table"}')
+                    +ignite-form-group()
+                        ignite-form-field-label
+                            | Load balancing configurations
+                        ignite-form-group-tooltip
+                            | Load balancing component balances job 
distribution among cluster nodes
+                        
ignite-form-group-add(ng-click='tableNewItem(loadBalancingSpiTbl)')
+                            | Add load balancing configuration
+                        .group-content-empty(ng-if='!(#{loadBalancingSpi} && 
#{loadBalancingSpi}.length > 0)')
+                            | Not defined
+                        .group-content(ng-show='#{loadBalancingSpi} && 
#{loadBalancingSpi}.length > 0' ng-repeat='model in #{loadBalancingSpi} track 
by $index')
+                            hr(ng-if='$index != 0')
+                            .settings-row
+                                +dropdown-required('Load balancing:', 
'model.kind', '"loadBalancingKind" + $index', 'true', 'true', 'Choose load 
balancing SPI', '[\
+                                        {value: "RoundRobin", label: 
"Round-robin"},\
+                                        {value: "Adaptive", label: 
"Adaptive"},\
+                                        {value: "WeightedRandom", label: 
"Random"},\
+                                        {value: "Custom", label: "Custom"}\
+                                    ]', 'Provides the next best balanced node 
for job execution\
+                                    <ul>\
+                                        <li>Round-robin - Iterates through 
nodes in round-robin fashion and pick the next sequential node</li>\
+                                        <li>Adaptive - Adapts to overall node 
performance</li>\
+                                        <li>Random - Picks a random node for 
job execution</li>\
+                                        <li>Custom - Custom load balancing 
implementation</li>\
+                                    </ul>')
+
+                                    +table-remove-button(loadBalancingSpi, 
'Remove load balancing SPI')
+                            .settings-row(ng-show='model.kind === 
"RoundRobin"')
+                                +checkbox('Per task', 
'model.RoundRobin.perTask', '"loadBalancingRRPerTask" + $index', 'A new round 
robin order should be created for every task flag')
+                            .settings-row(ng-show='model.kind === "Adaptive"')
+                                +dropdown('Load probe:', 
'model.Adaptive.loadProbe.kind', '"loadBalancingAdaptiveLoadProbeKind" + 
$index', 'true', 'Default', '[\
+                                        {value: "Job", label: "Job count"},\
+                                        {value: "CPU", label: "CPU load"},\
+                                        {value: "ProcessingTime", label: 
"Processing time"},\
+                                        {value: "Custom", label: "Custom"},\
+                                        {value: undefined, 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>')
+                            .settings-row(ng-show='model.kind === "Adaptive" 
&& model.Adaptive.loadProbe.kind')
+                                .panel-details
+                                    
.details-row(ng-show='model.Adaptive.loadProbe.kind === "Job"')
+                                        +checkbox('Use average', 
'model.Adaptive.loadProbe.Job.useAverage', 
'"loadBalancingAdaptiveJobUseAverage" + $index', 'Use average CPU load vs. 
current')
+                                    
.details-row(ng-show='model.Adaptive.loadProbe.kind === "CPU"')
+                                        +checkbox('Use average', 
'model.Adaptive.loadProbe.CPU.useAverage', 
'"loadBalancingAdaptiveCPUUseAverage" + $index', 'Use average CPU load vs. 
current')
+                                    
.details-row(ng-show='model.Adaptive.loadProbe.kind === "CPU"')
+                                        +checkbox('Use processors', 
'model.Adaptive.loadProbe.CPU.useProcessors', 
'"loadBalancingAdaptiveCPUUseProcessors" + $index', "divide each node's CPU 
load by the number of processors on that node")
+                                    
.details-row(ng-show='model.Adaptive.loadProbe.kind === "CPU"')
+                                        +number-min-max-step('Processor 
coefficient:', 'model.Adaptive.loadProbe.CPU.processorCoefficient',
+                                            
'"loadBalancingAdaptiveCPUProcessorCoefficient" + $index', 'true', '1', 
'0.001', '1', '0.05', 'Coefficient of every CPU')
+                                    
.details-row(ng-show='model.Adaptive.loadProbe.kind === "ProcessingTime"')
+                                        +checkbox('Use average', 
'model.Adaptive.loadProbe.ProcessingTime.useAverage', 
'"loadBalancingAdaptiveJobUseAverage" + $index', 'Use average execution time 
vs. current')
+                                    .details-row(ng-show=loadProbeCustom)
+                                        +java-class('Load brobe 
implementation:', 'model.Adaptive.loadProbe.Custom.className', 
'"loadBalancingAdaptiveJobUseClass" + $index', 'true', loadProbeCustom,
+                                            'Custom load balancing SPI 
implementation class name.')
+                            .settings-row(ng-show='model.kind === 
"WeightedRandom"')
+                                +number('Node weight:', 
'model.WeightedRandom.nodeWeight', '"loadBalancingWRNodeWeight" + $index', 
'true', 10, '1', 'Weight of node')
+                            .settings-row(ng-show='model.kind === 
"WeightedRandom"')
+                                +checkbox('Use weights', 
'model.WeightedRandom.useWeights', '"loadBalancingWRUseWeights" + $index', 
'Node weights should be checked when doing random load balancing')
+                            .settings-row(ng-show=loadBalancingCustom)
+                                +java-class('Load balancing SPI 
implementation:', 'model.Custom.className', '"loadBalancingClass" + $index', 
'true', loadBalancingCustom,
+                                    'Custom load balancing SPI implementation 
class name.')
+            .col-sm-6
+                +preview-xml-java(model, 'clusterLoadBalancing')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/marshaller.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/marshaller.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/marshaller.jade
index 1fc3ce7..3f3661c 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/marshaller.jade
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/marshaller.jade
@@ -28,7 +28,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-field-tooltip.tipLabel
             | Marshaller allows to marshal or unmarshal objects in grid#[br]
             | It provides serialization/deserialization mechanism for all 
instances that are sent across networks or are otherwise serialized
-            | By default BinaryMarshaller will be used
+            | By default BinaryMarshaller will be used#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/binary-marshaller"; 
target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/odbc.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/odbc.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/odbc.jade
index c267891..dd46d2a 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/odbc.jade
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/odbc.jade
@@ -25,7 +25,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-panel-chevron
         label ODBC configuration
         ignite-form-field-tooltip.tipLabel
-            | ODBC server configuration
+            | ODBC server configuration#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/odbc-driver"; 
target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/ssl.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/ssl.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/ssl.jade
index 7264386..0a51cf7 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/ssl.jade
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/ssl.jade
@@ -27,7 +27,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-panel-chevron
         label(id='sslConfiguration-title') SSL configuration
         ignite-form-field-tooltip.tipLabel
-            | Settings for SSL configuration for creating a secure socket layer
+            | Settings for SSL configuration for creating a secure socket 
layer#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/ssltls"; 
target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')
@@ -58,7 +59,7 @@ include ../../../../../app/helpers/jade/mixins.jade
                         ignite-form-group-tooltip
                             | Pre-configured trust managers
                         ignite-form-group-add(ng-show='#{enabled}' 
ng-click='(group.add = [{}])')
-                            | Add new trust manager.
+                            | Add new trust manager
 
                         .group-content(ng-if='#{trust}.length')
                             -var model = 'obj.model';
@@ -75,7 +76,7 @@ include ../../../../../app/helpers/jade/mixins.jade
                                         span(ng-hide='field.edit')
                                             
a.labelFormField(ng-click='#{enabled} && (field.edit = true) && (#{model} = 
model)') {{ model }}
                                         span(ng-if='field.edit')
-                                            +table-java-class-field('Trust 
manager:', name, model, trust, valid, save, false)
+                                            +table-java-class-field('Trust 
manager', name, model, trust, valid, save, false)
                                                 +table-save-button(valid, 
save, false)
                                                 +unique-feedback(name, 
uniqueTip)
                             div(ng-hide=enabled)

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/swap.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/swap.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/swap.jade
index 1c75c4f..c76391c 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/swap.jade
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/swap.jade
@@ -26,7 +26,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-panel-chevron
         label Swap
         ignite-form-field-tooltip.tipLabel
-            | Settings for overflow data to disk if it cannot fit in memory
+            | Settings for overflow data to disk if it cannot fit in 
memory#[br]
+            | 
#[a(href="https://apacheignite.readme.io/docs/off-heap-memory#swap-space"; 
target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/clusters/transactions.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/transactions.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/transactions.jade
index d9611a5..2946158 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/transactions.jade
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/transactions.jade
@@ -24,7 +24,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-panel-chevron
         label Transactions
         ignite-form-field-tooltip.tipLabel
-            | Settings for transactions
+            | Settings for transactions#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/transactions"; 
target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')
@@ -39,8 +40,7 @@ include ../../../../../app/helpers/jade/mixins.jade
                         <ul>\
                             <li>OPTIMISTIC - All cache operations are not 
distributed to other nodes until commit is called</li>\
                             <li>PESSIMISTIC - A lock is acquired on all cache 
operations with exception of read operations in READ_COMMITTED mode</li>\
-                        </ul>\
-                        ')
+                        </ul>')
                 .settings-row
                     +dropdown('Isolation:', model + '.defaultTxIsolation', 
'"defaultTxIsolation"', 'true', 'REPEATABLE_READ',
                         '[\

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/domains/general.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/domains/general.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/domains/general.jade
index 74895f5..bf21ee1 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/domains/general.jade
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/domains/general.jade
@@ -24,12 +24,16 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-panel-chevron
         label General
         ignite-form-field-tooltip.tipLabel
-            | Domain model properties common for Query and Store
+            | Domain model properties common for Query and Store#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/cache-queries"; 
target="_blank") More info about query configuration]#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/persistent-store"; 
target="_blank") More info about store]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body
             .col-sm-6
                 .settings-row
+                    +checkbox('Generate POJO classes', model + 
'.generatePojo', '"generatePojo"', 'If selected then POJO classes will be 
generated from database tables')
+                .settings-row
                     +caches(model, 'Select caches to associate domain model 
with cache')
                 .settings-row
                     +dropdown-required('Query metadata:', model + 
'.queryMetadata', '"queryMetadata"', 'true', 'true', '', 
'queryMetadataVariants',
@@ -38,9 +42,11 @@ include ../../../../../app/helpers/jade/mixins.jade
                             <li>Java annotations like @QuerySqlField</li>\
                             <li>Configuration via QueryEntity class</li>\
                         </ul>')
+                -var generatePojo = model + '.generatePojo'
                 .settings-row
-                    +java-class-typeahead('Key type:', model + '.keyType', 
'"keyType"', 'javaBuiltInClasses', 'true', 'true', 'Full class name for Key', 
'Key class used to store key in cache')
+                    +java-class-typeahead('Key type:', model + '.keyType', 
'"keyType"', 'javaBuiltInClasses', 'true', 'true', '{{ ' + generatePojo + ' ? 
"Full class name for Key" : "Key type name" }}', 'Key class used to store key 
in cache', generatePojo)
                 .settings-row
-                    +java-class('Value type:', model + '.valueType', 
'"valueType"', 'true', 'true', 'Value class used to store value in cache')
+                    +java-class-autofocus-placholder('Value type:', model + 
'.valueType', '"valueType"', 'true', 'true', 'false', '{{ ' + generatePojo +' ? 
"Enter fully qualified class name" : "Value type name" }}', 'Value class used 
to store value in cache', generatePojo)
+
             .col-sm-6
                 +preview-xml-java(model, 'domainModelGeneral')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/domains/query.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/domains/query.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/domains/query.jade
index 0cf21f5..45051b2 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/domains/query.jade
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/domains/query.jade
@@ -37,25 +37,27 @@ mixin table-index-item-edit(prefix, index, sortAvailable, 
idAddition)
     -var btnSave = 'tableIndexItemSave(indexesTbl, itemIndex, ' + index + ')'
     -var btnVisibleAndSave = btnVisible + ' && ' + btnSave
 
-    .col-xs-8.col-sm-8.col-md-8(ng-show=sortAvailable)
-        label.fieldSep /
-        .input-tip
-            input.form-control(id='{{::"#{fieldName}S" + #{idAddition}}}' 
ignite-on-enter-focus-move='{{::"#{direction}S" + #{idAddition}}}' type='text' 
ng-model=fieldNameModel placeholder='Field name' 
ignite-on-escape='tableReset()')
-    .col-xs-4.col-sm-4.col-md-4(ng-show=sortAvailable)
-        +btn-save(btnVisible, btnSave)
-        .input-tip
-            button.select-toggle.form-control(id='{{::"#{direction}S" + 
#{idAddition}}}' ng-model=directionModel bs-select bs-options='item.value as 
item.label for item in {{sortDirections}}' ignite-on-enter=btnVisibleAndSave 
ignite-on-escape='tableReset()' tabindex='0')
-    .col-xs-12(ng-show='!(#{sortAvailable})')
+    div(ng-if=sortAvailable)
+        .col-xs-8.col-sm-8.col-md-8
+            label.fieldSep /
+            .input-tip
+                button.select-toggle.form-control(id='{{::"#{fieldName}" + 
#{idAddition}}}' ignite-on-enter-focus-move='{{::"#{direction}S" + 
#{idAddition}}}' ng-model=fieldNameModel placeholder='{{fields("#{prefix}", 
#{fieldNameModel}).length > 0 ? "Choose field" : "No fields configured"}}' 
bs-select bs-options='item.value as item.label for item in fields("#{prefix}", 
#{fieldNameModel})' ng-disabled='fields("#{prefix}", #{fieldNameModel}).length 
=== 0' ignite-on-escape='tableReset()' tabindex='0')
+        .col-xs-4.col-sm-4.col-md-4
+            +btn-save(btnVisible, btnSave)
+            .input-tip
+                button.select-toggle.form-control(id='{{::"#{direction}" + 
#{idAddition}}}' ng-model=directionModel bs-select bs-options='item.value as 
item.label for item in {{sortDirections}}' ignite-on-enter=btnVisibleAndSave 
ignite-on-escape='tableReset()' tabindex='0')
+    .col-xs-12(ng-if='!(#{sortAvailable})')
         +btn-save(btnVisible, btnSave)
         .input-tip
-            input.form-control(id='{{::"#{fieldName}" + #{idAddition}}}' 
type='text' ng-model=fieldNameModel placeholder='Field name' 
ignite-on-enter=btnVisibleAndSave ignite-on-escape='tableReset()')
+            button.select-toggle.form-control(id='{{::"#{fieldName}" + 
#{idAddition}}}' ng-model=fieldNameModel placeholder='{{fields("#{prefix}", 
#{fieldNameModel}).length > 0 ? "Choose index field" : "No fields 
configured"}}' bs-select bs-options='item.value as item.label for item in 
fields("#{prefix}", #{fieldNameModel})' ng-disabled='fields("#{prefix}", 
#{fieldNameModel}).length === 0' ignite-on-escape='tableReset()' tabindex='0')
 
 .panel.panel-default(ng-form=form novalidate)
     .panel-heading(bs-collapse-toggle)
         ignite-form-panel-chevron
         label(id='query-title') Domain model for SQL query
         ignite-form-field-tooltip.tipLabel
-            | Domain model properties for fields queries
+            | Domain model properties for fields queries#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/cache-queries"; 
target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id='query')
         .panel-body
@@ -76,8 +78,8 @@ mixin table-index-item-edit(prefix, index, sortAvailable, 
idAddition)
                             .group-content(ng-show='(#{queryFields} && 
#{queryFields}.length > 0) || tableNewItemActive(queryFieldsTbl)')
                                 table.links-edit(id='fields' 
st-table=queryFields)
                                     tbody
-                                        tr(ng-repeat='item in #{queryFields}')
-                                            
td.col-sm-12(ng-show='!tableEditing(queryFieldsTbl, $index)')
+                                        tr(ng-repeat='item in #{queryFields} 
track by $index')
+                                            
td.col-sm-12(ng-hide='tableEditing(queryFieldsTbl, $index)')
                                                 
a.labelFormField(ng-click='tableStartEdit(backupItem, queryFieldsTbl, $index)') 
{{item.name}}  / {{item.className}}
                                                 
+btn-remove('tableRemove(backupItem, queryFieldsTbl, $index)', '"Remove path"')
                                             
td.col-sm-12(ng-show='tableEditing(queryFieldsTbl, $index)')
@@ -100,8 +102,8 @@ mixin table-index-item-edit(prefix, index, sortAvailable, 
idAddition)
                             .group-content(ng-show='(#{queryAliases} && 
#{queryAliases}.length > 0) || tableNewItemActive(aliasesTbl)')
                                 table.links-edit(id='aliases' 
st-table=queryAliases)
                                     tbody
-                                        tr(ng-repeat='item in #{queryAliases}')
-                                            
td.col-sm-12(ng-show='!tableEditing(aliasesTbl, $index)')
+                                        tr(ng-repeat='item in #{queryAliases} 
track by $index')
+                                            
td.col-sm-12(ng-hide='tableEditing(aliasesTbl, $index)')
                                                 
a.labelFormField(ng-click='tableStartEdit(backupItem, aliasesTbl, $index)') 
{{item.field}} &rarr; {{item.alias}}
                                                 
+btn-remove('tableRemove(backupItem, aliasesTbl, $index)', '"Remove alias"')
                                             
td.col-sm-12(ng-show='tableEditing(aliasesTbl, $index)')
@@ -125,9 +127,9 @@ mixin table-index-item-edit(prefix, index, sortAvailable, 
idAddition)
 
                                 table.links-edit(st-table=queryIndexes 
ng-init='newDirection = false')
                                     tbody
-                                        tr(ng-repeat='item in #{queryIndexes}')
+                                        tr(ng-repeat='item in #{queryIndexes} 
track by $index')
                                             td
-                                                
.col-sm-12(ng-show='!tableEditing(indexesTbl, $index)')
+                                                
.col-sm-12(ng-hide='tableEditing(indexesTbl, $index)')
                                                     
a.labelFormField(id='indexes{{$index}}' ng-click='tableStartEdit(backupItem, 
indexesTbl, $index)') {{$index + 1}}) {{item.name}} [{{item.indexType}}]
                                                     
+btn-remove('tableRemove(backupItem, indexesTbl, $index)', '"Remove index"')
                                                     
+btn-add('tableIndexNewItem(indexesTbl, $index)', '"Add new field to index"')
@@ -143,9 +145,9 @@ mixin table-index-item-edit(prefix, index, sortAvailable, 
idAddition)
                                                 .margin-left-dflt
                                                     
table.links-edit-sub(st-table='item.fields' ng-init='itemIndex = $index')
                                                         tbody
-                                                            
tr(ng-repeat='itemItem in item.fields')
+                                                            
tr(ng-repeat='itemItem in item.fields track by $index')
                                                                 td
-                                                                    
div(ng-show='!tableIndexItemEditing(indexesTbl, itemIndex, $index)')
+                                                                    
div(ng-hide='tableIndexItemEditing(indexesTbl, itemIndex, $index)')
                                                                         
a.labelFormField(ng-if='item.indexType == "SORTED"' 
ng-click='tableIndexItemStartEdit(indexesTbl, itemIndex, $index)') {{$index + 
1}}) {{itemItem.name}} / {{itemItem.direction ? "ASC" : "DESC"}}
                                                                         
a.labelFormField(ng-if='item.indexType != "SORTED"' 
ng-click='tableIndexItemStartEdit(indexesTbl, itemIndex, $index)') {{$index + 
1}}) {{itemItem.name}}
                                                                         
+btn-remove('tableRemoveIndexItem(item, $index)', '"Remove field from index"')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/domains/store.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/domains/store.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/domains/store.jade
index 96913bb..ab569e7 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/domains/store.jade
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/domains/store.jade
@@ -66,7 +66,8 @@ mixin table-db-field-edit(tbl, prefix, focusId, index)
         ignite-form-panel-chevron
         label Domain model for cache store
         ignite-form-field-tooltip.tipLabel
-            | Domain model properties for binding database with cache via POJO 
cache store
+            | Domain model properties for binding database with cache via POJO 
cache store#[br]
+            | #[a(href="https://apacheignite.readme.io/docs/persistent-store"; 
target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')
@@ -87,12 +88,12 @@ mixin table-db-field-edit(tbl, prefix, focusId, index)
                         .group-content(ng-show='(#{keyFields} && 
#{keyFields}.length > 0) || tableNewItemActive(keysTbl)')
                             table.links-edit(st-table=keyFields)
                                 tbody
-                                    tr(ng-repeat='item in #{keyFields}')
+                                    tr(ng-repeat='item in #{keyFields} track 
by $index')
                                         td
-                                            
div(ng-show='!tableEditing(keysTbl, $index)')
+                                            div(ng-hide='tableEditing(keysTbl, 
$index)')
                                                 
a.labelFormField(ng-click='tableStartEdit(backupItem, keysTbl, $index)') 
{{$index + 1}}) {{item.databaseFieldName}} / {{item.databaseFieldType}} / 
{{item.javaFieldName}} / {{item.javaFieldType}}
                                                 
+btn-remove('tableRemove(backupItem, keysTbl, $index)', '"Remove key field"')
-                                            div(ng-show='tableEditing(keysTbl, 
$index)')
+                                            div(ng-if='tableEditing(keysTbl, 
$index)')
                                                 
+table-db-field-edit('keysTbl', 'cur', '{{::keysTbl.focusId + $index}}', 
'$index')
                                 tfoot(ng-show='tableNewItemActive(keysTbl)')
                                     tr
@@ -110,12 +111,12 @@ mixin table-db-field-edit(tbl, prefix, focusId, index)
                         .group-content(ng-show='(#{valueFields} && 
#{valueFields}.length > 0) || tableNewItemActive(valuesTbl)')
                             table.links-edit(st-table=valueFields)
                                 tbody
-                                    tr(ng-repeat='item in #{valueFields}')
+                                    tr(ng-repeat='item in #{valueFields} track 
by $index')
                                         td
-                                            
div(ng-show='!tableEditing(valuesTbl, $index)')
+                                            
div(ng-hide='tableEditing(valuesTbl, $index)')
                                                 
a.labelFormField(ng-click='tableStartEdit(backupItem, valuesTbl, $index)') 
{{$index + 1}}) {{item.databaseFieldName}} / {{item.databaseFieldType}} / 
{{item.javaFieldName}} / {{item.javaFieldType}}
                                                 
+btn-remove('tableRemove(backupItem, valuesTbl, $index)', '"Remove key field"')
-                                            
div(ng-show='tableEditing(valuesTbl, $index)')
+                                            div(ng-if='tableEditing(valuesTbl, 
$index)')
                                                 
+table-db-field-edit('valuesTbl', 'cur', '{{::valuesTbl.focusId + $index}}', 
'$index')
                                 tfoot(ng-show='tableNewItemActive(valuesTbl)')
                                     tr

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/igfs/general.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/igfs/general.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/igfs/general.jade
index b087120..d12a6e8 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/igfs/general.jade
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/igfs/general.jade
@@ -23,6 +23,9 @@ include ../../../../../app/helpers/jade/mixins.jade
     .panel-heading(bs-collapse-toggle)
         ignite-form-panel-chevron
         label General
+        ignite-form-field-tooltip.tipLabel
+            | General IGFS configuration#[br]
+            | 
#[a(href="https://apacheignite-fs.readme.io/docs/in-memory-file-system"; 
target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id='general')
         .panel-body

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/igfs/ipc.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/igfs/ipc.jade 
b/modules/web-console/frontend/app/modules/states/configuration/igfs/ipc.jade
index bb5e00b..f8da2f9 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/igfs/ipc.jade
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/igfs/ipc.jade
@@ -54,7 +54,7 @@ include ../../../../../app/helpers/jade/mixins.jade
                 .settings-row
                     +text-enabled('Token directory:', ipcEndpointConfiguration 
+ '.tokenDirectoryPath', '"ipcEndpointConfigurationTokenDirectoryPath"', 
enabled, 'false', 'ipc/shmem', 'Directory where shared memory tokens are 
stored')
                 .settings-row
-                    +number('Thread count:', ipcEndpointConfiguration + 
'.threadCount', 'ipcEndpointConfigurationThreadCount', enabled, 
'availableProcessors', '1',
+                    +number('Thread count:', ipcEndpointConfiguration + 
'.threadCount', '"ipcEndpointConfigurationThreadCount"', enabled, 
'availableProcessors', '1',
                         'Number of threads used by this endpoint to process 
incoming requests')
             .col-sm-6
                 +preview-xml-java(model, 'igfsIPC')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/igfs/misc.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/igfs/misc.jade 
b/modules/web-console/frontend/app/modules/states/configuration/igfs/misc.jade
index cb4687a..ca22dc5 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/igfs/misc.jade
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/igfs/misc.jade
@@ -93,8 +93,8 @@ mixin table-igfs-path-mode-edit(prefix, focusId, index)
                         .group-content(ng-show='(#{pathModes} && 
#{pathModes}.length > 0) || tableNewItemActive(tblPathModes)')
                             table.links-edit(id='pathModes' st-table=pathModes)
                                 tbody
-                                    tr(ng-repeat='item in #{pathModes}')
-                                        
td.col-sm-12(ng-show='!tableEditing(tblPathModes, $index)')
+                                    tr(ng-repeat='item in #{pathModes} track 
by $index')
+                                        
td.col-sm-12(ng-hide='tableEditing(tblPathModes, $index)')
                                             
a.labelFormField(ng-click='tableStartEdit(backupItem, tblPathModes, $index)') 
{{item.path + " [" + item.mode + "]"}}
                                             
+btn-remove('tableRemove(backupItem, tblPathModes, $index)', '"Remove path"')
                                         
td.col-sm-12(ng-show='tableEditing(tblPathModes, $index)')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/app/modules/states/configuration/igfs/secondary.jade
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/igfs/secondary.jade
 
b/modules/web-console/frontend/app/modules/states/configuration/igfs/secondary.jade
index 0649527..1143662 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/igfs/secondary.jade
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/igfs/secondary.jade
@@ -24,7 +24,8 @@ include ../../../../../app/helpers/jade/mixins.jade
         ignite-form-panel-chevron
         label(id="secondaryFileSystem-title") Secondary file system
         ignite-form-field-tooltip.tipLabel
-            | Secondary file system is provided for pass-through, 
write-through, and read-through purposes
+            | Secondary file system is provided for pass-through, 
write-through, and read-through purposes#[br]
+            | 
#[a(href="https://apacheignite-fs.readme.io/docs/secondary-file-system"; 
target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=form)
         .panel-body(ng-if='ui.isPanelLoaded("#{form}")')

Reply via email to