IGNITE-11354 Web console: Actualized cluster configuration.
diff --git a/backend/app/schemas.js b/backend/app/schemas.js
index 29493a5..50b97f3 100644
--- a/backend/app/schemas.js
+++ b/backend/app/schemas.js
@@ -494,6 +494,9 @@
             authenticator: String,
             forceServerMode: Boolean,
             clientReconnectDisabled: Boolean,
+            connectionRecoveryTimeout: Number,
+            reconnectDelay: Number,
+            soLinger: Number,
             kind: {
                 type: String,
                 enum: ['Vm', 'Multicast', 'S3', 'Cloud', 'GoogleStorage', 'Jdbc', 'SharedFs', 'ZooKeeper', 'Kubernetes']
@@ -655,7 +658,8 @@
                 Custom: {
                     className: String
                 }
-            }
+            },
+            groupName: String
         },
         binaryConfiguration: {
             idMapper: String,
@@ -730,7 +734,11 @@
             unacknowledgedMessagesBufferSize: Number,
             socketWriteTimeout: Number,
             selectorsCount: Number,
-            addressResolver: String
+            addressResolver: String,
+            selectorSpins: Number,
+            connectionsPerNode: Number,
+            usePairedConnections: Boolean,
+            filterReachableAddresses: Boolean
         },
         connector: {
             enabled: Boolean,
@@ -1146,7 +1154,9 @@
             walAutoArchiveAfterInactivity: Number,
             writeThrottlingEnabled: Boolean,
             walCompactionEnabled: Boolean,
-            checkpointReadLockTimeout: Number
+            checkpointReadLockTimeout: Number,
+            maxWalArchiveSize: Number,
+            walCompactionLevel: Number
         },
         memoryConfiguration: {
             systemCacheInitialSize: Number,
diff --git a/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/atomic.pug b/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/atomic.pug
index d227c27..b27ada9 100644
--- a/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/atomic.pug
+++ b/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/atomic.pug
@@ -38,16 +38,16 @@
                     name: '"cacheMode"',
                     placeholder: 'PARTITIONED',
                     options: '[\
-                                            {value: "LOCAL", label: "LOCAL"},\
-                                            {value: "REPLICATED", label: "REPLICATED"},\
-                                            {value: "PARTITIONED", label: "PARTITIONED"}\
-                                        ]',
+                        {value: "LOCAL", label: "LOCAL"},\
+                        {value: "REPLICATED", label: "REPLICATED"},\
+                        {value: "PARTITIONED", label: "PARTITIONED"}\
+                    ]',
                     tip: '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>'
+                        <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
                 +form-field__number({
@@ -77,11 +77,11 @@
                     placeholder: 'Default',
                     options: '$ctrl.Clusters.affinityFunctions',
                     tip: '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>'
+                        <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
@@ -117,5 +117,13 @@
                             required: customAff,
                             tip: 'Custom key affinity function implementation class name'
                         })
+            .pc-form-grid-col-60(ng-if='$ctrl.available("2.1.0")')
+                +form-field__text({
+                    label: 'Default group name:',
+                    model: `${model}.groupName`,
+                    name: '"AtomicGroupName"',
+                    placeholder: 'Input group name',
+                    tip: 'Group name'
+                })
         .pca-form-column-6
             +preview-xml-java(model, 'clusterAtomics')
diff --git a/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/communication.pug b/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/communication.pug
index 6a3de5b..0f7ce23 100644
--- a/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/communication.pug
+++ b/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/communication.pug
@@ -236,6 +236,24 @@
                     min: '1',
                     tip: 'Count of selectors te be used in TCP server'
                 })
+            .pc-form-grid-col-30
+                +form-field__number({
+                    label: 'Selectors spins:',
+                    model: `${communication}.selectorSpins`,
+                    name: '"selectorSpins"',
+                    placeholder: '0',
+                    min: '0',
+                    tip: 'Defines how many non-blocking selector.selectNow() should be made before falling into selector.select(long) in NIO server'
+                })
+            .pc-form-grid-col-30
+                +form-field__number({
+                    label: 'Connections per node:',
+                    model: `${communication}.connectionsPerNode`,
+                    name: '"connectionsPerNode"',
+                    placeholder: '1',
+                    min: '1',
+                    tip: 'Number of connections to each remote node'
+                })
             .pc-form-grid-col-60
                 +form-field__java-class({
                     label: 'Address resolver:',
@@ -265,5 +283,19 @@
                     name: '"tcpNoDelay"',
                     tip: 'Value for TCP_NODELAY socket option'
                 })
