http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/app/modules/states/configuration/clusters/communication.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/communication.pug
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/communication.pug
new file mode 100644
index 0000000..cd93565
--- /dev/null
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/communication.pug
@@ -0,0 +1,100 @@
+//-
+    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
+
+-var form = 'communication'
+-var model = 'backupItem'
+-var communication = model + '.communication'
+
+.panel.panel-default(ng-form=form novalidate)
+    .panel-heading(bs-collapse-toggle ng-click=`ui.loadPanel('${form}')`)
+        ignite-form-panel-chevron
+        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#[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}')`)
+            .col-sm-6
+                .settings-row
+                    +number('Timeout:', `${model}.networkTimeout`, 
'"commNetworkTimeout"', 'true', '5000', '1', 'Maximum timeout in milliseconds 
for network requests')
+                .settings-row
+                    +number('Send retry delay:', 
`${model}.networkSendRetryDelay`, '"networkSendRetryDelay"', 'true', '1000', 
'1', 'Interval in milliseconds between message send retries')
+                .settings-row
+                    +number('Send retry count:', 
`${model}.networkSendRetryCount`, '"networkSendRetryCount"', 'true', '3', '1', 
'Message send retries count')
+                .settings-row
+                    +number('Discovery startup delay:', 
`${model}.discoveryStartupDelay`, '"discoveryStartupDelay"', 'true', '60000', 
'1', 'This value is used to expire messages from waiting list whenever node 
discovery discrepancies happen')
+                .settings-row
+                    +java-class('Communication listener:', 
`${communication}.listener`, '"comListener"', 'true', 'false', 'Listener of 
communication events')
+                .settings-row
+                    +text-ip-address('Local IP address:', 
`${communication}.localAddress`, '"comLocalAddress"', 'true', '0.0.0.0',
+                        'Local host address for socket binding<br/>\
+                        If not specified use all available addres on local 
host')
+                .settings-row
+                    +number-min-max('Local port:', 
`${communication}.localPort`, '"comLocalPort"', 'true', '47100', '1024', 
'65535', 'Local port for socket binding')
+                .settings-row
+                    +number('Local port range:', 
`${communication}.localPortRange`, '"comLocalPortRange"', 'true', '100', '1', 
'Local port range for local host ports')
+                .settings-row
+                    +number-min-max('Shared memory port:', 
`${communication}.sharedMemoryPort`, '"sharedMemoryPort"', 'true', '48100', 
'-1', '65535',
+                        'Local port to accept shared memory connections<br/>\
+                        If set to #[b -1] shared memory communication will be 
disabled')
+                .settings-row
+                    +number('Idle connection timeout:', 
`${communication}.idleConnectionTimeout`, '"idleConnectionTimeout"', 'true', 
'30000', '1',
+                        'Maximum idle connection timeout upon which a 
connection to client will be closed')
+                .settings-row
+                    +number('Connect timeout:', 
`${communication}.connectTimeout`, '"connectTimeout"', 'true', '5000', '0', 
'Connect timeout used when establishing connection with remote nodes')
+                .settings-row
+                    +number('Maximum connect timeout:', 
`${communication}.maxConnectTimeout`, '"maxConnectTimeout"', 'true', '600000', 
'0', 'Maximum connect timeout')
+                .settings-row
+                    +number('Reconnect count:', 
`${communication}.reconnectCount`, '"comReconnectCount"', 'true', '10', '1',
+                        'Maximum number of reconnect attempts used when 
establishing connection with remote nodes')
+                .settings-row
+                    +number('Socket send buffer:', 
`${communication}.socketSendBuffer`, '"socketSendBuffer"', 'true', '32768', 
'0', 'Send buffer size for sockets created or accepted by this SPI')
+                .settings-row
+                    +number('Socket receive buffer:', 
`${communication}.socketReceiveBuffer`, '"socketReceiveBuffer"', 'true', 
'32768', '0', 'Receive buffer size for sockets created or accepted by this SPI')
+                .settings-row
+                    +number('Slow client queue limit:', 
`${communication}.slowClientQueueLimit`, '"slowClientQueueLimit"', 'true', '0', 
'0', 'Slow client queue limit')
+                .settings-row
+                    +number('Ack send threshold:', 
`${communication}.ackSendThreshold`, '"ackSendThreshold"', 'true', '16', '1', 
'Number of received messages per connection to node after which acknowledgment 
message is sent')
+                .settings-row
+                    +number('Message queue limit:', 
`${communication}.messageQueueLimit`, '"messageQueueLimit"', 'true', '1024', 
'0', 'Message queue limit for incoming and outgoing messages')
+                .settings-row
+                    +number('Unacknowledged messages:', 
`${communication}.unacknowledgedMessagesBufferSize`, 
'"unacknowledgedMessagesBufferSize"', 'true', '0', '0',
+                        'Maximum number of stored unacknowledged messages per 
connection to node<br/>\
+                        If specified non zero value it should be\
+                        <ul>\
+                            <li>At least ack send threshold * 5</li>\
+                            <li>At least message queue limit * 5</li>\
+                        </ul>')
+                .settings-row
+                    +number('Socket write timeout:', 
`${communication}.socketWriteTimeout`, '"socketWriteTimeout"', 'true', '2000', 
'0', 'Socket write timeout')
+                .settings-row
+                    +number('Selectors count:', 
`${communication}.selectorsCount`, '"selectorsCount"', 'true', 'min(4, 
availableProcessors)', '1', 'Count of selectors te be used in TCP server')
+                .settings-row
+                    +java-class('Address resolver:', 
`${communication}.addressResolver`, '"comAddressResolver"', 'true', 'false', 
'Provides resolution between external and internal addresses')
+                .settings-row
+                    +checkbox('Direct buffer', 
`${communication}.directBuffer`, '"directBuffer"',
+                    'If value is true, then SPI will use 
ByteBuffer.allocateDirect(int) call<br/>\
+                    Otherwise, SPI will use ByteBuffer.allocate(int) call')
+                .settings-row
+                    +checkbox('Direct send buffer', 
`${communication}.directSendBuffer`, '"directSendBuffer"', 'Flag defining 
whether direct send buffer should be used')
+                .settings-row
+                    +checkbox('TCP_NODELAY option', 
`${communication}.tcpNoDelay`, '"tcpNoDelay"', 'Value for TCP_NODELAY socket 
option')
+            .col-sm-6
+                +preview-xml-java(model, 'clusterCommunication')

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/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
deleted file mode 100644
index 40d65af..0000000
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/connector.jade
+++ /dev/null
@@ -1,104 +0,0 @@
-//-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
-include /app/helpers/jade/mixins.jade
-
--var form = 'connector'
--var model = 'backupItem.connector'
--var enabled = model + '.enabled'
--var sslEnabled = enabled + ' && ' + model + '.sslEnabled'
-
-.panel.panel-default(ng-form=form novalidate)
-    .panel-heading(bs-collapse-toggle ng-click='ui.loadPanel("#{form}")')
-        ignite-form-panel-chevron
-        label Connector configuration
-        ignite-form-field-tooltip.tipLabel
-            | 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}")')
-            .col-sm-6
-                .settings-row
-                    +checkbox('Enabled', enabled, '"restEnabled"', 'Flag 
indicating whether to configure connector configuration')
-                .settings-row
-                    +text-enabled('Jetty configuration path:', model + 
'.jettyPath', '"connectorJettyPath"', enabled, 'false', 'Input path to Jetty 
configuration',
-                        'Path, either absolute or relative to IGNITE_HOME, to 
Jetty XML configuration file<br/>\
-                        Jetty is used to support REST over HTTP protocol for 
accessing Ignite APIs remotely<br/>\
-                        If not provided, Jetty instance with default 
configuration will be started picking IgniteSystemProperties.IGNITE_JETTY_HOST 
and IgniteSystemProperties.IGNITE_JETTY_PORT as host and port respectively')
-                .settings-row
-                    +text-ip-address('TCP host:', model + '.host', 
'"connectorHost"', enabled, 'IgniteConfiguration#getLocalHost()',
-                        'Host for TCP binary protocol server<br/>\
-                        This can be either an IP address or a domain name<br/>\
-                        If not defined, system - wide local address will be 
used IgniteConfiguration#getLocalHost()<br/>\
-                        You can also use "0.0.0.0" value to bind to all 
locally - available IP addresses')
-                .settings-row
-                    +number-min-max('TCP port:', model + '.port', 
'"connectorPort"', enabled, '11211', '1024', '65535', 'Port for TCP binary 
protocol server')
-                .settings-row
-                    +number('TCP port range:', model + '.portRange', 
'"connectorPortRange"', enabled, '100', '1', 'Number of ports for TCP binary 
protocol server to try if configured port is already in use')
-                .settings-row
-                    +number('Idle query cursor timeout:', model + 
'.idleQueryCursorTimeout', '"connectorIdleQueryCursorTimeout"', enabled, 
'600000', '0',
-                        'Reject open query cursors that is not used 
timeout<br/>\
-                        If no fetch query request come within idle timeout, it 
will be removed on next check for old query cursors')
-                .settings-row
-                    +number('Idle query cursor check frequency:', model + 
'.idleQueryCursorCheckFrequency', '"connectorIdleQueryCursorCheckFrequency"', 
enabled, '60000', '0',
-                        'Idle query cursors check frequency<br/>\
-                        This setting is used to reject open query cursors that 
is not used')
-                .settings-row
-                    +number('Idle timeout:', model + '.idleTimeout', 
'"connectorIdleTimeout"', enabled, '7000', '0',
-                        'Idle timeout for REST server<br/>\
-                        This setting is used to reject half - opened 
sockets<br/>\
-                        If no packets come within idle timeout, the connection 
is closed')
-                .settings-row
-                    +number('Receive buffer size:', model + 
'.receiveBufferSize', '"connectorReceiveBufferSize"', enabled, '32768', '0', 
'REST TCP server receive buffer size')
-                .settings-row
-                    +number('Send buffer size:', model + '.sendBufferSize', 
'"connectorSendBufferSize"', enabled, '32768', '0', 'REST TCP server send 
buffer size')
-                .settings-row
-                    +number('Send queue limit:', model + '.sendQueueLimit', 
'"connectorSendQueueLimit"', enabled, 'unlimited', '0',
-                        'REST TCP server send queue limit<br/>\
-                        If the limit exceeds, all successive writes will block 
until the queue has enough capacity')
-                .settings-row
-                    +checkbox-enabled('Direct buffer', model + 
'.directBuffer', '"connectorDirectBuffer"', enabled,
-                        'Flag indicating whether REST TCP server should use 
direct buffers<br/>\
-                        A direct buffer is a buffer that is allocated and 
accessed using native system calls, without using JVM heap<br/>\
-                        Enabling direct buffer may improve performance and 
avoid memory issues(long GC pauses due to huge buffer size)')
-                .settings-row
-                    +checkbox-enabled('TCP_NODELAY option', model + 
'.noDelay', '"connectorNoDelay"', enabled,
-                        'Flag indicating whether TCP_NODELAY option should be 
set for accepted client connections<br/>\
-                        Setting this option reduces network latency and should 
be enabled in majority of cases<br/>\
-                        For more information, see 
Socket#setTcpNoDelay(boolean)')
-                .settings-row
-                    +number('Selector count:', model + '.selectorCount', 
'"connectorSelectorCount"', enabled, 'min(4, availableProcessors)', '1',
-                        'Number of selector threads in REST TCP server<br/>\
-                        Higher value for this parameter may increase 
throughput, but also increases context switching')
-                .settings-row
-                    +number('Thread pool size:', model + '.threadPoolSize', 
'"connectorThreadPoolSize"', enabled, 'max(8, availableProcessors) * 2', '1',
-                        'Thread pool size to use for processing of client 
messages (REST requests)')
-                .settings-row
-                    +java-class('Message interceptor:', model + 
'.messageInterceptor', '"connectorMessageInterceptor"', enabled, 'false',
-                        'Interceptor allows to transform all objects exchanged 
via REST protocol<br/>\
-                        For example if you use custom serialisation on client 
you can write interceptor to transform binary representations received from 
client to Java objects and later access them from java code directly')
-                .settings-row
-                    +text-enabled('Secret key:', model + '.secretKey', 
'"connectorSecretKey"', enabled, 'false', 'Specify to enable authentication', 
'Secret key to authenticate REST requests')
-                .settings-row
-                    +checkbox-enabled('Enable SSL', model + '.sslEnabled', 
'"connectorSslEnabled"', enabled, 'Enables/disables SSL for REST TCP binary 
protocol')
-                .settings-row
-                    +checkbox-enabled('Enable SSL client auth', model + 
'.sslClientAuth', '"connectorSslClientAuth"', sslEnabled, 'Flag indicating 
whether or not SSL client authentication is required')
-                .settings-row
-                    +java-class('SSL factory:', model + '.sslFactory', 
'"connectorSslFactory"', sslEnabled, sslEnabled,
-                        'Instance of Factory that will be used to create an 
instance of SSLContext for Secure Socket Layer on TCP binary protocol')
-            .col-sm-6
-                +preview-xml-java(model, 'clusterConnector')

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/app/modules/states/configuration/clusters/connector.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/connector.pug
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/connector.pug
new file mode 100644
index 0000000..b145ce2
--- /dev/null
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/connector.pug
@@ -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
+
+-var form = 'connector'
+-var model = 'backupItem.connector'
+-var enabled = model + '.enabled'
+-var sslEnabled = enabled + ' && ' + model + '.sslEnabled'
+
+.panel.panel-default(ng-form=form novalidate)
+    .panel-heading(bs-collapse-toggle ng-click=`ui.loadPanel('${form}')`)
+        ignite-form-panel-chevron
+        label Connector configuration
+        ignite-form-field-tooltip.tipLabel
+            | 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}')`)
+            .col-sm-6
+                .settings-row
+                    +checkbox('Enabled', enabled, '"restEnabled"', 'Flag 
indicating whether to configure connector configuration')
+                .settings-row
+                    +text-enabled('Jetty configuration path:', 
`${model}.jettyPath`, '"connectorJettyPath"', enabled, 'false', 'Input path to 
Jetty configuration',
+                        'Path, either absolute or relative to IGNITE_HOME, to 
Jetty XML configuration file<br/>\
+                        Jetty is used to support REST over HTTP protocol for 
accessing Ignite APIs remotely<br/>\
+                        If not provided, Jetty instance with default 
configuration will be started picking IgniteSystemProperties.IGNITE_JETTY_HOST 
and IgniteSystemProperties.IGNITE_JETTY_PORT as host and port respectively')
+                .settings-row
+                    +text-ip-address('TCP host:', `${model}.host`, 
'"connectorHost"', enabled, 'IgniteConfiguration#getLocalHost()',
+                        'Host for TCP binary protocol server<br/>\
+                        This can be either an IP address or a domain name<br/>\
+                        If not defined, system - wide local address will be 
used IgniteConfiguration#getLocalHost()<br/>\
+                        You can also use "0.0.0.0" value to bind to all 
locally - available IP addresses')
+                .settings-row
+                    +number-min-max('TCP port:', `${model}.port`, 
'"connectorPort"', enabled, '11211', '1024', '65535', 'Port for TCP binary 
protocol server')
+                .settings-row
+                    +number('TCP port range:', `${model}.portRange`, 
'"connectorPortRange"', enabled, '100', '1', 'Number of ports for TCP binary 
protocol server to try if configured port is already in use')
+                .settings-row
+                    +number('Idle query cursor timeout:', 
`${model}.idleQueryCursorTimeout`, '"connectorIdleQueryCursorTimeout"', 
enabled, '600000', '0',
+                        'Reject open query cursors that is not used 
timeout<br/>\
+                        If no fetch query request come within idle timeout, it 
will be removed on next check for old query cursors')
+                .settings-row
+                    +number('Idle query cursor check frequency:', 
`${model}.idleQueryCursorCheckFrequency`, 
'"connectorIdleQueryCursorCheckFrequency"', enabled, '60000', '0',
+                        'Idle query cursors check frequency<br/>\
+                        This setting is used to reject open query cursors that 
is not used')
+                .settings-row
+                    +number('Idle timeout:', `${model}.idleTimeout`, 
'"connectorIdleTimeout"', enabled, '7000', '0',
+                        'Idle timeout for REST server<br/>\
+                        This setting is used to reject half - opened 
sockets<br/>\
+                        If no packets come within idle timeout, the connection 
is closed')
+                .settings-row
+                    +number('Receive buffer size:', 
`${model}.receiveBufferSize`, '"connectorReceiveBufferSize"', enabled, '32768', 
'0', 'REST TCP server receive buffer size')
+                .settings-row
+                    +number('Send buffer size:', `${model}.sendBufferSize`, 
'"connectorSendBufferSize"', enabled, '32768', '0', 'REST TCP server send 
buffer size')
+                .settings-row
+                    +number('Send queue limit:', `${model}.sendQueueLimit`, 
'"connectorSendQueueLimit"', enabled, 'unlimited', '0',
+                        'REST TCP server send queue limit<br/>\
+                        If the limit exceeds, all successive writes will block 
until the queue has enough capacity')
+                .settings-row
+                    +checkbox-enabled('Direct buffer', 
`${model}.directBuffer`, '"connectorDirectBuffer"', enabled,
+                        'Flag indicating whether REST TCP server should use 
direct buffers<br/>\
+                        A direct buffer is a buffer that is allocated and 
accessed using native system calls, without using JVM heap<br/>\
+                        Enabling direct buffer may improve performance and 
avoid memory issues(long GC pauses due to huge buffer size)')
+                .settings-row
+                    +checkbox-enabled('TCP_NODELAY option', 
`${model}.noDelay`, '"connectorNoDelay"', enabled,
+                        'Flag indicating whether TCP_NODELAY option should be 
set for accepted client connections<br/>\
+                        Setting this option reduces network latency and should 
be enabled in majority of cases<br/>\
+                        For more information, see 
Socket#setTcpNoDelay(boolean)')
+                .settings-row
+                    +number('Selector count:', `${model}.selectorCount`, 
'"connectorSelectorCount"', enabled, 'min(4, availableProcessors)', '1',
+                        'Number of selector threads in REST TCP server<br/>\
+                        Higher value for this parameter may increase 
throughput, but also increases context switching')
+                .settings-row
+                    +number('Thread pool size:', `${model}.threadPoolSize`, 
'"connectorThreadPoolSize"', enabled, 'max(8, availableProcessors) * 2', '1',
+                        'Thread pool size to use for processing of client 
messages (REST requests)')
+                .settings-row
+                    +java-class('Message interceptor:', 
`${model}.messageInterceptor`, '"connectorMessageInterceptor"', enabled, 
'false',
+                        'Interceptor allows to transform all objects exchanged 
via REST protocol<br/>\
+                        For example if you use custom serialisation on client 
you can write interceptor to transform binary representations received from 
client to Java objects and later access them from java code directly')
+                .settings-row
+                    +text-enabled('Secret key:', `${model}.secretKey`, 
'"connectorSecretKey"', enabled, 'false', 'Specify to enable authentication', 
'Secret key to authenticate REST requests')
+                .settings-row
+                    +checkbox-enabled('Enable SSL', `${model}.sslEnabled`, 
'"connectorSslEnabled"', enabled, 'Enables/disables SSL for REST TCP binary 
protocol')
+                .settings-row
+                    +checkbox-enabled('Enable SSL client auth', 
`${model}.sslClientAuth`, '"connectorSslClientAuth"', sslEnabled, 'Flag 
indicating whether or not SSL client authentication is required')
+                .settings-row
+                    +java-class('SSL factory:', `${model}.sslFactory`, 
'"connectorSslFactory"', sslEnabled, sslEnabled,
+                        'Instance of Factory that will be used to create an 
instance of SSLContext for Secure Socket Layer on TCP binary protocol')
+            .col-sm-6
+                +preview-xml-java(model, 'clusterConnector')

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/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
deleted file mode 100644
index aa99b49..0000000
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/deployment.jade
+++ /dev/null
@@ -1,237 +0,0 @@
-//-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
-include /app/helpers/jade/mixins.jade
-
--var form = 'deployment'
--var model = 'backupItem'
--var modelDeployment = 'backupItem.deploymentSpi'
--var exclude = model + '.peerClassLoadingLocalClassPathExclude'
--var enabled = 'backupItem.peerClassLoadingEnabled'
--var uriListModel = modelDeployment + '.URI.uriList'
--var scannerModel = modelDeployment + '.URI.scanners'
--var uriDeployment = modelDeployment + '.kind === "URI"'
--var localDeployment = modelDeployment + '.kind === "Local"'
--var customDeployment = modelDeployment + '.kind === "Custom"'
-
-.panel.panel-default(ng-form=form novalidate)
-    .panel-heading(bs-collapse-toggle ng-click='ui.loadPanel("#{form}")')
-        ignite-form-panel-chevron
-        label Class deployment
-        ignite-form-field-tooltip.tipLabel
-            | 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}")')
-            .col-sm-6
-                .settings-row
-                    +dropdown('Deployment mode:', model + '.deploymentMode', 
'"deploymentMode"', 'true', 'SHARED',
-                        '[\
-                            {value: "PRIVATE", label: "PRIVATE"},\
-                            {value: "ISOLATED", label: "ISOLATED"}, \
-                            {value: "SHARED", label: "SHARED"},\
-                            {value: "CONTINUOUS", label: "CONTINUOUS"}\
-                        ]',
-                        'Task classes and resources sharing mode<br/>\
-                        The following deployment modes are supported:\
-                        <ul>\
-                            <li>PRIVATE - in this mode deployed classes do not 
share resources</li>\
-                            <li>ISOLATED - in this mode tasks or classes 
deployed within the same class loader will share the same instances of 
resources</li>\
-                            <li>SHARED - same as ISOLATED, but now tasks from 
different master nodes with the same user version and same class loader will 
share the same class loader on remote nodes</li>\
-                            <li>CONTINUOUS - same as SHARED deployment mode, 
but resources will not be undeployed even after all master nodes left grid</li>\
-                        </ul>')
-                .settings-row
-                    +checkbox('Enable peer class loading', model + 
'.peerClassLoadingEnabled', '"peerClassLoadingEnabled"', 'Enables/disables peer 
class loading')
-                .settings-row
-                    +number('Missed resources cache size:', model + 
'.peerClassLoadingMissedResourcesCacheSize', 
'"peerClassLoadingMissedResourcesCacheSize"', enabled, '100', '0',
-                        'If size greater than 0, missed resources will be 
cached and next resource request ignored<br/>\
-                        If size is 0, then request for the resource will be 
sent to the remote node every time this resource is requested')
-                .settings-row
-                    +number('Pool size:', model + 
'.peerClassLoadingThreadPoolSize', '"peerClassLoadingThreadPoolSize"', enabled, 
'2', '1', 'Thread pool size to use for peer class loading')
-                .settings-row
-                    +ignite-form-group
-                        -var uniqueTip = 'Such package already exists'
-
-                        ignite-form-field-label
-                            | Local class path exclude
-                        ignite-form-group-tooltip
-                            | List of packages from the system classpath that 
need to be peer-to-peer loaded from task originating node<br/>
-                            | '*' is supported at the end of the package name 
which means that all sub-packages and their classes are included like in Java 
package import clause
-                        ignite-form-group-add(ng-show='#{enabled}' 
ng-click='(group.add = [{}])')
-                            | Add package name.
-
-                        .group-content(ng-if=exclude + '.length')
-                            -var model = 'obj.model';
-                            -var name = '"edit" + $index'
-                            -var valid = form + '[' + name + '].$valid'
-                            -var save = exclude + '[$index] = ' + model
-
-                            div(ng-show=enabled)
-                                div(ng-repeat='model in #{exclude} track by 
$index' ng-init='obj = {}')
-                                    label.col-xs-12.col-sm-12.col-md-12
-                                        .indexField
-                                            | {{ $index+1 }})
-                                        +table-remove-button(exclude, 'Remove 
package name')
-                                        span(ng-hide='field.edit')
-                                            
a.labelFormField(ng-click='(field.edit = true) && (#{model} = model)') {{ model 
}}
-                                        span(ng-if='field.edit')
-                                            +table-java-package-field(name, 
model, exclude, valid, save, false)
-                                                +table-save-button(valid, 
save, false)
-                                                +unique-feedback(name, 
uniqueTip)
-
-                            div(ng-hide=enabled)
-                                div(ng-repeat='model in #{exclude} track by 
$index')
-                                    label.col-xs-12.col-sm-12.col-md-12
-                                        .labelFormField.labelField
-                                            | {{ $index+1 }})
-                                        span.labelFormField
-                                            | {{ model }}
-
-                        .group-content(ng-repeat='field in group.add')
-                            -var model = 'new';
-                            -var name = '"new"'
-                            -var valid = form + '[' + name + '].$valid'
-                            -var save = exclude + '.push(' + model + ')'
-
-                            div(type='internal' name='Package name')
-                                label.col-xs-12.col-sm-12.col-md-12
-                                    +table-java-package-field(name, model, 
exclude, valid, save, true)
-                                        +table-save-button(valid, save, true)
-                                        +unique-feedback(name, uniqueTip)
-
-                        .group-content-empty(ng-if='!(#{exclude}.length) && 
!group.add.length')
-                            | Not defined
-                .settings-row
-                    +dropdown('Deployment variant:', modelDeployment + 
'.kind', '"deploymentKind"', 'true', 'Default',
-                        '[\
-                            {value: "URI", label: "URI"},\
-                            {value: "Local", label: "Local"}, \
-                            {value: "Custom", label: "Custom"},\
-                            {value: undefined, label: "Default"}\
-                        ]',
-                        'Grid deployment SPI is in charge of deploying tasks 
and classes from different sources:\
-                        <ul>\
-                            <li>URI - Deploy tasks from different sources like 
file system folders, email and HTTP</li>\
-                            <li>Local - Only within VM deployment on local 
node</li>\
-                            <li>Custom - Custom implementation of 
DeploymentSpi</li>\
-                            <li>Default - Default configuration of 
LocalDeploymentSpi will be used</li>\
-                        </ul>')
-                .panel-details(ng-show=uriDeployment)
-                    .details-row
-                        +ignite-form-group()
-                            -var uniqueTip = 'Such URI already configured'
-
-                            ignite-form-field-label
-                                | URI list
-                            ignite-form-group-tooltip
-                                | List of URI which point to GAR file and 
which should be scanned by SPI for the new tasks
-                            ignite-form-group-add(ng-click='(group.add = 
[{}])')
-                                | Add URI.
-
-                            .group-content(ng-if=uriListModel + '.length')
-                                -var model = 'obj.model';
-                                -var name = '"edit" + $index'
-                                -var valid = form + '[' + name + '].$valid'
-                                -var save = uriListModel + '[$index] = ' + 
model
-
-                                div(ng-repeat='model in #{uriListModel} track 
by $index' ng-init='obj = {}')
-                                    label.col-xs-12.col-sm-12.col-md-12
-                                        .indexField
-                                            | {{ $index+1 }})
-                                        +table-remove-button(uriListModel, 
'Remove URI')
-                                        span(ng-hide='field.edit')
-                                            
a.labelFormField(ng-click='(field.edit = true) && (#{model} = model)') {{ model 
}}
-                                        span(ng-if='field.edit')
-                                            +table-url-field(name, model, 
uriListModel, valid, save, 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 = uriListModel + '.push(' + model + 
')'
-
-                                div(type='internal' name='URI')
-                                    label.col-xs-12.col-sm-12.col-md-12
-                                        +table-url-field(name, model, 
uriListModel, valid, save, true)
-                                            +table-save-button(valid, save, 
true)
-                                            +unique-feedback(name, uniqueTip)
-
-                            
.group-content-empty(ng-if='!(#{uriListModel}.length) && !group.add.length')
-                                | Not defined
-                    .details-row
-                        +text('Temporary directory path:', modelDeployment + 
'.URI.temporaryDirectoryPath', '"DeploymentURITemporaryDirectoryPath"', 
'false', 'Temporary directory path',
-                        'Absolute path to temporary directory which will be 
used by deployment SPI to keep all deployed classes in')
-                    .details-row
-                        +ignite-form-group()
-                            -var uniqueTip = 'Such scanner already configured'
-
-                            ignite-form-field-label
-                                | Scanner list
-                            ignite-form-group-tooltip
-                                | List of URI deployment scanners
-                            ignite-form-group-add(ng-click='(group.add = 
[{}])')
-                                | Add scanner
-
-                            .group-content(ng-if=scannerModel + '.length')
-                                -var model = 'obj.model';
-                                -var name = '"edit" + $index'
-                                -var valid = form + '[' + name + '].$valid'
-                                -var save = scannerModel + '[$index] = ' + 
model
-
-                                div(ng-repeat='model in #{scannerModel} track 
by $index' ng-init='obj = {}')
-                                    label.col-xs-12.col-sm-12.col-md-12
-                                        .indexField
-                                            | {{ $index+1 }})
-                                        +table-remove-button(scannerModel, 
'Remove scanner')
-                                        span(ng-hide='field.edit')
-                                            
a.labelFormField(ng-click='(field.edit = true) && (#{model} = model)') {{ model 
}}
-                                        span(ng-if='field.edit')
-                                            
+table-java-class-field('Scanner:', name, model, scannerModel, valid, save, 
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 = scannerModel + '.push(' + model + 
')'
-
-                                div(type='internal' name='Scanner')
-                                    label.col-xs-12.col-sm-12.col-md-12
-                                        // (lbl, name, model, items, valid, 
save, newItem)
-                                        +table-java-class-field('Scanner:', 
name, model, scannerModel, valid, save, true)
-                                            +table-save-button(valid, save, 
true)
-                                            +unique-feedback(name, uniqueTip)
-
-                            
.group-content-empty(ng-if='!(#{scannerModel}.length) && !group.add.length')
-                                | Not defined
-                    .details-row
-                        +java-class('Listener:', modelDeployment + 
'.URI.listener', '"DeploymentURIListener"', 'true', 'false', 'Deployment event 
listener', uriDeployment)
-                    .details-row
-                        +checkbox('Check MD5', modelDeployment + 
'.URI.checkMd5', '"DeploymentURICheckMd5"', 'Exclude files with same md5s from 
deployment')
-                    .details-row
-                        +checkbox('Encode URI', modelDeployment + 
'.URI.encodeUri', '"DeploymentURIEncodeUri"', 'URI must be encoded before 
usage')
-                .panel-details(ng-show=localDeployment)
-                    .details-row
-                        +java-class('Listener:', modelDeployment + 
'.Local.listener', '"DeploymentLocalListener"', 'true', 'false', 'Deployment 
event listener', localDeployment)
-                .panel-details(ng-show=customDeployment)
-                    .details-row
-                        +java-class('Class:', modelDeployment + 
'.Custom.className', '"DeploymentCustom"', 'true', customDeployment, 
'DeploymentSpi implementation class', customDeployment)
-            .col-sm-6
-                +preview-xml-java(model, 'clusterDeployment')

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/app/modules/states/configuration/clusters/deployment.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/deployment.pug
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/deployment.pug
new file mode 100644
index 0000000..2021c1c
--- /dev/null
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/deployment.pug
@@ -0,0 +1,237 @@
+//-
+    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
+
+-var form = 'deployment'
+-var model = 'backupItem'
+-var modelDeployment = 'backupItem.deploymentSpi'
+-var exclude = model + '.peerClassLoadingLocalClassPathExclude'
+-var enabled = 'backupItem.peerClassLoadingEnabled'
+-var uriListModel = modelDeployment + '.URI.uriList'
+-var scannerModel = modelDeployment + '.URI.scanners'
+-var uriDeployment = modelDeployment + '.kind === "URI"'
+-var localDeployment = modelDeployment + '.kind === "Local"'
+-var customDeployment = modelDeployment + '.kind === "Custom"'
+
+.panel.panel-default(ng-form=form novalidate)
+    .panel-heading(bs-collapse-toggle ng-click=`ui.loadPanel('${form}')`)
+        ignite-form-panel-chevron
+        label Class deployment
+        ignite-form-field-tooltip.tipLabel
+            | 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}')`)
+            .col-sm-6
+                .settings-row
+                    +dropdown('Deployment mode:', `${model}.deploymentMode`, 
'"deploymentMode"', 'true', 'SHARED',
+                        '[\
+                            {value: "PRIVATE", label: "PRIVATE"},\
+                            {value: "ISOLATED", label: "ISOLATED"}, \
+                            {value: "SHARED", label: "SHARED"},\
+                            {value: "CONTINUOUS", label: "CONTINUOUS"}\
+                        ]',
+                        'Task classes and resources sharing mode<br/>\
+                        The following deployment modes are supported:\
+                        <ul>\
+                            <li>PRIVATE - in this mode deployed classes do not 
share resources</li>\
+                            <li>ISOLATED - in this mode tasks or classes 
deployed within the same class loader will share the same instances of 
resources</li>\
+                            <li>SHARED - same as ISOLATED, but now tasks from 
different master nodes with the same user version and same class loader will 
share the same class loader on remote nodes</li>\
+                            <li>CONTINUOUS - same as SHARED deployment mode, 
but resources will not be undeployed even after all master nodes left grid</li>\
+                        </ul>')
+                .settings-row
+                    +checkbox('Enable peer class loading', 
`${model}.peerClassLoadingEnabled`, '"peerClassLoadingEnabled"', 
'Enables/disables peer class loading')
+                .settings-row
+                    +number('Missed resources cache size:', 
`${model}.peerClassLoadingMissedResourcesCacheSize`, 
'"peerClassLoadingMissedResourcesCacheSize"', enabled, '100', '0',
+                        'If size greater than 0, missed resources will be 
cached and next resource request ignored<br/>\
+                        If size is 0, then request for the resource will be 
sent to the remote node every time this resource is requested')
+                .settings-row
+                    +number('Pool size:', 
`${model}.peerClassLoadingThreadPoolSize`, '"peerClassLoadingThreadPoolSize"', 
enabled, '2', '1', 'Thread pool size to use for peer class loading')
+                .settings-row
+                    +ignite-form-group
+                        -var uniqueTip = 'Such package already exists'
+
+                        ignite-form-field-label
+                            | Local class path exclude
+                        ignite-form-group-tooltip
+                            | List of packages from the system classpath that 
need to be peer-to-peer loaded from task originating node<br/>
+                            | '*' is supported at the end of the package name 
which means that all sub-packages and their classes are included like in Java 
package import clause
+                        ignite-form-group-add(ng-show=`${enabled}` 
ng-click='(group.add = [{}])')
+                            | Add package name.
+
+                        .group-content(ng-if=`${exclude}.length`)
+                            -var model = 'obj.model';
+                            -var name = '"edit" + $index'
+                            -var valid = `${form}[${name}].$valid`
+                            -var save = `${exclude}[$index] = ${model}`
+
+                            div(ng-show=enabled)
+                                div(ng-repeat=`model in ${exclude} track by 
$index` ng-init='obj = {}')
+                                    label.col-xs-12.col-sm-12.col-md-12
+                                        .indexField
+                                            | {{ $index+1 }})
+                                        +table-remove-button(exclude, 'Remove 
package name')
+                                        span(ng-hide='field.edit')
+                                            
a.labelFormField(ng-click=`(field.edit = true) && (${model} = model)`) {{ model 
}}
+                                        span(ng-if='field.edit')
+                                            +table-java-package-field(name, 
model, exclude, valid, save, false)
+                                                +table-save-button(valid, 
save, false)
+                                                +unique-feedback(name, 
uniqueTip)
+
+                            div(ng-hide=enabled)
+                                div(ng-repeat=`model in ${exclude} track by 
$index`)
+                                    label.col-xs-12.col-sm-12.col-md-12
+                                        .labelFormField.labelField
+                                            | {{ $index+1 }})
+                                        span.labelFormField
+                                            | {{ model }}
+
+                        .group-content(ng-repeat='field in group.add')
+                            -var model = 'new';
+                            -var name = '"new"'
+                            -var valid = `${form}[${name}].$valid`
+                            -var save = `${exclude}.push(${model})`
+
+                            div(type='internal' name='Package name')
+                                label.col-xs-12.col-sm-12.col-md-12
+                                    +table-java-package-field(name, model, 
exclude, valid, save, true)
+                                        +table-save-button(valid, save, true)
+                                        +unique-feedback(name, uniqueTip)
+
+                        .group-content-empty(ng-if=`!(${exclude}.length) && 
!group.add.length`)
+                            | Not defined
+                .settings-row
+                    +dropdown('Deployment variant:', modelDeployment + 
'.kind', '"deploymentKind"', 'true', 'Default',
+                        '[\
+                            {value: "URI", label: "URI"},\
+                            {value: "Local", label: "Local"}, \
+                            {value: "Custom", label: "Custom"},\
+                            {value: undefined, label: "Default"}\
+                        ]',
+                        'Grid deployment SPI is in charge of deploying tasks 
and classes from different sources:\
+                        <ul>\
+                            <li>URI - Deploy tasks from different sources like 
file system folders, email and HTTP</li>\
+                            <li>Local - Only within VM deployment on local 
node</li>\
+                            <li>Custom - Custom implementation of 
DeploymentSpi</li>\
+                            <li>Default - Default configuration of 
LocalDeploymentSpi will be used</li>\
+                        </ul>')
+                .panel-details(ng-show=uriDeployment)
+                    .details-row
+                        +ignite-form-group()
+                            -var uniqueTip = 'Such URI already configured'
+
+                            ignite-form-field-label
+                                | URI list
+                            ignite-form-group-tooltip
+                                | List of URI which point to GAR file and 
which should be scanned by SPI for the new tasks
+                            ignite-form-group-add(ng-click='(group.add = 
[{}])')
+                                | Add URI.
+
+                            .group-content(ng-if=uriListModel + '.length')
+                                -var model = 'obj.model';
+                                -var name = '"edit" + $index'
+                                -var valid = `${form}[${name}].$valid`
+                                -var save = `${uriListModel}[$index] = 
${model}`
+
+                                div(ng-repeat=`model in ${uriListModel} track 
by $index` ng-init='obj = {}')
+                                    label.col-xs-12.col-sm-12.col-md-12
+                                        .indexField
+                                            | {{ $index+1 }})
+                                        +table-remove-button(uriListModel, 
'Remove URI')
+                                        span(ng-hide='field.edit')
+                                            
a.labelFormField(ng-click=`(field.edit = true) && (${model} = model)`) {{ model 
}}
+                                        span(ng-if='field.edit')
+                                            +table-url-field(name, model, 
uriListModel, valid, save, 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 = `${uriListModel}.push(${model})`
+
+                                div(type='internal' name='URI')
+                                    label.col-xs-12.col-sm-12.col-md-12
+                                        +table-url-field(name, model, 
uriListModel, valid, save, true)
+                                            +table-save-button(valid, save, 
true)
+                                            +unique-feedback(name, uniqueTip)
+
+                            
.group-content-empty(ng-if=`!(${uriListModel}.length) && !group.add.length`)
+                                | Not defined
+                    .details-row
+                        +text('Temporary directory path:', modelDeployment + 
'.URI.temporaryDirectoryPath', '"DeploymentURITemporaryDirectoryPath"', 
'false', 'Temporary directory path',
+                        'Absolute path to temporary directory which will be 
used by deployment SPI to keep all deployed classes in')
+                    .details-row
+                        +ignite-form-group()
+                            -var uniqueTip = 'Such scanner already configured'
+
+                            ignite-form-field-label
+                                | Scanner list
+                            ignite-form-group-tooltip
+                                | List of URI deployment scanners
+                            ignite-form-group-add(ng-click='(group.add = 
[{}])')
+                                | Add scanner
+
+                            .group-content(ng-if=scannerModel + '.length')
+                                -var model = 'obj.model';
+                                -var name = '"edit" + $index'
+                                -var valid = `${form}[${name}].$valid`
+                                -var save = `${scannerModel}[$index] = 
${model}`
+
+                                div(ng-repeat=`model in ${scannerModel} track 
by $index` ng-init='obj = {}')
+                                    label.col-xs-12.col-sm-12.col-md-12
+                                        .indexField
+                                            | {{ $index+1 }})
+                                        +table-remove-button(scannerModel, 
'Remove scanner')
+                                        span(ng-hide='field.edit')
+                                            
a.labelFormField(ng-click=`(field.edit = true) && (${model} = model)`) {{ model 
}}
+                                        span(ng-if='field.edit')
+                                            
+table-java-class-field('Scanner:', name, model, scannerModel, valid, save, 
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 = `${scannerModel}.push(${model})`
+
+                                div(type='internal' name='Scanner')
+                                    label.col-xs-12.col-sm-12.col-md-12
+                                        // (lbl, name, model, items, valid, 
save, newItem)
+                                        +table-java-class-field('Scanner:', 
name, model, scannerModel, valid, save, true)
+                                            +table-save-button(valid, save, 
true)
+                                            +unique-feedback(name, uniqueTip)
+
+                            
.group-content-empty(ng-if=`!(${scannerModel}.length) && !group.add.length`)
+                                | Not defined
+                    .details-row
+                        +java-class('Listener:', 
`${modelDeployment}.URI.listener`, '"DeploymentURIListener"', 'true', 'false', 
'Deployment event listener', uriDeployment)
+                    .details-row
+                        +checkbox('Check MD5', 
`${modelDeployment}.URI.checkMd5`, '"DeploymentURICheckMd5"', 'Exclude files 
with same md5s from deployment')
+                    .details-row
+                        +checkbox('Encode URI', 
`${modelDeployment}.URI.encodeUri`, '"DeploymentURIEncodeUri"', 'URI must be 
encoded before usage')
+                .panel-details(ng-show=localDeployment)
+                    .details-row
+                        +java-class('Listener:', 
`${modelDeployment}.Local.listener`, '"DeploymentLocalListener"', 'true', 
'false', 'Deployment event listener', localDeployment)
+                .panel-details(ng-show=customDeployment)
+                    .details-row
+                        +java-class('Class:', 
`${modelDeployment}.Custom.className`, '"DeploymentCustom"', 'true', 
customDeployment, 'DeploymentSpi implementation class', customDeployment)
+            .col-sm-6
+                +preview-xml-java(model, 'clusterDeployment')

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/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
deleted file mode 100644
index 3bf0e29..0000000
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/discovery.jade
+++ /dev/null
@@ -1,88 +0,0 @@
-//-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
-include /app/helpers/jade/mixins.jade
-
--var form = 'discovery'
--var model = 'backupItem.discovery'
-
-.panel.panel-default(ng-form=form novalidate)
-    .panel-heading(bs-collapse-toggle ng-click='ui.loadPanel("#{form}")')
-        ignite-form-panel-chevron
-        label Discovery
-        ignite-form-field-tooltip.tipLabel
-            | 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}")')
-            .col-sm-6
-                .settings-row
-                    +text-ip-address('Local address:', model + 
'.localAddress', '"discoLocalAddress"', 'true', '228.1.2.4',
-                        'Local host IP address that discovery SPI uses<br/>\
-                        If not provided a first found non-loopback address 
will be used')
-                .settings-row
-                    +number-min-max('Local port:', model + '.localPort', 
'"discoLocalPort"', 'true', '47500', '1024', '65535', 'Local port which node 
uses')
-                .settings-row
-                    +number('Local port range:', model + '.localPortRange', 
'"discoLocalPortRange"', 'true', '100', '1', 'Local port range')
-                .settings-row
-                    +java-class('Address resolver:', model + 
'.addressResolver', '"discoAddressResolver"', 'true', 'false',
-                        'Provides resolution between external and internal 
addresses')
-                .settings-row
-                    +number('Socket timeout:', model + '.socketTimeout', 
'"socketTimeout"', 'true', '5000', '0', 'Socket operations timeout')
-                .settings-row
-                    +number('Acknowledgement timeout:', model + '.ackTimeout', 
'"ackTimeout"', 'true', '5000', '0', 'Message acknowledgement timeout')
-                .settings-row
-                    +number('Max acknowledgement timeout:', model + 
'.maxAckTimeout', '"maxAckTimeout"', 'true', '600000', '0', 'Maximum message 
acknowledgement timeout')
-                .settings-row
-                    +number('Network timeout:', model + '.networkTimeout', 
'"discoNetworkTimeout"', 'true', '5000', '1', 'Timeout to use for network 
operations')
-                .settings-row
-                    +number('Join timeout:', model + '.joinTimeout', 
'"joinTimeout"', 'true', '0', '0',
-                        'Join timeout<br/>' +
-                        '0 means wait forever')
-                .settings-row
-                    +number('Thread priority:', model + '.threadPriority', 
'"threadPriority"', 'true', '10', '1', 'Thread priority for all threads started 
by SPI')
-                .settings-row
-                    +number('Heartbeat frequency:', model + 
'.heartbeatFrequency', '"heartbeatFrequency"', 'true', '2000', '1', 'Heartbeat 
messages issuing frequency')
-                .settings-row
-                    +number('Max heartbeats miss w/o init:', model + 
'.maxMissedHeartbeats', '"maxMissedHeartbeats"', 'true', '1', '1',
-                        'Max heartbeats count node can miss without initiating 
status check')
-                .settings-row
-                    +number('Max missed client heartbeats:', model + 
'.maxMissedClientHeartbeats', '"maxMissedClientHeartbeats"', 'true', '5', '1',
-                        'Max heartbeats count node can miss without failing 
client node')
-                .settings-row
-                    +number('Topology history:', model + '.topHistorySize', 
'"topHistorySize"', 'true', '1000', '0', 'Size of topology snapshots history')
-                .settings-row
-                    +java-class('Discovery listener:', model + '.listener', 
'"discoListener"', 'true', 'false', 'Listener for grid node discovery events')
-                .settings-row
-                    +java-class('Data exchange:', model + '.dataExchange', 
'"dataExchange"', 'true', 'false', 'Class name of handler for initial data 
exchange between Ignite nodes')
-                .settings-row
-                    +java-class('Metrics provider:', model + 
'.metricsProvider', '"metricsProvider"', 'true', 'false', 'Class name of metric 
provider to discovery SPI')
-                .settings-row
-                    +number('Reconnect count:', model + '.reconnectCount', 
'"discoReconnectCount"', 'true', '10', '1', 'Reconnect attempts count')
-                .settings-row
-                    +number('Statistics frequency:', model + 
'.statisticsPrintFrequency', '"statisticsPrintFrequency"', 'true', '0', '1', 
'Statistics print frequency')
-                .settings-row
-                    +number('IP finder clean frequency:', model + 
'.ipFinderCleanFrequency', '"ipFinderCleanFrequency"', 'true', '60000', '1', 
'IP finder clean frequency')
-                .settings-row
-                    +java-class('Node authenticator:', model + 
'.authenticator', '"authenticator"', 'true', 'false', 'Class name of node 
authenticator implementation')
-                .settings-row
-                    +checkbox('Force server mode', model + '.forceServerMode', 
'"forceServerMode"', 'Force start TCP/IP discovery in server mode')
-                .settings-row
-                    +checkbox('Client reconnect disabled', model + 
'.clientReconnectDisabled', '"clientReconnectDisabled"',
-                        'Disable try of client to reconnect after server 
detected client node failure')
-            .col-sm-6
-                +preview-xml-java(model, 'clusterDiscovery')

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/app/modules/states/configuration/clusters/discovery.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/discovery.pug
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/discovery.pug
new file mode 100644
index 0000000..af9d875
--- /dev/null
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/discovery.pug
@@ -0,0 +1,88 @@
+//-
+    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
+
+-var form = 'discovery'
+-var model = 'backupItem.discovery'
+
+.panel.panel-default(ng-form=form novalidate)
+    .panel-heading(bs-collapse-toggle ng-click=`ui.loadPanel('${form}')`)
+        ignite-form-panel-chevron
+        label Discovery
+        ignite-form-field-tooltip.tipLabel
+            | 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}')`)
+            .col-sm-6
+                .settings-row
+                    +text-ip-address('Local address:', 
`${model}.localAddress`, '"discoLocalAddress"', 'true', '228.1.2.4',
+                        'Local host IP address that discovery SPI uses<br/>\
+                        If not provided a first found non-loopback address 
will be used')
+                .settings-row
+                    +number-min-max('Local port:', `${model}.localPort`, 
'"discoLocalPort"', 'true', '47500', '1024', '65535', 'Local port which node 
uses')
+                .settings-row
+                    +number('Local port range:', `${model}.localPortRange`, 
'"discoLocalPortRange"', 'true', '100', '1', 'Local port range')
+                .settings-row
+                    +java-class('Address resolver:', 
`${model}.addressResolver`, '"discoAddressResolver"', 'true', 'false',
+                        'Provides resolution between external and internal 
addresses')
+                .settings-row
+                    +number('Socket timeout:', `${model}.socketTimeout`, 
'"socketTimeout"', 'true', '5000', '0', 'Socket operations timeout')
+                .settings-row
+                    +number('Acknowledgement timeout:', `${model}.ackTimeout`, 
'"ackTimeout"', 'true', '5000', '0', 'Message acknowledgement timeout')
+                .settings-row
+                    +number('Max acknowledgement timeout:', 
`${model}.maxAckTimeout`, '"maxAckTimeout"', 'true', '600000', '0', 'Maximum 
message acknowledgement timeout')
+                .settings-row
+                    +number('Network timeout:', `${model}.networkTimeout`, 
'"discoNetworkTimeout"', 'true', '5000', '1', 'Timeout to use for network 
operations')
+                .settings-row
+                    +number('Join timeout:', `${model}.joinTimeout`, 
'"joinTimeout"', 'true', '0', '0',
+                        'Join timeout<br/>' +
+                        '0 means wait forever')
+                .settings-row
+                    +number('Thread priority:', `${model}.threadPriority`, 
'"threadPriority"', 'true', '10', '1', 'Thread priority for all threads started 
by SPI')
+                .settings-row
+                    +number('Heartbeat frequency:', 
`${model}.heartbeatFrequency`, '"heartbeatFrequency"', 'true', '2000', '1', 
'Heartbeat messages issuing frequency')
+                .settings-row
+                    +number('Max heartbeats miss w/o init:', 
`${model}.maxMissedHeartbeats`, '"maxMissedHeartbeats"', 'true', '1', '1',
+                        'Max heartbeats count node can miss without initiating 
status check')
+                .settings-row
+                    +number('Max missed client heartbeats:', 
`${model}.maxMissedClientHeartbeats`, '"maxMissedClientHeartbeats"', 'true', 
'5', '1',
+                        'Max heartbeats count node can miss without failing 
client node')
+                .settings-row
+                    +number('Topology history:', `${model}.topHistorySize`, 
'"topHistorySize"', 'true', '1000', '0', 'Size of topology snapshots history')
+                .settings-row
+                    +java-class('Discovery listener:', `${model}.listener`, 
'"discoListener"', 'true', 'false', 'Listener for grid node discovery events')
+                .settings-row
+                    +java-class('Data exchange:', `${model}.dataExchange`, 
'"dataExchange"', 'true', 'false', 'Class name of handler for initial data 
exchange between Ignite nodes')
+                .settings-row
+                    +java-class('Metrics provider:', 
`${model}.metricsProvider`, '"metricsProvider"', 'true', 'false', 'Class name 
of metric provider to discovery SPI')
+                .settings-row
+                    +number('Reconnect count:', `${model}.reconnectCount`, 
'"discoReconnectCount"', 'true', '10', '1', 'Reconnect attempts count')
+                .settings-row
+                    +number('Statistics frequency:', 
`${model}.statisticsPrintFrequency`, '"statisticsPrintFrequency"', 'true', '0', 
'1', 'Statistics print frequency')
+                .settings-row
+                    +number('IP finder clean frequency:', 
`${model}.ipFinderCleanFrequency`, '"ipFinderCleanFrequency"', 'true', '60000', 
'1', 'IP finder clean frequency')
+                .settings-row
+                    +java-class('Node authenticator:', 
`${model}.authenticator`, '"authenticator"', 'true', 'false', 'Class name of 
node authenticator implementation')
+                .settings-row
+                    +checkbox('Force server mode', `${model}.forceServerMode`, 
'"forceServerMode"', 'Force start TCP/IP discovery in server mode')
+                .settings-row
+                    +checkbox('Client reconnect disabled', 
`${model}.clientReconnectDisabled`, '"clientReconnectDisabled"',
+                        'Disable try of client to reconnect after server 
detected client node failure')
+            .col-sm-6
+                +preview-xml-java(model, 'clusterDiscovery')

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/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
deleted file mode 100644
index 643ea97..0000000
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/events.jade
+++ /dev/null
@@ -1,68 +0,0 @@
-//-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
-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#[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')
-
-                .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;', eventStorageMemory)
-
-                .settings-row(ng-show=eventStorageCustom)
-                    +java-class('Class:', modelEventStorage + 
'.Custom.className', '"EventStorageCustom"', 'true', eventStorageCustom, 'Event 
storage implementation class name', eventStorageCustom)
-
-            .col-sm-6
-                +preview-xml-java(model, 'clusterEvents')

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/app/modules/states/configuration/clusters/events.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/events.pug
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/events.pug
new file mode 100644
index 0000000..70fb714
--- /dev/null
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/events.pug
@@ -0,0 +1,68 @@
+//-
+    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
+
+-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#[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')
+
+                .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;', eventStorageMemory)
+
+                .settings-row(ng-show=eventStorageCustom)
+                    +java-class('Class:', 
`${modelEventStorage}.Custom.className`, '"EventStorageCustom"', 'true', 
eventStorageCustom, 'Event storage implementation class name', 
eventStorageCustom)
+
+            .col-sm-6
+                +preview-xml-java(model, 'clusterEvents')

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/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
deleted file mode 100644
index 1665659..0000000
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/failover.jade
+++ /dev/null
@@ -1,73 +0,0 @@
-//-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
-include /app/helpers/jade/mixins.jade
-
--var model = 'backupItem'
--var form = 'failoverSpi'
--var failoverSpi = model + '.failoverSpi'
--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#[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}")')
-            .col-sm-6
-                .settings-row(ng-init='failoverSpiTbl={type: "failoverSpi", 
model: "failoverSpi", focusId: "kind", ui: "failover-table"}')
-                    +ignite-form-group()
-                        ignite-form-field-label
-                            | Failover SPI configurations
-                        ignite-form-group-tooltip
-                            | Failover SPI configurations
-                        
ignite-form-group-add(ng-click='tableNewItem(failoverSpiTbl)')
-                            | Add failover SPI
-                        .group-content-empty(ng-if='!(#{failoverSpi} && 
#{failoverSpi}.length > 0)')
-                            | Not defined
-                        .group-content(ng-show='#{failoverSpi} && 
#{failoverSpi}.length > 0' ng-repeat='model in #{failoverSpi} track by $index')
-                            hr(ng-if='$index != 0')
-                            .settings-row
-                                +dropdown-required-autofocus('Failover SPI:', 
'model.kind', '"failoverKind" + $index', 'true', 'true', 'Choose Failover SPI', 
'[\
-                                        {value: "JobStealing", label: "Job 
stealing"},\
-                                        {value: "Never", label: "Never"},\
-                                        {value: "Always", label: "Always"},\
-                                        {value: "Custom", label: "Custom"}\
-                                    ]', 'Provides ability to supply custom 
logic for handling failed execution of a grid job\
-                                    <ul>\
-                                        <li>Job stealing - Supports job 
stealing from over-utilized nodes to under-utilized nodes</li>\
-                                        <li>Never - Jobs are ordered as they 
arrived</li>\
-                                        <li>Always - Jobs are first ordered by 
their priority</li>\
-                                        <li>Custom - Jobs are activated 
immediately on arrival to mapped node</li>\
-                                        <li>Default - Default FailoverSpi 
implementation</li>\
-                                    </ul>')
-
-                                    +table-remove-button(failoverSpi, 'Remove 
Failover SPI')
-                            .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='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', 
'model.Custom.class', '"failoverSpiClass" + $index', 'true', failoverCustom,
-                                    'Custom FailoverSpi implementation class 
name.', failoverCustom)
-            .col-sm-6
-                +preview-xml-java(model, 'clusterFailover')

Reply via email to