http://git-wip-us.apache.org/repos/asf/ignite/blob/d24dab81/modules/web-console/frontend/app/modules/states/configuration/caches/store.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/caches/store.pug
 
b/modules/web-console/frontend/app/modules/states/configuration/caches/store.pug
index 4cfbbaf..32d966a 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/caches/store.pug
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/caches/store.pug
@@ -42,272 +42,269 @@ mixin hibernateField(name, model, items, valid, save, 
newItem)
                 ignite-on-escape=onEscape
             )
 
-.pca-panel(ng-form=form novalidate)
-    .pca-panel-heading(bs-collapse-toggle='' 
ng-click=`ui.loadPanel('${form}')`)
-        ignite-form-panel-chevron
-        .pca-panel-heading-title Store
-        .pca-panel-heading-description
-            | Cache store settings. 
-            | 
#[a.link-success(href="https://apacheignite.readme.io/docs/3rd-party-store"; 
target="_blank") More info]
-    .pca-panel-collapse(role='tabpanel' bs-collapse-target id=`${form}`)
-        .pca-panel-body.pca-form-row(ng-if=`ui.isPanelLoaded('${form}')`)
-            .pca-form-column-6.pc-form-grid-row
-                -var storeFactory = `${model}.cacheStoreFactory`;
-                -var storeFactoryKind = `${storeFactory}.kind`;
-                .pc-form-grid-col-60
-                    +sane-ignite-form-field-dropdown({
-                        label: 'Store factory:',
-                        model: storeFactoryKind,
-                        name: '"cacheStoreFactory"',
-                        placeholder: '{{ 
::$ctrl.Caches.cacheStoreFactory.kind.default }}',
-                        options: '::$ctrl.Caches.cacheStoreFactory.values',
-                        tip: `Factory for persistent storage for cache data
-                        <ul>
-                            <li>JDBC POJO store factory - Objects are stored 
in underlying database by using java beans mapping description via reflection 
backed by JDBC</li>
-                            <li>JDBC BLOB store factory - Objects are stored 
in underlying database in BLOB format backed by JDBC</li>
-                            <li>Hibernate BLOB store factory - Objects are 
stored in underlying database in BLOB format backed by Hibernate</li>
-                        </ul>`
-                    })(
-                        ui-validate=`{
-                            writeThroughOn: 
'$ctrl.Caches.cacheStoreFactory.storeDisabledValueOff(${model}, 
${model}.writeThrough)',
-                            readThroughOn: 
'$ctrl.Caches.cacheStoreFactory.storeDisabledValueOff(${model}, 
${model}.readThrough)',
-                            writeBehindOn: 
'$ctrl.Caches.cacheStoreFactory.storeDisabledValueOff(${model}, 
${model}.writeBehindEnabled)'
-                        }`
-                        ui-validate-watch-collection=`"[${model}.readThrough, 
${model}.writeThrough, ${model}.writeBehindEnabled]"`
-                        ng-model-options='{allowInvalid: true}'
-                    )
-                        +form-field-feedback(null, 'writeThroughOn', 'Write 
through is enabled but store is not set')
-                        +form-field-feedback(null, 'readThroughOn', 'Read 
through is enabled but store is not set')
-                        +form-field-feedback(null, 'writeBehindOn', 
'Write-behind is enabled but store is not set')
-                .pc-form-group(ng-if=storeFactoryKind)
-                    .pc-form-grid-row(ng-if=`${storeFactoryKind} === 
'CacheJdbcPojoStoreFactory'`)
-                        -var pojoStoreFactory = 
`${storeFactory}.CacheJdbcPojoStoreFactory`
-                        -var required = `${storeFactoryKind} === 
'CacheJdbcPojoStoreFactory'`
+panel-collapsible(ng-form=form on-open=`ui.loadPanel('${form}')`)
+    panel-title Store
+    panel-description 
+        | Cache store settings. 
+        | 
#[a.link-success(href="https://apacheignite.readme.io/docs/3rd-party-store"; 
target="_blank") More info]
+    panel-content.pca-form-row(ng-if=`ui.isPanelLoaded('${form}')`)
+        .pca-form-column-6.pc-form-grid-row
+            -var storeFactory = `${model}.cacheStoreFactory`;
+            -var storeFactoryKind = `${storeFactory}.kind`;
+            .pc-form-grid-col-60
+                +sane-ignite-form-field-dropdown({
+                    label: 'Store factory:',
+                    model: storeFactoryKind,
+                    name: '"cacheStoreFactory"',
+                    placeholder: '{{ 
::$ctrl.Caches.cacheStoreFactory.kind.default }}',
+                    options: '::$ctrl.Caches.cacheStoreFactory.values',
+                    tip: `Factory for persistent storage for cache data
+                    <ul>
+                        <li>JDBC POJO store factory - Objects are stored in 
underlying database by using java beans mapping description via reflection 
backed by JDBC</li>
+                        <li>JDBC BLOB store factory - Objects are stored in 
underlying database in BLOB format backed by JDBC</li>
+                        <li>Hibernate BLOB store factory - Objects are stored 
in underlying database in BLOB format backed by Hibernate</li>
+                    </ul>`
+                })(
+                    ui-validate=`{
+                        writeThroughOn: 
'$ctrl.Caches.cacheStoreFactory.storeDisabledValueOff(${model}, 
${model}.writeThrough)',
+                        readThroughOn: 
'$ctrl.Caches.cacheStoreFactory.storeDisabledValueOff(${model}, 
${model}.readThrough)',
+                        writeBehindOn: 
'$ctrl.Caches.cacheStoreFactory.storeDisabledValueOff(${model}, 
${model}.writeBehindEnabled)'
+                    }`
+                    ui-validate-watch-collection=`"[${model}.readThrough, 
${model}.writeThrough, ${model}.writeBehindEnabled]"`
+                    ng-model-options='{allowInvalid: true}'
+                )
+                    +form-field-feedback(null, 'writeThroughOn', 'Write 
through is enabled but store is not set')
+                    +form-field-feedback(null, 'readThroughOn', 'Read through 
is enabled but store is not set')
+                    +form-field-feedback(null, 'writeBehindOn', 'Write-behind 
is enabled but store is not set')
+            .pc-form-group(ng-if=storeFactoryKind)
+                .pc-form-grid-row(ng-if=`${storeFactoryKind} === 
'CacheJdbcPojoStoreFactory'`)
+                    -var pojoStoreFactory = 
`${storeFactory}.CacheJdbcPojoStoreFactory`
+                    -var required = `${storeFactoryKind} === 
'CacheJdbcPojoStoreFactory'`
 
-                        .pc-form-grid-col-60
-                            +sane-ignite-form-field-text({
-                                label: 'Data source bean name:',
-                                model: `${pojoStoreFactory}.dataSourceBean`,
-                                name: '"pojoDataSourceBean"',
-                                required: required,
-                                placeholder: 'Input bean name',
-                                tip: 'Name of the data source bean in Spring 
context'
-                            })(
-                                is-valid-java-identifier
-                                not-java-reserved-word
-                            )
-                                +form-field-feedback(null, 'required', 'Data 
source bean name is required')
-                                +form-field-feedback(null, 
'isValidJavaIdentifier', 'Data source bean name is not a valid Java identifier')
-                                +form-field-feedback(null, 
'notJavaReservedWord', 'Data source bean name should not be a Java reserved 
word')
-                        .pc-form-grid-col-60
-                            +dialect('Dialect:', 
`${pojoStoreFactory}.dialect`, '"pojoDialect"', required,
-                                'Dialect of SQL implemented by a particular 
RDBMS:', 'Generic JDBC dialect',
-                                'Choose JDBC dialect')
-                        .pc-form-grid-col-30
-                            +number('Batch size:', 
`${pojoStoreFactory}.batchSize`, '"pojoBatchSize"', true, '512', '1',
-                                'Maximum batch size for writeAll and deleteAll 
operations')
-                        .pc-form-grid-col-30
-                            +number('Thread count:', 
`${pojoStoreFactory}.maximumPoolSize`, '"pojoMaximumPoolSize"', true, 
'availableProcessors', '1',
-                                'Maximum workers thread count.<br/>\
-                                These threads are responsible for load cache.')
-                        .pc-form-grid-col-30
-                            +number('Maximum write attempts:', 
`${pojoStoreFactory}.maximumWriteAttempts`, '"pojoMaximumWriteAttempts"', true, 
'2', '0',
-                                'Maximum write attempts in case of database 
error')
-                        .pc-form-grid-col-30
-                            +number('Parallel load threshold:', 
`${pojoStoreFactory}.parallelLoadCacheMinimumThreshold`, 
'"pojoParallelLoadCacheMinimumThreshold"', true, '512', '0',
-                                'Parallel load cache minimum threshold.<br/>\
-                                If <b>0</b> then load sequentially.')
-                        .pc-form-grid-col-60
-                            +java-class('Hasher', 
`${pojoStoreFactory}.hasher`, '"pojoHasher"', 'true', 'false', 'Hash 
calculator', required)
-                        .pc-form-grid-col-60
-                            +java-class('Transformer', 
`${pojoStoreFactory}.transformer`, '"pojoTransformer"', 'true', 'false', 'Types 
transformer', required)
-                        .pc-form-grid-col-60
-                            +checkbox('Escape table and filed names', 
`${pojoStoreFactory}.sqlEscapeAll`, '"sqlEscapeAll"',
-                                'If enabled than all schema, table and field 
names will be escaped with double quotes (for example: 
"tableName"."fieldName").<br/>\
-                                This enforces case sensitivity for field names 
and also allows having special characters in table and field names.<br/>\
-                                Escaped names will be used for 
CacheJdbcPojoStore internal SQL queries.')
-                    .pc-form-grid-row(ng-if=`${storeFactoryKind} === 
'CacheJdbcBlobStoreFactory'`)
-                        -var blobStoreFactory = 
`${storeFactory}.CacheJdbcBlobStoreFactory`
-                        -var blobStoreFactoryVia = 
`${blobStoreFactory}.connectVia`
+                    .pc-form-grid-col-60
+                        +sane-ignite-form-field-text({
+                            label: 'Data source bean name:',
+                            model: `${pojoStoreFactory}.dataSourceBean`,
+                            name: '"pojoDataSourceBean"',
+                            required: required,
+                            placeholder: 'Input bean name',
+                            tip: 'Name of the data source bean in Spring 
context'
+                        })(
+                            is-valid-java-identifier
+                            not-java-reserved-word
+                        )
+                            +form-field-feedback(null, 'required', 'Data 
source bean name is required')
+                            +form-field-feedback(null, 
'isValidJavaIdentifier', 'Data source bean name is not a valid Java identifier')
+                            +form-field-feedback(null, 'notJavaReservedWord', 
'Data source bean name should not be a Java reserved word')
+                    .pc-form-grid-col-60
+                        +dialect('Dialect:', `${pojoStoreFactory}.dialect`, 
'"pojoDialect"', required,
+                            'Dialect of SQL implemented by a particular 
RDBMS:', 'Generic JDBC dialect',
+                            'Choose JDBC dialect')
+                    .pc-form-grid-col-30
+                        +number('Batch size:', 
`${pojoStoreFactory}.batchSize`, '"pojoBatchSize"', true, '512', '1',
+                            'Maximum batch size for writeAll and deleteAll 
operations')
+                    .pc-form-grid-col-30
+                        +number('Thread count:', 
`${pojoStoreFactory}.maximumPoolSize`, '"pojoMaximumPoolSize"', true, 
'availableProcessors', '1',
+                            'Maximum workers thread count.<br/>\
+                            These threads are responsible for load cache.')
+                    .pc-form-grid-col-30
+                        +number('Maximum write attempts:', 
`${pojoStoreFactory}.maximumWriteAttempts`, '"pojoMaximumWriteAttempts"', true, 
'2', '0',
+                            'Maximum write attempts in case of database error')
+                    .pc-form-grid-col-30
+                        +number('Parallel load threshold:', 
`${pojoStoreFactory}.parallelLoadCacheMinimumThreshold`, 
'"pojoParallelLoadCacheMinimumThreshold"', true, '512', '0',
+                            'Parallel load cache minimum threshold.<br/>\
+                            If <b>0</b> then load sequentially.')
+                    .pc-form-grid-col-60
+                        +java-class('Hasher', `${pojoStoreFactory}.hasher`, 
'"pojoHasher"', 'true', 'false', 'Hash calculator', required)
+                    .pc-form-grid-col-60
+                        +java-class('Transformer', 
`${pojoStoreFactory}.transformer`, '"pojoTransformer"', 'true', 'false', 'Types 
transformer', required)
+                    .pc-form-grid-col-60
+                        +checkbox('Escape table and filed names', 
`${pojoStoreFactory}.sqlEscapeAll`, '"sqlEscapeAll"',
+                            'If enabled than all schema, table and field names 
will be escaped with double quotes (for example: "tableName"."fieldName").<br/>\
+                            This enforces case sensitivity for field names and 
also allows having special characters in table and field names.<br/>\
+                            Escaped names will be used for CacheJdbcPojoStore 
internal SQL queries.')
+                .pc-form-grid-row(ng-if=`${storeFactoryKind} === 
'CacheJdbcBlobStoreFactory'`)
+                    -var blobStoreFactory = 
`${storeFactory}.CacheJdbcBlobStoreFactory`
+                    -var blobStoreFactoryVia = `${blobStoreFactory}.connectVia`
 
-                        .pc-form-grid-col-60
-                            +dropdown('Connect via:', blobStoreFactoryVia, 
'"connectVia"', 'true', 'Choose connection method',
-                                '[\
-                                    {value: "URL", label: "URL"},\
-                                    {value: "DataSource", label: "Data 
source"}\
-                                ]',
-                                'You can connect to database via:\
-                                <ul>\
-                                    <li>JDBC URL, for example: 
jdbc:h2:mem:myDatabase</li>\
-                                    <li>Configured data source</li>\
-                                </ul>')
+                    .pc-form-grid-col-60
+                        +dropdown('Connect via:', blobStoreFactoryVia, 
'"connectVia"', 'true', 'Choose connection method',
+                            '[\
+                                {value: "URL", label: "URL"},\
+                                {value: "DataSource", label: "Data source"}\
+                            ]',
+                            'You can connect to database via:\
+                            <ul>\
+                                <li>JDBC URL, for example: 
jdbc:h2:mem:myDatabase</li>\
+                                <li>Configured data source</li>\
+                            </ul>')
 
-                        -var required = `${storeFactoryKind} === 
'CacheJdbcBlobStoreFactory' && ${blobStoreFactoryVia} === 'URL'`
+                    -var required = `${storeFactoryKind} === 
'CacheJdbcBlobStoreFactory' && ${blobStoreFactoryVia} === 'URL'`
 
-                        
.pc-form-grid-col-60(ng-if-start=`${blobStoreFactoryVia} === 'URL'`)
-                            +text('Connection URL:', 
`${blobStoreFactory}.connectionUrl`, '"connectionUrl"', required, 'Input URL',
-                                'URL for database access, for example: 
jdbc:h2:mem:myDatabase')
-                        .pc-form-grid-col-30
-                            +text('User:', `${blobStoreFactory}.user`, 
'"user"', required, 'Input user name', 'User name for database access')
-                        .pc-form-grid-col-30(ng-if-end)
-                            .pc-form-grid__text-only-item Password will be 
generated as stub.
+                    .pc-form-grid-col-60(ng-if-start=`${blobStoreFactoryVia} 
=== 'URL'`)
+                        +text('Connection URL:', 
`${blobStoreFactory}.connectionUrl`, '"connectionUrl"', required, 'Input URL',
+                            'URL for database access, for example: 
jdbc:h2:mem:myDatabase')
+                    .pc-form-grid-col-30
+                        +text('User:', `${blobStoreFactory}.user`, '"user"', 
required, 'Input user name', 'User name for database access')
+                    .pc-form-grid-col-30(ng-if-end)
+                        .pc-form-grid__text-only-item Password will be 
generated as stub.
 
-                        -var required = `${storeFactoryKind} === 
'CacheJdbcBlobStoreFactory' && ${blobStoreFactoryVia} !== 'URL'`
+                    -var required = `${storeFactoryKind} === 
'CacheJdbcBlobStoreFactory' && ${blobStoreFactoryVia} !== 'URL'`
 
-                        
.pc-form-grid-col-60(ng-if-start=`${blobStoreFactoryVia} !== 'URL'`)
-                            +sane-ignite-form-field-text({
-                                label: 'Data source bean name:',
-                                model: `${blobStoreFactory}.dataSourceBean`,
-                                name: '"blobDataSourceBean"',
-                                required: required,
-                                placeholder: 'Input bean name',
-                                tip: 'Name of the data source bean in Spring 
context'
-                            })(
-                                is-valid-java-identifier
-                                not-java-reserved-word
-                            )
-                                +form-field-feedback(null, 'required', 'Data 
source bean name is required')
-                                +form-field-feedback(null, 
'isValidJavaIdentifier', 'Data source bean name is not a valid Java identifier')
-                                +form-field-feedback(null, 
'notJavaReservedWord', 'Data source bean name should not be a Java reserved 
word')
-                        .pc-form-grid-col-60(ng-if-end)
-                            +dialect('Database:', 
`${blobStoreFactory}.dialect`, '"blobDialect"', required, 'Supported 
databases:', 'Generic database', 'Choose database')
+                    .pc-form-grid-col-60(ng-if-start=`${blobStoreFactoryVia} 
!== 'URL'`)
+                        +sane-ignite-form-field-text({
+                            label: 'Data source bean name:',
+                            model: `${blobStoreFactory}.dataSourceBean`,
+                            name: '"blobDataSourceBean"',
+                            required: required,
+                            placeholder: 'Input bean name',
+                            tip: 'Name of the data source bean in Spring 
context'
+                        })(
+                            is-valid-java-identifier
+                            not-java-reserved-word
+                        )
+                            +form-field-feedback(null, 'required', 'Data 
source bean name is required')
+                            +form-field-feedback(null, 
'isValidJavaIdentifier', 'Data source bean name is not a valid Java identifier')
+                            +form-field-feedback(null, 'notJavaReservedWord', 
'Data source bean name should not be a Java reserved word')
+                    .pc-form-grid-col-60(ng-if-end)
+                        +dialect('Database:', `${blobStoreFactory}.dialect`, 
'"blobDialect"', required, 'Supported databases:', 'Generic database', 'Choose 
database')
 
-                        .pc-form-grid-col-60
-                            +checkbox('Init schema', 
`${blobStoreFactory}.initSchema`, '"initSchema"',
-                                'Flag indicating whether DB schema should be 
initialized by Ignite (default behaviour) or was explicitly created by user')
-                        .pc-form-grid-col-60
-                            +text('Create query:', 
`${blobStoreFactory}.createTableQuery`, '"createTableQuery"', 'false', 'SQL for 
table creation',
-                                'Query for table creation in underlying 
database<br/>\
-                                Default value: create table if not exists 
ENTRIES (key binary primary key, val binary)')
-                        .pc-form-grid-col-60
-                            +text('Load query:', 
`${blobStoreFactory}.loadQuery`, '"loadQuery"', 'false', 'SQL for load entry',
-                                'Query for entry load from underlying 
database<br/>\
-                                Default value: select * from ENTRIES where 
key=?')
-                        .pc-form-grid-col-60
-                            +text('Insert query:', 
`${blobStoreFactory}.insertQuery`, '"insertQuery"', 'false', 'SQL for insert 
entry',
-                                'Query for insert entry into underlying 
database<br/>\
-                                Default value: insert into ENTRIES (key, val) 
values (?, ?)')
-                        .pc-form-grid-col-60
-                            +text('Update query:', 
`${blobStoreFactory}.updateQuery`, '"updateQuery"', 'false', 'SQL for update 
entry',
-                                'Query for update entry in underlying 
database<br/>\
-                                Default value: update ENTRIES set val=? where 
key=?')
-                        .pc-form-grid-col-60
-                            +text('Delete query:', 
`${blobStoreFactory}.deleteQuery`, '"deleteQuery"', 'false', 'SQL for delete 
entry',
-                                'Query for delete entry from underlying 
database<br/>\
-                                Default value: delete from ENTRIES where 
key=?')
+                    .pc-form-grid-col-60
+                        +checkbox('Init schema', 
`${blobStoreFactory}.initSchema`, '"initSchema"',
+                            'Flag indicating whether DB schema should be 
initialized by Ignite (default behaviour) or was explicitly created by user')
+                    .pc-form-grid-col-60
+                        +text('Create query:', 
`${blobStoreFactory}.createTableQuery`, '"createTableQuery"', 'false', 'SQL for 
table creation',
+                            'Query for table creation in underlying 
database<br/>\
+                            Default value: create table if not exists ENTRIES 
(key binary primary key, val binary)')
+                    .pc-form-grid-col-60
+                        +text('Load query:', `${blobStoreFactory}.loadQuery`, 
'"loadQuery"', 'false', 'SQL for load entry',
+                            'Query for entry load from underlying 
database<br/>\
+                            Default value: select * from ENTRIES where key=?')
+                    .pc-form-grid-col-60
+                        +text('Insert query:', 
`${blobStoreFactory}.insertQuery`, '"insertQuery"', 'false', 'SQL for insert 
entry',
+                            'Query for insert entry into underlying 
database<br/>\
+                            Default value: insert into ENTRIES (key, val) 
values (?, ?)')
+                    .pc-form-grid-col-60
+                        +text('Update query:', 
`${blobStoreFactory}.updateQuery`, '"updateQuery"', 'false', 'SQL for update 
entry',
+                            'Query for update entry in underlying 
database<br/>\
+                            Default value: update ENTRIES set val=? where 
key=?')
+                    .pc-form-grid-col-60
+                        +text('Delete query:', 
`${blobStoreFactory}.deleteQuery`, '"deleteQuery"', 'false', 'SQL for delete 
entry',
+                            'Query for delete entry from underlying 
database<br/>\
+                            Default value: delete from ENTRIES where key=?')
 
-                    .pc-form-grid-row(ng-if=`${storeFactoryKind} === 
'CacheHibernateBlobStoreFactory'`)
-                        -var hibernateStoreFactory = 
`${storeFactory}.CacheHibernateBlobStoreFactory`
+                .pc-form-grid-row(ng-if=`${storeFactoryKind} === 
'CacheHibernateBlobStoreFactory'`)
+                    -var hibernateStoreFactory = 
`${storeFactory}.CacheHibernateBlobStoreFactory`
 
-                        .pc-form-grid-col-60
-                            .ignite-form-field
-                                +ignite-form-field__label('Hibernate 
properties:', '"hibernateProperties"')
-                                    +tooltip(`List of Hibernate properties<bt 
/>
-                                        For example: 
connection.url=jdbc:h2:mem:exampleDb`)
-                                .ignite-form-field__control
-                                    +list-pair-edit({
-                                        items: 
`${hibernateStoreFactory}.hibernateProperties`,
-                                        keyLbl: 'Property name', 
-                                        valLbl: 'Property value',
-                                        itemName: 'property',
-                                        itemsName: 'properties'
-                                    })
+                    .pc-form-grid-col-60
+                        .ignite-form-field
+                            +ignite-form-field__label('Hibernate properties:', 
'"hibernateProperties"')
+                                +tooltip(`List of Hibernate properties<bt />
+                                    For example: 
connection.url=jdbc:h2:mem:exampleDb`)
+                            .ignite-form-field__control
+                                +list-pair-edit({
+                                    items: 
`${hibernateStoreFactory}.hibernateProperties`,
+                                    keyLbl: 'Property name', 
+                                    valLbl: 'Property value',
+                                    itemName: 'property',
+                                    itemsName: 'properties'
+                                })
 
-                - form = 'store'
-                .pc-form-grid-col-60
-                    +checkbox('Keep binary in store', 
`${model}.storeKeepBinary`, '"storeKeepBinary"',
-                        'Flag indicating that CacheStore implementation is 
working with binary objects instead of Java objects')
-                .pc-form-grid-col-60
-                    +checkbox('Load previous value', 
`${model}.loadPreviousValue`, '"loadPreviousValue"',
-                        'Flag indicating whether value should be loaded from 
store if it is not in the cache for following cache operations: \
-                        <ul> \
-                            <li>IgniteCache.putIfAbsent()</li> \
-                            <li>IgniteCache.replace()</li> \
-                            <li>IgniteCache.remove()</li> \
-                            <li>IgniteCache.getAndPut()</li> \
-                            <li>IgniteCache.getAndRemove()</li> \
-                            <li>IgniteCache.getAndReplace()</li> \
-                            <li> IgniteCache.getAndPutIfAbsent()</li>\
-                        </ul>')
-                .pc-form-grid-col-60
-                    +sane-form-field-checkbox({
-                        label: 'Read-through',
-                        model: `${model}.readThrough`,
-                        name: '"readThrough"',
-                        tip: 'Flag indicating whether read-through caching 
should be used'
-                    })(
-                        ng-model-options='{allowInvalid: true}'
-                        ui-validate=`{
-                            storeEnabledReadOrWriteOn: 
'$ctrl.Caches.cacheStoreFactory.storeEnabledReadOrWriteOn(${model})'
-                        }`
-                        ui-validate-watch-collection=`"[${storeFactoryKind}, 
${model}.writeThrough, ${model}.readThrough]"`
-                    )
-                        +form-field-feedback(0, 'storeEnabledReadOrWriteOn', 
'Read or write through should be turned on when store kind is set')
-                .pc-form-grid-col-60
-                    +sane-form-field-checkbox({
-                        label: 'Write-through',
-                        model: `${model}.writeThrough`,
-                        name: '"writeThrough"',
-                        tip: 'Flag indicating whether write-through caching 
should be used'
+            - form = 'store'
+            .pc-form-grid-col-60
+                +checkbox('Keep binary in store', `${model}.storeKeepBinary`, 
'"storeKeepBinary"',
+                    'Flag indicating that CacheStore implementation is working 
with binary objects instead of Java objects')
+            .pc-form-grid-col-60
+                +checkbox('Load previous value', `${model}.loadPreviousValue`, 
'"loadPreviousValue"',
+                    'Flag indicating whether value should be loaded from store 
if it is not in the cache for following cache operations: \
+                    <ul> \
+                        <li>IgniteCache.putIfAbsent()</li> \
+                        <li>IgniteCache.replace()</li> \
+                        <li>IgniteCache.remove()</li> \
+                        <li>IgniteCache.getAndPut()</li> \
+                        <li>IgniteCache.getAndRemove()</li> \
+                        <li>IgniteCache.getAndReplace()</li> \
+                        <li> IgniteCache.getAndPutIfAbsent()</li>\
+                    </ul>')
+            .pc-form-grid-col-60
+                +sane-form-field-checkbox({
+                    label: 'Read-through',
+                    model: `${model}.readThrough`,
+                    name: '"readThrough"',
+                    tip: 'Flag indicating whether read-through caching should 
be used'
+                })(
+                    ng-model-options='{allowInvalid: true}'
+                    ui-validate=`{
+                        storeEnabledReadOrWriteOn: 
'$ctrl.Caches.cacheStoreFactory.storeEnabledReadOrWriteOn(${model})'
+                    }`
+                    ui-validate-watch-collection=`"[${storeFactoryKind}, 
${model}.writeThrough, ${model}.readThrough]"`
+                )
+                    +form-field-feedback(0, 'storeEnabledReadOrWriteOn', 'Read 
or write through should be turned on when store kind is set')
+            .pc-form-grid-col-60
+                +sane-form-field-checkbox({
+                    label: 'Write-through',
+                    model: `${model}.writeThrough`,
+                    name: '"writeThrough"',
+                    tip: 'Flag indicating whether write-through caching should 
be used'
+                })(
+                    ng-model-options='{allowInvalid: true}'
+                    ui-validate=`{
+                        storeEnabledReadOrWriteOn: 
'$ctrl.Caches.cacheStoreFactory.storeEnabledReadOrWriteOn(${model})'
+                    }`
+                    ui-validate-watch-collection=`"[${storeFactoryKind}, 
${model}.writeThrough, ${model}.readThrough]"`
+                )
+                    +form-field-feedback(0, 'storeEnabledReadOrWriteOn', 'Read 
or write through should be turned on when store kind is set')
+
+            -var enabled = `${model}.writeBehindEnabled`
+
+            .pc-form-grid-col-60.pc-form-group__text-title
+                +sane-form-field-checkbox({
+                    label: 'Write-behind',
+                    model: enabled,
+                    name: '"writeBehindEnabled"',
+                    tip: `
+                        Cache write-behind settings.<br>
+                        Write-behind is a special mode when updates to cache 
accumulated and then asynchronously flushed to persistent store as a bulk 
operation.
+                    `
+                })(
+                    ng-model-options='{allowInvalid: true}'
+                )
+                    +form-field-feedback(0, 'storeDisabledValueOff', 
'Write-behind is enabled but store kind is not set')
+            .pc-form-group.pc-form-grid-row(ng-if=enabled)
+                .pc-form-grid-col-30
+                    +number('Batch size:', `${model}.writeBehindBatchSize`, 
'"writeBehindBatchSize"', enabled, '512', '1',
+                        'Maximum batch size for write-behind cache store 
operations<br/>\
+                         Store operations(get or remove) are combined in a 
batch of this size to be passed to cache store')
+                .pc-form-grid-col-30
+                    +sane-ignite-form-field-number({
+                        label: 'Flush size:',
+                        model: `${model}.writeBehindFlushSize`,
+                        name: '"writeBehindFlushSize"',
+                        placeholder: '10240',
+                        min: `{{ $ctrl.Caches.writeBehindFlush.min(${model}) 
}}`,
+                        tip: `Maximum size of the write-behind cache<br/>
+                         If cache size exceeds this value, all cached items 
are flushed to the cache store and write cache is cleared`
                     })(
                         ng-model-options='{allowInvalid: true}'
-                        ui-validate=`{
-                            storeEnabledReadOrWriteOn: 
'$ctrl.Caches.cacheStoreFactory.storeEnabledReadOrWriteOn(${model})'
-                        }`
-                        ui-validate-watch-collection=`"[${storeFactoryKind}, 
${model}.writeThrough, ${model}.readThrough]"`
                     )
-                        +form-field-feedback(0, 'storeEnabledReadOrWriteOn', 
'Read or write through should be turned on when store kind is set')
-
-                -var enabled = `${model}.writeBehindEnabled`
-
-                .pc-form-grid-col-60.pc-form-group__text-title
-                    +sane-form-field-checkbox({
-                        label: 'Write-behind',
-                        model: enabled,
-                        name: '"writeBehindEnabled"',
-                        tip: `
-                            Cache write-behind settings.<br>
-                            Write-behind is a special mode when updates to 
cache accumulated and then asynchronously flushed to persistent store as a bulk 
operation.
-                        `
+                .pc-form-grid-col-30
+                    +sane-ignite-form-field-number({
+                        label: 'Flush frequency:',
+                        model: `${model}.writeBehindFlushFrequency`,
+                        name: '"writeBehindFlushFrequency"',
+                        placeholder: '5000',
+                        min: `{{ $ctrl.Caches.writeBehindFlush.min(${model}) 
}}`,
+                        tip: `Frequency with which write-behind cache is 
flushed to the cache store in milliseconds`
                     })(
                         ng-model-options='{allowInvalid: true}'
                     )
-                        +form-field-feedback(0, 'storeDisabledValueOff', 
'Write-behind is enabled but store kind is not set')
-                .pc-form-group.pc-form-grid-row(ng-if=enabled)
-                    .pc-form-grid-col-30
-                        +number('Batch size:', 
`${model}.writeBehindBatchSize`, '"writeBehindBatchSize"', enabled, '512', '1',
-                            'Maximum batch size for write-behind cache store 
operations<br/>\
-                             Store operations(get or remove) are combined in a 
batch of this size to be passed to cache store')
-                    .pc-form-grid-col-30
-                        +sane-ignite-form-field-number({
-                            label: 'Flush size:',
-                            model: `${model}.writeBehindFlushSize`,
-                            name: '"writeBehindFlushSize"',
-                            placeholder: '10240',
-                            min: `{{ 
$ctrl.Caches.writeBehindFlush.min(${model}) }}`,
-                            tip: `Maximum size of the write-behind cache<br/>
-                             If cache size exceeds this value, all cached 
items are flushed to the cache store and write cache is cleared`
-                        })(
-                            ng-model-options='{allowInvalid: true}'
-                        )
-                    .pc-form-grid-col-30
-                        +sane-ignite-form-field-number({
-                            label: 'Flush frequency:',
-                            model: `${model}.writeBehindFlushFrequency`,
-                            name: '"writeBehindFlushFrequency"',
-                            placeholder: '5000',
-                            min: `{{ 
$ctrl.Caches.writeBehindFlush.min(${model}) }}`,
-                            tip: `Frequency with which write-behind cache is 
flushed to the cache store in milliseconds`
-                        })(
-                            ng-model-options='{allowInvalid: true}'
-                        )
-                    .pc-form-grid-col-30
-                        +number('Flush threads count:', 
`${model}.writeBehindFlushThreadCount`, '"writeBehindFlushThreadCount"', 
enabled, '1', '1',
-                            'Number of threads that will perform cache 
flushing')
+                .pc-form-grid-col-30
+                    +number('Flush threads count:', 
`${model}.writeBehindFlushThreadCount`, '"writeBehindFlushThreadCount"', 
enabled, '1', '1',
+                        'Number of threads that will perform cache flushing')
 
-                    //- Since ignite 2.0
-                    .pc-form-grid-col-60(ng-if='$ctrl.available("2.0.0")')
-                        +checkbox-enabled('Write coalescing', model + 
'.writeBehindCoalescing', '"WriteBehindCoalescing"', enabled, 'Write coalescing 
flag for write-behind cache store')
+                //- Since ignite 2.0
+                .pc-form-grid-col-60(ng-if='$ctrl.available("2.0.0")')
+                    +checkbox-enabled('Write coalescing', model + 
'.writeBehindCoalescing', '"WriteBehindCoalescing"', enabled, 'Write coalescing 
flag for write-behind cache store')
 
-            .pca-form-column-6
-                +preview-xml-java(model, 'cacheStore', 'domains')
+        .pca-form-column-6
+            +preview-xml-java(model, 'cacheStore', 'domains')

http://git-wip-us.apache.org/repos/asf/ignite/blob/d24dab81/modules/web-console/frontend/app/modules/states/configuration/clusters/atomic.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/atomic.pug
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/atomic.pug
index 8994fa6..13424f8 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/atomic.pug
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/atomic.pug
@@ -22,57 +22,54 @@ include /app/helpers/jade/mixins
 -var rendezvousAff = affModel + '.kind === "Rendezvous"'
 -var customAff = affModel + '.kind === "Custom"'
 
-.pca-panel.pca-panel-default(ng-form=form novalidate)
-    .pca-panel-heading(bs-collapse-toggle='' 
ng-click=`ui.loadPanel('${form}')`)
-        ignite-form-panel-chevron
-        .pca-panel-heading-title Atomic configuration
-        .pca-panel-heading-description
-            | Configuration for atomic data structures.
-            | Atomics are distributed across the cluster, essentially enabling 
performing atomic operations (such as increment-and-get or compare-and-set) 
with the same globally-visible value. 
-            | 
#[a.link-success(href="https://apacheignite.readme.io/docs/atomic-types"; 
target="_blank") More info]
-    .pca-panel-collapse(role='tabpanel' bs-collapse-target='' id=`${form}`)
-        .pca-panel-body(ng-if=`ui.isPanelLoaded('${form}')`).pca-form-row
-            .pca-form-column-6.pc-form-grid-row
-                .pc-form-grid-col-30
-                    +dropdown('Cache mode:', `${model}.cacheMode`, 
'"cacheMode"', 'true', 'PARTITIONED',
-                        '[\
-                            {value: "LOCAL", label: "LOCAL"},\
-                            {value: "REPLICATED", label: "REPLICATED"},\
-                            {value: "PARTITIONED", label: "PARTITIONED"}\
-                        ]',
-                        'Cache modes:\
-                        <ul>\
-                            <li>Partitioned - in this mode the overall key set 
will be divided into partitions and all partitions will be split equally 
between participating nodes</li>\
-                            <li>Replicated - in this mode all the keys are 
distributed to all participating nodes</li>\
-                            <li>Local - in this mode caches residing on 
different grid nodes will not know about each other</li>\
-                        </ul>')
-                .pc-form-grid-col-30
-                    +number('Sequence reserve:', 
`${model}.atomicSequenceReserveSize`, '"atomicSequenceReserveSize"', 'true', 
'1000', '0',
-                        'Default number of sequence values reserved for 
IgniteAtomicSequence instances<br/>\
-                        After a certain number has been reserved, consequent 
increments of sequence will happen locally, without communication with other 
nodes, until the next reservation has to be made')
-                .pc-form-grid-col-60(ng-show=`!(${model}.cacheMode && 
${model}.cacheMode != "PARTITIONED")`)
-                    +number('Backups:', model + '.backups', '"backups"', 
'true', '0', '0', 'Number of backup nodes')
+panel-collapsible(ng-form=form on-open=`ui.loadPanel('${form}')`)
+    panel-title Atomic configuration
+    panel-description
+        | Configuration for atomic data structures.
+        | Atomics are distributed across the cluster, essentially enabling 
performing atomic operations (such as increment-and-get or compare-and-set) 
with the same globally-visible value. 
+        | 
#[a.link-success(href="https://apacheignite.readme.io/docs/atomic-types"; 
target="_blank") More info]
+    panel-content.pca-form-row(ng-if=`ui.isPanelLoaded('${form}')`)
+        .pca-form-column-6.pc-form-grid-row
+            .pc-form-grid-col-30
+                +dropdown('Cache mode:', `${model}.cacheMode`, '"cacheMode"', 
'true', 'PARTITIONED',
+                    '[\
+                        {value: "LOCAL", label: "LOCAL"},\
+                        {value: "REPLICATED", label: "REPLICATED"},\
+                        {value: "PARTITIONED", label: "PARTITIONED"}\
+                    ]',
+                    'Cache modes:\
+                    <ul>\
+                        <li>Partitioned - in this mode the overall key set 
will be divided into partitions and all partitions will be split equally 
between participating nodes</li>\
+                        <li>Replicated - in this mode all the keys are 
distributed to all participating nodes</li>\
+                        <li>Local - in this mode caches residing on different 
grid nodes will not know about each other</li>\
+                    </ul>')
+            .pc-form-grid-col-30
+                +number('Sequence reserve:', 
`${model}.atomicSequenceReserveSize`, '"atomicSequenceReserveSize"', 'true', 
'1000', '0',
+                    'Default number of sequence values reserved for 
IgniteAtomicSequence instances<br/>\
+                    After a certain number has been reserved, consequent 
increments of sequence will happen locally, without communication with other 
nodes, until the next reservation has to be made')
+            .pc-form-grid-col-60(ng-show=`!(${model}.cacheMode && 
${model}.cacheMode != "PARTITIONED")`)
+                +number('Backups:', model + '.backups', '"backups"', 'true', 
'0', '0', 'Number of backup nodes')
 
-                .pc-form-grid-col-60(ng-if-start='$ctrl.available("2.1.0")')
-                    +dropdown('Function:', `${affModel}.kind`, 
'"AffinityKind"', 'true', 'Default', '$ctrl.Clusters.affinityFunctions',
-                        'Key topology resolver to provide mapping from keys to 
nodes\
-                        <ul>\
-                            <li>Rendezvous - Based on Highest Random Weight 
algorithm<br/></li>\
-                            <li>Custom - Custom implementation of key affinity 
function<br/></li>\
-                            <li>Default - By default rendezvous affinity 
function  with 1024 partitions is used<br/></li>\
-                        </ul>')
-                .pc-form-group(ng-if-end ng-if=rendezvousAff + ' || ' + 
customAff)
-                    .pc-form-grid-row
-                        .pc-form-grid-col-30(ng-if-start=rendezvousAff)
-                            +number-required('Partitions', 
`${affModel}.Rendezvous.partitions`, '"RendPartitions"', 'true', 
rendPartitionsRequired, '1024', '1', 'Number of partitions')
-                        .pc-form-grid-col-30
-                            +java-class('Backup filter', 
`${affModel}.Rendezvous.affinityBackupFilter`, '"RendAffinityBackupFilter"', 
'true', 'false',
-                                'Backups will be selected from all nodes that 
pass this filter')
-                        .pc-form-grid-col-60(ng-if-end)
-                            +checkbox('Exclude neighbors', 
`${affModel}.Rendezvous.excludeNeighbors`, '"RendExcludeNeighbors"',
-                                'Exclude same - host - neighbors from being 
backups of each other and specified number of backups')
-                        .pc-form-grid-col-60(ng-if=customAff)
-                            +java-class('Class name:', 
`${affModel}.Custom.className`, '"AffCustomClassName"', 'true', customAff,
-                                'Custom key affinity function implementation 
class name')
-            .pca-form-column-6
-                +preview-xml-java(model, 'clusterAtomics')
+            .pc-form-grid-col-60(ng-if-start='$ctrl.available("2.1.0")')
+                +dropdown('Function:', `${affModel}.kind`, '"AffinityKind"', 
'true', 'Default', '$ctrl.Clusters.affinityFunctions',
+                    'Key topology resolver to provide mapping from keys to 
nodes\
+                    <ul>\
+                        <li>Rendezvous - Based on Highest Random Weight 
algorithm<br/></li>\
+                        <li>Custom - Custom implementation of key affinity 
function<br/></li>\
+                        <li>Default - By default rendezvous affinity function  
with 1024 partitions is used<br/></li>\
+                    </ul>')
+            .pc-form-group(ng-if-end ng-if=rendezvousAff + ' || ' + customAff)
+                .pc-form-grid-row
+                    .pc-form-grid-col-30(ng-if-start=rendezvousAff)
+                        +number-required('Partitions', 
`${affModel}.Rendezvous.partitions`, '"RendPartitions"', 'true', 
rendPartitionsRequired, '1024', '1', 'Number of partitions')
+                    .pc-form-grid-col-30
+                        +java-class('Backup filter', 
`${affModel}.Rendezvous.affinityBackupFilter`, '"RendAffinityBackupFilter"', 
'true', 'false',
+                            'Backups will be selected from all nodes that pass 
this filter')
+                    .pc-form-grid-col-60(ng-if-end)
+                        +checkbox('Exclude neighbors', 
`${affModel}.Rendezvous.excludeNeighbors`, '"RendExcludeNeighbors"',
+                            'Exclude same - host - neighbors from being 
backups of each other and specified number of backups')
+                    .pc-form-grid-col-60(ng-if=customAff)
+                        +java-class('Class name:', 
`${affModel}.Custom.className`, '"AffCustomClassName"', 'true', customAff,
+                            'Custom key affinity function implementation class 
name')
+        .pca-form-column-6
+            +preview-xml-java(model, 'clusterAtomics')

http://git-wip-us.apache.org/repos/asf/ignite/blob/d24dab81/modules/web-console/frontend/app/modules/states/configuration/clusters/attributes.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/attributes.pug
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/attributes.pug
index edff038..b57f1da 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/attributes.pug
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/attributes.pug
@@ -19,26 +19,22 @@ include /app/helpers/jade/mixins
 -var form = 'attributes'
 -var model = '$ctrl.clonedCluster'
 
-.pca-panel.pca-panel-default(ng-form=form novalidate)
-    .pca-panel-heading(bs-collapse-toggle ng-click=`ui.loadPanel('${form}')`)
-        ignite-form-panel-chevron
-        .pca-panel-heading-title User attributes
-        .pca-panel-heading-description
-            | Configuration for Ignite user attributes.
-    .pca-panel-collapse(role='tabpanel' bs-collapse-target id=`${form}`)
-        .pca-panel-body(ng-if=`ui.isPanelLoaded('${form}')`).pca-form-row
-            .pca-form-column-6
-                .ignite-form-field
-                    +ignite-form-field__label('User attributes:', 
'"userAttributes"')
-                        +tooltip(`User-defined attributes to add to node`)
-                    .ignite-form-field__control
-                        +list-pair-edit({
-                            items: `${model}.attributes`,
-                            keyLbl: 'Attribute name', 
-                            valLbl: 'Attribute value',
-                            itemName: 'attribute',
-                            itemsName: 'attributes'
-                        })
+panel-collapsible(ng-form=form on-open=`ui.loadPanel('${form}')`)
+    panel-title User attributes
+    panel-description Configuration for Ignite user attributes.
+    panel-content.pca-form-row(ng-if=`ui.isPanelLoaded('${form}')`)
+        .pca-form-column-6
+            .ignite-form-field
+                +ignite-form-field__label('User attributes:', 
'"userAttributes"')
+                    +tooltip(`User-defined attributes to add to node`)
+                .ignite-form-field__control
+                    +list-pair-edit({
+                        items: `${model}.attributes`,
+                        keyLbl: 'Attribute name', 
+                        valLbl: 'Attribute value',
+                        itemName: 'attribute',
+                        itemsName: 'attributes'
+                    })
 
-            .pca-form-column-6
-                +preview-xml-java(model, 'clusterUserAttributes')
+        .pca-form-column-6
+            +preview-xml-java(model, 'clusterUserAttributes')

http://git-wip-us.apache.org/repos/asf/ignite/blob/d24dab81/modules/web-console/frontend/app/modules/states/configuration/clusters/binary.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/binary.pug
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/binary.pug
index 9c3a48d..6c1b246 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/binary.pug
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/binary.pug
@@ -19,65 +19,62 @@ include /app/helpers/jade/mixins
 -var form = 'binary'
 -var model = '$ctrl.clonedCluster.binaryConfiguration'
 
-.pca-panel.pca-panel-default(ng-form=form novalidate)
-    .pca-panel-heading(bs-collapse-toggle ng-click=`ui.loadPanel('${form}')`)
-        ignite-form-panel-chevron
-        .pca-panel-heading-title Binary configuration
-        .pca-panel-heading-description
-            | Configuration of specific binary types. 
-            | 
#[a.link-success(href="https://apacheignite.readme.io/docs/binary-marshaller"; 
target="_blank") More info]
-    .pca-panel-collapse(role='tabpanel' bs-collapse-target id=`${form}`)
-        .pca-panel-body(ng-if=`ui.isPanelLoaded('${form}')`).pca-form-row
-            .pca-form-column-6.pc-form-grid-row
-                .pc-form-grid-col-60
-                    +java-class('ID mapper:', model + '.idMapper', 
'"idMapper"', 'true', 'false',
-                        'Maps given from BinaryNameMapper type and filed name 
to ID that will be used by Ignite in internals<br/>\
-                        Ignite never writes full strings for field or type 
names. Instead, for performance reasons, Ignite writes integer hash codes for 
type/class and field names. It has been tested that hash code conflicts for the 
type/class names or the field names within the same type are virtually non - 
existent and, to gain performance, it is safe to work with hash codes. For the 
cases when hash codes for different types or fields actually do collide 
<b>BinaryIdMapper</b> allows to override the automatically generated hash code 
IDs for the type and field names')
-                .pc-form-grid-col-60
-                    +java-class('Name mapper:', model + '.nameMapper', 
'"nameMapper"', 'true', 'false', 'Maps type/class and field names to different 
names')
-                .pc-form-grid-col-60
-                    +java-class('Serializer:', model + '.serializer', 
'"serializer"', 'true', 'false', 'Class with custom serialization logic for 
binary objects')
-                .pc-form-grid-col-60
-                    .ignite-form-field
-                        +ignite-form-field__label('Type configurations:', 
'"typeСonfigurations"')
-                            +tooltip(`Configuration properties for binary 
types`)
-                        .ignite-form-field__control
-                            -var items = model + '.typeConfigurations'
-                            list-editable(ng-model=items 
name='typeСonfigurations')
-                                list-editable-item-edit.pc-form-grid-row
-                                    - form = '$parent.form'
-                                    .pc-form-grid-col-60
-                                        +java-class-autofocus('Type name:', 
'$item.typeName', '"typeName"', 'true', 'true', 'true', 'Type name')(
-                                            ignite-unique=items
-                                            ignite-unique-property='typeName'
-                                        )
-                                            +unique-feedback(`$item.typeName`, 
'Type name should be unique.')
-                                    .pc-form-grid-col-60
-                                        +java-class('ID mapper:', 
'$item.idMapper', '"idMapper"', 'true', 'false',
-                                            'Maps given from BinaryNameMapper 
type and filed name to ID that will be used by Ignite in internals<br/>\
-                                            Ignite never writes full strings 
for field or type/class names.\
-                                            Instead, for performance reasons, 
Ignite writes integer hash codes for type/class and field names.\
-                                            It has been tested that hash code 
conflicts for the type/class names or the field names within the same type are 
virtually non - existent and,\
-                                            to gain performance, it is safe to 
work with hash codes.\
-                                            For the cases when hash codes for 
different types or fields actually do collide <b>BinaryIdMapper</b> allows to 
override the automatically generated hash code IDs for the type and field 
names')
-                                    .pc-form-grid-col-60
-                                        +java-class('Name mapper:', 
'$item.nameMapper', '"nameMapper"', 'true', 'false',
-                                            'Maps type/class and field names 
to different names')
-                                    .pc-form-grid-col-60
-                                        +java-class('Serializer:', 
'$item.serializer', '"serializer"', 'true', 'false',
-                                            'Class with custom serialization 
logic for binary object')
-                                    .pc-form-grid-col-60
-                                        +checkbox('Enum', '$item.enum', 
'enum', 'Flag indicating that this type is the enum')
-
-                                list-editable-no-items
-                                    list-editable-add-item-button(
-                                        
add-item=`$ctrl.Clusters.addBinaryTypeConfiguration($ctrl.clonedCluster)`
-                                        label-single='configuration'
-                                        label-multiple='configurations'
+panel-collapsible(ng-form=form on-open=`ui.loadPanel('${form}')`)
+    panel-title Binary configuration
+    panel-description
+        | Configuration of specific binary types. 
+        | 
#[a.link-success(href="https://apacheignite.readme.io/docs/binary-marshaller"; 
target="_blank") More info]
+    panel-content.pca-form-row(ng-if=`ui.isPanelLoaded('${form}')`)
+        .pca-form-column-6.pc-form-grid-row
+            .pc-form-grid-col-60
+                +java-class('ID mapper:', model + '.idMapper', '"idMapper"', 
'true', 'false',
+                    'Maps given from BinaryNameMapper type and filed name to 
ID that will be used by Ignite in internals<br/>\
+                    Ignite never writes full strings for field or type names. 
Instead, for performance reasons, Ignite writes integer hash codes for 
type/class and field names. It has been tested that hash code conflicts for the 
type/class names or the field names within the same type are virtually non - 
existent and, to gain performance, it is safe to work with hash codes. For the 
cases when hash codes for different types or fields actually do collide 
<b>BinaryIdMapper</b> allows to override the automatically generated hash code 
IDs for the type and field names')
+            .pc-form-grid-col-60
+                +java-class('Name mapper:', model + '.nameMapper', 
'"nameMapper"', 'true', 'false', 'Maps type/class and field names to different 
names')
+            .pc-form-grid-col-60
+                +java-class('Serializer:', model + '.serializer', 
'"serializer"', 'true', 'false', 'Class with custom serialization logic for 
binary objects')
+            .pc-form-grid-col-60
+                .ignite-form-field
+                    +ignite-form-field__label('Type configurations:', 
'"typeСonfigurations"')
+                        +tooltip(`Configuration properties for binary types`)
+                    .ignite-form-field__control
+                        -var items = model + '.typeConfigurations'
+                        list-editable(ng-model=items 
name='typeСonfigurations')
+                            list-editable-item-edit.pc-form-grid-row
+                                - form = '$parent.form'
+                                .pc-form-grid-col-60
+                                    +java-class-autofocus('Type name:', 
'$item.typeName', '"typeName"', 'true', 'true', 'true', 'Type name')(
+                                        ignite-unique=items
+                                        ignite-unique-property='typeName'
                                     )
+                                        +unique-feedback(`$item.typeName`, 
'Type name should be unique.')
+                                .pc-form-grid-col-60
+                                    +java-class('ID mapper:', 
'$item.idMapper', '"idMapper"', 'true', 'false',
+                                        'Maps given from BinaryNameMapper type 
and filed name to ID that will be used by Ignite in internals<br/>\
+                                        Ignite never writes full strings for 
field or type/class names.\
+                                        Instead, for performance reasons, 
Ignite writes integer hash codes for type/class and field names.\
+                                        It has been tested that hash code 
conflicts for the type/class names or the field names within the same type are 
virtually non - existent and,\
+                                        to gain performance, it is safe to 
work with hash codes.\
+                                        For the cases when hash codes for 
different types or fields actually do collide <b>BinaryIdMapper</b> allows to 
override the automatically generated hash code IDs for the type and field 
names')
+                                .pc-form-grid-col-60
+                                    +java-class('Name mapper:', 
'$item.nameMapper', '"nameMapper"', 'true', 'false',
+                                        'Maps type/class and field names to 
different names')
+                                .pc-form-grid-col-60
+                                    +java-class('Serializer:', 
'$item.serializer', '"serializer"', 'true', 'false',
+                                        'Class with custom serialization logic 
for binary object')
+                                .pc-form-grid-col-60
+                                    +checkbox('Enum', '$item.enum', 'enum', 
'Flag indicating that this type is the enum')
+
+                            list-editable-no-items
+                                list-editable-add-item-button(
+                                    
add-item=`$ctrl.Clusters.addBinaryTypeConfiguration($ctrl.clonedCluster)`
+                                    label-single='configuration'
+                                    label-multiple='configurations'
+                                )
 
-                - form = 'binary'
-                .pc-form-grid-col-60
-                    +checkbox('Compact footer', model + '.compactFooter', 
'"compactFooter"', 'When enabled, Ignite will not write fields metadata when 
serializing objects (this will increase serialization performance), because 
internally <b>BinaryMarshaller</b> already distribute metadata inside cluster')
-            .pca-form-column-6
-                +preview-xml-java(model, 'clusterBinary')
+            - form = 'binary'
+            .pc-form-grid-col-60
+                +checkbox('Compact footer', model + '.compactFooter', 
'"compactFooter"', 'When enabled, Ignite will not write fields metadata when 
serializing objects (this will increase serialization performance), because 
internally <b>BinaryMarshaller</b> already distribute metadata inside cluster')
+        .pca-form-column-6
+            +preview-xml-java(model, 'clusterBinary')

http://git-wip-us.apache.org/repos/asf/ignite/blob/d24dab81/modules/web-console/frontend/app/modules/states/configuration/clusters/cache-key-cfg.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/cache-key-cfg.pug
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/cache-key-cfg.pug
index 577d66c..abc8ff1 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/cache-key-cfg.pug
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/cache-key-cfg.pug
@@ -19,48 +19,45 @@ include /app/helpers/jade/mixins
 -var form = 'cacheKeyCfg'
 -var model = '$ctrl.clonedCluster.cacheKeyConfiguration'
 
-.pca-panel.pca-panel-default(ng-form=form novalidate)
-    .pca-panel-heading(bs-collapse-toggle ng-click=`ui.loadPanel('${form}')`)
-        ignite-form-panel-chevron
-        .pca-panel-heading-title Cache key configuration
-        .pca-panel-heading-description
-            | Cache key configuration allows to collocate objects in a 
partitioned cache based on field in cache key without explicit usage of 
annotations on user classes.
-    .pca-panel-collapse(role='tabpanel' bs-collapse-target id=`${form}`)
-        .pca-panel-body(ng-if=`ui.isPanelLoaded('${form}')`).pca-form-row
-            .pca-form-column-6
-                mixin clusters-cache-key-cfg
-                    .ignite-form-field
-                        +ignite-form-field__label('Cache key configuration:', 
'"cacheKeyConfiguration"')
-                        .ignite-form-field__control
-                            -let items = model
-                            list-editable(ng-model=items 
name='cacheKeyConfiguration')
-                                list-editable-item-edit.pc-form-grid-row
-                                    - form = '$parent.form'
-                                    .pc-form-grid-col-60
-                                        +java-class-autofocus('Type name:', 
'$item.typeName', '"cacheKeyTypeName"', 'true', 'true', 'true', 'Type name')(
-                                            ignite-unique=items
-                                            ignite-unique-property='typeName'
-                                        )
-                                            
+unique-feedback(`cacheKeyTypeName`, 'Type name should be unique.')
-                                    .pc-form-grid-col-60
-                                        +sane-ignite-form-field-text({
-                                            label: 'Affinity key field name:',
-                                            model: 
'$item.affinityKeyFieldName',
-                                            name: '"affinityKeyFieldName"',
-                                            disabled: 'false',
-                                            placeholder: 'Enter field name',
-                                            tip: 'Affinity key field name',
-                                            required: true
-                                        })
-
-                                list-editable-no-items
-                                    list-editable-add-item-button(
-                                        add-item=`(${items} = ${items} || 
[]).push({})`
-                                        label-single='configuration'
-                                        label-multiple='configurations'
+panel-collapsible(ng-form=form on-open=`ui.loadPanel('${form}')`)
+    panel-title Cache key configuration
+    panel-description
+        | Cache key configuration allows to collocate objects in a partitioned 
cache based on field in cache key without explicit usage of annotations on user 
classes.
+    panel-content.pca-form-row(ng-if=`ui.isPanelLoaded('${form}')`)
+        .pca-form-column-6
+            mixin clusters-cache-key-cfg
+                .ignite-form-field
+                    +ignite-form-field__label('Cache key configuration:', 
'"cacheKeyConfiguration"')
+                    .ignite-form-field__control
+                        -let items = model
+                        list-editable(ng-model=items 
name='cacheKeyConfiguration')
+                            list-editable-item-edit.pc-form-grid-row
+                                - form = '$parent.form'
+                                .pc-form-grid-col-60
+                                    +java-class-autofocus('Type name:', 
'$item.typeName', '"cacheKeyTypeName"', 'true', 'true', 'true', 'Type name')(
+                                        ignite-unique=items
+                                        ignite-unique-property='typeName'
                                     )
-
-                +clusters-cache-key-cfg
-
-            .pca-form-column-6
-                +preview-xml-java(model, 'clusterCacheKeyConfiguration')
+                                        +unique-feedback(`cacheKeyTypeName`, 
'Type name should be unique.')
+                                .pc-form-grid-col-60
+                                    +sane-ignite-form-field-text({
+                                        label: 'Affinity key field name:',
+                                        model: '$item.affinityKeyFieldName',
+                                        name: '"affinityKeyFieldName"',
+                                        disabled: 'false',
+                                        placeholder: 'Enter field name',
+                                        tip: 'Affinity key field name',
+                                        required: true
+                                    })
+
+                            list-editable-no-items
+                                list-editable-add-item-button(
+                                    add-item=`(${items} = ${items} || 
[]).push({})`
+                                    label-single='configuration'
+                                    label-multiple='configurations'
+                                )
+
+            +clusters-cache-key-cfg
+
+        .pca-form-column-6
+            +preview-xml-java(model, 'clusterCacheKeyConfiguration')

http://git-wip-us.apache.org/repos/asf/ignite/blob/d24dab81/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint.pug
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint.pug
index 5adb29c..b00c98c 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint.pug
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/checkpoint.pug
@@ -21,65 +21,62 @@ include /app/helpers/jade/mixins
 -var CustomCheckpoint = '$checkpointSPI.kind === "Custom"'
 -var CacheCheckpoint = '$checkpointSPI.kind === "Cache"'
 
-.pca-panel.pca-panel-default(ng-form=form novalidate)
-    .pca-panel-heading(bs-collapse-toggle ng-click=`ui.loadPanel('${form}')`)
-        ignite-form-panel-chevron
-        .pca-panel-heading-title Checkpointing
-        .pca-panel-heading-description
-            | Checkpointing provides an ability to save an intermediate job 
state. 
-            | 
#[a.link-success(href="https://apacheignite.readme.io/docs/checkpointing"; 
target="_blank") More info]
-    .pca-panel-collapse(role='tabpanel' bs-collapse-target id=`${form}`)
-        .pca-panel-body(ng-i_f=`ui.isPanelLoaded('${form}')`).pca-form-row
-            .pca-form-column-6.pc-form-grid-row
-                .pc-form-grid-col-60
-                    .ignite-form-field
-                        +ignite-form-field__label('Checkpoint SPI 
configurations:', '"checkpointSPIConfigurations"')
-                        .ignite-form-field__control
-                            list-editable(ng-model=model 
name='checkpointSPIConfigurations')
-                                
list-editable-item-edit(item-name='$checkpointSPI').pc-form-grid-row
-                                    .pc-form-grid-col-60
-                                        +dropdown-required('Checkpoint SPI:', 
'$checkpointSPI.kind', '"checkpointKind"', '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>')
+panel-collapsible(ng-form=form)
+    panel-title Checkpointing
+    panel-description
+        | Checkpointing provides an ability to save an intermediate job state. 
+        | 
#[a.link-success(href="https://apacheignite.readme.io/docs/checkpointing"; 
target="_blank") More info]
+    panel-content.pca-form-row
+        .pca-form-column-6.pc-form-grid-row
+            .pc-form-grid-col-60
+                .ignite-form-field
+                    +ignite-form-field__label('Checkpoint SPI 
configurations:', '"checkpointSPIConfigurations"')
+                    .ignite-form-field__control
+                        list-editable(ng-model=model 
name='checkpointSPIConfigurations')
+                            
list-editable-item-edit(item-name='$checkpointSPI').pc-form-grid-row
+                                .pc-form-grid-col-60
+                                    +dropdown-required('Checkpoint SPI:', 
'$checkpointSPI.kind', '"checkpointKind"', '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>')
 
-                                    include ./checkpoint/fs
+                                include ./checkpoint/fs
 
-                                    
.pc-form-grid-col-60(ng-if-start=CacheCheckpoint)
-                                        +dropdown-required-empty('Cache:', 
'$checkpointSPI.Cache.cache', '"checkpointCacheCache"', 'true', CacheCheckpoint,
-                                            'Choose cache', 'No caches 
configured for current cluster', '$ctrl.cachesMenu', 'Cache to use for storing 
checkpoints')(
-                                            
pc-is-in-collection='$ctrl.clonedCluster.caches'
-                                        )
-                                            +form-field-feedback(form, 
'isInCollection', `Cluster doesn't have such a cache`)
-                                    .pc-form-grid-col-60(ng-if-end)
-                                        +java-class('Listener:', 
'$checkpointSPI.Cache.checkpointListener', '"checkpointCacheListener"', 'true', 
'false',
-                                            'Checkpoint listener 
implementation class name', CacheCheckpoint)
+                                
.pc-form-grid-col-60(ng-if-start=CacheCheckpoint)
+                                    +dropdown-required-empty('Cache:', 
'$checkpointSPI.Cache.cache', '"checkpointCacheCache"', 'true', CacheCheckpoint,
+                                        'Choose cache', 'No caches configured 
for current cluster', '$ctrl.cachesMenu', 'Cache to use for storing 
checkpoints')(
+                                        
pc-is-in-collection='$ctrl.clonedCluster.caches'
+                                    )
+                                        +form-field-feedback(form, 
'isInCollection', `Cluster doesn't have such a cache`)
+                                .pc-form-grid-col-60(ng-if-end)
+                                    +java-class('Listener:', 
'$checkpointSPI.Cache.checkpointListener', '"checkpointCacheListener"', 'true', 
'false',
+                                        'Checkpoint listener implementation 
class name', CacheCheckpoint)
 
-                                    include ./checkpoint/s3
+                                include ./checkpoint/s3
 
-                                    include ./checkpoint/jdbc
+                                include ./checkpoint/jdbc
 
-                                    
.pc-form-grid-col-60(ng-if=CustomCheckpoint)
-                                        +java-class('Class name:', 
'$checkpointSPI.Custom.className', '"checkpointCustomClassName"', 'true', 
CustomCheckpoint,
-                                        'Custom CheckpointSpi implementation 
class', CustomCheckpoint)
+                                .pc-form-grid-col-60(ng-if=CustomCheckpoint)
+                                    +java-class('Class name:', 
'$checkpointSPI.Custom.className', '"checkpointCustomClassName"', 'true', 
CustomCheckpoint,
+                                    'Custom CheckpointSpi implementation 
class', CustomCheckpoint)
 
-                                list-editable-no-items
-                                    list-editable-add-item-button(
-                                        
add-item=`$edit($ctrl.Clusters.addCheckpointSPI($ctrl.clonedCluster))`
-                                        label-single='checkpoint SPI 
configuration'
-                                        label-multiple='checkpoint SPI 
configurations'
-                                    )
-            
-            .pca-form-column-6
-                +preview-xml-java('$ctrl.clonedCluster', 'clusterCheckpoint', 
'$ctrl.caches')
+                            list-editable-no-items
+                                list-editable-add-item-button(
+                                    
add-item=`$edit($ctrl.Clusters.addCheckpointSPI($ctrl.clonedCluster))`
+                                    label-single='checkpoint SPI configuration'
+                                    label-multiple='checkpoint SPI 
configurations'
+                                )
+        
+        .pca-form-column-6
+            +preview-xml-java('$ctrl.clonedCluster', 'clusterCheckpoint', 
'$ctrl.caches')

http://git-wip-us.apache.org/repos/asf/ignite/blob/d24dab81/modules/web-console/frontend/app/modules/states/configuration/clusters/client-connector.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/client-connector.pug
 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/client-connector.pug
index 5421255..d27fa14 100644
--- 
a/modules/web-console/frontend/app/modules/states/configuration/clusters/client-connector.pug
+++ 
b/modules/web-console/frontend/app/modules/states/configuration/clusters/client-connector.pug
@@ -23,57 +23,54 @@ include /app/helpers/jade/mixins
 -var sslEnabled = `${connectionEnabled} && ${connectionModel}.sslEnabled`
 -var sslFactoryEnabled = `${sslEnabled} && 
!${connectionModel}.useIgniteSslContextFactory`
 
-.pca-panel.pca-panel-default(ng-show='$ctrl.available("2.3.0")' ng-form=form 
novalidate)
-    .pca-panel-heading(bs-collapse-toggle ng-click=`ui.loadPanel('${form}')`)
-        ignite-form-panel-chevron
-        .pca-panel-heading-title Client connector configuration
-    .pca-panel-collapse(role='tabpanel' bs-collapse-target id=`${form}`)
-        .pca-panel-body(ng-if=`$ctrl.available("2.3.0") && 
ui.isPanelLoaded('${form}')`).pca-form-row
-            .pca-form-column-6.pc-form-grid-row
-                .pc-form-grid-col-60
-                    +checkbox('Enabled', connectionEnabled, 
'"ClientConnectorEnabled"', 'Flag indicating whether to configure client 
connector configuration')
-                .pc-form-grid-col-40
-                    +text-enabled('Host:', `${connectionModel}.host`, 
'"ClientConnectorHost"', connectionEnabled, 'false', 'localhost')
-                .pc-form-grid-col-20
-                    +number('Port:', `${connectionModel}.port`, 
'"ClientConnectorPort"', connectionEnabled, '10800', '1025')
-                .pc-form-grid-col-20
-                    +number('Port range:', `${connectionModel}.portRange`, 
'"ClientConnectorPortRange"', connectionEnabled, '100', '0')
-                .pc-form-grid-col-20
-                    +number('Socket send buffer size:', 
`${connectionModel}.socketSendBufferSize`, 
'"ClientConnectorSocketSendBufferSize"', connectionEnabled, '0', '0',
-                        'Socket send buffer size<br/>\
-                        When set to <b>0</b>, operation system default will be 
used')
-                .pc-form-grid-col-20
-                    +number('Socket receive buffer size:', 
`${connectionModel}.socketReceiveBufferSize`, 
'"ClientConnectorSocketReceiveBufferSize"', connectionEnabled, '0', '0',
-                        'Socket receive buffer size<br/>\
-                        When set to <b>0</b>, operation system default will be 
used')
-                .pc-form-grid-col-30
-                    +number('Max connection cursors:', 
`${connectionModel}.maxOpenCursorsPerConnection`, 
'"ClientConnectorMaxOpenCursorsPerConnection"', connectionEnabled, '128', '0',
-                        'Max number of opened cursors per connection')
-                .pc-form-grid-col-30
-                    +number('Pool size:', `${connectionModel}.threadPoolSize`, 
'"ClientConnectorThreadPoolSize"', connectionEnabled, 'max(8, 
availableProcessors)', '1',
-                        'Size of thread pool that is in charge of processing 
SQL requests')
-                .pc-form-grid-col-60
-                    +checkbox-enabled('TCP_NODELAY option', 
`${connectionModel}.tcpNoDelay`, '"ClientConnectorTcpNoDelay"', 
connectionEnabled)
-                .pc-form-grid-col-60(ng-if='$ctrl.available("2.4.0")')
-                    +number('Idle timeout:', `${connectionModel}.idleTimeout`, 
'"ClientConnectorIdleTimeout"', connectionEnabled, '0', '-1',
-                        'Idle timeout for client connections<br/>\
-                        Zero or negative means no timeout')
-                .pc-form-grid-col-60(ng-if-start='$ctrl.available("2.5.0")')
-                    +checkbox-enabled('Enable SSL', 
`${connectionModel}.sslEnabled`, '"ClientConnectorSslEnabled"', 
connectionEnabled, 'Enable secure socket layer on client connector')
-                .pc-form-grid-col-60
-                    +checkbox-enabled('Enable SSL client auth', 
`${connectionModel}.sslClientAuth`, '"ClientConnectorSslClientAuth"', 
sslEnabled, 'Flag indicating whether or not SSL client authentication is 
required')
-                .pc-form-grid-col-60
-                    +checkbox-enabled('Use Ignite SSL', 
`${connectionModel}.useIgniteSslContextFactory`, 
'"ClientConnectorUseIgniteSslContextFactory"', sslEnabled, 'Use SSL factory 
Ignite configuration')
-                .pc-form-grid-col-60(ng-if-end)
-                    +java-class('SSL factory:', 
`${connectionModel}.sslContextFactory`, '"ClientConnectorSslContextFactory"', 
sslFactoryEnabled, sslFactoryEnabled,
-                    'If SSL factory specified then replication will be 
performed through secure SSL channel created with this factory<br/>\
-                    If not present <b>isUseIgniteSslContextFactory()</b> flag 
will be evaluated<br/>\
-                    If set to <b>true</b> and 
<b>IgniteConfiguration#getSslContextFactory()</b> exists, then Ignite SSL 
context factory will be used to establish secure connection')
-                .pc-form-grid-col-60(ng-if-start='$ctrl.available("2.4.0")')
-                    +checkbox-enabled('JDBC Enabled', 
`${connectionModel}.jdbcEnabled`, '"ClientConnectorJdbcEnabled"', 
connectionEnabled, 'Access through JDBC is enabled')
-                .pc-form-grid-col-60
-                    +checkbox-enabled('ODBC Enabled', 
`${connectionModel}.odbcEnabled`, '"ClientConnectorOdbcEnabled"', 
connectionEnabled, 'Access through ODBC is enabled')
-                .pc-form-grid-col-60(ng-if-end)
-                    +checkbox-enabled('Thin client enabled', 
`${connectionModel}.thinClientEnabled`, '"ClientConnectorThinCliEnabled"', 
connectionEnabled, 'Access through thin client is enabled')
-            .pca-form-column-6
-                +preview-xml-java(model, 'clusterClientConnector')
+panel-collapsible(ng-show='$ctrl.available("2.3.0")' ng-form=form 
on-open=`ui.loadPanel('${form}')`)
+    panel-title Client connector configuration
+    panel-content.pca-form-row(ng-if=`$ctrl.available("2.3.0") && 
ui.isPanelLoaded('${form}')`)
+        .pca-form-column-6.pc-form-grid-row
+            .pc-form-grid-col-60
+                +checkbox('Enabled', connectionEnabled, 
'"ClientConnectorEnabled"', 'Flag indicating whether to configure client 
connector configuration')
+            .pc-form-grid-col-40
+                +text-enabled('Host:', `${connectionModel}.host`, 
'"ClientConnectorHost"', connectionEnabled, 'false', 'localhost')
+            .pc-form-grid-col-20
+                +number('Port:', `${connectionModel}.port`, 
'"ClientConnectorPort"', connectionEnabled, '10800', '1025')
+            .pc-form-grid-col-20
+                +number('Port range:', `${connectionModel}.portRange`, 
'"ClientConnectorPortRange"', connectionEnabled, '100', '0')
+            .pc-form-grid-col-20
+                +number('Socket send buffer size:', 
`${connectionModel}.socketSendBufferSize`, 
'"ClientConnectorSocketSendBufferSize"', connectionEnabled, '0', '0',
+                    'Socket send buffer size<br/>\
+                    When set to <b>0</b>, operation system default will be 
used')
+            .pc-form-grid-col-20
+                +number('Socket receive buffer size:', 
`${connectionModel}.socketReceiveBufferSize`, 
'"ClientConnectorSocketReceiveBufferSize"', connectionEnabled, '0', '0',
+                    'Socket receive buffer size<br/>\
+                    When set to <b>0</b>, operation system default will be 
used')
+            .pc-form-grid-col-30
+                +number('Max connection cursors:', 
`${connectionModel}.maxOpenCursorsPerConnection`, 
'"ClientConnectorMaxOpenCursorsPerConnection"', connectionEnabled, '128', '0',
+                    'Max number of opened cursors per connection')
+            .pc-form-grid-col-30
+                +number('Pool size:', `${connectionModel}.threadPoolSize`, 
'"ClientConnectorThreadPoolSize"', connectionEnabled, 'max(8, 
availableProcessors)', '1',
+                    'Size of thread pool that is in charge of processing SQL 
requests')
+            .pc-form-grid-col-60
+                +checkbox-enabled('TCP_NODELAY option', 
`${connectionModel}.tcpNoDelay`, '"ClientConnectorTcpNoDelay"', 
connectionEnabled)
+            .pc-form-grid-col-60(ng-if='$ctrl.available("2.4.0")')
+                +number('Idle timeout:', `${connectionModel}.idleTimeout`, 
'"ClientConnectorIdleTimeout"', connectionEnabled, '0', '-1',
+                    'Idle timeout for client connections<br/>\
+                    Zero or negative means no timeout')
+            .pc-form-grid-col-60(ng-if-start='$ctrl.available("2.5.0")')
+                +checkbox-enabled('Enable SSL', 
`${connectionModel}.sslEnabled`, '"ClientConnectorSslEnabled"', 
connectionEnabled, 'Enable secure socket layer on client connector')
+            .pc-form-grid-col-60
+                +checkbox-enabled('Enable SSL client auth', 
`${connectionModel}.sslClientAuth`, '"ClientConnectorSslClientAuth"', 
sslEnabled, 'Flag indicating whether or not SSL client authentication is 
required')
+            .pc-form-grid-col-60
+                +checkbox-enabled('Use Ignite SSL', 
`${connectionModel}.useIgniteSslContextFactory`, 
'"ClientConnectorUseIgniteSslContextFactory"', sslEnabled, 'Use SSL factory 
Ignite configuration')
+            .pc-form-grid-col-60(ng-if-end)
+                +java-class('SSL factory:', 
`${connectionModel}.sslContextFactory`, '"ClientConnectorSslContextFactory"', 
sslFactoryEnabled, sslFactoryEnabled,
+                'If SSL factory specified then replication will be performed 
through secure SSL channel created with this factory<br/>\
+                If not present <b>isUseIgniteSslContextFactory()</b> flag will 
be evaluated<br/>\
+                If set to <b>true</b> and 
<b>IgniteConfiguration#getSslContextFactory()</b> exists, then Ignite SSL 
context factory will be used to establish secure connection')
+            .pc-form-grid-col-60(ng-if-start='$ctrl.available("2.4.0")')
+                +checkbox-enabled('JDBC Enabled', 
`${connectionModel}.jdbcEnabled`, '"ClientConnectorJdbcEnabled"', 
connectionEnabled, 'Access through JDBC is enabled')
+            .pc-form-grid-col-60
+                +checkbox-enabled('ODBC Enabled', 
`${connectionModel}.odbcEnabled`, '"ClientConnectorOdbcEnabled"', 
connectionEnabled, 'Access through ODBC is enabled')
+            .pc-form-grid-col-60(ng-if-end)
+                +checkbox-enabled('Thin client enabled', 
`${connectionModel}.thinClientEnabled`, '"ClientConnectorThinCliEnabled"', 
connectionEnabled, 'Access through thin client is enabled')
+        .pca-form-column-6
+            +preview-xml-java(model, 'clusterClientConnector')

Reply via email to