+            .pc-form-grid-col-60
+                +form-field__checkbox({
+                    label: 'Use paired connections',
+                    model: `${communication}.usePairedConnections`,
+                    name: '"usePairedConnections"',
+                    tip: 'Maintain connection for outgoing and incoming messages separately'
+                })
+            .pc-form-grid-col-60(ng-if='$ctrl.available("2.3.0")')
+                +form-field__checkbox({
+                    label: 'Filter reachable addresses',
+                    model: `${communication}.filterReachableAddresses`,
+                    name: '"filterReachableAddresses"',
+                    tip: 'Filter for reachable addresses on creating tcp client'
+                })
         .pca-form-column-6
             +preview-xml-java(model, 'clusterCommunication')
diff --git a/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/data-storage.pug b/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/data-storage.pug
index a7f0891..caab4ea 100644
--- a/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/data-storage.pug
+++ b/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/data-storage.pug
@@ -319,14 +319,6 @@
                     placeholder: 'db/wal',
                     tip: 'A path to the directory where WAL is stored'
                 })
-            .pc-form-grid-col-60
-                +form-field__text({
-                    label: 'WAL archive path:',
-                    model: `${model}.walArchivePath`,
-                    name: '"DataStorageWalArchivePath"',
-                    placeholder: 'db/wal/archive',
-                    tip: 'A path to the WAL archive directory'
-                })
             .pc-form-grid-col-20
                 +form-field__number({
                     label: 'WAL segments:',
@@ -354,6 +346,44 @@
                     min: '1',
                     tip: 'A total number of checkpoints to keep in the WAL history'
                 })
+            .pc-form-grid-col-60
+                +form-field__text({
+                    label: 'WAL archive path:',
+                    model: `${model}.walArchivePath`,
+                    name: '"DataStorageWalArchivePath"',
+                    placeholder: 'db/wal/archive',
+                    tip: 'A path to the WAL archive directory'
+                })
+            .pc-form-grid-col-60(ng-if='$ctrl.available("2.7.0")')
+                form-field-size(
+                    label='Max allowed size of WAL archives:'
+                    ng-model=`${model}.maxWalArchiveSize`
+                    name='DataStorageMaxWalArchiveSize'
+                    placeholder='1'
+                    min='1'
+                    tip='Max allowed size of WAL archives'
+                    size-scale-label='gb'
+                    size-type='bytes'
+                )
+            .pc-form-grid-col-60(ng-if='$ctrl.available("2.7.0")')
+                +form-field__number({
+                    label: 'WAL compaction level:',
+                    model: `${model}.walCompactionLevel`,
+                    name: '"DataStorageWalCompactionLevel"',
+                    placeholder: '1',
+                    min: '0',
+                    max: '9',
+                    tip: 'ZIP level to WAL compaction (0-9)'
+                })
+            .pc-form-grid-col-60
+                +form-field__number({
+                    label: 'WAL auto archive after inactivity:',
+                    model: `${model}.walAutoArchiveAfterInactivity`,
+                    name: '"DataStorageWalAutoArchiveAfterInactivity"',
+                    placeholder: '-1',
+                    min: '-1',
+                    tip: 'Time in millis to run auto archiving segment after last record logging'
+                })
             .pc-form-grid-col-60(ng-if='$ctrl.available("2.4.0")')
                 +form-field__number({
                     label: 'WAL buffer size:',
@@ -426,7 +456,7 @@
                     min: '1000',
                     tip: 'The length of the time interval for rate - based metrics. This interval defines a window over which hits will be tracked'
                 })
-            .pc-form-grid-col-30
+            .pc-form-grid-col-60
                 +form-field__dropdown({
                     label: 'File IO factory:',
                     model: `${model}.fileIOFactory`,
@@ -443,16 +473,6 @@
                             <li>SEQUENTIAL - All checkpoint pages are collected into single list and sorted by page index</li>\
                         </ul>'
                 })
-
-            .pc-form-grid-col-30
-                +form-field__number({
-                    label: 'WAL auto archive after inactivity:',
-                    model: `${model}.walAutoArchiveAfterInactivity`,
-                    name: '"DataStorageWalAutoArchiveAfterInactivity"',
-                    placeholder: '-1',
-                    min: '-1',
-                    tip: 'Time in millis to run auto archiving segment after last record logging'
-                })
             .pc-form-grid-col-60
                 +form-field__checkbox({
                     label: 'Metrics enabled',
diff --git a/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/discovery.pug b/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/discovery.pug
index 0ff6313..2d5b017 100644
--- a/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/discovery.pug
+++ b/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/discovery.pug
@@ -214,6 +214,33 @@
                     name: '"authenticator"',
                     tip: 'Class name of node authenticator implementation'
                 })
+            .pc-form-grid-col-60(ng-if='$ctrl.available("2.4.0")')
+                +form-field__number({
+                    label: 'Reconnect delay:',
+                    model: `${model}.reconnectDelay`,
+                    name: '"reconnectDelay"',
+                    placeholder: '2000',
+                    min: '0',
+                    tip: 'Amount of time in milliseconds that node waits before retrying to (re)connect to the cluster'
+                })
+            .pc-form-grid-col-60(ng-if='$ctrl.available("2.7.0")')
+                +form-field__number({
+                    label: 'Connection recovery timeout:',
+                    model: `${model}.connectionRecoveryTimeout`,
+                    name: '"connectionRecoveryTimeout"',
+                    placeholder: '10000',
+                    min: '0',
+                    tip: 'Defines how long server node would try to recovery connection'
+                })
+            .pc-form-grid-col-60(ng-if='$ctrl.available("2.8.0")')
+                +form-field__number({
+                    label: 'SO Linger timeout:',
+                    model: `${model}.soLinger`,
+                    name: '"soLinger"',
+                    placeholder: '5',
+                    min: '-1',
+                    tip: 'SO_LINGER timeout for socket'
+                })
             .pc-form-grid-col-60
                 +form-field__checkbox({
                     label: 'Force server mode',
diff --git a/frontend/app/configuration/generator/generator/ConfigurationGenerator.js b/frontend/app/configuration/generator/generator/ConfigurationGenerator.js
index 98bfaf2..3b24f14 100644
--- a/frontend/app/configuration/generator/generator/ConfigurationGenerator.js
+++ b/frontend/app/configuration/generator/generator/ConfigurationGenerator.js
@@ -220,8 +220,7 @@
         if (isNil(cluster.discovery))
             return cfg;
 
-        const discovery = new Bean('org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi', 'discovery',
-            cluster.discovery, clusterDflts.discovery);
+        const discovery = IgniteConfigurationGenerator.discoveryConfigurationBean(cluster.discovery);
 
         let ipFinder;
 
@@ -483,6 +482,8 @@
 
     // Generate atomics group.
     static clusterAtomics(atomics, available, cfg = this.igniteConfigurationBean()) {
+        const available2_1 = available('2.1.0');
+
         const acfg = new Bean('org.apache.ignite.configuration.AtomicConfiguration', 'atomicCfg',
             atomics, clusterDflts.atomics);
 
@@ -492,9 +493,12 @@
         if (acfg.valueOf('cacheMode') === 'PARTITIONED')
             acfg.intProperty('backups');
 
-        if (available('2.1.0') && nonNil(atomics))
+        if (available2_1 && nonNil(atomics))
             this.affinity(atomics.affinity, acfg);
 
+        if (available2_1)
+            acfg.stringProperty('groupName');
+
         if (acfg.isEmpty())
             return cfg;
 
@@ -960,7 +964,13 @@
             .intProperty('unacknowledgedMessagesBufferSize')
             .longProperty('socketWriteTimeout')
             .intProperty('selectorsCount')
-            .emptyBeanProperty('addressResolver');
+            .longProperty('selectorSpins')
+            .intProperty('connectionsPerNode')
+            .emptyBeanProperty('addressResolver')
+            .boolProperty('usePairedConnections');
+
+        if (available('2.3.0'))
+            commSpi.boolProperty('filterReachableAddresses');
 
         if (commSpi.nonEmpty())
             cfg.beanProperty('communicationSpi', commSpi);
@@ -1096,8 +1106,18 @@
             .intProperty('reconnectCount')
             .longProperty('statisticsPrintFrequency')
             .longProperty('ipFinderCleanFrequency')
-            .emptyBeanProperty('authenticator')
-            .intProperty('forceServerMode')
+            .emptyBeanProperty('authenticator');
+
+        if (available('2.4.0'))
+            discoSpi.longProperty('reconnectDelay');
+
+        if (available('2.7.0'))
+            discoSpi.longProperty('connectionRecoveryTimeout');
+
+        if (available('2.8.0'))
+            discoSpi.intProperty('soLinger');
+
+        discoSpi.intProperty('forceServerMode')
             .intProperty('clientReconnectDisabled');
 
         if (discoSpi.nonEmpty())
@@ -1495,6 +1515,8 @@
         if (!available('2.3.0'))
             return cfg;
 
+        const available2_4 = available('2.4.0');
+        const available2_7 = available('2.7.0');
         const storageBean = new Bean('org.apache.ignite.configuration.DataStorageConfiguration', 'dataStorageCfg', dataStorageCfg, clusterDflts.dataStorageConfiguration);
 
         storageBean.intProperty('pageSize')
@@ -1524,7 +1546,7 @@
         storageBean.stringProperty('storagePath')
             .longProperty('checkpointFrequency');
 
-        if (available('2.7.0')) {
+        if (available2_7) {
             storageBean
                 .longProperty('checkpointReadLockTimeout');
         }
@@ -1533,12 +1555,19 @@
             .enumProperty('checkpointWriteOrder')
             .enumProperty('walMode')
             .stringProperty('walPath')
-            .stringProperty('walArchivePath')
+            .stringProperty('walArchivePath');
+
+        if (available2_7) {
+            storageBean.longProperty('maxWalArchiveSize')
+                .intProperty('walCompactionLevel');
+        }
+
+        storageBean.longProperty('walAutoArchiveAfterInactivity')
             .intProperty('walSegments')
             .intProperty('walSegmentSize')
             .intProperty('walHistorySize');
 
-        if (available('2.4.0'))
+        if (available2_4)
             storageBean.intProperty('walBufferSize');
 
         storageBean.longProperty('walFlushFrequency')
@@ -1548,12 +1577,11 @@
             .intProperty('walThreadLocalBufferSize')
             .intProperty('metricsSubIntervalCount')
             .longProperty('metricsRateTimeInterval')
-            .longProperty('walAutoArchiveAfterInactivity')
             .boolProperty('metricsEnabled')
             .boolProperty('alwaysWriteFullPages')
             .boolProperty('writeThrottlingEnabled');
 
-        if (available('2.4.0'))
+        if (available2_4)
             storageBean.boolProperty('walCompactionEnabled');
 
         const fileIOFactory = _.get(dataStorageCfg, 'fileIOFactory');
diff --git a/frontend/app/configuration/generator/generator/defaults/Cluster.service.js b/frontend/app/configuration/generator/generator/defaults/Cluster.service.js
index fac2cc5..e486ee6 100644
--- a/frontend/app/configuration/generator/generator/defaults/Cluster.service.js
+++ b/frontend/app/configuration/generator/generator/defaults/Cluster.service.js
@@ -37,6 +37,9 @@
         ipFinderCleanFrequency: 60000,
         forceServerMode: false,
         clientReconnectDisabled: false,
+        reconnectDelay: 2000,
+        connectionRecoveryTimeout: 10000,
+        soLinger: 5,
         Multicast: {
             multicastGroup: '228.1.2.4',
             multicastPort: 47400,
@@ -87,7 +90,6 @@
     },
     atomics: {
         atomicSequenceReserveSize: 1000,
-        backups: 0,
         cacheMode: {
             clsName: 'org.apache.ignite.cache.CacheMode',
             value: 'PARTITIONED'
@@ -142,7 +144,11 @@
         tcpNoDelay: true,
         ackSendThreshold: 16,
         unacknowledgedMessagesBufferSize: 0,
-        socketWriteTimeout: 2000
+        socketWriteTimeout: 2000,
+        selectorSpins: 0,
+        connectionsPerNode: 1,
+        usePairedConnections: false,
+        filterReachableAddresses: false
     },
     networkTimeout: 5000,
     networkSendRetryDelay: 1000,
@@ -369,7 +375,9 @@
         lockWaitTime: 10000,
         walThreadLocalBufferSize: 131072,
         metricsSubIntervalCount: 5,
-        metricsRateTimeInterval: 60000
+        metricsRateTimeInterval: 60000,
+        maxWalArchiveSize: 1073741824,
+        walCompactionLevel: 1
     },
     utilityCacheKeepAliveTime: 60000,
     hadoopConfiguration: {
diff --git a/src/test/java/org/apache/ignite/console/configuration/WebConsoleConfigurationSelfTest.java b/src/test/java/org/apache/ignite/console/configuration/WebConsoleConfigurationSelfTest.java
index a163a39..a7fbc25 100644
--- a/src/test/java/org/apache/ignite/console/configuration/WebConsoleConfigurationSelfTest.java
+++ b/src/test/java/org/apache/ignite/console/configuration/WebConsoleConfigurationSelfTest.java
@@ -223,6 +223,7 @@
         atomicCfgProps.add("atomicSequenceReserveSize");
         atomicCfgProps.add("backups");
         atomicCfgProps.add("affinity");
+        atomicCfgProps.add("groupName");
 
         metadata.put(AtomicConfiguration.class, new MetadataInfo(atomicCfgProps, EMPTY_FIELDS, EMPTY_FIELDS));
 
@@ -346,17 +347,13 @@
         commProps.add("directBuffer");
         commProps.add("directSendBuffer");
         commProps.add("tcpNoDelay");
+        commProps.add("selectorSpins");
+        commProps.add("connectionsPerNode");
+        commProps.add("usePairedConnections");
+        commProps.add("filterReachableAddresses");
+        commProps.add("soLinger");
 
-        Set<String> commPropsDep = new HashSet<>();
-        commPropsDep.add("discoveryStartupDelay");
-
-        // Removed from configuration since ignite 2.3
-        Set<String> commPropsExcl = new HashSet<>();
-        commPropsExcl.add("discoveryStartupDelay");
-        commPropsExcl.addAll(SPI_EXCLUDED_FIELDS);
-
-        metadata.put(TcpCommunicationSpi.class,
-            new MetadataInfo(commProps, commPropsDep, commPropsExcl));
+        metadata.put(TcpCommunicationSpi.class, new MetadataInfo(commProps, EMPTY_FIELDS, SPI_EXCLUDED_FIELDS));
 
         Set<String> discoverySpiProps = new HashSet<>();
         discoverySpiProps.add("ipFinder");
@@ -384,7 +381,13 @@
         discoverySpiProps.add("authenticator");
         discoverySpiProps.add("forceServerMode");
         discoverySpiProps.add("clientReconnectDisabled");
-        metadata.put(TcpDiscoverySpi.class, new MetadataInfo(discoverySpiProps, EMPTY_FIELDS, SPI_EXCLUDED_FIELDS));
+        discoverySpiProps.add("connectionRecoveryTimeout");
+        discoverySpiProps.add("reconnectDelay");
+
+        Set<String> discoverySpiExclProps = new HashSet<>();
+        discoverySpiExclProps.addAll(SPI_EXCLUDED_FIELDS);
+        discoverySpiExclProps.add("nodeAttributes");
+        metadata.put(TcpDiscoverySpi.class, new MetadataInfo(discoverySpiProps, EMPTY_FIELDS, discoverySpiExclProps));
 
         Set<String> connectorProps = new HashSet<>();
         connectorProps.add("jettyPath");
@@ -441,7 +444,10 @@
         dataStorageProps.add("metricsEnabled");
         dataStorageProps.add("alwaysWriteFullPages");
         dataStorageProps.add("writeThrottlingEnabled");
+        dataStorageProps.add("checkpointReadLockTimeout");
+        dataStorageProps.add("maxWalArchiveSize");
         dataStorageProps.add("walCompactionEnabled");
+        dataStorageProps.add("walCompactionLevel");
         metadata.put(DataStorageConfiguration.class, new MetadataInfo(dataStorageProps, EMPTY_FIELDS, EMPTY_FIELDS));
 
         Set<String> dataRegionProps = new HashSet<>();