You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ak...@apache.org on 2017/04/14 13:54:29 UTC

[01/11] ignite git commit: IGNITE-4988 Cleanup and refactor VisorXxx tasks and DTO for ignite-2.0

Repository: ignite
Updated Branches:
  refs/heads/master 8b56a43f2 -> 12dfe9e87


http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/frontend/app/modules/configuration/generator/ConfigurationGenerator.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/configuration/generator/ConfigurationGenerator.js b/modules/web-console/frontend/app/modules/configuration/generator/ConfigurationGenerator.js
index 3751f5c..f88736a 100644
--- a/modules/web-console/frontend/app/modules/configuration/generator/ConfigurationGenerator.js
+++ b/modules/web-console/frontend/app/modules/configuration/generator/ConfigurationGenerator.js
@@ -82,7 +82,6 @@ export default class IgniteConfigurationGenerator {
         this.clusterODBC(cluster.odbc, cfg);
         this.clusterMarshaller(cluster, cfg);
         this.clusterMetrics(cluster, cfg);
-        this.clusterSwap(cluster, cfg);
         this.clusterTime(cluster, cfg);
         this.clusterPools(cluster, cfg);
         this.clusterTransactions(cluster.transactionConfiguration, cfg);
@@ -1209,9 +1208,7 @@ export default class IgniteConfigurationGenerator {
         if (bean)
             cfg.beanProperty('marshaller', bean);
 
-        cfg.intProperty('marshalLocalJobs')
-            .intProperty('marshallerCacheKeepAliveTime')
-            .intProperty('marshallerCacheThreadPoolSize', 'marshallerCachePoolSize');
+        cfg.intProperty('marshalLocalJobs');
 
         return cfg;
     }
@@ -1248,14 +1245,14 @@ export default class IgniteConfigurationGenerator {
             const bean = new Bean('org.apache.ignite.ssl.SslContextFactory', 'sslCtxFactory',
                 cluster.sslContextFactory);
 
-            bean.intProperty('keyAlgorithm')
+            bean.stringProperty('keyAlgorithm')
                 .pathProperty('keyStoreFilePath');
 
             if (_.nonEmpty(bean.valueOf('keyStoreFilePath')))
                 bean.propertyChar('keyStorePassword', 'ssl.key.storage.password', 'YOUR_SSL_KEY_STORAGE_PASSWORD');
 
-            bean.intProperty('keyStoreType')
-                .intProperty('protocol');
+            bean.stringProperty('keyStoreType')
+                .stringProperty('protocol');
 
             if (_.nonEmpty(cluster.sslContextFactory.trustManagers)) {
                 bean.arrayProperty('trustManagers', 'trustManagers',
@@ -1268,7 +1265,7 @@ export default class IgniteConfigurationGenerator {
                 if (_.nonEmpty(bean.valueOf('trustStoreFilePath')))
                     bean.propertyChar('trustStorePassword', 'ssl.trust.storage.password', 'YOUR_SSL_TRUST_STORAGE_PASSWORD');
 
-                bean.intProperty('trustStoreType');
+                bean.stringProperty('trustStoreType');
             }
 
             cfg.beanProperty('sslContextFactory', bean);
@@ -1277,24 +1274,6 @@ export default class IgniteConfigurationGenerator {
         return cfg;
     }
 
-    // Generate swap group.
-    static clusterSwap(cluster, cfg = this.igniteConfigurationBean(cluster)) {
-        if (_.get(cluster.swapSpaceSpi, 'kind') === 'FileSwapSpaceSpi') {
-            const bean = new Bean('org.apache.ignite.spi.swapspace.file.FileSwapSpaceSpi', 'swapSpaceSpi',
-                cluster.swapSpaceSpi.FileSwapSpaceSpi);
-
-            bean.pathProperty('baseDirectory')
-                .intProperty('readStripesNumber')
-                .floatProperty('maximumSparsity')
-                .intProperty('maxWriteQueueSize')
-                .intProperty('writeBufferSize');
-
-            cfg.beanProperty('swapSpaceSpi', bean);
-        }
-
-        return cfg;
-    }
-
     // Generate time group.
     static clusterTime(cluster, cfg = this.igniteConfigurationBean(cluster)) {
         cfg.intProperty('clockSyncSamples')
@@ -1461,6 +1440,8 @@ export default class IgniteConfigurationGenerator {
                 .intProperty('readFromBackup');
         }
 
+        ccfg.enumProperty('partitionLossPolicy');
+
         ccfg.intProperty('copyOnRead');
 
         if (ccfg.valueOf('cacheMode') === 'PARTITIONED' && ccfg.valueOf('atomicityMode') === 'TRANSACTIONAL')
@@ -1506,15 +1487,9 @@ export default class IgniteConfigurationGenerator {
 
     // Generate cache memory group.
     static cacheMemory(cache, ccfg = this.cacheConfigurationBean(cache)) {
-        ccfg.enumProperty('memoryMode');
-
-        if (ccfg.valueOf('memoryMode') !== 'OFFHEAP_VALUES')
-            ccfg.intProperty('offHeapMaxMemory');
-
         this._evictionPolicy(ccfg, 'evictionPolicy', cache.evictionPolicy, cacheDflts.evictionPolicy);
 
-        ccfg.intProperty('startSize')
-            .boolProperty('swapEnabled');
+        ccfg.intProperty('startSize');
 
         return ccfg;
     }
@@ -1533,6 +1508,7 @@ export default class IgniteConfigurationGenerator {
             .intProperty('longQueryWarningTimeout')
             .arrayProperty('indexedTypes', 'indexedTypes', indexedTypes, 'java.lang.Class')
             .intProperty('queryDetailMetricsSize')
+            .intProperty('queryParallelism')
             .arrayProperty('sqlFunctionClasses', 'sqlFunctionClasses', cache.sqlFunctionClasses, 'java.lang.Class')
             .intProperty('snapshotableIndex')
             .intProperty('sqlEscapeAll');
@@ -1876,7 +1852,7 @@ export default class IgniteConfigurationGenerator {
     // Generate IGFS miscellaneous group.
     static igfsMisc(igfs, cfg = this.igfsConfigurationBean(igfs)) {
         cfg.intProperty('blockSize')
-            .intProperty('streamBufferSize')
+            .intProperty('bufferSize')
             .intProperty('maxSpaceSize')
             .intProperty('maximumTaskRangeLength')
             .intProperty('managementPort')

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/frontend/app/modules/configuration/generator/JavaTransformer.service.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/configuration/generator/JavaTransformer.service.js b/modules/web-console/frontend/app/modules/configuration/generator/JavaTransformer.service.js
index 9590779..df10b23 100644
--- a/modules/web-console/frontend/app/modules/configuration/generator/JavaTransformer.service.js
+++ b/modules/web-console/frontend/app/modules/configuration/generator/JavaTransformer.service.js
@@ -778,6 +778,9 @@ export default class IgniteJavaTransformer extends AbstractTransformer {
                     if (this._isBean(prop.typeClsName))
                         _.forEach(prop.items, (item) => imports.push(...this.collectBeanImports(item)));
 
+                    if (prop.typeClsName === 'java.lang.Class')
+                        _.forEach(prop.items, (item) => imports.push(item));
+
                     break;
                 case 'COLLECTION':
                     imports.push(prop.typeClsName);

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/frontend/app/modules/configuration/generator/PlatformGenerator.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/configuration/generator/PlatformGenerator.js b/modules/web-console/frontend/app/modules/configuration/generator/PlatformGenerator.js
index b076193..a78f078 100644
--- a/modules/web-console/frontend/app/modules/configuration/generator/PlatformGenerator.js
+++ b/modules/web-console/frontend/app/modules/configuration/generator/PlatformGenerator.js
@@ -282,6 +282,8 @@ export default ['JavaTypes', 'igniteClusterPlatformDefaults', 'igniteCachePlatfo
                     .intProperty('readFromBackup');
             }
 
+            ccfg.enumProperty('partitionLossPolicy');
+
             ccfg.intProperty('copyOnRead');
 
             if (ccfg.valueOf('cacheMode') === 'PARTITIONED' && ccfg.valueOf('atomicityMode') === 'TRANSACTIONAL')
@@ -292,15 +294,9 @@ export default ['JavaTypes', 'igniteClusterPlatformDefaults', 'igniteCachePlatfo
 
         // Generate cache memory group.
         static cacheMemory(cache, ccfg = this.cacheConfigurationBean(cache)) {
-            ccfg.enumProperty('memoryMode');
-
-            if (ccfg.valueOf('memoryMode') !== 'OFFHEAP_VALUES')
-                ccfg.intProperty('offHeapMaxMemory');
-
             // this._evictionPolicy(ccfg, 'evictionPolicy', cache.evictionPolicy, cacheDflts.evictionPolicy);
 
-            ccfg.intProperty('startSize')
-                .boolProperty('swapEnabled', 'EnableSwap');
+            ccfg.intProperty('startSize');
 
             return ccfg;
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/frontend/app/modules/configuration/generator/defaults/Cache.platform.service.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/configuration/generator/defaults/Cache.platform.service.js b/modules/web-console/frontend/app/modules/configuration/generator/defaults/Cache.platform.service.js
index eeac3a0..3253ba9 100644
--- a/modules/web-console/frontend/app/modules/configuration/generator/defaults/Cache.platform.service.js
+++ b/modules/web-console/frontend/app/modules/configuration/generator/defaults/Cache.platform.service.js
@@ -28,11 +28,6 @@ const DFLT_CACHE = {
         clsName: 'Apache.Ignite.Core.Cache.Configuration.CacheAtomicityMode',
         mapper: enumValueMapper
     },
-    memoryMode: {
-        clsName: 'Apache.Ignite.Core.Cache.Configuration.CacheMemoryMode',
-        value: 'ONHEAP_TIERED',
-        mapper: enumValueMapper
-    },
     atomicWriteOrderMode: {
         clsName: 'org.apache.ignite.cache.CacheAtomicWriteOrderMode',
         mapper: enumValueMapper

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/frontend/app/modules/configuration/generator/defaults/Cache.service.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/configuration/generator/defaults/Cache.service.js b/modules/web-console/frontend/app/modules/configuration/generator/defaults/Cache.service.js
index 14b315f..1a4c7c9 100644
--- a/modules/web-console/frontend/app/modules/configuration/generator/defaults/Cache.service.js
+++ b/modules/web-console/frontend/app/modules/configuration/generator/defaults/Cache.service.js
@@ -22,13 +22,11 @@ const DFLT_CACHE = {
     atomicityMode: {
         clsName: 'org.apache.ignite.cache.CacheAtomicityMode'
     },
-    memoryMode: {
-        clsName: 'org.apache.ignite.cache.CacheMemoryMode',
-        value: 'ONHEAP_TIERED'
+    partitionLossPolicy: {
+        clsName: 'org.apache.ignite.cache.PartitionLossPolicy',
+        value: 'IGNORE'
     },
-    offHeapMaxMemory: -1,
     startSize: 1500000,
-    swapEnabled: false,
     sqlOnheapRowCacheSize: 10240,
     longQueryWarningTimeout: 3000,
     snapshotableIndex: false,
@@ -93,6 +91,8 @@ const DFLT_CACHE = {
         }
     },
     queryMetadata: 'Configuration',
+    queryDetailMetricsSize: 0,
+    queryParallelism: 1,
     fields: {
         keyClsName: 'java.lang.String',
         valClsName: 'java.lang.String',

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/frontend/app/modules/configuration/generator/defaults/Cluster.service.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/configuration/generator/defaults/Cluster.service.js b/modules/web-console/frontend/app/modules/configuration/generator/defaults/Cluster.service.js
index b2e91c8..8dcd6bc 100644
--- a/modules/web-console/frontend/app/modules/configuration/generator/defaults/Cluster.service.js
+++ b/modules/web-console/frontend/app/modules/configuration/generator/defaults/Cluster.service.js
@@ -183,7 +183,6 @@ const DFLT_CLUSTER = {
         }
     },
     marshalLocalJobs: false,
-    marshallerCacheKeepAliveTime: 10000,
     metricsHistorySize: 10000,
     metricsLogFrequency: 60000,
     metricsUpdateFrequency: 2000,

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/frontend/app/modules/configuration/generator/defaults/IGFS.service.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/configuration/generator/defaults/IGFS.service.js b/modules/web-console/frontend/app/modules/configuration/generator/defaults/IGFS.service.js
index 985a56e..7cdc59a 100644
--- a/modules/web-console/frontend/app/modules/configuration/generator/defaults/IGFS.service.js
+++ b/modules/web-console/frontend/app/modules/configuration/generator/defaults/IGFS.service.js
@@ -38,7 +38,7 @@ const DFLT_IGFS = {
     dualModeMaxPendingPutsSize: 0,
     dualModePutExecutorServiceShutdown: false,
     blockSize: 65536,
-    streamBufferSize: 65536,
+    bufferSize: 65536,
     maxSpaceSize: 0,
     maximumTaskRangeLength: 0,
     managementPort: 11400,

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/frontend/app/modules/sql/sql.controller.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/sql/sql.controller.js b/modules/web-console/frontend/app/modules/sql/sql.controller.js
index b1cd3d0..11700dd 100644
--- a/modules/web-console/frontend/app/modules/sql/sql.controller.js
+++ b/modules/web-console/frontend/app/modules/sql/sql.controller.js
@@ -26,12 +26,6 @@ const TIME_LINE = {value: -1, type: 'java.sql.Date', label: 'TIME_LINE'};
 // Row index X axis descriptor.
 const ROW_IDX = {value: -2, type: 'java.lang.Integer', label: 'ROW_IDX'};
 
-/** Prefix for node local key for SCAN near queries. */
-const SCAN_CACHE_WITH_FILTER = 'VISOR_SCAN_CACHE_WITH_FILTER';
-
-/** Prefix for node local key for SCAN near queries. */
-const SCAN_CACHE_WITH_FILTER_CASE_SENSITIVE = 'VISOR_SCAN_CACHE_WITH_FILTER_CASE_SENSITIVE';
-
 const NON_COLLOCATED_JOINS_SINCE = '1.7.0';
 
 const ENFORCE_JOIN_VERS = [['1.7.9', '1.8.0'], ['1.8.4', '1.9.0'], ['1.9.1']];
@@ -1493,11 +1487,12 @@ export default ['$rootScope', '$scope', '$http', '$q', '$timeout', '$interval',
         };
 
         $scope.scan = (paragraph, local = false) => {
-            const {filter, caseSensitive} = paragraph;
-            const prefix = caseSensitive ? SCAN_CACHE_WITH_FILTER_CASE_SENSITIVE : SCAN_CACHE_WITH_FILTER;
-            const query = `${prefix}${filter}`;
+            const cacheName = paragraph.cacheName;
+            const filter = paragraph.filter;
+            const caseSensitive = !!paragraph.caseSensitive;
+            const pageSize = paragraph.pageSize;
 
-            $scope.actionAvailable(paragraph, false) && _chooseNode(paragraph.cacheName, local)
+            $scope.actionAvailable(paragraph, false) && _chooseNode(cacheName, local)
                 .then((nid) => {
                     Notebook.save($scope.notebook)
                         .catch(Messages.showError);
@@ -1508,18 +1503,20 @@ export default ['$rootScope', '$scope', '$http', '$q', '$timeout', '$interval',
 
                     _closeOldQuery(paragraph)
                         .then(() => {
-                            const args = paragraph.queryArgs = {
+                            paragraph.queryArgs = {
                                 type: 'SCAN',
-                                cacheName: paragraph.cacheName,
-                                query,
+                                cacheName,
                                 filter,
-                                pageSize: paragraph.pageSize,
+                                regEx: false,
+                                caseSensitive,
+                                near: false,
+                                pageSize,
                                 localNid: local ? nid : null
                             };
 
                             ActivitiesData.post({ action: '/queries/scan' });
 
-                            return agentMonitor.query(nid, args.cacheName, query, false, false, local, args.pageSize);
+                            return agentMonitor.scan(nid, cacheName, filter, false, caseSensitive, false, local, pageSize);
                         })
                         .then((res) => _processQueryResult(paragraph, true, res))
                         .catch((err) => {
@@ -1640,8 +1637,10 @@ export default ['$rootScope', '$scope', '$http', '$q', '$timeout', '$interval',
             const args = paragraph.queryArgs;
 
             return Promise.resolve(args.localNid || _chooseNode(args.cacheName, false))
-                .then((nid) => agentMonitor.queryGetAll(nid, args.cacheName, args.query, !!args.nonCollocatedJoins,
-                    !!args.enforceJoinOrder, !!args.localNid))
+                .then((nid) =>
+                    args.type === 'SCAN'
+                        ? agentMonitor.scanGetAll(nid, args.cacheName, args.filter, !!args.regEx, !!args.caseSensitive, !!args.near, !!args.localNid)
+                        : agentMonitor.queryGetAll(nid, args.cacheName, args.query, !!args.nonCollocatedJoins, !!args.enforceJoinOrder, !!args.localNid))
                 .then((res) => _export(paragraph.name + '-all.csv', paragraph.gridOptions.columnDefs, res.columns, res.rows))
                 .catch(Messages.showError)
                 .then(() => paragraph.ace && paragraph.ace.focus());
@@ -1755,21 +1754,15 @@ export default ['$rootScope', '$scope', '$http', '$q', '$timeout', '$interval',
             if (!_.isNil(paragraph)) {
                 const scope = $scope.$new();
 
-                if (_.isNil(paragraph.queryArgs.query)) {
-                    scope.title = 'SCAN query';
-                    scope.content = [`SCAN query for cache: <b>${maskCacheName(paragraph.queryArgs.cacheName, true)}</b>`];
-                }
-                else if (paragraph.queryArgs.query.startsWith(SCAN_CACHE_WITH_FILTER)) {
+                if (paragraph.queryArgs.type === 'SCAN') {
                     scope.title = 'SCAN query';
 
-                    let filter = '';
+                    const filter = paragraph.queryArgs.filter;
 
-                    if (paragraph.queryArgs.query.startsWith(SCAN_CACHE_WITH_FILTER_CASE_SENSITIVE))
-                        filter = paragraph.queryArgs.query.substr(SCAN_CACHE_WITH_FILTER_CASE_SENSITIVE.length);
+                    if (_.isEmpty(filter))
+                        scope.content = [`SCAN query for cache: <b>${maskCacheName(paragraph.queryArgs.cacheName, true)}</b>`];
                     else
-                        filter = paragraph.queryArgs.query.substr(SCAN_CACHE_WITH_FILTER.length);
-
-                    scope.content = [`SCAN query for cache: <b>${maskCacheName(paragraph.queryArgs.cacheName, true)}</b> with filter: <b>${filter}</b>`];
+                        scope.content = [`SCAN query for cache: <b>${maskCacheName(paragraph.queryArgs.cacheName, true)}</b> with filter: <b>${filter}</b>`];
                 }
                 else if (paragraph.queryArgs.query .startsWith('EXPLAIN ')) {
                     scope.title = 'Explain query';
@@ -1794,9 +1787,12 @@ export default ['$rootScope', '$scope', '$http', '$q', '$timeout', '$interval',
 
                 let cause = paragraph.error.root;
 
+                const tab = '&nbsp;&nbsp;&nbsp;&nbsp;';
+
                 while (_.nonNil(cause)) {
-                    scope.content.push((scope.content.length > 0 ? '&nbsp;&nbsp;&nbsp;&nbsp;' : '') +
-                        '[' + JavaTypes.shortClassName(cause.className) + '] ' + cause.message);
+                    const clsName = _.isEmpty(cause.className) ? '' : '[' + JavaTypes.shortClassName(cause.className) + '] ';
+
+                    scope.content.push((scope.content.length > 0 ? tab : '') + clsName + cause.message);
 
                     cause = cause.cause;
                 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/frontend/app/modules/states/configuration/caches/affinity.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/caches/affinity.pug b/modules/web-console/frontend/app/modules/states/configuration/caches/affinity.pug
index 70b90bd..14857fc 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/caches/affinity.pug
+++ b/modules/web-console/frontend/app/modules/states/configuration/caches/affinity.pug
@@ -33,7 +33,7 @@ include /app/helpers/jade/mixins
         label Affinity Collocation
         ignite-form-field-tooltip.tipLabel
             | Collocate data with data to improve performance and scalability of your application#[br]
-            | #[a(href="http://apacheignite.gridgain.org/docs/affinity-collocation" target="_blank") More info]
+            | #[a(href="http://apacheignite.readme.io/docs/affinity-collocation" target="_blank") More info]
         ignite-form-revert
     .panel-collapse(role='tabpanel' bs-collapse-target id=`${form}`)
         .panel-body(ng-if=`ui.isPanelLoaded('${form}')`)

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/frontend/app/modules/states/configuration/caches/general.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/caches/general.pug b/modules/web-console/frontend/app/modules/states/configuration/caches/general.pug
index 89676f2..2be5c53 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/caches/general.pug
+++ b/modules/web-console/frontend/app/modules/states/configuration/caches/general.pug
@@ -58,6 +58,31 @@ include /app/helpers/jade/mixins
                         'Flag indicating whether data can be read from backup<br/>\
                         If not set then always get data from primary node (never from backup)')
                 .settings-row
+                    +dropdown('Partition loss policy:', `${model}.partitionLossPolicy`, '"partitionLossPolicy"', 'true', 'IGNORE',
+                    '[\
+                        {value: "READ_ONLY_SAFE", label: "READ_ONLY_SAFE"},\
+                        {value: "READ_ONLY_ALL", label: "READ_ONLY_ALL"},\
+                        {value: "READ_WRITE_SAFE", label: "READ_WRITE_SAFE"},\
+                        {value: "READ_WRITE_ALL", label: "READ_WRITE_ALL"},\
+                        {value: "IGNORE", label: "IGNORE"}\
+                    ]',
+                    'Partition loss policies:\
+                    <ul>\
+                        <li>READ_ONLY_SAFE - in this mode all writes to the cache will be failed with an exception,\
+                            reads will only be allowed for keys in  non-lost partitions.\
+                            Reads from lost partitions will be failed with an exception.</li>\
+                        <li>READ_ONLY_ALL - in this mode \u0444ll writes to the cache will be failed with an exception.\
+                            All reads will proceed as if all partitions were in a consistent state.\
+                            The result of reading from a lost partition is undefined and may be different on different nodes in the cluster.</li>\
+                        <li>READ_WRITE_SAFE - in this mode Aall reads and writes will be allowed for keys in valid partitions.\
+                            All reads and writes for keys in lost partitions will be failed with an exception.</li>\
+                        <li>READ_WRITE_ALL - in this mode all reads and writes will proceed as if all partitions were in a consistent state.\
+                            The result of reading from a lost partition is undefined and may be different on different nodes in the cluster.</li>\
+                        <li>IGNORE - in this mode if partition is lost, reset it state and do not clear intermediate data.\
+                            The result of reading from a previously lost and not cleared partition is undefined and may be different\
+                            on different nodes in the cluster.</li>\
+                    </ul>')
+                .settings-row
                     +checkbox('Copy on read', `${model}.copyOnRead`, '"copyOnRead"',
                         'Flag indicating whether copy of the value stored in cache should be created for cache operation implying return value<br/>\
                         Also if this flag is set copies are created for values passed to CacheInterceptor and to CacheEntryProcessor')

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/frontend/app/modules/states/configuration/caches/memory.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/caches/memory.pug b/modules/web-console/frontend/app/modules/states/configuration/caches/memory.pug
index 38482a7..8384be9 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/caches/memory.pug
+++ b/modules/web-console/frontend/app/modules/states/configuration/caches/memory.pug
@@ -31,63 +31,11 @@ include /app/helpers/jade/mixins
         .panel-body(ng-if=`ui.isPanelLoaded('${form}')`)
             .col-sm-6
                 .settings-row
-                    +dropdown('Mode:', `${model}.memoryMode`, '"memoryMode"', 'true', 'ONHEAP_TIERED',
-                        '[\
-                            {value: "ONHEAP_TIERED", label: "ONHEAP_TIERED"},\
-                            {value: "OFFHEAP_TIERED", label: "OFFHEAP_TIERED"},\
-                            {value: "OFFHEAP_VALUES", label: "OFFHEAP_VALUES"}\
-                        ]',
-                        'Memory modes control whether value is stored in on-heap memory, off-heap memory, or swap space\
-                        <ul>\
-                            <li>\
-                                ONHEAP_TIERED - entries are cached on heap memory first<br/>\
-                                <ul>\
-                                    <li>\
-                                        If offheap memory is enabled and eviction policy evicts an entry from heap memory, entry will be moved to offheap memory<br/>\
-                                        If offheap memory is disabled, then entry is simply discarded\
-                                    </li>\
-                                    <li>\
-                                        If swap space is enabled and offheap memory fills up, then entry will be evicted into swap space<br/>\
-                                        If swap space is disabled, then entry will be discarded. If swap is enabled and offheap memory is disabled, then entry will be evicted directly from heap memory into swap\
-                                    </li>\
-                                </ul>\
-                            </li>\
-                            <li>\
-                                OFFHEAP_TIERED - works the same as ONHEAP_TIERED, except that entries never end up in heap memory and get stored in offheap memory right away<br/>\
-                                Entries get cached in offheap memory first and then get evicted to swap, if one is configured\
-                            </li>\
-                            <li>\
-                                OFFHEAP_VALUES - entry keys will be stored on heap memory, and values will be stored in offheap memory<br/>\
-                                Note that in this mode entries can be evicted only to swap\
-                            </li>\
-                        </ul>')
-                .settings-row(ng-show=`${model}.memoryMode !== 'OFFHEAP_VALUES'`)
-                    +dropdown-required('Off-heap memory:', `${model}.offHeapMode`, '"offHeapMode"', 'true', `${model}.memoryMode === 'OFFHEAP_TIERED'`,
-                        'Disabled',
-                        '[\
-                            {value: -1, label: "Disabled"},\
-                            {value: 1, label: "Limited"},\
-                            {value: 0, label: "Unlimited"}\
-                        ]',
-                        'Off-heap storage mode\
-                        <ul>\
-                            <li>Disabled - Off-heap storage is disabled</li>\
-                            <li>Limited - Off-heap storage has limited size</li>\
-                            <li>Unlimited - Off-heap storage grow infinitely (it is up to user to properly add and remove entries from cache to ensure that off-heap storage does not grow infinitely)</li>\
-                        </ul>')
-                .settings-row(ng-if=`${model}.offHeapMode === 1 && ${model}.memoryMode !== 'OFFHEAP_VALUES'`)
-                    +number-required('Off-heap memory max size:', `${model}.offHeapMaxMemory`, '"offHeapMaxMemory"', 'true',
-                        `${model}.offHeapMode === 1`, 'Enter off-heap memory size', '1',
-                        'Maximum amount of memory available to off-heap storage in bytes')
-                .settings-row
-                    -var onHeapTired = model + '.memoryMode === "ONHEAP_TIERED"'
-                    -var swapEnabled = model + '.swapEnabled'
-                    -var offHeapMaxMemory = model + '.offHeapMaxMemory'
-
-                    +evictionPolicy(`${model}.evictionPolicy`, '"evictionPolicy"', 'true',
-                        onHeapTired  + ' && (' + swapEnabled + '|| _.isNumber(' + offHeapMaxMemory + ') &&' + offHeapMaxMemory + ' >= 0)',
-                        'Optional cache eviction policy<br/>\
-                        Must be set for entries to be evicted from on-heap to off-heap or swap\
+                    +checkbox('On-heap cache enabled', `${model}.onheapCacheEnabled`, '"onheapCacheEnabled"', 'On-heap cache enabled flag')
+                .settings-row(ng-show=`${model}.onheapCacheEnabled`)
+                    +evictionPolicy(`${model}.evictionPolicy`, '"evictionPolicy"', 'true', 'false',
+                        'Cache eviction policy<br/>\
+                        Must be set for entries to be evicted to off-heap\
                         <ul>\
                             <li>Least Recently Used(LRU) - Eviction policy based on LRU algorithm and supports batch eviction</li>\
                             <li>First In First Out (FIFO) - Eviction policy based on FIFO algorithm and supports batch eviction</li>\
@@ -102,7 +50,5 @@ include /app/helpers/jade/mixins
                         This will save a lot of CPU resources during the load time, because the map would not have to resize.\
                         For example, if you expect to load 10 million entries into cache, you can set this property to 10 000 000.\
                         This will save you from cache internal map resizes.')
-                .settings-row
-                    +checkbox('Swap enabled', `${model}.swapEnabled`, '"swapEnabled"', 'Flag indicating whether swap storage is enabled or not for this cache')
             .col-sm-6
                 +preview-xml-java(model, 'cacheMemory')

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/frontend/app/modules/states/configuration/caches/query.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/caches/query.pug b/modules/web-console/frontend/app/modules/states/configuration/caches/query.pug
index 5bb515a..52425ba 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/caches/query.pug
+++ b/modules/web-console/frontend/app/modules/states/configuration/caches/query.pug
@@ -56,6 +56,9 @@ include /app/helpers/jade/mixins
                     +number('History size:', `${model}.queryDetailMetricsSize`, '"queryDetailMetricsSize"', 'true', '0', '0',
                         'Size of queries detail metrics that will be stored in memory for monitoring purposes')
                 .settings-row
+                    +number('Parallelism:', `${model}.queryParallelism`, '"queryParallelism"', 'true', '1', '1',
+                        'Defines a hint to query execution engine on desired degree of parallelism within a single node.')
+                .settings-row
                     -var form = 'querySqlFunctionClasses';
                     -var sqlFunctionClasses = `${model}.sqlFunctionClasses`;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/frontend/app/modules/states/configuration/clusters/events.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/events.pug b/modules/web-console/frontend/app/modules/states/configuration/clusters/events.pug
index 70fb714..09cd40c 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/clusters/events.pug
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/events.pug
@@ -40,15 +40,17 @@ include /app/helpers/jade/mixins
                     Note, that either the include event types or the exclude event types can be established')
 
                 .settings-row
-                    +dropdown('Event storage:', modelEventStorageKind, '"eventStorageKind"', 'true', '',
+                    +dropdown('Event storage:', modelEventStorageKind, '"eventStorageKind"', 'true', 'Disabled',
                     '[\
                         {value: "Memory", label: "Memory"},\
-                        {value: "Custom", label: "Custom"}\
+                        {value: "Custom", label: "Custom"},\
+                        {value: undefined, label: "Disabled"}\
                     ]',
                     'Regulate how grid store events locally on node\
                     <ul>\
                         <li>Memory - All events are kept in the FIFO queue in-memory</li>\
                         <li>Custom - Custom implementation of event storage SPI</li>\
+                        <li>Disabled - Events are not collected</li>\
                     </ul>')
 
                 div(ng-show=eventStorageMemory)

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/frontend/app/modules/states/configuration/clusters/marshaller.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/marshaller.pug b/modules/web-console/frontend/app/modules/states/configuration/clusters/marshaller.pug
index f9d29b5..274b014 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/clusters/marshaller.pug
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/marshaller.pug
@@ -66,11 +66,5 @@ include /app/helpers/jade/mixins
                                 'Whether marshaller should require Serializable interface or not')
                 .settings-row
                     +checkbox('Marshal local jobs', `${model}.marshalLocalJobs`, '"marshalLocalJobs"', 'If this flag is enabled, jobs mapped to local node will be marshalled as if it was remote node')
-                .settings-row
-                    +number('Keep alive time:', `${model}.marshallerCacheKeepAliveTime`, '"marshallerCacheKeepAliveTime"', 'true', '10000', '0',
-                        'Keep alive time of thread pool that is in charge of processing marshaller messages')
-                .settings-row
-                    +number('Pool size:', `${model}.marshallerCacheThreadPoolSize`, '"marshallerCacheThreadPoolSize"', 'true', 'max(8, availableProcessors) * 2', '1',
-                        'Default size of thread pool that is in charge of processing marshaller messages')
             .col-sm-6
                 +preview-xml-java(model, 'clusterMarshaller')

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/frontend/app/modules/states/configuration/clusters/swap.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/swap.pug b/modules/web-console/frontend/app/modules/states/configuration/clusters/swap.pug
deleted file mode 100644
index 54b6db0..0000000
--- a/modules/web-console/frontend/app/modules/states/configuration/clusters/swap.pug
+++ /dev/null
@@ -1,72 +0,0 @@
-//-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
-include /app/helpers/jade/mixins
-
--var form = 'swap'
--var model = 'backupItem'
--var swapModel = model + '.swapSpaceSpi'
--var fileSwapModel = swapModel + '.FileSwapSpaceSpi'
-
-.panel.panel-default(ng-form=form novalidate)
-    .panel-heading(bs-collapse-toggle ng-click=`ui.loadPanel('${form}')`)
-        ignite-form-panel-chevron
-        label Swap
-        ignite-form-field-tooltip.tipLabel
-            | Settings for overflow data to disk if it cannot fit in memory#[br]
-            | #[a(href="https://apacheignite.readme.io/docs/off-heap-memory#swap-space" target="_blank") More info]
-        ignite-form-revert
-    .panel-collapse(role='tabpanel' bs-collapse-target id=`${form}`)
-        .panel-body(ng-if=`ui.isPanelLoaded('${form}')`)
-            .col-sm-6
-                .settings-row
-                    +dropdown('Swap space SPI:', `${swapModel}.kind`, '"swapSpaceSpi"', 'true', 'Choose swap SPI',
-                        '[\
-                            {value: "FileSwapSpaceSpi", label: "File-based swap"},\
-                            {value: undefined, label: "Not set"}\
-                        ]',
-                        'Provides a mechanism in grid for storing data on disk<br/>\
-                        Ignite cache uses swap space to overflow data to disk if it cannot fit in memory\
-                        <ul>\
-                            <li>File-based swap - File-based swap space SPI implementation which holds keys in memory</li>\
-                            <li>Not set - File-based swap space SPI with default configuration when it needed</li>\
-                        </ul>')
-                    a.customize(
-                        ng-if=`${swapModel}.kind`
-                        ng-click=`${swapModel}.expanded = !${swapModel}.expanded`
-                    ) {{ #{swapModel}.expanded ? 'Hide settings' : 'Show settings'}}
-                .settings-row
-                    .panel-details(ng-show=`${swapModel}.expanded && ${swapModel}.kind`)
-                        .details-row
-                            +text('Base directory:', `${fileSwapModel}.baseDirectory`, '"baseDirectory"', 'false', 'swapspace',
-                                'Base directory where to write files')
-                        .details-row
-                            +number('Read stripe size:', `${fileSwapModel}.readStripesNumber`, '"readStripesNumber"', 'true', 'availableProcessors', '0',
-                                'Read stripe size defines number of file channels to be used concurrently')
-                        .details-row
-                            +number-min-max-step('Maximum sparsity:', `${fileSwapModel}.maximumSparsity`, '"maximumSparsity"', 'true', '0.5', '0', '0.999', '0.05',
-                                'This property defines maximum acceptable wasted file space to whole file size ratio<br/>\
-                                When this ratio becomes higher than specified number compacting thread starts working')
-                        .details-row
-                            +number('Max write queue size:', `${fileSwapModel}.maxWriteQueueSize`, '"maxWriteQueueSize"', 'true', '1024 * 1024', '0',
-                                'Max write queue size in bytes<br/>\
-                                If there are more values are waiting for being written to disk then specified size, SPI will block on store operation')
-                        .details-row
-                            +number('Write buffer size:', `${fileSwapModel}.writeBufferSize`, '"writeBufferSize"', 'true', '64 * 1024', '0',
-                                'Write buffer size in bytes<br/>\
-                                Write to disk occurs only when this buffer is full')
-            .col-sm-6
-                +preview-xml-java(model, 'clusterSwap')

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/frontend/app/modules/states/configuration/igfs/misc.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/igfs/misc.pug b/modules/web-console/frontend/app/modules/states/configuration/igfs/misc.pug
index aa4b957..7df7e7e 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/igfs/misc.pug
+++ b/modules/web-console/frontend/app/modules/states/configuration/igfs/misc.pug
@@ -55,7 +55,7 @@ mixin table-igfs-path-mode-edit(prefix, focusId, index)
                 .settings-row
                     +number('Block size:', `${model}.blockSize`, '"blockSize"', 'true', '65536', '0', 'File data block size in bytes')
                 .settings-row
-                    +number('Stream buffer size:', `${model}.streamBufferSize`, '"streamBufferSize"', 'true', '65536', '0', 'Read/write buffer size for IGFS stream operations in bytes')
+                    +number('Buffer size:', `${model}.bufferSize`, '"bufferSize"', 'true', '65536', '0', 'Read/write buffer size for IGFS stream operations in bytes')
                 .settings-row
                     +number('Maximum space size:', `${model}.maxSpaceSize`, '"maxSpaceSize"', 'true', '0', '0', 'Maximum space available for data cache to store file system entries')
                 .settings-row

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/frontend/controllers/caches-controller.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/controllers/caches-controller.js b/modules/web-console/frontend/controllers/caches-controller.js
index d4a13e5..176a634 100644
--- a/modules/web-console/frontend/controllers/caches-controller.js
+++ b/modules/web-console/frontend/controllers/caches-controller.js
@@ -82,22 +82,6 @@ export default ['cachesController', [
             }, []);
         }
 
-        const setOffHeapMode = (item) => {
-            if (_.isNil(item.offHeapMaxMemory))
-                return;
-
-            return item.offHeapMode = Math.sign(item.offHeapMaxMemory);
-        };
-
-        const setOffHeapMaxMemory = (value) => {
-            const item = $scope.backupItem;
-
-            if (_.isNil(value) || value <= 0)
-                return item.offHeapMaxMemory = value;
-
-            item.offHeapMaxMemory = item.offHeapMaxMemory > 0 ? item.offHeapMaxMemory : null;
-        };
-
         $scope.tablePairSave = LegacyTable.tablePairSave;
         $scope.tablePairSaveVisible = LegacyTable.tablePairSaveVisible;
         $scope.tableNewItem = LegacyTable.tableNewItem;
@@ -236,8 +220,6 @@ export default ['cachesController', [
                         form.$setDirty();
                 }, true);
 
-                $scope.$watch('backupItem.offHeapMode', setOffHeapMaxMemory);
-
                 $scope.$watch('ui.activePanels.length', () => {
                     ErrorPopover.hide();
                 });
@@ -281,8 +263,6 @@ export default ['cachesController', [
                     $scope.ui.inputForm.$setPristine();
                 }
 
-                setOffHeapMode($scope.backupItem);
-
                 __original_value = ModelNormalizer.normalize($scope.backupItem);
 
                 if (LegacyUtils.getQueryVariable('new'))
@@ -436,18 +416,9 @@ export default ['cachesController', [
             if (LegacyUtils.isEmptyString(item.name))
                 return ErrorPopover.show('cacheNameInput', 'Cache name should not be empty!', $scope.ui, 'general');
 
-            if (item.memoryMode === 'ONHEAP_TIERED' && item.offHeapMaxMemory > 0 && !LegacyUtils.isDefined(item.evictionPolicy.kind))
-                return ErrorPopover.show('evictionPolicyKindInput', 'Eviction policy should be configured!', $scope.ui, 'memory');
-
             if (!LegacyUtils.checkFieldValidators($scope.ui))
                 return false;
 
-            if (item.memoryMode === 'OFFHEAP_VALUES' && !_.isEmpty(item.domains))
-                return ErrorPopover.show('memoryModeInput', 'Query indexing could not be enabled while values are stored off-heap!', $scope.ui, 'memory');
-
-            if (item.memoryMode === 'OFFHEAP_TIERED' && item.offHeapMaxMemory === -1)
-                return ErrorPopover.show('offHeapModeInput', 'Invalid value!', $scope.ui, 'memory');
-
             if (!checkEvictionPolicy(item.evictionPolicy))
                 return false;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/frontend/controllers/clusters-controller.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/controllers/clusters-controller.js b/modules/web-console/frontend/controllers/clusters-controller.js
index e936955..dba56fc 100644
--- a/modules/web-console/frontend/controllers/clusters-controller.js
+++ b/modules/web-console/frontend/controllers/clusters-controller.js
@@ -48,7 +48,6 @@ export default ['clustersController', [
             sslContextFactory: {
                 trustManagers: []
             },
-            swapSpaceSpi: {},
             transactionConfiguration: {},
             collision: {}
         };
@@ -232,11 +231,6 @@ export default ['clustersController', [
             {value: 'Kubernetes', label: 'Kubernetes'}
         ];
 
-        $scope.swapSpaceSpis = [
-            {value: 'FileSwapSpaceSpi', label: 'File-based swap'},
-            {value: null, label: 'Not set'}
-        ];
-
         $scope.eventGroups = igniteEventGroups;
 
         $scope.clusters = [];
@@ -282,9 +276,6 @@ export default ['clustersController', [
                     if (!cluster.logger)
                         cluster.logger = {Log4j: { mode: 'Default'}};
 
-                    if (!cluster.eventStorage)
-                        cluster.eventStorage = { kind: 'Memory' };
-
                     if (!cluster.peerClassLoadingLocalClassPathExclude)
                         cluster.peerClassLoadingLocalClassPathExclude = [];
 
@@ -411,7 +402,6 @@ export default ['clustersController', [
                 communication: {tcpNoDelay: true},
                 connector: {noDelay: true},
                 collision: {kind: 'Noop', JobStealing: {stealingEnabled: true}, PriorityQueue: {starvationPreventionEnabled: true}},
-                eventStorage: {kind: 'Memory'},
                 failoverSpi: [],
                 logger: {Log4j: { mode: 'Default'}},
                 caches: linkId && _.find($scope.caches, {value: linkId}) ? [linkId] : [],
@@ -619,26 +609,6 @@ export default ['clustersController', [
             return true;
         }
 
-        function checkSwapConfiguration(item) {
-            const swapKind = item.swapSpaceSpi && item.swapSpaceSpi.kind;
-
-            if (swapKind && item.swapSpaceSpi[swapKind]) {
-                const swap = item.swapSpaceSpi[swapKind];
-
-                const sparsity = swap.maximumSparsity;
-
-                if (LegacyUtils.isDefined(sparsity) && (sparsity < 0 || sparsity >= 1))
-                    return ErrorPopover.show('maximumSparsityInput', 'Maximum sparsity should be more or equal 0 and less than 1!', $scope.ui, 'swap');
-
-                const readStripesNumber = swap.readStripesNumber;
-
-                if (readStripesNumber && !(readStripesNumber === -1 || (readStripesNumber & (readStripesNumber - 1)) === 0))
-                    return ErrorPopover.show('readStripesNumberInput', 'Read stripe size must be positive and power of two!', $scope.ui, 'swap');
-            }
-
-            return true;
-        }
-
         function checkSslConfiguration(item) {
             const r = item.connector;
 
@@ -702,9 +672,6 @@ export default ['clustersController', [
             if (!checkODBC(item))
                 return false;
 
-            if (!checkSwapConfiguration(item))
-                return false;
-
             if (!checkSslConfiguration(item))
                 return false;
 
@@ -759,11 +726,6 @@ export default ['clustersController', [
         $scope.saveItem = function() {
             const item = $scope.backupItem;
 
-            const swapConfigured = item.swapSpaceSpi && item.swapSpaceSpi.kind;
-
-            if (!swapConfigured && _.find(clusterCaches(item), (cache) => cache.swapEnabled))
-                _.merge(item, {swapSpaceSpi: {kind: 'FileSwapSpaceSpi'}});
-
             if (validate(item))
                 save(item);
         };

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/frontend/views/configuration/clusters.tpl.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/configuration/clusters.tpl.pug b/modules/web-console/frontend/views/configuration/clusters.tpl.pug
index c979012..4a1df33 100644
--- a/modules/web-console/frontend/views/configuration/clusters.tpl.pug
+++ b/modules/web-console/frontend/views/configuration/clusters.tpl.pug
@@ -59,7 +59,6 @@ include /app/helpers/jade/mixins
                             include /app/modules/states/configuration/clusters/metrics
                             include /app/modules/states/configuration/clusters/odbc
                             include /app/modules/states/configuration/clusters/ssl
-                            include /app/modules/states/configuration/clusters/swap
                             include /app/modules/states/configuration/clusters/thread
                             include /app/modules/states/configuration/clusters/time
                             include /app/modules/states/configuration/clusters/transactions

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/demo/AgentClusterDemo.java
----------------------------------------------------------------------
diff --git a/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/demo/AgentClusterDemo.java b/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/demo/AgentClusterDemo.java
index 088ae39..3bd0b5a 100644
--- a/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/demo/AgentClusterDemo.java
+++ b/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/demo/AgentClusterDemo.java
@@ -41,6 +41,7 @@ import org.apache.ignite.logger.log4j.Log4JLogger;
 import org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi;
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
+import org.apache.ignite.spi.eventstorage.memory.MemoryEventStorageSpi;
 import org.apache.log4j.Logger;
 
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_ATOMIC_CACHE_DELETE_HISTORY_SIZE;
@@ -78,6 +79,7 @@ public class AgentClusterDemo {
 
         cfg.setIgniteInstanceName((client ? "demo-client-" : "demo-server-" ) + gridIdx);
         cfg.setLocalHost("127.0.0.1");
+        cfg.setEventStorageSpi(new MemoryEventStorageSpi());
         cfg.setIncludeEventTypes(EVTS_DISCOVERY);
 
         TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder();

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/web-agent/src/main/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/modules/web-console/web-agent/src/main/resources/log4j.properties b/modules/web-console/web-agent/src/main/resources/log4j.properties
index 3b7767c..c4116ac 100644
--- a/modules/web-console/web-agent/src/main/resources/log4j.properties
+++ b/modules/web-console/web-agent/src/main/resources/log4j.properties
@@ -17,7 +17,6 @@ log4j.rootLogger=INFO,console_err,file
 
 log4j.logger.org.apache.http=WARN
 log4j.logger.org.apache.ignite.spi.checkpoint.noop.NoopCheckpointSpi=OFF
-log4j.logger.org.apache.ignite.spi.swapspace.noop.NoopSwapSpaceSpi=OFF
 log4j.logger.org.apache.ignite.internal.managers.collision.GridCollisionManager=ERROR
 log4j.logger.org.apache.commons.beanutils=WARN
 log4j.logger.sun.net.www.protocol.http=WARN


[11/11] ignite git commit: IGNITE-4988 Cleanup and refactor VisorXxx tasks and DTO for ignite-2.0

Posted by ak...@apache.org.
IGNITE-4988 Cleanup and refactor VisorXxx tasks and DTO for ignite-2.0


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/12dfe9e8
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/12dfe9e8
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/12dfe9e8

Branch: refs/heads/master
Commit: 12dfe9e8767020d9e9083f887717e5e63120880f
Parents: 8b56a43
Author: Alexey Kuznetsov <ak...@apache.org>
Authored: Fri Apr 14 20:55:10 2017 +0700
Committer: Alexey Kuznetsov <ak...@apache.org>
Committed: Fri Apr 14 20:55:12 2017 +0700

----------------------------------------------------------------------
 .../examples/ScalarCacheAffinityExample.scala   |   2 +-
 .../ignite/ignite-cassandra-server-template.xml |   6 -
 .../tests/ignite-cassandra-client-template.xml  |   6 -
 .../JettyRestProcessorAbstractSelfTest.java     |  12 +-
 .../ignite/cache/PartitionLossPolicy.java       |  16 +-
 .../org/apache/ignite/cache/QueryIndexType.java |  17 +-
 .../apache/ignite/internal/LessNamingBean.java  |  28 --
 .../cache/query/GridCacheSqlIndexMetadata.java  |   3 +-
 .../cache/query/GridCacheSqlMetadata.java       |   3 +-
 .../internal/util/IgniteExceptionRegistry.java  |   3 +-
 .../internal/visor/VisorDataTransferObject.java |  87 ++++++
 .../visor/VisorDataTransferObjectInput.java     | 156 ++++++++++
 .../visor/VisorDataTransferObjectOutput.java    | 141 +++++++++
 .../ignite/internal/visor/VisorEither.java      | 103 +++++++
 .../internal/visor/VisorMultiNodeTask.java      |   6 +-
 .../ignite/internal/visor/VisorOneNodeTask.java |   5 +-
 .../internal/visor/VisorTaskArgument.java       |  51 +++-
 .../visor/binary/VisorBinaryMetadata.java       | 139 +++++++++
 .../VisorBinaryMetadataCollectorTask.java       |  70 +++++
 .../VisorBinaryMetadataCollectorTaskResult.java |  87 ++++++
 .../visor/binary/VisorBinaryMetadataField.java  | 101 +++++++
 .../ignite/internal/visor/cache/VisorCache.java | 124 +++++---
 .../cache/VisorCacheAffinityConfiguration.java  |  91 ++++--
 .../visor/cache/VisorCacheAffinityNodeTask.java |  13 +-
 .../cache/VisorCacheAffinityNodeTaskArg.java    |  86 ++++++
 .../cache/VisorCacheAggregatedMetrics.java      | 205 ++++++++-----
 .../visor/cache/VisorCacheClearTask.java        | 100 ++-----
 .../visor/cache/VisorCacheClearTaskResult.java  |  85 ++++++
 .../visor/cache/VisorCacheConfiguration.java    | 283 +++++++++++++-----
 .../VisorCacheConfigurationCollectorJob.java    |   4 +-
 .../cache/VisorCacheDefaultConfiguration.java   |  58 ----
 .../cache/VisorCacheEvictionConfiguration.java  |  52 +++-
 .../visor/cache/VisorCacheJdbcType.java         | 189 ++++++++++++
 .../visor/cache/VisorCacheJdbcTypeField.java    | 117 ++++++++
 .../visor/cache/VisorCacheLoadTask.java         |  20 +-
 .../visor/cache/VisorCacheLoadTaskArg.java      | 101 +++++++
 .../visor/cache/VisorCacheMetadataTask.java     |  18 +-
 .../internal/visor/cache/VisorCacheMetrics.java | 208 +++++++++----
 .../cache/VisorCacheMetricsCollectorTask.java   |  29 +-
 .../VisorCacheMetricsCollectorTaskArg.java      |  87 ++++++
 .../cache/VisorCacheNearConfiguration.java      |  59 ++--
 .../visor/cache/VisorCachePartition.java        |  57 ++--
 .../visor/cache/VisorCachePartitions.java       |  43 ++-
 .../visor/cache/VisorCachePartitionsTask.java   |   7 +-
 .../cache/VisorCacheQueryConfiguration.java     | 122 --------
 .../cache/VisorCacheQueryDetailMetrics.java     | 167 -----------
 ...sorCacheQueryDetailMetricsCollectorTask.java | 146 ---------
 .../visor/cache/VisorCacheQueryMetrics.java     | 102 -------
 .../cache/VisorCacheRebalanceConfiguration.java |  71 +++--
 .../VisorCacheResetQueryDetailMetricsTask.java  |  71 -----
 .../cache/VisorCacheResetQueryMetricsTask.java  |  69 -----
 .../visor/cache/VisorCacheSqlIndexMetadata.java | 115 ++++++++
 .../visor/cache/VisorCacheSqlMetadata.java      | 162 ++++++++++
 .../visor/cache/VisorCacheStartArg.java         | 100 +++++++
 .../visor/cache/VisorCacheStartTask.java        |  60 +---
 .../cache/VisorCacheStoreConfiguration.java     |  77 +++--
 .../cache/VisorCacheTypeFieldMetadata.java      |  92 ------
 .../visor/cache/VisorCacheTypeMetadata.java     | 294 -------------------
 .../internal/visor/cache/VisorPartitionMap.java |  90 ++++++
 .../compute/VisorComputeMonitoringHolder.java   |   8 +-
 .../VisorComputeToggleMonitoringTask.java       |  52 ++--
 .../VisorComputeToggleMonitoringTaskArg.java    |  86 ++++++
 .../visor/compute/VisorGatewayTask.java         |   4 +-
 .../visor/debug/VisorThreadDumpTask.java        |  13 +-
 .../visor/debug/VisorThreadDumpTaskResult.java  |  88 ++++++
 .../internal/visor/debug/VisorThreadInfo.java   | 234 ++++++++-------
 .../visor/debug/VisorThreadLockInfo.java        |  51 +++-
 .../visor/debug/VisorThreadMonitorInfo.java     |  76 +++--
 .../visor/event/VisorGridDeploymentEvent.java   |  43 ++-
 .../visor/event/VisorGridDiscoveryEvent.java    |  59 +++-
 .../internal/visor/event/VisorGridEvent.java    |  66 +++--
 .../visor/event/VisorGridEventsLost.java        |  15 +-
 .../internal/visor/event/VisorGridJobEvent.java |  61 +++-
 .../visor/event/VisorGridTaskEvent.java         |  61 +++-
 .../internal/visor/file/VisorFileBlock.java     |  60 +++-
 .../internal/visor/file/VisorFileBlockArg.java  | 114 +++++++
 .../internal/visor/file/VisorFileBlockTask.java |  64 +---
 .../visor/file/VisorLatestTextFilesTask.java    |  17 +-
 .../visor/file/VisorLatestTextFilesTaskArg.java |  86 ++++++
 .../ignite/internal/visor/igfs/VisorIgfs.java   |  76 +++--
 .../internal/visor/igfs/VisorIgfsEndpoint.java  |  72 +++--
 .../internal/visor/igfs/VisorIgfsMetrics.java   | 118 +++++---
 .../internal/visor/igfs/VisorIgfsProfiler.java  |  24 +-
 .../visor/igfs/VisorIgfsProfilerClearTask.java  |  11 +-
 .../igfs/VisorIgfsProfilerClearTaskResult.java  |  85 ++++++
 .../visor/igfs/VisorIgfsProfilerEntry.java      | 106 +++++--
 .../visor/igfs/VisorIgfsProfilerTask.java       |  31 +-
 .../VisorIgfsProfilerUniformityCounters.java    |  38 ++-
 .../visor/igfs/VisorIgfsSamplingStateTask.java  |  17 +-
 .../igfs/VisorIgfsSamplingStateTaskArg.java     |  86 ++++++
 .../ignite/internal/visor/log/VisorLogFile.java |  43 ++-
 .../internal/visor/log/VisorLogSearchArg.java   | 114 +++++++
 .../visor/log/VisorLogSearchResult.java         |  80 +++--
 .../internal/visor/log/VisorLogSearchTask.java  |  74 +----
 .../visor/log/VisorLogSearchTaskResult.java     |  92 ++++++
 .../visor/node/VisorAtomicConfiguration.java    |  49 +++-
 .../visor/node/VisorBasicConfiguration.java     | 163 ++++++----
 .../node/VisorExecutorServiceConfiguration.java |  81 +++--
 .../visor/node/VisorGridConfiguration.java      | 126 +++++---
 .../visor/node/VisorIgfsConfiguration.java      | 203 ++++++++-----
 .../visor/node/VisorLifecycleConfiguration.java |  39 ++-
 .../visor/node/VisorMemoryConfiguration.java    |  60 ++--
 .../node/VisorMemoryPolicyConfiguration.java    |  37 ++-
 .../visor/node/VisorMetricsConfiguration.java   |  50 +++-
 .../VisorNodeConfigurationCollectorJob.java     |   4 +-
 .../visor/node/VisorNodeDataCollectorJob.java   |  63 ++--
 .../node/VisorNodeDataCollectorJobResult.java   | 109 +++++--
 .../visor/node/VisorNodeDataCollectorTask.java  |  40 +--
 .../node/VisorNodeDataCollectorTaskArg.java     |  54 +++-
 .../node/VisorNodeDataCollectorTaskResult.java  | 110 +++++--
 .../node/VisorNodeEventsCollectorTask.java      | 133 +--------
 .../node/VisorNodeEventsCollectorTaskArg.java   | 163 ++++++++++
 .../internal/visor/node/VisorNodeGcTask.java    |  18 +-
 .../visor/node/VisorNodeGcTaskResult.java       |  85 ++++++
 .../internal/visor/node/VisorNodePingTask.java  |  15 +-
 .../visor/node/VisorNodePingTaskResult.java     |  99 +++++++
 .../visor/node/VisorNodeSuppressedErrors.java   |  89 ++++++
 .../node/VisorNodeSuppressedErrorsTask.java     |  23 +-
 .../node/VisorPeerToPeerConfiguration.java      |  57 ++--
 .../visor/node/VisorRestConfiguration.java      |  93 +++---
 .../node/VisorSegmentationConfiguration.java    |  67 +++--
 .../visor/node/VisorSpiDescription.java         |  89 ++++++
 .../visor/node/VisorSpisConfiguration.java      | 128 ++++----
 .../visor/node/VisorSuppressedError.java        | 147 ++++++++++
 .../node/VisorTransactionConfiguration.java     | 104 +++++--
 .../internal/visor/query/VisorQueryArg.java     |  65 +++-
 .../visor/query/VisorQueryCancelTask.java       |  72 +++++
 .../visor/query/VisorQueryCleanupTask.java      |   6 +-
 .../visor/query/VisorQueryConfiguration.java    | 142 +++++++++
 .../visor/query/VisorQueryDetailMetrics.java    | 205 +++++++++++++
 .../VisorQueryDetailMetricsCollectorTask.java   | 146 +++++++++
 .../internal/visor/query/VisorQueryEntity.java  | 188 ++++++++++++
 .../internal/visor/query/VisorQueryField.java   |  42 ++-
 .../internal/visor/query/VisorQueryIndex.java   | 105 +++++++
 .../visor/query/VisorQueryIndexField.java       | 106 +++++++
 .../internal/visor/query/VisorQueryJob.java     | 275 -----------------
 .../internal/visor/query/VisorQueryMetrics.java | 125 ++++++++
 .../visor/query/VisorQueryNextPageTask.java     |  33 ++-
 .../visor/query/VisorQueryNextPageTaskArg.java  |  86 ++++++
 .../query/VisorQueryResetDetailMetricsTask.java |  71 +++++
 .../visor/query/VisorQueryResetMetricsTask.java |  69 +++++
 .../internal/visor/query/VisorQueryResult.java  |  97 +++++-
 .../visor/query/VisorQueryResultEx.java         |  89 ------
 .../visor/query/VisorQueryScanRegexFilter.java  |  59 ++++
 .../internal/visor/query/VisorQueryTask.java    | 120 +++++++-
 .../internal/visor/query/VisorQueryUtils.java   |  43 ++-
 .../query/VisorRunningQueriesCollectorTask.java |  96 ++++++
 .../internal/visor/query/VisorRunningQuery.java |  47 ++-
 .../internal/visor/query/VisorScanQueryArg.java | 157 ++++++++++
 .../visor/query/VisorScanQueryTask.java         | 185 ++++++++++++
 .../visor/service/VisorServiceDescriptor.java   |  31 +-
 .../internal/visor/util/VisorTaskUtils.java     |  38 ++-
 .../plugin/security/SecurityPermissionSet.java  |   3 +-
 .../ignite/plugin/security/SecuritySubject.java |   3 +-
 .../plugin/segmentation/SegmentationPolicy.java |  18 +-
 .../resources/META-INF/classnames.properties    | 236 +++++++--------
 .../resources/META-INF/classnames.properties    |   8 -
 .../http/jetty/GridJettyObjectMapper.java       | 119 ++------
 .../commands/cache/VisorCacheClearCommand.scala |   2 +-
 .../commands/cache/VisorCacheCommand.scala      | 291 +++++++++---------
 .../commands/cache/VisorCacheScanCommand.scala  |  16 +-
 .../config/VisorConfigurationCommand.scala      | 183 ++++++------
 .../commands/disco/VisorDiscoveryCommand.scala  |  22 +-
 .../commands/events/VisorEventsCommand.scala    |  30 +-
 .../visor/commands/gc/VisorGcCommand.scala      |   4 +-
 .../commands/tasks/VisorTasksCommand.scala      |  61 ++--
 .../scala/org/apache/ignite/visor/visor.scala   |  34 +--
 modules/web-console/backend/app/agent.js        |  98 +++----
 modules/web-console/backend/app/browser.js      |  76 +++--
 modules/web-console/backend/app/mongo.js        |  21 +-
 .../frontend/app/modules/agent/agent.module.js  |  41 ++-
 .../generator/AbstractTransformer.js            |   5 -
 .../generator/ConfigurationGenerator.js         |  44 +--
 .../generator/JavaTransformer.service.js        |   3 +
 .../generator/PlatformGenerator.js              |  10 +-
 .../defaults/Cache.platform.service.js          |   5 -
 .../generator/defaults/Cache.service.js         |  10 +-
 .../generator/defaults/Cluster.service.js       |   1 -
 .../generator/defaults/IGFS.service.js          |   2 +-
 .../frontend/app/modules/sql/sql.controller.js  |  56 ++--
 .../states/configuration/caches/affinity.pug    |   2 +-
 .../states/configuration/caches/general.pug     |  25 ++
 .../states/configuration/caches/memory.pug      |  64 +---
 .../states/configuration/caches/query.pug       |   3 +
 .../states/configuration/clusters/events.pug    |   6 +-
 .../configuration/clusters/marshaller.pug       |   6 -
 .../states/configuration/clusters/swap.pug      |  72 -----
 .../modules/states/configuration/igfs/misc.pug  |   2 +-
 .../frontend/controllers/caches-controller.js   |  29 --
 .../frontend/controllers/clusters-controller.js |  38 ---
 .../views/configuration/clusters.tpl.pug        |   1 -
 .../ignite/console/demo/AgentClusterDemo.java   |   2 +
 .../src/main/resources/log4j.properties         |   1 -
 193 files changed, 9599 insertions(+), 4391 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/examples/src/main/scala/org/apache/ignite/scalar/examples/ScalarCacheAffinityExample.scala
----------------------------------------------------------------------
diff --git a/examples/src/main/scala/org/apache/ignite/scalar/examples/ScalarCacheAffinityExample.scala b/examples/src/main/scala/org/apache/ignite/scalar/examples/ScalarCacheAffinityExample.scala
index 40b947d..fc06fbb 100644
--- a/examples/src/main/scala/org/apache/ignite/scalar/examples/ScalarCacheAffinityExample.scala
+++ b/examples/src/main/scala/org/apache/ignite/scalar/examples/ScalarCacheAffinityExample.scala
@@ -88,7 +88,7 @@ object ScalarCacheAffinityExample extends App {
         val keys = (0 until KEY_CNT).toSeq
 
         // Map all keys to nodes.
-        val mappings = ignite$.cluster().mapKeysToNodes(NAME, keys)
+        val mappings = ignite$.affinity(NAME).mapKeysToNodes(keys)
 
         mappings.foreach(mapping => {
             val node = mapping._1

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/cassandra/store/src/test/bootstrap/aws/ignite/ignite-cassandra-server-template.xml
----------------------------------------------------------------------
diff --git a/modules/cassandra/store/src/test/bootstrap/aws/ignite/ignite-cassandra-server-template.xml b/modules/cassandra/store/src/test/bootstrap/aws/ignite/ignite-cassandra-server-template.xml
index 03b3346..01000d2 100644
--- a/modules/cassandra/store/src/test/bootstrap/aws/ignite/ignite-cassandra-server-template.xml
+++ b/modules/cassandra/store/src/test/bootstrap/aws/ignite/ignite-cassandra-server-template.xml
@@ -118,8 +118,6 @@
                     <property name="startSize" value="1000000"/>
                     <property name="cacheMode" value="PARTITIONED"/>
                     <property name="backups" value="0"/>
-                    <property name="offHeapMaxMemory" value="0"/>
-                    <property name="swapEnabled" value="false"/>
                     <property name="readThrough" value="true"/>
                     <property name="writeThrough" value="true"/>
                     <property name="writeBehindEnabled" value="true"/>
@@ -137,8 +135,6 @@
                     <property name="startSize" value="1000000"/>
                     <property name="cacheMode" value="PARTITIONED"/>
                     <property name="backups" value="0"/>
-                    <property name="offHeapMaxMemory" value="0"/>
-                    <property name="swapEnabled" value="false"/>
                     <property name="readThrough" value="true"/>
                     <property name="writeThrough" value="true"/>
                     <property name="writeBehindEnabled" value="true"/>
@@ -156,8 +152,6 @@
                     <property name="startSize" value="1000000"/>
                     <property name="cacheMode" value="PARTITIONED"/>
                     <property name="backups" value="0"/>
-                    <property name="offHeapMaxMemory" value="0"/>
-                    <property name="swapEnabled" value="false"/>
                     <property name="readThrough" value="true"/>
                     <property name="writeThrough" value="true"/>
                     <property name="writeBehindEnabled" value="true"/>

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/cassandra/store/src/test/bootstrap/aws/tests/ignite-cassandra-client-template.xml
----------------------------------------------------------------------
diff --git a/modules/cassandra/store/src/test/bootstrap/aws/tests/ignite-cassandra-client-template.xml b/modules/cassandra/store/src/test/bootstrap/aws/tests/ignite-cassandra-client-template.xml
index 77ffb9e..c5a9c9a 100644
--- a/modules/cassandra/store/src/test/bootstrap/aws/tests/ignite-cassandra-client-template.xml
+++ b/modules/cassandra/store/src/test/bootstrap/aws/tests/ignite-cassandra-client-template.xml
@@ -121,8 +121,6 @@
                     <property name="startSize" value="1000000"/>
                     <property name="cacheMode" value="PARTITIONED"/>
                     <property name="backups" value="0"/>
-                    <property name="offHeapMaxMemory" value="0"/>
-                    <property name="swapEnabled" value="false"/>
                     <property name="readThrough" value="true"/>
                     <property name="writeThrough" value="true"/>
                     <property name="writeBehindEnabled" value="true"/>
@@ -140,8 +138,6 @@
                     <property name="startSize" value="1000000"/>
                     <property name="cacheMode" value="PARTITIONED"/>
                     <property name="backups" value="0"/>
-                    <property name="offHeapMaxMemory" value="0"/>
-                    <property name="swapEnabled" value="false"/>
                     <property name="readThrough" value="true"/>
                     <property name="writeThrough" value="true"/>
                     <property name="writeBehindEnabled" value="true"/>
@@ -159,8 +155,6 @@
                     <property name="startSize" value="1000000"/>
                     <property name="cacheMode" value="PARTITIONED"/>
                     <property name="backups" value="0"/>
-                    <property name="offHeapMaxMemory" value="0"/>
-                    <property name="swapEnabled" value="false"/>
                     <property name="readThrough" value="true"/>
                     <property name="writeThrough" value="true"/>
                     <property name="writeBehindEnabled" value="true"/>

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java
index a71737f..e2dddd1 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java
@@ -70,6 +70,7 @@ import org.apache.ignite.internal.visor.cache.VisorCacheMetricsCollectorTask;
 import org.apache.ignite.internal.visor.cache.VisorCacheNodesTask;
 import org.apache.ignite.internal.visor.cache.VisorCacheRebalanceTask;
 import org.apache.ignite.internal.visor.cache.VisorCacheResetMetricsTask;
+import org.apache.ignite.internal.visor.cache.VisorCacheStartArg;
 import org.apache.ignite.internal.visor.cache.VisorCacheStartTask;
 import org.apache.ignite.internal.visor.cache.VisorCacheStopTask;
 import org.apache.ignite.internal.visor.compute.VisorComputeCancelSessionsTask;
@@ -77,6 +78,7 @@ import org.apache.ignite.internal.visor.compute.VisorComputeResetMetricsTask;
 import org.apache.ignite.internal.visor.compute.VisorComputeToggleMonitoringTask;
 import org.apache.ignite.internal.visor.compute.VisorGatewayTask;
 import org.apache.ignite.internal.visor.debug.VisorThreadDumpTask;
+import org.apache.ignite.internal.visor.file.VisorFileBlockArg;
 import org.apache.ignite.internal.visor.file.VisorFileBlockTask;
 import org.apache.ignite.internal.visor.file.VisorLatestTextFilesTask;
 import org.apache.ignite.internal.visor.igfs.VisorIgfsFormatTask;
@@ -84,6 +86,7 @@ import org.apache.ignite.internal.visor.igfs.VisorIgfsProfilerClearTask;
 import org.apache.ignite.internal.visor.igfs.VisorIgfsProfilerTask;
 import org.apache.ignite.internal.visor.igfs.VisorIgfsResetMetricsTask;
 import org.apache.ignite.internal.visor.igfs.VisorIgfsSamplingStateTask;
+import org.apache.ignite.internal.visor.log.VisorLogSearchArg;
 import org.apache.ignite.internal.visor.log.VisorLogSearchTask;
 import org.apache.ignite.internal.visor.misc.VisorAckTask;
 import org.apache.ignite.internal.visor.misc.VisorLatestVersionTask;
@@ -92,6 +95,7 @@ import org.apache.ignite.internal.visor.node.VisorNodeConfigurationCollectorTask
 import org.apache.ignite.internal.visor.node.VisorNodeDataCollectorTask;
 import org.apache.ignite.internal.visor.node.VisorNodeDataCollectorTaskArg;
 import org.apache.ignite.internal.visor.node.VisorNodeEventsCollectorTask;
+import org.apache.ignite.internal.visor.node.VisorNodeEventsCollectorTaskArg;
 import org.apache.ignite.internal.visor.node.VisorNodeGcTask;
 import org.apache.ignite.internal.visor.node.VisorNodePingTask;
 import org.apache.ignite.internal.visor.node.VisorNodeSuppressedErrorsTask;
@@ -1373,7 +1377,7 @@ public abstract class JettyRestProcessorAbstractSelfTest extends AbstractRestPro
 
         ret = content(new VisorGatewayArgument(VisorFileBlockTask.class)
             .forNode(locNode)
-            .argument(VisorFileBlockTask.VisorFileBlockArg.class, "", 0L, 1, 0L));
+            .argument(VisorFileBlockArg.class, "", 0L, 1, 0L));
 
         info("VisorFileBlockTask result: " + ret);
 
@@ -1456,7 +1460,7 @@ public abstract class JettyRestProcessorAbstractSelfTest extends AbstractRestPro
         jsonTaskResult(ret);
 
         ret = content(new VisorGatewayArgument(VisorLogSearchTask.class)
-            .argument(VisorLogSearchTask.VisorLogSearchArg.class, ".", ".", "abrakodabra.txt", 1));
+            .argument(VisorLogSearchArg.class, ".", ".", "abrakodabra.txt", 1));
 
         info("VisorLogSearchTask result: " + ret);
 
@@ -1476,7 +1480,7 @@ public abstract class JettyRestProcessorAbstractSelfTest extends AbstractRestPro
         jsonTaskResult(ret);
 
         ret = content(new VisorGatewayArgument(VisorNodeEventsCollectorTask.class)
-            .argument(VisorNodeEventsCollectorTask.VisorNodeEventsCollectorTaskArg.class,
+            .argument(VisorNodeEventsCollectorTaskArg.class,
                 "null", "null", "null", "taskName", "null"));
 
         info("VisorNodeEventsCollectorTask result: " + ret);
@@ -1526,7 +1530,7 @@ public abstract class JettyRestProcessorAbstractSelfTest extends AbstractRestPro
                     "</beans>";
 
         ret = content(new VisorGatewayArgument(VisorCacheStartTask.class)
-            .argument(VisorCacheStartTask.VisorCacheStartArg.class, false, "person2",
+            .argument(VisorCacheStartArg.class, false, "person2",
                 URLEncoder.encode(START_CACHE, CHARSET)));
 
         info("VisorCacheStartTask result: " + ret);

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/cache/PartitionLossPolicy.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/cache/PartitionLossPolicy.java b/modules/core/src/main/java/org/apache/ignite/cache/PartitionLossPolicy.java
index 1391e70..16608a0 100644
--- a/modules/core/src/main/java/org/apache/ignite/cache/PartitionLossPolicy.java
+++ b/modules/core/src/main/java/org/apache/ignite/cache/PartitionLossPolicy.java
@@ -19,6 +19,7 @@ package org.apache.ignite.cache;
 
 import java.util.Collection;
 import org.apache.ignite.Ignite;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * Partition loss policy. Defines how cache will behave in a case when one or more partitions are lost
@@ -62,5 +63,18 @@ public enum PartitionLossPolicy {
      * a previously lost and not cleared partition is undefined and may be different on different nodes in the
      * cluster.
      */
-    IGNORE
+    IGNORE;
+
+    /** Enumerated values. */
+    private static final PartitionLossPolicy[] VALS = values();
+
+    /**
+     * Efficiently gets enumerated value from its ordinal.
+     *
+     * @param ord Ordinal value.
+     * @return Enumerated value or {@code null} if ordinal out of range.
+     */
+    @Nullable public static PartitionLossPolicy fromOrdinal(byte ord) {
+        return ord >= 0 && ord < VALS.length ? VALS[ord] : null;
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/cache/QueryIndexType.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/cache/QueryIndexType.java b/modules/core/src/main/java/org/apache/ignite/cache/QueryIndexType.java
index f9b544d..9d2851d 100644
--- a/modules/core/src/main/java/org/apache/ignite/cache/QueryIndexType.java
+++ b/modules/core/src/main/java/org/apache/ignite/cache/QueryIndexType.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.cache;
 
+import org.jetbrains.annotations.Nullable;
+
 /**
  * Index type.
  */
@@ -34,5 +36,18 @@ public enum QueryIndexType {
     /**
      * Geo-spatial index.
      */
-    GEOSPATIAL
+    GEOSPATIAL;
+
+    /** Enum values. */
+    private static final QueryIndexType[] VALS = values();
+
+    /**
+     * Efficiently gets enumerated value from its ordinal.
+     *
+     * @param ord Ordinal value.
+     * @return Enumerated value.
+     */
+    @Nullable public static QueryIndexType fromOrdinal(int ord) {
+        return ord >= 0 && ord < VALS.length ? VALS[ord] : null;
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/LessNamingBean.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/LessNamingBean.java b/modules/core/src/main/java/org/apache/ignite/internal/LessNamingBean.java
deleted file mode 100644
index 3b885f9..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/LessNamingBean.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal;
-
-import org.apache.ignite.internal.util.tostring.GridToStringExclude;
-
-/**
- * Marker interface for beans with less naming conventions i.e., without "get" and "set" prefixes.
- */
-@GridToStringExclude
-public interface LessNamingBean {
-    // No-op.
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheSqlIndexMetadata.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheSqlIndexMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheSqlIndexMetadata.java
index 94602f7..539a156 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheSqlIndexMetadata.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheSqlIndexMetadata.java
@@ -19,7 +19,6 @@ package org.apache.ignite.internal.processors.cache.query;
 
 import java.io.Externalizable;
 import java.util.Collection;
-import org.apache.ignite.internal.LessNamingBean;
 
 /**
  * Ignite index descriptor.
@@ -28,7 +27,7 @@ import org.apache.ignite.internal.LessNamingBean;
  * {@link GridCacheSqlMetadata#indexes(String)} method.
  * @see GridCacheSqlMetadata
  */
-public interface GridCacheSqlIndexMetadata extends Externalizable, LessNamingBean {
+public interface GridCacheSqlIndexMetadata extends Externalizable {
     /**
      * Gets name of the index.
      *

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheSqlMetadata.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheSqlMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheSqlMetadata.java
index c82d2cb..724962e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheSqlMetadata.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheSqlMetadata.java
@@ -20,7 +20,6 @@ package org.apache.ignite.internal.processors.cache.query;
 import java.io.Externalizable;
 import java.util.Collection;
 import java.util.Map;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.spi.indexing.IndexingSpi;
 import org.jetbrains.annotations.Nullable;
 
@@ -31,7 +30,7 @@ import org.jetbrains.annotations.Nullable;
  * can be used to gather information about what can
  * be queried using Ignite cache queries feature.
  */
-public interface GridCacheSqlMetadata extends Externalizable, LessNamingBean {
+public interface GridCacheSqlMetadata extends Externalizable {
     /**
      * Cache name.
      *

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteExceptionRegistry.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteExceptionRegistry.java b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteExceptionRegistry.java
index b7bb07e..03eaaea 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteExceptionRegistry.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteExceptionRegistry.java
@@ -26,7 +26,6 @@ import java.util.concurrent.ConcurrentLinkedDeque;
 import java.util.concurrent.atomic.AtomicLong;
 import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.IgniteSystemProperties;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;
 import org.apache.ignite.internal.util.typedef.internal.A;
 import org.apache.ignite.internal.util.typedef.internal.S;
@@ -157,7 +156,7 @@ public class IgniteExceptionRegistry {
      * Detailed info about suppressed error.
      */
     @SuppressWarnings("PublicInnerClass")
-    public static class ExceptionInfo implements Serializable, LessNamingBean {
+    public static class ExceptionInfo implements Serializable {
         /** */
         private static final long serialVersionUID = 0L;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorDataTransferObject.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorDataTransferObject.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorDataTransferObject.java
new file mode 100644
index 0000000..d8dcf4e
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorDataTransferObject.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Base class for data transfer objects.
+ */
+public abstract class VisorDataTransferObject implements Externalizable {
+    /**
+     * @param col Source collection.
+     * @param <T> Collection type.
+     * @return List based on passed collection.
+     */
+    @Nullable protected static <T> List<T> toList(Collection<T> col) {
+        if (col != null)
+            return new ArrayList<>(col);
+
+        return null;
+    }
+
+    /**
+     * @return Transfer object version.
+     */
+    public byte getProtocolVersion() {
+        return 1;
+    }
+
+    /**
+     * Save object's specific data content.
+     *
+     * @param out Output object to write data content.
+     * @throws IOException If I/O errors occur.
+     */
+    protected abstract void writeExternalData(ObjectOutput out) throws IOException;
+
+    /** {@inheritDoc} */
+    @Override public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeByte(getProtocolVersion());
+
+        try (VisorDataTransferObjectOutput dtout = new VisorDataTransferObjectOutput(out)) {
+            writeExternalData(dtout);
+        }
+    }
+
+    /**
+     * Load object's specific data content.
+     *
+     * @param protoVer Input object version.
+     * @param in Input object to load data content.
+     * @throws IOException If I/O errors occur.
+     * @throws ClassNotFoundException If the class for an object being restored cannot be found.
+     */
+    protected abstract void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException;
+
+    /** {@inheritDoc} */
+    @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        byte ver = in.readByte();
+
+        try (VisorDataTransferObjectInput dtin = new VisorDataTransferObjectInput(in)) {
+            readExternalData(ver, dtin);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorDataTransferObjectInput.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorDataTransferObjectInput.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorDataTransferObjectInput.java
new file mode 100644
index 0000000..16e9330
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorDataTransferObjectInput.java
@@ -0,0 +1,156 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectInputStream;
+import org.apache.ignite.internal.util.io.GridByteArrayInputStream;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Wrapper for object input.
+ */
+public class VisorDataTransferObjectInput implements ObjectInput {
+    /** */
+    private final ObjectInputStream ois;
+
+    /**
+     * @param in Target input.
+     * @throws IOException If an I/O error occurs.
+     */
+    public VisorDataTransferObjectInput(ObjectInput in) throws IOException {
+        byte[] buf = U.readByteArray(in);
+
+        /* */
+        GridByteArrayInputStream bis = new GridByteArrayInputStream(buf);
+        ois = new ObjectInputStream(bis);
+    }
+
+
+    /** {@inheritDoc} */
+    @Override public Object readObject() throws ClassNotFoundException, IOException {
+        return ois.readObject();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int read() throws IOException {
+        return ois.read();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int read(byte[] b) throws IOException {
+        return ois.read(b);
+    }
+
+    /** {@inheritDoc} */
+    @Override public int read(byte[] b, int off, int len) throws IOException {
+        return ois.read(b, off, len);
+    }
+
+    /** {@inheritDoc} */
+    @Override public long skip(long n) throws IOException {
+        return ois.skip(n);
+    }
+
+    /** {@inheritDoc} */
+    @Override public int available() throws IOException {
+        return ois.available();
+    }
+
+    /** {@inheritDoc} */
+    @Override public void close() throws IOException {
+        ois.close();
+    }
+
+    /** {@inheritDoc} */
+    @Override public void readFully(@NotNull byte[] b) throws IOException {
+        ois.readFully(b);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void readFully(@NotNull byte[] b, int off, int len) throws IOException {
+        ois.readFully(b, off, len);
+    }
+
+    /** {@inheritDoc} */
+    @Override public int skipBytes(int n) throws IOException {
+        return ois.skipBytes(n);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean readBoolean() throws IOException {
+        return ois.readBoolean();
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte readByte() throws IOException {
+        return ois.readByte();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int readUnsignedByte() throws IOException {
+        return ois.readUnsignedByte();
+    }
+
+    /** {@inheritDoc} */
+    @Override public short readShort() throws IOException {
+        return ois.readShort();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int readUnsignedShort() throws IOException {
+        return ois.readUnsignedShort();
+    }
+
+    /** {@inheritDoc} */
+    @Override public char readChar() throws IOException {
+        return ois.readChar();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int readInt() throws IOException {
+        return ois.readInt();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long readLong() throws IOException {
+        return ois.readLong();
+    }
+
+    /** {@inheritDoc} */
+    @Override public float readFloat() throws IOException {
+        return ois.readFloat();
+    }
+
+    /** {@inheritDoc} */
+    @Override public double readDouble() throws IOException {
+        return ois.readDouble();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String readLine() throws IOException {
+        return ois.readLine();
+    }
+
+    /** {@inheritDoc} */
+    @NotNull @Override public String readUTF() throws IOException {
+        return ois.readUTF();
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorDataTransferObjectOutput.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorDataTransferObjectOutput.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorDataTransferObjectOutput.java
new file mode 100644
index 0000000..7fa772e
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorDataTransferObjectOutput.java
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor;
+
+import java.io.IOException;
+import java.io.ObjectOutput;
+import java.io.ObjectOutputStream;
+import org.apache.ignite.internal.util.io.GridByteArrayOutputStream;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Wrapper for object output.
+ */
+public class VisorDataTransferObjectOutput implements ObjectOutput {
+    /** */
+    private final ObjectOutput out;
+
+    /** */
+    private final GridByteArrayOutputStream bos;
+
+    /** */
+    private final ObjectOutputStream oos;
+
+    /**
+     * Constructor.
+     *
+     * @param out Target stream.
+     * @throws IOException If an I/O error occurs.
+     */
+    public VisorDataTransferObjectOutput(ObjectOutput out) throws IOException {
+        this.out = out;
+
+        bos = new GridByteArrayOutputStream();
+        oos = new ObjectOutputStream(bos);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void writeObject(Object obj) throws IOException {
+        oos.writeObject(obj);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void write(int b) throws IOException {
+        oos.write(b);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void write(byte[] b) throws IOException {
+        oos.write(b);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void write(byte[] b, int off, int len) throws IOException {
+        oos.write(b, off, len);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void writeBoolean(boolean v) throws IOException {
+        oos.writeBoolean(v);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void writeByte(int v) throws IOException {
+        oos.writeByte(v);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void writeShort(int v) throws IOException {
+        oos.writeShort(v);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void writeChar(int v) throws IOException {
+        oos.writeChar(v);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void writeInt(int v) throws IOException {
+        oos.writeInt(v);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void writeLong(long v) throws IOException {
+        oos.writeLong(v);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void writeFloat(float v) throws IOException {
+        oos.writeFloat(v);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void writeDouble(double v) throws IOException {
+        oos.writeDouble(v);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void writeBytes(@NotNull String s) throws IOException {
+        oos.writeBytes(s);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void writeChars(@NotNull String s) throws IOException {
+        oos.writeChars(s);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void writeUTF(@NotNull String s) throws IOException {
+        oos.writeUTF(s);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void flush() throws IOException {
+        oos.flush();
+    }
+
+    /** {@inheritDoc} */
+    @Override public void close() throws IOException {
+        oos.flush();
+
+        U.writeByteArray(out, bos.internalArray(), bos.size());
+
+        oos.close();
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorEither.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorEither.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorEither.java
new file mode 100644
index 0000000..f426e8a
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorEither.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.internal.util.typedef.internal.S;
+
+/**
+ * Base class for Visor result with error.
+ *
+ * @param <T> Result type.
+ */
+public class VisorEither<T> implements Externalizable {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Exception on execution. */
+    private Throwable error;
+
+    /** Result. */
+    private T res;
+
+    /**
+     * Default constructor.
+     */
+    public VisorEither() {
+        // No-op.
+    }
+
+    /**
+     * @param error Exception on execution.
+     */
+    public VisorEither(Throwable error) {
+        this.error = error;
+    }
+
+    /**
+     * @param res Result.
+     */
+    public VisorEither(T res) {
+        this.res = res;
+    }
+
+    /**
+     * @return {@code true} If failed on execution.
+     */
+    public boolean failed() {
+        return error != null;
+    }
+
+    /**
+     * @return Exception on execution.
+     */
+    public Throwable getError() {
+        return error;
+    }
+
+    /**
+     * @return Result.
+     */
+    public T getResult() {
+        return res;
+    }
+
+    /** {@inheritDoc} */
+    @Override public void writeExternal(ObjectOutput out) throws IOException {
+        boolean failed = failed();
+
+        out.writeBoolean(failed);
+        out.writeObject(failed ? error : res);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        if (in.readBoolean())
+            error = (Throwable)in.readObject();
+        else
+            res = (T)in.readObject();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorEither.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorMultiNodeTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorMultiNodeTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorMultiNodeTask.java
index ece1a17..563a236 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorMultiNodeTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorMultiNodeTask.java
@@ -69,9 +69,9 @@ public abstract class VisorMultiNodeTask<A, R, J> implements ComputeTask<VisorTa
 
         start = U.currentTimeMillis();
 
-        debug = arg.debug();
+        debug = arg.isDebug();
 
-        taskArg = arg.argument();
+        taskArg = arg.getArgument();
 
         if (debug)
             logStart(ignite.log(), getClass(), start);
@@ -88,7 +88,7 @@ public abstract class VisorMultiNodeTask<A, R, J> implements ComputeTask<VisorTa
      * @throws IgniteException If mapping could not complete successfully.
      */
     protected Map<? extends ComputeJob, ClusterNode> map0(List<ClusterNode> subgrid, VisorTaskArgument<A> arg) {
-        Collection<UUID> nodeIds = arg.nodes();
+        Collection<UUID> nodeIds = arg.getNodes();
 
         Map<ComputeJob, ClusterNode> map = U.newHashMap(nodeIds.size());
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorOneNodeTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorOneNodeTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorOneNodeTask.java
index e4880a8..e992875 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorOneNodeTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorOneNodeTask.java
@@ -19,7 +19,6 @@ package org.apache.ignite.internal.visor;
 
 import java.util.List;
 import org.apache.ignite.compute.ComputeJobResult;
-import org.apache.ignite.internal.util.typedef.F;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -30,11 +29,11 @@ public abstract class VisorOneNodeTask<A, R> extends VisorMultiNodeTask<A, R, R>
     @Nullable @Override protected R reduce0(List<ComputeJobResult> results) {
         assert results.size() == 1;
 
-        ComputeJobResult res = F.first(results);
+        ComputeJobResult res = results.get(0);
 
         if (res.getException() == null)
             return res.getData();
 
         throw res.getException();
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorTaskArgument.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorTaskArgument.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorTaskArgument.java
index b28ebbe..05d999d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorTaskArgument.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorTaskArgument.java
@@ -17,26 +17,38 @@
 
 package org.apache.ignite.internal.visor;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.List;
 import java.util.UUID;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
 
 /**
  * Visor tasks argument.
  */
-public class VisorTaskArgument<A> implements Serializable {
+public class VisorTaskArgument<A> extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
     /** Node IDs task should be mapped to. */
-    private final Collection<UUID> nodes;
+    private List<UUID> nodes;
 
     /** Task argument. */
-    private final A arg;
+    private A arg;
 
     /** Debug flag. */
-    private final boolean debug;
+    private boolean debug;
+
+    /**
+     * Default constructor.
+     */
+    public VisorTaskArgument() {
+        // No-op.
+    }
 
     /**
      * Create Visor task argument.
@@ -49,7 +61,7 @@ public class VisorTaskArgument<A> implements Serializable {
         assert nodes != null;
         assert !nodes.isEmpty();
 
-        this.nodes = nodes;
+        this.nodes = toList(nodes);
         this.arg = arg;
         this.debug = debug;
     }
@@ -72,7 +84,7 @@ public class VisorTaskArgument<A> implements Serializable {
      * @param debug Debug flag.
      */
     public VisorTaskArgument(UUID node, A arg, boolean debug) {
-        this(Collections.singleton(node), arg, debug);
+        this(Collections.singletonList(node), arg, debug);
     }
 
     /**
@@ -88,21 +100,40 @@ public class VisorTaskArgument<A> implements Serializable {
     /**
      * @return Node IDs task should be mapped to.
      */
-    public Collection<UUID> nodes() {
+    public List<UUID> getNodes() {
         return nodes;
     }
 
     /**
      * @return Task argument.
      */
-    public A argument() {
+    public A getArgument() {
         return arg;
     }
 
     /**
      * @return Debug flag.
      */
-    public boolean debug() {
+    public boolean isDebug() {
         return debug;
     }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeCollection(out, nodes);
+        out.writeObject(arg);
+        out.writeBoolean(debug);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        nodes = U.readList(in);
+        arg = (A)in.readObject();
+        debug = in.readBoolean();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorTaskArgument.class, this);
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/binary/VisorBinaryMetadata.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/binary/VisorBinaryMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/binary/VisorBinaryMetadata.java
new file mode 100644
index 0000000..5e948c6
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/binary/VisorBinaryMetadata.java
@@ -0,0 +1,139 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.binary;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.apache.ignite.IgniteBinary;
+import org.apache.ignite.binary.BinaryType;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Binary object metadata to show in Visor.
+ */
+public class VisorBinaryMetadata extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Type name */
+    private String typeName;
+
+    /** Type Id */
+    private Integer typeId;
+
+    /** Affinity key field name. */
+    private String affinityKeyFieldName;
+
+    /** Filed list */
+    private List<VisorBinaryMetadataField> fields;
+
+    /**
+     * @param binary Binary objects.
+     * @return List of data transfer objects for binary objects metadata.
+     */
+    public static List<VisorBinaryMetadata> list(IgniteBinary binary) {
+        List<VisorBinaryMetadata> res = new ArrayList<>();
+
+        if (binary != null) {
+            for (BinaryType binaryType : binary.types())
+                res.add(new VisorBinaryMetadata(binary, binaryType));
+        }
+
+        return res;
+    }
+
+    /**
+     * Default constructor.
+     */
+    public VisorBinaryMetadata() {
+        // No-op.
+    }
+
+    /**
+     * Default constructor.
+     */
+    public VisorBinaryMetadata(IgniteBinary binary, BinaryType binaryType) {
+        typeName = binaryType.typeName();
+        typeId = binary.typeId(typeName);
+        affinityKeyFieldName = binaryType.affinityKeyFieldName();
+
+        Collection<String> binaryTypeFields = binaryType.fieldNames();
+
+        fields = new ArrayList<>(binaryTypeFields.size());
+
+        for (String metaField : binaryTypeFields)
+            fields.add(new VisorBinaryMetadataField(metaField, binaryType.fieldTypeName(metaField), null));
+    }
+
+    /**
+     * @return Type name.
+     */
+    public String getTypeName() {
+        return typeName;
+    }
+
+    /**
+     * @return Type Id.
+     */
+    public Integer getTypeId() {
+        return typeId;
+    }
+
+    /**
+     * @return Fields list.
+     */
+    public Collection<VisorBinaryMetadataField> getFields() {
+        return fields;
+    }
+
+    /**
+     * @return Affinity key field name.
+     */
+    @Nullable public String getAffinityKeyFieldName() {
+        return affinityKeyFieldName;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, typeName);
+        out.writeObject(typeId);
+        U.writeString(out, affinityKeyFieldName);
+        U.writeCollection(out, fields);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer,
+        ObjectInput in) throws IOException, ClassNotFoundException {
+        typeName = U.readString(in);
+        typeId = (Integer)in.readObject();
+        affinityKeyFieldName = U.readString(in);
+        fields = U.readList(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorBinaryMetadata.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/binary/VisorBinaryMetadataCollectorTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/binary/VisorBinaryMetadataCollectorTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/binary/VisorBinaryMetadataCollectorTask.java
new file mode 100644
index 0000000..de67805
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/binary/VisorBinaryMetadataCollectorTask.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.binary;
+
+import org.apache.ignite.IgniteBinary;
+import org.apache.ignite.internal.binary.BinaryMarshaller;
+import org.apache.ignite.internal.processors.task.GridInternal;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.visor.VisorJob;
+import org.apache.ignite.internal.visor.VisorOneNodeTask;
+import org.apache.ignite.marshaller.Marshaller;
+
+/**
+ * Task that collects binary metadata.
+ */
+@GridInternal
+public class VisorBinaryMetadataCollectorTask extends VisorOneNodeTask<Long, VisorBinaryMetadataCollectorTaskResult> {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** {@inheritDoc} */
+    @Override protected VisorBinaryCollectMetadataJob job(Long lastUpdate) {
+        return new VisorBinaryCollectMetadataJob(lastUpdate, debug);
+    }
+
+    /** Job that collect portables metadata on node. */
+    private static class VisorBinaryCollectMetadataJob extends VisorJob<Long, VisorBinaryMetadataCollectorTaskResult> {
+        /** */
+        private static final long serialVersionUID = 0L;
+
+        /**
+         * Create job with given argument.
+         *
+         * @param lastUpdate Time data was collected last time.
+         * @param debug Debug flag.
+         */
+        private VisorBinaryCollectMetadataJob(Long lastUpdate, boolean debug) {
+            super(lastUpdate, debug);
+        }
+
+        /** {@inheritDoc} */
+        @Override protected VisorBinaryMetadataCollectorTaskResult run(Long lastUpdate) {
+            Marshaller marsh =  ignite.configuration().getMarshaller();
+
+            IgniteBinary binary = marsh == null || marsh instanceof BinaryMarshaller ? ignite.binary() : null;
+
+            return new VisorBinaryMetadataCollectorTaskResult(0L, VisorBinaryMetadata.list(binary));
+        }
+
+        /** {@inheritDoc} */
+        @Override public String toString() {
+            return S.toString(VisorBinaryCollectMetadataJob.class, this);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/binary/VisorBinaryMetadataCollectorTaskResult.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/binary/VisorBinaryMetadataCollectorTaskResult.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/binary/VisorBinaryMetadataCollectorTaskResult.java
new file mode 100644
index 0000000..e96b7ef
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/binary/VisorBinaryMetadataCollectorTaskResult.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.binary;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.List;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Result for {@link VisorBinaryMetadataCollectorTask}
+ */
+public class VisorBinaryMetadataCollectorTaskResult extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Last binary metadata update date. */
+    private Long lastUpdate;
+
+    /** Remote data center IDs for which full state transfer was requested. */
+    private List<VisorBinaryMetadata> binary;
+
+    /**
+     * Default constructor.
+     */
+    public VisorBinaryMetadataCollectorTaskResult() {
+        // No-op.
+    }
+
+    /**
+     * @param lastUpdate Last binary metadata update date.
+     * @param binary Remote data center IDs for which full state transfer was requested.
+     */
+    public VisorBinaryMetadataCollectorTaskResult(Long lastUpdate, List<VisorBinaryMetadata> binary) {
+        this.lastUpdate = lastUpdate;
+        this.binary = binary;
+    }
+
+    /**
+     * @return Last binary metadata update date.
+     */
+    public Long getLastUpdate() {
+        return lastUpdate;
+    }
+
+    /**
+     * @return Remote data center IDs for which full state transfer was requested.
+     */
+    public List<VisorBinaryMetadata> getBinary() {
+        return binary;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeLong(lastUpdate);
+        U.writeCollection(out, binary);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        lastUpdate = in.readLong();
+        binary = U.readList(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorBinaryMetadataCollectorTaskResult.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/binary/VisorBinaryMetadataField.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/binary/VisorBinaryMetadataField.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/binary/VisorBinaryMetadataField.java
new file mode 100644
index 0000000..69c880c
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/binary/VisorBinaryMetadataField.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.binary;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Binary object metadata field information.
+ */
+public class VisorBinaryMetadataField extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Field name. */
+    private String fieldName;
+
+    /** Field type name. */
+    private String fieldTypeName;
+
+    /** Field id. */
+    private Integer fieldId;
+
+    /**
+     * Default constructor.
+     */
+    public VisorBinaryMetadataField() {
+        // No-op.
+    }
+
+    /**
+     * @param fieldName Field name.
+     * @param fieldTypeName Field type name.
+     * @param fieldId Field id.
+     */
+    public VisorBinaryMetadataField(String fieldName, String fieldTypeName, Integer fieldId) {
+        this.fieldName = fieldName;
+        this.fieldTypeName = fieldTypeName;
+        this.fieldId = fieldId;
+    }
+
+    /**
+     * @return Field name.
+     */
+    public String getFieldName() {
+        return fieldName;
+    }
+
+    /**
+     * @return Field type name.
+     */
+    @Nullable public String getFieldTypeName() {
+        return fieldTypeName;
+    }
+
+    /**
+     * @return Field id.
+     */
+    public Integer getFieldId() {
+        return fieldId;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, fieldName);
+        U.writeString(out, fieldTypeName);
+        out.writeObject(fieldId);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        fieldName = U.readString(in);
+        fieldTypeName = U.readString(in);
+        fieldId = (Integer)in.readObject();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorBinaryMetadataField.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCache.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCache.java
index f239ed9..4a35795 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCache.java
@@ -17,37 +17,36 @@
 
 package org.apache.ignite.internal.visor.cache;
 
-import java.io.Serializable;
-import java.util.Iterator;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.cache.CacheMode;
 import org.apache.ignite.cache.CachePeekMode;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.internal.IgniteEx;
-import org.apache.ignite.internal.LessNamingBean;
-import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
 import org.apache.ignite.internal.processors.cache.GridCacheContext;
-import org.apache.ignite.internal.processors.cache.GridCacheEntryEx;
 import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtCacheAdapter;
 import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionTopology;
-import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap;
 import org.apache.ignite.internal.processors.cache.distributed.near.GridNearCacheAdapter;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 import org.apache.ignite.lang.IgniteUuid;
 import org.jetbrains.annotations.Nullable;
 
 /**
  * Data transfer object for {@link IgniteCache}.
  */
-public class VisorCache implements Serializable, LessNamingBean {
+public class VisorCache extends VisorDataTransferObject {
     /** */
-    private static final CachePeekMode[] PEEK_NO_NEAR =
-        new CachePeekMode[] {CachePeekMode.PRIMARY, CachePeekMode.BACKUP};
+    private static final long serialVersionUID = 0L;
 
     /** */
-    private static final long serialVersionUID = 0L;
+    private static final CachePeekMode[] PEEK_NO_NEAR =
+        new CachePeekMode[] {CachePeekMode.PRIMARY, CachePeekMode.BACKUP};
 
     /** Default cache size sampling. */
     private static final int DFLT_CACHE_SIZE_SAMPLING = 10;
@@ -92,28 +91,29 @@ public class VisorCache implements Serializable, LessNamingBean {
     private VisorCacheMetrics metrics;
 
     /** Cache partitions states. */
-    private GridDhtPartitionMap partitionsMap;
+    private VisorPartitionMap parts;
+
+    /**
+     * Create data transfer object for given cache.
+     */
+    public VisorCache() {
+        // No-op.
+    }
 
     /**
-     * @param ignite Grid.
-     * @param cacheName Cache name.
+     * Create data transfer object for given cache.
+     *
+     * @param ca Internal cache.
      * @param sample Sample size.
-     * @return Data transfer object for given cache.
      * @throws IgniteCheckedException If failed to create data transfer object.
      */
-    public VisorCache from(IgniteEx ignite, String cacheName, int sample) throws IgniteCheckedException {
-        assert ignite != null;
-
-        GridCacheAdapter ca = ignite.context().cache().internalCache(cacheName);
+    public VisorCache(IgniteEx ignite, GridCacheAdapter ca, int sample) throws IgniteCheckedException {
+        assert ca != null;
 
-        // Cache was not started.
-        if (ca == null || !ca.context().started())
-            return null;
+        name = ca.name();
 
         GridCacheContext cctx = ca.context();
 
-        name = cacheName;
-
         CacheConfiguration cfg = ca.configuration();
 
         mode = cfg.getCacheMode();
@@ -133,7 +133,7 @@ public class VisorCache implements Serializable, LessNamingBean {
                 GridDhtPartitionTopology top = dca.topology();
 
                 if (cfg.getCacheMode() != CacheMode.LOCAL && cfg.getBackups() > 0)
-                    partitionsMap = top.localPartitionMap();
+                    parts = new VisorPartitionMap(top.localPartitionMap());
             }
         }
 
@@ -144,23 +144,19 @@ public class VisorCache implements Serializable, LessNamingBean {
         nearSize = ca.nearSize();
         onHeapEntriesCnt = 0; // TODO GG-11148 Need to rename on ON-heap entries count, see
         partitions = ca.affinity().partitions();
-        metrics = new VisorCacheMetrics().from(ignite, cacheName);
+        metrics = new VisorCacheMetrics(ignite, name);  // TODO: GG-11683 Move to separate thing
         near = cctx.isNear();
 
         estimateMemorySize(ignite, ca, sample);
-
-        return this;
     }
 
     /**
      * Estimate memory size used by cache.
      *
-     * @param ignite Ignite.
      * @param ca Cache adapter.
      * @param sample Sample size.
-     * @throws IgniteCheckedException If estimation failed.
      */
-    protected void estimateMemorySize(IgniteEx ignite, GridCacheAdapter ca, int sample) throws IgniteCheckedException {
+    protected void estimateMemorySize(IgniteEx ignite, GridCacheAdapter ca, int sample) {
         /* TODO Fix after GG-11739 implemented.
         int size = ca.size();
 
@@ -215,7 +211,7 @@ public class VisorCache implements Serializable, LessNamingBean {
     /**
      * @return Cache name.
      */
-    public String name() {
+    public String getName() {
         return name;
     }
 
@@ -224,102 +220,138 @@ public class VisorCache implements Serializable, LessNamingBean {
      *
      * @param name New cache name.
      */
-    public void name(String name) {
+    public void setName(String name) {
         this.name = name;
     }
 
     /**
      * @return Dynamic deployment ID.
      */
-    public IgniteUuid dynamicDeploymentId() {
+    public IgniteUuid getDynamicDeploymentId() {
         return dynamicDeploymentId;
     }
 
     /**
      * @return Cache mode.
      */
-    public CacheMode mode() {
+    public CacheMode getMode() {
         return mode;
     }
 
     /**
      * @return Cache size in bytes.
      */
-    public long memorySize() {
+    public long getMemorySize() {
         return memorySize;
     }
 
     /**
      * @return Indexes size in bytes.
      */
-    public long indexesSize() {
+    public long getIndexesSize() {
         return indexesSize;
     }
 
     /**
      * @return Number of all entries in cache.
      */
-    public long size() {
+    public long getSize() {
         return size;
     }
 
     /**
      * @return Number of all entries in near cache.
      */
-    public int nearSize() {
+    public int getNearSize() {
         return nearSize;
     }
 
     /**
      * @return Number of backup entries in cache.
      */
-    public long backupSize() {
+    public long getBackupSize() {
         return backupSize;
     }
 
     /**
      * @return Number of primary entries in cache.
      */
-    public long primarySize() {
+    public long getPrimarySize() {
         return primarySize;
     }
 
     /**
      * @return Number of cache entries stored in heap memory.
      */
-    public long onHeapEntriesCount() {
+    public long getOnHeapEntriesCount() {
         return onHeapEntriesCnt;
     }
 
     /**
      * @return Number of partitions.
      */
-    public int partitions() {
+    public int getPartitions() {
         return partitions;
     }
 
     /**
      * @return Cache metrics.
      */
-    public VisorCacheMetrics metrics() {
+    public VisorCacheMetrics getMetrics() {
         return metrics;
     }
 
     /**
      * @return Cache partitions states.
      */
-    @Nullable public GridDhtPartitionMap partitionMap() {
-        return partitionsMap;
+    @Nullable public VisorPartitionMap getPartitionMap() {
+        return parts;
     }
 
     /**
      * @return {@code true} if cache has near cache.
      */
-    public boolean near() {
+    public boolean isNear() {
         return near;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, name);
+        U.writeGridUuid(out, dynamicDeploymentId);
+        U.writeEnum(out, mode);
+        out.writeLong(memorySize);
+        out.writeLong(indexesSize);
+        out.writeLong(size);
+        out.writeInt(nearSize);
+        out.writeLong(primarySize);
+        out.writeLong(backupSize);
+        out.writeLong(onHeapEntriesCnt);
+        out.writeInt(partitions);
+        out.writeBoolean(near);
+        out.writeObject(metrics);
+        out.writeObject(parts);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        name = U.readString(in);
+        dynamicDeploymentId = U.readGridUuid(in);
+        mode = CacheMode.fromOrdinal(in.readByte());
+        memorySize = in.readLong();
+        indexesSize = in.readLong();
+        size = in.readLong();
+        nearSize = in.readInt();
+        primarySize = in.readLong();
+        backupSize = in.readLong();
+        onHeapEntriesCnt = in.readLong();
+        partitions = in.readInt();
+        near = in.readBoolean();
+        metrics = (VisorCacheMetrics)in.readObject();
+        parts = (VisorPartitionMap)in.readObject();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorCache.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAffinityConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAffinityConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAffinityConfiguration.java
index 371a514..d8616d3 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAffinityConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAffinityConfiguration.java
@@ -17,20 +17,25 @@
 
 package org.apache.ignite.internal.visor.cache;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import org.apache.ignite.cache.affinity.AffinityFunction;
-import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction;
 import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 import org.jetbrains.annotations.Nullable;
 
+import static org.apache.ignite.internal.util.IgniteUtils.findNonPublicMethod;
 import static org.apache.ignite.internal.visor.util.VisorTaskUtils.compactClass;
 
 /**
  * Data transfer object for affinity configuration properties.
  */
-public class VisorCacheAffinityConfiguration implements Serializable, LessNamingBean {
+public class VisorCacheAffinityConfiguration extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -40,74 +45,98 @@ public class VisorCacheAffinityConfiguration implements Serializable, LessNaming
     /** Cache affinity mapper. */
     private String mapper;
 
-    /** Count of key backups. */
+    /** Number of backup nodes for one partition. */
     private int partitionedBackups;
 
-    /** Cache affinity partitions. */
+    /** Total partition count. */
     private Integer partitions;
 
     /** Cache partitioned affinity exclude neighbors. */
-    private Boolean excludeNeighbors;
+    private Boolean exclNeighbors;
 
     /**
+     * Default constructor
+     */
+    public VisorCacheAffinityConfiguration() {
+        // No-op.
+    }
+
+    /**
+     * Create data transfer object for affinity configuration properties.
+     *
      * @param ccfg Cache configuration.
-     * @return Data transfer object for affinity configuration properties.
      */
-    public static VisorCacheAffinityConfiguration from(CacheConfiguration ccfg) {
+    public VisorCacheAffinityConfiguration(CacheConfiguration ccfg) {
         AffinityFunction aff = ccfg.getAffinity();
 
-        Boolean excludeNeighbors = null;
+        function = compactClass(aff);
+        mapper = compactClass(ccfg.getAffinityMapper());
+        partitions = aff.partitions();
+        partitionedBackups = ccfg.getBackups();
 
-        if (aff instanceof RendezvousAffinityFunction) {
-            RendezvousAffinityFunction hashAffFunc = (RendezvousAffinityFunction)aff;
+        Method mthd = findNonPublicMethod(aff.getClass(), "isExcludeNeighbors");
 
-            excludeNeighbors = hashAffFunc.isExcludeNeighbors();
+        if (mthd != null) {
+            try {
+                exclNeighbors = (Boolean)mthd.invoke(aff);
+            }
+            catch (InvocationTargetException | IllegalAccessException ignored) {
+                //  No-op.
+            }
         }
-
-        VisorCacheAffinityConfiguration cfg = new VisorCacheAffinityConfiguration();
-
-        cfg.function = compactClass(aff);
-        cfg.mapper = compactClass(ccfg.getAffinityMapper());
-        cfg.partitions = aff.partitions();
-        cfg.partitionedBackups = ccfg.getBackups();
-        cfg.excludeNeighbors = excludeNeighbors;
-
-        return cfg;
     }
 
     /**
      * @return Cache affinity.
      */
-    public String function() {
+    public String getFunction() {
         return function;
     }
 
     /**
      * @return Cache affinity mapper.
      */
-    public String mapper() {
+    public String getMapper() {
         return mapper;
     }
 
     /**
-     * @return Count of key backups.
+     * @return Number of backup nodes for one partition.
      */
-    public int partitionedBackups() {
+    public int getPartitionedBackups() {
         return partitionedBackups;
     }
 
     /**
-     * @return Cache affinity partitions.
+     * @return Total partition count.
      */
-    public Integer partitions() {
+    public Integer getPartitions() {
         return partitions;
     }
 
     /**
      * @return Cache partitioned affinity exclude neighbors.
      */
-    @Nullable public Boolean excludeNeighbors() {
-        return excludeNeighbors;
+    @Nullable public Boolean isExcludeNeighbors() {
+        return exclNeighbors;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, function);
+        U.writeString(out, mapper);
+        out.writeInt(partitionedBackups);
+        out.writeObject(partitions);
+        out.writeObject(exclNeighbors);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        function = U.readString(in);
+        mapper = U.readString(in);
+        partitionedBackups = in.readInt();
+        partitions = (Integer)in.readObject();
+        exclNeighbors = (Boolean)in.readObject();
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAffinityNodeTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAffinityNodeTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAffinityNodeTask.java
index 83d421a..447cc11 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAffinityNodeTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAffinityNodeTask.java
@@ -24,24 +24,23 @@ import org.apache.ignite.internal.processors.task.GridInternal;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.visor.VisorJob;
 import org.apache.ignite.internal.visor.VisorOneNodeTask;
-import org.apache.ignite.lang.IgniteBiTuple;
 import org.jetbrains.annotations.Nullable;
 
 /**
  * Task that will find affinity node for key.
  */
 @GridInternal
-public class VisorCacheAffinityNodeTask extends VisorOneNodeTask<IgniteBiTuple<String, Object>, UUID> {
+public class VisorCacheAffinityNodeTask extends VisorOneNodeTask<VisorCacheAffinityNodeTaskArg, UUID> {
     /** */
     private static final long serialVersionUID = 0L;
 
     /** {@inheritDoc} */
-    @Override protected VisorCacheAffinityNodeJob job(IgniteBiTuple<String, Object> arg) {
+    @Override protected VisorCacheAffinityNodeJob job(VisorCacheAffinityNodeTaskArg arg) {
         return new VisorCacheAffinityNodeJob(arg, debug);
     }
 
     /** Job that will find affinity node for key. */
-    private static class VisorCacheAffinityNodeJob extends VisorJob<IgniteBiTuple<String, Object>, UUID> {
+    private static class VisorCacheAffinityNodeJob extends VisorJob<VisorCacheAffinityNodeTaskArg, UUID> {
         /** */
         private static final long serialVersionUID = 0L;
 
@@ -49,15 +48,15 @@ public class VisorCacheAffinityNodeTask extends VisorOneNodeTask<IgniteBiTuple<S
          * @param arg Cache name and key to find affinity node.
          * @param debug Debug flag.
          */
-        private VisorCacheAffinityNodeJob(IgniteBiTuple<String, Object> arg, boolean debug) {
+        private VisorCacheAffinityNodeJob(VisorCacheAffinityNodeTaskArg arg, boolean debug) {
             super(arg, debug);
         }
 
         /** {@inheritDoc} */
-        @Override protected UUID run(@Nullable IgniteBiTuple<String, Object> arg) throws IgniteException {
+        @Override protected UUID run(@Nullable VisorCacheAffinityNodeTaskArg arg) throws IgniteException {
             assert arg != null;
 
-            ClusterNode node = ignite.affinity(arg.getKey()).mapKeyToNode(arg.getValue());
+            ClusterNode node = ignite.affinity(arg.getCacheName()).mapKeyToNode(arg.getKey());
 
             return node != null ? node.id() : null;
         }


[07/11] ignite git commit: IGNITE-4988 Cleanup and refactor VisorXxx tasks and DTO for ignite-2.0

Posted by ak...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/file/VisorFileBlockArg.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/file/VisorFileBlockArg.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/file/VisorFileBlockArg.java
new file mode 100644
index 0000000..babb630
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/file/VisorFileBlockArg.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.file;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Arguments for {@link VisorFileBlockTask}
+ */
+public class VisorFileBlockArg extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Log file path. */
+    private String path;
+
+    /** Log file offset. */
+    private long off;
+
+    /** Block size. */
+    private int blockSz;
+
+    /** Log file last modified timestamp. */
+    private long lastModified;
+
+    /**
+     * Default constructor.
+     */
+    public VisorFileBlockArg() {
+        // No-op.
+    }
+
+    /**
+     * @param path Log file path.
+     * @param off Offset in file.
+     * @param blockSz Block size.
+     * @param lastModified Log file last modified timestamp.
+     */
+    public VisorFileBlockArg(String path, long off, int blockSz, long lastModified) {
+        this.path = path;
+        this.off = off;
+        this.blockSz = blockSz;
+        this.lastModified = lastModified;
+    }
+
+    /**
+     * @return Log file path.
+     */
+    public String getPath() {
+        return path;
+    }
+
+    /**
+     * @return Log file offset.
+     */
+    public long getOffset() {
+        return off;
+    }
+
+    /**
+     * @return Block size
+     */
+    public int getBlockSize() {
+        return blockSz;
+    }
+
+    /**
+     * @return Log file last modified timestamp.
+     */
+    public long getLastModified() {
+        return lastModified;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, path);
+        out.writeLong(off);
+        out.writeInt(blockSz);
+        out.writeLong(lastModified);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        path = U.readString(in);
+        off = in.readLong();
+        blockSz = in.readInt();
+        lastModified = in.readLong();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorFileBlockArg.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/file/VisorFileBlockTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/file/VisorFileBlockTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/file/VisorFileBlockTask.java
index 58a25ee..85a790b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/file/VisorFileBlockTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/file/VisorFileBlockTask.java
@@ -19,16 +19,15 @@ package org.apache.ignite.internal.visor.file;
 
 import java.io.File;
 import java.io.IOException;
-import java.io.Serializable;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.nio.file.NoSuchFileException;
 import org.apache.ignite.internal.processors.task.GridInternal;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorEither;
 import org.apache.ignite.internal.visor.VisorJob;
 import org.apache.ignite.internal.visor.VisorOneNodeTask;
-import org.apache.ignite.lang.IgniteBiTuple;
 
 import static org.apache.ignite.internal.visor.util.VisorTaskUtils.readBlock;
 
@@ -36,8 +35,7 @@ import static org.apache.ignite.internal.visor.util.VisorTaskUtils.readBlock;
  * Task to read file block.
  */
 @GridInternal
-public class VisorFileBlockTask extends VisorOneNodeTask<VisorFileBlockTask.VisorFileBlockArg,
-    IgniteBiTuple<? extends IOException, VisorFileBlock>> {
+public class VisorFileBlockTask extends VisorOneNodeTask<VisorFileBlockArg, VisorEither<VisorFileBlock>> {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -47,49 +45,10 @@ public class VisorFileBlockTask extends VisorOneNodeTask<VisorFileBlockTask.Viso
     }
 
     /**
-     * Arguments for {@link VisorFileBlockTask}
-     */
-    @SuppressWarnings("PublicInnerClass")
-    public static class VisorFileBlockArg implements Serializable {
-        /** */
-        private static final long serialVersionUID = 0L;
-
-        /** Log file path. */
-        private final String path;
-
-        /** Log file offset. */
-        private final long off;
-
-        /** Block size. */
-        private final int blockSz;
-
-        /** Log file last modified timestamp. */
-        private final long lastModified;
-
-        /**
-         * @param path Log file path.
-         * @param off Offset in file.
-         * @param blockSz Block size.
-         * @param lastModified Log file last modified timestamp.
-         */
-        public VisorFileBlockArg(String path, long off, int blockSz, long lastModified) {
-            this.path = path;
-            this.off = off;
-            this.blockSz = blockSz;
-            this.lastModified = lastModified;
-        }
-
-        /** {@inheritDoc} */
-        @Override public String toString() {
-            return S.toString(VisorFileBlockArg.class, this);
-        }
-    }
-
-    /**
      * Job that read file block on node.
      */
     private static class VisorFileBlockJob
-        extends VisorJob<VisorFileBlockArg, IgniteBiTuple<? extends IOException, VisorFileBlock>> {
+        extends VisorJob<VisorFileBlockArg, VisorEither<VisorFileBlock>> {
         /** */
         private static final long serialVersionUID = 0L;
 
@@ -102,22 +61,23 @@ public class VisorFileBlockTask extends VisorOneNodeTask<VisorFileBlockTask.Viso
         }
 
         /** {@inheritDoc} */
-        @Override protected IgniteBiTuple<? extends IOException, VisorFileBlock> run(VisorFileBlockArg arg) {
+        @Override protected VisorEither<VisorFileBlock> run(VisorFileBlockArg arg) {
             try {
-                URL url = U.resolveIgniteUrl(arg.path);
+                URL url = U.resolveIgniteUrl(arg.getPath());
 
                 if (url == null)
-                    return new IgniteBiTuple<>(new NoSuchFileException("File path not found: " + arg.path), null);
+                    return new VisorEither<>(new NoSuchFileException("File path not found: " + arg.getPath()));
 
-                VisorFileBlock block = readBlock(new File(url.toURI()), arg.off, arg.blockSz, arg.lastModified);
+                VisorFileBlock block = readBlock(
+                    new File(url.toURI()), arg.getOffset(), arg.getBlockSize(), arg.getLastModified());
 
-                return new IgniteBiTuple<>(null, block);
+                return new VisorEither<>(block);
             }
             catch (IOException e) {
-                return new IgniteBiTuple<>(e, null);
+                return new VisorEither<>(e);
             }
             catch (URISyntaxException ignored) {
-                return new IgniteBiTuple<>(new NoSuchFileException("File path not found: " + arg.path), null);
+                return new VisorEither<>(new NoSuchFileException("File path not found: " + arg.getPath()));
             }
         }
 
@@ -126,4 +86,4 @@ public class VisorFileBlockTask extends VisorOneNodeTask<VisorFileBlockTask.Viso
             return S.toString(VisorFileBlockJob.class, this);
         }
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/file/VisorLatestTextFilesTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/file/VisorLatestTextFilesTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/file/VisorLatestTextFilesTask.java
index 55d358c..9ae0b26 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/file/VisorLatestTextFilesTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/file/VisorLatestTextFilesTask.java
@@ -28,7 +28,6 @@ import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.internal.visor.VisorJob;
 import org.apache.ignite.internal.visor.VisorOneNodeTask;
 import org.apache.ignite.internal.visor.log.VisorLogFile;
-import org.apache.ignite.lang.IgniteBiTuple;
 import org.jetbrains.annotations.Nullable;
 
 import static org.apache.ignite.internal.visor.util.VisorTaskUtils.LOG_FILES_COUNT_LIMIT;
@@ -38,19 +37,19 @@ import static org.apache.ignite.internal.visor.util.VisorTaskUtils.matchedFiles;
  * Get list files matching filter.
  */
 @GridInternal
-public class VisorLatestTextFilesTask extends VisorOneNodeTask<IgniteBiTuple<String, String>, Collection<VisorLogFile>> {
+public class VisorLatestTextFilesTask extends VisorOneNodeTask<VisorLatestTextFilesTaskArg, Collection<VisorLogFile>> {
     /** */
     private static final long serialVersionUID = 0L;
 
     /** {@inheritDoc} */
-    @Override protected VisorLatestTextFilesJob job(IgniteBiTuple<String, String> arg) {
+    @Override protected VisorLatestTextFilesJob job(VisorLatestTextFilesTaskArg arg) {
         return new VisorLatestTextFilesJob(arg, debug);
     }
 
     /**
      * Job that gets list of files.
      */
-    private static class VisorLatestTextFilesJob extends VisorJob<IgniteBiTuple<String, String>, Collection<VisorLogFile>> {
+    private static class VisorLatestTextFilesJob extends VisorJob<VisorLatestTextFilesTaskArg, Collection<VisorLogFile>> {
         /** */
         private static final long serialVersionUID = 0L;
 
@@ -58,14 +57,14 @@ public class VisorLatestTextFilesTask extends VisorOneNodeTask<IgniteBiTuple<Str
          * @param arg Folder and regexp.
          * @param debug Debug flag.
          */
-        private VisorLatestTextFilesJob(IgniteBiTuple<String, String> arg, boolean debug) {
+        private VisorLatestTextFilesJob(VisorLatestTextFilesTaskArg arg, boolean debug) {
             super(arg, debug);
         }
 
         /** {@inheritDoc} */
-        @Nullable @Override protected Collection<VisorLogFile> run(final IgniteBiTuple<String, String> arg) {
-            String path = arg.get1();
-            String regexp = arg.get2();
+        @Nullable @Override protected Collection<VisorLogFile> run(final VisorLatestTextFilesTaskArg arg) {
+            String path = arg.getPath();
+            String regexp = arg.getRegexp();
 
             assert path != null;
             assert regexp != null;
@@ -98,4 +97,4 @@ public class VisorLatestTextFilesTask extends VisorOneNodeTask<IgniteBiTuple<Str
             return S.toString(VisorLatestTextFilesJob.class, this);
         }
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/file/VisorLatestTextFilesTaskArg.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/file/VisorLatestTextFilesTaskArg.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/file/VisorLatestTextFilesTaskArg.java
new file mode 100644
index 0000000..d0bc99d
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/file/VisorLatestTextFilesTaskArg.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.file;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Arguments for {@link VisorLatestTextFilesTask}
+ */
+public class VisorLatestTextFilesTaskArg extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Folder path to search files. */
+    private String path;
+
+    /** Pattern to match file names. */
+    private String regexp;
+
+    /**
+     * Default constructor.
+     */
+    public VisorLatestTextFilesTaskArg() {
+        // No-op.
+    }
+
+    /**
+     * @param path Folder path to search in files.
+     * @param regexp Pattern to match file names.
+     */
+    public VisorLatestTextFilesTaskArg(String path, String regexp) {
+        this.path = path;
+        this.regexp = regexp;
+    }
+
+    /**
+     * @return Folder path to search in files.
+     */
+    public String getPath() {
+        return path;
+    }
+
+    /**
+     * @return Pattern to match file names.
+     */
+    public String getRegexp() {
+        return regexp;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, path);
+        U.writeString(out, regexp);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        path = U.readString(in);
+        regexp = U.readString(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorLatestTextFilesTaskArg.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfs.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfs.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfs.java
index 7369663..683eb91 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfs.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfs.java
@@ -17,45 +17,50 @@
 
 package org.apache.ignite.internal.visor.igfs;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.apache.ignite.IgniteFileSystem;
 import org.apache.ignite.igfs.IgfsMode;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 /**
  * Data transfer object for {@link IgniteFileSystem}.
  */
-public class VisorIgfs implements Serializable, LessNamingBean {
+public class VisorIgfs extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
     /** IGFS instance name. */
-    private final String name;
+    private String name;
 
     /** IGFS instance working mode. */
-    private final IgfsMode mode;
+    private IgfsMode mode;
 
     /** IGFS metrics. */
-    private final VisorIgfsMetrics metrics;
+    private VisorIgfsMetrics metrics;
 
     /** Whether IGFS has configured secondary file system. */
-    private final boolean secondaryFsConfigured;
+    private boolean secondaryFsConfigured;
 
     /**
-     * Create data transfer object.
+     * Default constructor.
+     */
+    public VisorIgfs() {
+        // No-op.
+    }
+
+    /**
+     * Create IGFS configuration transfer object.
      *
-     * @param name IGFS name.
-     * @param mode IGFS mode.
+     * @param name IGFS instance name.
+     * @param mode IGFS instance working mode.
      * @param metrics IGFS metrics.
      * @param secondaryFsConfigured Whether IGFS has configured secondary file system.
      */
-    public VisorIgfs(
-        String name,
-        IgfsMode mode,
-        VisorIgfsMetrics metrics,
-        boolean secondaryFsConfigured
-    ) {
+    public VisorIgfs(String name, IgfsMode mode, VisorIgfsMetrics metrics, boolean secondaryFsConfigured) {
         this.name = name;
         this.mode = mode;
         this.metrics = metrics;
@@ -63,49 +68,64 @@ public class VisorIgfs implements Serializable, LessNamingBean {
     }
 
     /**
+     * Create data transfer object.
+     *
      * @param igfs Source IGFS.
-     * @return Data transfer object for given IGFS.
      */
-    public static VisorIgfs from(IgniteFileSystem igfs) {
+    public VisorIgfs(IgniteFileSystem igfs) {
         assert igfs != null;
 
-        return new VisorIgfs(
-            igfs.name(),
-            igfs.configuration().getDefaultMode(),
-            VisorIgfsMetrics.from(igfs),
-            igfs.configuration().getSecondaryFileSystem() != null
-        );
+        name = igfs.name();
+        mode = igfs.configuration().getDefaultMode();
+        metrics = new VisorIgfsMetrics(igfs);
+        secondaryFsConfigured = igfs.configuration().getSecondaryFileSystem() != null;
     }
 
     /**
      * @return IGFS instance name.
      */
-    public String name() {
+    public String getName() {
         return name;
     }
 
     /**
      * @return IGFS instance working mode.
      */
-    public IgfsMode mode() {
+    public IgfsMode getMode() {
         return mode;
     }
 
     /**
      * @return IGFS metrics.
      */
-    public VisorIgfsMetrics metrics() {
+    public VisorIgfsMetrics getMetrics() {
         return metrics;
     }
 
     /**
      * @return Whether IGFS has configured secondary file system.
      */
-    public boolean secondaryFileSystemConfigured() {
+    public boolean isSecondaryFileSystemConfigured() {
         return secondaryFsConfigured;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, name);
+        U.writeEnum(out, mode);
+        out.writeObject(metrics);
+        out.writeBoolean(secondaryFsConfigured);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        name = U.readString(in);
+        mode = IgfsMode.fromOrdinal(in.readByte());
+        metrics = (VisorIgfsMetrics)in.readObject();
+        secondaryFsConfigured = in.readBoolean();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorIgfs.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsEndpoint.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsEndpoint.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsEndpoint.java
index 8ddd883..784b970 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsEndpoint.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsEndpoint.java
@@ -17,43 +17,51 @@
 
 package org.apache.ignite.internal.visor.igfs;
 
-import java.io.Serializable;
-import org.apache.ignite.internal.LessNamingBean;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 import org.jetbrains.annotations.Nullable;
 
 /**
  * IGFS endpoint descriptor.
  */
-public class VisorIgfsEndpoint implements Serializable, LessNamingBean {
+public class VisorIgfsEndpoint extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
     /** IGFS name. */
-    private final String igfsName;
+    private String igfsName;
 
-    /** Ignite instance name. */
-    private final String igniteInstanceName;
+    /** Grid name. */
+    private String gridName;
 
     /** Host address / name. */
-    private final String hostName;
+    private String hostName;
 
     /** Port number. */
-    private final int port;
+    private int port;
+
+    /**
+     * Default constructor.
+     */
+    public VisorIgfsEndpoint() {
+        // No-op.
+    }
 
     /**
      * Create IGFS endpoint descriptor with given parameters.
      *
      * @param igfsName IGFS name.
-     * @param igniteInstanceName Ignite instance name.
+     * @param gridName Grid name.
      * @param hostName Host address / name.
      * @param port Port number.
      */
-    public VisorIgfsEndpoint(
-        @Nullable String igfsName, String igniteInstanceName, @Nullable String hostName, int port
-    ) {
+    public VisorIgfsEndpoint(@Nullable String igfsName, String gridName, @Nullable String hostName, int port) {
         this.igfsName = igfsName;
-        this.igniteInstanceName = igniteInstanceName;
+        this.gridName = gridName;
         this.hostName = hostName;
         this.port = port;
     }
@@ -61,45 +69,61 @@ public class VisorIgfsEndpoint implements Serializable, LessNamingBean {
     /**
      * @return IGFS name.
      */
-    @Nullable public String igfsName() {
+    @Nullable public String getIgfsName() {
         return igfsName;
     }
 
     /**
-     * @return Ignite instance name.
+     * @return Grid name.
      */
-    public String igniteInstanceName() {
-        return igniteInstanceName;
+    public String getGridName() {
+        return gridName;
     }
 
     /**
      * @return Host address / name.
      */
-    @Nullable public String hostName() {
+    @Nullable public String getHostName() {
         return hostName;
     }
 
     /**
      * @return Port number.
      */
-    public int port() {
+    public int getPort() {
         return port;
     }
 
     /**
      * @return URI Authority
      */
-    public String authority() {
+    public String getAuthority() {
         String addr = hostName + ":" + port;
 
-        if (igfsName == null && igniteInstanceName == null)
+        if (igfsName == null && gridName == null)
             return addr;
         else if (igfsName == null)
-            return igniteInstanceName + "@" + addr;
-        else if (igniteInstanceName == null)
+            return gridName + "@" + addr;
+        else if (gridName == null)
             return igfsName + "@" + addr;
         else
-            return igfsName + ":" + igniteInstanceName + "@" + addr;
+            return igfsName + ":" + gridName + "@" + addr;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, igfsName);
+        U.writeString(out, gridName);
+        U.writeString(out, hostName);
+        out.writeInt(port);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        igfsName = U.readString(in);
+        gridName = U.readString(in);
+        hostName = U.readString(in);
+        port = in.readInt();
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsMetrics.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsMetrics.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsMetrics.java
index 58acee1..6ce5d80 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsMetrics.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsMetrics.java
@@ -17,16 +17,18 @@
 
 package org.apache.ignite.internal.visor.igfs;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.apache.ignite.IgniteFileSystem;
 import org.apache.ignite.igfs.IgfsMetrics;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 /**
  * Data transfer object for {@link IgfsMetrics}.
  */
-public class VisorIgfsMetrics implements Serializable, LessNamingBean {
+public class VisorIgfsMetrics extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -73,32 +75,36 @@ public class VisorIgfsMetrics implements Serializable, LessNamingBean {
     private long bytesWrtTm;
 
     /**
+     * Create data transfer object for given IGFS metrics.
+     */
+    public VisorIgfsMetrics() {
+        // No-op.
+    }
+
+    /**
+     * Create data transfer object for given IGFS metrics.
+     *
      * @param igfs Source IGFS.
-     * @return Data transfer object for given IGFS metrics.
      */
-    public static VisorIgfsMetrics from(IgniteFileSystem igfs) {
+    public VisorIgfsMetrics(IgniteFileSystem igfs) {
         assert igfs != null;
 
         IgfsMetrics m = igfs.metrics();
 
-        VisorIgfsMetrics metrics = new VisorIgfsMetrics();
-
-        metrics.totalSpaceSz = igfs.configuration().getMaxSpaceSize();
-        metrics.usedSpaceSz = m.localSpaceSize();
-        metrics.foldersCnt = m.directoriesCount();
-        metrics.filesCnt = m.filesCount();
-        metrics.filesOpenedForRd = m.filesOpenedForRead();
-        metrics.filesOpenedForWrt = m.filesOpenedForWrite();
-        metrics.blocksRd = m.blocksReadTotal();
-        metrics.blocksRdRmt = m.blocksReadRemote();
-        metrics.blocksWrt = m.blocksWrittenTotal();
-        metrics.blocksWrtRmt = m.blocksWrittenRemote();
-        metrics.bytesRd = m.bytesRead();
-        metrics.bytesRdTm = m.bytesReadTime();
-        metrics.bytesWrt = m.bytesWritten();
-        metrics.bytesWrtTm = m.bytesWriteTime();
-
-        return metrics;
+        totalSpaceSz = igfs.configuration().getMaxSpaceSize();
+        usedSpaceSz = m.localSpaceSize();
+        foldersCnt = m.directoriesCount();
+        filesCnt = m.filesCount();
+        filesOpenedForRd = m.filesOpenedForRead();
+        filesOpenedForWrt = m.filesOpenedForWrite();
+        blocksRd = m.blocksReadTotal();
+        blocksRdRmt = m.blocksReadRemote();
+        blocksWrt = m.blocksWrittenTotal();
+        blocksWrtRmt = m.blocksWrittenRemote();
+        bytesRd = m.bytesRead();
+        bytesRdTm = m.bytesReadTime();
+        bytesWrt = m.bytesWritten();
+        bytesWrtTm = m.bytesWriteTime();
     }
 
     /**
@@ -146,109 +152,145 @@ public class VisorIgfsMetrics implements Serializable, LessNamingBean {
     /**
      * @return Maximum amount of data that can be stored on local node.
      */
-    public long totalSpaceSize() {
+    public long getTotalSpaceSize() {
         return totalSpaceSz;
     }
 
     /**
      * @return Local used space in bytes on local node.
      */
-    public long usedSpaceSize() {
+    public long getUsedSpaceSize() {
         return usedSpaceSz;
     }
 
     /**
      * @return Local free space in bytes on local node.
      */
-    public long freeSpaceSize() {
+    public long getFreeSpaceSize() {
         return totalSpaceSz - usedSpaceSz;
     }
 
     /**
      * @return Number of directories created in file system.
      */
-    public int foldersCount() {
+    public int getFoldersCount() {
         return foldersCnt;
     }
 
     /**
      * @return Number of files stored in file system.
      */
-    public int filesCount() {
+    public int getFilesCount() {
         return filesCnt;
     }
 
     /**
      * @return Number of files that are currently opened for reading on local node.
      */
-    public int filesOpenedForRead() {
+    public int getFilesOpenedForRead() {
         return filesOpenedForRd;
     }
 
     /**
      * @return Number of files that are currently opened for writing on local node.
      */
-    public int filesOpenedForWrite() {
+    public int getFilesOpenedForWrite() {
         return filesOpenedForWrt;
     }
 
     /**
      * @return Total blocks read, local and remote.
      */
-    public long blocksRead() {
+    public long getBlocksRead() {
         return blocksRd;
     }
 
     /**
      * @return Total remote blocks read.
      */
-    public long blocksReadRemote() {
+    public long getBlocksReadRemote() {
         return blocksRdRmt;
     }
 
     /**
      * @return Total blocks write, local and remote.
      */
-    public long blocksWritten() {
+    public long getBlocksWritten() {
         return blocksWrt;
     }
 
     /**
      * @return Total remote blocks write.
      */
-    public long blocksWrittenRemote() {
+    public long getBlocksWrittenRemote() {
         return blocksWrtRmt;
     }
 
     /**
      * @return Total bytes read.
      */
-    public long bytesRead() {
+    public long getBytesRead() {
         return bytesRd;
     }
 
     /**
      * @return Total bytes read time.
      */
-    public long bytesReadTime() {
+    public long getBytesReadTime() {
         return bytesRdTm;
     }
 
     /**
      * @return Total bytes write.
      */
-    public long bytesWritten() {
+    public long getBytesWritten() {
         return bytesWrt;
     }
 
     /**
      * @return Total bytes write time.
      */
-    public long bytesWriteTime() {
+    public long getBytesWriteTime() {
         return bytesWrtTm;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeLong(totalSpaceSz);
+        out.writeLong(usedSpaceSz);
+        out.writeInt(foldersCnt);
+        out.writeInt(filesCnt);
+        out.writeInt(filesOpenedForRd);
+        out.writeInt(filesOpenedForWrt);
+        out.writeLong(blocksRd);
+        out.writeLong(blocksRdRmt);
+        out.writeLong(blocksWrt);
+        out.writeLong(blocksWrtRmt);
+        out.writeLong(bytesRd);
+        out.writeLong(bytesRdTm);
+        out.writeLong(bytesWrt);
+        out.writeLong(bytesWrtTm);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        totalSpaceSz = in.readLong();
+        usedSpaceSz = in.readLong();
+        foldersCnt = in.readInt();
+        filesCnt = in.readInt();
+        filesOpenedForRd = in.readInt();
+        filesOpenedForWrt = in.readInt();
+        blocksRd = in.readLong();
+        blocksRdRmt = in.readLong();
+        blocksWrt = in.readLong();
+        blocksWrtRmt = in.readLong();
+        bytesRd = in.readLong();
+        bytesRdTm = in.readLong();
+        bytesWrt = in.readLong();
+        bytesWrtTm = in.readLong();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorIgfsMetrics.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfiler.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfiler.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfiler.java
index 06460d5..e6b40fa 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfiler.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfiler.java
@@ -44,7 +44,7 @@ public class VisorIgfsProfiler {
         if (entries.size() == 1)
             return entries.get(0); // No need to aggregate.
         else {
-            String path = entries.get(0).path();
+            String path = entries.get(0).getPath();
 
             Collections.sort(entries, VisorIgfsProfilerEntry.ENTRY_TIMESTAMP_COMPARATOR);
 
@@ -61,23 +61,23 @@ public class VisorIgfsProfiler {
 
             for (VisorIgfsProfilerEntry entry : entries) {
                 // Take last timestamp.
-                ts = entry.timestamp();
+                ts = entry.getTimestamp();
 
                 // Take last size.
-                size = entry.size();
+                size = entry.getSize();
 
                 // Take last mode.
-                mode = entry.mode();
+                mode = entry.getMode();
 
                 // Aggregate metrics.
-                bytesRead += entry.bytesRead();
-                readTime += entry.readTime();
-                userReadTime += entry.userReadTime();
-                bytesWritten += entry.bytesWritten();
-                writeTime += entry.writeTime();
-                userWriteTime += entry.userWriteTime();
+                bytesRead += entry.getBytesRead();
+                readTime += entry.getReadTime();
+                userReadTime += entry.getUserReadTime();
+                bytesWritten += entry.getBytesWritten();
+                writeTime += entry.getWriteTime();
+                userWriteTime += entry.getUserWriteTime();
 
-                counters.aggregate(entry.counters());
+                counters.aggregate(entry.getCounters());
             }
 
             return new VisorIgfsProfilerEntry(path, ts, mode, size, bytesRead, readTime, userReadTime,
@@ -85,4 +85,4 @@ public class VisorIgfsProfiler {
         }
     }
 
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerClearTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerClearTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerClearTask.java
index ba805c1..b8bfe9e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerClearTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerClearTask.java
@@ -32,7 +32,6 @@ import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.internal.visor.VisorJob;
 import org.apache.ignite.internal.visor.VisorOneNodeTask;
-import org.apache.ignite.lang.IgniteBiTuple;
 
 import static org.apache.ignite.internal.visor.util.VisorTaskUtils.resolveIgfsProfilerLogsDir;
 
@@ -40,14 +39,14 @@ import static org.apache.ignite.internal.visor.util.VisorTaskUtils.resolveIgfsPr
  * Remove all IGFS profiler logs.
  */
 @GridInternal
-public class VisorIgfsProfilerClearTask extends VisorOneNodeTask<String, IgniteBiTuple<Integer, Integer>> {
+public class VisorIgfsProfilerClearTask extends VisorOneNodeTask<String, VisorIgfsProfilerClearTaskResult> {
     /** */
     private static final long serialVersionUID = 0L;
 
     /**
      * Job to clear profiler logs.
      */
-    private static class VisorIgfsProfilerClearJob extends VisorJob<String, IgniteBiTuple<Integer, Integer>> {
+    private static class VisorIgfsProfilerClearJob extends VisorJob<String, VisorIgfsProfilerClearTaskResult> {
         /** */
         private static final long serialVersionUID = 0L;
 
@@ -62,7 +61,7 @@ public class VisorIgfsProfilerClearTask extends VisorOneNodeTask<String, IgniteB
         }
 
         /** {@inheritDoc} */
-        @Override protected IgniteBiTuple<Integer, Integer> run(String arg) {
+        @Override protected VisorIgfsProfilerClearTaskResult run(String arg) {
             int deleted = 0;
             int notDeleted = 0;
 
@@ -106,7 +105,7 @@ public class VisorIgfsProfilerClearTask extends VisorOneNodeTask<String, IgniteB
                 throw U.convertException(e);
             }
 
-            return new IgniteBiTuple<>(deleted, notDeleted);
+            return new VisorIgfsProfilerClearTaskResult(deleted, notDeleted);
         }
 
         /** {@inheritDoc} */
@@ -119,4 +118,4 @@ public class VisorIgfsProfilerClearTask extends VisorOneNodeTask<String, IgniteB
     @Override protected VisorIgfsProfilerClearJob job(String arg) {
         return new VisorIgfsProfilerClearJob(arg, debug);
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerClearTaskResult.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerClearTaskResult.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerClearTaskResult.java
new file mode 100644
index 0000000..4eafe53
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerClearTaskResult.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.igfs;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Result for {@link VisorIgfsProfilerClearTask}.
+ */
+public class VisorIgfsProfilerClearTaskResult extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Count of deleted files. */
+    private Integer deleted;
+
+    /** Count of not deleted files. */
+    private Integer notDeleted;
+
+    /**
+     * Default constructor.
+     */
+    public VisorIgfsProfilerClearTaskResult() {
+        // No-op.
+    }
+
+    /**
+     * @param deleted Count of deleted files.
+     * @param notDeleted Count of not deleted files.
+     */
+    public VisorIgfsProfilerClearTaskResult(Integer deleted, Integer notDeleted) {
+        this.deleted = deleted;
+        this.notDeleted = notDeleted;
+    }
+
+    /**
+     * @return Count of deleted files.
+     */
+    public Integer getDeleted() {
+        return deleted;
+    }
+
+    /**
+     * @return Count of not deleted files.
+     */
+    public Integer getNotDeleted() {
+        return notDeleted;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeInt(deleted);
+        out.writeInt(notDeleted);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        deleted = in.readInt();
+        notDeleted = in.readInt();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorIgfsProfilerClearTaskResult.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerEntry.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerEntry.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerEntry.java
index b157296..dd33806 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerEntry.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerEntry.java
@@ -17,16 +17,19 @@
 
 package org.apache.ignite.internal.visor.igfs;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.Comparator;
 import org.apache.ignite.igfs.IgfsMode;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 /**
  * Visor IGFS profiler information about one file.
  */
-public class VisorIgfsProfilerEntry implements Serializable, LessNamingBean {
+public class VisorIgfsProfilerEntry extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -39,46 +42,53 @@ public class VisorIgfsProfilerEntry implements Serializable, LessNamingBean {
         };
 
     /** Path to file. */
-    private final String path;
+    private String path;
 
     /** Timestamp of last file operation. */
-    private final long ts;
+    private long ts;
 
     /** IGFS mode. */
-    private final IgfsMode mode;
+    private IgfsMode mode;
 
     /** File size. */
-    private final long size;
+    private long size;
 
     /** How many bytes were read. */
-    private final long bytesRead;
+    private long bytesRead;
 
     /** How long read take. */
-    private final long readTime;
+    private long readTime;
 
     /** User read time. */
-    private final long userReadTime;
+    private long userReadTime;
 
     /** How many bytes were written. */
-    private final long bytesWritten;
+    private long bytesWritten;
 
     /** How long write take. */
-    private final long writeTime;
+    private long writeTime;
 
     /** User write read time. */
-    private final long userWriteTime;
+    private long userWriteTime;
 
     /** Calculated uniformity. */
     private double uniformity = -1;
 
     /** Counters for uniformity calculation. */
-    private final VisorIgfsProfilerUniformityCounters counters;
+    private VisorIgfsProfilerUniformityCounters counters;
 
     /** Read speed in bytes per second or {@code -1} if speed not available. */
-    private final long readSpeed;
+    private long readSpeed;
 
     /** Write speed in bytes per second or {@code -1} if speed not available. */
-    private final long writeSpeed;
+    private long writeSpeed;
+
+    /**
+     * Default constructor.
+     */
+    public VisorIgfsProfilerEntry() {
+        // No-op.
+    }
 
     /** Create data transfer object with given parameters. */
     public VisorIgfsProfilerEntry(
@@ -133,77 +143,77 @@ public class VisorIgfsProfilerEntry implements Serializable, LessNamingBean {
     /**
      * @return Path to file.
      */
-    public String path() {
+    public String getPath() {
         return path;
     }
 
     /**
      * @return Timestamp of last file operation.
      */
-    public long timestamp() {
+    public long getTimestamp() {
         return ts;
     }
 
     /**
      * @return IGFS mode.
      */
-    public IgfsMode mode() {
+    public IgfsMode getMode() {
         return mode;
     }
 
     /**
      * @return File size.
      */
-    public long size() {
+    public long getSize() {
         return size;
     }
 
     /**
      * @return How many bytes were read.
      */
-    public long bytesRead() {
+    public long getBytesRead() {
         return bytesRead;
     }
 
     /**
      * @return How long read take.
      */
-    public long readTime() {
+    public long getReadTime() {
         return readTime;
     }
 
     /**
      * @return User read time.
      */
-    public long userReadTime() {
+    public long getUserReadTime() {
         return userReadTime;
     }
 
     /**
      * @return How many bytes were written.
      */
-    public long bytesWritten() {
+    public long getBytesWritten() {
         return bytesWritten;
     }
 
     /**
      * @return How long write take.
      */
-    public long writeTime() {
+    public long getWriteTime() {
         return writeTime;
     }
 
     /**
      * @return User write read time.
      */
-    public long userWriteTime() {
+    public long getUserWriteTime() {
         return userWriteTime;
     }
 
     /**
      * @return Calculated uniformity.
      */
-    public double uniformity() {
+    public double getUniformity() {
         if (uniformity < 0)
             uniformity = counters.calc();
 
@@ -213,25 +223,61 @@ public class VisorIgfsProfilerEntry implements Serializable, LessNamingBean {
     /**
      * @return Counters for uniformity calculation.
      */
-    public VisorIgfsProfilerUniformityCounters counters() {
+    public VisorIgfsProfilerUniformityCounters getCounters() {
         return counters;
     }
 
     /**
      * @return Read speed in bytes per second or {@code -1} if speed not available.
      */
-    public long readSpeed() {
+    public long getReadSpeed() {
         return readSpeed;
     }
 
     /**
      * @return Write speed in bytes per second or {@code -1} if speed not available.
      */
-    public long writeSpeed() {
+    public long getWriteSpeed() {
         return writeSpeed;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, path);
+        out.writeLong(ts);
+        U.writeEnum(out, mode);
+        out.writeLong(size);
+        out.writeLong(bytesRead);
+        out.writeLong(readTime);
+        out.writeLong(userReadTime);
+        out.writeLong(bytesWritten);
+        out.writeLong(writeTime);
+        out.writeLong(userWriteTime);
+        out.writeDouble(uniformity);
+        out.writeObject(counters);
+        out.writeLong(readSpeed);
+        out.writeLong(writeSpeed);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        path = U.readString(in);
+        ts = in.readLong();
+        mode = IgfsMode.fromOrdinal(in.readByte());
+        size = in.readLong();
+        bytesRead = in.readLong();
+        readTime = in.readLong();
+        userReadTime = in.readLong();
+        bytesWritten = in.readLong();
+        writeTime = in.readLong();
+        userWriteTime = in.readLong();
+        uniformity = in.readDouble();
+        counters = (VisorIgfsProfilerUniformityCounters)in.readObject();
+        readSpeed = in.readLong();
+        writeSpeed = in.readLong();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorIgfsProfilerEntry.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerTask.java
index d57d7f9..be48a1d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerTask.java
@@ -27,7 +27,6 @@ import java.nio.file.NoSuchFileException;
 import java.nio.file.Path;
 import java.nio.file.PathMatcher;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
@@ -57,7 +56,7 @@ import static org.apache.ignite.internal.visor.util.VisorTaskUtils.resolveIgfsPr
  * Task that parse hadoop profiler logs.
  */
 @GridInternal
-public class VisorIgfsProfilerTask extends VisorOneNodeTask<String, Collection<VisorIgfsProfilerEntry>> {
+public class VisorIgfsProfilerTask extends VisorOneNodeTask<String, List<VisorIgfsProfilerEntry>> {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -143,7 +142,7 @@ public class VisorIgfsProfilerTask extends VisorOneNodeTask<String, Collection<V
     /**
      * Job that do actual profiler work.
      */
-    private static class VisorIgfsProfilerJob extends VisorJob<String, Collection<VisorIgfsProfilerEntry>> {
+    private static class VisorIgfsProfilerJob extends VisorJob<String, List<VisorIgfsProfilerEntry>> {
         /** */
         private static final long serialVersionUID = 0L;
 
@@ -197,14 +196,14 @@ public class VisorIgfsProfilerTask extends VisorOneNodeTask<String, Collection<V
         }
 
         /** {@inheritDoc} */
-        @Override protected Collection<VisorIgfsProfilerEntry> run(String arg) {
+        @Override protected List<VisorIgfsProfilerEntry> run(String arg) {
             try {
                 Path logsDir = resolveIgfsProfilerLogsDir(ignite.fileSystem(arg));
 
                 if (logsDir != null)
                     return parse(logsDir, arg);
-                else
-                    return Collections.emptyList();
+
+                return Collections.emptyList();
             }
             catch (IOException | IllegalArgumentException e) {
                 throw new IgniteException("Failed to parse profiler logs for IGFS: " + arg, e);
@@ -425,15 +424,15 @@ public class VisorIgfsProfilerTask extends VisorOneNodeTask<String, Collection<V
          * @return Collection of parsed and aggregated entries.
          * @throws IOException if failed to read log file.
          */
-        private Collection<VisorIgfsProfilerEntry> parseFile(Path p) throws IOException {
-            Collection<VisorIgfsProfilerParsedLine> parsedLines = new ArrayList<>(512);
+        private List<VisorIgfsProfilerEntry> parseFile(Path p) throws IOException {
+            List<VisorIgfsProfilerParsedLine> parsedLines = new ArrayList<>(512);
 
             try (BufferedReader br = Files.newBufferedReader(p, Charset.forName("UTF-8"))) {
                 String line = br.readLine(); // Skip first line with columns header.
 
                 if (line != null) {
                     // Check file header.
-                    if (line.equalsIgnoreCase(HDR))
+                    if (HDR.equalsIgnoreCase(line))
                         line = br.readLine();
 
                     while (line != null) {
@@ -468,7 +467,7 @@ public class VisorIgfsProfilerTask extends VisorOneNodeTask<String, Collection<V
             }
 
             // Aggregate each group.
-            Collection<VisorIgfsProfilerEntry> entries = new ArrayList<>(byStreamId.size());
+            List<VisorIgfsProfilerEntry> entries = new ArrayList<>(byStreamId.size());
 
             for (List<VisorIgfsProfilerParsedLine> lines : byStreamId.values()) {
                 VisorIgfsProfilerEntry entry = aggregateParsedLines(lines);
@@ -481,19 +480,19 @@ public class VisorIgfsProfilerTask extends VisorOneNodeTask<String, Collection<V
             Map<String, List<VisorIgfsProfilerEntry>> byPath = new HashMap<>();
 
             for (VisorIgfsProfilerEntry entry : entries) {
-                List<VisorIgfsProfilerEntry> grp = byPath.get(entry.path());
+                List<VisorIgfsProfilerEntry> grp = byPath.get(entry.getPath());
 
                 if (grp == null) {
                     grp = new ArrayList<>();
 
-                    byPath.put(entry.path(), grp);
+                    byPath.put(entry.getPath(), grp);
                 }
 
                 grp.add(entry);
             }
 
             // Aggregate by files.
-            Collection<VisorIgfsProfilerEntry> res = new ArrayList<>(byPath.size());
+            List<VisorIgfsProfilerEntry> res = new ArrayList<>(byPath.size());
 
             for (List<VisorIgfsProfilerEntry> lst : byPath.values())
                 res.add(VisorIgfsProfiler.aggregateIgfsProfilerEntries(lst));
@@ -507,8 +506,8 @@ public class VisorIgfsProfilerTask extends VisorOneNodeTask<String, Collection<V
          * @param logDir Folder were log files located.
          * @return List of line with aggregated information by files.
          */
-        private Collection<VisorIgfsProfilerEntry> parse(Path logDir, String igfsName) throws IOException {
-            Collection<VisorIgfsProfilerEntry> parsedFiles = new ArrayList<>(512);
+        private List<VisorIgfsProfilerEntry> parse(Path logDir, String igfsName) throws IOException {
+            List<VisorIgfsProfilerEntry> parsedFiles = new ArrayList<>(512);
 
             try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(logDir)) {
                 PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:igfs-log-" + igfsName + "-*.csv");
@@ -541,4 +540,4 @@ public class VisorIgfsProfilerTask extends VisorOneNodeTask<String, Collection<V
     @Override protected VisorIgfsProfilerJob job(String arg) {
         return new VisorIgfsProfilerJob(arg, debug);
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerUniformityCounters.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerUniformityCounters.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerUniformityCounters.java
index 9184ce3..d1df3d0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerUniformityCounters.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsProfilerUniformityCounters.java
@@ -17,10 +17,14 @@
 
 package org.apache.ignite.internal.visor.igfs;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.ArrayList;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 import static org.apache.ignite.internal.visor.igfs.VisorIgfsProfiler.UNIFORMITY_BLOCKS;
 import static org.apache.ignite.internal.visor.igfs.VisorIgfsProfiler.UNIFORMITY_DFLT_BLOCK_SIZE;
@@ -32,7 +36,7 @@ import static org.apache.ignite.internal.visor.igfs.VisorIgfsProfiler.UNIFORMITY
  * </p>
  * Count read frequency for each file and compare with ideal uniform distribution.
  */
-public class VisorIgfsProfilerUniformityCounters implements Serializable, LessNamingBean {
+public class VisorIgfsProfilerUniformityCounters extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -43,7 +47,14 @@ public class VisorIgfsProfilerUniformityCounters implements Serializable, LessNa
     private long blockSize = UNIFORMITY_DFLT_BLOCK_SIZE;
 
     /** Collection of calculated counters. */
-    private final ArrayList<Integer> counters = new ArrayList<>();
+    private ArrayList<Integer> counters = new ArrayList<>();
+
+    /**
+     * Default constructor.
+     */
+    public VisorIgfsProfilerUniformityCounters() {
+        // No-op.
+    }
 
     /**
      * Calculate block size.
@@ -199,4 +210,23 @@ public class VisorIgfsProfilerUniformityCounters implements Serializable, LessNa
             return 1.0 - sigma;
         }
     }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeLong(fileSize);
+        out.writeLong(blockSize);
+        U.writeCollection(out, counters);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        fileSize = in.readLong();
+        blockSize = in.readLong();
+        counters = (ArrayList<Integer>)U.readIntList(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorIgfsProfilerUniformityCounters.class, this);
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsSamplingStateTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsSamplingStateTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsSamplingStateTask.java
index 62d93d4..7367492 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsSamplingStateTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsSamplingStateTask.java
@@ -25,20 +25,19 @@ import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.internal.visor.VisorJob;
 import org.apache.ignite.internal.visor.VisorOneNodeTask;
-import org.apache.ignite.lang.IgniteBiTuple;
 
 /**
  * Task to set IGFS instance sampling state.
  */
 @GridInternal
-public class VisorIgfsSamplingStateTask extends VisorOneNodeTask<IgniteBiTuple<String, Boolean>, Void> {
+public class VisorIgfsSamplingStateTask extends VisorOneNodeTask<VisorIgfsSamplingStateTaskArg, Void> {
     /** */
     private static final long serialVersionUID = 0L;
 
     /**
      * Job that perform parsing of IGFS profiler logs.
      */
-    private static class VisorIgfsSamplingStateJob extends VisorJob<IgniteBiTuple<String, Boolean>, Void> {
+    private static class VisorIgfsSamplingStateJob extends VisorJob<VisorIgfsSamplingStateTaskArg, Void> {
         /** */
         private static final long serialVersionUID = 0L;
 
@@ -48,19 +47,19 @@ public class VisorIgfsSamplingStateTask extends VisorOneNodeTask<IgniteBiTuple<S
          * @param arg Job argument.
          * @param debug Debug flag.
          */
-        private VisorIgfsSamplingStateJob(IgniteBiTuple<String, Boolean> arg, boolean debug) {
+        private VisorIgfsSamplingStateJob(VisorIgfsSamplingStateTaskArg arg, boolean debug) {
             super(arg, debug);
         }
 
         /** {@inheritDoc} */
-        @Override protected Void run(IgniteBiTuple<String, Boolean> arg) {
+        @Override protected Void run(VisorIgfsSamplingStateTaskArg arg) {
             try {
-                ((IgfsEx)ignite.fileSystem(arg.get1())).globalSampling(arg.get2());
+                ((IgfsEx)ignite.fileSystem(arg.getName())).globalSampling(arg.isEnabled());
 
                 return null;
             }
             catch (IllegalArgumentException iae) {
-                throw new IgniteException("Failed to set sampling state for IGFS: " + arg.get1(), iae);
+                throw new IgniteException("Failed to set sampling state for IGFS: " + arg.getName(), iae);
             }
             catch (IgniteCheckedException e) {
                 throw U.convertException(e);
@@ -74,7 +73,7 @@ public class VisorIgfsSamplingStateTask extends VisorOneNodeTask<IgniteBiTuple<S
     }
 
     /** {@inheritDoc} */
-    @Override protected VisorIgfsSamplingStateJob job(IgniteBiTuple<String, Boolean> arg) {
+    @Override protected VisorIgfsSamplingStateJob job(VisorIgfsSamplingStateTaskArg arg) {
         return new VisorIgfsSamplingStateJob(arg, debug);
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsSamplingStateTaskArg.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsSamplingStateTaskArg.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsSamplingStateTaskArg.java
new file mode 100644
index 0000000..219d943
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/igfs/VisorIgfsSamplingStateTaskArg.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.igfs;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Argument for task returns changing of sampling state result.
+ */
+public class VisorIgfsSamplingStateTaskArg extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** IGFS name. */
+    private String name;
+
+    /** {@code True} to turn on sampling, {@code false} to turn it off, {@code null} to clear sampling state. */
+    private boolean enabled;
+
+    /**
+     * Default constructor.
+     */
+    public VisorIgfsSamplingStateTaskArg() {
+        // No-op.
+    }
+
+    /**
+     * @param name IGFS name.
+     * @param enabled {@code True} to turn on sampling, {@code false} to turn it off, {@code null} to clear sampling state.
+     */
+    public VisorIgfsSamplingStateTaskArg(String name, boolean enabled) {
+        this.name = name;
+        this.enabled = enabled;
+    }
+
+    /**
+     * @return IGFS name.
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * @return {@code True} to turn on sampling, {@code false} to turn it off, {@code null} to clear sampling state.
+     */
+    public boolean isEnabled() {
+        return enabled;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, name);
+        out.writeBoolean(enabled);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        name = U.readString(in);
+        enabled = in.readBoolean();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorIgfsSamplingStateTaskArg.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/log/VisorLogFile.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/log/VisorLogFile.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/log/VisorLogFile.java
index 211a171..2c2ac21 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/log/VisorLogFile.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/log/VisorLogFile.java
@@ -18,24 +18,35 @@
 package org.apache.ignite.internal.visor.log;
 
 import java.io.File;
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 /**
  * Visor log file.
  */
-public class VisorLogFile implements Serializable {
+public class VisorLogFile extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
     /** File path. */
-    private final String path;
+    private String path;
 
     /** File size. */
-    private final long size;
+    private long size;
 
     /** File last modified timestamp. */
-    private final long lastModified;
+    private long lastModified;
+
+    /**
+     * Default constructor.
+     */
+    public VisorLogFile() {
+        // No-op.
+    }
 
     /**
      * Create log file for given file.
@@ -62,26 +73,40 @@ public class VisorLogFile implements Serializable {
     /**
      * @return File path.
      */
-    public String path() {
+    public String getPath() {
         return path;
     }
 
     /**
      * @return File size.
      */
-    public long size() {
+    public long getSize() {
         return size;
     }
 
     /**
      * @return File last modified timestamp.
      */
-    public long lastModified() {
+    public long getLastModified() {
         return lastModified;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, path);
+        out.writeLong(size);
+        out.writeLong(lastModified);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        path = U.readString(in);
+        size = in.readLong();
+        lastModified = in.readLong();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorLogFile.class, this);
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/log/VisorLogSearchArg.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/log/VisorLogSearchArg.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/log/VisorLogSearchArg.java
new file mode 100644
index 0000000..2a6b79b
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/log/VisorLogSearchArg.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.log;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Arguments for {@link VisorLogSearchTask}.
+ */
+public class VisorLogSearchArg extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Searched string. */
+    private String searchStr;
+
+    /** Folder. */
+    private String folder;
+
+    /** File name search pattern. */
+    private String filePtrn;
+
+    /** Max number of results. */
+    private int limit;
+
+    /**
+     * Default constructor.
+     */
+    public VisorLogSearchArg() {
+        // No-op.
+    }
+
+    /**
+     * @param searchStr Searched string.
+     * @param folder Folder.
+     * @param filePtrn File name search pattern.
+     * @param limit Max number of results.
+     */
+    public VisorLogSearchArg(String searchStr, String folder, String filePtrn, int limit) {
+        this.searchStr = searchStr;
+        this.folder = folder;
+        this.filePtrn = filePtrn;
+        this.limit = limit;
+    }
+
+    /**
+     * @return Searched string.
+     */
+    public String getSearchString() {
+        return searchStr;
+    }
+
+    /**
+     * @return Folder.
+     */
+    public String getFolder() {
+        return folder;
+    }
+
+    /**
+     * @return File name search pattern.
+     */
+    public String getFilePattern() {
+        return filePtrn;
+    }
+
+    /**
+     * @return Max number of results.
+     */
+    public int getLimit() {
+        return limit;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, searchStr);
+        U.writeString(out, folder);
+        U.writeString(out, filePtrn);
+        out.writeInt(limit);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        searchStr = U.readString(in);
+        folder = U.readString(in);
+        filePtrn = U.readString(in);
+        limit = in.readInt();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorLogSearchArg.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/log/VisorLogSearchResult.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/log/VisorLogSearchResult.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/log/VisorLogSearchResult.java
index 35ace13..4eee458 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/log/VisorLogSearchResult.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/log/VisorLogSearchResult.java
@@ -17,42 +17,54 @@
 
 package org.apache.ignite.internal.visor.log;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Arrays;
+import java.util.List;
 import java.util.UUID;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 /**
  * Result for log search operation.
  * Contains found line and several lines before and after, plus other info.
  */
-public class VisorLogSearchResult implements Serializable, LessNamingBean {
+public class VisorLogSearchResult extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
     /** Node ID. */
-    private final UUID nid;
+    private UUID nid;
 
     /** File path relative to the search folder. */
-    private final String filePath;
+    private String filePath;
 
     /** File size. */
-    private final long fileSize;
+    private long fileSize;
 
     /** Timestamp of last modification of the file. */
-    private final long lastModified;
+    private long lastModified;
 
     /** Lines of text including found line and several lines before and after. */
-    private final String[] lines;
+    private List<String> lines;
 
     /** Line number in the file, 1 based. */
-    private final int lineNum;
+    private int lineNum;
 
     /** Lines count in the file. */
-    private final int lineCnt;
+    private int lineCnt;
 
     /** File content encoding. */
-    private final String encoding;
+    private String encoding;
+
+    /**
+     * Default constructor.
+     */
+    public VisorLogSearchResult() {
+        // No-op.
+    }
 
     /**
      * Create log search result with given parameters.
@@ -80,7 +92,7 @@ public class VisorLogSearchResult implements Serializable, LessNamingBean {
         this.filePath = filePath;
         this.fileSize = fileSize;
         this.lastModified = lastModified;
-        this.lines = lines;
+        this.lines = Arrays.asList(lines);
         this.lineNum = lineNum;
         this.lineCnt = lineCnt;
         this.encoding = encoding;
@@ -89,64 +101,88 @@ public class VisorLogSearchResult implements Serializable, LessNamingBean {
     /**
      * @return Node ID.
      */
-    public UUID nid() {
+    public UUID getNid() {
         return nid;
     }
 
     /**
      * @return File path relative to the search folder.
      */
-    public String filePath() {
+    public String getFilePath() {
         return filePath;
     }
 
     /**
      * @return File size.
      */
-    public long fileSize() {
+    public long getFileSize() {
         return fileSize;
     }
 
     /**
      * @return Timestamp of last modification of the file.
      */
-    public long lastModified() {
+    public long getLastModified() {
         return lastModified;
     }
 
     /**
      * @return Lines of text including found line and several lines before and after.
      */
-    public String[] lines() {
+    public List<String> getLines() {
         return lines;
     }
 
     /**
      * @return Line number in the file, 1 based.
      */
-    public int lineNumber() {
+    public int getLineNumber() {
         return lineNum;
     }
 
     /**
      * @return Lines count in the file.
      */
-    public int lineCount() {
+    public int getLineCount() {
         return lineCnt;
     }
 
     /**
      * @return File content encoding.
      */
-    public String encoding() {
+    public String getEncoding() {
         return encoding;
     }
 
     /**
      * @return Found line.
      */
-    public String line() {
-        return lines[lines.length / 2];
+    public String getLine() {
+        return lines.get(lines.size() / 2);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeUuid(out, nid);
+        U.writeString(out, filePath);
+        out.writeLong(fileSize);
+        out.writeLong(lastModified);
+        U.writeCollection(out, lines);
+        out.writeInt(lineNum);
+        out.writeInt(lineCnt);
+        U.writeString(out, encoding);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        nid = U.readUuid(in);
+        filePath = U.readString(in);
+        fileSize = in.readLong();
+        lastModified = in.readLong();
+        lines = U.readList(in);
+        lineNum = in.readInt();
+        lineCnt = in.readInt();
+        encoding = U.readString(in);
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/log/VisorLogSearchTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/log/VisorLogSearchTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/log/VisorLogSearchTask.java
index b6552b2..924c285 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/log/VisorLogSearchTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/log/VisorLogSearchTask.java
@@ -20,7 +20,6 @@ package org.apache.ignite.internal.visor.log;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
-import java.io.Serializable;
 import java.net.URL;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
@@ -28,6 +27,7 @@ import java.util.Collection;
 import java.util.Deque;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.compute.ComputeJobResult;
@@ -38,7 +38,6 @@ import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.internal.visor.VisorJob;
 import org.apache.ignite.internal.visor.VisorMultiNodeTask;
-import org.apache.ignite.lang.IgniteBiTuple;
 import org.jetbrains.annotations.Nullable;
 
 import static org.apache.ignite.internal.visor.util.VisorTaskUtils.decode;
@@ -49,8 +48,8 @@ import static org.apache.ignite.internal.visor.util.VisorTaskUtils.textFile;
  * Search text matching in logs
  */
 @GridInternal
-public class VisorLogSearchTask extends VisorMultiNodeTask<VisorLogSearchTask.VisorLogSearchArg,
-    IgniteBiTuple<Iterable<IgniteBiTuple<Exception, UUID>>, Iterable<VisorLogSearchResult>>,
+public class VisorLogSearchTask extends VisorMultiNodeTask<VisorLogSearchArg,
+    VisorLogSearchTaskResult,
     Collection<VisorLogSearchResult>> {
     /** */
     private static final long serialVersionUID = 0L;
@@ -67,15 +66,14 @@ public class VisorLogSearchTask extends VisorMultiNodeTask<VisorLogSearchTask.Vi
     }
 
     /** {@inheritDoc} */
-    @Nullable @Override protected IgniteBiTuple<Iterable<IgniteBiTuple<Exception, UUID>>,
-        Iterable<VisorLogSearchResult>> reduce0(List<ComputeJobResult> results) {
-        Collection<VisorLogSearchResult> searchRes = new ArrayList<>();
-        Collection<IgniteBiTuple<Exception, UUID>> exRes = new ArrayList<>();
+    @Nullable @Override protected VisorLogSearchTaskResult reduce0(List<ComputeJobResult> results) {
+        List<VisorLogSearchResult> searchRes = new ArrayList<>();
+        Map<Exception, UUID> exRes = U.newHashMap(0);
 
         // Separate successfully executed results and exceptions.
         for (ComputeJobResult result : results) {
             if (result.getException() != null)
-                exRes.add(new IgniteBiTuple<Exception, UUID>(result.getException(), result.getNode().id()));
+                exRes.put(result.getException(), result.getNode().id());
             else if (result.getData() != null) {
                 Collection<VisorLogSearchResult> data = result.getData();
 
@@ -83,47 +81,7 @@ public class VisorLogSearchTask extends VisorMultiNodeTask<VisorLogSearchTask.Vi
             }
         }
 
-        return new IgniteBiTuple<Iterable<IgniteBiTuple<Exception, UUID>>, Iterable<VisorLogSearchResult>>
-            (exRes.isEmpty() ? null : exRes, searchRes.isEmpty() ? null : searchRes);
-    }
-
-    /**
-     * Arguments for {@link VisorLogSearchTask}.
-     */
-    @SuppressWarnings("PublicInnerClass")
-    public static class VisorLogSearchArg implements Serializable {
-        /** */
-        private static final long serialVersionUID = 0L;
-
-        /** Searched string. */
-        private final String searchStr;
-
-        /** Folder. */
-        private final String folder;
-
-        /** File name search pattern. */
-        private final String filePtrn;
-
-        /** Max number of results. */
-        private final int limit;
-
-        /**
-         * @param searchStr Searched string.
-         * @param folder Folder.
-         * @param filePtrn File name search pattern.
-         * @param limit Max number of results.
-         */
-        public VisorLogSearchArg(String searchStr, String folder, String filePtrn, int limit) {
-            this.searchStr = searchStr;
-            this.folder = folder;
-            this.filePtrn = filePtrn;
-            this.limit = limit;
-        }
-
-        /** {@inheritDoc} */
-        @Override public String toString() {
-            return S.toString(VisorLogSearchArg.class, this);
-        }
+        return new VisorLogSearchTaskResult(exRes.isEmpty() ? null : exRes, searchRes.isEmpty() ? null : searchRes);
     }
 
     /**
@@ -216,15 +174,15 @@ public class VisorLogSearchTask extends VisorMultiNodeTask<VisorLogSearchTask.Vi
 
         /** {@inheritDoc} */
         @Override protected Collection<VisorLogSearchResult> run(VisorLogSearchArg arg) {
-            URL url = U.resolveIgniteUrl(arg.folder);
+            URL url = U.resolveIgniteUrl(arg.getFolder());
 
             if (url == null)
-                throw new IgniteException(new FileNotFoundException("Log folder not found: " + arg.folder));
+                throw new IgniteException(new FileNotFoundException("Log folder not found: " + arg.getFolder()));
 
             UUID uuid = ignite.localNode().id();
             String nid = uuid.toString().toLowerCase();
 
-            String filePtrn = arg.filePtrn.replace("@nid8", nid.substring(0, 8)).replace("@nid", nid);
+            String filePtrn = arg.getFilePattern().replace("@nid8", nid.substring(0, 8)).replace("@nid", nid);
 
             try {
                 File fld = new File(url.toURI());
@@ -232,22 +190,22 @@ public class VisorLogSearchTask extends VisorMultiNodeTask<VisorLogSearchTask.Vi
 
                 List<VisorLogFile> matchingFiles = matchedFiles(fld, filePtrn);
 
-                Collection<VisorLogSearchResult> results = new ArrayList<>(arg.limit);
+                Collection<VisorLogSearchResult> results = new ArrayList<>(arg.getLimit());
 
                 int resCnt = 0;
 
                 for (VisorLogFile logFile : matchingFiles) {
                     try {
-                        File f = new File(logFile.path());
+                        File f = new File(logFile.getPath());
 
                         if (textFile(f, false)) {
                             Charset charset = decode(f);
 
-                            if (resCnt == arg.limit)
+                            if (resCnt == arg.getLimit())
                                 break;
 
                             List<GridTuple3<String[], Integer, Integer>> searched =
-                                searchInFile(f, charset, arg.searchStr, arg.limit - resCnt);
+                                searchInFile(f, charset, arg.getSearchString(), arg.getLimit() - resCnt);
 
                             resCnt += searched.size();
 
@@ -276,4 +234,4 @@ public class VisorLogSearchTask extends VisorMultiNodeTask<VisorLogSearchTask.Vi
             return S.toString(VisorLogSearchJob.class, this);
         }
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/log/VisorLogSearchTaskResult.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/log/VisorLogSearchTaskResult.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/log/VisorLogSearchTaskResult.java
new file mode 100644
index 0000000..3104c3a
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/log/VisorLogSearchTaskResult.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.log;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Result for log search operation.
+ * Contains found line and several lines before and after, plus other info.
+ */
+public class VisorLogSearchTaskResult extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** List of exceptions by node ID. */
+    private Map<Exception, UUID> exceptions;
+
+    /** List of log search results. */
+    private List<VisorLogSearchResult> results;
+
+    /**
+     * Default constructor.
+     */
+    public VisorLogSearchTaskResult() {
+        // No-op.
+    }
+
+    /**
+     * Create log search result with given parameters.
+     *
+     * @param exceptions List of exceptions by node ID.
+     * @param results List of log search results.
+     */
+    public VisorLogSearchTaskResult(Map<Exception, UUID> exceptions, List<VisorLogSearchResult> results) {
+        this.exceptions = exceptions;
+        this.results = results;
+    }
+
+    /**
+     * @return List of exceptions by node ID.
+     */
+    public Map<Exception, UUID> getExceptions() {
+        return exceptions;
+    }
+
+    /**
+     * @return List of log search results.
+     */
+    public List<VisorLogSearchResult> getResults() {
+        return results;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeMap(out, exceptions);
+        U.writeCollection(out, results);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        exceptions = U.readMap(in);
+        results = U.readList(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorLogSearchTaskResult.class, this);
+    }
+}


[09/11] ignite git commit: IGNITE-4988 Cleanup and refactor VisorXxx tasks and DTO for ignite-2.0

Posted by ak...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetrics.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetrics.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetrics.java
index 79f54d6..11b1fde 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetrics.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetrics.java
@@ -17,25 +17,29 @@
 
 package org.apache.ignite.internal.visor.cache;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.cache.CacheMetrics;
 import org.apache.ignite.cache.CacheMode;
 import org.apache.ignite.internal.IgniteEx;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
 import org.apache.ignite.internal.processors.cache.GridCacheProcessor;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+import org.apache.ignite.internal.visor.query.VisorQueryMetrics;
 
 /**
  * Data transfer object for {@link CacheMetrics}.
  */
-public class VisorCacheMetrics implements Serializable, LessNamingBean {
+public class VisorCacheMetrics extends VisorDataTransferObject {
     /** */
-    private static final float MICROSECONDS_IN_SECOND = 1_000_000;
+    private static final long serialVersionUID = 0L;
 
     /** */
-    private static final long serialVersionUID = 0L;
+    private static final float MICROSECONDS_IN_SECOND = 1_000_000;
 
     /** Cache name. */
     private String name;
@@ -110,7 +114,7 @@ public class VisorCacheMetrics implements Serializable, LessNamingBean {
     private int rollbacksPerSec;
 
     /** Gets query metrics for cache. */
-    private VisorCacheQueryMetrics qryMetrics;
+    private VisorQueryMetrics qryMetrics;
 
     /** Current size of evict queue used to batch up evictions. */
     private int dhtEvictQueueCurrSize;
@@ -174,11 +178,19 @@ public class VisorCacheMetrics implements Serializable, LessNamingBean {
     }
 
     /**
+     * Default constructor.
+     */
+    public VisorCacheMetrics() {
+        // No-op.
+    }
+
+    /**
+     * Create data transfer object for given cache metrics.
+     *
      * @param ignite Ignite.
      * @param cacheName Cache name.
-     * @return Data transfer object for given cache metrics.
      */
-    public VisorCacheMetrics from(IgniteEx ignite, String cacheName) {
+    public VisorCacheMetrics(IgniteEx ignite, String cacheName) {
         GridCacheProcessor cacheProcessor = ignite.context().cache();
 
         IgniteCache<Object, Object> c = cacheProcessor.jcache(cacheName);
@@ -217,7 +229,7 @@ public class VisorCacheMetrics implements Serializable, LessNamingBean {
         commitsPerSec = perSecond(m.getAverageTxCommitTime());
         rollbacksPerSec = perSecond(m.getAverageTxRollbackTime());
 
-        qryMetrics = VisorCacheQueryMetrics.from(c.queryMetrics());
+        qryMetrics = new VisorQueryMetrics(c.queryMetrics());
 
         dhtEvictQueueCurrSize = m.getDhtEvictQueueCurrentSize();
         txThreadMapSize = m.getTxThreadMapSize();
@@ -239,14 +251,12 @@ public class VisorCacheMetrics implements Serializable, LessNamingBean {
 
         offHeapAllocatedSize = ca.offHeapAllocatedSize();
         offHeapEntriesCnt = ca.offHeapEntriesCount();
-
-        return this;
     }
 
     /**
      * @return Cache name.
      */
-    public String name() {
+    public String getName() {
         return name;
     }
 
@@ -255,287 +265,287 @@ public class VisorCacheMetrics implements Serializable, LessNamingBean {
      *
      * @param name New value for cache name.
      */
-    public void name(String name) {
+    public void setName(String name) {
         this.name = name;
     }
 
     /**
      * @return Cache mode.
      */
-    public CacheMode mode() {
+    public CacheMode getMode() {
         return mode;
     }
 
     /**
      * @return Cache system state.
      */
-    public boolean system() {
+    public boolean isSystem() {
         return sys;
     }
 
     /**
      * @return Total number of reads of the owning entity (either cache or entry).
      */
-    public long reads() {
+    public long getReads() {
         return reads;
     }
 
     /**
      * @return The mean time to execute gets
      */
-    public float avgReadTime() {
+    public float getAvgReadTime() {
         return avgReadTime;
     }
 
     /**
      * @return Total number of writes of the owning entity (either cache or entry).
      */
-    public long writes() {
+    public long getWrites() {
         return writes;
     }
 
     /**
      * @return Total number of hits for the owning entity (either cache or entry).
      */
-    public long hits() {
+    public long getHits() {
         return hits;
     }
 
     /**
      * @return Total number of misses for the owning entity (either cache or entry).
      */
-    public long misses() {
+    public long getMisses() {
         return misses;
     }
 
     /**
      * @return Total number of transaction commits.
      */
-    public long txCommits() {
+    public long getTxCommits() {
         return txCommits;
     }
 
     /**
      * @return avgTxCommitTime
      */
-    public float avgTxCommitTime() {
+    public float getAvgTxCommitTime() {
         return avgTxCommitTime;
     }
 
     /**
      * @return The mean time to execute tx rollbacks.
      */
-    public float avgTxRollbackTime() {
+    public float getAvgTxRollbackTime() {
         return avgTxRollbackTime;
     }
 
     /**
      * @return The total number of puts to the cache.
      */
-    public long puts() {
+    public long getPuts() {
         return puts;
     }
 
     /**
      * @return The mean time to execute puts.
      */
-    public float avgPutTime() {
+    public float getAvgPutTime() {
         return avgPutTime;
     }
 
     /**
      * @return The total number of removals from the cache.
      */
-    public long removals() {
+    public long getRemovals() {
         return removals;
     }
 
     /**
      * @return The mean time to execute removes.
      */
-    public float avgRemovalTime() {
+    public float getAvgRemovalTime() {
         return avgRemovalTime;
     }
 
     /**
      * @return The total number of evictions from the cache.
      */
-    public long evictions() {
+    public long getEvictions() {
         return evictions;
     }
 
     /**
      * @return Total number of transaction rollbacks.
      */
-    public long txRollbacks() {
+    public long getTxRollbacks() {
         return txRollbacks;
     }
 
     /**
      * @return Reads per second.
      */
-    public int readsPerSecond() {
+    public int getReadsPerSecond() {
         return readsPerSec;
     }
 
     /**
      * @return Puts per second.
      */
-    public int putsPerSecond() {
+    public int getPutsPerSecond() {
         return putsPerSec;
     }
 
     /**
      * @return Removes per second.
      */
-    public int removalsPerSecond() {
+    public int getRemovalsPerSecond() {
         return removalsPerSec;
     }
 
     /**
      * @return Commits per second.
      */
-    public int commitsPerSecond() {
+    public int getCommitsPerSecond() {
         return commitsPerSec;
     }
 
     /**
      * @return Rollbacks per second.
      */
-    public int rollbacksPerSecond() {
+    public int getRollbacksPerSecond() {
         return rollbacksPerSec;
     }
 
     /**
      * @return Number of non-{@code null} values in the cache.
      */
-    public int size() {
+    public int getSize() {
         return size;
     }
 
     /**
      * @return Gets number of keys in the cache, possibly with {@code null} values.
      */
-    public int keySize() {
+    public int getKeySize() {
         return keySize;
     }
 
     /**
      * @return Gets query metrics for cache.
      */
-    public VisorCacheQueryMetrics queryMetrics() {
+    public VisorQueryMetrics getQueryMetrics() {
         return qryMetrics;
     }
 
     /**
      * @return Current size of evict queue used to batch up evictions.
      */
-    public int dhtEvictQueueCurrentSize() {
+    public int getDhtEvictQueueCurrentSize() {
         return dhtEvictQueueCurrSize;
     }
 
     /**
      * @return Gets transaction per-thread map size.
      */
-    public int txThreadMapSize() {
+    public int getTxThreadMapSize() {
         return txThreadMapSize;
     }
 
     /**
      * @return Transaction per-Xid map size.
      */
-    public int txXidMapSize() {
+    public int getTxXidMapSize() {
         return txXidMapSize;
     }
 
     /**
      * @return Committed transaction queue size.
      */
-    public int txCommitQueueSize() {
+    public int getTxCommitQueueSize() {
         return txCommitQueueSize;
     }
 
     /**
      * @return Prepared transaction queue size.
      */
-    public int txPrepareQueueSize() {
+    public int getTxPrepareQueueSize() {
         return txPrepareQueueSize;
     }
 
     /**
      * @return Start version counts map size.
      */
-    public int txStartVersionCountsSize() {
+    public int getTxStartVersionCountsSize() {
         return txStartVerCountsSize;
     }
 
     /**
      * @return Number of cached committed transaction IDs.
      */
-    public int txCommittedVersionsSize() {
+    public int getTxCommittedVersionsSize() {
         return txCommittedVersionsSize;
     }
 
     /**
      * @return Number of cached rolled back transaction IDs.
      */
-    public int txRolledbackVersionsSize() {
+    public int getTxRolledbackVersionsSize() {
         return txRolledbackVersionsSize;
     }
 
     /**
      * @return DHT thread map size
      */
-    public int txDhtThreadMapSize() {
+    public int getTxDhtThreadMapSize() {
         return txDhtThreadMapSize;
     }
 
     /**
      * @return Transaction DHT per-Xid map size.
      */
-    public int txDhtXidMapSize() {
+    public int getTxDhtXidMapSize() {
         return txDhtXidMapSize;
     }
 
     /**
      * @return Committed DHT transaction queue size.
      */
-    public int txDhtCommitQueueSize() {
+    public int getTxDhtCommitQueueSize() {
         return txDhtCommitQueueSize;
     }
 
     /**
      * @return Prepared DHT transaction queue size.
      */
-    public int txDhtPrepareQueueSize() {
+    public int getTxDhtPrepareQueueSize() {
         return txDhtPrepareQueueSize;
     }
 
     /**
      * @return DHT start version counts map size.
      */
-    public int txDhtStartVersionCountsSize() {
+    public int getTxDhtStartVersionCountsSize() {
         return txDhtStartVerCountsSize;
     }
 
     /**
      * @return Number of cached committed DHT transaction IDs.
      */
-    public int txDhtCommittedVersionsSize() {
+    public int getTxDhtCommittedVersionsSize() {
         return txDhtCommittedVersionsSize;
     }
 
     /**
      * @return Number of cached rolled back DHT transaction IDs.
      */
-    public int txDhtRolledbackVersionsSize() {
+    public int getTxDhtRolledbackVersionsSize() {
         return txDhtRolledbackVersionsSize;
     }
 
     /**
      * @return Memory size allocated in off-heap.
      */
-    public long offHeapAllocatedSize() {
+    public long getOffHeapAllocatedSize() {
         return offHeapAllocatedSize;
     }
 
@@ -547,6 +557,98 @@ public class VisorCacheMetrics implements Serializable, LessNamingBean {
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, name);
+        U.writeEnum(out, mode);
+        out.writeBoolean(sys);
+        out.writeInt(size);
+        out.writeInt(keySize);
+        out.writeLong(reads);
+        out.writeFloat(avgReadTime);
+        out.writeLong(writes);
+        out.writeLong(hits);
+        out.writeLong(misses);
+        out.writeLong(txCommits);
+        out.writeFloat(avgTxCommitTime);
+        out.writeLong(txRollbacks);
+        out.writeFloat(avgTxRollbackTime);
+        out.writeLong(puts);
+        out.writeFloat(avgPutTime);
+        out.writeLong(removals);
+        out.writeFloat(avgRemovalTime);
+        out.writeLong(evictions);
+        out.writeInt(readsPerSec);
+        out.writeInt(putsPerSec);
+        out.writeInt(removalsPerSec);
+        out.writeInt(commitsPerSec);
+        out.writeInt(rollbacksPerSec);
+        out.writeInt(dhtEvictQueueCurrSize);
+        out.writeInt(txThreadMapSize);
+        out.writeInt(txXidMapSize);
+        out.writeInt(txCommitQueueSize);
+        out.writeInt(txPrepareQueueSize);
+        out.writeInt(txStartVerCountsSize);
+        out.writeInt(txCommittedVersionsSize);
+        out.writeInt(txRolledbackVersionsSize);
+        out.writeInt(txDhtThreadMapSize);
+        out.writeInt(txDhtXidMapSize);
+        out.writeInt(txDhtCommitQueueSize);
+        out.writeInt(txDhtPrepareQueueSize);
+        out.writeInt(txDhtStartVerCountsSize);
+        out.writeInt(txDhtCommittedVersionsSize);
+        out.writeInt(txDhtRolledbackVersionsSize);
+        out.writeLong(offHeapAllocatedSize);
+        out.writeLong(offHeapEntriesCnt);
+        out.writeObject(qryMetrics);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        name = U.readString(in);
+        mode = CacheMode.fromOrdinal(in.readByte());
+        sys = in.readBoolean();
+        size = in.readInt();
+        keySize = in.readInt();
+        reads = in.readLong();
+        avgReadTime = in.readFloat();
+        writes = in.readLong();
+        hits = in.readLong();
+        misses = in.readLong();
+        txCommits = in.readLong();
+        avgTxCommitTime = in.readFloat();
+        txRollbacks = in.readLong();
+        avgTxRollbackTime = in.readFloat();
+        puts = in.readLong();
+        avgPutTime = in.readFloat();
+        removals = in.readLong();
+        avgRemovalTime = in.readFloat();
+        evictions = in.readLong();
+        readsPerSec = in.readInt();
+        putsPerSec = in.readInt();
+        removalsPerSec = in.readInt();
+        commitsPerSec = in.readInt();
+        rollbacksPerSec = in.readInt();
+        dhtEvictQueueCurrSize = in.readInt();
+        txThreadMapSize = in.readInt();
+        txXidMapSize = in.readInt();
+        txCommitQueueSize = in.readInt();
+        txPrepareQueueSize = in.readInt();
+        txStartVerCountsSize = in.readInt();
+        txCommittedVersionsSize = in.readInt();
+        txRolledbackVersionsSize = in.readInt();
+        txDhtThreadMapSize = in.readInt();
+        txDhtXidMapSize = in.readInt();
+        txDhtCommitQueueSize = in.readInt();
+        txDhtPrepareQueueSize = in.readInt();
+        txDhtStartVerCountsSize = in.readInt();
+        txDhtCommittedVersionsSize = in.readInt();
+        txDhtRolledbackVersionsSize = in.readInt();
+        offHeapAllocatedSize = in.readLong();
+        offHeapEntriesCnt = in.readLong();
+        qryMetrics = (VisorQueryMetrics)in.readObject();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorCacheMetrics.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTask.java
index 4fd85de..5cc8154 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTask.java
@@ -29,20 +29,19 @@ import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.internal.visor.VisorJob;
 import org.apache.ignite.internal.visor.VisorMultiNodeTask;
-import org.apache.ignite.lang.IgniteBiTuple;
 import org.jetbrains.annotations.Nullable;
 
 /**
  * Task that collect cache metrics from all nodes.
  */
 @GridInternal
-public class VisorCacheMetricsCollectorTask extends VisorMultiNodeTask<IgniteBiTuple<Boolean, Collection<String>>,
+public class VisorCacheMetricsCollectorTask extends VisorMultiNodeTask<VisorCacheMetricsCollectorTaskArg,
     Iterable<VisorCacheAggregatedMetrics>, Collection<VisorCacheMetrics>> {
     /** */
     private static final long serialVersionUID = 0L;
 
     /** {@inheritDoc} */
-    @Override protected VisorCacheMetricsCollectorJob job(IgniteBiTuple<Boolean, Collection<String>> arg) {
+    @Override protected VisorCacheMetricsCollectorJob job(VisorCacheMetricsCollectorTaskArg arg) {
         return new VisorCacheMetricsCollectorJob(arg, debug);
     }
 
@@ -55,15 +54,15 @@ public class VisorCacheMetricsCollectorTask extends VisorMultiNodeTask<IgniteBiT
                 Collection<VisorCacheMetrics> cms = res.getData();
 
                 for (VisorCacheMetrics cm : cms) {
-                    VisorCacheAggregatedMetrics am = grpAggrMetrics.get(cm.name());
+                    VisorCacheAggregatedMetrics am = grpAggrMetrics.get(cm.getName());
 
                     if (am == null) {
-                        am = VisorCacheAggregatedMetrics.from(cm);
+                        am = new VisorCacheAggregatedMetrics(cm);
 
-                        grpAggrMetrics.put(cm.name(), am);
+                        grpAggrMetrics.put(cm.getName(), am);
                     }
 
-                    am.metrics().put(res.getNode().id(), cm);
+                    am.getMetrics().put(res.getNode().id(), cm);
                 }
             }
         }
@@ -76,7 +75,7 @@ public class VisorCacheMetricsCollectorTask extends VisorMultiNodeTask<IgniteBiT
      * Job that collect cache metrics from node.
      */
     private static class VisorCacheMetricsCollectorJob
-        extends VisorJob<IgniteBiTuple<Boolean, Collection<String>>, Collection<VisorCacheMetrics>> {
+        extends VisorJob<VisorCacheMetricsCollectorTaskArg, Collection<VisorCacheMetrics>> {
 
         /** */
         private static final long serialVersionUID = 0L;
@@ -87,19 +86,17 @@ public class VisorCacheMetricsCollectorTask extends VisorMultiNodeTask<IgniteBiT
          * @param arg Whether to collect metrics for all caches or for specified cache name only.
          * @param debug Debug flag.
          */
-        private VisorCacheMetricsCollectorJob(IgniteBiTuple<Boolean, Collection<String>> arg, boolean debug) {
+        private VisorCacheMetricsCollectorJob(VisorCacheMetricsCollectorTaskArg arg, boolean debug) {
             super(arg, debug);
         }
 
         /** {@inheritDoc} */
-        @Override protected Collection<VisorCacheMetrics> run(final IgniteBiTuple<Boolean, Collection<String>> arg) {
+        @Override protected Collection<VisorCacheMetrics> run(final VisorCacheMetricsCollectorTaskArg arg) {
             assert arg != null;
 
-            Boolean showSysCaches = arg.get1();
+            Boolean showSysCaches = arg.isShowSystemCaches();
 
-            assert showSysCaches != null;
-
-            Collection<String> cacheNames = arg.get2();
+            Collection<String> cacheNames = arg.getCacheNames();
 
             assert cacheNames != null;
 
@@ -115,9 +112,9 @@ public class VisorCacheMetricsCollectorTask extends VisorMultiNodeTask<IgniteBiT
                 if (ca.context().started()) {
                     String cacheName = ca.getName();
 
-                    VisorCacheMetrics cm = new VisorCacheMetrics().from(ignite, cacheName);
+                    VisorCacheMetrics cm = new VisorCacheMetrics(ignite, cacheName);
 
-                    if ((allCaches || cacheNames.contains(cacheName)) && (showSysCaches || !cm.system()))
+                    if ((allCaches || cacheNames.contains(cacheName)) && (showSysCaches || !cm.isSystem()))
                         res.add(cm);
                 }
             }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTaskArg.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTaskArg.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTaskArg.java
new file mode 100644
index 0000000..9529ab4
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTaskArg.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.cache;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.List;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Cache start arguments.
+ */
+public class VisorCacheMetricsCollectorTaskArg extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Collect metrics for system caches. */
+    private boolean showSysCaches;
+
+    /** Cache names to collect metrics. */
+    private List<String> cacheNames;
+
+    /**
+     * Default constructor.
+     */
+    public VisorCacheMetricsCollectorTaskArg() {
+        // No-op.
+    }
+
+    /**
+     * @param showSysCaches Collect metrics for system caches.
+     * @param cacheNames Cache names to collect metrics.
+     */
+    public VisorCacheMetricsCollectorTaskArg(boolean showSysCaches, List<String> cacheNames) {
+        this.showSysCaches = showSysCaches;
+        this.cacheNames = cacheNames;
+    }
+
+    /**
+     * @return Collect metrics for system caches
+     */
+    public boolean isShowSystemCaches() {
+        return showSysCaches;
+    }
+
+    /**
+     * @return Cache names to collect metrics
+     */
+    public List<String> getCacheNames() {
+        return cacheNames;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeBoolean(showSysCaches);
+        U.writeCollection(out, cacheNames);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        showSysCaches = in.readBoolean();
+        cacheNames = U.readList(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorCacheMetricsCollectorTaskArg.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheNearConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheNearConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheNearConfiguration.java
index 8771da4..ae55f83 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheNearConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheNearConfiguration.java
@@ -17,12 +17,15 @@
 
 package org.apache.ignite.internal.visor.cache;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.NearCacheConfiguration;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.processors.cache.GridCacheUtils;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 import org.jetbrains.annotations.Nullable;
 
 import static org.apache.ignite.internal.visor.util.VisorTaskUtils.compactClass;
@@ -31,7 +34,7 @@ import static org.apache.ignite.internal.visor.util.VisorTaskUtils.evictionPolic
 /**
  * Data transfer object for near cache configuration properties.
  */
-public class VisorCacheNearConfiguration implements Serializable, LessNamingBean {
+public class VisorCacheNearConfiguration extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -48,54 +51,74 @@ public class VisorCacheNearConfiguration implements Serializable, LessNamingBean
     private Integer nearEvictMaxSize;
 
     /**
-     * @param ccfg Cache configuration.
-     * @return Data transfer object for near cache configuration properties.
+     * Default constructor.
      */
-    public static VisorCacheNearConfiguration from(CacheConfiguration ccfg) {
-        VisorCacheNearConfiguration cfg = new VisorCacheNearConfiguration();
+    public VisorCacheNearConfiguration() {
+        // No-op.
+    }
 
-        cfg.nearEnabled = GridCacheUtils.isNearEnabled(ccfg);
+    /**
+     * Create data transfer object for near cache configuration properties.
+     *
+     * @param ccfg Cache configuration.
+     */
+    public VisorCacheNearConfiguration(CacheConfiguration ccfg) {
+        nearEnabled = GridCacheUtils.isNearEnabled(ccfg);
 
-        if (cfg.nearEnabled) {
+        if (nearEnabled) {
             NearCacheConfiguration nccfg = ccfg.getNearConfiguration();
 
-            cfg.nearStartSize = nccfg.getNearStartSize();
-            cfg.nearEvictPlc = compactClass(nccfg.getNearEvictionPolicy());
-            cfg.nearEvictMaxSize = evictionPolicyMaxSize(nccfg.getNearEvictionPolicy());
+            nearStartSize = nccfg.getNearStartSize();
+            nearEvictPlc = compactClass(nccfg.getNearEvictionPolicy());
+            nearEvictMaxSize = evictionPolicyMaxSize(nccfg.getNearEvictionPolicy());
         }
-
-        return cfg;
     }
 
     /**
      * @return {@code true} if near cache enabled.
      */
-    public boolean nearEnabled() {
+    public boolean isNearEnabled() {
         return nearEnabled;
     }
 
     /**
      * @return Near cache start size.
      */
-    public int nearStartSize() {
+    public int getNearStartSize() {
         return nearStartSize;
     }
 
     /**
      * @return Near cache eviction policy.
      */
-    @Nullable public String nearEvictPolicy() {
+    @Nullable public String getNearEvictPolicy() {
         return nearEvictPlc;
     }
 
     /**
      * @return Near cache eviction policy max size.
      */
-    @Nullable public Integer nearEvictMaxSize() {
+    @Nullable public Integer getNearEvictMaxSize() {
         return nearEvictMaxSize;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeBoolean(nearEnabled);
+        out.writeInt(nearStartSize);
+        U.writeString(out, nearEvictPlc);
+        out.writeObject(nearEvictMaxSize);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        nearEnabled = in.readBoolean();
+        nearStartSize = in.readInt();
+        nearEvictPlc = U.readString(in);
+        nearEvictMaxSize = (Integer)in.readObject();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorCacheNearConfiguration.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartition.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartition.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartition.java
index e73d1f6..b57bc53 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartition.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartition.java
@@ -17,58 +17,67 @@
 
 package org.apache.ignite.internal.visor.cache;
 
-import java.io.Serializable;
-import org.apache.ignite.internal.LessNamingBean;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 /**
  * Data transfer object for information about keys in cache partition.
  */
-public class VisorCachePartition implements Serializable, LessNamingBean {
+public class VisorCachePartition extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
     /** */
-    private int part;
+    private int partId;
 
     /** */
-    private int heap;
+    private long cnt;
 
-    /** */
-    private long offheap;
+    /**
+     * Default constructor.
+     */
+    public VisorCachePartition() {
+        // No-op.
+    }
 
     /**
      * Full constructor.
      *
-     * @param part Partition id.
-     * @param heap Number of keys in heap.
-     * @param offheap Number of keys in offheap.
+     * @param partId Partition id.
+     * @param cnt Number of keys in partition.
      */
-    public VisorCachePartition(int part, int heap, long offheap) {
-        this.part = part;
-        this.heap = heap;
-        this.offheap = offheap;
+    public VisorCachePartition(int partId, long cnt) {
+        this.partId = partId;
+        this.cnt = cnt;
     }
 
     /**
      * @return Partition id.
      */
-    public int partition() {
-        return part;
+    public int getPartitionId() {
+        return partId;
     }
 
     /**
-     * @return Number of keys in heap.
+     * @return Number of keys in partition.
      */
-    public int heap() {
-        return heap;
+    public long getCount() {
+        return cnt;
     }
 
-    /**
-     * @return Number of keys in offheap.
-     */
-    public long offheap() {
-        return offheap;
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeInt(partId);
+        out.writeLong(cnt);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        partId = in.readInt();
+        cnt = in.readLong();
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitions.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitions.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitions.java
index f8e54a9..2713179 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitions.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitions.java
@@ -17,16 +17,19 @@
 
 package org.apache.ignite.internal.visor.cache;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 /**
  * Data transfer object for information about cache partitions.
  */
-public class VisorCachePartitions implements Serializable, LessNamingBean {
+public class VisorCachePartitions extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -47,40 +50,50 @@ public class VisorCachePartitions implements Serializable, LessNamingBean {
     /**
      * Add primary partition descriptor.
      *
-     * @param part Partition id.
-     * @param heap Number of primary keys in heap.
-     * @param offheap Number of primary keys in offheap.
+     * @param partId Partition id.
+     * @param cnt Number of primary keys in partition.
      */
-    public void addPrimary(int part, int heap, long offheap) {
-       primary.add(new VisorCachePartition(part, heap, offheap));
+    public void addPrimary(int partId, long cnt) {
+       primary.add(new VisorCachePartition(partId, cnt));
     }
 
     /**
      * Add backup partition descriptor.
      *
-     * @param part Partition id.
-     * @param heap Number of backup keys in heap.
-     * @param offheap Number of backup keys in offheap.
+     * @param partId Partition id.
+     * @param cnt Number of backup keys in partition.
      */
-    public void addBackup(int part, int heap, long offheap) {
-       backup.add(new VisorCachePartition(part, heap, offheap));
+    public void addBackup(int partId, long cnt) {
+       backup.add(new VisorCachePartition(partId, cnt));
     }
 
     /**
      * @return Get list of primary partitions.
      */
-    public List<VisorCachePartition> primary() {
+    public List<VisorCachePartition> getPrimary() {
         return primary;
     }
 
     /**
      * @return Get list of backup partitions.
      */
-    public List<VisorCachePartition> backup() {
+    public List<VisorCachePartition> getBackup() {
         return backup;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeCollection(out, primary);
+        U.writeCollection(out, backup);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        primary = U.readList(in);
+        backup = U.readList(in);
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorCachePartitions.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitionsTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitionsTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitionsTask.java
index 6d3a9d8..b7ca975 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitionsTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitionsTask.java
@@ -45,7 +45,8 @@ import static org.apache.ignite.internal.visor.util.VisorTaskUtils.escapeName;
  * Task that collect keys distribution in partitions.
  */
 @GridInternal
-public class VisorCachePartitionsTask extends VisorMultiNodeTask<String, Map<UUID, VisorCachePartitions>, VisorCachePartitions> {
+public class VisorCachePartitionsTask extends VisorMultiNodeTask<String,
+    Map<UUID, VisorCachePartitions>, VisorCachePartitions> {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -125,9 +126,9 @@ public class VisorCachePartitionsTask extends VisorMultiNodeTask<String, Map<UUI
 
                         // Pass -1 as topology version in order not to wait for topology version.
                         if (part.primary(AffinityTopologyVersion.NONE))
-                            parts.addPrimary(p, sz, 0);
+                            parts.addPrimary(p, sz);
                         else if (part.state() == GridDhtPartitionState.OWNING && part.backup(AffinityTopologyVersion.NONE))
-                            parts.addBackup(p, sz, 0);
+                            parts.addBackup(p, sz);
                     }
                 }
             }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheQueryConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheQueryConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheQueryConfiguration.java
deleted file mode 100644
index a21cf43..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheQueryConfiguration.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.visor.cache;
-
-import java.io.Serializable;
-import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.internal.LessNamingBean;
-import org.apache.ignite.internal.util.typedef.internal.U;
-
-/**
- * Data transfer object for cache query configuration data.
- */
-public class VisorCacheQueryConfiguration implements Serializable, LessNamingBean {
-    /** */
-    private static final long serialVersionUID = 0L;
-
-    /** */
-    private String[] sqlFuncClss;
-
-    /** */
-    private long longQryWarnTimeout;
-
-    /** */
-    private boolean sqlEscapeAll;
-
-    /** */
-    private String[] indexedTypes;
-
-    /** */
-    private int sqlOnheapRowCacheSize;
-
-    /** */
-    private String sqlSchema;
-
-    /**
-     * @param clss Classes to compact.
-     */
-    private static String[] compactClasses(Class<?>[] clss) {
-        if (clss == null)
-            return null;
-
-        int len = clss.length;
-
-        String[] res = new String[len];
-
-        for (int i = 0; i < len; i++)
-            res[i] = U.compact(clss[i].getName());
-
-        return res;
-    }
-
-    /**
-     * @param ccfg Cache configuration.
-     * @return Fill data transfer object with cache query configuration data.
-     */
-    public VisorCacheQueryConfiguration from(CacheConfiguration ccfg) {
-        sqlFuncClss = compactClasses(ccfg.getSqlFunctionClasses());
-        longQryWarnTimeout = ccfg.getLongQueryWarningTimeout();
-        sqlEscapeAll = ccfg.isSqlEscapeAll();
-        indexedTypes = compactClasses(ccfg.getIndexedTypes());
-        sqlSchema = ccfg.getSqlSchema();
-
-        return this;
-    }
-
-    /**
-     * @return Classes names with SQL functions.
-     */
-    public String[] sqlFunctionClasses() {
-        return sqlFuncClss;
-    }
-
-    /**
-     * @return Timeout in milliseconds after which long query warning will be printed.
-     */
-    public long longQueryWarningTimeout() {
-        return longQryWarnTimeout;
-    }
-
-    /**
-     * @return {@code true} if SQL engine generate SQL statements with escaped names.
-     */
-    public boolean sqlEscapeAll() {
-        return sqlEscapeAll;
-    }
-
-    /**
-     * @return Array of key and value classes names to be indexed.
-     */
-    public String[] indexedTypes() {
-        return indexedTypes;
-    }
-
-    /**
-     * @return Number of SQL rows which will be cached onheap to avoid deserialization on each SQL index access.
-     */
-    public int sqlOnheapRowCacheSize() {
-        return sqlOnheapRowCacheSize;
-    }
-
-    /**
-     * @return Schema name, which is used by SQL engine for SQL statements generation.
-     */
-    public String sqlSchema() {
-        return sqlSchema;
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheQueryDetailMetrics.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheQueryDetailMetrics.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheQueryDetailMetrics.java
deleted file mode 100644
index dc46906..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheQueryDetailMetrics.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.visor.cache;
-
-import java.io.Serializable;
-import org.apache.ignite.cache.query.QueryDetailMetrics;
-import org.apache.ignite.internal.util.typedef.internal.S;
-
-/**
- * Data transfer object for cache query detail metrics.
- */
-public class VisorCacheQueryDetailMetrics implements Serializable {
-    /** */
-    private static final long serialVersionUID = 0L;
-
-    /** Query type. */
-    private String qryType;
-
-    /** Textual query representation. */
-    private String qry;
-
-    /** Cache name. */
-    private String cache;
-
-    /** Number of executions. */
-    private int execs;
-
-    /** Number of completions executions. */
-    private int completions;
-
-    /** Number of failures. */
-    private int failures;
-
-    /** Minimum time of execution. */
-    private long minTime;
-
-    /** Maximum time of execution. */
-    private long maxTime;
-
-    /** Average time of execution. */
-    private double avgTime;
-
-    /** Sum of execution time of completions time. */
-    private long totalTime;
-
-    /** Sum of execution time of completions time. */
-    private long lastStartTime;
-
-    /**
-     * @param m Cache query metrics.
-     * @return Data transfer object for given cache metrics.
-     */
-    public VisorCacheQueryDetailMetrics from(QueryDetailMetrics m) {
-        qryType = m.queryType();
-        qry = m.query();
-        cache = m.cache();
-
-        execs = m.executions();
-        completions = m.completions();
-        failures = m.failures();
-
-        minTime = m.minimumTime();
-        maxTime = m.maximumTime();
-        avgTime = m.averageTime();
-        totalTime = m.totalTime();
-        lastStartTime = m.lastStartTime();
-
-        return this;
-    }
-
-    /**
-     * @return Query type
-     */
-    public String getQueryType() {
-        return qryType;
-    }
-
-    /**
-     * @return Query type
-     */
-    public String getQuery() {
-        return qry;
-    }
-
-    /**
-     * @return Cache name where query was executed.
-     */
-    public String getCache() {
-        return cache;
-    }
-
-    /**
-     * @return Number of executions.
-     */
-    public int getExecutions() {
-        return execs;
-    }
-
-    /**
-     * @return Number of completed executions.
-     */
-    public int getCompletions() {
-        return completions;
-    }
-
-    /**
-     * @return Total number of times a query execution failed.
-     */
-    public int getFailures() {
-        return failures;
-    }
-
-    /**
-     * @return Minimum execution time of query.
-     */
-    public long getMinimumTime() {
-        return minTime;
-    }
-
-    /**
-     * @return Maximum execution time of query.
-     */
-    public long getMaximumTime() {
-        return maxTime;
-    }
-
-    /**
-     * @return Average execution time of query.
-     */
-    public double getAverageTime() {
-        return avgTime;
-    }
-
-    /**
-     * @return Total time of all query executions.
-     */
-    public long getTotalTime() {
-        return totalTime;
-    }
-
-    /**
-     * @return Latest time query was stared.
-     */
-    public long getLastStartTime() {
-        return lastStartTime;
-    }
-
-    /** {@inheritDoc} */
-    @Override public String toString() {
-        return S.toString(VisorCacheQueryDetailMetrics.class, this);
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheQueryDetailMetricsCollectorTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheQueryDetailMetricsCollectorTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheQueryDetailMetricsCollectorTask.java
deleted file mode 100644
index aee5063..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheQueryDetailMetricsCollectorTask.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.visor.cache;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.apache.ignite.IgniteException;
-import org.apache.ignite.cache.query.QueryDetailMetrics;
-import org.apache.ignite.compute.ComputeJobResult;
-import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.internal.processors.cache.GridCacheProcessor;
-import org.apache.ignite.internal.processors.cache.IgniteInternalCache;
-import org.apache.ignite.internal.processors.cache.query.GridCacheQueryDetailMetricsAdapter;
-import org.apache.ignite.internal.processors.cache.query.GridCacheQueryDetailMetricsKey;
-import org.apache.ignite.internal.processors.task.GridInternal;
-import org.apache.ignite.internal.util.typedef.internal.S;
-import org.apache.ignite.internal.visor.VisorJob;
-import org.apache.ignite.internal.visor.VisorMultiNodeTask;
-import org.jetbrains.annotations.Nullable;
-
-import static org.apache.ignite.internal.processors.cache.GridCacheUtils.isIgfsCache;
-import static org.apache.ignite.internal.processors.cache.GridCacheUtils.isSystemCache;
-
-/**
- * Task to collect cache query metrics.
- */
-@GridInternal
-public class VisorCacheQueryDetailMetricsCollectorTask extends VisorMultiNodeTask<Long, Collection<VisorCacheQueryDetailMetrics>,
-    Collection<? extends QueryDetailMetrics>> {
-    /** */
-    private static final long serialVersionUID = 0L;
-
-    /** {@inheritDoc} */
-    @Override protected VisorCacheQueryDetailMetricsCollectorJob job(Long arg) {
-        return new VisorCacheQueryDetailMetricsCollectorJob(arg, debug);
-    }
-
-    /** {@inheritDoc} */
-    @Nullable @Override protected Collection<VisorCacheQueryDetailMetrics> reduce0(List<ComputeJobResult> results)
-        throws IgniteException {
-        Map<GridCacheQueryDetailMetricsKey, GridCacheQueryDetailMetricsAdapter> taskRes = new HashMap<>();
-
-        for (ComputeJobResult res : results) {
-            if (res.getException() != null)
-                throw res.getException();
-
-            Collection<GridCacheQueryDetailMetricsAdapter> metrics = res.getData();
-
-            VisorCacheQueryDetailMetricsCollectorJob.aggregateMetrics(-1, taskRes, metrics);
-        }
-
-        Collection<GridCacheQueryDetailMetricsAdapter> aggMetrics = taskRes.values();
-
-        Collection<VisorCacheQueryDetailMetrics> res = new ArrayList<>(aggMetrics.size());
-
-        for (GridCacheQueryDetailMetricsAdapter m : aggMetrics)
-            res.add(new VisorCacheQueryDetailMetrics().from(m));
-
-        return res;
-    }
-
-    /**
-     * Job that will actually collect query metrics.
-     */
-    private static class VisorCacheQueryDetailMetricsCollectorJob extends VisorJob<Long, Collection<? extends QueryDetailMetrics>> {
-        /** */
-        private static final long serialVersionUID = 0L;
-
-        /**
-         * Create job with specified argument.
-         *
-         * @param arg Last time when metrics were collected.
-         * @param debug Debug flag.
-         */
-        protected VisorCacheQueryDetailMetricsCollectorJob(@Nullable Long arg, boolean debug) {
-            super(arg, debug);
-        }
-
-        /**
-         * @param since Time when metrics were collected last time.
-         * @param res Response.
-         * @param metrics Metrics.
-         */
-        private static void aggregateMetrics(long since, Map<GridCacheQueryDetailMetricsKey,
-            GridCacheQueryDetailMetricsAdapter> res, Collection<GridCacheQueryDetailMetricsAdapter> metrics) {
-            for (GridCacheQueryDetailMetricsAdapter m : metrics) {
-                if (m.lastStartTime() > since) {
-                    GridCacheQueryDetailMetricsKey key = m.key();
-
-                    GridCacheQueryDetailMetricsAdapter aggMetrics = res.get(key);
-
-                    res.put(key, aggMetrics == null ? m : aggMetrics.aggregate(m));
-                }
-            }
-        }
-
-        /** {@inheritDoc} */
-        @Override protected Collection<? extends QueryDetailMetrics> run(@Nullable Long arg) throws IgniteException {
-            assert arg != null;
-
-            IgniteConfiguration cfg = ignite.configuration();
-
-            GridCacheProcessor cacheProc = ignite.context().cache();
-
-            Collection<String> cacheNames = cacheProc.cacheNames();
-
-            Map<GridCacheQueryDetailMetricsKey, GridCacheQueryDetailMetricsAdapter> aggMetrics = new HashMap<>();
-
-            for (String cacheName : cacheNames) {
-                if (!isSystemCache(cacheName) && !isIgfsCache(cfg, cacheName)) {
-                    IgniteInternalCache<Object, Object> cache = cacheProc.cache(cacheName);
-
-                    if (cache == null || !cache.context().started())
-                        continue;
-
-                    aggregateMetrics(arg, aggMetrics, cache.context().queries().detailMetrics());
-                }
-            }
-
-            return new ArrayList<>(aggMetrics.values());
-        }
-
-        /** {@inheritDoc} */
-        @Override public String toString() {
-            return S.toString(VisorCacheQueryDetailMetricsCollectorJob.class, this);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheQueryMetrics.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheQueryMetrics.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheQueryMetrics.java
deleted file mode 100644
index a3d77e5..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheQueryMetrics.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.visor.cache;
-
-import java.io.Serializable;
-import org.apache.ignite.cache.query.QueryMetrics;
-import org.apache.ignite.internal.LessNamingBean;
-import org.apache.ignite.internal.util.typedef.internal.S;
-
-/**
- * Data transfer object for cache query metrics.
- */
-public class VisorCacheQueryMetrics implements Serializable, LessNamingBean {
-    /** */
-    private static final long serialVersionUID = 0L;
-
-    /** Minimum execution time of query. */
-    private long minTime;
-
-    /** Maximum execution time of query. */
-    private long maxTime;
-
-    /** Average execution time of query. */
-    private double avgTime;
-
-    /** Number of executions. */
-    private int execs;
-
-    /** Total number of times a query execution failed. */
-    private int fails;
-
-    /**
-     * @param m Cache query metrics.
-     * @return Data transfer object for given cache metrics.
-     */
-    public static VisorCacheQueryMetrics from(QueryMetrics m) {
-        VisorCacheQueryMetrics qm = new VisorCacheQueryMetrics();
-
-        qm.minTime = m.minimumTime();
-        qm.maxTime = m.maximumTime();
-        qm.avgTime = m.averageTime();
-        qm.execs = m.executions();
-        qm.fails = m.fails();
-
-        return qm;
-    }
-
-    /**
-     * @return Minimum execution time of query.
-     */
-    public long minimumTime() {
-        return minTime;
-    }
-
-    /**
-     * @return Maximum execution time of query.
-     */
-    public long maximumTime() {
-        return maxTime;
-    }
-
-    /**
-     * @return Average execution time of query.
-     */
-    public double averageTime() {
-        return avgTime;
-    }
-
-    /**
-     * @return Number of executions.
-     */
-    public int executions() {
-        return execs;
-    }
-
-    /**
-     * @return Total number of times a query execution failed.
-     */
-    public int fails() {
-        return fails;
-    }
-
-    /** {@inheritDoc} */
-    @Override public String toString() {
-        return S.toString(VisorCacheQueryMetrics.class, this);
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheRebalanceConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheRebalanceConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheRebalanceConfiguration.java
index 4c28d00..618fa97 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheRebalanceConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheRebalanceConfiguration.java
@@ -17,25 +17,25 @@
 
 package org.apache.ignite.internal.visor.cache;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.apache.ignite.cache.CacheRebalanceMode;
 import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 /**
  * Data transfer object for cache rebalance configuration properties.
  */
-public class VisorCacheRebalanceConfiguration implements Serializable, LessNamingBean {
+public class VisorCacheRebalanceConfiguration extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
     /** Cache rebalance mode. */
     private CacheRebalanceMode mode;
 
-    /** Rebalance thread pool size. */
-    private int threadPoolSize;
-
     /** Cache rebalance batch size. */
     private int batchSize;
 
@@ -49,65 +49,78 @@ public class VisorCacheRebalanceConfiguration implements Serializable, LessNamin
     private long timeout;
 
     /**
-     * @param ccfg Cache configuration.
-     * @return Data transfer object for rebalance configuration properties.
+     * Default constructor.
      */
-    public static VisorCacheRebalanceConfiguration from(CacheConfiguration ccfg) {
-        VisorCacheRebalanceConfiguration cfg = new VisorCacheRebalanceConfiguration();
-
-        cfg.mode = ccfg.getRebalanceMode();
-        cfg.batchSize = ccfg.getRebalanceBatchSize();
-        cfg.threadPoolSize = ccfg.getRebalanceThreadPoolSize();
-        cfg.partitionedDelay = ccfg.getRebalanceDelay();
-        cfg.throttle = ccfg.getRebalanceThrottle();
-        cfg.timeout = ccfg.getRebalanceTimeout();
-
-        return cfg;
+    public VisorCacheRebalanceConfiguration() {
+        // No-op.
     }
 
     /**
-     * @return Cache rebalance mode.
+     * Create data transfer object for rebalance configuration properties.
+     * @param ccfg Cache configuration.
      */
-    public CacheRebalanceMode mode() {
-        return mode;
+    public VisorCacheRebalanceConfiguration(CacheConfiguration ccfg) {
+        mode = ccfg.getRebalanceMode();
+        batchSize = ccfg.getRebalanceBatchSize();
+        partitionedDelay = ccfg.getRebalanceDelay();
+        throttle = ccfg.getRebalanceThrottle();
+        timeout = ccfg.getRebalanceTimeout();
     }
 
     /**
-     * @return Rebalance thread pool size.
+     * @return Cache rebalance mode.
      */
-    public int threadPoolSize() {
-        return threadPoolSize;
+    public CacheRebalanceMode getMode() {
+        return mode;
     }
 
     /**
      * @return Cache rebalance batch size.
      */
-    public int batchSize() {
+    public int getBatchSize() {
         return batchSize;
     }
 
     /**
      * @return Rebalance partitioned delay.
      */
-    public long partitionedDelay() {
+    public long getPartitionedDelay() {
         return partitionedDelay;
     }
 
     /**
      * @return Time in milliseconds to wait between rebalance messages.
      */
-    public long throttle() {
+    public long getThrottle() {
         return throttle;
     }
 
     /**
      * @return Rebalance timeout.
      */
-    public long timeout() {
+    public long getTimeout() {
         return timeout;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeEnum(out, mode);
+        out.writeInt(batchSize);
+        out.writeLong(partitionedDelay);
+        out.writeLong(throttle);
+        out.writeLong(timeout);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        mode = CacheRebalanceMode.fromOrdinal(in.readByte());
+        batchSize = in.readInt();
+        partitionedDelay = in.readLong();
+        throttle = in.readLong();
+        timeout = in.readLong();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorCacheRebalanceConfiguration.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheResetQueryDetailMetricsTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheResetQueryDetailMetricsTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheResetQueryDetailMetricsTask.java
deleted file mode 100644
index 84aae9d..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheResetQueryDetailMetricsTask.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.visor.cache;
-
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.internal.processors.task.GridInternal;
-import org.apache.ignite.internal.util.typedef.internal.S;
-import org.apache.ignite.internal.visor.VisorJob;
-import org.apache.ignite.internal.visor.VisorOneNodeTask;
-
-/**
- * Reset query detail metrics.
- */
-@GridInternal
-public class VisorCacheResetQueryDetailMetricsTask extends VisorOneNodeTask<Void, Void> {
-    /** */
-    private static final long serialVersionUID = 0L;
-
-    /** {@inheritDoc} */
-    @Override protected VisorCacheResetQueryDetailMetricsJob job(Void arg) {
-        return new VisorCacheResetQueryDetailMetricsJob(arg, debug);
-    }
-
-    /**
-     * Job that reset query detail metrics.
-     */
-    private static class VisorCacheResetQueryDetailMetricsJob extends VisorJob<Void, Void> {
-        /** */
-        private static final long serialVersionUID = 0L;
-
-        /**
-         * @param arg Task argument.
-         * @param debug Debug flag.
-         */
-        private VisorCacheResetQueryDetailMetricsJob(Void arg, boolean debug) {
-            super(arg, debug);
-        }
-
-        /** {@inheritDoc} */
-        @Override protected Void run(Void arg) {
-            for (String cacheName : ignite.cacheNames()) {
-                IgniteCache cache = ignite.cache(cacheName);
-
-                if (cache != null)
-                    cache.resetQueryDetailMetrics();
-            }
-
-            return null;
-        }
-
-        /** {@inheritDoc} */
-        @Override public String toString() {
-            return S.toString(VisorCacheResetQueryDetailMetricsJob.class, this);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheResetQueryMetricsTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheResetQueryMetricsTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheResetQueryMetricsTask.java
deleted file mode 100644
index 5ba6156..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheResetQueryMetricsTask.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.visor.cache;
-
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.internal.processors.task.GridInternal;
-import org.apache.ignite.internal.util.typedef.internal.S;
-import org.apache.ignite.internal.visor.VisorJob;
-import org.apache.ignite.internal.visor.VisorOneNodeTask;
-
-/**
- * Reset compute grid query metrics.
- */
-@GridInternal
-public class VisorCacheResetQueryMetricsTask extends VisorOneNodeTask<String, Void> {
-    /** */
-    private static final long serialVersionUID = 0L;
-
-    /** {@inheritDoc} */
-    @Override protected VisorCacheResetQueryMetricsJob job(String arg) {
-        return new VisorCacheResetQueryMetricsJob(arg, debug);
-    }
-
-    /**
-     * Job that reset cache query metrics.
-     */
-    private static class VisorCacheResetQueryMetricsJob extends VisorJob<String, Void> {
-        /** */
-        private static final long serialVersionUID = 0L;
-
-        /**
-         * @param arg Cache name to reset query metrics for.
-         * @param debug Debug flag.
-         */
-        private VisorCacheResetQueryMetricsJob(String arg, boolean debug) {
-            super(arg, debug);
-        }
-
-        /** {@inheritDoc} */
-        @Override protected Void run(String cacheName) {
-            IgniteCache cache = ignite.cache(cacheName);
-
-            if (cache != null)
-                cache.resetQueryMetrics();
-
-            return null;
-        }
-
-        /** {@inheritDoc} */
-        @Override public String toString() {
-            return S.toString(VisorCacheResetQueryMetricsJob.class, this);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheSqlIndexMetadata.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheSqlIndexMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheSqlIndexMetadata.java
new file mode 100644
index 0000000..cd4c95c
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheSqlIndexMetadata.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.cache;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.List;
+import org.apache.ignite.internal.processors.cache.query.GridCacheSqlIndexMetadata;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Data transfer object for cache SQL index metadata.
+ */
+public class VisorCacheSqlIndexMetadata extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** */
+    private String name;
+
+    /** */
+    private List<String> fields;
+
+    /** */
+    private List<String> descendings;
+
+    /** */
+    private boolean unique;
+
+    /**
+     * Default constructor.
+     */
+    public VisorCacheSqlIndexMetadata() {
+        // No-op.
+    }
+
+    /**
+     * Create data transfer object.
+     * 
+     * @param meta SQL index metadata.
+     */
+    public VisorCacheSqlIndexMetadata(GridCacheSqlIndexMetadata meta) {
+        name = meta.name();
+        fields = toList(meta.fields());
+        descendings = toList(meta.descendings());
+        unique = meta.unique();
+    }
+
+    /**
+     * @return Index name.
+     */
+    public String getName() {
+        return name; 
+    }
+    
+    /**
+     * @return Indexed fields names.
+     */
+    public List<String> getFields() {
+        return fields;
+    }
+
+    /**
+     * @return Descendings.
+     */
+    public List<String> getDescendings() {
+        return descendings;
+    }
+
+    /**
+     * @return {@code True} if index is unique, {@code false} otherwise.
+     */
+    public boolean isUnique() {
+        return unique;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, name);
+        U.writeCollection(out, fields);
+        U.writeCollection(out, descendings);
+        out.writeBoolean(unique);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        name = U.readString(in);
+        fields = U.readList(in);
+        descendings = U.readList(in);
+        unique = in.readBoolean();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorCacheSqlIndexMetadata.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheSqlMetadata.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheSqlMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheSqlMetadata.java
new file mode 100644
index 0000000..c7ff3a7
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheSqlMetadata.java
@@ -0,0 +1,162 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.cache;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.ignite.internal.processors.cache.query.GridCacheSqlIndexMetadata;
+import org.apache.ignite.internal.processors.cache.query.GridCacheSqlMetadata;
+import org.apache.ignite.internal.processors.igfs.IgfsUtils;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Data transfer object for cache SQL metadata.
+ */
+public class VisorCacheSqlMetadata extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** */
+    private String cacheName;
+
+    /** */
+    private List<String> types;
+
+    /** */
+    private Map<String, String> keyClasses;
+
+    /** */
+    private Map<String, String> valClasses;
+
+    /** */
+    private Map<String, Map<String, String>> fields;
+
+    /** */
+    private Map<String, List<VisorCacheSqlIndexMetadata>> indexes;
+
+    /**
+     * Default constructor.
+     */
+    public VisorCacheSqlMetadata() {
+        // No-op.
+    }
+
+    /**
+     * Create data transfer object.
+     *
+     * @param meta Cache SQL metadata.
+     */
+    public VisorCacheSqlMetadata(GridCacheSqlMetadata meta) {
+        cacheName = meta.cacheName();
+        types = toList(meta.types());
+        keyClasses = meta.keyClasses();
+        valClasses = meta.valClasses();
+        fields = meta.fields();
+        indexes = new HashMap<>();
+
+        Map<String, Collection<GridCacheSqlIndexMetadata>> src = meta.indexes();
+
+        if (src != null) {
+            for (Map.Entry<String, Collection<GridCacheSqlIndexMetadata>> entry: src.entrySet()) {
+                Collection<GridCacheSqlIndexMetadata> idxs = entry.getValue();
+
+                List<VisorCacheSqlIndexMetadata> res = new ArrayList<>(idxs.size());
+
+                for (GridCacheSqlIndexMetadata idx : idxs)
+                    res.add(new VisorCacheSqlIndexMetadata(idx));
+
+                indexes.put(entry.getKey(), res);
+            }
+        }
+    }
+
+    /**
+     * @return Cache name.
+     */
+    public String getCacheName() {
+        return cacheName;
+    }
+
+    /**
+     * @return Collection of available types.
+     */
+    public List<String> getTypes() {
+        return types;
+    }
+
+    /**
+     * @return Key classes.
+     */
+    public Map<String, String> getKeyClasses() {
+        return keyClasses;
+    }
+
+    /**
+     * @return Value classes.
+     */
+    public Map<String, String> getValueClasses() {
+        return valClasses;
+    }
+
+    /**
+     * @return Fields.
+     */
+    public Map<String, Map<String, String>> getFields() {
+        return fields;
+    }
+
+    /**
+     * @return Indexes.
+     */
+    public Map<String, List<VisorCacheSqlIndexMetadata>> getIndexes() {
+        return indexes;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, cacheName);
+        U.writeCollection(out, types);
+        IgfsUtils.writeStringMap(out, keyClasses);
+        IgfsUtils.writeStringMap(out, valClasses);
+        U.writeMap(out, fields);
+        U.writeMap(out, indexes);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        cacheName = U.readString(in);
+        types = U.readList(in);
+        keyClasses = IgfsUtils.readStringMap(in);
+        valClasses = IgfsUtils.readStringMap(in);
+        fields = U.readMap(in);
+        indexes = U.readMap(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorCacheSqlMetadata.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStartArg.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStartArg.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStartArg.java
new file mode 100644
index 0000000..a2fd518
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStartArg.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.cache;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Cache start arguments.
+ */
+public class VisorCacheStartArg extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** */
+    private boolean near;
+
+    /** */
+    private String name;
+
+    /** */
+    private String cfg;
+
+    /**
+     * Default constructor.
+     */
+    public VisorCacheStartArg() {
+        // No-op.
+    }
+
+    /**
+     * @param near {@code true} if near cache should be started.
+     * @param name Name for near cache.
+     * @param cfg Cache XML configuration.
+     */
+    public VisorCacheStartArg(boolean near, String name, String cfg) {
+        this.near = near;
+        this.name = name;
+        this.cfg = cfg;
+    }
+
+    /**
+     * @return {@code true} if near cache should be started.
+     */
+    public boolean isNear() {
+        return near;
+    }
+
+    /**
+     * @return Name for near cache.
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * @return Cache XML configuration.
+     */
+    public String getConfiguration() {
+        return cfg;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeBoolean(near);
+        U.writeString(out, name);
+        U.writeString(out, cfg);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        near = in.readBoolean();
+        name = U.readString(in);
+        cfg = U.readString(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorCacheStartArg.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStartTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStartTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStartTask.java
index 758f39a..af51a38 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStartTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStartTask.java
@@ -19,7 +19,6 @@ package org.apache.ignite.internal.visor.cache;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
-import java.io.Serializable;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -41,8 +40,7 @@ import org.jetbrains.annotations.Nullable;
  * Task that start cache or near cache with specified configuration.
  */
 @GridInternal
-public class VisorCacheStartTask extends
-    VisorMultiNodeTask<VisorCacheStartTask.VisorCacheStartArg, Map<UUID, IgniteException>, Void> {
+public class VisorCacheStartTask extends VisorMultiNodeTask<VisorCacheStartArg, Map<UUID, IgniteException>, Void> {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -63,56 +61,6 @@ public class VisorCacheStartTask extends
     }
 
     /**
-     * Cache start arguments.
-     */
-    @SuppressWarnings("PublicInnerClass")
-    public static class VisorCacheStartArg implements Serializable {
-        /** */
-        private static final long serialVersionUID = 0L;
-
-        /** */
-        private final boolean near;
-
-        /** */
-        private final String name;
-
-        /** */
-        private final String cfg;
-
-        /**
-         * @param near {@code true} if near cache should be started.
-         * @param name Name for near cache.
-         * @param cfg Cache XML configuration.
-         */
-        public VisorCacheStartArg(boolean near, String name, String cfg) {
-            this.near = near;
-            this.name = name;
-            this.cfg = cfg;
-        }
-
-        /**
-         * @return {@code true} if near cache should be started.
-         */
-        public boolean near() {
-            return near;
-        }
-
-        /**
-         * @return Name for near cache.
-         */
-        public String name() {
-            return name;
-        }
-
-        /**
-         * @return Cache XML configuration.
-         */
-        public String configuration() {
-            return cfg;
-        }
-    }
-
-    /**
      * Job that start cache or near cache with specified configuration.
      */
     private static class VisorCacheStartJob extends VisorJob<VisorCacheStartArg, Void> {
@@ -131,15 +79,15 @@ public class VisorCacheStartTask extends
 
         /** {@inheritDoc} */
         @Override protected Void run(VisorCacheStartArg arg) throws IgniteException {
-            String cfg = arg.configuration();
+            String cfg = arg.getConfiguration();
 
             assert !F.isEmpty(cfg);
 
             try (ByteArrayInputStream bais = new ByteArrayInputStream(cfg.getBytes())) {
-                if (arg.near) {
+                if (arg.isNear()) {
                     NearCacheConfiguration nearCfg = Ignition.loadSpringBean(bais, "nearCacheConfiguration");
 
-                    ignite.getOrCreateNearCache(VisorTaskUtils.unescapeName(arg.name()), nearCfg);
+                    ignite.getOrCreateNearCache(VisorTaskUtils.unescapeName(arg.getName()), nearCfg);
                 }
                 else {
                     CacheConfiguration cacheCfg = Ignition.loadSpringBean(bais, "cacheConfiguration");


[03/11] ignite git commit: IGNITE-4988 Cleanup and refactor VisorXxx tasks and DTO for ignite-2.0

Posted by ak...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryTask.java
index d996f6c..303e6b6 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryTask.java
@@ -17,16 +17,35 @@
 
 package org.apache.ignite.internal.visor.query;
 
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.UUID;
+import javax.cache.Cache;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.cache.query.QueryCursor;
+import org.apache.ignite.cache.query.ScanQuery;
+import org.apache.ignite.cache.query.SqlFieldsQuery;
+import org.apache.ignite.internal.processors.query.GridQueryFieldMetadata;
 import org.apache.ignite.internal.processors.task.GridInternal;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorEither;
+import org.apache.ignite.internal.visor.VisorJob;
 import org.apache.ignite.internal.visor.VisorOneNodeTask;
 import org.apache.ignite.internal.visor.util.VisorExceptionWrapper;
-import org.apache.ignite.lang.IgniteBiTuple;
+import org.apache.ignite.lang.IgniteBiPredicate;
+
+import static org.apache.ignite.internal.visor.query.VisorQueryUtils.SQL_QRY_NAME;
+import static org.apache.ignite.internal.visor.query.VisorQueryUtils.fetchSqlQueryRows;
+import static org.apache.ignite.internal.visor.query.VisorQueryUtils.scheduleResultSetHolderRemoval;
 
 /**
- * Task for execute SCAN or SQL query and get first page of results.
+ * Task for execute SQL fields query and get first page of results.
  */
 @GridInternal
-public class VisorQueryTask extends VisorOneNodeTask<VisorQueryArg, IgniteBiTuple<? extends VisorExceptionWrapper, VisorQueryResultEx>> {
+public class VisorQueryTask extends VisorOneNodeTask<VisorQueryArg, VisorEither<VisorQueryResult>> {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -34,4 +53,97 @@ public class VisorQueryTask extends VisorOneNodeTask<VisorQueryArg, IgniteBiTupl
     @Override protected VisorQueryJob job(VisorQueryArg arg) {
         return new VisorQueryJob(arg, debug);
     }
-}
\ No newline at end of file
+
+    /**
+     * Job for execute SCAN or SQL query and get first page of results.
+     */
+    private static class VisorQueryJob extends VisorJob<VisorQueryArg, VisorEither<VisorQueryResult>> {
+        /** */
+        private static final long serialVersionUID = 0L;
+
+        /**
+         * Create job with specified argument.
+         *
+         * @param arg Job argument.
+         * @param debug Debug flag.
+         */
+        private VisorQueryJob(VisorQueryArg arg, boolean debug) {
+            super(arg, debug);
+        }
+
+        /**
+         * Execute scan query.
+         *
+         * @param c Cache to scan.
+         * @param arg Job argument with query parameters.
+         * @return Query cursor.
+         */
+        private QueryCursor<Cache.Entry<Object, Object>> scan(IgniteCache<Object, Object> c, VisorQueryArg arg,
+            IgniteBiPredicate<Object, Object> filter) {
+            ScanQuery<Object, Object> qry = new ScanQuery<>(filter);
+            qry.setPageSize(arg.getPageSize());
+            qry.setLocal(arg.isLocal());
+
+            return c.withKeepBinary().query(qry);
+        }
+
+        /** {@inheritDoc} */
+        @Override protected VisorEither<VisorQueryResult> run(final VisorQueryArg arg) {
+            try {
+                IgniteCache<Object, Object> c = ignite.context().cache().jcache(arg.getCacheName());
+                UUID nid = ignite.localNode().id();
+
+                SqlFieldsQuery qry = new SqlFieldsQuery(arg.getQueryText());
+                qry.setPageSize(arg.getPageSize());
+                qry.setLocal(arg.isLocal());
+                qry.setDistributedJoins(arg.isDistributedJoins());
+                qry.setEnforceJoinOrder(arg.isEnforceJoinOrder());
+
+                long start = U.currentTimeMillis();
+
+                VisorQueryCursor<List<?>> cur = new VisorQueryCursor<>(c.withKeepBinary().query(qry));
+
+                Collection<GridQueryFieldMetadata> meta = cur.fieldsMeta();
+
+                if (meta == null)
+                    return new VisorEither<>(
+                        new VisorExceptionWrapper(new SQLException("Fail to execute query. No metadata available.")));
+                else {
+                    List<VisorQueryField> names = new ArrayList<>(meta.size());
+
+                    for (GridQueryFieldMetadata col : meta)
+                        names.add(new VisorQueryField(col.schemaName(), col.typeName(),
+                            col.fieldName(), col.fieldTypeName()));
+
+                    List<Object[]> rows = fetchSqlQueryRows(cur, arg.getPageSize());
+
+                    // Query duration + fetch duration.
+                    long duration = U.currentTimeMillis() - start;
+
+                    boolean hasNext = cur.hasNext();
+
+                    // Generate query ID to store query cursor in node local storage.
+                    String qryId = SQL_QRY_NAME + "-" + UUID.randomUUID();
+
+                    if (hasNext) {
+                        ignite.cluster().<String, VisorQueryCursor<List<?>>>nodeLocalMap().put(qryId, cur);
+
+                        scheduleResultSetHolderRemoval(qryId, ignite);
+                    }
+                    else
+                        cur.close();
+
+                    return new VisorEither<>(new VisorQueryResult(nid, qryId, names, rows, hasNext, duration));
+                }
+            }
+            catch (Throwable e) {
+                return new VisorEither<>(new VisorExceptionWrapper(e));
+            }
+        }
+
+        /** {@inheritDoc} */
+        @Override public String toString() {
+            return S.toString(VisorQueryJob.class, this);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryUtils.java
index 5faeac0..9a0262d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryUtils.java
@@ -21,14 +21,16 @@ import java.math.BigDecimal;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.Date;
 import java.util.List;
+import java.util.concurrent.ConcurrentMap;
 import javax.cache.Cache;
 import org.apache.ignite.binary.BinaryObject;
 import org.apache.ignite.binary.BinaryObjectException;
 import org.apache.ignite.binary.BinaryType;
+import org.apache.ignite.internal.IgniteEx;
 import org.apache.ignite.internal.binary.BinaryObjectEx;
+import org.apache.ignite.internal.processors.timeout.GridTimeoutObjectAdapter;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.SB;
@@ -46,17 +48,8 @@ public class VisorQueryUtils {
     /** Prefix for node local key for SCAN queries. */
     public static final String SCAN_QRY_NAME = "VISOR_SCAN_QUERY";
 
-    /** Prefix for node local key for SCAN near queries. */
-    public static final String SCAN_NEAR_CACHE = "VISOR_SCAN_NEAR_CACHE";
-
-    /** Prefix for node local key for SCAN near queries. */
-    public static final String SCAN_CACHE_WITH_FILTER = "VISOR_SCAN_CACHE_WITH_FILTER";
-
-    /** Prefix for node local key for SCAN near queries. */
-    public static final String SCAN_CACHE_WITH_FILTER_CASE_SENSITIVE = "VISOR_SCAN_CACHE_WITH_FILTER_CASE_SENSITIVE";
-
     /** Columns for SCAN queries. */
-    public static final Collection<VisorQueryField> SCAN_COL_NAMES = Arrays.asList(
+    public static final List<VisorQueryField> SCAN_COL_NAMES = Arrays.asList(
         new VisorQueryField(null, null, "Key Class", ""), new VisorQueryField(null, null, "Key", ""),
         new VisorQueryField(null, null, "Value Class", ""), new VisorQueryField(null, null, "Value", "")
     );
@@ -264,4 +257,32 @@ public class VisorQueryUtils {
 
         return rows;
     }
+
+    /**
+     * @param qryId Unique query result id.
+     */
+    public static void scheduleResultSetHolderRemoval(final String qryId, final IgniteEx ignite) {
+        ignite.context().timeout().addTimeoutObject(new GridTimeoutObjectAdapter(RMV_DELAY) {
+            @Override public void onTimeout() {
+                ConcurrentMap<String, VisorQueryCursor> storage = ignite.cluster().nodeLocalMap();
+
+                VisorQueryCursor cur = storage.get(qryId);
+
+                if (cur != null) {
+                    // If cursor was accessed since last scheduling, set access flag to false and reschedule.
+                    if (cur.accessed()) {
+                        cur.accessed(false);
+
+                        scheduleResultSetHolderRemoval(qryId, ignite);
+                    }
+                    else {
+                        // Remove stored cursor otherwise.
+                        storage.remove(qryId);
+
+                        cur.close();
+                    }
+                }
+            }
+        });
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorRunningQueriesCollectorTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorRunningQueriesCollectorTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorRunningQueriesCollectorTask.java
new file mode 100644
index 0000000..a267f06
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorRunningQueriesCollectorTask.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.query;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import org.apache.ignite.IgniteException;
+import org.apache.ignite.compute.ComputeJobResult;
+import org.apache.ignite.internal.processors.query.GridRunningQueryInfo;
+import org.apache.ignite.internal.processors.task.GridInternal;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorJob;
+import org.apache.ignite.internal.visor.VisorMultiNodeTask;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Task to collect currently running queries.
+ */
+@GridInternal
+public class VisorRunningQueriesCollectorTask extends VisorMultiNodeTask<Long, Map<UUID, Collection<VisorRunningQuery>>, Collection<VisorRunningQuery>> {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** {@inheritDoc} */
+    @Override protected VisorCollectRunningQueriesJob job(Long arg) {
+        return new VisorCollectRunningQueriesJob(arg, debug);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable @Override protected Map<UUID, Collection<VisorRunningQuery>> reduce0(List<ComputeJobResult> results) throws IgniteException {
+        Map<UUID, Collection<VisorRunningQuery>> map = new HashMap<>();
+
+        for (ComputeJobResult res : results)
+            if (res.getException() == null) {
+                Collection<VisorRunningQuery> queries = res.getData();
+
+                map.put(res.getNode().id(), queries);
+            }
+
+        return map;
+    }
+
+    /**
+     * Job to collect currently running queries from node.
+     */
+    private static class VisorCollectRunningQueriesJob extends VisorJob<Long, Collection<VisorRunningQuery>> {
+        /** */
+        private static final long serialVersionUID = 0L;
+
+        /**
+         * Create job with specified argument.
+         *
+         * @param arg Job argument.
+         * @param debug Flag indicating whether debug information should be printed into node log.
+         */
+        protected VisorCollectRunningQueriesJob(@Nullable Long arg, boolean debug) {
+            super(arg, debug);
+        }
+
+        /** {@inheritDoc} */
+        @Override protected Collection<VisorRunningQuery> run(@Nullable Long duration) throws IgniteException {
+            Collection<GridRunningQueryInfo> queries = ignite.context().query()
+                .runningQueries(duration != null ? duration : 0);
+
+            Collection<VisorRunningQuery> res = new ArrayList<>(queries.size());
+
+            long curTime = U.currentTimeMillis();
+
+            for (GridRunningQueryInfo qry : queries)
+                res.add(new VisorRunningQuery(qry.id(), qry.query(), qry.queryType(), qry.cache(),
+                    qry.startTime(), curTime - qry.startTime(),
+                    qry.cancelable(), qry.local()));
+
+            return res;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorRunningQuery.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorRunningQuery.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorRunningQuery.java
index fc6bc7a..1864718 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorRunningQuery.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorRunningQuery.java
@@ -17,13 +17,18 @@
 
 package org.apache.ignite.internal.visor.query;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.apache.ignite.internal.processors.cache.query.GridCacheQueryType;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 /**
  * Descriptor of running query.
  */
-public class VisorRunningQuery implements Serializable {
+public class VisorRunningQuery extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -52,6 +57,15 @@ public class VisorRunningQuery implements Serializable {
     private boolean loc;
 
     /**
+     * Default constructor.
+     */
+    public VisorRunningQuery() {
+        // No-op.
+    }
+
+    /**
+     * Construct data transfer object for running query information.
+     *
      * @param id Query ID.
      * @param qry Query text.
      * @param qryType Query type.
@@ -129,4 +143,33 @@ public class VisorRunningQuery implements Serializable {
     public boolean isLocal() {
         return loc;
     }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeLong(id);
+        U.writeString(out, qry);
+        U.writeEnum(out, qryType);
+        U.writeString(out, cache);
+        out.writeLong(startTime);
+        out.writeLong(duration);
+        out.writeBoolean(cancellable);
+        out.writeBoolean(loc);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        id = in.readLong();
+        qry = U.readString(in);
+        qryType = GridCacheQueryType.fromOrdinal(in.readByte());
+        cache = U.readString(in);
+        startTime = in.readLong();
+        duration = in.readLong();
+        cancellable = in.readBoolean();
+        loc = in.readBoolean();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorRunningQuery.class, this);
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorScanQueryArg.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorScanQueryArg.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorScanQueryArg.java
new file mode 100644
index 0000000..cc12ac5
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorScanQueryArg.java
@@ -0,0 +1,157 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.query;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Arguments for {@link VisorScanQueryTask}.
+ */
+public class VisorScanQueryArg extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Cache name for query. */
+    private String cacheName;
+
+    /** Filter text. */
+    private String filter;
+
+    /** Filter is regular expression */
+    private boolean regEx;
+
+    /** Case sensitive filtration */
+    private boolean caseSensitive;
+
+    /** Scan of near cache */
+    private boolean near;
+
+    /** Flag whether to execute query locally. */
+    private boolean loc;
+
+    /** Result batch size. */
+    private int pageSize;
+
+    /**
+     * Default constructor.
+     */
+    public VisorScanQueryArg() {
+        // No-op.
+    }
+
+    /**
+     * @param cacheName Cache name for query.
+     * @param filter Filter text.
+     * @param regEx Filter is regular expression.
+     * @param caseSensitive Case sensitive filtration.
+     * @param near Scan near cache.
+     * @param loc Flag whether to execute query locally.
+     * @param pageSize Result batch size.
+     */
+    public VisorScanQueryArg(String cacheName, String filter, boolean regEx, boolean caseSensitive, boolean near,
+        boolean loc, int pageSize) {
+        this.cacheName = cacheName;
+        this.filter = filter;
+        this.regEx = regEx;
+        this.caseSensitive = caseSensitive;
+        this.near = near;
+        this.loc = loc;
+        this.pageSize = pageSize;
+    }
+
+    /**
+     * @return Cache name.
+     */
+    public String getCacheName() {
+        return cacheName;
+    }
+
+    /**
+     * @return Filter is regular expression.
+     */
+    public boolean isRegEx() {
+        return regEx;
+    }
+
+    /**
+     * @return Filter.
+     */
+    public String getFilter() {
+        return filter;
+    }
+
+    /**
+     * @return Case sensitive filtration.
+     */
+    public boolean isCaseSensitive() {
+        return caseSensitive;
+    }
+
+    /**
+     * @return Scan of near cache.
+     */
+    public boolean isNear() {
+        return near;
+    }
+
+    /**
+     * @return {@code true} if query should be executed locally.
+     */
+    public boolean isLocal() {
+        return loc;
+    }
+
+    /**
+     * @return Page size.
+     */
+    public int getPageSize() {
+        return pageSize;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, cacheName);
+        U.writeString(out, filter);
+        out.writeBoolean(regEx);
+        out.writeBoolean(caseSensitive);
+        out.writeBoolean(near);
+        out.writeBoolean(loc);
+        out.writeInt(pageSize);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        cacheName = U.readString(in);
+        filter = U.readString(in);
+        regEx = in.readBoolean();
+        caseSensitive = in.readBoolean();
+        near = in.readBoolean();
+        loc = in.readBoolean();
+        pageSize = in.readInt();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorScanQueryArg.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorScanQueryTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorScanQueryTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorScanQueryTask.java
new file mode 100644
index 0000000..b8173ba
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorScanQueryTask.java
@@ -0,0 +1,185 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.query;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.UUID;
+import javax.cache.Cache;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.cache.CachePeekMode;
+import org.apache.ignite.cache.query.QueryCursor;
+import org.apache.ignite.cache.query.ScanQuery;
+import org.apache.ignite.internal.processors.task.GridInternal;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorEither;
+import org.apache.ignite.internal.visor.VisorJob;
+import org.apache.ignite.internal.visor.VisorOneNodeTask;
+import org.apache.ignite.internal.visor.util.VisorExceptionWrapper;
+import org.apache.ignite.lang.IgniteBiPredicate;
+
+import static org.apache.ignite.internal.visor.query.VisorQueryUtils.SCAN_COL_NAMES;
+import static org.apache.ignite.internal.visor.query.VisorQueryUtils.SCAN_QRY_NAME;
+import static org.apache.ignite.internal.visor.query.VisorQueryUtils.fetchScanQueryRows;
+import static org.apache.ignite.internal.visor.query.VisorQueryUtils.scheduleResultSetHolderRemoval;
+
+/**
+ * Task for execute SCAN query and get first page of results.
+ */
+@GridInternal
+public class VisorScanQueryTask extends VisorOneNodeTask<VisorScanQueryArg, VisorEither<VisorQueryResult>> {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** {@inheritDoc} */
+    @Override protected VisorScanQueryJob job(VisorScanQueryArg arg) {
+        return new VisorScanQueryJob(arg, debug);
+    }
+
+    /**
+     * Job for execute SCAN query and get first page of results.
+     */
+    private static class VisorScanQueryJob extends VisorJob<VisorScanQueryArg, VisorEither<VisorQueryResult>> {
+        /** */
+        private static final long serialVersionUID = 0L;
+
+        /**
+         * Create job with specified argument.
+         *
+         * @param arg Job argument.
+         * @param debug Debug flag.
+         */
+        private VisorScanQueryJob(VisorScanQueryArg arg, boolean debug) {
+            super(arg, debug);
+        }
+
+        /**
+         * Execute scan query.
+         *
+         * @param c Cache to scan.
+         * @param arg Job argument with query parameters.
+         * @return Query cursor.
+         */
+        private QueryCursor<Cache.Entry<Object, Object>> scan(IgniteCache<Object, Object> c, VisorScanQueryArg arg,
+            IgniteBiPredicate<Object, Object> filter) {
+            ScanQuery<Object, Object> qry = new ScanQuery<>(filter);
+            qry.setPageSize(arg.getPageSize());
+            qry.setLocal(arg.isLocal());
+
+            return c.withKeepBinary().query(qry);
+        }
+
+        /**
+         * Scan near cache.
+         *
+         * @param c Cache to scan near entries.
+         * @return Cache entries iterator wrapped with query cursor.
+         */
+        private QueryCursor<Cache.Entry<Object, Object>> near(IgniteCache<Object, Object> c) {
+            return new VisorNearCacheCursor<>(c.localEntries(CachePeekMode.NEAR).iterator());
+        }
+
+        /** {@inheritDoc} */
+        @Override protected VisorEither<VisorQueryResult> run(final VisorScanQueryArg arg) {
+            try {
+                IgniteCache<Object, Object> c = ignite.context().cache().jcache(arg.getCacheName());
+                UUID nid = ignite.localNode().id();
+
+                String filterText = arg.getFilter();
+
+                long start = U.currentTimeMillis();
+
+                IgniteBiPredicate<Object, Object> filter = null;
+
+                if (!F.isEmpty(filterText))
+                    filter = new VisorQueryScanRegexFilter(arg.isCaseSensitive(), arg.isRegEx(), filterText);
+
+                VisorQueryCursor<Cache.Entry<Object, Object>> cur =
+                    new VisorQueryCursor<>(arg.isNear() ? near(c) : scan(c, arg, filter));
+
+                List<Object[]> rows = fetchScanQueryRows(cur, arg.getPageSize());
+
+                long duration = U.currentTimeMillis() - start; // Scan duration + fetch duration.
+
+                boolean hasNext = cur.hasNext();
+
+                // Generate query ID to store query cursor in node local storage.
+                String qryId = SCAN_QRY_NAME + "-" + UUID.randomUUID();
+
+                if (hasNext) {
+                    ignite.cluster().<String, VisorQueryCursor>nodeLocalMap().put(qryId, cur);
+
+                    scheduleResultSetHolderRemoval(qryId, ignite);
+                }
+                else
+                    cur.close();
+
+                return new VisorEither<>(new VisorQueryResult(nid, qryId, SCAN_COL_NAMES, rows, hasNext,
+                    duration));
+            }
+            catch (Throwable e) {
+                return new VisorEither<>(new VisorExceptionWrapper(e));
+            }
+        }
+
+        /** {@inheritDoc} */
+        @Override public String toString() {
+            return S.toString(VisorScanQueryJob.class, this);
+        }
+
+        /**
+         * Wrapper for cache iterator to behave like {@link QueryCursor}.
+         */
+        private static class VisorNearCacheCursor<T> implements QueryCursor<T> {
+            /** Wrapped iterator.  */
+            private final Iterator<T> it;
+
+            /**
+             * Wrapping constructor.
+             *
+             * @param it Near cache iterator to wrap.
+             */
+            private VisorNearCacheCursor(Iterator<T> it) {
+                this.it = it;
+            }
+
+            /** {@inheritDoc} */
+            @Override public List<T> getAll() {
+                List<T> all = new ArrayList<>();
+
+                while(it.hasNext())
+                    all.add(it.next());
+
+                return all;
+            }
+
+            /** {@inheritDoc} */
+            @Override public void close() {
+                // Nothing to close.
+            }
+
+            /** {@inheritDoc} */
+            @Override public Iterator<T> iterator() {
+                return it;
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/service/VisorServiceDescriptor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/service/VisorServiceDescriptor.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/service/VisorServiceDescriptor.java
index 26f5c10..4cfd150 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/service/VisorServiceDescriptor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/service/VisorServiceDescriptor.java
@@ -17,17 +17,21 @@
 
 package org.apache.ignite.internal.visor.service;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.Map;
 import java.util.UUID;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 import org.apache.ignite.internal.visor.util.VisorTaskUtils;
 import org.apache.ignite.services.ServiceDescriptor;
 
 /**
  * Data transfer object for {@link ServiceDescriptor} object.
  */
-public class VisorServiceDescriptor implements Serializable {
+public class VisorServiceDescriptor extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -65,6 +69,7 @@ public class VisorServiceDescriptor implements Serializable {
     /**
      * Create task result with given parameters
      *
+     * @param srvc Service descriptor to transfer.
      */
     public VisorServiceDescriptor(ServiceDescriptor srvc) {
         name = srvc.name();
@@ -133,6 +138,28 @@ public class VisorServiceDescriptor implements Serializable {
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, name);
+        U.writeString(out, srvcCls);
+        out.writeInt(totalCnt);
+        out.writeInt(maxPerNodeCnt);
+        U.writeString(out, cacheName);
+        U.writeUuid(out, originNodeId);
+        U.writeMap(out, topSnapshot);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        name = U.readString(in);
+        srvcCls = U.readString(in);
+        totalCnt = in.readInt();
+        maxPerNodeCnt = in.readInt();
+        cacheName = U.readString(in);
+        originNodeId = U.readUuid(in);
+        topSnapshot = U.readMap(in);
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorServiceDescriptor.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/util/VisorTaskUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/util/VisorTaskUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/util/VisorTaskUtils.java
index e1cd7cf..897ac89 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/util/VisorTaskUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/util/VisorTaskUtils.java
@@ -52,7 +52,6 @@ import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.cache.eviction.EvictionPolicy;
 import org.apache.ignite.cache.eviction.fifo.FifoEvictionPolicyMBean;
 import org.apache.ignite.cache.eviction.lru.LruEvictionPolicyMBean;
-import org.apache.ignite.cache.eviction.sorted.SortedEvictionPolicyMBean;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.events.Event;
 import org.apache.ignite.internal.processors.igfs.IgfsEx;
@@ -66,6 +65,7 @@ import org.apache.ignite.internal.visor.file.VisorFileBlock;
 import org.apache.ignite.internal.visor.log.VisorLogFile;
 import org.apache.ignite.lang.IgniteClosure;
 import org.apache.ignite.lang.IgnitePredicate;
+import org.apache.ignite.spi.eventstorage.NoopEventStorageSpi;
 import org.jetbrains.annotations.Nullable;
 
 import static java.lang.System.getProperty;
@@ -138,7 +138,7 @@ public class VisorTaskUtils {
     /** Comparator for log files by last modified date. */
     private static final Comparator<VisorLogFile> LAST_MODIFIED = new Comparator<VisorLogFile>() {
         @Override public int compare(VisorLogFile f1, VisorLogFile f2) {
-            return Long.compare(f2.lastModified(), f1.lastModified());
+            return Long.compare(f2.getLastModified(), f1.getLastModified());
         }
     };
 
@@ -255,7 +255,7 @@ public class VisorTaskUtils {
                     sb.append(", ");
             }
 
-            sb.append("]");
+            sb.append(']');
 
             return sb.toString();
         }
@@ -290,6 +290,26 @@ public class VisorTaskUtils {
     }
 
     /**
+     * Compact classes names.
+
+     * @param clss Classes to compact.
+     * @return Compacted string.
+     */
+    @Nullable public static List<String> compactClasses(Class<?>[] clss) {
+        if (clss == null)
+            return null;
+
+        int len = clss.length;
+
+        List<String> res = new ArrayList<>(len);
+
+        for (Class<?> cls: clss)
+            res.add(U.compact(cls.getName()));
+
+        return res;
+    }
+
+    /**
      * Joins array elements to string.
      *
      * @param arr Array.
@@ -417,7 +437,7 @@ public class VisorTaskUtils {
      * @param evtMapper Closure to map grid events to Visor data transfer objects.
      * @return Collections of node events
      */
-    public static Collection<VisorGridEvent> collectEvents(Ignite ignite, String evtOrderKey, String evtThrottleCntrKey,
+    public static List<VisorGridEvent> collectEvents(Ignite ignite, String evtOrderKey, String evtThrottleCntrKey,
         int[] evtTypes, IgniteClosure<Event, VisorGridEvent> evtMapper) {
         assert ignite != null;
         assert evtTypes != null && evtTypes.length > 0;
@@ -449,7 +469,9 @@ public class VisorTaskUtils {
             }
         };
 
-        Collection<Event> evts = ignite.events().localQuery(p, evtTypes);
+        Collection<Event> evts = ignite.configuration().getEventStorageSpi() instanceof NoopEventStorageSpi
+            ? Collections.<Event>emptyList()
+            : ignite.events().localQuery(p, evtTypes);
 
         // Update latest order in node local, if not empty.
         if (!evts.isEmpty()) {
@@ -464,7 +486,7 @@ public class VisorTaskUtils {
 
         boolean lost = !lastFound.get() && throttle == 0;
 
-        Collection<VisorGridEvent> res = new ArrayList<>(evts.size() + (lost ? 1 : 0));
+        List<VisorGridEvent> res = new ArrayList<>(evts.size() + (lost ? 1 : 0));
 
         if (lost)
             res.add(new VisorGridEventsLost(ignite.cluster().localNode().id()));
@@ -630,6 +652,7 @@ public class VisorTaskUtils {
                 raf.seek(pos);
 
                 byte[] buf = new byte[toRead];
+
                 int cntRead = raf.read(buf, 0, toRead);
 
                 if (cntRead != toRead)
@@ -681,9 +704,6 @@ public class VisorTaskUtils {
         if (plc instanceof FifoEvictionPolicyMBean)
             return ((FifoEvictionPolicyMBean)plc).getMaxSize();
 
-        if (plc instanceof SortedEvictionPolicyMBean)
-            return ((SortedEvictionPolicyMBean)plc).getMaxSize();
-
         return null;
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermissionSet.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermissionSet.java b/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermissionSet.java
index 9961501..2415fad 100644
--- a/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermissionSet.java
+++ b/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermissionSet.java
@@ -20,7 +20,6 @@ package org.apache.ignite.plugin.security;
 import java.io.Serializable;
 import java.util.Collection;
 import java.util.Map;
-import org.apache.ignite.internal.LessNamingBean;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -32,7 +31,7 @@ import org.jetbrains.annotations.Nullable;
  * Property {@link #defaultAllowAll()} specifies whether to allow or deny
  * cache and task operations if they were not explicitly specified.
  */
-public interface SecurityPermissionSet extends Serializable, LessNamingBean {
+public interface SecurityPermissionSet extends Serializable {
     /**
      * Flag indicating whether to allow or deny cache and task operations
      * if they were not explicitly specified.

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/plugin/security/SecuritySubject.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/security/SecuritySubject.java b/modules/core/src/main/java/org/apache/ignite/plugin/security/SecuritySubject.java
index b4005ea..66e3c7c 100644
--- a/modules/core/src/main/java/org/apache/ignite/plugin/security/SecuritySubject.java
+++ b/modules/core/src/main/java/org/apache/ignite/plugin/security/SecuritySubject.java
@@ -20,12 +20,11 @@ package org.apache.ignite.plugin.security;
 import java.io.Serializable;
 import java.net.InetSocketAddress;
 import java.util.UUID;
-import org.apache.ignite.internal.LessNamingBean;
 
 /**
  * Security subject representing authenticated node with a set of permissions.
  */
-public interface SecuritySubject extends Serializable, LessNamingBean {
+public interface SecuritySubject extends Serializable {
     /**
      * Gets subject ID.
      *

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/plugin/segmentation/SegmentationPolicy.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/segmentation/SegmentationPolicy.java b/modules/core/src/main/java/org/apache/ignite/plugin/segmentation/SegmentationPolicy.java
index 69ec1ae..3c0f69e 100644
--- a/modules/core/src/main/java/org/apache/ignite/plugin/segmentation/SegmentationPolicy.java
+++ b/modules/core/src/main/java/org/apache/ignite/plugin/segmentation/SegmentationPolicy.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.plugin.segmentation;
 
 import org.apache.ignite.configuration.IgniteConfiguration;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * Policy that defines how node will react on topology segmentation. Note that default
@@ -45,5 +46,18 @@ public enum SegmentationPolicy {
      * {@link org.apache.ignite.events.EventType#EVT_NODE_SEGMENTED} event and it is up to user to
      * implement logic to handle this event.
      */
-    NOOP
-}
\ No newline at end of file
+    NOOP;
+
+    /** Enumerated values. */
+    private static final SegmentationPolicy[] VALS = values();
+
+    /**
+     * Efficiently gets enumerated value from its ordinal.
+     *
+     * @param ord Ordinal value.
+     * @return Enumerated value or {@code null} if ordinal out of range.
+     */
+    @Nullable public static SegmentationPolicy fromOrdinal(int ord) {
+        return ord >= 0 && ord < VALS.length ? VALS[ord] : null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/resources/META-INF/classnames.properties
----------------------------------------------------------------------
diff --git a/modules/core/src/main/resources/META-INF/classnames.properties b/modules/core/src/main/resources/META-INF/classnames.properties
index 53550ff..ebd28d8 100644
--- a/modules/core/src/main/resources/META-INF/classnames.properties
+++ b/modules/core/src/main/resources/META-INF/classnames.properties
@@ -37,13 +37,11 @@ org.apache.ignite.cache.CacheExistsException
 org.apache.ignite.cache.CacheInterceptor
 org.apache.ignite.cache.CacheInterceptorAdapter
 org.apache.ignite.cache.CacheKeyConfiguration
-org.apache.ignite.cache.CacheMemoryMode
 org.apache.ignite.cache.CacheMode
 org.apache.ignite.cache.CachePartialUpdateException
 org.apache.ignite.cache.CachePeekMode
 org.apache.ignite.cache.CacheRebalanceMode
 org.apache.ignite.cache.CacheServerNotFoundException
-org.apache.ignite.cache.CacheTypeFieldMetadata
 org.apache.ignite.cache.CacheWriteSynchronizationMode
 org.apache.ignite.cache.PartitionLossPolicy
 org.apache.ignite.cache.QueryEntity
@@ -53,11 +51,6 @@ org.apache.ignite.cache.affinity.AffinityFunction
 org.apache.ignite.cache.affinity.AffinityKey
 org.apache.ignite.cache.affinity.AffinityKeyMapper
 org.apache.ignite.cache.affinity.AffinityUuid
-org.apache.ignite.cache.affinity.fair.FairAffinityFunction
-org.apache.ignite.cache.affinity.fair.FairAffinityFunction$1
-org.apache.ignite.cache.affinity.fair.FairAffinityFunction$FullAssignmentMap$1
-org.apache.ignite.cache.affinity.fair.FairAffinityFunction$FullAssignmentMap$2
-org.apache.ignite.cache.affinity.fair.FairAffinityFunction$PartitionSetComparator
 org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction
 org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction$HashComparator
 org.apache.ignite.cache.eviction.AbstractEvictionPolicy
@@ -140,6 +133,7 @@ org.apache.ignite.compute.gridify.aop.GridifyDefaultTask
 org.apache.ignite.configuration.CacheConfiguration
 org.apache.ignite.configuration.CacheConfiguration$IgniteAllNodesPredicate
 org.apache.ignite.configuration.CollectionConfiguration
+org.apache.ignite.configuration.DataPageEvictionMode
 org.apache.ignite.configuration.DeploymentMode
 org.apache.ignite.configuration.IgniteReflectionFactory
 org.apache.ignite.configuration.MemoryConfiguration
@@ -329,6 +323,7 @@ org.apache.ignite.internal.managers.eventstorage.GridEventStorageMessage
 org.apache.ignite.internal.managers.indexing.GridIndexingManager$1
 org.apache.ignite.internal.managers.loadbalancer.GridLoadBalancerAdapter
 org.apache.ignite.internal.managers.loadbalancer.GridLoadBalancerManager$1
+org.apache.ignite.internal.marshaller.optimized.OptimizedFieldType
 org.apache.ignite.internal.mem.OutOfMemoryException
 org.apache.ignite.internal.pagemem.impl.PageMemoryNoStoreImpl$Segment
 org.apache.ignite.internal.pagemem.snapshot.SnapshotFinishedMessage
@@ -461,19 +456,10 @@ org.apache.ignite.internal.processors.cache.GridCacheContext$4
 org.apache.ignite.internal.processors.cache.GridCacheContext$5
 org.apache.ignite.internal.processors.cache.GridCacheDefaultAffinityKeyMapper
 org.apache.ignite.internal.processors.cache.GridCacheDefaultAffinityKeyMapper$1
-org.apache.ignite.internal.processors.cache.GridCacheDefaultAffinityKeyMapper$2
 org.apache.ignite.internal.processors.cache.GridCacheDeploymentManager$3
 org.apache.ignite.internal.processors.cache.GridCacheEntryInfo
 org.apache.ignite.internal.processors.cache.GridCacheEntryRedeployException
 org.apache.ignite.internal.processors.cache.GridCacheEntryRemovedException
-org.apache.ignite.internal.processors.cache.GridCacheEvictionManager$2
-org.apache.ignite.internal.processors.cache.GridCacheEvictionManager$3
-org.apache.ignite.internal.processors.cache.GridCacheEvictionManager$5
-org.apache.ignite.internal.processors.cache.GridCacheEvictionManager$6
-org.apache.ignite.internal.processors.cache.GridCacheEvictionManager$7
-org.apache.ignite.internal.processors.cache.GridCacheEvictionManager$EvictionFuture$2
-org.apache.ignite.internal.processors.cache.GridCacheEvictionRequest
-org.apache.ignite.internal.processors.cache.GridCacheEvictionResponse
 org.apache.ignite.internal.processors.cache.GridCacheExplicitLockSpan
 org.apache.ignite.internal.processors.cache.GridCacheExplicitLockSpan$1
 org.apache.ignite.internal.processors.cache.GridCacheFilterFailedException
@@ -491,9 +477,9 @@ org.apache.ignite.internal.processors.cache.GridCacheMessage
 org.apache.ignite.internal.processors.cache.GridCacheMultiTxFuture$1
 org.apache.ignite.internal.processors.cache.GridCacheMvccCandidate
 org.apache.ignite.internal.processors.cache.GridCacheMvccCandidate$Mask
-org.apache.ignite.internal.processors.cache.GridCacheMvccManager$4
 org.apache.ignite.internal.processors.cache.GridCacheMvccManager$5
 org.apache.ignite.internal.processors.cache.GridCacheMvccManager$6
+org.apache.ignite.internal.processors.cache.GridCacheMvccManager$7
 org.apache.ignite.internal.processors.cache.GridCacheMvccManager$FinishLockFuture$1
 org.apache.ignite.internal.processors.cache.GridCacheOperation
 org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$1$1
@@ -627,7 +613,6 @@ org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtGetSingleFutu
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtGetSingleFuture$2
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtGetSingleFuture$3
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtInvalidPartitionException
-org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLocalPartition$1
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLockFuture$1
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLockFuture$2
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLockFuture$3
@@ -701,6 +686,7 @@ org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomic
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$3
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$30
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$31
+org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$32
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$4
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$5
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$6
@@ -889,15 +875,12 @@ org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$8
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$9
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$CacheSqlIndexMetadata
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$CacheSqlMetadata
-org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$CachedResult
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$CachedResult$QueueIterator
-org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$FieldsResult
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$MetadataJob
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$MetadataJob$1
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$MetadataJob$2
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$MetadataJob$3
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$PeekValueExpiryAwareIterator
-org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$QueryResult
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$RequestFutureMap
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$RequestFutureMap$1
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryMetricsAdapter
@@ -939,7 +922,6 @@ org.apache.ignite.internal.processors.cache.store.GridCacheWriteBehindStore$Stor
 org.apache.ignite.internal.processors.cache.store.GridCacheWriteBehindStore$ValueStatus
 org.apache.ignite.internal.processors.cache.transactions.IgniteInternalTx$FinalizationStatus
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter
-org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter$1
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxEntry
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$1
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$10
@@ -1107,7 +1089,6 @@ org.apache.ignite.internal.processors.datastructures.GridCacheLockImpl$Sync
 org.apache.ignite.internal.processors.datastructures.GridCacheLockState
 org.apache.ignite.internal.processors.datastructures.GridCacheQueueAdapter$AddProcessor
 org.apache.ignite.internal.processors.datastructures.GridCacheQueueAdapter$ClearProcessor
-org.apache.ignite.internal.processors.datastructures.GridCacheQueueAdapter$CollocatedItemKey
 org.apache.ignite.internal.processors.datastructures.GridCacheQueueAdapter$PollProcessor
 org.apache.ignite.internal.processors.datastructures.GridCacheQueueAdapter$RemoveProcessor
 org.apache.ignite.internal.processors.datastructures.GridCacheQueueHeader
@@ -1119,7 +1100,6 @@ org.apache.ignite.internal.processors.datastructures.GridCacheSemaphoreImpl$Sync
 org.apache.ignite.internal.processors.datastructures.GridCacheSemaphoreState
 org.apache.ignite.internal.processors.datastructures.GridCacheSetHeader
 org.apache.ignite.internal.processors.datastructures.GridCacheSetHeaderKey
-org.apache.ignite.internal.processors.datastructures.GridCacheSetImpl$CollocatedItemKey
 org.apache.ignite.internal.processors.datastructures.GridCacheSetImpl$SumReducer
 org.apache.ignite.internal.processors.datastructures.GridCacheSetItemKey
 org.apache.ignite.internal.processors.datastructures.GridCacheSetProxy
@@ -1307,7 +1287,6 @@ org.apache.ignite.internal.processors.query.GridQueryProcessor$6
 org.apache.ignite.internal.processors.query.GridQueryProcessor$7
 org.apache.ignite.internal.processors.query.GridQueryProcessor$8
 org.apache.ignite.internal.processors.query.IgniteSQLException
-org.apache.ignite.internal.processors.query.QueryUtils$IndexType
 org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQueryCancelRequest
 org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQueryFailResponse
 org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQueryNextPageRequest
@@ -1415,8 +1394,6 @@ org.apache.ignite.internal.transactions.IgniteTxOptimisticCheckedException
 org.apache.ignite.internal.transactions.IgniteTxRollbackCheckedException
 org.apache.ignite.internal.transactions.IgniteTxTimeoutCheckedException
 org.apache.ignite.internal.util.F0$1
-org.apache.ignite.internal.util.F0$10
-org.apache.ignite.internal.util.F0$11
 org.apache.ignite.internal.util.F0$2
 org.apache.ignite.internal.util.F0$3
 org.apache.ignite.internal.util.F0$4
@@ -1515,7 +1492,6 @@ org.apache.ignite.internal.util.future.GridEmbeddedFuture$AL1
 org.apache.ignite.internal.util.future.GridEmbeddedFuture$AL2
 org.apache.ignite.internal.util.future.GridEmbeddedFuture$AsyncListener1
 org.apache.ignite.internal.util.future.GridEmbeddedFuture$AsyncListener2
-org.apache.ignite.internal.util.future.GridFutureAdapter$ArrayListener
 org.apache.ignite.internal.util.future.GridFutureChainListener
 org.apache.ignite.internal.util.future.IgniteFutureImpl$1
 org.apache.ignite.internal.util.future.IgniteFutureImpl$InternalFutureListener
@@ -1537,78 +1513,6 @@ org.apache.ignite.internal.util.lang.GridAbsClosure
 org.apache.ignite.internal.util.lang.GridAbsClosureX
 org.apache.ignite.internal.util.lang.GridCloseableIterator
 org.apache.ignite.internal.util.lang.GridClosureException
-org.apache.ignite.internal.util.lang.GridFunc$1
-org.apache.ignite.internal.util.lang.GridFunc$10
-org.apache.ignite.internal.util.lang.GridFunc$11
-org.apache.ignite.internal.util.lang.GridFunc$12
-org.apache.ignite.internal.util.lang.GridFunc$13
-org.apache.ignite.internal.util.lang.GridFunc$14
-org.apache.ignite.internal.util.lang.GridFunc$15
-org.apache.ignite.internal.util.lang.GridFunc$16
-org.apache.ignite.internal.util.lang.GridFunc$17
-org.apache.ignite.internal.util.lang.GridFunc$18
-org.apache.ignite.internal.util.lang.GridFunc$19
-org.apache.ignite.internal.util.lang.GridFunc$2
-org.apache.ignite.internal.util.lang.GridFunc$20
-org.apache.ignite.internal.util.lang.GridFunc$21
-org.apache.ignite.internal.util.lang.GridFunc$22
-org.apache.ignite.internal.util.lang.GridFunc$23
-org.apache.ignite.internal.util.lang.GridFunc$24
-org.apache.ignite.internal.util.lang.GridFunc$25
-org.apache.ignite.internal.util.lang.GridFunc$26
-org.apache.ignite.internal.util.lang.GridFunc$27
-org.apache.ignite.internal.util.lang.GridFunc$28
-org.apache.ignite.internal.util.lang.GridFunc$29
-org.apache.ignite.internal.util.lang.GridFunc$3
-org.apache.ignite.internal.util.lang.GridFunc$30
-org.apache.ignite.internal.util.lang.GridFunc$31
-org.apache.ignite.internal.util.lang.GridFunc$32
-org.apache.ignite.internal.util.lang.GridFunc$32$1
-org.apache.ignite.internal.util.lang.GridFunc$33
-org.apache.ignite.internal.util.lang.GridFunc$33$1
-org.apache.ignite.internal.util.lang.GridFunc$35
-org.apache.ignite.internal.util.lang.GridFunc$36
-org.apache.ignite.internal.util.lang.GridFunc$37
-org.apache.ignite.internal.util.lang.GridFunc$38
-org.apache.ignite.internal.util.lang.GridFunc$39
-org.apache.ignite.internal.util.lang.GridFunc$4
-org.apache.ignite.internal.util.lang.GridFunc$40
-org.apache.ignite.internal.util.lang.GridFunc$41
-org.apache.ignite.internal.util.lang.GridFunc$42
-org.apache.ignite.internal.util.lang.GridFunc$43
-org.apache.ignite.internal.util.lang.GridFunc$44
-org.apache.ignite.internal.util.lang.GridFunc$45
-org.apache.ignite.internal.util.lang.GridFunc$46
-org.apache.ignite.internal.util.lang.GridFunc$47
-org.apache.ignite.internal.util.lang.GridFunc$48
-org.apache.ignite.internal.util.lang.GridFunc$49
-org.apache.ignite.internal.util.lang.GridFunc$49$1
-org.apache.ignite.internal.util.lang.GridFunc$49$2
-org.apache.ignite.internal.util.lang.GridFunc$5
-org.apache.ignite.internal.util.lang.GridFunc$50
-org.apache.ignite.internal.util.lang.GridFunc$50$1
-org.apache.ignite.internal.util.lang.GridFunc$50$2
-org.apache.ignite.internal.util.lang.GridFunc$51
-org.apache.ignite.internal.util.lang.GridFunc$51$1
-org.apache.ignite.internal.util.lang.GridFunc$51$2
-org.apache.ignite.internal.util.lang.GridFunc$52
-org.apache.ignite.internal.util.lang.GridFunc$52$1
-org.apache.ignite.internal.util.lang.GridFunc$52$2
-org.apache.ignite.internal.util.lang.GridFunc$53
-org.apache.ignite.internal.util.lang.GridFunc$54
-org.apache.ignite.internal.util.lang.GridFunc$55
-org.apache.ignite.internal.util.lang.GridFunc$56
-org.apache.ignite.internal.util.lang.GridFunc$57
-org.apache.ignite.internal.util.lang.GridFunc$58
-org.apache.ignite.internal.util.lang.GridFunc$59
-org.apache.ignite.internal.util.lang.GridFunc$6
-org.apache.ignite.internal.util.lang.GridFunc$60
-org.apache.ignite.internal.util.lang.GridFunc$61
-org.apache.ignite.internal.util.lang.GridFunc$62
-org.apache.ignite.internal.util.lang.GridFunc$63
-org.apache.ignite.internal.util.lang.GridFunc$7
-org.apache.ignite.internal.util.lang.GridFunc$8
-org.apache.ignite.internal.util.lang.GridFunc$9
 org.apache.ignite.internal.util.lang.GridIterable
 org.apache.ignite.internal.util.lang.GridIterableAdapter
 org.apache.ignite.internal.util.lang.GridIterableAdapter$IteratorWrapper
@@ -1639,9 +1543,57 @@ org.apache.ignite.internal.util.lang.IgniteReducer3
 org.apache.ignite.internal.util.lang.IgniteReducer3X
 org.apache.ignite.internal.util.lang.IgniteReducerX
 org.apache.ignite.internal.util.lang.IgniteSingletonIterator
+org.apache.ignite.internal.util.lang.gridfunc.AlwaysFalsePredicate
+org.apache.ignite.internal.util.lang.gridfunc.AlwaysTruePredicate
+org.apache.ignite.internal.util.lang.gridfunc.AlwaysTrueReducer
+org.apache.ignite.internal.util.lang.gridfunc.AtomicIntegerFactoryCallable
+org.apache.ignite.internal.util.lang.gridfunc.CacheEntryGetValueClosure
+org.apache.ignite.internal.util.lang.gridfunc.CacheEntryHasPeekPredicate
+org.apache.ignite.internal.util.lang.gridfunc.ClusterNodeGetIdClosure
+org.apache.ignite.internal.util.lang.gridfunc.ConcurrentDequeFactoryCallable
+org.apache.ignite.internal.util.lang.gridfunc.ConcurrentHashSetFactoryCallable
+org.apache.ignite.internal.util.lang.gridfunc.ConcurrentMapFactoryCallable
+org.apache.ignite.internal.util.lang.gridfunc.ContainsNodeIdsPredicate
+org.apache.ignite.internal.util.lang.gridfunc.ContainsPredicate
+org.apache.ignite.internal.util.lang.gridfunc.EntryByKeyEvaluationPredicate
+org.apache.ignite.internal.util.lang.gridfunc.EqualsClusterNodeIdPredicate
+org.apache.ignite.internal.util.lang.gridfunc.EqualsUuidPredicate
+org.apache.ignite.internal.util.lang.gridfunc.FlatCollectionWrapper
+org.apache.ignite.internal.util.lang.gridfunc.FlatIterator
+org.apache.ignite.internal.util.lang.gridfunc.HasEqualIdPredicate
+org.apache.ignite.internal.util.lang.gridfunc.HasNotEqualIdPredicate
+org.apache.ignite.internal.util.lang.gridfunc.IdentityClosure
+org.apache.ignite.internal.util.lang.gridfunc.IntSumReducer
+org.apache.ignite.internal.util.lang.gridfunc.IsAllPredicate
+org.apache.ignite.internal.util.lang.gridfunc.IsNotAllPredicate
+org.apache.ignite.internal.util.lang.gridfunc.IsNotNullPredicate
+org.apache.ignite.internal.util.lang.gridfunc.LongSumReducer
+org.apache.ignite.internal.util.lang.gridfunc.MapFactoryCallable
+org.apache.ignite.internal.util.lang.gridfunc.MultipleIterator
+org.apache.ignite.internal.util.lang.gridfunc.NoOpClosure
+org.apache.ignite.internal.util.lang.gridfunc.NotContainsPredicate
+org.apache.ignite.internal.util.lang.gridfunc.NotEqualPredicate
+org.apache.ignite.internal.util.lang.gridfunc.PredicateCollectionView
+org.apache.ignite.internal.util.lang.gridfunc.PredicateMapView
+org.apache.ignite.internal.util.lang.gridfunc.PredicateMapView$1
+org.apache.ignite.internal.util.lang.gridfunc.PredicateSetView
+org.apache.ignite.internal.util.lang.gridfunc.PredicateSetView$1
+org.apache.ignite.internal.util.lang.gridfunc.ReadOnlyCollectionView
+org.apache.ignite.internal.util.lang.gridfunc.ReadOnlyCollectionView$1
+org.apache.ignite.internal.util.lang.gridfunc.ReadOnlyCollectionView2X
+org.apache.ignite.internal.util.lang.gridfunc.ReadOnlyCollectionView2X$1
+org.apache.ignite.internal.util.lang.gridfunc.RunnableWrapperClosure
+org.apache.ignite.internal.util.lang.gridfunc.SetFactoryCallable
+org.apache.ignite.internal.util.lang.gridfunc.StringConcatReducer
+org.apache.ignite.internal.util.lang.gridfunc.ToStringClosure
+org.apache.ignite.internal.util.lang.gridfunc.TransformCollectionView
+org.apache.ignite.internal.util.lang.gridfunc.TransformFilteringIterator
+org.apache.ignite.internal.util.lang.gridfunc.TransformMapView
+org.apache.ignite.internal.util.lang.gridfunc.TransformMapView$1
+org.apache.ignite.internal.util.lang.gridfunc.TransformMapView2
+org.apache.ignite.internal.util.lang.gridfunc.TransformMapView2$1
 org.apache.ignite.internal.util.nio.GridNioEmbeddedFuture$1
 org.apache.ignite.internal.util.nio.GridNioException
-org.apache.ignite.internal.util.nio.GridNioFutureImpl
 org.apache.ignite.internal.util.nio.GridNioMessageTracker
 org.apache.ignite.internal.util.nio.GridNioServer$NioOperation
 org.apache.ignite.internal.util.nio.GridNioServer$RandomBalancer
@@ -1698,32 +1650,42 @@ org.apache.ignite.internal.util.typedef.T4
 org.apache.ignite.internal.util.typedef.T5
 org.apache.ignite.internal.util.typedef.T6
 org.apache.ignite.internal.util.typedef.internal.SB
+org.apache.ignite.internal.visor.VisorDataTransferObject
+org.apache.ignite.internal.visor.VisorEither
 org.apache.ignite.internal.visor.VisorJob
 org.apache.ignite.internal.visor.VisorMultiNodeTask
 org.apache.ignite.internal.visor.VisorOneNodeTask
 org.apache.ignite.internal.visor.VisorTaskArgument
+org.apache.ignite.internal.visor.binary.VisorBinaryMetadata
+org.apache.ignite.internal.visor.binary.VisorBinaryMetadataCollectorTask
+org.apache.ignite.internal.visor.binary.VisorBinaryMetadataCollectorTask$VisorBinaryCollectMetadataJob
+org.apache.ignite.internal.visor.binary.VisorBinaryMetadataCollectorTaskResult
+org.apache.ignite.internal.visor.binary.VisorBinaryMetadataField
 org.apache.ignite.internal.visor.cache.VisorCache
 org.apache.ignite.internal.visor.cache.VisorCacheAffinityConfiguration
 org.apache.ignite.internal.visor.cache.VisorCacheAffinityNodeTask
 org.apache.ignite.internal.visor.cache.VisorCacheAffinityNodeTask$VisorCacheAffinityNodeJob
+org.apache.ignite.internal.visor.cache.VisorCacheAffinityNodeTaskArg
 org.apache.ignite.internal.visor.cache.VisorCacheAggregatedMetrics
 org.apache.ignite.internal.visor.cache.VisorCacheClearTask
-org.apache.ignite.internal.visor.cache.VisorCacheClearTask$VisorCacheClearCallable
 org.apache.ignite.internal.visor.cache.VisorCacheClearTask$VisorCacheClearJob
 org.apache.ignite.internal.visor.cache.VisorCacheClearTask$VisorCacheClearJob$1
-org.apache.ignite.internal.visor.cache.VisorCacheClearTask$VisorCacheSizeCallable
+org.apache.ignite.internal.visor.cache.VisorCacheClearTaskResult
 org.apache.ignite.internal.visor.cache.VisorCacheConfiguration
 org.apache.ignite.internal.visor.cache.VisorCacheConfigurationCollectorJob
 org.apache.ignite.internal.visor.cache.VisorCacheConfigurationCollectorTask
-org.apache.ignite.internal.visor.cache.VisorCacheDefaultConfiguration
 org.apache.ignite.internal.visor.cache.VisorCacheEvictionConfiguration
+org.apache.ignite.internal.visor.cache.VisorCacheJdbcType
+org.apache.ignite.internal.visor.cache.VisorCacheJdbcTypeField
 org.apache.ignite.internal.visor.cache.VisorCacheLoadTask
 org.apache.ignite.internal.visor.cache.VisorCacheLoadTask$VisorCachesLoadJob
+org.apache.ignite.internal.visor.cache.VisorCacheLoadTaskArg
 org.apache.ignite.internal.visor.cache.VisorCacheMetadataTask
 org.apache.ignite.internal.visor.cache.VisorCacheMetadataTask$VisorCacheMetadataJob
 org.apache.ignite.internal.visor.cache.VisorCacheMetrics
 org.apache.ignite.internal.visor.cache.VisorCacheMetricsCollectorTask
 org.apache.ignite.internal.visor.cache.VisorCacheMetricsCollectorTask$VisorCacheMetricsCollectorJob
+org.apache.ignite.internal.visor.cache.VisorCacheMetricsCollectorTaskArg
 org.apache.ignite.internal.visor.cache.VisorCacheNearConfiguration
 org.apache.ignite.internal.visor.cache.VisorCacheNodesTask
 org.apache.ignite.internal.visor.cache.VisorCacheNodesTask$VisorCacheNodesJob
@@ -1731,39 +1693,33 @@ org.apache.ignite.internal.visor.cache.VisorCachePartition
 org.apache.ignite.internal.visor.cache.VisorCachePartitions
 org.apache.ignite.internal.visor.cache.VisorCachePartitionsTask
 org.apache.ignite.internal.visor.cache.VisorCachePartitionsTask$VisorCachePartitionsJob
-org.apache.ignite.internal.visor.cache.VisorCacheQueryConfiguration
-org.apache.ignite.internal.visor.cache.VisorCacheQueryDetailMetrics
-org.apache.ignite.internal.visor.cache.VisorCacheQueryDetailMetricsCollectorTask
-org.apache.ignite.internal.visor.cache.VisorCacheQueryDetailMetricsCollectorTask$VisorCacheQueryDetailMetricsCollectorJob
-org.apache.ignite.internal.visor.cache.VisorCacheQueryMetrics
 org.apache.ignite.internal.visor.cache.VisorCacheRebalanceConfiguration
 org.apache.ignite.internal.visor.cache.VisorCacheRebalanceTask
 org.apache.ignite.internal.visor.cache.VisorCacheRebalanceTask$VisorCachesRebalanceJob
 org.apache.ignite.internal.visor.cache.VisorCacheResetMetricsTask
 org.apache.ignite.internal.visor.cache.VisorCacheResetMetricsTask$VisorCacheResetMetricsJob
-org.apache.ignite.internal.visor.cache.VisorCacheResetQueryDetailMetricsTask
-org.apache.ignite.internal.visor.cache.VisorCacheResetQueryDetailMetricsTask$VisorCacheResetQueryDetailMetricsJob
-org.apache.ignite.internal.visor.cache.VisorCacheResetQueryMetricsTask
-org.apache.ignite.internal.visor.cache.VisorCacheResetQueryMetricsTask$VisorCacheResetQueryMetricsJob
+org.apache.ignite.internal.visor.cache.VisorCacheSqlIndexMetadata
+org.apache.ignite.internal.visor.cache.VisorCacheSqlMetadata
+org.apache.ignite.internal.visor.cache.VisorCacheStartArg
 org.apache.ignite.internal.visor.cache.VisorCacheStartTask
-org.apache.ignite.internal.visor.cache.VisorCacheStartTask$VisorCacheStartArg
 org.apache.ignite.internal.visor.cache.VisorCacheStartTask$VisorCacheStartJob
 org.apache.ignite.internal.visor.cache.VisorCacheStopTask
 org.apache.ignite.internal.visor.cache.VisorCacheStopTask$VisorCacheStopJob
 org.apache.ignite.internal.visor.cache.VisorCacheStoreConfiguration
-org.apache.ignite.internal.visor.cache.VisorCacheTypeFieldMetadata
-org.apache.ignite.internal.visor.cache.VisorCacheTypeMetadata
+org.apache.ignite.internal.visor.cache.VisorPartitionMap
 org.apache.ignite.internal.visor.compute.VisorComputeCancelSessionsTask
 org.apache.ignite.internal.visor.compute.VisorComputeCancelSessionsTask$VisorComputeCancelSessionsJob
 org.apache.ignite.internal.visor.compute.VisorComputeResetMetricsTask
 org.apache.ignite.internal.visor.compute.VisorComputeResetMetricsTask$VisorComputeResetMetricsJob
 org.apache.ignite.internal.visor.compute.VisorComputeToggleMonitoringTask
 org.apache.ignite.internal.visor.compute.VisorComputeToggleMonitoringTask$VisorComputeToggleMonitoringJob
+org.apache.ignite.internal.visor.compute.VisorComputeToggleMonitoringTaskArg
 org.apache.ignite.internal.visor.compute.VisorGatewayTask
 org.apache.ignite.internal.visor.compute.VisorGatewayTask$VisorGatewayJob
 org.apache.ignite.internal.visor.compute.VisorGatewayTask$VisorGatewayJob$1
 org.apache.ignite.internal.visor.debug.VisorThreadDumpTask
 org.apache.ignite.internal.visor.debug.VisorThreadDumpTask$VisorDumpThreadJob
+org.apache.ignite.internal.visor.debug.VisorThreadDumpTaskResult
 org.apache.ignite.internal.visor.debug.VisorThreadInfo
 org.apache.ignite.internal.visor.debug.VisorThreadLockInfo
 org.apache.ignite.internal.visor.debug.VisorThreadMonitorInfo
@@ -1774,11 +1730,12 @@ org.apache.ignite.internal.visor.event.VisorGridEventsLost
 org.apache.ignite.internal.visor.event.VisorGridJobEvent
 org.apache.ignite.internal.visor.event.VisorGridTaskEvent
 org.apache.ignite.internal.visor.file.VisorFileBlock
+org.apache.ignite.internal.visor.file.VisorFileBlockArg
 org.apache.ignite.internal.visor.file.VisorFileBlockTask
-org.apache.ignite.internal.visor.file.VisorFileBlockTask$VisorFileBlockArg
 org.apache.ignite.internal.visor.file.VisorFileBlockTask$VisorFileBlockJob
 org.apache.ignite.internal.visor.file.VisorLatestTextFilesTask
 org.apache.ignite.internal.visor.file.VisorLatestTextFilesTask$VisorLatestTextFilesJob
+org.apache.ignite.internal.visor.file.VisorLatestTextFilesTaskArg
 org.apache.ignite.internal.visor.igfs.VisorIgfs
 org.apache.ignite.internal.visor.igfs.VisorIgfsEndpoint
 org.apache.ignite.internal.visor.igfs.VisorIgfsFormatTask
@@ -1786,6 +1743,7 @@ org.apache.ignite.internal.visor.igfs.VisorIgfsFormatTask$VisorIgfsFormatJob
 org.apache.ignite.internal.visor.igfs.VisorIgfsMetrics
 org.apache.ignite.internal.visor.igfs.VisorIgfsProfilerClearTask
 org.apache.ignite.internal.visor.igfs.VisorIgfsProfilerClearTask$VisorIgfsProfilerClearJob
+org.apache.ignite.internal.visor.igfs.VisorIgfsProfilerClearTaskResult
 org.apache.ignite.internal.visor.igfs.VisorIgfsProfilerEntry
 org.apache.ignite.internal.visor.igfs.VisorIgfsProfilerTask
 org.apache.ignite.internal.visor.igfs.VisorIgfsProfilerTask$VisorIgfsProfilerJob
@@ -1794,11 +1752,13 @@ org.apache.ignite.internal.visor.igfs.VisorIgfsResetMetricsTask
 org.apache.ignite.internal.visor.igfs.VisorIgfsResetMetricsTask$VisorIgfsResetMetricsJob
 org.apache.ignite.internal.visor.igfs.VisorIgfsSamplingStateTask
 org.apache.ignite.internal.visor.igfs.VisorIgfsSamplingStateTask$VisorIgfsSamplingStateJob
+org.apache.ignite.internal.visor.igfs.VisorIgfsSamplingStateTaskArg
 org.apache.ignite.internal.visor.log.VisorLogFile
+org.apache.ignite.internal.visor.log.VisorLogSearchArg
 org.apache.ignite.internal.visor.log.VisorLogSearchResult
 org.apache.ignite.internal.visor.log.VisorLogSearchTask
-org.apache.ignite.internal.visor.log.VisorLogSearchTask$VisorLogSearchArg
 org.apache.ignite.internal.visor.log.VisorLogSearchTask$VisorLogSearchJob
+org.apache.ignite.internal.visor.log.VisorLogSearchTaskResult
 org.apache.ignite.internal.visor.misc.VisorAckTask
 org.apache.ignite.internal.visor.misc.VisorAckTask$VisorAckJob
 org.apache.ignite.internal.visor.misc.VisorChangeGridActiveStateTask
@@ -1828,38 +1788,58 @@ org.apache.ignite.internal.visor.node.VisorNodeDataCollectorTaskResult
 org.apache.ignite.internal.visor.node.VisorNodeEventsCollectorTask
 org.apache.ignite.internal.visor.node.VisorNodeEventsCollectorTask$VisorNodeEventsCollectorJob
 org.apache.ignite.internal.visor.node.VisorNodeEventsCollectorTask$VisorNodeEventsCollectorJob$1
-org.apache.ignite.internal.visor.node.VisorNodeEventsCollectorTask$VisorNodeEventsCollectorTaskArg
+org.apache.ignite.internal.visor.node.VisorNodeEventsCollectorTaskArg
 org.apache.ignite.internal.visor.node.VisorNodeGcTask
 org.apache.ignite.internal.visor.node.VisorNodeGcTask$VisorNodeGcJob
+org.apache.ignite.internal.visor.node.VisorNodeGcTaskResult
 org.apache.ignite.internal.visor.node.VisorNodePingTask
 org.apache.ignite.internal.visor.node.VisorNodePingTask$VisorNodePingJob
+org.apache.ignite.internal.visor.node.VisorNodePingTaskResult
 org.apache.ignite.internal.visor.node.VisorNodeRestartTask
 org.apache.ignite.internal.visor.node.VisorNodeRestartTask$VisorNodesRestartJob
 org.apache.ignite.internal.visor.node.VisorNodeStopTask
 org.apache.ignite.internal.visor.node.VisorNodeStopTask$VisorNodesStopJob
+org.apache.ignite.internal.visor.node.VisorNodeSuppressedErrors
 org.apache.ignite.internal.visor.node.VisorNodeSuppressedErrorsTask
 org.apache.ignite.internal.visor.node.VisorNodeSuppressedErrorsTask$VisorNodeSuppressedErrorsJob
 org.apache.ignite.internal.visor.node.VisorPeerToPeerConfiguration
 org.apache.ignite.internal.visor.node.VisorRestConfiguration
 org.apache.ignite.internal.visor.node.VisorSegmentationConfiguration
+org.apache.ignite.internal.visor.node.VisorSpiDescription
 org.apache.ignite.internal.visor.node.VisorSpisConfiguration
+org.apache.ignite.internal.visor.node.VisorSuppressedError
 org.apache.ignite.internal.visor.node.VisorTransactionConfiguration
-org.apache.ignite.internal.visor.query.VisorCancelQueriesTask
-org.apache.ignite.internal.visor.query.VisorCancelQueriesTask$VisorCancelQueriesJob
-org.apache.ignite.internal.visor.query.VisorCollectRunningQueriesTask
-org.apache.ignite.internal.visor.query.VisorCollectRunningQueriesTask$VisorCollectRunningQueriesJob
 org.apache.ignite.internal.visor.query.VisorQueryArg
+org.apache.ignite.internal.visor.query.VisorQueryCancelTask
+org.apache.ignite.internal.visor.query.VisorQueryCancelTask$VisorCancelQueriesJob
 org.apache.ignite.internal.visor.query.VisorQueryCleanupTask
 org.apache.ignite.internal.visor.query.VisorQueryCleanupTask$VisorQueryCleanupJob
+org.apache.ignite.internal.visor.query.VisorQueryConfiguration
+org.apache.ignite.internal.visor.query.VisorQueryDetailMetrics
+org.apache.ignite.internal.visor.query.VisorQueryDetailMetricsCollectorTask
+org.apache.ignite.internal.visor.query.VisorQueryDetailMetricsCollectorTask$VisorCacheQueryDetailMetricsCollectorJob
+org.apache.ignite.internal.visor.query.VisorQueryEntity
 org.apache.ignite.internal.visor.query.VisorQueryField
-org.apache.ignite.internal.visor.query.VisorQueryJob
+org.apache.ignite.internal.visor.query.VisorQueryIndex
+org.apache.ignite.internal.visor.query.VisorQueryIndexField
+org.apache.ignite.internal.visor.query.VisorQueryMetrics
 org.apache.ignite.internal.visor.query.VisorQueryNextPageTask
 org.apache.ignite.internal.visor.query.VisorQueryNextPageTask$VisorQueryNextPageJob
+org.apache.ignite.internal.visor.query.VisorQueryNextPageTaskArg
+org.apache.ignite.internal.visor.query.VisorQueryResetDetailMetricsTask
+org.apache.ignite.internal.visor.query.VisorQueryResetDetailMetricsTask$VisorCacheResetQueryDetailMetricsJob
+org.apache.ignite.internal.visor.query.VisorQueryResetMetricsTask
+org.apache.ignite.internal.visor.query.VisorQueryResetMetricsTask$VisorQueryResetMetricsJob
 org.apache.ignite.internal.visor.query.VisorQueryResult
-org.apache.ignite.internal.visor.query.VisorQueryResultEx
-org.apache.ignite.internal.visor.query.VisorQueryScanSubstringFilter
+org.apache.ignite.internal.visor.query.VisorQueryScanRegexFilter
 org.apache.ignite.internal.visor.query.VisorQueryTask
+org.apache.ignite.internal.visor.query.VisorQueryTask$VisorQueryJob
+org.apache.ignite.internal.visor.query.VisorRunningQueriesCollectorTask
+org.apache.ignite.internal.visor.query.VisorRunningQueriesCollectorTask$VisorCollectRunningQueriesJob
 org.apache.ignite.internal.visor.query.VisorRunningQuery
+org.apache.ignite.internal.visor.query.VisorScanQueryArg
+org.apache.ignite.internal.visor.query.VisorScanQueryTask
+org.apache.ignite.internal.visor.query.VisorScanQueryTask$VisorScanQueryJob
 org.apache.ignite.internal.visor.service.VisorCancelServiceTask
 org.apache.ignite.internal.visor.service.VisorCancelServiceTask$VisorCancelServiceJob
 org.apache.ignite.internal.visor.service.VisorServiceDescriptor
@@ -1888,7 +1868,6 @@ org.apache.ignite.lang.IgniteRunnable
 org.apache.ignite.lang.IgniteUuid
 org.apache.ignite.lifecycle.LifecycleEventType
 org.apache.ignite.marshaller.jdk.JdkMarshallerDummySerializable
-org.apache.ignite.internal.marshaller.optimized.OptimizedFieldType
 org.apache.ignite.messaging.MessagingListenActor
 org.apache.ignite.platform.dotnet.PlatformDotNetAffinityFunction
 org.apache.ignite.platform.dotnet.PlatformDotNetCacheStoreFactory
@@ -1923,8 +1902,8 @@ org.apache.ignite.spi.checkpoint.sharedfs.SharedFsCheckpointData
 org.apache.ignite.spi.collision.jobstealing.JobStealingRequest
 org.apache.ignite.spi.collision.priorityqueue.PriorityQueueCollisionSpi$PriorityGridCollisionJobContextComparator
 org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi$1
+org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi$10
 org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi$11
-org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi$12
 org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi$2$ConnectClosure
 org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi$2$ConnectClosure$1
 org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi$2$ConnectClosureNew
@@ -1983,6 +1962,7 @@ org.apache.ignite.stream.StreamVisitor
 org.apache.ignite.stream.StreamVisitor$1
 org.apache.ignite.transactions.TransactionConcurrency
 org.apache.ignite.transactions.TransactionDeadlockException
+org.apache.ignite.transactions.TransactionException
 org.apache.ignite.transactions.TransactionHeuristicException
 org.apache.ignite.transactions.TransactionIsolation
 org.apache.ignite.transactions.TransactionMetrics

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/hadoop/src/main/resources/META-INF/classnames.properties
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/main/resources/META-INF/classnames.properties b/modules/hadoop/src/main/resources/META-INF/classnames.properties
index d8848ac..051094d 100644
--- a/modules/hadoop/src/main/resources/META-INF/classnames.properties
+++ b/modules/hadoop/src/main/resources/META-INF/classnames.properties
@@ -27,14 +27,6 @@ org.apache.ignite.hadoop.util.KerberosUserNameMapper$State
 org.apache.ignite.hadoop.util.UserNameMapper
 org.apache.ignite.internal.processors.hadoop.HadoopAttributes
 org.apache.ignite.internal.processors.hadoop.HadoopExternalSplit
-org.apache.ignite.internal.processors.hadoop.HadoopFileBlock
-org.apache.ignite.hadoop.HadoopInputSplit
-org.apache.ignite.internal.processors.hadoop.HadoopJobId
-org.apache.ignite.internal.processors.hadoop.HadoopJobInfo
-org.apache.ignite.internal.processors.hadoop.HadoopJobPhase
-org.apache.ignite.internal.processors.hadoop.HadoopJobProperty
-org.apache.ignite.internal.processors.hadoop.HadoopJobStatus
-org.apache.ignite.hadoop.HadoopMapReducePlan
 org.apache.ignite.internal.processors.hadoop.HadoopSplitWrapper
 org.apache.ignite.internal.processors.hadoop.HadoopTaskCancelledException
 org.apache.ignite.internal.processors.hadoop.counter.HadoopCounterAdapter

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyObjectMapper.java
----------------------------------------------------------------------
diff --git a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyObjectMapper.java b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyObjectMapper.java
index 6289bdb..44dd09c 100644
--- a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyObjectMapper.java
+++ b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyObjectMapper.java
@@ -29,19 +29,11 @@ import com.fasterxml.jackson.databind.module.SimpleModule;
 import com.fasterxml.jackson.databind.ser.DefaultSerializerProvider;
 import com.fasterxml.jackson.databind.ser.SerializerFactory;
 import java.io.IOException;
-import java.lang.reflect.Method;
 import java.sql.SQLException;
 import java.text.DateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
 import java.util.Locale;
-import java.util.Map;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-import org.apache.ignite.internal.LessNamingBean;
-import org.apache.ignite.internal.visor.cache.VisorCache;
+import org.apache.ignite.internal.processors.cache.query.GridCacheSqlIndexMetadata;
+import org.apache.ignite.internal.processors.cache.query.GridCacheSqlMetadata;
 import org.apache.ignite.internal.visor.util.VisorExceptionWrapper;
 import org.apache.ignite.lang.IgniteBiTuple;
 import org.apache.ignite.lang.IgniteUuid;
@@ -63,7 +55,8 @@ public class GridJettyObjectMapper extends ObjectMapper {
         module.addSerializer(Throwable.class, THROWABLE_SERIALIZER);
         module.addSerializer(IgniteBiTuple.class, IGNITE_TUPLE_SERIALIZER);
         module.addSerializer(IgniteUuid.class, IGNITE_UUID_SERIALIZER);
-        module.addSerializer(LessNamingBean.class, LESS_NAMING_SERIALIZER);
+        module.addSerializer(GridCacheSqlMetadata.class, IGNITE_SQL_METADATA_SERIALIZER);
+        module.addSerializer(GridCacheSqlIndexMetadata.class, IGNITE_SQL_INDEX_METADATA_SERIALIZER);
 
         registerModule(module);
     }
@@ -186,89 +179,35 @@ public class GridJettyObjectMapper extends ObjectMapper {
         }
     };
 
-    /**
-     * Custom serializer for Visor classes with non JavaBeans getters.
-     */
-    private static final JsonSerializer<Object> LESS_NAMING_SERIALIZER = new JsonSerializer<Object>() {
-        /** Methods to exclude. */
-        private final Collection<String> exclMtds = Arrays.asList("toString", "hashCode", "clone", "getClass");
+    /** Custom serializer for {@link GridCacheSqlMetadata} */
+    private static final JsonSerializer<GridCacheSqlMetadata> IGNITE_SQL_METADATA_SERIALIZER = new JsonSerializer<GridCacheSqlMetadata>() {
+        /** {@inheritDoc} */
+        @Override public void serialize(GridCacheSqlMetadata m, JsonGenerator gen, SerializerProvider ser) throws IOException {
+            gen.writeStartObject();
 
-        /** */
-        private final Map<Class<?>, Collection<Method>> clsCache = new HashMap<>();
+            gen.writeStringField("cacheName", m.cacheName());
+            gen.writeObjectField("types", m.types());
+            gen.writeObjectField("keyClasses", m.keyClasses());
+            gen.writeObjectField("valClasses", m.valClasses());
+            gen.writeObjectField("fields", m.fields());
+            gen.writeObjectField("indexes", m.indexes());
 
-        /** */
-        private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
+            gen.writeEndObject();
+        }
+    };
 
+    /** Custom serializer for {@link GridCacheSqlIndexMetadata} */
+    private static final JsonSerializer<GridCacheSqlIndexMetadata> IGNITE_SQL_INDEX_METADATA_SERIALIZER = new JsonSerializer<GridCacheSqlIndexMetadata>() {
         /** {@inheritDoc} */
-        @Override public void serialize(Object bean, JsonGenerator gen, SerializerProvider ser) throws IOException {
-            if (bean != null) {
-                gen.writeStartObject();
-
-                Class<?> cls = bean.getClass();
-
-                Collection<Method> methods;
-
-                // Get descriptor from cache.
-                rwLock.readLock().lock();
-
-                try {
-                    methods = clsCache.get(cls);
-                }
-                finally {
-                    rwLock.readLock().unlock();
-                }
-
-                // If missing in cache - build descriptor
-                if (methods == null) {
-                    Method[] publicMtds = cls.getMethods();
-
-                    methods = new ArrayList<>(publicMtds.length);
-
-                    for (Method mtd : publicMtds) {
-                        Class retType = mtd.getReturnType();
-
-                        String mtdName = mtd.getName();
-
-                        if (mtd.getParameterTypes().length != 0 ||
-                            retType == void.class || retType == cls ||
-                            exclMtds.contains(mtdName) ||
-                            (VisorCache.class.isAssignableFrom(retType) && "history".equals(mtdName)))
-                            continue;
-
-                        mtd.setAccessible(true);
-
-                        methods.add(mtd);
-                    }
-
-                    // Allow multiple puts for the same class - they will simply override.
-                    rwLock.writeLock().lock();
-
-                    try {
-                        clsCache.put(cls, methods);
-                    }
-                    finally {
-                        rwLock.writeLock().unlock();
-                    }
-                }
-
-                // Extract fields values using descriptor and build JSONObject.
-                for (Method mtd : methods) {
-                    try {
-                        Object prop = mtd.invoke(bean);
-
-                        if (prop != null)
-                            gen.writeObjectField(mtd.getName(), prop);
-                    }
-                    catch (IOException ioe) {
-                        throw ioe;
-                    }
-                    catch (Exception e) {
-                        throw new IOException(e);
-                    }
-                }
-
-                gen.writeEndObject();
-            }
+        @Override public void serialize(GridCacheSqlIndexMetadata idx, JsonGenerator gen, SerializerProvider ser) throws IOException {
+            gen.writeStartObject();
+
+            gen.writeStringField("name", idx.name());
+            gen.writeObjectField("fields", idx.fields());
+            gen.writeObjectField("descendings", idx.descendings());
+            gen.writeBooleanField("unique", idx.unique());
+
+            gen.writeEndObject();
         }
     };
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheClearCommand.scala
----------------------------------------------------------------------
diff --git a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheClearCommand.scala b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheClearCommand.scala
index 67aaa14..517028a 100644
--- a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheClearCommand.scala
+++ b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheClearCommand.scala
@@ -105,7 +105,7 @@ class VisorCacheClearCommand {
 
             val res = executeOne(nid, classOf[VisorCacheClearTask], cacheName)
 
-            t += (nodeId8(nid), res.get1(), res.get2())
+            t += (nodeId8(nid), res.getSizeBefore, res.getSizeAfter)
 
             println("Cleared cache with name: " + escapeName(cacheName))
 


[05/11] ignite git commit: IGNITE-4988 Cleanup and refactor VisorXxx tasks and DTO for ignite-2.0

Posted by ak...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorTaskResult.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorTaskResult.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorTaskResult.java
index 81c09b9..5018f43 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorTaskResult.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorTaskResult.java
@@ -17,14 +17,18 @@
 
 package org.apache.ignite.internal.visor.node;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
-import org.apache.ignite.internal.LessNamingBean;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 import org.apache.ignite.internal.visor.cache.VisorCache;
 import org.apache.ignite.internal.visor.event.VisorGridEvent;
 import org.apache.ignite.internal.visor.igfs.VisorIgfs;
@@ -34,7 +38,7 @@ import org.apache.ignite.internal.visor.util.VisorExceptionWrapper;
 /**
  * Data collector task result.
  */
-public class VisorNodeDataCollectorTaskResult implements Serializable, LessNamingBean {
+public class VisorNodeDataCollectorTaskResult extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -42,47 +46,54 @@ public class VisorNodeDataCollectorTaskResult implements Serializable, LessNamin
     private boolean active;
 
     /** Unhandled exceptions from nodes. */
-    private final Map<UUID, VisorExceptionWrapper> unhandledEx = new HashMap<>();
+    private Map<UUID, VisorExceptionWrapper> unhandledEx = new HashMap<>();
 
     /** Nodes grid names. */
-    private final Map<UUID, String> igniteInstanceNames = new HashMap<>();
+    private Map<UUID, String> gridNames = new HashMap<>();
 
     /** Nodes topology versions. */
-    private final Map<UUID, Long> topVersions = new HashMap<>();
+    private Map<UUID, Long> topVersions = new HashMap<>();
 
     /** All task monitoring state collected from nodes. */
-    private final Map<UUID, Boolean> taskMonitoringEnabled = new HashMap<>();
+    private Map<UUID, Boolean> taskMonitoringEnabled = new HashMap<>();
 
     /** Nodes error counts. */
-    private final Map<UUID, Long> errCnts = new HashMap<>();
+    private Map<UUID, Long> errCnts = new HashMap<>();
 
     /** All events collected from nodes. */
-    private final List<VisorGridEvent> evts = new ArrayList<>();
+    private List<VisorGridEvent> evts = new ArrayList<>();
 
     /** Exceptions caught during collecting events from nodes. */
-    private final Map<UUID, VisorExceptionWrapper> evtsEx = new HashMap<>();
+    private Map<UUID, VisorExceptionWrapper> evtsEx = new HashMap<>();
 
     /** All caches collected from nodes. */
-    private final Map<UUID, Collection<VisorCache>> caches = new HashMap<>();
+    private Map<UUID, Collection<VisorCache>> caches = new HashMap<>();
 
     /** Exceptions caught during collecting caches from nodes. */
-    private final Map<UUID, VisorExceptionWrapper> cachesEx = new HashMap<>();
+    private Map<UUID, VisorExceptionWrapper> cachesEx = new HashMap<>();
 
     /** All IGFS collected from nodes. */
-    private final Map<UUID, Collection<VisorIgfs>> igfss = new HashMap<>();
+    private Map<UUID, Collection<VisorIgfs>> igfss = new HashMap<>();
 
     /** All IGFS endpoints collected from nodes. */
-    private final Map<UUID, Collection<VisorIgfsEndpoint>> igfsEndpoints = new HashMap<>();
+    private Map<UUID, Collection<VisorIgfsEndpoint>> igfsEndpoints = new HashMap<>();
 
     /** Exceptions caught during collecting IGFS from nodes. */
-    private final Map<UUID, VisorExceptionWrapper> igfssEx = new HashMap<>();
+    private Map<UUID, VisorExceptionWrapper> igfssEx = new HashMap<>();
+
+    /**
+     * Default constructor.
+     */
+    public VisorNodeDataCollectorTaskResult() {
+        // No-op.
+    }
 
     /**
      * @return {@code true} If no data was collected.
      */
     public boolean isEmpty() {
         return
-            igniteInstanceNames.isEmpty() &&
+            gridNames.isEmpty() &&
             topVersions.isEmpty() &&
             unhandledEx.isEmpty() &&
             taskMonitoringEnabled.isEmpty() &&
@@ -112,84 +123,123 @@ public class VisorNodeDataCollectorTaskResult implements Serializable, LessNamin
     /**
      * @return Unhandled exceptions from nodes.
      */
-    public Map<UUID, VisorExceptionWrapper> unhandledEx() {
+    public Map<UUID, VisorExceptionWrapper> getUnhandledEx() {
         return unhandledEx;
     }
 
     /**
-     * @return Nodes Ignite instance names.
+     * @return Nodes grid names.
      */
-    public Map<UUID, String> igniteInstanceNames() {
-        return igniteInstanceNames;
+    public Map<UUID, String> getGridNames() {
+        return gridNames;
     }
 
     /**
      * @return Nodes topology versions.
      */
-    public Map<UUID, Long> topologyVersions() {
+    public Map<UUID, Long> getTopologyVersions() {
         return topVersions;
     }
 
     /**
      * @return All task monitoring state collected from nodes.
      */
-    public Map<UUID, Boolean> taskMonitoringEnabled() {
+    public Map<UUID, Boolean> isTaskMonitoringEnabled() {
         return taskMonitoringEnabled;
     }
 
     /**
      * @return All events collected from nodes.
      */
-    public List<VisorGridEvent> events() {
+    public List<VisorGridEvent> getEvents() {
         return evts;
     }
 
     /**
      * @return Exceptions caught during collecting events from nodes.
      */
-    public Map<UUID, VisorExceptionWrapper> eventsEx() {
+    public Map<UUID, VisorExceptionWrapper> getEventsEx() {
         return evtsEx;
     }
 
     /**
      * @return All caches collected from nodes.
      */
-    public Map<UUID, Collection<VisorCache>> caches() {
+    public Map<UUID, Collection<VisorCache>> getCaches() {
         return caches;
     }
 
     /**
      * @return Exceptions caught during collecting caches from nodes.
      */
-    public Map<UUID, VisorExceptionWrapper> cachesEx() {
+    public Map<UUID, VisorExceptionWrapper> getCachesEx() {
         return cachesEx;
     }
 
     /**
      * @return All IGFS collected from nodes.
      */
-    public Map<UUID, Collection<VisorIgfs>> igfss() {
+    public Map<UUID, Collection<VisorIgfs>> getIgfss() {
         return igfss;
     }
 
     /**
      * @return All IGFS endpoints collected from nodes.
      */
-    public Map<UUID, Collection<VisorIgfsEndpoint>> igfsEndpoints() {
+    public Map<UUID, Collection<VisorIgfsEndpoint>> getIgfsEndpoints() {
         return igfsEndpoints;
     }
 
     /**
      * @return Exceptions caught during collecting IGFS from nodes.
      */
-    public Map<UUID, VisorExceptionWrapper> igfssEx() {
+    public Map<UUID, VisorExceptionWrapper> getIgfssEx() {
         return igfssEx;
     }
 
     /**
      * @return Nodes error counts.
      */
-    public Map<UUID, Long> errorCounts() {
+    public Map<UUID, Long> getErrorCounts() {
         return errCnts;
     }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeBoolean(active);
+        U.writeMap(out, unhandledEx);
+        U.writeMap(out, gridNames);
+        U.writeMap(out, topVersions);
+        U.writeMap(out, taskMonitoringEnabled);
+        U.writeMap(out, errCnts);
+        U.writeCollection(out, evts);
+        U.writeMap(out, evtsEx);
+        U.writeMap(out, caches);
+        U.writeMap(out, cachesEx);
+        U.writeMap(out, igfss);
+        U.writeMap(out, igfsEndpoints);
+        U.writeMap(out, igfssEx);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        active = in.readBoolean();
+        unhandledEx = U.readMap(in);
+        gridNames = U.readMap(in);
+        topVersions = U.readMap(in);
+        taskMonitoringEnabled = U.readMap(in);
+        errCnts = U.readMap(in);
+        evts = U.readList(in);
+        evtsEx = U.readMap(in);
+        caches = U.readMap(in);
+        cachesEx = U.readMap(in);
+        igfss = U.readMap(in);
+        igfsEndpoints = U.readMap(in);
+        igfssEx = U.readMap(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorNodeDataCollectorTaskResult.class, this);
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeEventsCollectorTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeEventsCollectorTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeEventsCollectorTask.java
index f219908..bb6c83e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeEventsCollectorTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeEventsCollectorTask.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.visor.node;
 
-import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -38,18 +37,14 @@ import org.apache.ignite.internal.visor.util.VisorEventMapper;
 import org.apache.ignite.lang.IgniteClosure;
 import org.apache.ignite.lang.IgnitePredicate;
 import org.apache.ignite.lang.IgniteUuid;
-import org.jetbrains.annotations.Nullable;
 
-import static org.apache.ignite.events.EventType.EVTS_JOB_EXECUTION;
-import static org.apache.ignite.events.EventType.EVTS_TASK_EXECUTION;
 import static org.apache.ignite.internal.visor.util.VisorTaskUtils.EVT_MAPPER;
-import static org.apache.ignite.internal.visor.util.VisorTaskUtils.concat;
 
 /**
  * Task that runs on specified node and returns events data.
  */
 @GridInternal
-public class VisorNodeEventsCollectorTask extends VisorMultiNodeTask<VisorNodeEventsCollectorTask.VisorNodeEventsCollectorTaskArg,
+public class VisorNodeEventsCollectorTask extends VisorMultiNodeTask<VisorNodeEventsCollectorTaskArg,
     Iterable<? extends VisorGridEvent>, Collection<? extends VisorGridEvent>> {
     /** */
     private static final long serialVersionUID = 0L;
@@ -72,114 +67,6 @@ public class VisorNodeEventsCollectorTask extends VisorMultiNodeTask<VisorNodeEv
     }
 
     /**
-     * Argument for task returns events data.
-     */
-    @SuppressWarnings("PublicInnerClass")
-    public static class VisorNodeEventsCollectorTaskArg implements Serializable {
-        /** */
-        private static final long serialVersionUID = 0L;
-
-        /** Node local storage key. */
-        private final String keyOrder;
-
-        /** Arguments for type filter. */
-        private final int[] typeArg;
-
-        /** Arguments for time filter. */
-        private final Long timeArg;
-
-        /** Task or job events with task name contains. */
-        private final String taskName;
-
-        /** Task or job events with session. */
-        private final IgniteUuid taskSesId;
-
-        /**
-         * @param keyOrder Arguments for node local storage key.
-         * @param typeArg Arguments for type filter.
-         * @param timeArg Arguments for time filter.
-         * @param taskName Arguments for task name filter.
-         * @param taskSesId Arguments for task session filter.
-         */
-        public VisorNodeEventsCollectorTaskArg(@Nullable String keyOrder, @Nullable int[] typeArg,
-            @Nullable Long timeArg,
-            @Nullable String taskName, @Nullable IgniteUuid taskSesId) {
-            this.keyOrder = keyOrder;
-            this.typeArg = typeArg;
-            this.timeArg = timeArg;
-            this.taskName = taskName;
-            this.taskSesId = taskSesId;
-        }
-
-        /**
-         * @param typeArg Arguments for type filter.
-         * @param timeArg Arguments for time filter.
-         */
-        public static VisorNodeEventsCollectorTaskArg createEventsArg(@Nullable int[] typeArg, @Nullable Long timeArg) {
-            return new VisorNodeEventsCollectorTaskArg(null, typeArg, timeArg, null, null);
-        }
-
-        /**
-         * @param timeArg Arguments for time filter.
-         * @param taskName Arguments for task name filter.
-         * @param taskSesId Arguments for task session filter.
-         */
-        public static VisorNodeEventsCollectorTaskArg createTasksArg(@Nullable Long timeArg, @Nullable String taskName,
-            @Nullable IgniteUuid taskSesId) {
-            return new VisorNodeEventsCollectorTaskArg(null, concat(EVTS_JOB_EXECUTION, EVTS_TASK_EXECUTION),
-                timeArg, taskName, taskSesId);
-        }
-
-        /**
-         * @param keyOrder Arguments for node local storage key.
-         * @param typeArg Arguments for type filter.
-         */
-        public static VisorNodeEventsCollectorTaskArg createLogArg(@Nullable String keyOrder, @Nullable int[] typeArg) {
-            return new VisorNodeEventsCollectorTaskArg(keyOrder, typeArg, null, null, null);
-        }
-
-        /**
-         * @return Node local storage key.
-         */
-        @Nullable public String keyOrder() {
-            return keyOrder;
-        }
-
-        /**
-         * @return Arguments for type filter.
-         */
-        public int[] typeArgument() {
-            return typeArg;
-        }
-
-        /**
-         * @return Arguments for time filter.
-         */
-        public Long timeArgument() {
-            return timeArg;
-        }
-
-        /**
-         * @return Task or job events with task name contains.
-         */
-        public String taskName() {
-            return taskName;
-        }
-
-        /**
-         * @return Task or job events with session.
-         */
-        public IgniteUuid taskSessionId() {
-            return taskSesId;
-        }
-
-        /** {@inheritDoc} */
-        @Override public String toString() {
-            return S.toString(VisorNodeEventsCollectorTaskArg.class, this);
-        }
-    }
-
-    /**
      * Job for task returns events data.
      */
     protected static class VisorNodeEventsCollectorJob extends VisorJob<VisorNodeEventsCollectorTaskArg,
@@ -279,12 +166,12 @@ public class VisorNodeEventsCollectorTask extends VisorMultiNodeTask<VisorNodeEv
 
         /** {@inheritDoc} */
         @Override protected Collection<? extends VisorGridEvent> run(final VisorNodeEventsCollectorTaskArg arg) {
-            final long startEvtTime = arg.timeArgument() == null ? 0L : System.currentTimeMillis() - arg.timeArgument();
+            final long startEvtTime = arg.getTimeArgument() == null ? 0L : System.currentTimeMillis() - arg.getTimeArgument();
 
             final ConcurrentMap<String, Long> nl = ignite.cluster().nodeLocalMap();
 
-            final Long startEvtOrder = arg.keyOrder() != null && nl.containsKey(arg.keyOrder()) ?
-                nl.get(arg.keyOrder()) : -1L;
+            final Long startEvtOrder = arg.getKeyOrder() != null && nl.containsKey(arg.getKeyOrder()) ?
+                nl.get(arg.getKeyOrder()) : -1L;
 
             Collection<Event> evts = ignite.events().localQuery(new IgnitePredicate<Event>() {
                 /** */
@@ -292,10 +179,10 @@ public class VisorNodeEventsCollectorTask extends VisorMultiNodeTask<VisorNodeEv
 
                 @Override public boolean apply(Event evt) {
                     return evt.localOrder() > startEvtOrder &&
-                        (arg.typeArgument() == null || F.contains(arg.typeArgument(), evt.type())) &&
+                        (arg.getTypeArgument() == null || F.contains(arg.getTypeArgument(), evt.type())) &&
                         (evt.timestamp() >= startEvtTime) &&
-                        (arg.taskName() == null || filterByTaskName(evt, arg.taskName())) &&
-                        (arg.taskSessionId() == null || filterByTaskSessionId(evt, arg.taskSessionId()));
+                        (arg.getTaskName() == null || filterByTaskName(evt, arg.getTaskName())) &&
+                        (arg.getTaskSessionId() == null || filterByTaskSessionId(evt, arg.getTaskSessionId()));
                 }
             });
 
@@ -319,8 +206,8 @@ public class VisorNodeEventsCollectorTask extends VisorMultiNodeTask<VisorNodeEv
             }
 
             // Update latest order in node local, if not empty.
-            if (arg.keyOrder() != null && !res.isEmpty())
-                nl.put(arg.keyOrder(), maxOrder);
+            if (arg.getKeyOrder() != null && !res.isEmpty())
+                nl.put(arg.getKeyOrder(), maxOrder);
 
             return res;
         }
@@ -330,4 +217,4 @@ public class VisorNodeEventsCollectorTask extends VisorMultiNodeTask<VisorNodeEv
             return S.toString(VisorNodeEventsCollectorJob.class, this);
         }
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeEventsCollectorTaskArg.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeEventsCollectorTaskArg.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeEventsCollectorTaskArg.java
new file mode 100644
index 0000000..c2e6b4a
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeEventsCollectorTaskArg.java
@@ -0,0 +1,163 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.node;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+import org.apache.ignite.lang.IgniteUuid;
+import org.jetbrains.annotations.Nullable;
+
+import static org.apache.ignite.events.EventType.EVTS_JOB_EXECUTION;
+import static org.apache.ignite.events.EventType.EVTS_TASK_EXECUTION;
+import static org.apache.ignite.internal.visor.util.VisorTaskUtils.concat;
+
+/**
+ * Argument for task returns events data.
+ */
+public class VisorNodeEventsCollectorTaskArg extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Node local storage key. */
+    private String keyOrder;
+
+    /** Arguments for type filter. */
+    private int[] typeArg;
+
+    /** Arguments for time filter. */
+    private Long timeArg;
+
+    /** Task or job events with task name contains. */
+    private String taskName;
+
+    /** Task or job events with session. */
+    private IgniteUuid taskSesId;
+
+    /**
+     * Default constructor.
+     */
+    public VisorNodeEventsCollectorTaskArg() {
+        // No-op.
+    }
+
+    /**
+     * @param keyOrder Arguments for node local storage key.
+     * @param typeArg Arguments for type filter.
+     * @param timeArg Arguments for time filter.
+     * @param taskName Arguments for task name filter.
+     * @param taskSesId Arguments for task session filter.
+     */
+    public VisorNodeEventsCollectorTaskArg(@Nullable String keyOrder, @Nullable int[] typeArg,
+        @Nullable Long timeArg,
+        @Nullable String taskName, @Nullable IgniteUuid taskSesId) {
+        this.keyOrder = keyOrder;
+        this.typeArg = typeArg;
+        this.timeArg = timeArg;
+        this.taskName = taskName;
+        this.taskSesId = taskSesId;
+    }
+
+    /**
+     * @param typeArg Arguments for type filter.
+     * @param timeArg Arguments for time filter.
+     */
+    public static VisorNodeEventsCollectorTaskArg createEventsArg(@Nullable int[] typeArg, @Nullable Long timeArg) {
+        return new VisorNodeEventsCollectorTaskArg(null, typeArg, timeArg, null, null);
+    }
+
+    /**
+     * @param timeArg Arguments for time filter.
+     * @param taskName Arguments for task name filter.
+     * @param taskSesId Arguments for task session filter.
+     */
+    public static VisorNodeEventsCollectorTaskArg createTasksArg(@Nullable Long timeArg, @Nullable String taskName,
+        @Nullable IgniteUuid taskSesId) {
+        return new VisorNodeEventsCollectorTaskArg(null, concat(EVTS_JOB_EXECUTION, EVTS_TASK_EXECUTION),
+            timeArg, taskName, taskSesId);
+    }
+
+    /**
+     * @param keyOrder Arguments for node local storage key.
+     * @param typeArg Arguments for type filter.
+     */
+    public static VisorNodeEventsCollectorTaskArg createLogArg(@Nullable String keyOrder, @Nullable int[] typeArg) {
+        return new VisorNodeEventsCollectorTaskArg(keyOrder, typeArg, null, null, null);
+    }
+
+    /**
+     * @return Node local storage key.
+     */
+    @Nullable public String getKeyOrder() {
+        return keyOrder;
+    }
+
+    /**
+     * @return Arguments for type filter.
+     */
+    public int[] getTypeArgument() {
+        return typeArg;
+    }
+
+    /**
+     * @return Arguments for time filter.
+     */
+    public Long getTimeArgument() {
+        return timeArg;
+    }
+
+    /**
+     * @return Task or job events with task name contains.
+     */
+    public String getTaskName() {
+        return taskName;
+    }
+
+    /**
+     * @return Task or job events with session.
+     */
+    public IgniteUuid getTaskSessionId() {
+        return taskSesId;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, keyOrder);
+        out.writeObject(typeArg);
+        out.writeObject(timeArg);
+        U.writeString(out, taskName);
+        U.writeGridUuid(out, taskSesId);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        keyOrder = U.readString(in);
+        typeArg = (int[])in.readObject();
+        timeArg = (Long)in.readObject();
+        taskName = U.readString(in);
+        taskSesId = U.readGridUuid(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorNodeEventsCollectorTaskArg.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeGcTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeGcTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeGcTask.java
index 42afc73..bdc1104 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeGcTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeGcTask.java
@@ -28,15 +28,13 @@ import org.apache.ignite.internal.processors.task.GridInternal;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.visor.VisorJob;
 import org.apache.ignite.internal.visor.VisorMultiNodeTask;
-import org.apache.ignite.lang.IgniteBiTuple;
 import org.jetbrains.annotations.Nullable;
 
 /**
  * Task to run gc on nodes.
  */
 @GridInternal
-public class VisorNodeGcTask extends VisorMultiNodeTask<Void, Map<UUID, IgniteBiTuple<Long, Long>>,
-    IgniteBiTuple<Long, Long>> {
+public class VisorNodeGcTask extends VisorMultiNodeTask<Void, Map<UUID, VisorNodeGcTaskResult>, VisorNodeGcTaskResult> {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -46,11 +44,11 @@ public class VisorNodeGcTask extends VisorMultiNodeTask<Void, Map<UUID, IgniteBi
     }
 
     /** {@inheritDoc} */
-    @Nullable @Override protected Map<UUID, IgniteBiTuple<Long, Long>> reduce0(List<ComputeJobResult> results) {
-        Map<UUID, IgniteBiTuple<Long, Long>> total = new HashMap<>();
+    @Nullable @Override protected Map<UUID, VisorNodeGcTaskResult> reduce0(List<ComputeJobResult> results) {
+        Map<UUID, VisorNodeGcTaskResult> total = new HashMap<>();
 
         for (ComputeJobResult res : results) {
-            IgniteBiTuple<Long, Long> jobRes = res.getData();
+            VisorNodeGcTaskResult jobRes = res.getData();
 
             total.put(res.getNode().id(), jobRes);
         }
@@ -59,7 +57,7 @@ public class VisorNodeGcTask extends VisorMultiNodeTask<Void, Map<UUID, IgniteBi
     }
 
     /** Job that perform GC on node. */
-    private static class VisorNodeGcJob extends VisorJob<Void, IgniteBiTuple<Long, Long>> {
+    private static class VisorNodeGcJob extends VisorJob<Void, VisorNodeGcTaskResult> {
         /** */
         private static final long serialVersionUID = 0L;
 
@@ -74,14 +72,14 @@ public class VisorNodeGcTask extends VisorMultiNodeTask<Void, Map<UUID, IgniteBi
         }
 
         /** {@inheritDoc} */
-        @Override protected IgniteBiTuple<Long, Long> run(Void arg) {
+        @Override protected VisorNodeGcTaskResult run(Void arg) {
             ClusterNode locNode = ignite.localNode();
 
             long before = freeHeap(locNode);
 
             System.gc();
 
-            return new IgniteBiTuple<>(before, freeHeap(locNode));
+            return new VisorNodeGcTaskResult(before, freeHeap(locNode));
         }
 
         /**
@@ -99,4 +97,4 @@ public class VisorNodeGcTask extends VisorMultiNodeTask<Void, Map<UUID, IgniteBi
             return S.toString(VisorNodeGcJob.class, this);
         }
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeGcTaskResult.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeGcTaskResult.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeGcTaskResult.java
new file mode 100644
index 0000000..eb12ef7
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeGcTaskResult.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.node;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Argument for task returns GC execution results.
+ */
+public class VisorNodeGcTaskResult extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Size before GC execution. */
+    private long sizeBefore;
+
+    /** Size after GC execution. */
+    private long sizeAfter;
+
+    /**
+     * Default constructor.
+     */
+    public VisorNodeGcTaskResult() {
+        // No-op.
+    }
+
+    /**
+     * @param sizeBefore Size before GC execution.
+     * @param sizeAfter Size after GC execution.
+     */
+    public VisorNodeGcTaskResult(long sizeBefore, long sizeAfter) {
+        this.sizeBefore = sizeBefore;
+        this.sizeAfter = sizeAfter;
+    }
+
+    /**
+     * @return Size before GC execution.
+     */
+    public Long getSizeBefore() {
+        return sizeBefore;
+    }
+
+    /**
+     * @return Size after GC execution.
+     */
+    public Long getSizeAfter() {
+        return sizeAfter;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeLong(sizeBefore);
+        out.writeLong(sizeAfter);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        sizeBefore = in.readLong();
+        sizeAfter = in.readLong();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorNodeGcTaskResult.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodePingTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodePingTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodePingTask.java
index f59ea01..6169dcb 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodePingTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodePingTask.java
@@ -22,7 +22,6 @@ import java.util.UUID;
 import org.apache.ignite.cluster.ClusterTopologyException;
 import org.apache.ignite.compute.ComputeJobResult;
 import org.apache.ignite.internal.processors.task.GridInternal;
-import org.apache.ignite.internal.util.lang.GridTuple3;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.visor.VisorJob;
 import org.apache.ignite.internal.visor.VisorOneNodeTask;
@@ -32,7 +31,7 @@ import org.jetbrains.annotations.Nullable;
  * Ping other node.
  */
 @GridInternal
-public class VisorNodePingTask extends VisorOneNodeTask<UUID, GridTuple3<Boolean, Long, Long>> {
+public class VisorNodePingTask extends VisorOneNodeTask<UUID, VisorNodePingTaskResult> {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -42,19 +41,19 @@ public class VisorNodePingTask extends VisorOneNodeTask<UUID, GridTuple3<Boolean
     }
 
     /** {@inheritDoc} */
-    @Nullable @Override protected GridTuple3<Boolean, Long, Long> reduce0(List<ComputeJobResult> results) {
+    @Nullable @Override protected VisorNodePingTaskResult reduce0(List<ComputeJobResult> results) {
         try {
             return super.reduce0(results);
         }
         catch (ClusterTopologyException ignored) {
-            return new GridTuple3<>(false, -1L, -1L);
+            return new VisorNodePingTaskResult(false, -1L, -1L);
         }
     }
 
     /**
      * Job that ping node.
      */
-    private static class VisorNodePingJob extends VisorJob<UUID, GridTuple3<Boolean, Long, Long>> {
+    private static class VisorNodePingJob extends VisorJob<UUID, VisorNodePingTaskResult> {
         /** */
         private static final long serialVersionUID = 0L;
 
@@ -67,10 +66,10 @@ public class VisorNodePingTask extends VisorOneNodeTask<UUID, GridTuple3<Boolean
         }
 
         /** {@inheritDoc} */
-        @Override protected GridTuple3<Boolean, Long, Long> run(UUID nodeToPing) {
+        @Override protected VisorNodePingTaskResult run(UUID nodeToPing) {
             long start = System.currentTimeMillis();
 
-            return new GridTuple3<>(ignite.cluster().pingNode(nodeToPing), start, System.currentTimeMillis());
+            return new VisorNodePingTaskResult(ignite.cluster().pingNode(nodeToPing), start, System.currentTimeMillis());
         }
 
         /** {@inheritDoc} */
@@ -78,4 +77,4 @@ public class VisorNodePingTask extends VisorOneNodeTask<UUID, GridTuple3<Boolean
             return S.toString(VisorNodePingJob.class, this);
         }
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodePingTaskResult.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodePingTaskResult.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodePingTaskResult.java
new file mode 100644
index 0000000..5328f65
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodePingTaskResult.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.node;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Result for {@link VisorNodePingTask}.
+ */
+public class VisorNodePingTaskResult extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Node alive. */
+    private boolean alive;
+
+    /** Ping start time. */
+    private long startTime;
+
+    /** Ping finish time. */
+    private long finishTime;
+
+    /**
+     * Default constructor.
+     */
+    public VisorNodePingTaskResult() {
+        // No-op.
+    }
+
+    /**
+     * @param alive Node alive.
+     * @param startTime Ping start time.
+     * @param finishTime Ping finish time.
+     */
+    public VisorNodePingTaskResult(boolean alive, long startTime, long finishTime) {
+        this.alive = alive;
+        this.startTime = startTime;
+        this.finishTime = finishTime;
+    }
+
+    /**
+     * @return Node alive.
+     */
+    public boolean isAlive() {
+        return alive;
+    }
+
+    /**
+     * @return Ping start time.
+     */
+    public long getStartTime() {
+        return startTime;
+    }
+
+    /**
+     * @return Ping finish time.
+     */
+    public long getFinishTime() {
+        return finishTime;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeBoolean(alive);
+        out.writeLong(startTime);
+        out.writeLong(finishTime);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        alive = in.readBoolean();
+        startTime = in.readLong();
+        finishTime = in.readLong();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorNodePingTaskResult.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeSuppressedErrors.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeSuppressedErrors.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeSuppressedErrors.java
new file mode 100644
index 0000000..482adce
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeSuppressedErrors.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.node;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.List;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Create data transfer object for node's suppressed errors.
+ */
+public class VisorNodeSuppressedErrors extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Order number of last suppressed error. */
+    private Long order;
+
+    /** List of suppressed errors. */
+    private List<VisorSuppressedError> errors;
+
+    /**
+     * Default constructor.
+     */
+    public VisorNodeSuppressedErrors() {
+        // No-op.
+    }
+
+    /**
+     * Create data transfer object for node's suppressed errors.
+     *
+     * @param order Order number of last suppressed error.
+     * @param errors List of suppressed errors.
+     */
+    public VisorNodeSuppressedErrors(Long order, List<VisorSuppressedError> errors) {
+        this.order = order;
+        this.errors = errors;
+    }
+
+    /**
+     * @return Order number of last suppressed error.
+     */
+    public Long getOrder() {
+        return order;
+    }
+
+    /**
+     * @return List of suppressed errors.
+     */
+    public List<VisorSuppressedError> getErrors() {
+        return errors;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeLong(order);
+        U.writeCollection(out, errors);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        order = in.readLong();
+        errors = U.readList(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorNodeSuppressedErrors.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeSuppressedErrorsTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeSuppressedErrorsTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeSuppressedErrorsTask.java
index 1f673ca..c7b9cf7 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeSuppressedErrorsTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeSuppressedErrorsTask.java
@@ -29,7 +29,6 @@ import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.visor.VisorJob;
 import org.apache.ignite.internal.visor.VisorMultiNodeTask;
 import org.apache.ignite.internal.visor.util.VisorExceptionWrapper;
-import org.apache.ignite.lang.IgniteBiTuple;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -37,8 +36,7 @@ import org.jetbrains.annotations.Nullable;
  */
 @GridInternal
 public class VisorNodeSuppressedErrorsTask extends VisorMultiNodeTask<Map<UUID, Long>,
-    Map<UUID, IgniteBiTuple<Long, List<IgniteExceptionRegistry.ExceptionInfo>>>,
-    IgniteBiTuple<Long, List<IgniteExceptionRegistry.ExceptionInfo>>> {
+    Map<UUID, VisorNodeSuppressedErrors>, VisorNodeSuppressedErrors> {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -48,13 +46,13 @@ public class VisorNodeSuppressedErrorsTask extends VisorMultiNodeTask<Map<UUID,
     }
 
     /** {@inheritDoc} */
-    @Nullable @Override protected Map<UUID, IgniteBiTuple<Long, List<IgniteExceptionRegistry.ExceptionInfo>>>
+    @Nullable @Override protected Map<UUID, VisorNodeSuppressedErrors>
         reduce0(List<ComputeJobResult> results) {
-        Map<UUID, IgniteBiTuple<Long, List<IgniteExceptionRegistry.ExceptionInfo>>> taskRes =
+        Map<UUID, VisorNodeSuppressedErrors> taskRes =
             new HashMap<>(results.size());
 
         for (ComputeJobResult res : results) {
-            IgniteBiTuple<Long, List<IgniteExceptionRegistry.ExceptionInfo>> jobRes = res.getData();
+            VisorNodeSuppressedErrors jobRes = res.getData();
 
             taskRes.put(res.getNode().id(), jobRes);
         }
@@ -65,8 +63,7 @@ public class VisorNodeSuppressedErrorsTask extends VisorMultiNodeTask<Map<UUID,
     /**
      * Job to collect last errors on nodes.
      */
-    private static class VisorNodeSuppressedErrorsJob extends VisorJob<Map<UUID, Long>,
-        IgniteBiTuple<Long, List<IgniteExceptionRegistry.ExceptionInfo>>> {
+    private static class VisorNodeSuppressedErrorsJob extends VisorJob<Map<UUID, Long>, VisorNodeSuppressedErrors> {
         /** */
         private static final long serialVersionUID = 0L;
 
@@ -81,20 +78,20 @@ public class VisorNodeSuppressedErrorsTask extends VisorMultiNodeTask<Map<UUID,
         }
 
         /** {@inheritDoc} */
-        @Override protected IgniteBiTuple<Long, List<IgniteExceptionRegistry.ExceptionInfo>> run(Map<UUID, Long> arg) {
+        @Override protected VisorNodeSuppressedErrors run(Map<UUID, Long> arg) {
             Long lastOrder = arg.get(ignite.localNode().id());
 
             long order = lastOrder != null ? lastOrder : 0;
 
             List<IgniteExceptionRegistry.ExceptionInfo> errors = ignite.context().exceptionRegistry().getErrors(order);
 
-            List<IgniteExceptionRegistry.ExceptionInfo> wrapped = new ArrayList<>(errors.size());
+            List<VisorSuppressedError> wrapped = new ArrayList<>(errors.size());
 
             for (IgniteExceptionRegistry.ExceptionInfo error : errors) {
                 if (error.order() > order)
                     order = error.order();
 
-                wrapped.add(new IgniteExceptionRegistry.ExceptionInfo(error.order(),
+                wrapped.add(new VisorSuppressedError(error.order(),
                     new VisorExceptionWrapper(error.error()),
                     error.message(),
                     error.threadId(),
@@ -102,7 +99,7 @@ public class VisorNodeSuppressedErrorsTask extends VisorMultiNodeTask<Map<UUID,
                     error.time()));
             }
 
-            return new IgniteBiTuple<>(order, wrapped);
+            return new VisorNodeSuppressedErrors(order, wrapped);
         }
 
         /** {@inheritDoc} */
@@ -110,4 +107,4 @@ public class VisorNodeSuppressedErrorsTask extends VisorMultiNodeTask<Map<UUID,
             return S.toString(VisorNodeSuppressedErrorsJob.class, this);
         }
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorPeerToPeerConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorPeerToPeerConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorPeerToPeerConfiguration.java
index 93177fd..ab9e140 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorPeerToPeerConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorPeerToPeerConfiguration.java
@@ -17,18 +17,21 @@
 
 package org.apache.ignite.internal.visor.node;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Arrays;
+import java.util.List;
 import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 import org.jetbrains.annotations.Nullable;
 
-import static org.apache.ignite.internal.visor.util.VisorTaskUtils.compactArray;
-
 /**
  * Data transfer object for node P2P configuration properties.
  */
-public class VisorPeerToPeerConfiguration implements Serializable, LessNamingBean {
+public class VisorPeerToPeerConfiguration extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -39,44 +42,62 @@ public class VisorPeerToPeerConfiguration implements Serializable, LessNamingBea
     private int p2pMissedResCacheSize;
 
     /** List of packages from the system classpath that need to be loaded from task originating node. */
-    private String p2pLocClsPathExcl;
+    private List<String> p2pLocClsPathExcl;
 
     /**
-     * @param c Grid configuration.
-     * @return Data transfer object for node P2P configuration properties.
+     * Default constructor.
      */
-    public static VisorPeerToPeerConfiguration from(IgniteConfiguration c) {
-        VisorPeerToPeerConfiguration cfg = new VisorPeerToPeerConfiguration();
-
-        cfg.p2pEnabled = c.isPeerClassLoadingEnabled();
-        cfg.p2pMissedResCacheSize = c.getPeerClassLoadingMissedResourcesCacheSize();
-        cfg.p2pLocClsPathExcl = compactArray(c.getPeerClassLoadingLocalClassPathExclude());
+    public VisorPeerToPeerConfiguration() {
+        // No-op.
+    }
 
-        return cfg;
+    /**
+     * Create data transfer object for node P2P configuration properties.
+     *
+     * @param c Grid configuration.
+     */
+    public VisorPeerToPeerConfiguration(IgniteConfiguration c) {
+        p2pEnabled = c.isPeerClassLoadingEnabled();
+        p2pMissedResCacheSize = c.getPeerClassLoadingMissedResourcesCacheSize();
+        p2pLocClsPathExcl = Arrays.asList(c.getPeerClassLoadingLocalClassPathExclude());
     }
 
     /**
      * @return Whether peer-to-peer class loading is enabled.
      */
-    public boolean p2pEnabled() {
+    public boolean isPeerClassLoadingEnabled() {
         return p2pEnabled;
     }
 
     /**
      * @return Missed resource cache size.
      */
-    public int p2pMissedResponseCacheSize() {
+    public int getPeerClassLoadingMissedResourcesCacheSize() {
         return p2pMissedResCacheSize;
     }
 
     /**
      * @return List of packages from the system classpath that need to be loaded from task originating node.
      */
-    @Nullable public String p2pLocalClassPathExclude() {
+    @Nullable public List<String> getPeerClassLoadingLocalClassPathExclude() {
         return p2pLocClsPathExcl;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeBoolean(p2pEnabled);
+        out.writeInt(p2pMissedResCacheSize);
+        U.writeCollection(out, p2pLocClsPathExcl);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        p2pEnabled = in.readBoolean();
+        p2pMissedResCacheSize = in.readInt();
+        p2pLocClsPathExcl = U.readList(in);
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorPeerToPeerConfiguration.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorRestConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorRestConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorRestConfiguration.java
index 78a54b3..1f1e2b7 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorRestConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorRestConfiguration.java
@@ -17,11 +17,14 @@
 
 package org.apache.ignite.internal.visor.node;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.apache.ignite.configuration.ConnectorConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 import org.jetbrains.annotations.Nullable;
 
 import static java.lang.System.getProperty;
@@ -33,7 +36,7 @@ import static org.apache.ignite.internal.visor.util.VisorTaskUtils.intValue;
 /**
  * Create data transfer object for node REST configuration properties.
  */
-public class VisorRestConfiguration implements Serializable, LessNamingBean {
+public class VisorRestConfiguration extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -43,9 +46,6 @@ public class VisorRestConfiguration implements Serializable, LessNamingBean {
     /** Whether or not SSL is enabled for TCP binary protocol. */
     private boolean tcpSslEnabled;
 
-    /** Rest accessible folders (log command can get files from). */
-    private String[] accessibleFolders;
-
     /** Jetty config path. */
     private String jettyPath;
 
@@ -65,95 +65,116 @@ public class VisorRestConfiguration implements Serializable, LessNamingBean {
     private String tcpSslCtxFactory;
 
     /**
+     * Default constructor.
+     */
+    public VisorRestConfiguration() {
+        // No-op.
+    }
+
+    /**
+     * Create data transfer object for node REST configuration properties.
+     *
      * @param c Grid configuration.
-     * @return Create data transfer object for node REST configuration properties.
      */
-    public static VisorRestConfiguration from(IgniteConfiguration c) {
-        VisorRestConfiguration cfg = new VisorRestConfiguration();
+    public VisorRestConfiguration(IgniteConfiguration c) {
+        assert c != null;
 
         ConnectorConfiguration clnCfg = c.getConnectorConfiguration();
 
-        boolean restEnabled = clnCfg != null;
-
-        cfg.restEnabled = restEnabled;
+        restEnabled = clnCfg != null;
 
         if (restEnabled) {
-            cfg.tcpSslEnabled = clnCfg.isSslEnabled();
-            cfg.jettyPath = clnCfg.getJettyPath();
-            cfg.jettyHost = getProperty(IGNITE_JETTY_HOST);
-            cfg.jettyPort = intValue(IGNITE_JETTY_PORT, null);
-            cfg.tcpHost = clnCfg.getHost();
-            cfg.tcpPort = clnCfg.getPort();
-            cfg.tcpSslCtxFactory = compactClass(clnCfg.getSslContextFactory());
+            tcpSslEnabled = clnCfg.isSslEnabled();
+            jettyPath = clnCfg.getJettyPath();
+            jettyHost = getProperty(IGNITE_JETTY_HOST);
+            jettyPort = intValue(IGNITE_JETTY_PORT, null);
+            tcpHost = clnCfg.getHost();
+            tcpPort = clnCfg.getPort();
+            tcpSslCtxFactory = compactClass(clnCfg.getSslContextFactory());
         }
-
-        return cfg;
     }
 
     /**
      * @return Whether REST enabled or not.
      */
-    public boolean restEnabled() {
+    public boolean isRestEnabled() {
         return restEnabled;
     }
 
     /**
      * @return Whether or not SSL is enabled for TCP binary protocol.
      */
-    public boolean tcpSslEnabled() {
+    public boolean isTcpSslEnabled() {
         return tcpSslEnabled;
     }
 
     /**
-     * @return Rest accessible folders (log command can get files from).
-     */
-    @Nullable public String[] accessibleFolders() {
-        return accessibleFolders;
-    }
-
-    /**
      * @return Jetty config path.
      */
-    @Nullable public String jettyPath() {
+    @Nullable public String getJettyPath() {
         return jettyPath;
     }
 
     /**
      * @return Jetty host.
      */
-    @Nullable public String jettyHost() {
+    @Nullable public String getJettyHost() {
         return jettyHost;
     }
 
     /**
      * @return Jetty port.
      */
-    @Nullable public Integer jettyPort() {
+    @Nullable public Integer getJettyPort() {
         return jettyPort;
     }
 
     /**
      * @return REST TCP binary host.
      */
-    @Nullable public String tcpHost() {
+    @Nullable public String getTcpHost() {
         return tcpHost;
     }
 
     /**
      * @return REST TCP binary port.
      */
-    @Nullable public Integer tcpPort() {
+    @Nullable public Integer getTcpPort() {
         return tcpPort;
     }
 
     /**
      * @return Context factory for SSL.
      */
-    @Nullable public String tcpSslContextFactory() {
+    @Nullable public String getTcpSslContextFactory() {
         return tcpSslCtxFactory;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeBoolean(restEnabled);
+        out.writeBoolean(tcpSslEnabled);
+        U.writeString(out, jettyPath);
+        U.writeString(out, jettyHost);
+        out.writeObject(jettyPort);
+        U.writeString(out, tcpHost);
+        out.writeObject(tcpPort);
+        U.writeString(out, tcpSslCtxFactory);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        restEnabled = in.readBoolean();
+        tcpSslEnabled = in.readBoolean();
+        jettyPath = U.readString(in);
+        jettyHost = U.readString(in);
+        jettyPort = (Integer)in.readObject();
+        tcpHost = U.readString(in);
+        tcpPort = (Integer)in.readObject();
+        tcpSslCtxFactory = U.readString(in);
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorRestConfiguration.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorSegmentationConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorSegmentationConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorSegmentationConfiguration.java
index 44909fc..6516141 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorSegmentationConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorSegmentationConfiguration.java
@@ -17,10 +17,13 @@
 
 package org.apache.ignite.internal.visor.node;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 import org.apache.ignite.plugin.segmentation.SegmentationPolicy;
 import org.jetbrains.annotations.Nullable;
 
@@ -29,7 +32,7 @@ import static org.apache.ignite.internal.visor.util.VisorTaskUtils.compactArray;
 /**
  * Data transfer object for node segmentation configuration properties.
  */
-public class VisorSegmentationConfiguration implements Serializable, LessNamingBean {
+public class VisorSegmentationConfiguration extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -46,57 +49,79 @@ public class VisorSegmentationConfiguration implements Serializable, LessNamingB
     private boolean waitOnStart;
 
     /** Whether or not all resolvers should succeed for node to be in correct segment. */
-    private boolean passRequired;
+    private boolean allResolversPassReq;
 
     /**
-     * @param c Grid configuration.
-     * @return Data transfer object for node segmentation configuration properties.
+     * Default constructor.
      */
-    public static VisorSegmentationConfiguration from(IgniteConfiguration c) {
-        VisorSegmentationConfiguration cfg = new VisorSegmentationConfiguration();
-
-        cfg.plc = c.getSegmentationPolicy();
-        cfg.resolvers = compactArray(c.getSegmentationResolvers());
-        cfg.checkFreq = c.getSegmentCheckFrequency();
-        cfg.waitOnStart = c.isWaitForSegmentOnStart();
-        cfg.passRequired = c.isAllSegmentationResolversPassRequired();
+    public VisorSegmentationConfiguration() {
+        // No-op.
+    }
 
-        return cfg;
+    /**
+     * Create data transfer object for node segmentation configuration properties.
+     *
+     * @param c Grid configuration.
+     */
+    public VisorSegmentationConfiguration(IgniteConfiguration c) {
+        plc = c.getSegmentationPolicy();
+        resolvers = compactArray(c.getSegmentationResolvers());
+        checkFreq = c.getSegmentCheckFrequency();
+        waitOnStart = c.isWaitForSegmentOnStart();
+        allResolversPassReq = c.isAllSegmentationResolversPassRequired();
     }
 
     /**
      * @return Segmentation policy.
      */
-    public SegmentationPolicy policy() {
+    public SegmentationPolicy getPolicy() {
         return plc;
     }
 
     /**
      * @return Segmentation resolvers.
      */
-    @Nullable public String resolvers() {
+    @Nullable public String getResolvers() {
         return resolvers;
     }
 
     /**
      * @return Frequency of network segment check by discovery manager.
      */
-    public long checkFrequency() {
+    public long getCheckFrequency() {
         return checkFreq;
     }
 
     /**
      * @return Whether or not node should wait for correct segment on start.
      */
-    public boolean waitOnStart() {
+    public boolean isWaitOnStart() {
         return waitOnStart;
     }
 
     /**
      * @return Whether or not all resolvers should succeed for node to be in correct segment.
      */
-    public boolean passRequired() {
-        return passRequired;
+    public boolean isAllSegmentationResolversPassRequired() {
+        return allResolversPassReq;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeEnum(out, plc);
+        U.writeString(out, resolvers);
+        out.writeLong(checkFreq);
+        out.writeBoolean(waitOnStart);
+        out.writeBoolean(allResolversPassReq);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        plc = SegmentationPolicy.fromOrdinal(in.readByte());
+        resolvers = U.readString(in);
+        checkFreq = in.readLong();
+        waitOnStart = in.readBoolean();
+        allResolversPassReq = in.readBoolean();
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorSpiDescription.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorSpiDescription.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorSpiDescription.java
new file mode 100644
index 0000000..2d1eb48
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorSpiDescription.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.node;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Map;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Transfer object for single spi description.
+ */
+public class VisorSpiDescription extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** SPI class name. */
+    private String clsName;
+
+    /** SPI fields description. */
+    private Map<String, Object> fldDesc;
+
+    /**
+     * Default constructor.
+     */
+    public VisorSpiDescription() {
+        // No-op.
+    }
+
+    /**
+     * Construct Visor spi description object.
+     *
+     * @param clsName SPI class name.
+     * @param fldDesc SPI fields description.
+     */
+    public VisorSpiDescription(String clsName, Map<String, Object> fldDesc) {
+        this.clsName = clsName;
+        this.fldDesc = fldDesc;
+    }
+
+    /**
+     * @return SPI class name.
+     */
+    public String getClassName() {
+        return clsName;
+    }
+
+    /**
+     * @return SPI fields description.
+     */
+    public Map<String, Object> getFieldDescriptions() {
+        return fldDesc;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, clsName);
+        U.writeMap(out, fldDesc);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        clsName = U.readString(in);
+        fldDesc = U.readMap(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorSpiDescription.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorSpisConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorSpisConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorSpisConfiguration.java
index 55653a3..83cc7c1 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorSpisConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorSpisConfiguration.java
@@ -17,16 +17,16 @@
 
 package org.apache.ignite.internal.visor.node;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.HashMap;
-import java.util.Map;
 import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.S;
-import org.apache.ignite.lang.IgniteBiTuple;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 import org.apache.ignite.spi.IgniteSpi;
 import org.apache.ignite.spi.IgniteSpiConfiguration;
 
@@ -36,36 +36,43 @@ import static org.apache.ignite.internal.visor.util.VisorTaskUtils.compactObject
 /**
  * Data transfer object for node SPIs configuration properties.
  */
-public class VisorSpisConfiguration implements Serializable, LessNamingBean {
+public class VisorSpisConfiguration extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
     /** Discovery SPI. */
-    private IgniteBiTuple<String, Map<String, Object>> discoSpi;
+    private VisorSpiDescription discoSpi;
 
     /** Communication SPI. */
-    private IgniteBiTuple<String, Map<String, Object>> commSpi;
+    private VisorSpiDescription commSpi;
 
     /** Event storage SPI. */
-    private IgniteBiTuple<String, Map<String, Object>> evtSpi;
+    private VisorSpiDescription evtSpi;
 
     /** Collision SPI. */
-    private IgniteBiTuple<String, Map<String, Object>> colSpi;
+    private VisorSpiDescription colSpi;
 
     /** Deployment SPI. */
-    private IgniteBiTuple<String, Map<String, Object>> deploySpi;
+    private VisorSpiDescription deploySpi;
 
     /** Checkpoint SPIs. */
-    private IgniteBiTuple<String, Map<String, Object>>[] cpSpis;
+    private VisorSpiDescription[] cpSpis;
 
     /** Failover SPIs. */
-    private IgniteBiTuple<String, Map<String, Object>>[] failSpis;
+    private VisorSpiDescription[] failSpis;
 
     /** Load balancing SPIs. */
-    private IgniteBiTuple<String, Map<String, Object>>[] loadBalancingSpis;
+    private VisorSpiDescription[] loadBalancingSpis;
 
     /** Indexing SPIs. */
-    private IgniteBiTuple<String, Map<String, Object>>[] indexingSpis;
+    private VisorSpiDescription[] indexingSpis;
+
+    /**
+     * Default constructor.
+     */
+    public VisorSpisConfiguration() {
+        // No-op.
+    }
 
     /**
      * Collects SPI information based on GridSpiConfiguration-annotated methods.
@@ -74,7 +81,7 @@ public class VisorSpisConfiguration implements Serializable, LessNamingBean {
      * @param spi SPI to collect information on.
      * @return Tuple where first component is SPI name and map with properties as second.
      */
-    private static IgniteBiTuple<String, Map<String, Object>> collectSpiInfo(IgniteSpi spi) {
+    private static VisorSpiDescription collectSpiInfo(IgniteSpi spi) {
         Class<? extends IgniteSpi> spiCls = spi.getClass();
 
         HashMap<String, Object> res = new HashMap<>();
@@ -88,13 +95,13 @@ public class VisorSpisConfiguration implements Serializable, LessNamingBean {
                 if (mtdName.startsWith("set")) {
                     String propName = Character.toLowerCase(mtdName.charAt(3)) + mtdName.substring(4);
 
-                    String[] getterNames = new String[] {
-                        "get" + mtdName.substring(3),
-                        "is" + mtdName.substring(3),
-                        "get" + mtdName.substring(3) + "Formatted"
-                    };
-
                     try {
+                        String[] getterNames = new String[] {
+                            "get" + mtdName.substring(3),
+                            "is" + mtdName.substring(3),
+                            "get" + mtdName.substring(3) + "Formatted"
+                        };
+
                         for (String getterName : getterNames) {
                             try {
                                 Method getter = spiCls.getDeclaredMethod(getterName);
@@ -120,106 +127,129 @@ public class VisorSpisConfiguration implements Serializable, LessNamingBean {
             }
         }
 
-        return new IgniteBiTuple<String, Map<String, Object>>(spi.getName(), res);
+        return new VisorSpiDescription(spi.getName(), res);
     }
 
     /**
      * @param spis Array of spi to process.
      * @return Tuple where first component is SPI name and map with properties as second.
      */
-    private static IgniteBiTuple<String, Map<String, Object>>[] collectSpiInfo(IgniteSpi[] spis) {
-        IgniteBiTuple[] res = new IgniteBiTuple[spis.length];
+    private static VisorSpiDescription[] collectSpiInfo(IgniteSpi[] spis) {
+        VisorSpiDescription[] res = new VisorSpiDescription[spis.length];
 
         for (int i = 0; i < spis.length; i++)
             res[i] = collectSpiInfo(spis[i]);
 
-        return (IgniteBiTuple<String, Map<String, Object>>[])res;
+        return res;
     }
 
     /**
+     * Create data transfer object for node SPIs configuration properties.
+     *
      * @param c Grid configuration.
-     * @return Data transfer object for node SPIs configuration properties.
      */
-    public static VisorSpisConfiguration from(IgniteConfiguration c) {
-        VisorSpisConfiguration cfg = new VisorSpisConfiguration();
-
-        cfg.discoSpi = collectSpiInfo(c.getDiscoverySpi());
-        cfg.commSpi = collectSpiInfo(c.getCommunicationSpi());
-        cfg.evtSpi = collectSpiInfo(c.getEventStorageSpi());
-        cfg.colSpi = collectSpiInfo(c.getCollisionSpi());
-        cfg.deploySpi = collectSpiInfo(c.getDeploymentSpi());
-        cfg.cpSpis = collectSpiInfo(c.getCheckpointSpi());
-        cfg.failSpis = collectSpiInfo(c.getFailoverSpi());
-        cfg.loadBalancingSpis = collectSpiInfo(c.getLoadBalancingSpi());
-        cfg.indexingSpis = F.asArray(collectSpiInfo(c.getIndexingSpi()));
-
-        return cfg;
+    public VisorSpisConfiguration(IgniteConfiguration c) {
+        discoSpi = collectSpiInfo(c.getDiscoverySpi());
+        commSpi = collectSpiInfo(c.getCommunicationSpi());
+        evtSpi = collectSpiInfo(c.getEventStorageSpi());
+        colSpi = collectSpiInfo(c.getCollisionSpi());
+        deploySpi = collectSpiInfo(c.getDeploymentSpi());
+        cpSpis = collectSpiInfo(c.getCheckpointSpi());
+        failSpis = collectSpiInfo(c.getFailoverSpi());
+        loadBalancingSpis = collectSpiInfo(c.getLoadBalancingSpi());
+        indexingSpis = F.asArray(collectSpiInfo(c.getIndexingSpi()));
     }
 
     /**
      * @return Discovery SPI.
      */
-    public IgniteBiTuple<String, Map<String, Object>> discoverySpi() {
+    public VisorSpiDescription getDiscoverySpi() {
         return discoSpi;
     }
 
     /**
      * @return Communication SPI.
      */
-    public IgniteBiTuple<String, Map<String, Object>> communicationSpi() {
+    public VisorSpiDescription getCommunicationSpi() {
         return commSpi;
     }
 
     /**
      * @return Event storage SPI.
      */
-    public IgniteBiTuple<String, Map<String, Object>> eventStorageSpi() {
+    public VisorSpiDescription getEventStorageSpi() {
         return evtSpi;
     }
 
     /**
      * @return Collision SPI.
      */
-    public IgniteBiTuple<String, Map<String, Object>> collisionSpi() {
+    public VisorSpiDescription getCollisionSpi() {
         return colSpi;
     }
 
     /**
      * @return Deployment SPI.
      */
-    public IgniteBiTuple<String, Map<String, Object>> deploymentSpi() {
+    public VisorSpiDescription getDeploymentSpi() {
         return deploySpi;
     }
 
     /**
      * @return Checkpoint SPIs.
      */
-    public IgniteBiTuple<String, Map<String, Object>>[] checkpointSpis() {
+    public VisorSpiDescription[] getCheckpointSpis() {
         return cpSpis;
     }
 
     /**
      * @return Failover SPIs.
      */
-    public IgniteBiTuple<String, Map<String, Object>>[] failoverSpis() {
+    public VisorSpiDescription[] getFailoverSpis() {
         return failSpis;
     }
 
     /**
      * @return Load balancing SPIs.
      */
-    public IgniteBiTuple<String, Map<String, Object>>[] loadBalancingSpis() {
+    public VisorSpiDescription[] getLoadBalancingSpis() {
         return loadBalancingSpis;
     }
 
     /**
      * @return Indexing SPIs.
      */
-    public IgniteBiTuple<String, Map<String, Object>>[] indexingSpis() {
+    public VisorSpiDescription[] getIndexingSpis() {
         return indexingSpis;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeObject(discoSpi);
+        out.writeObject(commSpi);
+        out.writeObject(evtSpi);
+        out.writeObject(colSpi);
+        out.writeObject(deploySpi);
+        out.writeObject(cpSpis);
+        out.writeObject(failSpis);
+        out.writeObject(loadBalancingSpis);
+        out.writeObject(indexingSpis);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        discoSpi = (VisorSpiDescription)in.readObject();
+        commSpi = (VisorSpiDescription)in.readObject();
+        evtSpi = (VisorSpiDescription)in.readObject();
+        colSpi = (VisorSpiDescription)in.readObject();
+        deploySpi = (VisorSpiDescription)in.readObject();
+        cpSpis = (VisorSpiDescription[])in.readObject();
+        failSpis = (VisorSpiDescription[])in.readObject();
+        loadBalancingSpis = (VisorSpiDescription[])in.readObject();
+        indexingSpis = (VisorSpiDescription[])in.readObject();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorSpisConfiguration.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorSuppressedError.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorSuppressedError.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorSuppressedError.java
new file mode 100644
index 0000000..2ffaabd
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorSuppressedError.java
@@ -0,0 +1,147 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.node;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.internal.util.tostring.GridToStringExclude;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+import org.apache.ignite.internal.visor.util.VisorExceptionWrapper;
+
+/**
+ * Data transfer object for suppressed errors.
+ */
+public class VisorSuppressedError extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** */
+    private long order;
+
+    /** */
+    @GridToStringExclude
+    private VisorExceptionWrapper error;
+
+    /** */
+    private long threadId;
+
+    /** */
+    private String threadName;
+
+    /** */
+    private long time;
+
+    /** */
+    private String msg;
+
+    /**
+     * Default constructor.
+     */
+    public VisorSuppressedError() {
+        // No-op.
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param order Locally unique ID that is atomically incremented for each new error.
+     * @param error Suppressed error.
+     * @param msg Message that describe reason why error was suppressed.
+     * @param threadId Thread ID.
+     * @param threadName Thread name.
+     * @param time Occurrence time.
+     */
+    public VisorSuppressedError(long order, VisorExceptionWrapper error, String msg, long threadId, String threadName, long time) {
+        this.order = order;
+        this.error = error;
+        this.threadId = threadId;
+        this.threadName = threadName;
+        this.time = time;
+        this.msg = msg;
+    }
+
+    /**
+     * @return Locally unique ID that is atomically incremented for each new error.
+     */
+    public long getOrder() {
+        return order;
+    }
+
+    /**
+     * @return Gets message that describe reason why error was suppressed.
+     */
+    public String getMessage() {
+        return msg;
+    }
+
+    /**
+     * @return Suppressed error.
+     */
+    public VisorExceptionWrapper getError() {
+        return error;
+    }
+
+    /**
+     * @return Gets thread ID.
+     */
+    public long getThreadId() {
+        return threadId;
+    }
+
+    /**
+     * @return Gets thread name.
+     */
+    public String getThreadName() {
+        return threadName;
+    }
+
+    /**
+     * @return Gets time.
+     */
+    public long getTime() {
+        return time;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeLong(order);
+        out.writeObject(error);
+        out.writeLong(threadId);
+        U.writeString(out, threadName);
+        out.writeLong(time);
+        U.writeString(out, msg);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        order = in.readLong();
+        error = (VisorExceptionWrapper)in.readObject();
+        threadId = in.readLong();
+        threadName= U.readString(in);
+        time = in.readLong();
+        msg = U.readString(in);
+    }
+
+    /** {@inheritDoc} */
+    public String toString() {
+        return S.toString(VisorSuppressedError.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorTransactionConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorTransactionConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorTransactionConfiguration.java
index 6855c43..1ac827a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorTransactionConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorTransactionConfiguration.java
@@ -17,28 +17,33 @@
 
 package org.apache.ignite.internal.visor.node;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.apache.ignite.configuration.TransactionConfiguration;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 import org.apache.ignite.transactions.TransactionConcurrency;
 import org.apache.ignite.transactions.TransactionIsolation;
 
+import static org.apache.ignite.internal.visor.util.VisorTaskUtils.compactClass;
+
 /**
  * Data transfer object for transaction configuration.
  */
-public class VisorTransactionConfiguration implements Serializable, LessNamingBean {
+public class VisorTransactionConfiguration extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
     /** Default cache concurrency. */
-    private TransactionConcurrency dfltTxConcurrency;
+    private TransactionConcurrency dfltConcurrency;
 
     /** Default transaction isolation. */
-    private TransactionIsolation dfltTxIsolation;
+    private TransactionIsolation dfltIsolation;
 
     /** Default transaction timeout. */
-    private long dfltTxTimeout;
+    private long dfltTimeout;
 
     /** Pessimistic tx log linger. */
     private int pessimisticTxLogLinger;
@@ -46,53 +51,62 @@ public class VisorTransactionConfiguration implements Serializable, LessNamingBe
     /** Pessimistic tx log size. */
     private int pessimisticTxLogSize;
 
-    /** Default transaction serializable flag. */
-    private boolean txSerEnabled;
+    /** Transaction manager factory. */
+    private String txMgrFactory;
 
     /**
-     * Create data transfer object for transaction configuration.
-     *
-     * @param src Transaction configuration.
-     * @return Data transfer object.
+     * Default constructor.
      */
-    public static VisorTransactionConfiguration from(TransactionConfiguration src) {
-        VisorTransactionConfiguration cfg = new VisorTransactionConfiguration();
+    public VisorTransactionConfiguration() {
+        // No-op.
+    }
 
-        cfg.dfltTxConcurrency = src.getDefaultTxConcurrency();
-        cfg.dfltTxIsolation = src.getDefaultTxIsolation();
-        cfg.dfltTxTimeout = src.getDefaultTxTimeout();
-        cfg.pessimisticTxLogLinger = src.getPessimisticTxLogLinger();
-        cfg.pessimisticTxLogSize = src.getPessimisticTxLogSize();
-        cfg.txSerEnabled = src.isTxSerializableEnabled();
+    /**
+     * Whether to use JTA {@code javax.transaction.Synchronization}
+     * instead of {@code javax.transaction.xa.XAResource}.
+     */
+    private boolean useJtaSync;
 
-        return cfg;
+    /**
+     * Create data transfer object for transaction configuration.
+     *
+     * @param cfg Transaction configuration.
+     */
+    public VisorTransactionConfiguration(TransactionConfiguration cfg) {
+        dfltConcurrency = cfg.getDefaultTxConcurrency();
+        dfltIsolation = cfg.getDefaultTxIsolation();
+        dfltTimeout = cfg.getDefaultTxTimeout();
+        pessimisticTxLogLinger = cfg.getPessimisticTxLogLinger();
+        pessimisticTxLogSize = cfg.getPessimisticTxLogSize();
+        txMgrFactory = compactClass(cfg.getTxManagerFactory());
+        useJtaSync = cfg.isUseJtaSynchronization();
     }
 
     /**
      * @return Default cache transaction concurrency.
      */
-    public TransactionConcurrency defaultTxConcurrency() {
-        return dfltTxConcurrency;
+    public TransactionConcurrency getDefaultTxConcurrency() {
+        return dfltConcurrency;
     }
 
     /**
      * @return Default cache transaction isolation.
      */
-    public TransactionIsolation defaultTxIsolation() {
-        return dfltTxIsolation;
+    public TransactionIsolation getDefaultTxIsolation() {
+        return dfltIsolation;
     }
 
     /**
      * @return Default transaction timeout.
      */
-    public long defaultTxTimeout() {
-        return dfltTxTimeout;
+    public long getDefaultTxTimeout() {
+        return dfltTimeout;
     }
 
     /**
      * @return Pessimistic log cleanup delay in milliseconds.
      */
-    public int pessimisticTxLogLinger() {
+    public int getPessimisticTxLogLinger() {
         return pessimisticTxLogLinger;
     }
 
@@ -104,10 +118,38 @@ public class VisorTransactionConfiguration implements Serializable, LessNamingBe
     }
 
     /**
-     * @return {@code True} if serializable transactions are enabled, {@code false} otherwise.
+     * @return Transaction manager factory.
      */
-    public boolean txSerializableEnabled() {
-        return txSerEnabled;
+    public String getTxManagerFactory() {
+        return txMgrFactory;
+    }
+
+    /**
+     * @return Whether to use JTA {@code javax.transaction.Synchronization}
+     *     instead of {@code javax.transaction.xa.XAResource}.
+     */
+    public boolean isUseJtaSync() {
+        return useJtaSync;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeEnum(out, dfltConcurrency);
+        U.writeEnum(out, dfltIsolation);
+        out.writeLong(dfltTimeout);
+        out.writeInt(pessimisticTxLogLinger);
+        out.writeInt(pessimisticTxLogSize);
+        U.writeString(out, txMgrFactory);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        dfltConcurrency = TransactionConcurrency.fromOrdinal(in.readByte());
+        dfltIsolation = TransactionIsolation.fromOrdinal(in.readByte());
+        dfltTimeout = in.readLong();
+        pessimisticTxLogLinger = in.readInt();
+        pessimisticTxLogSize = in.readInt();
+        txMgrFactory = U.readString(in);
     }
 
     /** {@inheritDoc} */


[08/11] ignite git commit: IGNITE-4988 Cleanup and refactor VisorXxx tasks and DTO for ignite-2.0

Posted by ak...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStoreConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStoreConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStoreConfiguration.java
index fd3d980..dc1ba2a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStoreConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStoreConfiguration.java
@@ -17,14 +17,17 @@
 
 package org.apache.ignite.internal.visor.cache;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.apache.ignite.cache.store.CacheStore;
 import org.apache.ignite.cache.store.jdbc.CacheAbstractJdbcStore;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.internal.IgniteEx;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.processors.cache.IgniteCacheProxy;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 import org.jetbrains.annotations.Nullable;
 
 import static org.apache.ignite.internal.visor.util.VisorTaskUtils.compactClass;
@@ -32,7 +35,7 @@ import static org.apache.ignite.internal.visor.util.VisorTaskUtils.compactClass;
 /**
  * Data transfer object for cache store configuration properties.
  */
-public class VisorCacheStoreConfiguration implements Serializable, LessNamingBean {
+public class VisorCacheStoreConfiguration extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -70,11 +73,19 @@ public class VisorCacheStoreConfiguration implements Serializable, LessNamingBea
     private boolean storeKeepBinary;
 
     /**
+     * Default constructor.
+     */
+    public VisorCacheStoreConfiguration() {
+        // No-op.
+    }
+
+    /**
+     * Create data transfer object for cache store configuration properties.
+     *
      * @param ignite Ignite instance.
      * @param ccfg Cache configuration.
-     * @return Data transfer object for cache store configuration properties.
      */
-    public VisorCacheStoreConfiguration from(IgniteEx ignite, CacheConfiguration ccfg) {
+    public VisorCacheStoreConfiguration(IgniteEx ignite, CacheConfiguration ccfg) {
         IgniteCacheProxy<Object, Object> c = ignite.context().cache().jcache(ccfg.getName());
 
         CacheStore cstore = c != null && c.context().started() ? c.context().store().configuredStore() : null;
@@ -94,95 +105,123 @@ public class VisorCacheStoreConfiguration implements Serializable, LessNamingBea
         flushThreadCnt = ccfg.getWriteBehindFlushThreadCount();
 
         storeKeepBinary = ccfg.isStoreKeepBinary();
-
-        return this;
     }
 
     /**
      * @return {@code true} if cache has store.
      */
-    public boolean enabled() {
+    public boolean isEnabled() {
         return store != null;
     }
 
     /**
      * @return {@code true} if cache has JDBC store.
      */
-    public boolean jdbcStore() {
+    public boolean isJdbcStore() {
         return jdbcStore;
     }
 
     /**
      * @return Cache store class name.
      */
-    @Nullable public String store() {
+    @Nullable public String getStore() {
         return store;
     }
 
     /**
      * @return Cache store factory class name..
      */
-    public String storeFactory() {
+    public String getStoreFactory() {
         return storeFactory;
     }
 
     /**
      * @return Whether cache should operate in read-through mode.
      */
-    public boolean readThrough() {
+    public boolean isReadThrough() {
         return readThrough;
     }
 
     /**
      * @return Whether cache should operate in write-through mode.
      */
-    public boolean writeThrough() {
+    public boolean isWriteThrough() {
         return writeThrough;
     }
 
     /**
      * @return Flag indicating whether write-behind behaviour should be used for the cache store.
      */
-    public boolean writeBehindEnabled() {
+    public boolean isWriteBehindEnabled() {
         return writeBehindEnabled;
     }
 
     /**
      * @return Maximum batch size for write-behind cache store operations.
      */
-    public int batchSize() {
+    public int getBatchSize() {
         return batchSz;
     }
 
     /**
      * @return Frequency with which write-behind cache is flushed to the cache store in milliseconds.
      */
-    public long flushFrequency() {
+    public long getFlushFrequency() {
         return flushFreq;
     }
 
     /**
      * @return Maximum object count in write-behind cache.
      */
-    public int flushSize() {
+    public int getFlushSize() {
         return flushSz;
     }
 
     /**
      * @return Number of threads that will perform cache flushing.
      */
-    public int flushThreadCount() {
+    public int getFlushThreadCount() {
         return flushThreadCnt;
     }
 
     /**
      * @return Keep binary in store flag.
      */
-    public boolean storeKeepBinary() {
+    public boolean isStoreKeepBinary() {
         return storeKeepBinary;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeBoolean(jdbcStore);
+        U.writeString(out, store);
+        U.writeString(out, storeFactory);
+        out.writeBoolean(readThrough);
+        out.writeBoolean(writeThrough);
+        out.writeBoolean(writeBehindEnabled);
+        out.writeInt(batchSz);
+        out.writeLong(flushFreq);
+        out.writeInt(flushSz);
+        out.writeInt(flushThreadCnt);
+        out.writeBoolean(storeKeepBinary);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        jdbcStore = in.readBoolean();
+        store = U.readString(in);
+        storeFactory = U.readString(in);
+        readThrough = in.readBoolean();
+        writeThrough = in.readBoolean();
+        writeBehindEnabled = in.readBoolean();
+        batchSz = in.readInt();
+        flushFreq = in.readLong();
+        flushSz = in.readInt();
+        flushThreadCnt = in.readInt();
+        storeKeepBinary = in.readBoolean();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorCacheStoreConfiguration.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheTypeFieldMetadata.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheTypeFieldMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheTypeFieldMetadata.java
deleted file mode 100644
index c9bf960..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheTypeFieldMetadata.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.visor.cache;
-
-import java.io.Serializable;
-import org.apache.ignite.cache.store.jdbc.JdbcTypeField;
-import org.apache.ignite.internal.LessNamingBean;
-
-/**
- * Data transfer object for {@link JdbcTypeField}.
- */
-public class VisorCacheTypeFieldMetadata implements Serializable, LessNamingBean {
-    /** */
-    private static final long serialVersionUID = 0L;
-
-    /** Column name in database. */
-    private String dbName;
-
-    /** Column JDBC type in database. */
-    private int dbType;
-
-    /** Field name in java object. */
-    private String javaName;
-
-    /** Corresponding java type. */
-    private String javaType;
-
-    /**
-     * Empty constructor.
-     */
-    public VisorCacheTypeFieldMetadata() {
-        // No-op.
-    }
-
-    /**
-     * Full constructor.
-     *
-     * @param dbName Column name in database.
-     * @param dbType Column JDBC type in database.
-     * @param javaName Field name in java object.
-     * @param javaType Corresponding java type.
-     */
-    public VisorCacheTypeFieldMetadata(String dbName, int dbType, String javaName, String javaType) {
-        this.dbName = dbName;
-        this.dbType = dbType;
-        this.javaName = javaName;
-        this.javaType = javaType;
-    }
-
-    /**
-     * @return Column name in database.
-     */
-    public String dbName() {
-        return dbName;
-    }
-
-    /**
-     * @return Column JDBC type in database.
-     */
-    public int dbType() {
-        return dbType;
-    }
-
-    /**
-     * @return Field name in java object.
-     */
-    public String javaName() {
-        return javaName;
-    }
-
-    /**
-     * @return Corresponding java type.
-     */
-    public String javaType() {
-        return javaType;
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheTypeMetadata.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheTypeMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheTypeMetadata.java
deleted file mode 100644
index 7463887..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheTypeMetadata.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.visor.cache;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import org.apache.ignite.cache.QueryEntity;
-import org.apache.ignite.cache.QueryIndex;
-import org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStoreFactory;
-import org.apache.ignite.cache.store.jdbc.JdbcType;
-import org.apache.ignite.cache.store.jdbc.JdbcTypeField;
-import org.apache.ignite.internal.LessNamingBean;
-import org.apache.ignite.internal.util.tostring.GridToStringInclude;
-import org.apache.ignite.internal.util.typedef.internal.S;
-import org.apache.ignite.internal.util.typedef.internal.U;
-import org.apache.ignite.lang.IgniteBiTuple;
-
-import javax.cache.configuration.Factory;
-
-/**
- * Data transfer object for {@link JdbcType}.
- */
-public class VisorCacheTypeMetadata implements Serializable, LessNamingBean {
-    /** */
-    private static final long serialVersionUID = 0L;
-
-    /** Schema name in database. */
-    private String dbSchema;
-
-    /** Table name in database. */
-    private String dbTbl;
-
-    /** Key class used to store key in cache. */
-    private String keyType;
-
-    /** Value class used to store value in cache. */
-    private String valType;
-
-    /** Key fields. */
-    @GridToStringInclude
-    private Collection<VisorCacheTypeFieldMetadata> keyFields;
-
-    /** Value fields. */
-    @GridToStringInclude
-    private Collection<VisorCacheTypeFieldMetadata> valFields;
-
-    /** Fields to be queried, in addition to indexed fields. */
-    @GridToStringInclude
-    private Map<String, String> qryFlds;
-
-    /** Fields to index in ascending order. */
-    @GridToStringInclude
-    private Map<String, String> ascFlds;
-
-    /** Fields to index in descending order. */
-    @GridToStringInclude
-    private Map<String, String> descFlds;
-
-    /** Fields to index as text. */
-    @GridToStringInclude
-    private Collection<String> txtFlds;
-
-    /** Fields to create group indexes for. */
-    @GridToStringInclude
-    private Map<String, LinkedHashMap<String, IgniteBiTuple<String, Boolean>>> grps;
-
-    /**
-     * @param qryEntities Collection of query entities.
-     * @param factory Store factory to extract JDBC types info.
-     * @return Data transfer object for cache type metadata configurations.
-     */
-    public static Collection<VisorCacheTypeMetadata> list(Collection<QueryEntity> qryEntities, Factory factory) {
-        final Collection<VisorCacheTypeMetadata> metas = new ArrayList<>();
-
-        Map<String, VisorCacheTypeMetadata> metaMap =
-                U.newHashMap(qryEntities != null ? qryEntities.size() : 0);
-
-        // Add query entries.
-        if (qryEntities != null)
-            for (QueryEntity qryEntity : qryEntities) {
-                VisorCacheTypeMetadata meta = from(qryEntity);
-
-                metas.add(meta);
-
-                metaMap.put(meta.keyType, meta);
-            }
-
-        // Add JDBC types.
-        if (factory != null && factory instanceof CacheJdbcPojoStoreFactory) {
-             CacheJdbcPojoStoreFactory jdbcFactory = (CacheJdbcPojoStoreFactory) factory;
-
-            JdbcType[] jdbcTypes = jdbcFactory.getTypes();
-
-            if (jdbcTypes != null && jdbcTypes.length > 0) {
-                for (JdbcType jdbcType : jdbcTypes) {
-                    VisorCacheTypeMetadata meta = metaMap.get(jdbcType.getKeyType());
-
-                    boolean notFound = meta == null;
-
-                    if (notFound) {
-                        meta = new VisorCacheTypeMetadata();
-
-                        meta.keyType = jdbcType.getKeyType();
-                        meta.valType = jdbcType.getValueType();
-
-                        meta.qryFlds = Collections.emptyMap();
-                        meta.ascFlds = Collections.emptyMap();
-                        meta.descFlds = Collections.emptyMap();
-                        meta.txtFlds = Collections.emptyList();
-                        meta.grps = Collections.emptyMap();
-                    }
-
-                    meta.dbSchema = jdbcType.getDatabaseSchema();
-                    meta.dbTbl = jdbcType.getDatabaseTable();
-
-                    JdbcTypeField[] keyFields = jdbcType.getKeyFields();
-
-                    if (keyFields != null) {
-                        meta.keyFields = new ArrayList<>(keyFields.length);
-
-                        for (JdbcTypeField fld : keyFields)
-                            meta.keyFields.add(new VisorCacheTypeFieldMetadata(
-                                fld.getDatabaseFieldName(), fld.getDatabaseFieldType(),
-                                fld.getDatabaseFieldName(), U.compact(fld.getJavaFieldType().getName())));
-                    }
-
-                    JdbcTypeField[] valFields = jdbcType.getValueFields();
-
-                    if (valFields != null) {
-                        meta.valFields = new ArrayList<>(valFields.length);
-
-                        for (JdbcTypeField fld : valFields)
-                            meta.valFields.add(new VisorCacheTypeFieldMetadata(
-                                fld.getDatabaseFieldName(), fld.getDatabaseFieldType(),
-                                fld.getDatabaseFieldName(), U.compact(fld.getJavaFieldType().getName())));
-                    }
-
-                    if (notFound)
-                        metas.add(meta);
-                }
-            }
-        }
-
-        return metas;
-    }
-
-    /**
-     * @param q Actual cache query entities.
-     * @return Data transfer object for given cache type metadata.
-     */
-    public static VisorCacheTypeMetadata from(QueryEntity q) {
-        assert q != null;
-
-        VisorCacheTypeMetadata metadata = new VisorCacheTypeMetadata();
-
-        metadata.keyType = q.getKeyType();
-        metadata.valType = q.getValueType();
-
-        metadata.dbSchema = "";
-        metadata.dbTbl = "";
-
-        metadata.keyFields = Collections.emptyList();
-        metadata.valFields = Collections.emptyList();
-
-        LinkedHashMap<String, String> qryFields = q.getFields();
-
-        metadata.qryFlds = new LinkedHashMap<>(qryFields);
-
-        metadata.ascFlds = Collections.emptyMap();
-        metadata.descFlds = Collections.emptyMap();
-        metadata.txtFlds = Collections.emptyList();
-
-        Collection<QueryIndex> qryIdxs = q.getIndexes();
-
-        metadata.grps = new LinkedHashMap<>(qryIdxs.size());
-
-        for (QueryIndex qryIdx : qryIdxs) {
-            LinkedHashMap<String, Boolean> qryIdxFlds = qryIdx.getFields();
-
-            LinkedHashMap<String, IgniteBiTuple<String, Boolean>> grpFlds = new LinkedHashMap<>();
-
-            for (Map.Entry<String, Boolean> qryIdxFld : qryIdxFlds.entrySet()) {
-                String fldName = qryIdxFld.getKey();
-
-                grpFlds.put(fldName, new IgniteBiTuple<>(qryFields.get(fldName), !qryIdxFld.getValue()));
-            }
-
-            metadata.grps.put(qryIdx.getName(), grpFlds);
-        }
-
-        return metadata;
-    }
-
-    /**
-     * @return Schema name in database.
-     */
-    public String dbSchema() {
-        return dbSchema;
-    }
-
-    /**
-     * @return Table name in database.
-     */
-    public String dbTbl() {
-        return dbTbl;
-    }
-
-    /**
-     * @return Key class used to store key in cache.
-     */
-    public String keyType() {
-        return keyType;
-    }
-
-    /**
-     * @return Value class used to store value in cache.
-     */
-    public String valType() {
-        return valType;
-    }
-
-    /**
-     * @return Key fields.
-     */
-    public Collection<VisorCacheTypeFieldMetadata> keyFields() {
-        return keyFields;
-    }
-
-    /**
-     * @return Value fields.
-     */
-    public Collection<VisorCacheTypeFieldMetadata> valFields() {
-        return valFields;
-    }
-
-    /**
-     * @return Fields to be queried, in addition to indexed fields.
-     */
-    public Map<String, String> qryFlds() {
-        return qryFlds;
-    }
-
-    /**
-     * @return Fields to index in ascending order.
-     */
-    public Map<String, String> ascFlds() {
-        return ascFlds;
-    }
-
-    /**
-     * @return Fields to index in descending order.
-     */
-    public Map<String, String> descFlds() {
-        return descFlds;
-    }
-
-    /**
-     * @return Fields to index as text.
-     */
-    public Collection<String> txtFlds() {
-        return txtFlds;
-    }
-
-    /**
-     * @return Fields to create group indexes for.
-     */
-    public Map<String, LinkedHashMap<String, IgniteBiTuple<String, Boolean>>> grps() {
-        return grps;
-    }
-
-    /** {@inheritDoc} */
-    @Override public String toString() {
-        return S.toString(VisorCacheTypeMetadata.class, this);
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorPartitionMap.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorPartitionMap.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorPartitionMap.java
new file mode 100644
index 0000000..f263db5
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorPartitionMap.java
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.cache;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Map;
+import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionState;
+import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Data transfer object for partitions map.
+ */
+public class VisorPartitionMap extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Map of partition states. */
+    private Map<Integer, GridDhtPartitionState> parts;
+
+    /**
+     * Default constructor.
+     */
+    public VisorPartitionMap() {
+        // No-op.
+    }
+
+    /**
+     * @param map Partitions map.
+     */
+    public VisorPartitionMap(GridDhtPartitionMap map) {
+        parts = map.map();
+    }
+
+    /**
+     * @return Partitions map.
+     */
+    public Map<Integer, GridDhtPartitionState> getPartitions() {
+        return parts;
+    }
+
+    /**
+     * @return Partitions map size.
+     */
+    public int size() {
+        return parts.size();
+    }
+
+    /**
+     * @param part Partition.
+     * @return Partition state.
+     */
+    public GridDhtPartitionState get(Integer part) {
+        return parts.get(part);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeIntKeyMap(out, parts);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        parts = U.readIntKeyMap(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorPartitionMap.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorComputeMonitoringHolder.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorComputeMonitoringHolder.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorComputeMonitoringHolder.java
index 01d6f4f..42eb4f5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorComputeMonitoringHolder.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorComputeMonitoringHolder.java
@@ -55,7 +55,7 @@ public class VisorComputeMonitoringHolder {
                 cleanupStopped = false;
             }
 
-            listenVisor.put(visorKey, true);
+            listenVisor.put(visorKey, Boolean.TRUE);
 
             ignite.events().enableLocal(VISOR_TASK_EVTS);
         }
@@ -68,7 +68,7 @@ public class VisorComputeMonitoringHolder {
      * @return {@code true} if task events should remain enabled.
      */
     private boolean tryDisableEvents(IgniteEx ignite) {
-        if (!listenVisor.values().contains(true)) {
+        if (!listenVisor.values().contains(Boolean.TRUE)) {
             listenVisor.clear();
 
             ignite.events().disableLocal(VISOR_TASK_EVTS);
@@ -103,7 +103,7 @@ public class VisorComputeMonitoringHolder {
                 synchronized (listenVisor) {
                     if (tryDisableEvents(ignite)) {
                         for (String visorKey : listenVisor.keySet())
-                            listenVisor.put(visorKey, false);
+                            listenVisor.put(visorKey, Boolean.FALSE);
 
                         scheduleCleanupJob(ignite);
                     }
@@ -118,4 +118,4 @@ public class VisorComputeMonitoringHolder {
     @Override public String toString() {
         return S.toString(VisorComputeMonitoringHolder.class, this);
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorComputeToggleMonitoringTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorComputeToggleMonitoringTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorComputeToggleMonitoringTask.java
index ae66d4b..e9bd940 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorComputeToggleMonitoringTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorComputeToggleMonitoringTask.java
@@ -26,7 +26,6 @@ import org.apache.ignite.internal.processors.task.GridInternal;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.visor.VisorJob;
 import org.apache.ignite.internal.visor.VisorMultiNodeTask;
-import org.apache.ignite.lang.IgniteBiTuple;
 import org.jetbrains.annotations.Nullable;
 
 import static org.apache.ignite.internal.visor.compute.VisorComputeMonitoringHolder.COMPUTE_MONITORING_HOLDER_KEY;
@@ -38,7 +37,7 @@ import static org.apache.ignite.internal.visor.util.VisorTaskUtils.checkExplicit
  */
 @GridInternal
 public class VisorComputeToggleMonitoringTask extends
-    VisorMultiNodeTask<IgniteBiTuple<String, Boolean>, Boolean, Boolean> {
+    VisorMultiNodeTask<VisorComputeToggleMonitoringTaskArg, Boolean, Boolean> {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -54,14 +53,14 @@ public class VisorComputeToggleMonitoringTask extends
     }
 
     /** {@inheritDoc} */
-    @Override protected VisorComputeToggleMonitoringJob job(IgniteBiTuple<String, Boolean> arg) {
+    @Override protected VisorComputeToggleMonitoringJob job(VisorComputeToggleMonitoringTaskArg arg) {
         return new VisorComputeToggleMonitoringJob(arg, debug);
     }
 
     /**
      * Job to toggle task monitoring on node.
      */
-    private static class VisorComputeToggleMonitoringJob extends VisorJob<IgniteBiTuple<String, Boolean>, Boolean> {
+    private static class VisorComputeToggleMonitoringJob extends VisorJob<VisorComputeToggleMonitoringTaskArg, Boolean> {
         /** */
         private static final long serialVersionUID = 0L;
 
@@ -69,41 +68,40 @@ public class VisorComputeToggleMonitoringTask extends
          * @param arg Visor ID key and monitoring state flag.
          * @param debug Debug flag.
          */
-        private VisorComputeToggleMonitoringJob(IgniteBiTuple<String, Boolean> arg, boolean debug) {
+        private VisorComputeToggleMonitoringJob(VisorComputeToggleMonitoringTaskArg arg, boolean debug) {
             super(arg, debug);
         }
 
         /** {@inheritDoc} */
-        @Override protected Boolean run(IgniteBiTuple<String, Boolean> arg) {
+        @Override protected Boolean run(VisorComputeToggleMonitoringTaskArg arg) {
             if (checkExplicitTaskMonitoring(ignite))
-                return true;
-            else {
-                ConcurrentMap<String, VisorComputeMonitoringHolder> storage = ignite.cluster().nodeLocalMap();
+                return Boolean.TRUE;
 
-                VisorComputeMonitoringHolder holder = storage.get(COMPUTE_MONITORING_HOLDER_KEY);
+            ConcurrentMap<String, VisorComputeMonitoringHolder> storage = ignite.cluster().nodeLocalMap();
 
-                if (holder == null) {
-                    VisorComputeMonitoringHolder holderNew = new VisorComputeMonitoringHolder();
+            VisorComputeMonitoringHolder holder = storage.get(COMPUTE_MONITORING_HOLDER_KEY);
 
-                    VisorComputeMonitoringHolder holderOld =
-                        storage.putIfAbsent(COMPUTE_MONITORING_HOLDER_KEY, holderNew);
+            if (holder == null) {
+                VisorComputeMonitoringHolder holderNew = new VisorComputeMonitoringHolder();
 
-                    holder = holderOld == null ? holderNew : holderOld;
-                }
+                VisorComputeMonitoringHolder holderOld =
+                    storage.putIfAbsent(COMPUTE_MONITORING_HOLDER_KEY, holderNew);
 
-                String visorKey = arg.get1();
+                holder = holderOld == null ? holderNew : holderOld;
+            }
 
-                boolean state = arg.get2();
+            String visorKey = arg.getVisorKey();
 
-                // Set task monitoring state.
-                if (state)
-                    holder.startCollect(ignite, visorKey);
-                else
-                    holder.stopCollect(ignite, visorKey);
+            boolean state = arg.isEnabled();
 
-                // Return actual state. It could stay the same if events explicitly enabled in configuration.
-                return ignite.allEventsUserRecordable(VISOR_TASK_EVTS);
-            }
+            // Set task monitoring state.
+            if (state)
+                holder.startCollect(ignite, visorKey);
+            else
+                holder.stopCollect(ignite, visorKey);
+
+            // Return actual state. It could stay the same if events explicitly enabled in configuration.
+            return ignite.allEventsUserRecordable(VISOR_TASK_EVTS);
         }
 
         /** {@inheritDoc} */
@@ -111,4 +109,4 @@ public class VisorComputeToggleMonitoringTask extends
             return S.toString(VisorComputeToggleMonitoringJob.class, this);
         }
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorComputeToggleMonitoringTaskArg.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorComputeToggleMonitoringTaskArg.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorComputeToggleMonitoringTaskArg.java
new file mode 100644
index 0000000..e17379a
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorComputeToggleMonitoringTaskArg.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.compute;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Toggle compute monitoring arguments.
+ */
+public class VisorComputeToggleMonitoringTaskArg extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Visor monitoring id */
+    private String visorKey;
+
+    /** Enable state of compute monitoring */
+    private boolean enabled;
+
+    /**
+     * Default constructor.
+     */
+    public VisorComputeToggleMonitoringTaskArg() {
+        // No-op.
+    }
+
+    /**
+     * @param visorKey Visor monitoring id.
+     * @param enabled Enable state of compute monitoring.
+     */
+    public VisorComputeToggleMonitoringTaskArg(String visorKey, boolean enabled) {
+        this.visorKey = visorKey;
+        this.enabled = enabled;
+    }
+
+    /**
+     * @return Visor monitoring id.
+     */
+    public String getVisorKey() {
+        return visorKey;
+    }
+
+    /**
+     * @return Enable state of compute monitoring.
+     */
+    public boolean isEnabled() {
+        return enabled;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, visorKey);
+        out.writeBoolean(enabled);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        visorKey = U.readString(in);
+        enabled = in.readBoolean();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorComputeToggleMonitoringTaskArg.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorGatewayTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorGatewayTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorGatewayTask.java
index 1113ca1..22cd460 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorGatewayTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorGatewayTask.java
@@ -277,7 +277,7 @@ public class VisorGatewayTask implements ComputeTask<Object[], Object> {
                 byte[] res = new byte[els.length];
 
                 for (int i = 0; i < els.length; i ++)
-                    res[i] =  Byte.valueOf(els[i]);
+                    res[i] = Byte.valueOf(els[i]);
 
                 return res;
             }
@@ -348,7 +348,7 @@ public class VisorGatewayTask implements ComputeTask<Object[], Object> {
                 }
             }
 
-            final Collection<UUID> nids;
+            final List<UUID> nids;
 
             if (nidsArg == null || "null".equals(nidsArg) || nidsArg.isEmpty()) {
                 Collection<ClusterNode> nodes = ignite.cluster().nodes();

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadDumpTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadDumpTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadDumpTask.java
index 68cfdb3..9c6aa60 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadDumpTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadDumpTask.java
@@ -24,13 +24,12 @@ import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.internal.visor.VisorJob;
 import org.apache.ignite.internal.visor.VisorOneNodeTask;
-import org.apache.ignite.lang.IgniteBiTuple;
 
 /**
  * Creates thread dump.
  */
 @GridInternal
-public class VisorThreadDumpTask extends VisorOneNodeTask<Void, IgniteBiTuple<VisorThreadInfo[], long[]>> {
+public class VisorThreadDumpTask extends VisorOneNodeTask<Void, VisorThreadDumpTaskResult> {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -42,7 +41,7 @@ public class VisorThreadDumpTask extends VisorOneNodeTask<Void, IgniteBiTuple<Vi
     /**
      * Job that take thread dump on node.
      */
-    private static class VisorDumpThreadJob extends VisorJob<Void, IgniteBiTuple<VisorThreadInfo[], long[]>> {
+    private static class VisorDumpThreadJob extends VisorJob<Void, VisorThreadDumpTaskResult> {
         /** */
         private static final long serialVersionUID = 0L;
 
@@ -55,7 +54,7 @@ public class VisorThreadDumpTask extends VisorOneNodeTask<Void, IgniteBiTuple<Vi
         }
 
         /** {@inheritDoc} */
-        @Override protected IgniteBiTuple<VisorThreadInfo[], long[]> run(Void arg) {
+        @Override protected VisorThreadDumpTaskResult run(Void arg) {
             ThreadMXBean mx = U.getThreadMx();
 
             ThreadInfo[] info = mx.dumpAllThreads(true, true);
@@ -63,9 +62,9 @@ public class VisorThreadDumpTask extends VisorOneNodeTask<Void, IgniteBiTuple<Vi
             VisorThreadInfo[] visorInfo = new VisorThreadInfo[info.length];
 
             for (int i = 0; i < info.length; i++)
-                visorInfo[i] = VisorThreadInfo.from(info[i]);
+                visorInfo[i] = new VisorThreadInfo(info[i]);
 
-            return new IgniteBiTuple<>(visorInfo, mx.findDeadlockedThreads());
+            return new VisorThreadDumpTaskResult(visorInfo, mx.findDeadlockedThreads());
         }
 
         /** {@inheritDoc} */
@@ -73,4 +72,4 @@ public class VisorThreadDumpTask extends VisorOneNodeTask<Void, IgniteBiTuple<Vi
             return S.toString(VisorDumpThreadJob.class, this);
         }
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadDumpTaskResult.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadDumpTaskResult.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadDumpTaskResult.java
new file mode 100644
index 0000000..f6e0161
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadDumpTaskResult.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.debug;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.lang.management.ThreadInfo;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Data transfer object for Visor {@link ThreadInfo}.
+ */
+public class VisorThreadDumpTaskResult extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** List of information about threads. */
+    private VisorThreadInfo[] threadInfo;
+
+    /** List of deadlocked thread ids. */
+    private long[] deadlockedThreads;
+
+    /**
+     * Default constructor.
+     */
+    public VisorThreadDumpTaskResult() {
+        // No-op.
+    }
+
+    /**
+     * Create data transfer object for given thread info.
+     *
+     * @param threadInfo Thread info.
+     * @param deadlockedThreads Thread info.
+     */
+    public VisorThreadDumpTaskResult(VisorThreadInfo[] threadInfo, long[] deadlockedThreads) {
+        this.threadInfo = threadInfo;
+        this.deadlockedThreads = deadlockedThreads;
+    }
+
+    /**
+     * @return List of information about threads.
+     */
+    public VisorThreadInfo[] getThreadInfo() {
+        return threadInfo;
+    }
+
+    /**
+     * @return List of deadlocked thread ids.
+     */
+    public long[] getDeadlockedThreads() {
+        return deadlockedThreads;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeObject(threadInfo);
+        out.writeObject(deadlockedThreads);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        threadInfo = (VisorThreadInfo[])in.readObject();
+        deadlockedThreads = (long[])in.readObject();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorThreadDumpTaskResult.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadInfo.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadInfo.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadInfo.java
index d656ad1..3db4074 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadInfo.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadInfo.java
@@ -17,14 +17,21 @@
 
 package org.apache.ignite.internal.visor.debug;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.lang.management.ThreadInfo;
-import org.apache.ignite.internal.LessNamingBean;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 /**
  * Data transfer object for Visor {@link ThreadInfo}.
  */
-public class VisorThreadInfo implements Serializable, LessNamingBean {
+public class VisorThreadInfo extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -32,241 +39,260 @@ public class VisorThreadInfo implements Serializable, LessNamingBean {
     private static final int MAX_FRAMES = 8;
 
     /** Thread name. */
-    private final String name;
+    private String name;
 
     /** Thread ID. */
-    private final Long id;
+    private Long id;
 
     /** Thread state. */
-    private final Thread.State state;
+    private Thread.State state;
 
     /** Lock information. */
-    private final VisorThreadLockInfo lock;
+    private VisorThreadLockInfo lock;
 
     /** Lock name. */
-    private final String lockName;
+    private String lockName;
 
     /** Lock owner thread ID. */
-    private final Long lockOwnerId;
+    private Long lockOwnerId;
 
     /** Lock owner name. */
-    private final String lockOwnerName;
+    private String lockOwnerName;
 
     /** Thread executing native code. */
-    private final Boolean inNative;
+    private Boolean inNative;
 
     /** Thread is suspended. */
-    private final Boolean suspended;
+    private Boolean suspended;
 
     /** Waited count. */
-    private final Long waitedCnt;
+    private Long waitedCnt;
 
     /** Waited time. */
-    private final Long waitedTime;
+    private Long waitedTime;
 
     /** Blocked count. */
-    private final Long blockedCnt;
+    private Long blockedCnt;
 
     /** Blocked time. */
-    private final Long blockedTime;
+    private Long blockedTime;
 
     /** Stack trace. */
-    private final StackTraceElement[] stackTrace;
+    private List<StackTraceElement> stackTrace;
 
     /** Locks info. */
-    private final VisorThreadLockInfo[] locks;
+    private List<VisorThreadLockInfo> locks;
 
     /** Locked monitors. */
-    private final VisorThreadMonitorInfo[] lockedMonitors;
-
-    /** Create thread info with given parameters. */
-    public VisorThreadInfo(String name,
-        Long id,
-        Thread.State state,
-        VisorThreadLockInfo lock,
-        String lockName,
-        Long lockOwnerId,
-        String lockOwnerName,
-        Boolean inNative,
-        Boolean suspended,
-        Long waitedCnt,
-        Long waitedTime,
-        Long blockedCnt,
-        Long blockedTime,
-        StackTraceElement[] stackTrace,
-        VisorThreadLockInfo[] locks,
-        VisorThreadMonitorInfo[] lockedMonitors
-    ) {
-        this.name = name;
-        this.id = id;
-        this.state = state;
-        this.lock = lock;
-        this.lockName = lockName;
-        this.lockOwnerId = lockOwnerId;
-        this.lockOwnerName = lockOwnerName;
-        this.inNative = inNative;
-        this.suspended = suspended;
-        this.waitedCnt = waitedCnt;
-        this.waitedTime = waitedTime;
-        this.blockedCnt = blockedCnt;
-        this.blockedTime = blockedTime;
-        this.stackTrace = stackTrace;
-        this.locks = locks;
-        this.lockedMonitors = lockedMonitors;
+    private List<VisorThreadMonitorInfo> lockedMonitors;
+
+    /**
+     * Default constructor.
+     */
+    public VisorThreadInfo() {
+        // No-op.
     }
 
-    /** Create data transfer object for given thread info. */
-    public static VisorThreadInfo from(ThreadInfo ti) {
+    /**
+     * Create data transfer object for given thread info.
+     *
+     * @param ti Thread info.
+     */
+    public VisorThreadInfo(ThreadInfo ti) {
         assert ti != null;
 
-        VisorThreadLockInfo[] linfos = ti.getLockedSynchronizers() != null ?
-            new VisorThreadLockInfo[ti.getLockedSynchronizers().length] : null;
+        name = ti.getThreadName();
+        id = ti.getThreadId();
+        state = ti.getThreadState();
+        lock = ti.getLockInfo() != null ? new VisorThreadLockInfo(ti.getLockInfo()) : null;
+        lockName =ti.getLockName();
+        lockOwnerId = ti.getLockOwnerId();
+        lockOwnerName = ti.getLockOwnerName();
+        inNative = ti.isInNative();
+        suspended = ti.isSuspended();
+        waitedCnt = ti.getWaitedCount();
+        waitedTime = ti.getWaitedTime();
+        blockedCnt = ti.getBlockedCount();
+        blockedTime = ti.getBlockedTime();
+        stackTrace = Arrays.asList(ti.getStackTrace());
+
+        locks = ti.getLockedSynchronizers() != null ?
+            new ArrayList<VisorThreadLockInfo>(ti.getLockedSynchronizers().length) : null;
 
         if (ti.getLockedSynchronizers() != null)
             for (int i = 0; i < ti.getLockedSynchronizers().length; i++)
-                linfos[i] = VisorThreadLockInfo.from(ti.getLockedSynchronizers()[i]);
+                locks.add(new VisorThreadLockInfo(ti.getLockedSynchronizers()[i]));
 
-        VisorThreadMonitorInfo[] minfos = ti.getLockedMonitors() != null ?
-            new VisorThreadMonitorInfo[ti.getLockedMonitors().length] : null;
+        lockedMonitors = ti.getLockedMonitors() != null ?
+            new ArrayList<VisorThreadMonitorInfo>(ti.getLockedMonitors().length) : null;
 
         if (ti.getLockedMonitors() != null)
             for (int i = 0; i < ti.getLockedMonitors().length; i++)
-                minfos[i] = VisorThreadMonitorInfo.from(ti.getLockedMonitors()[i]);
-
-        return new VisorThreadInfo(ti.getThreadName(),
-            ti.getThreadId(),
-            ti.getThreadState(),
-            ti.getLockInfo() != null ? VisorThreadLockInfo.from(ti.getLockInfo()) : null,
-            ti.getLockName(),
-            ti.getLockOwnerId(),
-            ti.getLockOwnerName(),
-            ti.isInNative(),
-            ti.isSuspended(),
-            ti.getWaitedCount(),
-            ti.getWaitedTime(),
-            ti.getBlockedCount(),
-            ti.getBlockedTime(),
-            ti.getStackTrace(),
-            linfos,
-            minfos
-        );
+                lockedMonitors.add(new VisorThreadMonitorInfo(ti.getLockedMonitors()[i]));
     }
 
     /**
      * @return Thread name.
      */
-    public String name() {
+    public String getName() {
         return name;
     }
 
     /**
      * @return Thread ID.
      */
-    public Long id() {
+    public Long getId() {
         return id;
     }
 
     /**
      * @return Thread state.
      */
-    public Thread.State state() {
+    public Thread.State getState() {
         return state;
     }
 
     /**
      * @return Lock information.
      */
-    public VisorThreadLockInfo lock() {
+    public VisorThreadLockInfo getLock() {
         return lock;
     }
 
     /**
      * @return Lock name.
      */
-    public String lockName() {
+    public String getLockName() {
         return lockName;
     }
 
     /**
      * @return Lock owner thread ID.
      */
-    public Long lockOwnerId() {
+    public Long getLockOwnerId() {
         return lockOwnerId;
     }
 
     /**
      * @return Lock owner name.
      */
-    public String lockOwnerName() {
+    public String getLockOwnerName() {
         return lockOwnerName;
     }
 
     /**
      * @return Thread executing native code.
      */
-    public Boolean inNative() {
+    public Boolean isInNative() {
         return inNative;
     }
 
     /**
      * @return Thread is suspended.
      */
-    public Boolean suspended() {
+    public Boolean isSuspended() {
         return suspended;
     }
 
     /**
      * @return Waited count.
      */
-    public Long waitedCount() {
+    public Long getWaitedCount() {
         return waitedCnt;
     }
 
     /**
      * @return Waited time.
      */
-    public Long waitedTime() {
+    public Long getWaitedTime() {
         return waitedTime;
     }
 
     /**
      * @return Blocked count.
      */
-    public Long blockedCount() {
+    public Long getBlockedCount() {
         return blockedCnt;
     }
 
     /**
      * @return Blocked time.
      */
-    public Long blockedTime() {
+    public Long getBlockedTime() {
         return blockedTime;
     }
 
     /**
      * @return Stack trace.
      */
-    public StackTraceElement[] stackTrace() {
+    public List<StackTraceElement> getStackTrace() {
         return stackTrace;
     }
 
     /**
      * @return Locks info.
      */
-    public VisorThreadLockInfo[] locks() {
+    public List<VisorThreadLockInfo> getLocks() {
         return locks;
     }
 
     /**
      * @return Locked monitors.
      */
-    public VisorThreadMonitorInfo[] lockedMonitors() {
+    public List<VisorThreadMonitorInfo> getLockedMonitors() {
         return lockedMonitors;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, name);
+        out.writeObject(id);
+        U.writeString(out, state.toString());
+        out.writeObject(lock);
+        U.writeString(out, lockName);
+        out.writeObject(lockOwnerId);
+        U.writeString(out, lockOwnerName);
+        out.writeObject(inNative);
+        out.writeObject(suspended);
+        out.writeObject(waitedCnt);
+        out.writeObject(waitedTime);
+        out.writeObject(blockedCnt);
+        out.writeObject(blockedTime);
+        U.writeCollection(out, stackTrace);
+        U.writeCollection(out, locks);
+        U.writeCollection(out, lockedMonitors);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        name = U.readString(in);
+        id = (Long)in.readObject();
+
+        String statePresentation = U.readString(in);
+
+        if (statePresentation != null)
+            state = Enum.valueOf(Thread.State.class, statePresentation);
+
+        lock = (VisorThreadLockInfo)in.readObject();
+        lockName = U.readString(in);
+        lockOwnerId = (Long)in.readObject();
+        lockOwnerName = U.readString(in);
+        inNative = (Boolean)in.readObject();
+        suspended = (Boolean)in.readObject();
+        waitedCnt = (Long)in.readObject();
+        waitedTime = (Long)in.readObject();
+        blockedCnt = (Long)in.readObject();
+        blockedTime = (Long)in.readObject();
+        stackTrace = U.readList(in);
+        locks = U.readList(in);
+        lockedMonitors = U.readList(in);
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
-        StringBuilder sb = new StringBuilder("\"" + name + "\"" + " Id=" + id + " " + state);
+        StringBuilder sb = new StringBuilder(512);
+
+        sb.append('"').append(name).append('"').append(" Id=").append(id).append(' ').append(state);
 
         if (lockName != null)
             sb.append(" on ").append(lockName);
@@ -282,12 +308,12 @@ public class VisorThreadInfo implements Serializable, LessNamingBean {
 
         sb.append('\n');
 
-        int maxFrames = Math.min(stackTrace.length, MAX_FRAMES);
+        int maxFrames = Math.min(stackTrace.size(), MAX_FRAMES);
 
         for (int i = 0; i < maxFrames; i++) {
-            StackTraceElement ste = stackTrace[i];
+            StackTraceElement ste = stackTrace.get(i);
 
-            sb.append("\tat ").append(ste.toString()).append('\n');
+            sb.append("\tat ").append(ste).append('\n');
 
             if (i == 0 && lock != null) {
                 switch (state) {
@@ -308,16 +334,16 @@ public class VisorThreadInfo implements Serializable, LessNamingBean {
             }
 
             for (VisorThreadMonitorInfo mi : lockedMonitors) {
-                if (mi.stackDepth() == i)
+                if (mi.getStackDepth() == i)
                     sb.append("\t-  locked ").append(mi).append('\n');
             }
         }
 
-        if (maxFrames < stackTrace.length)
+        if (maxFrames < stackTrace.size())
             sb.append("\t...").append('\n');
 
-        if (locks.length > 0) {
-            sb.append("\n\tNumber of locked synchronizers = ").append(locks.length).append('\n');
+        if (!F.isEmpty(locks)) {
+            sb.append("\n\tNumber of locked synchronizers = ").append(locks.size()).append('\n');
 
             for (VisorThreadLockInfo li : locks)
                 sb.append("\t- ").append(li).append('\n');

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadLockInfo.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadLockInfo.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadLockInfo.java
index 0fdd95f..4aab0e0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadLockInfo.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadLockInfo.java
@@ -17,57 +17,76 @@
 
 package org.apache.ignite.internal.visor.debug;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.lang.management.LockInfo;
-import org.apache.ignite.internal.LessNamingBean;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 /**
  * Data transfer object for {@link LockInfo}.
  */
-public class VisorThreadLockInfo implements Serializable, LessNamingBean {
+public class VisorThreadLockInfo extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
     /**
      * Fully qualified name of the class of the lock object.
      */
-    protected final String clsName;
+    protected String clsName;
 
     /**
      * Identity hash code of the lock object.
      */
-    protected final Integer identityHashCode;
+    protected Integer identityHashCode;
 
-    /** Create thread lock info with given parameters. */
-    public VisorThreadLockInfo(String clsName, Integer identityHashCode) {
-        assert clsName != null;
-
-        this.clsName = clsName;
-        this.identityHashCode = identityHashCode;
+    /**
+     * Default constructor.
+     */
+    public VisorThreadLockInfo() {
+        // No-op.
     }
 
-    /** Create data transfer object for given lock info. */
-    public static VisorThreadLockInfo from(LockInfo li) {
+    /**
+     * Create data transfer object for given lock info.
+     *
+     * @param li Lock info.
+     */
+    public VisorThreadLockInfo(LockInfo li) {
         assert li != null;
 
-        return new VisorThreadLockInfo(li.getClassName(), li.getIdentityHashCode());
+        clsName = li.getClassName();
+        identityHashCode = li.getIdentityHashCode();
     }
 
     /**
      * @return Fully qualified name of the class of the lock object.
      */
-    public String className() {
+    public String getClassName() {
         return clsName;
     }
 
     /**
      * @return Identity hash code of the lock object.
      */
-    public Integer identityHashCode() {
+    public Integer getIdentityHashCode() {
         return identityHashCode;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, clsName);
+        out.writeObject(identityHashCode);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        clsName = U.readString(in);
+        identityHashCode = (Integer)in.readObject();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return clsName + '@' + Integer.toHexString(identityHashCode);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadMonitorInfo.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadMonitorInfo.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadMonitorInfo.java
index cc68665..11e1141 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadMonitorInfo.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/debug/VisorThreadMonitorInfo.java
@@ -17,7 +17,13 @@
 
 package org.apache.ignite.internal.visor.debug;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.lang.management.MonitorInfo;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.visor.VisorDataTransferObjectInput;
+import org.apache.ignite.internal.visor.VisorDataTransferObjectOutput;
 
 /**
  * Data transfer object for {@link MonitorInfo}.
@@ -27,46 +33,72 @@ public class VisorThreadMonitorInfo extends VisorThreadLockInfo {
     private static final long serialVersionUID = 0L;
 
     /** Stack depth. */
-    private final Integer stackDepth;
+    private Integer stackDepth;
 
     /** Stack frame. */
-    private final StackTraceElement stackFrame;
+    private StackTraceElement stackFrame;
 
     /**
-     * Create thread monitor info with given parameters.
-     *
-     * @param clsName Fully qualified name of the class of the lock object.
-     * @param identityHashCode Identity hash code of the lock object.
-     * @param stackDepth Depth in the stack trace where the object monitor was locked.
-     * @param stackFrame Stack frame that locked the object monitor.
+     * Default constructor.
      */
-    public VisorThreadMonitorInfo(String clsName, Integer identityHashCode, Integer stackDepth,
-        StackTraceElement stackFrame) {
-        super(clsName, identityHashCode);
-
-        this.stackDepth = stackDepth;
-        this.stackFrame = stackFrame;
+    public VisorThreadMonitorInfo() {
+        // No-op.
     }
 
-    /** Create data transfer object for given monitor info. */
-    public static VisorThreadMonitorInfo from(MonitorInfo mi) {
-        assert mi != null;
+    /**
+     * Create data transfer object for given monitor info.
+     *
+     * @param mi Monitoring info.
+     */
+    public VisorThreadMonitorInfo(MonitorInfo mi) {
+        super(mi);
 
-        return new VisorThreadMonitorInfo(mi.getClassName(), mi.getIdentityHashCode(), mi.getLockedStackDepth(),
-            mi.getLockedStackFrame());
+        stackDepth = mi.getLockedStackDepth();
+        stackFrame = mi.getLockedStackFrame();
     }
 
     /**
      * @return Stack depth.
      */
-    public Integer stackDepth() {
+    public Integer getStackDepth() {
         return stackDepth;
     }
 
     /**
      * @return Stack frame.
      */
-    public StackTraceElement stackFrame() {
+    public StackTraceElement getStackFrame() {
         return stackFrame;
     }
-}
\ No newline at end of file
+
+    /** {@inheritDoc} */
+    @Override public byte getProtocolVersion() {
+        return 1;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        try (VisorDataTransferObjectOutput dtout = new VisorDataTransferObjectOutput(out)) {
+            dtout.writeByte(super.getProtocolVersion());
+            super.writeExternalData(dtout);
+        }
+
+        out.writeObject(stackDepth);
+        out.writeObject(stackFrame);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        try (VisorDataTransferObjectInput dtin = new VisorDataTransferObjectInput(in)) {
+            super.readExternalData(dtin.readByte(), dtin);
+        }
+
+        stackDepth = (Integer)in.readObject();
+        stackFrame = (StackTraceElement)in.readObject();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorThreadMonitorInfo.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridDeploymentEvent.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridDeploymentEvent.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridDeploymentEvent.java
index 0eefa6b..1d41e19 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridDeploymentEvent.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridDeploymentEvent.java
@@ -17,8 +17,14 @@
 
 package org.apache.ignite.internal.visor.event;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.UUID;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObjectInput;
+import org.apache.ignite.internal.visor.VisorDataTransferObjectOutput;
 import org.apache.ignite.lang.IgniteUuid;
 import org.jetbrains.annotations.Nullable;
 
@@ -30,7 +36,14 @@ public class VisorGridDeploymentEvent extends VisorGridEvent {
     private static final long serialVersionUID = 0L;
 
     /** Deployment alias. */
-    private final String alias;
+    private String alias;
+
+    /**
+     * Default constructor.
+     */
+    public VisorGridDeploymentEvent() {
+        // No-op.
+    }
 
     /**
      * Create event with given parameters.
@@ -62,12 +75,36 @@ public class VisorGridDeploymentEvent extends VisorGridEvent {
     /**
      * @return Deployment alias.
      */
-    public String alias() {
+    public String getAlias() {
         return alias;
     }
 
     /** {@inheritDoc} */
+    @Override public byte getProtocolVersion() {
+        return 1;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        try (VisorDataTransferObjectOutput dtout = new VisorDataTransferObjectOutput(out)) {
+            dtout.writeByte(super.getProtocolVersion());
+            super.writeExternalData(dtout);
+        }
+
+        U.writeString(out, alias);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        try (VisorDataTransferObjectInput dtin = new VisorDataTransferObjectInput(in)) {
+            super.readExternalData(dtin.readByte(), dtin);
+        }
+
+        alias = U.readString(in);
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorGridDeploymentEvent.class, this);
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridDiscoveryEvent.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridDiscoveryEvent.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridDiscoveryEvent.java
index bad6966..b4afed9 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridDiscoveryEvent.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridDiscoveryEvent.java
@@ -17,8 +17,14 @@
 
 package org.apache.ignite.internal.visor.event;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.UUID;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObjectInput;
+import org.apache.ignite.internal.visor.VisorDataTransferObjectOutput;
 import org.apache.ignite.lang.IgniteUuid;
 import org.jetbrains.annotations.Nullable;
 
@@ -30,16 +36,23 @@ public class VisorGridDiscoveryEvent extends VisorGridEvent {
     private static final long serialVersionUID = 0L;
 
     /** Node that caused this event to be generated. */
-    private final UUID evtNodeId;
+    private UUID evtNodeId;
 
     /** Node address that caused this event to be generated. */
-    private final String addr;
+    private String addr;
 
     /** If node that caused this event is daemon. */
-    private final boolean isDaemon;
+    private boolean isDaemon;
 
     /** Topology version. */
-    private final long topVer;
+    private long topVer;
+
+    /**
+     * Default constructor.
+     */
+    public VisorGridDiscoveryEvent() {
+        // No-op.
+    }
 
     /**
      * Create event with given parameters.
@@ -78,16 +91,16 @@ public class VisorGridDiscoveryEvent extends VisorGridEvent {
     }
 
     /**
-     * @return Deployment alias.
+     * @return Event node ID.
      */
-    public UUID evtNodeId() {
+    public UUID getEventNodeId() {
         return evtNodeId;
     }
 
     /**
      * @return Node address that caused this event to be generated.
      */
-    public String address() {
+    public String getAddress() {
         return addr;
     }
 
@@ -102,11 +115,41 @@ public class VisorGridDiscoveryEvent extends VisorGridEvent {
      * @return Topology version or {@code 0} if configured discovery SPI implementation
      *      does not support versioning.
      **/
-    public long topologyVersion() {
+    public long getTopologyVersion() {
         return topVer;
     }
 
     /** {@inheritDoc} */
+    @Override public byte getProtocolVersion() {
+        return 1;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        try (VisorDataTransferObjectOutput dtout = new VisorDataTransferObjectOutput(out)) {
+            dtout.writeByte(super.getProtocolVersion());
+            super.writeExternalData(dtout);
+        }
+
+        U.writeUuid(out, evtNodeId);
+        U.writeString(out, addr);
+        out.writeBoolean(isDaemon);
+        out.writeLong(topVer);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        try (VisorDataTransferObjectInput dtin = new VisorDataTransferObjectInput(in)) {
+            super.readExternalData(dtin.readByte(), dtin);
+        }
+
+        evtNodeId = U.readUuid(in);
+        addr = U.readString(in);
+        isDaemon = in.readBoolean();
+        topVer = in.readLong();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorGridDiscoveryEvent.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridEvent.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridEvent.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridEvent.java
index b24e860..4814aba 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridEvent.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridEvent.java
@@ -17,40 +17,50 @@
 
 package org.apache.ignite.internal.visor.event;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.UUID;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 import org.apache.ignite.lang.IgniteUuid;
 import org.jetbrains.annotations.Nullable;
 
 /**
  * Base class for lightweight counterpart for various {@link org.apache.ignite.events.Event}.
  */
-public class VisorGridEvent implements Serializable, LessNamingBean {
+public class VisorGridEvent extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
     /** Event type. */
-    private final int typeId;
+    private int typeId;
 
     /** Globally unique ID of this event. */
-    private final IgniteUuid id;
+    private IgniteUuid id;
 
     /** Name of this event. */
-    private final String name;
+    private String name;
 
     /** Node Id where event occurred and was recorded. */
-    private final UUID nid;
+    private UUID nid;
 
     /** Event timestamp. */
-    private final long ts;
+    private long ts;
 
     /** Event message. */
-    private final String msg;
+    private String msg;
 
     /** Shortened version of {@code toString()} result. Suitable for humans to read. */
-    private final String shortDisplay;
+    private String shortDisplay;
+
+    /**
+     * Default constructor.
+     */
+    public VisorGridEvent() {
+        // No-op.
+    }
 
     /**
      * Create event with given parameters.
@@ -77,53 +87,75 @@ public class VisorGridEvent implements Serializable, LessNamingBean {
     /**
      * @return Event type.
      */
-    public int typeId() {
+    public int getTypeId() {
         return typeId;
     }
 
     /**
      * @return Globally unique ID of this event.
      */
-    public IgniteUuid id() {
+    public IgniteUuid getId() {
         return id;
     }
 
     /**
      * @return Name of this event.
      */
-    public String name() {
+    public String getName() {
         return name;
     }
 
     /**
      * @return Node Id where event occurred and was recorded.
      */
-    public UUID nid() {
+    public UUID getNid() {
         return nid;
     }
 
     /**
      * @return Event timestamp.
      */
-    public long timestamp() {
+    public long getTimestamp() {
         return ts;
     }
 
     /**
      * @return Event message.
      */
-    @Nullable public String message() {
+    @Nullable public String getMessage() {
         return msg;
     }
 
     /**
      * @return Shortened version of  result. Suitable for humans to read.
      */
-    public String shortDisplay() {
+    public String getShortDisplay() {
         return shortDisplay;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeInt(typeId);
+        U.writeGridUuid(out, id);
+        U.writeString(out, name);
+        U.writeUuid(out, nid);
+        out.writeLong(ts);
+        U.writeString(out, msg);
+        U.writeString(out, shortDisplay);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        typeId = in.readInt();
+        id = U.readGridUuid(in);
+        name = U.readString(in);
+        nid = U.readUuid(in);
+        ts = in.readLong();
+        msg = U.readString(in);
+        shortDisplay = U.readString(in);
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorGridEvent.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridEventsLost.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridEventsLost.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridEventsLost.java
index 92f149a..e07a3a1 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridEventsLost.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridEventsLost.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.visor.event;
 
 import java.util.UUID;
+import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteUuid;
 
@@ -29,6 +30,13 @@ public class VisorGridEventsLost extends VisorGridEvent {
     private static final long serialVersionUID = 0L;
 
     /**
+     * Default constructor.
+     */
+    public VisorGridEventsLost() {
+        // No-op.
+    }
+
+    /**
      * Create event with given parameters.
      *
      * @param nid Node where events were lost.
@@ -38,4 +46,9 @@ public class VisorGridEventsLost extends VisorGridEvent {
             "Some Visor events were lost and Visor may show inconsistent results. " +
             "Configure your grid to disable not important events.", "");
     }
-}
\ No newline at end of file
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorGridEventsLost.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridJobEvent.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridJobEvent.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridJobEvent.java
index a1a0c04..2e4c627 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridJobEvent.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridJobEvent.java
@@ -17,8 +17,14 @@
 
 package org.apache.ignite.internal.visor.event;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.UUID;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObjectInput;
+import org.apache.ignite.internal.visor.VisorDataTransferObjectOutput;
 import org.apache.ignite.lang.IgniteUuid;
 import org.jetbrains.annotations.Nullable;
 
@@ -30,16 +36,23 @@ public class VisorGridJobEvent extends VisorGridEvent {
     private static final long serialVersionUID = 0L;
 
     /** Name of the task that triggered the event. */
-    private final String taskName;
+    private String taskName;
 
     /** Name of task class that triggered the event. */
-    private final String taskClsName;
+    private String taskClsName;
 
     /** Task session ID of the task that triggered the event. */
-    private final IgniteUuid taskSesId;
+    private IgniteUuid taskSesId;
 
     /** Job ID. */
-    private final IgniteUuid jobId;
+    private IgniteUuid jobId;
+
+    /**
+     * Default constructor.
+     */
+    public VisorGridJobEvent() {
+        // No-op.
+    }
 
     /**
      * Create event with given parameters.
@@ -80,33 +93,63 @@ public class VisorGridJobEvent extends VisorGridEvent {
     /**
      * @return Name of the task that triggered the event.
      */
-    public String taskName() {
+    public String getTaskName() {
         return taskName;
     }
 
     /**
      * @return Name of task class that triggered the event.
      */
-    public String taskClassName() {
+    public String getTaskClassName() {
         return taskClsName;
     }
 
     /**
      * @return Task session ID of the task that triggered the event.
      */
-    public IgniteUuid taskSessionId() {
+    public IgniteUuid getTaskSessionId() {
         return taskSesId;
     }
 
     /**
      * @return Job ID.
      */
-    public IgniteUuid jobId() {
+    public IgniteUuid getJobId() {
         return jobId;
     }
 
     /** {@inheritDoc} */
+    @Override public byte getProtocolVersion() {
+        return 1;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        try (VisorDataTransferObjectOutput dtout = new VisorDataTransferObjectOutput(out)) {
+            dtout.writeByte(super.getProtocolVersion());
+            super.writeExternalData(dtout);
+        }
+
+        U.writeString(out, taskName);
+        U.writeString(out, taskClsName);
+        U.writeGridUuid(out, taskSesId);
+        U.writeGridUuid(out, jobId);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        try (VisorDataTransferObjectInput dtin = new VisorDataTransferObjectInput(in)) {
+            super.readExternalData(dtin.readByte(), dtin);
+        }
+
+        taskName = U.readString(in);
+        taskClsName = U.readString(in);
+        taskSesId = U.readGridUuid(in);
+        jobId = U.readGridUuid(in);
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorGridJobEvent.class, this);
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridTaskEvent.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridTaskEvent.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridTaskEvent.java
index 255d559..0f3eee4 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridTaskEvent.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/event/VisorGridTaskEvent.java
@@ -17,8 +17,14 @@
 
 package org.apache.ignite.internal.visor.event;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.UUID;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObjectInput;
+import org.apache.ignite.internal.visor.VisorDataTransferObjectOutput;
 import org.apache.ignite.lang.IgniteUuid;
 import org.jetbrains.annotations.Nullable;
 
@@ -30,16 +36,23 @@ public class VisorGridTaskEvent extends VisorGridEvent {
     private static final long serialVersionUID = 0L;
 
     /** Name of the task that triggered the event. */
-    private final String taskName;
+    private String taskName;
 
     /** Name of task class that triggered the event. */
-    private final String taskClsName;
+    private String taskClsName;
 
     /** Task session ID. */
-    private final IgniteUuid taskSesId;
+    private IgniteUuid taskSesId;
 
     /** Whether task was created for system needs. */
-    private final boolean internal;
+    private boolean internal;
+
+    /**
+     * Default constructor.
+     */
+    public VisorGridTaskEvent() {
+        // No-op.
+    }
 
     /**
      * Create event with given parameters.
@@ -80,33 +93,63 @@ public class VisorGridTaskEvent extends VisorGridEvent {
     /**
      * @return Name of the task that triggered the event.
      */
-    public String taskName() {
+    public String getTaskName() {
         return taskName;
     }
 
     /**
      * @return Name of task class that triggered the event.
      */
-    public String taskClassName() {
+    public String getTaskClassName() {
         return taskClsName;
     }
 
     /**
      * @return Task session ID.
      */
-    public IgniteUuid taskSessionId() {
+    public IgniteUuid getTaskSessionId() {
         return taskSesId;
     }
 
     /**
      * @return Whether task was created for system needs.
      */
-    public boolean internal() {
+    public boolean isInternal() {
         return internal;
     }
 
     /** {@inheritDoc} */
+    @Override public byte getProtocolVersion() {
+        return 1;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        try (VisorDataTransferObjectOutput dtout = new VisorDataTransferObjectOutput(out)) {
+            dtout.writeByte(super.getProtocolVersion());
+            super.writeExternalData(dtout);
+        }
+
+        U.writeString(out, taskName);
+        U.writeString(out, taskClsName);
+        U.writeGridUuid(out, taskSesId);
+        out.writeBoolean(internal);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        try (VisorDataTransferObjectInput dtin = new VisorDataTransferObjectInput(in)) {
+            super.readExternalData(dtin.readByte(), dtin);
+        }
+
+        taskName = U.readString(in);
+        taskClsName = U.readString(in);
+        taskSesId = U.readGridUuid(in);
+        internal = in.readBoolean();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorGridTaskEvent.class, this);
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/file/VisorFileBlock.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/file/VisorFileBlock.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/file/VisorFileBlock.java
index dba7037..23540b5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/file/VisorFileBlock.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/file/VisorFileBlock.java
@@ -17,34 +17,44 @@
 
 package org.apache.ignite.internal.visor.file;
 
-import java.io.Serializable;
-import org.apache.ignite.internal.LessNamingBean;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 /**
  * Represents block of bytes from a file, could be optionally zipped.
  */
-public class VisorFileBlock implements Serializable, LessNamingBean {
+public class VisorFileBlock extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
     /** File path. */
-    private final String path;
+    private String path;
 
     /** Marker position. */
-    private final long off;
+    private long off;
 
     /** File size. */
-    private final long size;
+    private long size;
 
     /** Timestamp of last modification of the file. */
-    private final long lastModified;
+    private long lastModified;
 
     /** Whether data was zipped. */
-    private final boolean zipped;
+    private boolean zipped;
 
     /** Data bytes. */
-    private final byte[] data;
+    private byte[] data;
+
+    /**
+     * Default constructor.
+     */
+    public VisorFileBlock() {
+
+    }
 
     /**
      * Create file block with given parameters.
@@ -68,46 +78,66 @@ public class VisorFileBlock implements Serializable, LessNamingBean {
     /**
      * @return File path.
      */
-    public String path() {
+    public String getPath() {
         return path;
     }
 
     /**
      * @return Marker position.
      */
-    public long offset() {
+    public long getOffset() {
         return off;
     }
 
     /**
      * @return File size.
      */
-    public long size() {
+    public long getSize() {
         return size;
     }
 
     /**
      * @return Timestamp of last modification of the file.
      */
-    public long lastModified() {
+    public long getLastModified() {
         return lastModified;
     }
 
     /**
      * @return Whether data was zipped.
      */
-    public boolean zipped() {
+    public boolean isZipped() {
         return zipped;
     }
 
     /**
      * @return Data bytes.
      */
-    public byte[] data() {
+    public byte[] getData() {
         return data;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, path);
+        out.writeLong(off);
+        out.writeLong(size);
+        out.writeLong(lastModified);
+        out.writeBoolean(zipped);
+        U.writeByteArray(out, data);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        path = U.readString(in);
+        off = in.readLong();
+        size = in.readLong();
+        lastModified = in.readLong();
+        zipped = in.readBoolean();
+        data = U.readByteArray(in);
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorFileBlock.class, this);
     }


[10/11] ignite git commit: IGNITE-4988 Cleanup and refactor VisorXxx tasks and DTO for ignite-2.0

Posted by ak...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAffinityNodeTaskArg.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAffinityNodeTaskArg.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAffinityNodeTaskArg.java
new file mode 100644
index 0000000..ec05733
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAffinityNodeTaskArg.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.cache;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Argument for {@link VisorCacheAffinityNodeTask}.
+ */
+public class VisorCacheAffinityNodeTaskArg extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Cache name. */
+    private String cacheName;
+
+    /** Key to map to a node. */
+    private Object key;
+
+    /**
+     * Default constructor.
+     */
+    public VisorCacheAffinityNodeTaskArg() {
+        // No-op.
+    }
+
+    /**
+     * @param cacheName Cache name.
+     * @param key Object.
+     */
+    public VisorCacheAffinityNodeTaskArg(String cacheName, Object key) {
+        this.cacheName = cacheName;
+        this.key = key;
+    }
+
+    /**
+     * @return Cache name.
+     */
+    public String getCacheName() {
+        return cacheName;
+    }
+
+    /**
+     * @return Key to map to a node.
+     */
+    public Object getKey() {
+        return key;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, cacheName);
+        out.writeObject(key);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        cacheName = U.readString(in);
+        key = in.readObject();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorCacheAffinityNodeTaskArg.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAggregatedMetrics.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAggregatedMetrics.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAggregatedMetrics.java
index 586fa87..21a2806 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAggregatedMetrics.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAggregatedMetrics.java
@@ -17,19 +17,22 @@
 
 package org.apache.ignite.internal.visor.cache;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 import org.apache.ignite.cache.CacheMode;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 /**
  * Data transfer object for aggregated cache metrics.
  */
-public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean {
+public class VisorCacheAggregatedMetrics extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -43,7 +46,7 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     private boolean sys;
 
     /** Node IDs with cache metrics. */
-    private final Map<UUID, VisorCacheMetrics> metrics = new HashMap<>();
+    private Map<UUID, VisorCacheMetrics> metrics = new HashMap<>();
 
     /** Minimum number of elements in heap. */
     private transient Long minHeapSize;
@@ -118,54 +121,56 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     private transient Integer failsQry;
 
     /**
+     * Default constructor.
+     */
+    public VisorCacheAggregatedMetrics() {
+        // No-op.
+    }
+
+    /**
      * Create data transfer object for aggregated cache metrics.
      *
      * @param cm Source cache metrics.
-     * @return Data transfer object for aggregated cache metrics.
      */
-    public static VisorCacheAggregatedMetrics from(VisorCacheMetrics cm) {
-        VisorCacheAggregatedMetrics acm = new VisorCacheAggregatedMetrics();
-
-        acm.name = cm.name();
-        acm.mode = cm.mode();
-        acm.sys = cm.system();
-
-        return acm;
+    public VisorCacheAggregatedMetrics(VisorCacheMetrics cm) {
+        name = cm.getName();
+        mode = cm.getMode();
+        sys = cm.isSystem();
     }
 
     /**
      * @return Cache name.
      */
-    public String name() {
+    public String getName() {
         return name;
     }
 
     /** @return Cache mode. */
-    public CacheMode mode() {
+    public CacheMode getMode() {
         return mode;
     }
 
     /** @return Cache system state. */
-    public boolean system() {
+    public boolean isSystem() {
         return sys;
     }
 
     /**
      * @return Nodes.
      */
-    public Collection<UUID> nodes() {
+    public Collection<UUID> getNodes() {
         return metrics.keySet();
     }
 
     /**
      * @return Minimum number of elements in heap.
      */
-    public long minimumHeapSize() {
+    public long getMinimumHeapSize() {
         if (minHeapSize == null) {
             minHeapSize = Long.MAX_VALUE;
 
             for (VisorCacheMetrics metric : metrics.values())
-                minHeapSize = Math.min(minHeapSize, metric.keySize());
+                minHeapSize = Math.min(minHeapSize, metric.getKeySize());
         }
 
         return minHeapSize;
@@ -174,12 +179,12 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     /**
      * @return Average number of elements in heap.
      */
-    public double averageHeapSize() {
+    public double getAverageHeapSize() {
         if (avgHeapSize == null) {
             avgHeapSize = 0.0d;
 
             for (VisorCacheMetrics metric : metrics.values())
-                avgHeapSize += metric.keySize();
+                avgHeapSize += metric.getKeySize();
 
             avgHeapSize /= metrics.size();
         }
@@ -190,12 +195,12 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     /**
      * @return Maximum number of elements in heap.
      */
-    public long maximumHeapSize() {
+    public long getMaximumHeapSize() {
         if (maxHeapSize == null) {
             maxHeapSize = Long.MIN_VALUE;
 
             for (VisorCacheMetrics metric : metrics.values())
-                maxHeapSize = Math.max(maxHeapSize, metric.keySize());
+                maxHeapSize = Math.max(maxHeapSize, metric.getKeySize());
         }
 
         return maxHeapSize;
@@ -205,19 +210,19 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
      * @param metric Metrics to process.
      * @return Off heap entries count.
      */
-    private long offHeapEntriesCount(VisorCacheMetrics metric) {
+    private long getOffHeapEntriesCount(VisorCacheMetrics metric) {
         return metric.offHeapEntriesCount();
     }
 
     /**
      * @return Minimum number of elements in off heap.
      */
-    public long minimumOffHeapSize() {
+    public long getMinimumOffHeapSize() {
         if (minOffHeapSize == null) {
             minOffHeapSize = Long.MAX_VALUE;
 
             for (VisorCacheMetrics metric : metrics.values())
-                minOffHeapSize = Math.min(minOffHeapSize, offHeapEntriesCount(metric));
+                minOffHeapSize = Math.min(minOffHeapSize, getOffHeapEntriesCount(metric));
         }
 
         return minOffHeapSize;
@@ -226,12 +231,12 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     /**
      * @return Average number of elements in off heap.
      */
-    public double averageOffHeapSize() {
+    public double getAverageOffHeapSize() {
         if (avgOffHeapSize == null) {
             avgOffHeapSize = 0.0d;
 
             for (VisorCacheMetrics metric : metrics.values())
-                avgOffHeapSize += offHeapEntriesCount(metric);
+                avgOffHeapSize += getOffHeapEntriesCount(metric);
 
             avgOffHeapSize /= metrics.size();
         }
@@ -242,12 +247,12 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     /**
      * @return Maximum number of elements in off heap in the cache.
      */
-    public long maximumOffHeapSize() {
+    public long getMaximumOffHeapSize() {
         if (maxOffHeapSize == null) {
             maxOffHeapSize = Long.MIN_VALUE;
 
             for (VisorCacheMetrics metric : metrics.values())
-                maxOffHeapSize = Math.max(maxOffHeapSize, offHeapEntriesCount(metric));
+                maxOffHeapSize = Math.max(maxOffHeapSize, getOffHeapEntriesCount(metric));
         }
 
         return maxOffHeapSize;
@@ -256,12 +261,12 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     /**
      * @return Minimum hits of the owning cache.
      */
-    public long minimumHits() {
+    public long getMinimumHits() {
         if (minHits == null) {
             minHits = Long.MAX_VALUE;
 
             for (VisorCacheMetrics metric : metrics.values())
-                minHits = Math.min(minHits, metric.hits());
+                minHits = Math.min(minHits, metric.getHits());
         }
 
         return minHits;
@@ -270,12 +275,12 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     /**
      * @return Average hits of the owning cache.
      */
-    public double averageHits() {
+    public double getAverageHits() {
         if (avgHits == null) {
             avgHits = 0.0d;
 
             for (VisorCacheMetrics metric : metrics.values())
-                avgHits += metric.hits();
+                avgHits += metric.getHits();
 
             avgHits /= metrics.size();
         }
@@ -286,12 +291,12 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     /**
      * @return Maximum hits of the owning cache.
      */
-    public long maximumHits() {
+    public long getMaximumHits() {
         if (maxHits == null) {
             maxHits = Long.MIN_VALUE;
 
             for (VisorCacheMetrics metric : metrics.values())
-                maxHits = Math.max(maxHits, metric.hits());
+                maxHits = Math.max(maxHits, metric.getHits());
         }
 
         return maxHits;
@@ -300,12 +305,12 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     /**
      * @return Minimum misses of the owning cache.
      */
-    public long minimumMisses() {
+    public long getMinimumMisses() {
         if (minMisses == null) {
             minMisses = Long.MAX_VALUE;
 
             for (VisorCacheMetrics metric : metrics.values())
-                minMisses = Math.min(minMisses, metric.misses());
+                minMisses = Math.min(minMisses, metric.getMisses());
         }
 
         return minMisses;
@@ -314,12 +319,12 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     /**
      * @return Average misses of the owning cache.
      */
-    public double averageMisses() {
+    public double getAverageMisses() {
         if (avgMisses == null) {
             avgMisses = 0.0d;
 
             for (VisorCacheMetrics metric : metrics.values())
-                avgMisses += metric.misses();
+                avgMisses += metric.getMisses();
 
             avgMisses /= metrics.size();
         }
@@ -330,12 +335,12 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     /**
      * @return Maximum misses of the owning cache.
      */
-    public long maximumMisses() {
+    public long getMaximumMisses() {
         if (maxMisses == null) {
             maxMisses = Long.MIN_VALUE;
 
             for (VisorCacheMetrics metric : metrics.values())
-                maxMisses = Math.max(maxMisses, metric.misses());
+                maxMisses = Math.max(maxMisses, metric.getMisses());
         }
 
         return maxMisses;
@@ -344,12 +349,12 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     /**
      * @return Minimum total number of reads of the owning cache.
      */
-    public long minimumReads() {
+    public long getMinimumReads() {
         if (minReads == null) {
             minReads = Long.MAX_VALUE;
 
             for (VisorCacheMetrics metric : metrics.values())
-                minReads = Math.min(minReads, metric.reads());
+                minReads = Math.min(minReads, metric.getReads());
         }
 
         return minReads;
@@ -358,12 +363,12 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     /**
      * @return Average total number of reads of the owning cache.
      */
-    public double averageReads() {
+    public double getAverageReads() {
         if (avgReads == null) {
             avgReads = 0.0d;
 
             for (VisorCacheMetrics metric : metrics.values())
-                avgReads += metric.reads();
+                avgReads += metric.getReads();
 
             avgReads /= metrics.size();
         }
@@ -374,12 +379,12 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     /**
      * @return Maximum total number of reads of the owning cache.
      */
-    public long maximumReads() {
+    public long getMaximumReads() {
         if (maxReads == null) {
             maxReads = Long.MIN_VALUE;
 
             for (VisorCacheMetrics metric : metrics.values())
-                maxReads = Math.max(maxReads, metric.reads());
+                maxReads = Math.max(maxReads, metric.getReads());
         }
 
         return maxReads;
@@ -388,12 +393,12 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     /**
      * @return Minimum total number of writes of the owning cache.
      */
-    public long minimumWrites() {
+    public long getMinimumWrites() {
         if (minWrites == null) {
             minWrites = Long.MAX_VALUE;
 
             for (VisorCacheMetrics metric : metrics.values())
-                minWrites = Math.min(minWrites, metric.writes());
+                minWrites = Math.min(minWrites, metric.getWrites());
         }
 
         return minWrites;
@@ -402,12 +407,12 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     /**
      * @return Average total number of writes of the owning cache.
      */
-    public double averageWrites() {
+    public double getAverageWrites() {
         if (avgWrites == null) {
             avgWrites = 0.0d;
 
             for (VisorCacheMetrics metric : metrics.values())
-                avgWrites += metric.writes();
+                avgWrites += metric.getWrites();
 
             avgWrites /= metrics.size();
         }
@@ -418,12 +423,12 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     /**
      * @return Maximum total number of writes of the owning cache.
      */
-    public long maximumWrites() {
+    public long getMaximumWrites() {
         if (maxWrites == null) {
             maxWrites = Long.MIN_VALUE;
 
             for (VisorCacheMetrics metric : metrics.values())
-                maxWrites = Math.max(maxWrites, metric.writes());
+                maxWrites = Math.max(maxWrites, metric.getWrites());
         }
 
         return maxWrites;
@@ -432,12 +437,12 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     /**
      * @return Minimum execution time of query.
      */
-    public long minimumQueryTime() {
+    public long getMinimumQueryTime() {
         if (minQryTime == null) {
             minQryTime = Long.MAX_VALUE;
 
             for (VisorCacheMetrics metric : metrics.values())
-                minQryTime = Math.min(minQryTime, metric.queryMetrics().minimumTime());
+                minQryTime = Math.min(minQryTime, metric.getQueryMetrics().getMinimumTime());
         }
 
         return minQryTime;
@@ -446,12 +451,12 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     /**
      * @return Average execution time of query.
      */
-    public double averageQueryTime() {
+    public double getAverageQueryTime() {
         if (avgQryTime == null) {
             avgQryTime = 0.0d;
 
             for (VisorCacheMetrics metric : metrics.values())
-                avgQryTime += metric.queryMetrics().averageTime();
+                avgQryTime += metric.getQueryMetrics().getAverageTime();
 
             avgQryTime /= metrics.size();
         }
@@ -462,12 +467,12 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     /**
      * @return Maximum execution time of query.
      */
-    public long maximumQueryTime() {
+    public long getMaximumQueryTime() {
         if (maxQryTime == null) {
             maxQryTime = Long.MIN_VALUE;
 
             for (VisorCacheMetrics metric : metrics.values())
-                maxQryTime = Math.max(maxQryTime, metric.queryMetrics().maximumTime());
+                maxQryTime = Math.max(maxQryTime, metric.getQueryMetrics().getMaximumTime());
         }
 
         return maxQryTime;
@@ -476,9 +481,9 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     /**
      * @return Total execution time of query.
      */
-    public long totalQueryTime() {
+    public long getTotalQueryTime() {
         if (totalQryTime == null)
-            totalQryTime = (long)(averageQueryTime() * execsQuery());
+            totalQryTime = (long)(getAverageQueryTime() * getQueryExecutions());
 
         return totalQryTime;
     }
@@ -486,12 +491,12 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     /**
      * @return Number of executions.
      */
-    public int execsQuery() {
+    public int getQueryExecutions() {
         if (execsQry == null) {
             execsQry = 0;
 
             for (VisorCacheMetrics metric : metrics.values())
-                execsQry += metric.queryMetrics().executions();
+                execsQry += metric.getQueryMetrics().getExecutions();
         }
 
         return execsQry;
@@ -500,25 +505,89 @@ public class VisorCacheAggregatedMetrics implements Serializable, LessNamingBean
     /**
      * @return Total number of times a query execution failed.
      */
-    public int failsQuery() {
+    public int getQueryFailures() {
         if (failsQry == null) {
             failsQry = 0;
 
             for (VisorCacheMetrics metric : metrics.values())
-                failsQry += metric.queryMetrics().fails();
+                failsQry += metric.getQueryMetrics().getFailures();
         }
 
         return failsQry;
     }
 
     /**
-     * @return Node IDs with cache metrics.
+     * @return Map of Node IDs to cache metrics.
      */
-    public Map<UUID, VisorCacheMetrics> metrics() {
+    public Map<UUID, VisorCacheMetrics> getMetrics() {
         return metrics;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, name);
+        U.writeEnum(out, mode);
+        out.writeBoolean(sys);
+        U.writeMap(out, metrics);
+        out.writeObject(minHeapSize);
+        out.writeObject(avgHeapSize);
+        out.writeObject(maxHeapSize);
+        out.writeObject(minOffHeapSize);
+        out.writeObject(avgOffHeapSize);
+        out.writeObject(maxOffHeapSize);
+        out.writeObject(minHits);
+        out.writeObject(avgHits);
+        out.writeObject(maxHits);
+        out.writeObject(minMisses);
+        out.writeObject(avgMisses);
+        out.writeObject(maxMisses);
+        out.writeObject(minReads);
+        out.writeObject(avgReads);
+        out.writeObject(maxReads);
+        out.writeObject(minWrites);
+        out.writeObject(avgWrites);
+        out.writeObject(maxWrites);
+        out.writeObject(minQryTime);
+        out.writeObject(avgQryTime);
+        out.writeObject(maxQryTime);
+        out.writeObject(totalQryTime);
+        out.writeObject(execsQry);
+        out.writeObject(failsQry);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        name = U.readString(in);
+        mode = CacheMode.fromOrdinal(in.readByte());
+        sys = in.readBoolean();
+        metrics = U.readMap(in);
+        minHeapSize = (Long)in.readObject();
+        avgHeapSize = (Double)in.readObject();
+        maxHeapSize = (Long)in.readObject();
+        minOffHeapSize = (Long)in.readObject();
+        avgOffHeapSize = (Double)in.readObject();
+        maxOffHeapSize = (Long)in.readObject();
+        minHits = (Long)in.readObject();
+        avgHits = (Double)in.readObject();
+        maxHits = (Long)in.readObject();
+        minMisses = (Long)in.readObject();
+        avgMisses = (Double)in.readObject();
+        maxMisses = (Long)in.readObject();
+        minReads = (Long)in.readObject();
+        avgReads = (Double)in.readObject();
+        maxReads = (Long)in.readObject();
+        minWrites = (Long)in.readObject();
+        avgWrites = (Double)in.readObject();
+        maxWrites = (Long)in.readObject();
+        minQryTime = (Long)in.readObject();
+        avgQryTime = (Double)in.readObject();
+        maxQryTime = (Long)in.readObject();
+        totalQryTime = (Long)in.readObject();
+        execsQry = (Integer)in.readObject();
+        failsQry = (Integer)in.readObject();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorCacheAggregatedMetrics.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheClearTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheClearTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheClearTask.java
index 7556e7c..6d14939 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheClearTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheClearTask.java
@@ -24,8 +24,6 @@ import org.apache.ignite.internal.processors.task.GridInternal;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.visor.VisorJob;
 import org.apache.ignite.internal.visor.VisorOneNodeTask;
-import org.apache.ignite.lang.IgniteBiTuple;
-import org.apache.ignite.lang.IgniteCallable;
 import org.apache.ignite.lang.IgniteFuture;
 import org.apache.ignite.lang.IgniteInClosure;
 import org.apache.ignite.resources.JobContextResource;
@@ -34,7 +32,7 @@ import org.apache.ignite.resources.JobContextResource;
  * Task that clears specified caches on specified node.
  */
 @GridInternal
-public class VisorCacheClearTask extends VisorOneNodeTask<String, IgniteBiTuple<Integer, Integer>> {
+public class VisorCacheClearTask extends VisorOneNodeTask<String, VisorCacheClearTaskResult> {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -46,18 +44,15 @@ public class VisorCacheClearTask extends VisorOneNodeTask<String, IgniteBiTuple<
     /**
      * Job that clear specified caches.
      */
-    private static class VisorCacheClearJob extends VisorJob<String, IgniteBiTuple<Integer, Integer>> {
+    private static class VisorCacheClearJob extends VisorJob<String, VisorCacheClearTaskResult> {
         /** */
         private static final long serialVersionUID = 0L;
 
         /** */
-        private final String cacheName;
+        private final IgniteInClosure<IgniteFuture> lsnr;
 
         /** */
-        private final IgniteInClosure<IgniteFuture<Integer>> lsnr;
-
-        /** */
-        private IgniteFuture<Integer>[] futs;
+        private IgniteFuture<Long>[] futs;
 
         /** */
         @JobContextResource
@@ -72,13 +67,11 @@ public class VisorCacheClearTask extends VisorOneNodeTask<String, IgniteBiTuple<
         private VisorCacheClearJob(String cacheName, boolean debug) {
             super(cacheName, debug);
 
-            this.cacheName = cacheName;
-
-            lsnr = new IgniteInClosure<IgniteFuture<Integer>>() {
+            lsnr = new IgniteInClosure<IgniteFuture>() {
                 /** */
                 private static final long serialVersionUID = 0L;
 
-                @Override public void apply(IgniteFuture<Integer> f) {
+                @Override public void apply(IgniteFuture f) {
                     assert futs[0].isDone();
                     assert futs[1] == null || futs[1].isDone();
                     assert futs[2] == null || futs[2].isDone();
@@ -89,13 +82,10 @@ public class VisorCacheClearTask extends VisorOneNodeTask<String, IgniteBiTuple<
         }
 
         /**
-         * @param fut Future for asynchronous cache operation.
-         * @param idx Index.
-         * @return {@code true} If subJob was not completed and this job should be suspended.
+         * @param fut Future to listen.
+         * @return {@code true} If future was not completed and this job should holdCC.
          */
-        private boolean callAsync(IgniteFuture<Integer> fut, int idx) {
-            futs[idx] = fut;
-
+        private boolean callAsync(IgniteFuture fut) {
             if (fut.isDone())
                 return false;
 
@@ -107,7 +97,7 @@ public class VisorCacheClearTask extends VisorOneNodeTask<String, IgniteBiTuple<
         }
 
         /** {@inheritDoc} */
-        @Override protected IgniteBiTuple<Integer, Integer> run(final String cacheName) {
+        @Override protected VisorCacheClearTaskResult run(final String cacheName) {
             if (futs == null)
                 futs = new IgniteFuture[3];
 
@@ -115,24 +105,30 @@ public class VisorCacheClearTask extends VisorOneNodeTask<String, IgniteBiTuple<
                 IgniteCache cache = ignite.cache(cacheName);
 
                 if (futs[0] == null) {
-                    if (callAsync(cache.sizeAsync(CachePeekMode.PRIMARY), 0))
+                    futs[0] = cache.sizeLongAsync(CachePeekMode.PRIMARY);
+
+                    if (callAsync(futs[0]))
                         return null;
                 }
 
                 if (futs[1] == null) {
-                    if (callAsync(cache.clearAsync(), 1))
+                    futs[1] = cache.clearAsync();
+
+                    if (callAsync(futs[1]))
                         return null;
                 }
-                
+
                 if (futs[2] == null) {
-                    if (callAsync(cache.sizeAsync(CachePeekMode.PRIMARY), 2))
+                    futs[2] = cache.sizeLongAsync(CachePeekMode.PRIMARY);
+
+                    if (callAsync(futs[2]))
                         return null;
                 }
             }
 
             assert futs[0].isDone() && futs[1].isDone() && futs[2].isDone();
 
-            return new IgniteBiTuple<>(futs[0].get(), futs[2].get());
+            return new VisorCacheClearTaskResult(futs[0].get(), futs[2].get());
         }
 
         /** {@inheritDoc} */
@@ -140,58 +136,4 @@ public class VisorCacheClearTask extends VisorOneNodeTask<String, IgniteBiTuple<
             return S.toString(VisorCacheClearJob.class, this);
         }
     }
-
-    /**
-     * Callable to get cache size.
-     *
-     * @deprecated This class needed only for compatibility.
-     */
-    @GridInternal @Deprecated
-    private static class VisorCacheSizeCallable implements IgniteCallable<Integer> {
-        /** */
-        private static final long serialVersionUID = 0L;
-
-        /** */
-        private final IgniteCache cache;
-
-        /**
-         * @param cache Cache to take size from.
-         */
-        private VisorCacheSizeCallable(IgniteCache cache) {
-            this.cache = cache;
-        }
-
-        /** {@inheritDoc} */
-        @Override public Integer call() throws Exception {
-            return cache.size(CachePeekMode.PRIMARY);
-        }
-    }
-
-    /**
-     * Callable to clear cache.
-     *
-     * @deprecated This class needed only for compatibility.
-     */
-    @GridInternal @Deprecated
-    private static class VisorCacheClearCallable implements IgniteCallable<Integer> {
-        /** */
-        private static final long serialVersionUID = 0L;
-
-        /** */
-        private final IgniteCache cache;
-
-        /**
-         * @param cache Cache to clear.
-         */
-        private VisorCacheClearCallable(IgniteCache cache) {
-            this.cache = cache;
-        }
-
-        /** {@inheritDoc} */
-        @Override public Integer call() throws Exception {
-            cache.clear();
-
-            return 0;
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheClearTaskResult.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheClearTaskResult.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheClearTaskResult.java
new file mode 100644
index 0000000..c7249f7
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheClearTaskResult.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.cache;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Result for {@link VisorCacheClearTask}.
+ */
+public class VisorCacheClearTaskResult extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Cache size before clearing. */
+    private long sizeBefore;
+
+    /** Cache size after clearing. */
+    private long sizeAfter;
+
+    /**
+     * Default constructor.
+     */
+    public VisorCacheClearTaskResult() {
+        // No-op.
+    }
+
+    /**
+     * @param sizeBefore Cache size before clearing.
+     * @param sizeAfter Cache size after clearing.
+     */
+    public VisorCacheClearTaskResult(long sizeBefore, long sizeAfter) {
+        this.sizeBefore = sizeBefore;
+        this.sizeAfter = sizeAfter;
+    }
+
+    /**
+     * @return Cache size before clearing.
+     */
+    public long getSizeBefore() {
+        return sizeBefore;
+    }
+
+    /**
+     * @return Cache size after clearing.
+     */
+    public long getSizeAfter() {
+        return sizeAfter;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeLong(sizeBefore);
+        out.writeLong(sizeAfter);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        sizeBefore = in.readLong();
+        sizeAfter = in.readLong();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorCacheClearTaskResult.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheConfiguration.java
index e087881..91a501c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheConfiguration.java
@@ -17,16 +17,22 @@
 
 package org.apache.ignite.internal.visor.cache;
 
-import java.io.Serializable;
-import java.util.Collection;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.List;
 import org.apache.ignite.cache.CacheAtomicWriteOrderMode;
 import org.apache.ignite.cache.CacheAtomicityMode;
 import org.apache.ignite.cache.CacheMode;
 import org.apache.ignite.cache.CacheWriteSynchronizationMode;
+import org.apache.ignite.cache.PartitionLossPolicy;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.internal.IgniteEx;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+import org.apache.ignite.internal.visor.query.VisorQueryConfiguration;
+import org.apache.ignite.internal.visor.query.VisorQueryEntity;
 import org.jetbrains.annotations.Nullable;
 
 import static org.apache.ignite.internal.visor.util.VisorTaskUtils.compactClass;
@@ -34,7 +40,7 @@ import static org.apache.ignite.internal.visor.util.VisorTaskUtils.compactClass;
 /**
  * Data transfer object for cache configuration properties.
  */
-public class VisorCacheConfiguration implements Serializable, LessNamingBean {
+public class VisorCacheConfiguration extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -62,16 +68,16 @@ public class VisorCacheConfiguration implements Serializable, LessNamingBean {
     /** Start size. */
     private int startSize;
 
-    /** Off-heap max memory. */
-    private long offHeapMaxMemory;
-
     /** Max concurrent async operations. */
     private int maxConcurrentAsyncOps;
 
     /** Cache interceptor. */
     private String interceptor;
 
-    /** Cache affinityCfg config. */
+    /** Default lock acquisition timeout. */
+    private long dfltLockTimeout;
+
+    /** Cache affinity config. */
     private VisorCacheAffinityConfiguration affinityCfg;
 
     /** Preload config. */
@@ -83,14 +89,14 @@ public class VisorCacheConfiguration implements Serializable, LessNamingBean {
     /** Near cache config. */
     private VisorCacheNearConfiguration nearCfg;
 
-    /** Default config. */
-    private VisorCacheDefaultConfiguration dfltCfg;
-
     /** Store config. */
     private VisorCacheStoreConfiguration storeCfg;
 
+    /** Collection of query entities. */
+    private List<VisorQueryEntity> qryEntities;
+
     /** Collection of type metadata. */
-    private Collection<VisorCacheTypeMetadata> typeMeta;
+    private List<VisorCacheJdbcType> jdbcTypes;
 
     /** Whether statistics collection is enabled. */
     private boolean statisticsEnabled;
@@ -108,17 +114,37 @@ public class VisorCacheConfiguration implements Serializable, LessNamingBean {
     private String expiryPlcFactory;
 
     /** Query configuration. */
-    private VisorCacheQueryConfiguration qryCfg;
+    private VisorQueryConfiguration qryCfg;
 
     /** System cache flag. */
     private boolean sys;
 
+    /** Keep binary in store flag. */
+    private boolean storeKeepBinary;
+
+    /** On-heap cache enabled flag. */
+    private boolean onheapCache;
+
+    /** Partition loss policy. */
+    private PartitionLossPolicy partLossPlc;
+
+    /** Query parallelism. */
+    private int qryParallelism;
+
+    /**
+     * Default constructor.
+     */
+    public VisorCacheConfiguration() {
+        // No-op.
+    }
+
     /**
+     * Create data transfer object for cache configuration properties.
+     *
      * @param ignite Grid.
      * @param ccfg Cache configuration.
-     * @return Data transfer object for cache configuration properties.
      */
-    public VisorCacheConfiguration from(IgniteEx ignite, CacheConfiguration ccfg) {
+    public VisorCacheConfiguration(IgniteEx ignite, CacheConfiguration ccfg) {
         name = ccfg.getName();
         mode = ccfg.getCacheMode();
         atomicityMode = ccfg.getAtomicityMode();
@@ -129,200 +155,305 @@ public class VisorCacheConfiguration implements Serializable, LessNamingBean {
         startSize = ccfg.getStartSize();
         maxConcurrentAsyncOps = ccfg.getMaxConcurrentAsyncOperations();
         interceptor = compactClass(ccfg.getInterceptor());
-        typeMeta = VisorCacheTypeMetadata.list(ccfg.getQueryEntities(), ccfg.getCacheStoreFactory());
+        dfltLockTimeout = ccfg.getDefaultLockTimeout();
+        qryEntities = VisorQueryEntity.list(ccfg.getQueryEntities());
+        jdbcTypes = VisorCacheJdbcType.list(ccfg.getCacheStoreFactory());
         statisticsEnabled = ccfg.isStatisticsEnabled();
         mgmtEnabled = ccfg.isManagementEnabled();
         ldrFactory = compactClass(ccfg.getCacheLoaderFactory());
         writerFactory = compactClass(ccfg.getCacheWriterFactory());
         expiryPlcFactory = compactClass(ccfg.getExpiryPolicyFactory());
-        sys = ignite.context().cache().systemCache(ccfg.getName());
 
-        affinityCfg = VisorCacheAffinityConfiguration.from(ccfg);
-        rebalanceCfg = VisorCacheRebalanceConfiguration.from(ccfg);
-        evictCfg = VisorCacheEvictionConfiguration.from(ccfg);
-        nearCfg = VisorCacheNearConfiguration.from(ccfg);
-        dfltCfg = VisorCacheDefaultConfiguration.from(ccfg);
+        sys = ignite.context().cache().systemCache(ccfg.getName());
+        storeKeepBinary = ccfg.isStoreKeepBinary();
+        onheapCache = ccfg.isOnheapCacheEnabled();
+        partLossPlc = ccfg.getPartitionLossPolicy();
+        qryParallelism = ccfg.getQueryParallelism();
 
-        storeCfg = new VisorCacheStoreConfiguration().from(ignite, ccfg);
+        affinityCfg = new VisorCacheAffinityConfiguration(ccfg);
+        rebalanceCfg = new VisorCacheRebalanceConfiguration(ccfg);
+        evictCfg = new VisorCacheEvictionConfiguration(ccfg);
+        nearCfg = new VisorCacheNearConfiguration(ccfg);
 
-        qryCfg = new VisorCacheQueryConfiguration().from(ccfg);
+        storeCfg = new VisorCacheStoreConfiguration(ignite, ccfg);
 
-        return this;
+        qryCfg = new VisorQueryConfiguration(ccfg);
     }
 
     /**
      * @return Cache name.
      */
-    @Nullable public String name() {
+    @Nullable public String getName() {
         return name;
     }
 
     /**
      * @return Cache mode.
      */
-    public CacheMode mode() {
+    public CacheMode getMode() {
         return mode;
     }
 
     /**
-     * @return Cache atomicity mode
+     * @return Cache atomicity mode.
      */
-    public CacheAtomicityMode atomicityMode() {
+    public CacheAtomicityMode getAtomicityMode() {
         return atomicityMode;
     }
 
     /**
      * @return Cache atomicity write ordering mode.
      */
-    public CacheAtomicWriteOrderMode atomicWriteOrderMode() {
+    public CacheAtomicWriteOrderMode getAtomicWriteOrderMode() {
         return atomicWriteOrderMode;
     }
 
     /**
-     * @return Eager ttl flag
-     */
-    public boolean eagerTtl() {
-        return eagerTtl;
-    }
-
-    /**
      * @return Write synchronization mode.
      */
-    public CacheWriteSynchronizationMode writeSynchronizationMode() {
+    public CacheWriteSynchronizationMode getWriteSynchronizationMode() {
         return writeSynchronizationMode;
     }
 
     /**
      * @return Invalidate.
      */
-    public boolean invalidate() {
+    public boolean isInvalidate() {
         return invalidate;
     }
 
     /**
      * @return Start size.
      */
-    public int startSize() {
+    public int getStartSize() {
         return startSize;
     }
 
     /**
-     * @return Off-heap max memory.
-     */
-    public long offsetHeapMaxMemory() {
-        return offHeapMaxMemory;
-    }
-
-    /**
      * @return Max concurrent async operations
      */
-    public int maxConcurrentAsyncOperations() {
+    public int getMaxConcurrentAsyncOperations() {
         return maxConcurrentAsyncOps;
     }
 
     /**
      * @return Cache interceptor.
      */
-    @Nullable public String interceptor() {
+    @Nullable public String getInterceptor() {
         return interceptor;
     }
 
     /**
+     * @return Gets default lock acquisition timeout.
+     */
+    public long getDefaultLockTimeout() {
+        return dfltLockTimeout;
+    }
+
+    /**
      * @return Collection of type metadata.
      */
-    public Collection<VisorCacheTypeMetadata> typeMeta() {
-        return typeMeta;
+    public List<VisorCacheJdbcType> getJdbcTypes() {
+        return jdbcTypes;
+    }
+
+    /**
+     * @return Near cache config.
+     */
+    public VisorCacheNearConfiguration getNearConfiguration() {
+        return nearCfg;
+    }
+
+    /**
+     * @return Eager ttl flag.
+     */
+    public boolean isEagerTtl() {
+        return eagerTtl;
     }
 
     /**
-     * @return {@code true} if cache statistics enabled.
+     * @return Default lock acquisition timeout.
      */
-    public boolean statisticsEnabled() {
+    public long getDfltLockTimeout() {
+        return dfltLockTimeout;
+    }
+
+    /**
+     * @return {@code true} if cache statistics collection enabled.
+     */
+    public boolean isStatisticsEnabled() {
         return statisticsEnabled;
     }
 
     /**
      * @return Whether management is enabled.
      */
-    public boolean managementEnabled() {
+    public boolean isManagementEnabled() {
         return mgmtEnabled;
     }
 
     /**
      * @return Class name of cache loader factory.
      */
-    public String loaderFactory() {
+    public String getLoaderFactory() {
         return ldrFactory;
     }
 
     /**
      * @return Class name of cache writer factory.
      */
-    public String writerFactory() {
+    public String getWriterFactory() {
         return writerFactory;
     }
 
     /**
      * @return Class name of expiry policy factory.
      */
-    public String expiryPolicyFactory() {
+    public String getExpiryPolicyFactory() {
         return expiryPlcFactory;
     }
 
     /**
-     * @return Cache affinityCfg config.
+     * @return Cache affinity config.
      */
-    public VisorCacheAffinityConfiguration affinityConfiguration() {
+    public VisorCacheAffinityConfiguration getAffinityConfiguration() {
         return affinityCfg;
     }
 
     /**
      * @return Preload config.
      */
-    public VisorCacheRebalanceConfiguration rebalanceConfiguration() {
+    public VisorCacheRebalanceConfiguration getRebalanceConfiguration() {
         return rebalanceCfg;
     }
 
     /**
      * @return Eviction config.
      */
-    public VisorCacheEvictionConfiguration evictConfiguration() {
+    public VisorCacheEvictionConfiguration getEvictionConfiguration() {
         return evictCfg;
     }
 
     /**
-     * @return Near cache config.
+     * @return Store config
      */
-    public VisorCacheNearConfiguration nearConfiguration() {
-        return nearCfg;
+    public VisorCacheStoreConfiguration getStoreConfiguration() {
+        return storeCfg;
     }
 
     /**
-     * @return Dgc config
+     * @return Collection of query entities.
      */
-    public VisorCacheDefaultConfiguration defaultConfiguration() {
-        return dfltCfg;
+    public List<VisorQueryEntity> getQueryEntities() {
+        return qryEntities;
     }
 
     /**
-     * @return Store config
+     * @return Collection of query entities.
      */
-    public VisorCacheStoreConfiguration storeConfiguration() {
-        return storeCfg;
+    public VisorQueryConfiguration getQueryConfiguration() {
+        return qryCfg;
     }
 
     /**
-     * @return Cache query configuration.
+     * @return System cache flag.
      */
-    public VisorCacheQueryConfiguration queryConfiguration() {
-        return qryCfg;
+    public boolean isSystem() {
+        return sys;
     }
 
     /**
-     * @return System cache state.
+     * @return Keep binary in store flag.
      */
-    public boolean system() {
-        return sys;
+    public Boolean isStoreKeepBinary() {
+        return storeKeepBinary;
+    }
+
+    /**
+     * @return On-heap cache enabled flag.
+     */
+    public boolean isOnheapCacheEnabled() {
+        return onheapCache;
+    }
+
+    /**
+     * @return Partition loss policy.
+     */
+    public PartitionLossPolicy getPartitionLossPolicy() {
+        return partLossPlc;
+    }
+
+    /**
+     * @return Query parallelism.
+     */
+    public int getQueryParallelism() {
+        return qryParallelism;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, name);
+        U.writeEnum(out, mode);
+        U.writeEnum(out, atomicityMode);
+        U.writeEnum(out, atomicWriteOrderMode);
+        out.writeBoolean(eagerTtl);
+        U.writeEnum(out, writeSynchronizationMode);
+        out.writeBoolean(invalidate);
+        out.writeInt(startSize);
+        out.writeInt(maxConcurrentAsyncOps);
+        U.writeString(out, interceptor);
+        out.writeLong(dfltLockTimeout);
+        out.writeObject(affinityCfg);
+        out.writeObject(rebalanceCfg);
+        out.writeObject(evictCfg);
+        out.writeObject(nearCfg);
+        out.writeObject(storeCfg);
+        U.writeCollection(out, qryEntities);
+        U.writeCollection(out, jdbcTypes);
+        out.writeBoolean(statisticsEnabled);
+        out.writeBoolean(mgmtEnabled);
+        U.writeString(out, ldrFactory);
+        U.writeString(out, writerFactory);
+        U.writeString(out, expiryPlcFactory);
+        out.writeObject(qryCfg);
+        out.writeBoolean(sys);
+        out.writeBoolean(storeKeepBinary);
+        out.writeBoolean(onheapCache);
+        U.writeEnum(out, partLossPlc);
+        out.writeInt(qryParallelism);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer,
+        ObjectInput in) throws IOException, ClassNotFoundException {
+        name = U.readString(in);
+        mode = CacheMode.fromOrdinal(in.readByte());
+        atomicityMode = CacheAtomicityMode.fromOrdinal(in.readByte());
+        atomicWriteOrderMode = CacheAtomicWriteOrderMode.fromOrdinal(in.readByte());
+        eagerTtl = in.readBoolean();
+        writeSynchronizationMode = CacheWriteSynchronizationMode.fromOrdinal(in.readByte());
+        invalidate = in.readBoolean();
+        startSize = in.readInt();
+        maxConcurrentAsyncOps = in.readInt();
+        interceptor = U.readString(in);
+        dfltLockTimeout = in.readLong();
+        affinityCfg = (VisorCacheAffinityConfiguration)in.readObject();
+        rebalanceCfg = (VisorCacheRebalanceConfiguration)in.readObject();
+        evictCfg = (VisorCacheEvictionConfiguration)in.readObject();
+        nearCfg = (VisorCacheNearConfiguration)in.readObject();
+        storeCfg = (VisorCacheStoreConfiguration)in.readObject();
+        qryEntities = U.readList(in);
+        jdbcTypes = U.readList(in);
+        statisticsEnabled = in.readBoolean();
+        mgmtEnabled = in.readBoolean();
+        ldrFactory = U.readString(in);
+        writerFactory = U.readString(in);
+        expiryPlcFactory = U.readString(in);
+        qryCfg = (VisorQueryConfiguration)in.readObject();
+        sys = in.readBoolean();
+        onheapCache = in.readBoolean();
+        partLossPlc = PartitionLossPolicy.fromOrdinal(in.readByte());
+        qryParallelism = in.readInt();
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheConfigurationCollectorJob.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheConfigurationCollectorJob.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheConfigurationCollectorJob.java
index c872d98..c2a3c02 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheConfigurationCollectorJob.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheConfigurationCollectorJob.java
@@ -67,11 +67,11 @@ public class VisorCacheConfigurationCollectorJob
      * @return Data transfer object to send it to Visor.
      */
     protected VisorCacheConfiguration config(CacheConfiguration ccfg) {
-        return new VisorCacheConfiguration().from(ignite, ccfg);
+        return new VisorCacheConfiguration(ignite, ccfg);
     }
 
     /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorCacheConfigurationCollectorJob.class, this);
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheDefaultConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheDefaultConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheDefaultConfiguration.java
deleted file mode 100644
index 03b5020..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheDefaultConfiguration.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.visor.cache;
-
-import java.io.Serializable;
-import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.internal.LessNamingBean;
-import org.apache.ignite.internal.util.typedef.internal.S;
-
-/**
- * Data transfer object for default cache configuration properties.
- */
-public class VisorCacheDefaultConfiguration implements Serializable, LessNamingBean {
-    /** */
-    private static final long serialVersionUID = 0L;
-
-    /** Default transaction timeout. */
-    private long txLockTimeout;
-
-    /**
-     * @param ccfg Cache configuration.
-     * @return Data transfer object for default cache configuration properties.
-     */
-    public static VisorCacheDefaultConfiguration from(CacheConfiguration ccfg) {
-        VisorCacheDefaultConfiguration cfg = new VisorCacheDefaultConfiguration();
-
-        cfg.txLockTimeout = ccfg.getDefaultLockTimeout();
-
-        return cfg;
-    }
-
-    /**
-     * @return Default transaction timeout.
-     */
-    public long txLockTimeout() {
-        return txLockTimeout;
-    }
-
-    /** {@inheritDoc} */
-    @Override public String toString() {
-        return S.toString(VisorCacheDefaultConfiguration.class, this);
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheEvictionConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheEvictionConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheEvictionConfiguration.java
index b6f72c4..7792d8e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheEvictionConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheEvictionConfiguration.java
@@ -17,11 +17,14 @@
 
 package org.apache.ignite.internal.visor.cache;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.apache.ignite.cache.eviction.EvictionPolicy;
 import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 import org.jetbrains.annotations.Nullable;
 
 import static org.apache.ignite.internal.visor.util.VisorTaskUtils.compactClass;
@@ -30,7 +33,7 @@ import static org.apache.ignite.internal.visor.util.VisorTaskUtils.evictionPolic
 /**
  * Data transfer object for eviction configuration properties.
  */
-public class VisorCacheEvictionConfiguration implements Serializable, LessNamingBean {
+public class VisorCacheEvictionConfiguration extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -44,43 +47,60 @@ public class VisorCacheEvictionConfiguration implements Serializable, LessNaming
     private String filter;
 
     /**
-     * @param ccfg Cache configuration.
-     * @return Data transfer object for eviction configuration properties.
+     * Default constructor.
      */
-    public static VisorCacheEvictionConfiguration from(CacheConfiguration ccfg) {
-        VisorCacheEvictionConfiguration cfg = new VisorCacheEvictionConfiguration();
-
-        final EvictionPolicy plc = ccfg.getEvictionPolicy();
+    public VisorCacheEvictionConfiguration() {
+        // No-op.
+    }
 
-        cfg.plc = compactClass(plc);
-        cfg.plcMaxSize = evictionPolicyMaxSize(plc);
-        cfg.filter = compactClass(ccfg.getEvictionFilter());
+    /**
+     * Create data transfer object for eviction configuration properties.
+     * @param ccfg Cache configuration.
+     */
+    public VisorCacheEvictionConfiguration(CacheConfiguration ccfg) {
+        final EvictionPolicy evictionPlc = ccfg.getEvictionPolicy();
 
-        return cfg;
+        plc = compactClass(evictionPlc);
+        plcMaxSize = evictionPolicyMaxSize(evictionPlc);
+        filter = compactClass(ccfg.getEvictionFilter());
     }
 
     /**
      * @return Eviction policy.
      */
-    @Nullable public String policy() {
+    @Nullable public String getPolicy() {
         return plc;
     }
 
     /**
      * @return Cache eviction policy max size.
      */
-    @Nullable public Integer policyMaxSize() {
+    @Nullable public Integer getPolicyMaxSize() {
         return plcMaxSize;
     }
 
     /**
      * @return Eviction filter to specify which entries should not be evicted.
      */
-    @Nullable public String filter() {
+    @Nullable public String getFilter() {
         return filter;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, plc);
+        out.writeObject(plcMaxSize);
+        U.writeString(out, filter);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        plc = U.readString(in);
+        plcMaxSize = (Integer)in.readObject();
+        filter = U.readString(in);
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorCacheEvictionConfiguration.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheJdbcType.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheJdbcType.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheJdbcType.java
new file mode 100644
index 0000000..e50402c
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheJdbcType.java
@@ -0,0 +1,189 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.cache;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStoreFactory;
+import org.apache.ignite.cache.store.jdbc.JdbcType;
+import org.apache.ignite.cache.store.jdbc.JdbcTypeField;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+import javax.cache.configuration.Factory;
+
+/**
+ * Data transfer object for {@link JdbcType}.
+ */
+public class VisorCacheJdbcType extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Schema name in database. */
+    private String dbSchema;
+
+    /** Table name in database. */
+    private String dbTbl;
+
+    /** Key class used to store key in cache. */
+    private String keyType;
+
+    /** Value class used to store value in cache. */
+    private String valType;
+
+    /** Key fields. */
+    private List<VisorCacheJdbcTypeField> keyFields;
+
+    /** Value fields. */
+    private List<VisorCacheJdbcTypeField> valFields;
+
+    /**
+     * @param factory Store factory to extract JDBC types info.
+     * @return Data transfer object for cache type metadata configurations.
+     */
+    public static List<VisorCacheJdbcType> list(Factory factory) {
+        List<VisorCacheJdbcType> res = new ArrayList<>();
+
+        if (factory != null || factory instanceof CacheJdbcPojoStoreFactory) {
+            CacheJdbcPojoStoreFactory jdbcFactory = (CacheJdbcPojoStoreFactory) factory;
+
+            JdbcType[] jdbcTypes = jdbcFactory.getTypes();
+
+            if (!F.isEmpty(jdbcTypes)) {
+                for (JdbcType jdbcType : jdbcTypes)
+                    res.add(new VisorCacheJdbcType(jdbcType));
+            }
+        }
+
+        return res;
+    }
+
+    /**
+     * Create data transfer object for given cache type metadata.
+     */
+    public VisorCacheJdbcType() {
+        // No-op.
+    }
+
+    /**
+     * Create data transfer object for given cache type metadata.
+     *
+     * @param jdbcType JDBC type.
+     */
+    public VisorCacheJdbcType(JdbcType jdbcType) {
+        keyType = jdbcType.getKeyType();
+        valType = jdbcType.getValueType();
+
+        dbSchema = jdbcType.getDatabaseSchema();
+        dbTbl = jdbcType.getDatabaseTable();
+
+        JdbcTypeField[] kFields = jdbcType.getKeyFields();
+
+        if (kFields != null) {
+            keyFields = new ArrayList<>(kFields.length);
+
+            for (JdbcTypeField fld : kFields)
+                keyFields.add(new VisorCacheJdbcTypeField(
+                    fld.getDatabaseFieldName(), fld.getDatabaseFieldType(),
+                    fld.getDatabaseFieldName(), U.compact(fld.getJavaFieldType().getName())));
+        }
+
+        JdbcTypeField[] vFields = jdbcType.getValueFields();
+
+        if (vFields != null) {
+            valFields = new ArrayList<>(vFields.length);
+
+            for (JdbcTypeField fld : vFields)
+                valFields.add(new VisorCacheJdbcTypeField(
+                    fld.getDatabaseFieldName(), fld.getDatabaseFieldType(),
+                    fld.getDatabaseFieldName(), U.compact(fld.getJavaFieldType().getName())));
+        }
+    }
+
+    /**
+     * @return Schema name in database.
+     */
+    public String getDatabaseSchema() {
+        return dbSchema;
+    }
+
+    /**
+     * @return Table name in database.
+     */
+    public String getDatabaseTable() {
+        return dbTbl;
+    }
+
+    /**
+     * @return Key class used to store key in cache.
+     */
+    public String getKeyType() {
+        return keyType;
+    }
+
+    /**
+     * @return Value class used to store value in cache.
+     */
+    public String getValueType() {
+        return valType;
+    }
+
+    /**
+     * @return Key fields.
+     */
+    public List<VisorCacheJdbcTypeField> getKeyFields() {
+        return keyFields;
+    }
+
+    /**
+     * @return Value fields.
+     */
+    public List<VisorCacheJdbcTypeField> getValueFields() {
+        return valFields;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, dbSchema);
+        U.writeString(out, dbTbl);
+        U.writeString(out, keyType);
+        U.writeString(out, valType);
+        U.writeCollection(out, keyFields);
+        U.writeCollection(out, valFields);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        dbSchema = U.readString(in);
+        dbTbl = U.readString(in);
+        keyType = U.readString(in);
+        valType = U.readString(in);
+        keyFields = U.readList(in);
+        valFields = U.readList(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorCacheJdbcType.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheJdbcTypeField.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheJdbcTypeField.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheJdbcTypeField.java
new file mode 100644
index 0000000..5486aaf
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheJdbcTypeField.java
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.cache;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.cache.store.jdbc.JdbcTypeField;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Data transfer object for {@link JdbcTypeField}.
+ */
+public class VisorCacheJdbcTypeField extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Column name in database. */
+    private String dbName;
+
+    /** Column JDBC type in database. */
+    private int dbType;
+
+    /** Field name in java object. */
+    private String javaName;
+
+    /** Corresponding java type. */
+    private String javaType;
+
+    /**
+     * Empty constructor.
+     */
+    public VisorCacheJdbcTypeField() {
+        // No-op.
+    }
+
+    /**
+     * Full constructor.
+     *
+     * @param dbName Column name in database.
+     * @param dbType Column JDBC type in database.
+     * @param javaName Field name in java object.
+     * @param javaType Corresponding java type.
+     */
+    public VisorCacheJdbcTypeField(String dbName, int dbType, String javaName, String javaType) {
+        this.dbName = dbName;
+        this.dbType = dbType;
+        this.javaName = javaName;
+        this.javaType = javaType;
+    }
+
+    /**
+     * @return Column name in database.
+     */
+    public String getDatabaseName() {
+        return dbName;
+    }
+
+    /**
+     * @return Column JDBC type in database.
+     */
+    public int getDatabaseType() {
+        return dbType;
+    }
+
+    /**
+     * @return Field name in java object.
+     */
+    public String getJavaName() {
+        return javaName;
+    }
+
+    /**
+     * @return Corresponding java type.
+     */
+    public String getJavaType() {
+        return javaType;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, dbName);
+        out.writeInt(dbType);
+        U.writeString(out, javaName);
+        U.writeString(out, javaType);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        dbName = U.readString(in);
+        dbType = in.readInt();
+        javaName = U.readString(in);
+        javaType = U.readString(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorCacheJdbcTypeField.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheLoadTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheLoadTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheLoadTask.java
index 212aaa9..34ae12c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheLoadTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheLoadTask.java
@@ -26,7 +26,6 @@ import javax.cache.expiry.ExpiryPolicy;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.cache.CachePeekMode;
 import org.apache.ignite.internal.processors.task.GridInternal;
-import org.apache.ignite.internal.util.lang.GridTuple3;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.internal.visor.VisorJob;
@@ -37,18 +36,18 @@ import org.apache.ignite.internal.visor.VisorOneNodeTask;
  */
 @GridInternal
 public class VisorCacheLoadTask extends
-    VisorOneNodeTask<GridTuple3<Set<String>, Long, Object[]>, Map<String, Integer>> {
+    VisorOneNodeTask<VisorCacheLoadTaskArg, Map<String, Integer>> {
     /** */
     private static final long serialVersionUID = 0L;
 
     /** {@inheritDoc} */
-    @Override protected VisorCachesLoadJob job(GridTuple3<Set<String>, Long, Object[]> arg) {
+    @Override protected VisorCachesLoadJob job(VisorCacheLoadTaskArg arg) {
         return new VisorCachesLoadJob(arg, debug);
     }
 
     /** Job that load caches. */
     private static class VisorCachesLoadJob extends
-        VisorJob<GridTuple3<Set<String>, Long, Object[]>, Map<String, Integer>> {
+        VisorJob<VisorCacheLoadTaskArg, Map<String, Integer>> {
         /** */
         private static final long serialVersionUID = 0L;
 
@@ -56,18 +55,17 @@ public class VisorCacheLoadTask extends
          * @param arg Cache names, ttl and loader arguments.
          * @param debug Debug flag.
          */
-        private VisorCachesLoadJob(GridTuple3<Set<String>, Long, Object[]> arg, boolean debug) {
+        private VisorCachesLoadJob(VisorCacheLoadTaskArg arg, boolean debug) {
             super(arg, debug);
         }
 
         /** {@inheritDoc} */
-        @Override protected Map<String, Integer> run(GridTuple3<Set<String>, Long, Object[]> arg) {
-            Set<String> cacheNames = arg.get1();
-            Long ttl = arg.get2();
-            Object[] ldrArgs = arg.get3();
+        @Override protected Map<String, Integer> run(VisorCacheLoadTaskArg arg) {
+            Set<String> cacheNames = arg.getCacheNames();
+            long ttl = arg.getTtl();
+            Object[] ldrArgs = arg.getLdrArgs();
 
             assert cacheNames != null && !cacheNames.isEmpty();
-            assert ttl != null;
 
             Map<String, Integer> res = U.newHashMap(cacheNames.size());
 
@@ -96,4 +94,4 @@ public class VisorCacheLoadTask extends
             return S.toString(VisorCachesLoadJob.class, this);
         }
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheLoadTaskArg.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheLoadTaskArg.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheLoadTaskArg.java
new file mode 100644
index 0000000..831446a
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheLoadTaskArg.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.cache;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Set;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Argument for task returns cache load results.
+ */
+public class VisorCacheLoadTaskArg extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Cache names to load data. */
+    private Set<String> cacheNames;
+
+    /** Duration a Cache Entry should exist be before it expires after being modified. */
+    private long ttl;
+
+    /** Optional user arguments to be passed into CacheStore.loadCache(IgniteBiInClosure, Object...) method. */
+    private Object[] ldrArgs;
+
+    /**
+     * Default constructor.
+     */
+    public VisorCacheLoadTaskArg() {
+        // No-op.
+    }
+
+    /**
+     * @param cacheNames Cache names to load data.
+     * @param ttl Duration a Cache Entry should exist be before it expires after being modified.
+     * @param ldrArgs Optional user arguments to be passed into CacheStore.loadCache(IgniteBiInClosure, Object...) method.
+     */
+    public VisorCacheLoadTaskArg(Set<String> cacheNames, long ttl, Object[] ldrArgs) {
+        this.cacheNames = cacheNames;
+        this.ttl = ttl;
+        this.ldrArgs = ldrArgs;
+    }
+
+    /**
+     * @return Cache names to load data.
+     */
+    public Set<String> getCacheNames() {
+        return cacheNames;
+    }
+
+    /**
+     * @return Duration a Cache Entry should exist be before it expires after being modified.
+     */
+    public long getTtl() {
+        return ttl;
+    }
+
+    /**
+     * @return Optional user arguments to be passed into CacheStore.loadCache(IgniteBiInClosure, Object...) method.
+     */
+    public Object[] getLdrArgs() {
+        return ldrArgs;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeCollection(out, cacheNames);
+        out.writeLong(ttl);
+        U.writeArray(out, ldrArgs);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        cacheNames = U.readSet(in);
+        ttl = in.readLong();
+        ldrArgs = U.readArray(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorCacheLoadTaskArg.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetadataTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetadataTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetadataTask.java
index 6ba783c..598c8cf 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetadataTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetadataTask.java
@@ -34,7 +34,7 @@ import static org.apache.ignite.internal.visor.util.VisorTaskUtils.escapeName;
  * Task to get cache SQL metadata.
  */
 @GridInternal
-public class VisorCacheMetadataTask extends VisorOneNodeTask<String, GridCacheSqlMetadata> {
+public class VisorCacheMetadataTask extends VisorOneNodeTask<String, VisorCacheSqlMetadata> {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -46,7 +46,7 @@ public class VisorCacheMetadataTask extends VisorOneNodeTask<String, GridCacheSq
     /**
      * Job to get cache SQL metadata.
      */
-    private static class VisorCacheMetadataJob extends VisorJob<String, GridCacheSqlMetadata> {
+    private static class VisorCacheMetadataJob extends VisorJob<String, VisorCacheSqlMetadata> {
         /** */
         private static final long serialVersionUID = 0L;
 
@@ -59,12 +59,18 @@ public class VisorCacheMetadataTask extends VisorOneNodeTask<String, GridCacheSq
         }
 
         /** {@inheritDoc} */
-        @Override protected GridCacheSqlMetadata run(String cacheName) {
+        @Override protected VisorCacheSqlMetadata run(String cacheName) {
             try {
                 IgniteInternalCache<Object, Object> cache = ignite.cachex(cacheName);
 
-                if (cache != null)
-                    return F.first(cache.context().queries().sqlMetadata());
+                if (cache != null) {
+                    GridCacheSqlMetadata meta = F.first(cache.context().queries().sqlMetadata());
+
+                    if (meta != null)
+                        return new VisorCacheSqlMetadata(meta);
+
+                    return null;
+                }
 
                 throw new IgniteException("Cache not found: " + escapeName(cacheName));
             }
@@ -78,4 +84,4 @@ public class VisorCacheMetadataTask extends VisorOneNodeTask<String, GridCacheSq
             return S.toString(VisorCacheMetadataJob.class, this);
         }
     }
-}
\ No newline at end of file
+}


[02/11] ignite git commit: IGNITE-4988 Cleanup and refactor VisorXxx tasks and DTO for ignite-2.0

Posted by ak...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheCommand.scala
----------------------------------------------------------------------
diff --git a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheCommand.scala b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheCommand.scala
index 6d49a3b..3fd9555 100755
--- a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheCommand.scala
+++ b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheCommand.scala
@@ -17,8 +17,7 @@
 
 package org.apache.ignite.visor.commands.cache
 
-import java.lang.{Boolean => JavaBoolean}
-import java.util.{Collection => JavaCollection, Collections, UUID}
+import java.util.{Collection => JavaCollection, List => JavaList, Collections, UUID}
 
 import org.apache.ignite._
 import org.apache.ignite.cluster.ClusterNode
@@ -26,7 +25,6 @@ import org.apache.ignite.internal.util.lang.{GridFunc => F}
 import org.apache.ignite.internal.util.typedef.X
 import org.apache.ignite.internal.visor.cache._
 import org.apache.ignite.internal.visor.util.VisorTaskUtils._
-import org.apache.ignite.lang.IgniteBiTuple
 import org.apache.ignite.visor.VisorTag
 import org.apache.ignite.visor.commands.cache.VisorCacheCommand._
 import org.apache.ignite.visor.commands.common.VisorTextTable
@@ -270,7 +268,7 @@ class VisorCacheCommand {
                     if (hasArgFlag("scan", argLst))
                         VisorCacheScanCommand().scan(argLst, node)
                     else {
-                        if (aggrData.nonEmpty && !aggrData.exists(cache => F.eq(cache.name(), name) && cache.system())) {
+                        if (aggrData.nonEmpty && !aggrData.exists(cache => F.eq(cache.getName, name) && cache.isSystem)) {
                             if (hasArgFlag("clear", argLst))
                                 VisorCacheClearCommand().clear(argLst, node)
                             else if (hasArgFlag("stop", argLst))
@@ -323,39 +321,39 @@ class VisorCacheCommand {
             sortAggregatedData(aggrData, sortType.getOrElse("cn"), reversed).foreach(
                 ad => {
                     // Add cache host as visor variable.
-                    registerCacheName(ad.name())
+                    registerCacheName(ad.getName)
 
                     sumT += (
-                        mkCacheName(ad.name()),
-                        ad.mode(),
-                        ad.nodes.size(),
+                        mkCacheName(ad.getName),
+                        ad.getMode,
+                        ad.getNodes.size(),
                         (
-                            "min: " + (ad.minimumHeapSize() + ad.minimumOffHeapSize()) +
-                                " (" + ad.minimumHeapSize() + " / " + ad.minimumOffHeapSize() + ")",
-                            "avg: " + formatDouble(ad.averageHeapSize() + ad.averageOffHeapSize()) +
-                                " (" + formatDouble(ad.averageHeapSize()) + " / " + formatDouble(ad.averageOffHeapSize()) + ")",
-                            "max: " + (ad.maximumHeapSize() + ad.maximumOffHeapSize()) +
-                                " (" + ad.maximumHeapSize() + " / " + ad.maximumOffHeapSize() + ")"
+                            "min: " + (ad.getMinimumHeapSize + ad.getMinimumOffHeapSize) +
+                                " (" + ad.getMinimumHeapSize + " / " + ad.getMinimumOffHeapSize + ")",
+                            "avg: " + formatDouble(ad.getAverageHeapSize + ad.getAverageOffHeapSize) +
+                                " (" + formatDouble(ad.getAverageHeapSize) + " / " + formatDouble(ad.getAverageOffHeapSize) + ")",
+                            "max: " + (ad.getMaximumHeapSize + ad.getMaximumOffHeapSize) +
+                                " (" + ad.getMaximumHeapSize + " / " + ad.getMaximumOffHeapSize + ")"
                             ),
                         (
-                            "min: " + ad.minimumHits,
-                            "avg: " + formatDouble(ad.averageHits),
-                            "max: " + ad.maximumHits
+                            "min: " + ad.getMinimumHits,
+                            "avg: " + formatDouble(ad.getAverageHits),
+                            "max: " + ad.getMaximumHits
                             ),
                         (
-                            "min: " + ad.minimumMisses,
-                            "avg: " + formatDouble(ad.averageMisses),
-                            "max: " + ad.maximumMisses
+                            "min: " + ad.getMinimumMisses,
+                            "avg: " + formatDouble(ad.getAverageMisses),
+                            "max: " + ad.getMaximumMisses
                             ),
                         (
-                            "min: " + ad.minimumReads,
-                            "avg: " + formatDouble(ad.averageReads),
-                            "max: " + ad.maximumReads
+                            "min: " + ad.getMinimumReads,
+                            "avg: " + formatDouble(ad.getAverageReads),
+                            "max: " + ad.getMaximumReads
                             ),
                         (
-                            "min: " + ad.minimumWrites,
-                            "avg: " + formatDouble(ad.averageWrites),
-                            "max: " + ad.maximumWrites
+                            "min: " + ad.getMinimumWrites,
+                            "avg: " + formatDouble(ad.getAverageWrites),
+                            "max: " + ad.getMaximumWrites
                             )
                         )
                 }
@@ -365,11 +363,11 @@ class VisorCacheCommand {
 
             if (all) {
                 val sorted = aggrData.sortWith((k1, k2) => {
-                    if (k1.name() == null)
+                    if (k1.getName == null)
                         true
-                    else if (k2.name() == null)
+                    else if (k2.getName == null)
                         false
-                    else k1.name().compareTo(k2.name()) < 0
+                    else k1.getName.compareTo(k2.getName) < 0
                 })
 
                 val gCfg = node.map(config).collect {
@@ -377,23 +375,23 @@ class VisorCacheCommand {
                 }
 
                 sorted.foreach(ad => {
-                    val cacheNameVar = mkCacheName(ad.name())
+                    val cacheNameVar = mkCacheName(ad.getName)
 
                     println("\nCache '" + cacheNameVar + "':")
 
-                    val m = ad.metrics()
+                    val m = ad.getMetrics
 
                     val csT = VisorTextTable()
 
                     csT += ("Name(@)", cacheNameVar)
                     csT += ("Nodes", m.size())
-                    csT += ("Total size Min/Avg/Max", (ad.minimumHeapSize() + ad.minimumOffHeapSize()) + " / " +
-                        formatDouble(ad.averageHeapSize() + ad.averageOffHeapSize()) + " / " +
-                        (ad.maximumHeapSize() + ad.maximumOffHeapSize()))
-                    csT += ("  Heap size Min/Avg/Max", ad.minimumHeapSize() + " / " +
-                        formatDouble(ad.averageHeapSize()) + " / " + ad.maximumHeapSize())
-                    csT += ("  Off-heap size Min/Avg/Max", ad.minimumOffHeapSize() + " / " +
-                        formatDouble(ad.averageOffHeapSize()) + " / " + ad.maximumOffHeapSize())
+                    csT += ("Total size Min/Avg/Max", (ad.getMinimumHeapSize + ad.getMinimumOffHeapSize) + " / " +
+                        formatDouble(ad.getAverageHeapSize + ad.getAverageOffHeapSize) + " / " +
+                        (ad.getMaximumHeapSize + ad.getMaximumOffHeapSize))
+                    csT += ("  Heap size Min/Avg/Max", ad.getMinimumHeapSize + " / " +
+                        formatDouble(ad.getAverageHeapSize) + " / " + ad.getMaximumHeapSize)
+                    csT += ("  Off-heap size Min/Avg/Max", ad.getMinimumOffHeapSize + " / " +
+                        formatDouble(ad.getAverageOffHeapSize) + " / " + ad.getMaximumOffHeapSize)
 
                     val ciT = VisorTextTable()
 
@@ -410,16 +408,16 @@ class VisorCacheCommand {
                             formatDouble(nm.getCurrentCpuLoad * 100d) + " %",
                             X.timeSpan2HMSM(nm.getUpTime),
                             (
-                                "Total: " + (cm.keySize() + cm.offHeapEntriesCount()),
-                                "  Heap: " + cm.keySize(),
+                                "Total: " + (cm.getKeySize + cm.offHeapEntriesCount()),
+                                "  Heap: " + cm.getKeySize,
                                 "  Off-Heap: " + cm.offHeapEntriesCount(),
-                                "  Off-Heap Memory: " + formatMemory(cm.offHeapAllocatedSize())
+                                "  Off-Heap Memory: " + formatMemory(cm.getOffHeapAllocatedSize)
                             ),
                             (
-                                "Hi: " + cm.hits(),
-                                "Mi: " + cm.misses(),
-                                "Rd: " + cm.reads(),
-                                "Wr: " + cm.writes()
+                                "Hi: " + cm.getHits,
+                                "Mi: " + cm.getMisses,
+                                "Rd: " + cm.getReads,
+                                "Wr: " + cm.getWrites
                             )
                         )
                     }
@@ -434,19 +432,19 @@ class VisorCacheCommand {
                     // Print footnote.
                     println("'Hi' - Number of cache hits.")
                     println("'Mi' - Number of cache misses.")
-                    println("'Rd' - Number of cache reads.")
+                    println("'Rd' - number of cache reads.")
                     println("'Wr' - Number of cache writes.")
 
                     // Print metrics.
                     nl()
                     println("Aggregated queries metrics:")
-                    println("  Minimum execution time: " + X.timeSpan2HMSM(ad.minimumQueryTime()))
-                    println("  Maximum execution time: " + X.timeSpan2HMSM(ad.maximumQueryTime))
-                    println("  Average execution time: " + X.timeSpan2HMSM(ad.averageQueryTime.toLong))
-                    println("  Total number of executions: " + ad.execsQuery)
-                    println("  Total number of failures:   " + ad.failsQuery)
+                    println("  Minimum execution time: " + X.timeSpan2HMSM(ad.getMinimumQueryTime))
+                    println("  Maximum execution time: " + X.timeSpan2HMSM(ad.getMaximumQueryTime))
+                    println("  Average execution time: " + X.timeSpan2HMSM(ad.getAverageQueryTime.toLong))
+                    println("  Total number of executions: " + ad.getQueryExecutions)
+                    println("  Total number of failures:   " + ad.getQueryFailures)
 
-                    gCfg.foreach(ccfgs => ccfgs.find(ccfg => F.eq(ccfg.name(), ad.name()))
+                    gCfg.foreach(ccfgs => ccfgs.find(ccfg => F.eq(ccfg.getName, ad.getName))
                         .foreach(ccfg => {
                             nl()
 
@@ -509,9 +507,9 @@ class VisorCacheCommand {
         assert(node != null)
 
         try {
-            val caches: JavaCollection[String] = name.fold(Collections.emptyList[String]())(Collections.singletonList)
+            val caches: JavaList[String] = name.fold(Collections.emptyList[String]())(Collections.singletonList)
 
-            val arg = new IgniteBiTuple(JavaBoolean.valueOf(systemCaches), caches)
+            val arg = new VisorCacheMetricsCollectorTaskArg(systemCaches, caches)
 
             node match {
                 case Some(n) => executeOne(n.id(), classOf[VisorCacheMetricsCollectorTask], arg).toList
@@ -565,10 +563,10 @@ class VisorCacheCommand {
         assert(arg != null)
 
         val sorted = arg.trim match {
-            case "hi" => data.toSeq.sortBy(_._2.hits)
-            case "mi" => data.toSeq.sortBy(_._2.misses)
-            case "rd" => data.toSeq.sortBy(_._2.reads)
-            case "wr" => data.toSeq.sortBy(_._2.writes)
+            case "hi" => data.toSeq.sortBy(_._2.getHits)
+            case "mi" => data.toSeq.sortBy(_._2.getMisses)
+            case "rd" => data.toSeq.sortBy(_._2.getReads)
+            case "wr" => data.toSeq.sortBy(_._2.getWrites)
             case "cn" => data.toSeq.sortBy(_._1)
 
             case _ =>
@@ -592,12 +590,12 @@ class VisorCacheCommand {
         List[VisorCacheAggregatedMetrics] = {
 
         val sorted = arg.trim match {
-            case "hi" => data.toList.sortBy(_.averageHits)
-            case "mi" => data.toList.sortBy(_.averageMisses)
-            case "rd" => data.toList.sortBy(_.averageReads)
-            case "wr" => data.toList.sortBy(_.averageWrites)
+            case "hi" => data.toList.sortBy(_.getAverageHits)
+            case "mi" => data.toList.sortBy(_.getAverageMisses)
+            case "rd" => data.toList.sortBy(_.getAverageReads)
+            case "wr" => data.toList.sortBy(_.getAverageWrites)
             case "cn" => data.toList.sortWith((x, y) =>
-                x.name() == null || (y.name() != null && x.name().toLowerCase < y.name().toLowerCase))
+                x.getName == null || (y.getName != null && x.getName.toLowerCase < y.getName.toLowerCase))
 
             case _ =>
                 assert(false, "Unknown sorting type: " + arg)
@@ -639,19 +637,19 @@ class VisorCacheCommand {
             val ad = sortedAggrData(i)
 
             // Add cache host as visor variable.
-            registerCacheName(ad.name())
+            registerCacheName(ad.getName)
 
             sumT += (
                 i,
-                mkCacheName(ad.name()),
-                ad.mode(),
+                mkCacheName(ad.getName),
+                ad.getMode,
                 (
-                    "min: " + (ad.minimumHeapSize() + ad.minimumOffHeapSize()) +
-                        " (" + ad.minimumHeapSize() + " / " + ad.minimumOffHeapSize() + ")",
-                    "avg: " + formatDouble(ad.averageHeapSize() + ad.averageOffHeapSize()) +
-                        " (" + formatDouble(ad.averageHeapSize()) + " / " + formatDouble(ad.averageOffHeapSize()) + ")",
-                    "max: " + (ad.maximumHeapSize() + ad.maximumOffHeapSize()) +
-                        " (" + ad.maximumHeapSize() + " / " + ad.maximumOffHeapSize() + ")"
+                    "min: " + (ad.getMinimumHeapSize + ad.getMinimumOffHeapSize) +
+                        " (" + ad.getMinimumHeapSize + " / " + ad.getMinimumOffHeapSize + ")",
+                    "avg: " + formatDouble(ad.getAverageHeapSize + ad.getAverageOffHeapSize) +
+                        " (" + formatDouble(ad.getAverageHeapSize) + " / " + formatDouble(ad.getAverageOffHeapSize) + ")",
+                    "max: " + (ad.getMaximumHeapSize + ad.getMaximumOffHeapSize) +
+                        " (" + ad.getMaximumHeapSize + " / " + ad.getMaximumOffHeapSize + ")"
                 ))
         })
 
@@ -663,7 +661,7 @@ class VisorCacheCommand {
             None
         else {
             try
-                Some(sortedAggrData(a.toInt).name())
+                Some(sortedAggrData(a.toInt).getName)
             catch {
                 case e: Throwable =>
                     warn("Invalid selection: " + a)
@@ -828,94 +826,87 @@ object VisorCacheCommand {
      * @param cfg Config to show information.
      */
     private[commands] def printCacheConfiguration(title: String, cfg: VisorCacheConfiguration) {
-        val affinityCfg = cfg.affinityConfiguration()
-        val nearCfg = cfg.nearConfiguration()
-        val rebalanceCfg = cfg.rebalanceConfiguration()
-        val evictCfg = cfg.evictConfiguration()
-        val defaultCfg = cfg.defaultConfiguration()
-        val storeCfg = cfg.storeConfiguration()
-        val queryCfg = cfg.queryConfiguration()
+        val affinityCfg = cfg.getAffinityConfiguration
+        val nearCfg = cfg.getNearConfiguration
+        val rebalanceCfg = cfg.getRebalanceConfiguration
+        val evictCfg = cfg.getEvictionConfiguration
+        val storeCfg = cfg.getStoreConfiguration
+        val queryCfg = cfg.getQueryConfiguration
 
         val cacheT = VisorTextTable()
 
         cacheT #= ("Name", "Value")
 
-        cacheT += ("Mode", cfg.mode)
-        cacheT += ("Atomicity Mode", safe(cfg.atomicityMode))
-        cacheT += ("Atomic Write Ordering Mode", safe(cfg.atomicWriteOrderMode))
-        cacheT += ("Statistic Enabled", bool2Str(cfg.statisticsEnabled()))
-        cacheT += ("Management Enabled", bool2Str(cfg.managementEnabled()))
-
-        cacheT += ("Time To Live Eager Flag", cfg.eagerTtl)
-
-        cacheT += ("Write Synchronization Mode", safe(cfg.writeSynchronizationMode))
-        cacheT += ("Invalidate", bool2Str(cfg.invalidate()))
-        cacheT += ("Start Size", cfg.startSize())
-
-        cacheT += ("Affinity Function", safe(affinityCfg.function()))
-        cacheT += ("Affinity Backups", affinityCfg.partitionedBackups())
-        cacheT += ("Affinity Partitions", safe(affinityCfg.partitions()))
-        cacheT += ("Affinity Exclude Neighbors", safe(affinityCfg.excludeNeighbors()))
-        cacheT += ("Affinity Mapper", safe(affinityCfg.mapper()))
-
-        cacheT += ("Rebalance Mode", rebalanceCfg.mode())
-        cacheT += ("Rebalance Batch Size", rebalanceCfg.batchSize())
-        cacheT += ("Rebalance Thread Pool size", rebalanceCfg.threadPoolSize())
-        cacheT += ("Rebalance Timeout", rebalanceCfg.timeout())
-        cacheT += ("Rebalance Delay", rebalanceCfg.partitionedDelay())
-        cacheT += ("Time Between Rebalance Messages", rebalanceCfg.throttle())
-
-        cacheT += ("Eviction Policy Enabled", bool2Str(evictCfg.policy() != null))
-        cacheT += ("Eviction Policy", safe(evictCfg.policy()))
-        cacheT += ("Eviction Policy Max Size", safe(evictCfg.policyMaxSize()))
-        cacheT += ("Eviction Filter", safe(evictCfg.filter()))
-
-        cacheT += ("Near Cache Enabled", bool2Str(nearCfg.nearEnabled()))
-        cacheT += ("Near Start Size", nearCfg.nearStartSize())
-        cacheT += ("Near Eviction Policy", safe(nearCfg.nearEvictPolicy()))
-        cacheT += ("Near Eviction Policy Max Size", safe(nearCfg.nearEvictMaxSize()))
-
-        cacheT += ("Default Lock Timeout", defaultCfg.txLockTimeout())
-        cacheT += ("Metadata type count", cfg.typeMeta().size())
-        cacheT += ("Cache Interceptor", safe(cfg.interceptor()))
-
-        cacheT += ("Store Enabled", bool2Str(storeCfg.enabled()))
-        cacheT += ("Store Class", safe(storeCfg.store()))
-        cacheT += ("Store Factory Class", storeCfg.storeFactory())
-        cacheT += ("Store Keep Binary", storeCfg.storeKeepBinary())
-        cacheT += ("Store Read Through", bool2Str(storeCfg.readThrough()))
-        cacheT += ("Store Write Through", bool2Str(storeCfg.writeThrough()))
-
-        cacheT += ("Write-Behind Enabled", bool2Str(storeCfg.enabled()))
-        cacheT += ("Write-Behind Flush Size", storeCfg.flushSize())
-        cacheT += ("Write-Behind Frequency", storeCfg.flushFrequency())
-        cacheT += ("Write-Behind Flush Threads Count", storeCfg.flushThreadCount())
-        cacheT += ("Write-Behind Batch Size", storeCfg.batchSize())
-
-        cacheT += ("Concurrent Asynchronous Operations Number", cfg.maxConcurrentAsyncOperations())
-        cacheT += ("Off-Heap Size", cfg.offsetHeapMaxMemory() match {
-            case 0 => "UNLIMITED"
-            case size if size < 0 => NA
-            case size => size
-        })
-
-        cacheT += ("Loader Factory Class Name", safe(cfg.loaderFactory()))
-        cacheT += ("Writer Factory Class Name", safe(cfg.writerFactory()))
-        cacheT += ("Expiry Policy Factory Class Name", safe(cfg.expiryPolicyFactory()))
-
-        cacheT +=("Query Execution Time Threshold", queryCfg.longQueryWarningTimeout())
-        cacheT +=("Query Schema Name", queryCfg.sqlSchema())
-        cacheT +=("Query Escaped Names", bool2Str(queryCfg.sqlEscapeAll()))
-        cacheT +=("Query Onheap Cache Size", queryCfg.sqlOnheapRowCacheSize())
-
-        val sqlFxs = queryCfg.sqlFunctionClasses()
+        cacheT += ("Mode", cfg.getMode)
+        cacheT += ("Atomicity Mode", safe(cfg.getAtomicityMode))
+        cacheT += ("Atomic Write Ordering Mode", safe(cfg.getAtomicWriteOrderMode))
+        cacheT += ("Statistic Enabled", bool2Str(cfg.isStatisticsEnabled))
+        cacheT += ("Management Enabled", bool2Str(cfg.isManagementEnabled))
+
+        cacheT += ("Time To Live Eager Flag", cfg.isEagerTtl)
+
+        cacheT += ("Write Synchronization Mode", safe(cfg.getWriteSynchronizationMode))
+        cacheT += ("Invalidate", bool2Str(cfg.isInvalidate))
+        cacheT += ("Start Size", cfg.getStartSize)
+
+        cacheT += ("Affinity Function", safe(affinityCfg.getFunction))
+        cacheT += ("Affinity Backups", affinityCfg.getPartitionedBackups)
+        cacheT += ("Affinity Partitions", safe(affinityCfg.getPartitions))
+        cacheT += ("Affinity Exclude Neighbors", safe(affinityCfg.isExcludeNeighbors))
+        cacheT += ("Affinity Mapper", safe(affinityCfg.getMapper))
+
+        cacheT += ("Rebalance Mode", rebalanceCfg.getMode)
+        cacheT += ("Rebalance Batch Size", rebalanceCfg.getBatchSize)
+        cacheT += ("Rebalance Timeout", rebalanceCfg.getTimeout)
+        cacheT += ("Rebalance Delay", rebalanceCfg.getPartitionedDelay)
+        cacheT += ("Time Between Rebalance Messages", rebalanceCfg.getThrottle)
+
+        cacheT += ("Eviction Policy Enabled", bool2Str(evictCfg.getPolicy != null))
+        cacheT += ("Eviction Policy", safe(evictCfg.getPolicy))
+        cacheT += ("Eviction Policy Max Size", safe(evictCfg.getPolicyMaxSize))
+        cacheT += ("Eviction Filter", safe(evictCfg.getFilter))
+
+        cacheT += ("Near Cache Enabled", bool2Str(nearCfg.isNearEnabled))
+        cacheT += ("Near Start Size", nearCfg.getNearStartSize)
+        cacheT += ("Near Eviction Policy", safe(nearCfg.getNearEvictPolicy))
+        cacheT += ("Near Eviction Policy Max Size", safe(nearCfg.getNearEvictMaxSize))
+
+        cacheT += ("Default Lock Timeout", cfg.getDefaultLockTimeout)
+        cacheT += ("Metadata type count", cfg.getJdbcTypes.size())
+        cacheT += ("Cache Interceptor", safe(cfg.getInterceptor))
+
+        cacheT += ("Store Enabled", bool2Str(storeCfg.isEnabled))
+        cacheT += ("Store Class", safe(storeCfg.getStore))
+        cacheT += ("Store Factory Class", storeCfg.getStoreFactory)
+        cacheT += ("Store Keep Binary", storeCfg.isStoreKeepBinary)
+        cacheT += ("Store Read Through", bool2Str(storeCfg.isReadThrough))
+        cacheT += ("Store Write Through", bool2Str(storeCfg.isWriteThrough))
+
+        cacheT += ("Write-Behind Enabled", bool2Str(storeCfg.isEnabled))
+        cacheT += ("Write-Behind Flush Size", storeCfg.getFlushSize)
+        cacheT += ("Write-Behind Frequency", storeCfg.getFlushFrequency)
+        cacheT += ("Write-Behind Flush Threads Count", storeCfg.getFlushThreadCount)
+        cacheT += ("Write-Behind Batch Size", storeCfg.getBatchSize)
+
+        cacheT += ("Concurrent Asynchronous Operations Number", cfg.getMaxConcurrentAsyncOperations)
+
+        cacheT += ("Loader Factory Class Name", safe(cfg.getLoaderFactory))
+        cacheT += ("Writer Factory Class Name", safe(cfg.getWriterFactory))
+        cacheT += ("Expiry Policy Factory Class Name", safe(cfg.getExpiryPolicyFactory))
+
+        cacheT +=("Query Execution Time Threshold", queryCfg.getLongQueryWarningTimeout)
+        cacheT +=("Query Schema Name", queryCfg.getSqlSchema)
+        cacheT +=("Query Escaped Names", bool2Str(queryCfg.isSqlEscapeAll))
+        cacheT +=("Query Onheap Cache Size", queryCfg.getSqlOnheapRowCacheSize)
+
+        val sqlFxs = queryCfg.getSqlFunctionClasses
 
         val hasSqlFxs = sqlFxs != null && sqlFxs.nonEmpty
 
         if (!hasSqlFxs)
             cacheT +=("Query SQL functions", NA)
 
-        val indexedTypes = queryCfg.indexedTypes()
+        val indexedTypes = queryCfg.getIndexedTypes
 
         val hasIndexedTypes = indexedTypes != null && indexedTypes.nonEmpty
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheScanCommand.scala
----------------------------------------------------------------------
diff --git a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheScanCommand.scala b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheScanCommand.scala
index 9668072..a6bec15 100644
--- a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheScanCommand.scala
+++ b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheScanCommand.scala
@@ -140,11 +140,11 @@ class VisorCacheScanCommand {
             try
                 executeRandom(groupForDataNode(node, cacheName),
                     classOf[VisorQueryTask], new VisorQueryArg(cacheName, null, false, false, false, pageSize)) match {
-                    case x if x.get1() != null =>
-                        error(x.get1())
+                    case x if x.getError != null =>
+                        error(x.getError)
 
                         return
-                    case x => x.get2()
+                    case x => x.getResult
                 }
             catch {
                 case e: ClusterGroupEmptyException =>
@@ -157,7 +157,7 @@ class VisorCacheScanCommand {
                     return
             }
 
-        if (firstPage.rows.isEmpty) {
+        if (firstPage.getRows.isEmpty) {
             println(s"Cache: ${escapeName(cacheName)} is empty")
 
             return
@@ -172,19 +172,19 @@ class VisorCacheScanCommand {
 
             t #= ("Key Class", "Key", "Value Class", "Value")
 
-            nextPage.rows.foreach(r => t += (r(0), r(1), r(2), r(3)))
+            nextPage.getRows.foreach(r => t += (r(0), r(1), r(2), r(3)))
 
             t.render()
         }
 
         render()
 
-        while (nextPage.hasMore) {
+        while (nextPage.isHasMore) {
             ask("\nFetch more objects (y/n) [y]:", "y") match {
                 case "y" | "Y" =>
                     try {
-                        nextPage = executeOne(firstPage.responseNodeId(), classOf[VisorQueryNextPageTask],
-                            new IgniteBiTuple[String, Integer](firstPage.queryId(), pageSize))
+                        nextPage = executeOne(firstPage.getResponseNodeId, classOf[VisorQueryNextPageTask],
+                            new VisorQueryNextPageTaskArg(firstPage.getQueryId, pageSize))
 
                         render()
                     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/config/VisorConfigurationCommand.scala
----------------------------------------------------------------------
diff --git a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/config/VisorConfigurationCommand.scala b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/config/VisorConfigurationCommand.scala
index f7d83a3..75c34ab 100644
--- a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/config/VisorConfigurationCommand.scala
+++ b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/config/VisorConfigurationCommand.scala
@@ -29,7 +29,7 @@ import org.apache.ignite.visor.visor._
 import java.lang.System._
 import java.util.UUID
 
-import org.apache.ignite.internal.visor.node.{VisorGridConfiguration, VisorNodeConfigurationCollectorTask}
+import org.apache.ignite.internal.visor.node.{VisorSpiDescription, VisorGridConfiguration, VisorNodeConfigurationCollectorTask}
 import org.apache.ignite.internal.visor.util.VisorTaskUtils._
 
 import scala.collection.JavaConversions._
@@ -139,7 +139,7 @@ class VisorConfigurationCommand extends VisorConsoleCommand {
             cacheConfigurations(nid).foreach(ccfg => {
                 println()
 
-                printCacheConfiguration(s"Cache '${escapeName(ccfg.name())}':", ccfg)
+                printCacheConfiguration(s"Cache '${escapeName(ccfg.getName)}':", ccfg)
             })
         }
         catch {
@@ -157,45 +157,46 @@ class VisorConfigurationCommand extends VisorConsoleCommand {
 
         val cmnT = VisorTextTable()
 
-        val basic = cfg.basic()
-
-        cmnT += ("Ignite instance name", escapeName(basic.igniteInstanceName()))
-        cmnT += ("Ignite home", safe(basic.ggHome()))
-        cmnT += ("Localhost", safe(basic.localHost()))
-        cmnT += ("Node ID", safe(basic.nodeId()))
-        cmnT += ("Marshaller", basic.marshaller())
-        cmnT += ("Deployment mode", safe(basic.deploymentMode()))
-        cmnT += ("ClientMode", javaBoolToStr(basic.clientMode()))
-        cmnT += ("Daemon", bool2Str(basic.daemon()))
-        cmnT += ("Remote JMX", bool2Str(basic.jmxRemote()))
-        cmnT += ("Restart", bool2Str(basic.restart()))
-        cmnT += ("Network timeout", basic.networkTimeout() + "ms")
-        cmnT += ("Grid logger", safe(basic.logger()))
-        cmnT += ("Discovery startup delay", basic.discoStartupDelay() + "ms")
-        cmnT += ("MBean server", safe(basic.mBeanServer()))
-        cmnT += ("ASCII logo disabled", bool2Str(basic.noAscii()))
-        cmnT += ("Discovery order not required", bool2Str(basic.noDiscoOrder()))
-        cmnT += ("Shutdown hook disabled", bool2Str(basic.noShutdownHook()))
-        cmnT += ("Program name", safe(basic. programName()))
-        cmnT += ("Quiet mode", bool2Str(basic.quiet()))
-        cmnT += ("Success filename", safe(basic.successFile()))
-        cmnT += ("Update notification", bool2Str(basic.updateNotifier()))
-        cmnT += ("Include properties", safe(cfg.includeProperties()))
-
-        val atomic = cfg.atomic()
-
-        cmnT += ("Atomic Cache Mode", atomic.cacheMode())
-        cmnT += ("Atomic Sequence Reservation Size", atomic.atomicSequenceReserveSize())
-        cmnT += ("Atomic Number Of Backup Nodes", atomic.backups())
-
-        val trn = cfg.transaction()
-
-        cmnT += ("Transaction Concurrency", trn.defaultTxConcurrency())
-        cmnT += ("Transaction Isolation", trn.defaultTxIsolation())
-        cmnT += ("Transaction Timeout", trn.defaultTxTimeout() + "ms")
-        cmnT += ("Transaction Log Cleanup Delay", trn.pessimisticTxLogLinger() + "ms")
+        val basic = cfg.getBasic
+
+        cmnT += ("Grid name", escapeName(basic.getIgniteInstanceName))
+        cmnT += ("Ignite home", safe(basic.getGgHome))
+        cmnT += ("Localhost", safe(basic.getLocalHost))
+        cmnT += ("Node ID", safe(basic.getNodeId))
+        cmnT += ("Marshaller", basic.getMarshaller)
+        cmnT += ("Deployment mode", safe(basic.getDeploymentMode))
+        cmnT += ("ClientMode", javaBoolToStr(basic.isClientMode))
+        cmnT += ("Daemon", bool2Str(basic.isDaemon))
+        cmnT += ("Remote JMX enabled", bool2Str(basic.isJmxRemote))
+        cmnT += ("Node restart enabled", bool2Str(basic.isRestart))
+        cmnT += ("Network timeout", basic.getNetworkTimeout + "ms")
+        cmnT += ("Grid logger", safe(basic.getLogger))
+        cmnT += ("Discovery startup delay", basic.getDiscoStartupDelay + "ms")
+        cmnT += ("MBean server", safe(basic.getMBeanServer))
+        cmnT += ("ASCII logo disabled", bool2Str(basic.isNoAscii))
+        cmnT += ("Discovery order not required", bool2Str(basic.isNoDiscoOrder))
+        cmnT += ("Shutdown hook disabled", bool2Str(basic.isNoShutdownHook))
+        cmnT += ("Program name", safe(basic.getProgramName))
+        cmnT += ("Quiet mode", bool2Str(basic.isQuiet))
+        cmnT += ("Success filename", safe(basic.getSuccessFile))
+        cmnT += ("Update notification enabled", bool2Str(basic.isUpdateNotifier))
+        cmnT += ("Include properties", safe(cfg.getIncludeProperties))
+
+        val atomic = cfg.getAtomic
+
+        cmnT += ("Atomic Cache Mode", atomic.getCacheMode)
+        cmnT += ("Atomic Sequence Reservation Size", atomic.getAtomicSequenceReserveSize)
+        cmnT += ("Atomic Number Of Backup Nodes", atomic.getBackups)
+
+        val trn = cfg.getTransaction
+
+        cmnT += ("Transaction Concurrency", trn.getDefaultTxConcurrency)
+        cmnT += ("Transaction Isolation", trn.getDefaultTxIsolation)
+        cmnT += ("Transaction Timeout", trn.getDefaultTxTimeout + "ms")
+        cmnT += ("Transaction Log Cleanup Delay", trn.getPessimisticTxLogLinger + "ms")
         cmnT += ("Transaction Log Size", trn.getPessimisticTxLogSize)
-        cmnT += ("Transaction Serializable Enabled", bool2Str(trn.txSerializableEnabled()))
+        cmnT += ("Transaction Manager Factory", trn.getTxManagerFactory)
+        cmnT += ("Transaction Use JTA", bool2Str(trn.isUseJtaSync))
 
         cmnT.render()
 
@@ -203,11 +204,13 @@ class VisorConfigurationCommand extends VisorConsoleCommand {
 
         val metricsT = VisorTextTable()
 
-        val expTime = cfg.metrics().expireTime()
+        val metricsCfg = cfg.getMetrics
+
+        val expTime = metricsCfg.getExpireTime
 
         metricsT += ("Metrics expire time", if (expTime != Long.MaxValue) expTime + "ms" else "<never>")
-        metricsT += ("Metrics history size", cfg.metrics().historySize())
-        metricsT += ("Metrics log frequency", cfg.metrics().loggerFrequency())
+        metricsT += ("Metrics history size", metricsCfg.getHistorySize)
+        metricsT += ("Metrics log frequency", metricsCfg.getLoggerFrequency)
 
         metricsT.render()
 
@@ -215,23 +218,25 @@ class VisorConfigurationCommand extends VisorConsoleCommand {
 
         val spisT = VisorTextTable()
 
-        def spiClass(spi: IgniteBiTuple[String, java.util.Map[String, AnyRef]]) = {
-            if (spi != null) spi.get2().getOrElse("Class Name", NA) else NA
+        def spiClass(spi: VisorSpiDescription) = {
+            if (spi != null) spi.getFieldDescriptions.getOrElse("Class Name", NA) else NA
         }
 
-        def spisClass(spis: Array[IgniteBiTuple[String, java.util.Map[String, AnyRef]]]) = {
+        def spisClass(spis: Array[VisorSpiDescription]) = {
             spis.map(spiClass).mkString("[", ", ", "]")
         }
 
-        spisT += ("Discovery", spiClass(cfg.spis().discoverySpi()))
-        spisT += ("Communication", spiClass(cfg.spis().communicationSpi()))
-        spisT += ("Event storage", spiClass(cfg.spis().eventStorageSpi()))
-        spisT += ("Collision", spiClass(cfg.spis().collisionSpi()))
-        spisT += ("Deployment", spiClass(cfg.spis().deploymentSpi()))
-        spisT += ("Checkpoints", spisClass(cfg.spis().checkpointSpis()))
-        spisT += ("Failovers", spisClass(cfg.spis().failoverSpis()))
-        spisT += ("Load balancings", spisClass(cfg.spis().loadBalancingSpis()))
-        spisT += ("Indexing", spisClass(cfg.spis().indexingSpis()))
+        val spisCfg = cfg.getSpis
+
+        spisT += ("Discovery", spiClass(spisCfg.getDiscoverySpi))
+        spisT += ("Communication", spiClass(spisCfg.getCommunicationSpi))
+        spisT += ("Event storage", spiClass(spisCfg.getEventStorageSpi))
+        spisT += ("Collision", spiClass(spisCfg.getCollisionSpi))
+        spisT += ("Deployment", spiClass(spisCfg.getDeploymentSpi))
+        spisT += ("Checkpoints", spisClass(spisCfg.getCheckpointSpis))
+        spisT += ("Failovers", spisClass(spisCfg.getFailoverSpis))
+        spisT += ("Load balancings", spisClass(spisCfg.getLoadBalancingSpis))
+        spisT += ("Indexing", spisClass(spisCfg.getIndexingSpis))
 
         spisT.render()
 
@@ -239,9 +244,11 @@ class VisorConfigurationCommand extends VisorConsoleCommand {
 
         val p2pT = VisorTextTable()
 
-        p2pT += ("Peer class loading enabled", bool2Str(cfg.p2p().p2pEnabled()))
-        p2pT += ("Missed resources cache size", cfg.p2p().p2pMissedResponseCacheSize())
-        p2pT += ("Peer-to-Peer loaded packages", safe(cfg.p2p().p2pLocalClassPathExclude()))
+        val p2pCfg = cfg.getP2p
+
+        p2pT += ("Peer class loading enabled", bool2Str(p2pCfg.isPeerClassLoadingEnabled))
+        p2pT += ("Missed resources cache size", p2pCfg.getPeerClassLoadingMissedResourcesCacheSize)
+        p2pT += ("Peer-to-Peer loaded packages", safe(p2pCfg.getPeerClassLoadingLocalClassPathExclude))
 
         p2pT.render()
 
@@ -249,7 +256,7 @@ class VisorConfigurationCommand extends VisorConsoleCommand {
 
         val lifecycleT = VisorTextTable()
 
-        lifecycleT += ("Beans", safe(cfg.lifecycle().beans()))
+        lifecycleT += ("Beans", safe(cfg.getLifecycle.getBeans))
 
         lifecycleT.render()
 
@@ -257,14 +264,15 @@ class VisorConfigurationCommand extends VisorConsoleCommand {
 
         val execSvcT = VisorTextTable()
 
-        val execCfg = cfg.executeService()
+        val execCfg = cfg.getExecutorService
 
-        execSvcT += ("Public thread pool size", safe(execCfg.publicThreadPoolSize()))
-        execSvcT += ("System thread pool size", safe(execCfg.systemThreadPoolSize()))
-        execSvcT += ("Management thread pool size", safe(execCfg.managementThreadPoolSize()))
-        execSvcT += ("IGFS thread pool size", safe(execCfg.igfsThreadPoolSize()))
-        execSvcT += ("Peer-to-Peer thread pool size", safe(execCfg.peerClassLoadingThreadPoolSize()))
-        execSvcT += ("REST thread pool size", safe(execCfg.restThreadPoolSize()))
+        execSvcT += ("Public thread pool size", safe(execCfg.getPublicThreadPoolSize))
+        execSvcT += ("System thread pool size", safe(execCfg.getSystemThreadPoolSize))
+        execSvcT += ("Management thread pool size", safe(execCfg.getManagementThreadPoolSize))
+        execSvcT += ("IGFS thread pool size", safe(execCfg.getIgfsThreadPoolSize))
+        execSvcT += ("Peer-to-Peer thread pool size", safe(execCfg.getPeerClassLoadingThreadPoolSize))
+        execSvcT += ("Rebalance Thread Pool size", execCfg.getRebalanceThreadPoolSize)
+        execSvcT += ("REST thread pool size", safe(execCfg.getRestThreadPoolSize))
 
         execSvcT.render()
 
@@ -272,11 +280,13 @@ class VisorConfigurationCommand extends VisorConsoleCommand {
 
         val segT = VisorTextTable()
 
-        segT += ("Segmentation policy", safe(cfg.segmentation().policy()))
-        segT += ("Segmentation resolvers", safe(cfg.segmentation().resolvers()))
-        segT += ("Segmentation check frequency", cfg.segmentation().checkFrequency())
-        segT += ("Wait for segmentation on start", bool2Str(cfg.segmentation().waitOnStart()))
-        segT += ("All resolvers pass required", bool2Str(cfg.segmentation().passRequired()))
+        val segmentationCfg = cfg.getSegmentation
+
+        segT += ("Segmentation policy", safe(segmentationCfg.getPolicy))
+        segT += ("Segmentation resolvers", safe(segmentationCfg.getResolvers))
+        segT += ("Segmentation check frequency", segmentationCfg.getCheckFrequency)
+        segT += ("Wait for segmentation on start", bool2Str(segmentationCfg.isWaitOnStart))
+        segT += ("All resolvers pass required", bool2Str(segmentationCfg.isAllSegmentationResolversPassRequired))
 
         segT.render()
 
@@ -284,7 +294,7 @@ class VisorConfigurationCommand extends VisorConsoleCommand {
 
         val evtsT = VisorTextTable()
 
-        val inclEvtTypes = Option(cfg.includeEventTypes()).fold(NA)(et => arr2Str(et.map(U.gridEventName)))
+        val inclEvtTypes = Option(cfg.getIncludeEventTypes).fold(NA)(et => arr2Str(et.map(U.gridEventName)))
 
         evtsT += ("Included event types", inclEvtTypes)
 
@@ -294,32 +304,33 @@ class VisorConfigurationCommand extends VisorConsoleCommand {
 
         val restT = VisorTextTable()
 
-        restT += ("REST enabled", bool2Str(cfg.rest().restEnabled()))
-        restT += ("Rest accessible folders", safe(cfg.rest().accessibleFolders()))
-        restT += ("Jetty path", safe(cfg.rest().jettyPath()))
-        restT += ("Jetty host", safe(cfg.rest().jettyHost()))
-        restT += ("Jetty port", safe(cfg.rest().jettyPort()))
-        restT += ("Tcp ssl enabled", bool2Str(cfg.rest().tcpSslEnabled()))
-        restT += ("Tcp ssl context factory", safe(cfg.rest().tcpSslContextFactory()))
-        restT += ("Tcp host", safe(cfg.rest().tcpHost()))
-        restT += ("Tcp port", safe(cfg.rest().tcpPort()))
+        val restCfg = cfg.getRest
+
+        restT += ("REST enabled", bool2Str(restCfg.isRestEnabled))
+        restT += ("Jetty path", safe(restCfg.getJettyPath))
+        restT += ("Jetty host", safe(restCfg.getJettyHost))
+        restT += ("Jetty port", safe(restCfg.getJettyPort))
+        restT += ("Tcp ssl enabled", bool2Str(restCfg.isTcpSslEnabled))
+        restT += ("Tcp ssl context factory", safe(restCfg.getTcpSslContextFactory))
+        restT += ("Tcp host", safe(restCfg.getTcpHost))
+        restT += ("Tcp port", safe(restCfg.getTcpPort))
 
         restT.render()
 
-        if (cfg.userAttributes().nonEmpty) {
+        if (cfg.getUserAttributes.nonEmpty) {
             println("\nUser attributes:")
 
             val uaT = VisorTextTable()
 
             uaT #= ("Name", "Value")
 
-            cfg.userAttributes().foreach(a => uaT += (a._1, a._2))
+            cfg.getUserAttributes.foreach(a => uaT += (a._1, a._2))
 
             uaT.render()
         } else
             println("\nNo user attributes defined.")
 
-        if (cfg.env().nonEmpty) {
+        if (cfg.getEnv.nonEmpty) {
             println("\nEnvironment variables:")
 
             val envT = VisorTextTable()
@@ -328,13 +339,13 @@ class VisorConfigurationCommand extends VisorConsoleCommand {
 
             envT #= ("Name", "Value")
 
-            cfg.env().foreach(v => envT += (v._1, compactProperty(v._1, v._2)))
+            cfg.getEnv.foreach(v => envT += (v._1, compactProperty(v._1, v._2)))
 
             envT.render()
         } else
             println("\nNo environment variables defined.")
 
-        val sysProps = cfg.systemProperties().toMap
+        val sysProps = cfg.getSystemProperties.toMap
 
         if (sysProps.nonEmpty) {
             println("\nSystem properties:")

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/disco/VisorDiscoveryCommand.scala
----------------------------------------------------------------------
diff --git a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/disco/VisorDiscoveryCommand.scala b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/disco/VisorDiscoveryCommand.scala
index 0ea88ad..de69cd7 100644
--- a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/disco/VisorDiscoveryCommand.scala
+++ b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/disco/VisorDiscoveryCommand.scala
@@ -28,7 +28,7 @@ import org.apache.ignite.visor.visor._
 
 import org.apache.ignite.internal.visor.event.VisorGridDiscoveryEvent
 import org.apache.ignite.internal.visor.node.VisorNodeEventsCollectorTask
-import org.apache.ignite.internal.visor.node.VisorNodeEventsCollectorTask.VisorNodeEventsCollectorTaskArg
+import org.apache.ignite.internal.visor.node.VisorNodeEventsCollectorTaskArg
 
 import scala.collection.JavaConversions._
 import scala.collection.immutable._
@@ -42,7 +42,7 @@ import scala.language.{implicitConversions, reflectiveCalls}
  * {{{
  * +---------------------------------------------------------------------------------------+
  * | disco | Prints topology change log as seen from the oldest node.                      |
- * |       | Timeframe for querying events can be specified in arguments.                  |
+ * |       | Time frame for querying events can be specified in arguments.                 |
  * |       |                                                                               |
  * |       | Note that this command depends on Ignite events.                              |
  * |       |                                                                               |
@@ -66,7 +66,7 @@ import scala.language.{implicitConversions, reflectiveCalls}
  * ====Arguments====
  * {{{
  *     -t=<num>s|m|h|d
- *         Defines timeframe for querying events:
+ *         Defines time frame for querying events:
  *            =<num>s Events fired during last <num> seconds.
  *            =<num>m Events fired during last <num> minutes.
  *            =<num>h Events fired during last <num> hours.
@@ -107,7 +107,7 @@ class VisorDiscoveryCommand extends VisorConsoleCommand {
 
     /**
      * ===Command===
-     * Prints discovery events within specified timeframe.
+     * Prints discovery events within specified time frame.
      *
      * ===Examples===
      * <ex>disco "-r"</ex>
@@ -143,7 +143,7 @@ class VisorDiscoveryCommand extends VisorConsoleCommand {
                     try
                         cntOpt.fold(Int.MaxValue)(_.toInt)
                     catch {
-                        case e: NumberFormatException =>
+                        case _: NumberFormatException =>
                             scold("Invalid count: " + cntOpt.get)
 
                             return
@@ -184,9 +184,9 @@ class VisorDiscoveryCommand extends VisorConsoleCommand {
 
                 evts.take(cnt).foreach {
                     case de: VisorGridDiscoveryEvent =>
-                        t +=(formatDateTime(de.timestamp()), de.name(),
-                            nodeId8(de.evtNodeId()) + (if (de.isDaemon) "(daemon)" else ""),
-                            if (F.isEmpty(de.address())) NA else de.address())
+                        t +=(formatDateTime(de.getTimestamp), de.getName,
+                            nodeId8(de.getEventNodeId) + (if (de.isDaemon) "(daemon)" else ""),
+                            if (F.isEmpty(de.getAddress)) NA else de.getAddress)
                     case _ =>
                 }
 
@@ -221,7 +221,7 @@ class VisorDiscoveryCommand extends VisorConsoleCommand {
             evts = Seq(root) ++ evts
         }
 
-        evts = evts.sortBy(_.timestamp())
+        evts = evts.sortBy(_.getTimestamp)
 
         if (reverse) evts.reverse else evts
     }
@@ -239,7 +239,7 @@ object VisorDiscoveryCommand {
         shortInfo = "Prints topology change log.",
         longInfo = List(
             "Prints topology change log as seen from the oldest node.",
-            "Timeframe for querying events can be specified in arguments.",
+            "Time frame for querying events can be specified in arguments.",
             " ",
             "Note that this command depends on Ignite events.",
             " ",
@@ -257,7 +257,7 @@ object VisorDiscoveryCommand {
         ),
         args = List(
             "-t=<num>s|m|h|d" -> List(
-                "Defines timeframe for quering events:",
+                "Defines time frame for querying events:",
                 "   =<num>s Events fired during last <num> seconds.",
                 "   =<num>m Events fired during last <num> minutes.",
                 "   =<num>h Events fired during last <num> hours.",

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/events/VisorEventsCommand.scala
----------------------------------------------------------------------
diff --git a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/events/VisorEventsCommand.scala b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/events/VisorEventsCommand.scala
index f56740c..c41eca1 100644
--- a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/events/VisorEventsCommand.scala
+++ b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/events/VisorEventsCommand.scala
@@ -28,7 +28,7 @@ import java.util.UUID
 
 import org.apache.ignite.internal.visor.event.VisorGridEvent
 import org.apache.ignite.internal.visor.node.VisorNodeEventsCollectorTask
-import org.apache.ignite.internal.visor.node.VisorNodeEventsCollectorTask.VisorNodeEventsCollectorTaskArg
+import org.apache.ignite.internal.visor.node.VisorNodeEventsCollectorTaskArg
 
 import scala.collection.JavaConversions._
 import scala.collection.immutable._
@@ -182,7 +182,7 @@ class VisorEventsCommand extends VisorConsoleCommand {
     protected def mnemonic(e: VisorGridEvent) = {
         assert(e != null)
 
-        e.typeId() match {
+        e.getTypeId match {
             case t if EVTS_CHECKPOINT.contains(t) => "ch"
             case t if EVTS_DEPLOYMENT.contains(t) => "de"
             case t if EVTS_DISCOVERY_ALL.contains(t) => "di"
@@ -264,8 +264,8 @@ class VisorEventsCommand extends VisorConsoleCommand {
 
                     st += ("Node ID8(@ID)", nodeId8Addr(nid))
                     st += ("Total", sorted.size)
-                    st += ("Earliest timestamp", formatDateTime(evts.maxBy(_.timestamp).timestamp))
-                    st += ("Oldest timestamp", formatDateTime(evts.minBy(_.timestamp).timestamp))
+                    st += ("Earliest timestamp", formatDateTime(evts.maxBy(_.getTimestamp).getTimestamp))
+                    st += ("Oldest timestamp", formatDateTime(evts.minBy(_.getTimestamp).getTimestamp))
 
                     st.render()
 
@@ -276,13 +276,13 @@ class VisorEventsCommand extends VisorConsoleCommand {
                     var sum = Map[Int, (String, Int, Long, Long)]()
 
                     evts.foreach(evt => {
-                        val info = sum.getOrElse(evt.typeId(), (null, 0, Long.MinValue, Long.MaxValue))
+                        val info = sum.getOrElse(evt.getTypeId, (null, 0, Long.MinValue, Long.MaxValue))
 
-                        sum += (evt.typeId -> (
-                            "(" + mnemonic(evt) + ") " + evt.name(),
+                        sum += (evt.getTypeId -> (
+                            "(" + mnemonic(evt) + ") " + evt.getName,
                             info._2 + 1,
-                            if (evt.timestamp() > info._3) evt.timestamp() else info._3,
-                            if (evt.timestamp() < info._4) evt.timestamp() else info._4)
+                            if (evt.getTimestamp > info._3) evt.getTimestamp else info._3,
+                            if (evt.getTimestamp < info._4) evt.getTimestamp else info._4)
                             )
                     })
 
@@ -322,7 +322,7 @@ class VisorEventsCommand extends VisorConsoleCommand {
                     all #= ("Timestamp", "Description")
 
                     sorted.take(cnt).foreach(evt =>
-                        all += (formatDateTime(evt.timestamp()), U.compact(evt.shortDisplay))
+                        all += (formatDateTime(evt.getTimestamp), U.compact(evt.getShortDisplay))
                     )
 
                     all.render()
@@ -365,8 +365,8 @@ class VisorEventsCommand extends VisorConsoleCommand {
             Some(evts)
         else
             arg.get.trim match {
-                case "e" => Some(if (reverse) evts.sortBy(_.name).reverse else evts.sortBy(_.name))
-                case "t" => Some(if (reverse) evts.sortBy(_.timestamp).reverse else evts.sortBy(_.timestamp))
+                case "e" => Some(if (reverse) evts.sortBy(_.getName).reverse else evts.sortBy(_.getName))
+                case "t" => Some(if (reverse) evts.sortBy(_.getTimestamp).reverse else evts.sortBy(_.getTimestamp))
                 case a: String =>
                     scold("Invalid sorting argument: " + a)
 
@@ -400,7 +400,7 @@ object VisorEventsCommand {
         ),
         spec = List(
             "events",
-            "events {-id=<node-id>|-id8=<node-id8>} {-e=<ch,de,di,jo,ta,ca,cr,sw>}",
+            "events {-id=<node-id>|-id8=<node-id8>} {-e=<ch,de,di,jo,ta,ca,cr>}",
             "    {-t=<num>s|m|h|d} {-s=e|t} {-r} {-c=<n>}"
         ),
         args = List(
@@ -417,7 +417,7 @@ object VisorEventsCommand {
                 "Either '-id' or '-id8' can be specified.",
                 "If called without the arguments - starts in interactive mode."
             ),
-            "-e=<ch,de,di,jo,ta,ca,cr,sw>" -> List(
+            "-e=<ch,de,di,jo,ta,ca,cr>" -> List(
                 "Comma separated list of event types that should be queried:",
                 "   ch Checkpoint events.",
                 "   de Deployment events.",
@@ -428,7 +428,7 @@ object VisorEventsCommand {
                 "   cr Cache rebalance events."
             ),
             "-t=<num>s|m|h|d" -> List(
-                "Defines time frame for quering events:",
+                "Defines time frame for querying events:",
                 "   =<num>s Queries events fired during last <num> seconds.",
                 "   =<num>m Queries events fired during last <num> minutes.",
                 "   =<num>h Queries events fired during last <num> hours.",

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/gc/VisorGcCommand.scala
----------------------------------------------------------------------
diff --git a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/gc/VisorGcCommand.scala b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/gc/VisorGcCommand.scala
index 990fd00..5f642d7 100644
--- a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/gc/VisorGcCommand.scala
+++ b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/gc/VisorGcCommand.scala
@@ -104,8 +104,8 @@ class VisorGcCommand extends VisorConsoleCommand {
 
                 res.foreach {
                     case (nid, stat) =>
-                        val roundHb = stat.get1() / (1024L * 1024L)
-                        val roundHa = stat.get2() / (1024L * 1024L)
+                        val roundHb = stat.getSizeBefore / (1024L * 1024L)
+                        val roundHa = stat.getSizeAfter / (1024L * 1024L)
 
                         val sign = if (roundHa > roundHb) "+" else ""
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/tasks/VisorTasksCommand.scala
----------------------------------------------------------------------
diff --git a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/tasks/VisorTasksCommand.scala b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/tasks/VisorTasksCommand.scala
index 0468e80..4d9b795 100644
--- a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/tasks/VisorTasksCommand.scala
+++ b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/tasks/VisorTasksCommand.scala
@@ -31,7 +31,7 @@ import java.util.UUID
 
 import org.apache.ignite.internal.visor.event.{VisorGridEvent, VisorGridJobEvent, VisorGridTaskEvent}
 import org.apache.ignite.internal.visor.node.VisorNodeEventsCollectorTask
-import org.apache.ignite.internal.visor.node.VisorNodeEventsCollectorTask.VisorNodeEventsCollectorTaskArg
+import org.apache.ignite.internal.visor.node.VisorNodeEventsCollectorTaskArg
 
 import scala.collection.JavaConversions._
 import scala.language.implicitConversions
@@ -91,37 +91,37 @@ private case class VisorExecution(
      * Gets number of job rejections in this session.
      */
     lazy val rejections: Int =
-        evts.count(_.typeId() == EVT_JOB_REJECTED)
+        evts.count(_.getTypeId == EVT_JOB_REJECTED)
 
     /**
      * Gets number of job cancellations in this session.
      */
     lazy val cancels: Int =
-        evts.count(_.typeId() == EVT_JOB_CANCELLED)
+        evts.count(_.getTypeId == EVT_JOB_CANCELLED)
 
     /**
      * Gets number of job finished in this session.
      */
     lazy val finished: Int =
-        evts.count(_.typeId() == EVT_JOB_FINISHED)
+        evts.count(_.getTypeId == EVT_JOB_FINISHED)
 
     /**
      * Gets number of job started in this session.
      */
     lazy val started: Int =
-        evts.count(_.typeId() == EVT_JOB_STARTED)
+        evts.count(_.getTypeId == EVT_JOB_STARTED)
 
     /**
      * Gets number of job failures in this session.
      */
     lazy val failures: Int =
-        evts.count(_.typeId() == EVT_JOB_FAILED)
+        evts.count(_.getTypeId == EVT_JOB_FAILED)
 
     /**
      * Gets number of job failovers in this session.
      */
     lazy val failovers: Int =
-        evts.count(_.typeId() == EVT_JOB_FAILED_OVER)
+        evts.count(_.getTypeId == EVT_JOB_FAILED_OVER)
 
     /**
      * Gets duration of the session.
@@ -420,7 +420,7 @@ class VisorTasksCommand extends VisorConsoleCommand {
             else if (hasArgName("n", argLst)) {
                 val n = argValue("n", argLst)
 
-                if (!n.isDefined)
+                if (n.isEmpty)
                     scold("Invalid arguments: " + args)
                 else
                     task(n.get, hasArgFlag("r", argLst), hasArgFlag("a", argLst))
@@ -428,7 +428,7 @@ class VisorTasksCommand extends VisorConsoleCommand {
             else if (hasArgName("e", argLst)) {
                 val s = argValue("e", argLst)
 
-                if (!s.isDefined)
+                if (s.isEmpty)
                     scold("Invalid arguments: " + args)
                 else
                     exec(s.get, hasArgFlag("r", argLst))
@@ -541,28 +541,28 @@ class VisorTasksCommand extends VisorConsoleCommand {
 
         evts.foreach {
             case te: VisorGridTaskEvent =>
-                val displayedTaskName = taskSimpleName(te.taskName(), te.taskClassName())
+                val displayedTaskName = taskSimpleName(te.getTaskName(), te.getTaskClassName())
 
-                val s = getSession(te.taskSessionId(), displayedTaskName)
+                val s = getSession(te.getTaskSessionId(), displayedTaskName)
                 val t = getTask(displayedTaskName)
 
                 t.execs = t.execs + s
 
                 s.evts = s.evts :+ te
-                s.nodeIds = s.nodeIds + te.nid()
-                s.startTs = math.min(s.startTs, te.timestamp())
-                s.endTs = math.max(s.endTs, te.timestamp())
+                s.nodeIds = s.nodeIds + te.getNid
+                s.startTs = math.min(s.startTs, te.getTimestamp)
+                s.endTs = math.max(s.endTs, te.getTimestamp)
 
-                te.typeId() match {
+                te.getTypeId match {
                     case EVT_TASK_STARTED =>
                         if (s.state == UNDEFINED) s.state = STARTED
 
-                        s.origNodeId = te.nid()
+                        s.origNodeId = te.getNid
 
                     case EVT_TASK_FINISHED =>
                         if (s.state == UNDEFINED || s.state == STARTED) s.state = FINISHED
 
-                        s.origNodeId = te.nid()
+                        s.origNodeId = te.getNid
 
                     case EVT_TASK_FAILED => if (s.state == UNDEFINED || s.state == STARTED) s.state = FAILED
                     case EVT_TASK_TIMEDOUT => if (s.state == UNDEFINED || s.state == STARTED) s.state = TIMEDOUT
@@ -570,23 +570,23 @@ class VisorTasksCommand extends VisorConsoleCommand {
                 }
 
             case je: VisorGridJobEvent =>
-                val displayedTaskName = taskSimpleName(je.taskName(), je.taskClassName())
-                val s = getSession(je.taskSessionId(), displayedTaskName)
+                val displayedTaskName = taskSimpleName(je.getTaskName(), je.getTaskClassName())
+                val s = getSession(je.getTaskSessionId(), displayedTaskName)
                 val t = getTask(displayedTaskName)
 
                 t.execs = t.execs + s
 
                 // Collect node IDs where jobs didn't finish ok.
-                je.typeId() match {
+                je.getTypeId match {
                     case EVT_JOB_CANCELLED | EVT_JOB_FAILED | EVT_JOB_REJECTED | EVT_JOB_TIMEDOUT =>
-                        s.failedNodeIds = s.failedNodeIds + je.nid()
+                        s.failedNodeIds = s.failedNodeIds + je.getNid
                     case _ =>
                 }
 
                 s.evts = s.evts :+ je
-                s.nodeIds = s.nodeIds + je.nid()
-                s.startTs = math.min(s.startTs, je.timestamp())
-                s.endTs = math.max(s.endTs, je.timestamp())
+                s.nodeIds = s.nodeIds + je.getNid
+                s.startTs = math.min(s.startTs, je.getTimestamp)
+                s.endTs = math.max(s.endTs, je.getTimestamp)
 
             case _ =>
         }
@@ -1063,13 +1063,12 @@ class VisorTasksCommand extends VisorConsoleCommand {
 
                 evtsT #= ("Timestamp", "Node ID8(@)", "Event")
 
-                val se = if (!reverse) e.evts.sortBy(_.timestamp()) else e.evts.sortBy(_.timestamp()).reverse
+                val se = if (!reverse) e.evts.sortBy(_.getTimestamp) else e.evts.sortBy(_.getTimestamp).reverse
 
                 se.foreach(e => evtsT += (
-                    formatDateTime(e.timestamp()),
-                    nodeId8Addr(e.nid()),
-                    e.name()
-                    ))
+                    formatDateTime(e.getTimestamp),
+                    nodeId8Addr(e.getNid),
+                    e.getName))
 
                 println("\nTrace:")
 
@@ -1142,7 +1141,7 @@ class VisorTasksCommand extends VisorConsoleCommand {
                     }
 
                     sortedNames.foreach(taskName => {
-                        val t = VisorTask(taskName, execsMap.get(taskName).get)
+                        val t = VisorTask(taskName, execsMap(taskName))
 
                         val sE = t.execsFor(STARTED)
                         val fE = t.execsFor(FINISHED)
@@ -1256,7 +1255,7 @@ class VisorTasksCommand extends VisorConsoleCommand {
                     }
 
                     sortedNames.foreach(taskName => {
-                        val t = VisorTask(taskName, execsMap.get(taskName).get)
+                        val t = VisorTask(taskName, execsMap(taskName))
 
                         val sE = t.execsFor(STARTED)
                         val fE = t.execsFor(FINISHED)

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/visor-console/src/main/scala/org/apache/ignite/visor/visor.scala
----------------------------------------------------------------------
diff --git a/modules/visor-console/src/main/scala/org/apache/ignite/visor/visor.scala b/modules/visor-console/src/main/scala/org/apache/ignite/visor/visor.scala
index ea60c87..e1dd14e 100644
--- a/modules/visor-console/src/main/scala/org/apache/ignite/visor/visor.scala
+++ b/modules/visor-console/src/main/scala/org/apache/ignite/visor/visor.scala
@@ -43,7 +43,7 @@ import java.util.concurrent._
 import java.util.{Collection => JavaCollection, HashSet => JavaHashSet, _}
 
 import org.apache.ignite.internal.visor.cache._
-import org.apache.ignite.internal.visor.node.VisorNodeEventsCollectorTask.VisorNodeEventsCollectorTaskArg
+import org.apache.ignite.internal.visor.node.VisorNodeEventsCollectorTaskArg
 import org.apache.ignite.internal.visor.node._
 import org.apache.ignite.internal.visor.util.VisorEventMapper
 import org.apache.ignite.internal.visor.util.VisorTaskUtils._
@@ -152,16 +152,16 @@ object visor extends VisorTag {
     private var cmdLst: Seq[VisorCommandHolder] = Nil
 
     /** Node left listener. */
-    private var nodeLeftLsnr: IgnitePredicate[Event] = null
+    private var nodeLeftLsnr: IgnitePredicate[Event] = _
 
     /** Node join listener. */
-    private var nodeJoinLsnr: IgnitePredicate[Event] = null
+    private var nodeJoinLsnr: IgnitePredicate[Event] = _
 
     /** Node segmentation listener. */
-    private var nodeSegLsnr: IgnitePredicate[Event] = null
+    private var nodeSegLsnr: IgnitePredicate[Event] = _
 
     /** Node stop listener. */
-    private var nodeStopLsnr: IgnitionListener = null
+    private var nodeStopLsnr: IgnitionListener = _
 
     /** */
     @volatile private var isCon: Boolean = false
@@ -209,13 +209,13 @@ object visor extends VisorTag {
     private final val DFLT_LOG_PATH = "visor/visor-log"
 
     /** Log file. */
-    private var logFile: File = null
+    private var logFile: File = _
 
     /** Log timer. */
-    private var logTimer: Timer = null
+    private var logTimer: Timer = _
 
     /** Topology log timer. */
-    private var topTimer: Timer = null
+    private var topTimer: Timer = _
 
     /** Log started flag. */
     @volatile private var logStarted = false
@@ -224,15 +224,15 @@ object visor extends VisorTag {
     @volatile var pool: ExecutorService = new IgniteThreadPoolExecutor()
 
     /** Configuration file path, if any. */
-    @volatile var cfgPath: String = null
+    @volatile var cfgPath: String = _
 
     /** */
-    @volatile var ignite: IgniteEx = null
+    @volatile var ignite: IgniteEx = _
 
     /** */
     @volatile var prevIgnite: Option[IgniteEx] = None
 
-    private var reader: ConsoleReader = null
+    private var reader: ConsoleReader = _
 
     var batchMode: Boolean = false
 
@@ -1674,7 +1674,7 @@ object visor extends VisorTag {
             val id8 = nid8(id)
             var v = mfindHead(id8)
 
-            if(!v.isDefined){
+            if(v.isEmpty){
                v = assignNodeValue(n)
             }
 
@@ -2454,15 +2454,15 @@ object visor extends VisorTag {
                             try {
                                 out = new FileWriter(logFile, true)
 
-                                evts.toList.sortBy(_.timestamp).foreach(e => {
+                                evts.toList.sortBy(_.getTimestamp).foreach(e => {
                                     logImpl(
                                         out,
-                                        formatDateTime(e.timestamp),
-                                        nodeId8Addr(e.nid()),
-                                        U.compact(e.shortDisplay())
+                                        formatDateTime(e.getTimestamp),
+                                        nodeId8Addr(e.getNid),
+                                        U.compact(e.getShortDisplay)
                                     )
 
-                                    if (EVTS_DISCOVERY.contains(e.typeId()))
+                                    if (EVTS_DISCOVERY.contains(e.getTypeId))
                                         snapshot()
                                 })
                             }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/backend/app/agent.js
----------------------------------------------------------------------
diff --git a/modules/web-console/backend/app/agent.js b/modules/web-console/backend/app/agent.js
index f65eabb..758d31b 100644
--- a/modules/web-console/backend/app/agent.js
+++ b/modules/web-console/backend/app/agent.js
@@ -236,32 +236,43 @@ module.exports.factory = function(_, fs, path, JSZip, socketio, settings, mongo,
             const cmd = new Command(demo, 'exe')
                 .addParam('name', 'org.apache.ignite.internal.visor.compute.VisorGatewayTask')
                 .addParam('p1', nid)
-                .addParam('p2', 'org.apache.ignite.internal.visor.query.VisorQueryTask');
-
-            if (enforceJoinOrder) {
-                cmd.addParam('p3', 'org.apache.ignite.internal.visor.query.VisorQueryArgV3')
-                    .addParam('p4', cacheName)
-                    .addParam('p5', query)
-                    .addParam('p6', nonCollocatedJoins)
-                    .addParam('p7', enforceJoinOrder)
-                    .addParam('p8', local)
-                    .addParam('p9', pageSize);
-            }
-            else if (nonCollocatedJoins) {
-                cmd.addParam('p3', 'org.apache.ignite.internal.visor.query.VisorQueryArgV2')
-                    .addParam('p4', cacheName)
-                    .addParam('p5', query)
-                    .addParam('p6', true)
-                    .addParam('p7', local)
-                    .addParam('p8', pageSize);
-            }
-            else {
-                cmd.addParam('p3', 'org.apache.ignite.internal.visor.query.VisorQueryArg')
-                    .addParam('p4', cacheName)
-                    .addParam('p5', query)
-                    .addParam('p6', local)
-                    .addParam('p7', pageSize);
-            }
+                .addParam('p2', 'org.apache.ignite.internal.visor.query.VisorQueryTask')
+                .addParam('p3', 'org.apache.ignite.internal.visor.query.VisorQueryArg')
+                .addParam('p4', cacheName)
+                .addParam('p5', query)
+                .addParam('p6', nonCollocatedJoins)
+                .addParam('p7', enforceJoinOrder)
+                .addParam('p8', local)
+                .addParam('p9', pageSize);
+
+            return this.executeRest(cmd);
+        }
+
+        /**
+         * @param {Boolean} demo Is need run command on demo node.
+         * @param {String} nid Node id.
+         * @param {String} cacheName Cache name.
+         * @param {String} filter Filter text.
+         * @param {Boolean} regEx Flag whether filter by regexp.
+         * @param {Boolean} caseSensitive Case sensitive filtration.
+         * @param {Boolean} near Scan near cache.
+         * @param {Boolean} local Flag whether to execute query locally.
+         * @param {int} pageSize Page size.
+         * @returns {Promise}
+         */
+        queryScan(demo, nid, cacheName, filter, regEx, caseSensitive, near, local, pageSize) {
+            const cmd = new Command(demo, 'exe')
+                .addParam('name', 'org.apache.ignite.internal.visor.compute.VisorGatewayTask')
+                .addParam('p1', nid)
+                .addParam('p2', 'org.apache.ignite.internal.visor.query.VisorScanQueryTask')
+                .addParam('p3', 'org.apache.ignite.internal.visor.query.VisorScanQueryArg')
+                .addParam('p4', cacheName)
+                .addParam('p5', filter)
+                .addParam('p6', regEx)
+                .addParam('p7', caseSensitive)
+                .addParam('p8', near)
+                .addParam('p9', local)
+                .addParam('p10', pageSize);
 
             return this.executeRest(cmd);
         }
@@ -278,7 +289,7 @@ module.exports.factory = function(_, fs, path, JSZip, socketio, settings, mongo,
                 .addParam('name', 'org.apache.ignite.internal.visor.compute.VisorGatewayTask')
                 .addParam('p1', nid)
                 .addParam('p2', 'org.apache.ignite.internal.visor.query.VisorQueryNextPageTask')
-                .addParam('p3', 'org.apache.ignite.lang.IgniteBiTuple')
+                .addParam('p3', 'org.apache.ignite.lang.VisorQueryNextPageTaskArg')
                 .addParam('p4', 'java.lang.String')
                 .addParam('p5', 'java.lang.Integer')
                 .addParam('p6', queryId)
@@ -316,7 +327,7 @@ module.exports.factory = function(_, fs, path, JSZip, socketio, settings, mongo,
             const cmd = new Command(demo, 'exe')
                 .addParam('name', 'org.apache.ignite.internal.visor.compute.VisorGatewayTask')
                 .addParam('p1', nids)
-                .addParam('p2', 'org.apache.ignite.internal.visor.cache.VisorCacheQueryDetailMetricsCollectorTask')
+                .addParam('p2', 'org.apache.ignite.internal.visor.query.VisorQueryDetailMetricsCollectorTask')
                 .addParam('p3', 'java.lang.Long')
                 .addParam('p4', since);
 
@@ -332,7 +343,7 @@ module.exports.factory = function(_, fs, path, JSZip, socketio, settings, mongo,
             const cmd = new Command(demo, 'exe')
                 .addParam('name', 'org.apache.ignite.internal.visor.compute.VisorGatewayTask')
                 .addParam('p1', nids)
-                .addParam('p2', 'org.apache.ignite.internal.visor.cache.VisorCacheResetQueryDetailMetricsTask')
+                .addParam('p2', 'org.apache.ignite.internal.visor.query.VisorQueryResetDetailMetricsTask')
                 .addParam('p3', 'java.lang.Void');
 
             return this.executeRest(cmd);
@@ -348,7 +359,7 @@ module.exports.factory = function(_, fs, path, JSZip, socketio, settings, mongo,
             const cmd = new Command(demo, 'exe')
                 .addParam('name', 'org.apache.ignite.internal.visor.compute.VisorGatewayTask')
                 .addParam('p1', '')
-                .addParam('p2', 'org.apache.ignite.internal.visor.query.VisorCollectRunningQueriesTask')
+                .addParam('p2', 'org.apache.ignite.internal.visor.query.VisorRunningQueriesCollectorTask')
                 .addParam('p3', 'java.lang.Long')
                 .addParam('p4', duration);
 
@@ -366,10 +377,9 @@ module.exports.factory = function(_, fs, path, JSZip, socketio, settings, mongo,
             const cmd = new Command(demo, 'exe')
                 .addParam('name', 'org.apache.ignite.internal.visor.compute.VisorGatewayTask')
                 .addParam('p1', nid)
-                .addParam('p2', 'org.apache.ignite.internal.visor.query.VisorCancelQueriesTask')
-                .addParam('p3', 'java.util.Collection')
-                .addParam('p4', 'java.lang.Long')
-                .addParam('p5', queryId);
+                .addParam('p2', 'org.apache.ignite.internal.visor.query.VisorQueryCancelTask')
+                .addParam('p3', 'java.lang.Long')
+                .addParam('p4', queryId);
 
             return this.executeRest(cmd);
         }
@@ -471,7 +481,7 @@ module.exports.factory = function(_, fs, path, JSZip, socketio, settings, mongo,
                 .addParam('name', 'org.apache.ignite.internal.visor.compute.VisorGatewayTask')
                 .addParam('p1', nids)
                 .addParam('p2', 'org.apache.ignite.internal.visor.cache.VisorCacheStartTask')
-                .addParam('p3', 'org.apache.ignite.internal.visor.cache.VisorCacheStartTask$VisorCacheStartArg')
+                .addParam('p3', 'org.apache.ignite.internal.visor.cache.VisorCacheStartArg')
                 .addParam('p4', near)
                 .addParam('p5', cacheName)
                 .addParam('p6', cfg);
@@ -515,24 +525,6 @@ module.exports.factory = function(_, fs, path, JSZip, socketio, settings, mongo,
 
         /**
          * @param {Boolean} demo Is need run command on demo node.
-         * @param {String} nid Node id.
-         * @param {String} cacheNames Cache names separated by comma.
-         * @returns {Promise}
-         */
-        cacheSwapBackups(demo, nid, cacheNames) {
-            const cmd = new Command(demo, 'exe')
-                .addParam('name', 'org.apache.ignite.internal.visor.compute.VisorGatewayTask')
-                .addParam('p1', nid)
-                .addParam('p2', 'org.apache.ignite.internal.visor.cache.VisorCacheSwapBackupsTask')
-                .addParam('p3', 'java.util.Set')
-                .addParam('p4', 'java.lang.String')
-                .addParam('p5', cacheNames);
-
-            return this.executeRest(cmd);
-        }
-
-        /**
-         * @param {Boolean} demo Is need run command on demo node.
          * @param {String} nids Node ids.
          * @returns {Promise}
          */

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/backend/app/browser.js
----------------------------------------------------------------------
diff --git a/modules/web-console/backend/app/browser.js b/modules/web-console/backend/app/browser.js
index 00ae751..e9266a8 100644
--- a/modules/web-console/backend/app/browser.js
+++ b/modules/web-console/backend/app/browser.js
@@ -113,6 +113,19 @@ module.exports.factory = (_, socketio, agentMgr, configure) => {
                         .catch((err) => cb(_errorToJson(err)));
                 });
 
+                const fetchResult = (acc) => {
+                    if (!acc.hasMore)
+                        return acc;
+
+                    return agent.queryFetch(demo, acc.responseNodeId, acc.queryId, pageSize)
+                        .then(({result}) => {
+                            acc.rows = acc.rows.concat(result.rows);
+                            acc.hasMore = result.hasMore;
+
+                            return fetchResult(acc);
+                        });
+                };
+
                 // Execute query on node and return full result to browser.
                 socket.on('node:query:getAll', (nid, cacheName, query, distributedJoins, enforceJoinOrder, local, cb) => {
                     // Set page size for query.
@@ -122,26 +135,12 @@ module.exports.factory = (_, socketio, agentMgr, configure) => {
                         .then((agent) => {
                             const firstPage = agent.fieldsQuery(demo, nid, cacheName, query, distributedJoins, enforceJoinOrder, local, pageSize)
                                 .then(({result}) => {
-                                    if (result.key)
-                                        return Promise.reject(result.key);
+                                    if (result.error)
+                                        return Promise.reject(result.error);
 
-                                    return result.value;
+                                    return result.result;
                                 });
 
-                            const fetchResult = (acc) => {
-                                if (!acc.hasMore)
-                                    return acc;
-
-                                return agent.queryFetch(demo, acc.responseNodeId, acc.queryId, pageSize)
-                                    .then(({result}) => {
-                                        acc.rows = acc.rows.concat(result.rows);
-
-                                        acc.hasMore = result.hasMore;
-
-                                        return fetchResult(acc);
-                                    });
-                            };
-
                             return firstPage
                                 .then(fetchResult);
                         })
@@ -203,6 +202,36 @@ module.exports.factory = (_, socketio, agentMgr, configure) => {
                         .catch((err) => cb(_errorToJson(err)));
                 });
 
+                // Execute scan query on node and return first page to browser.
+                socket.on('node:scan', (nid, cacheName, filter, regEx, caseSensitive, near, local, pageSize, cb) => {
+                    agentMgr.findAgent(accountId())
+                        .then((agent) => agent.queryScan(demo, nid, cacheName, filter, regEx, caseSensitive, near, local, pageSize))
+                        .then((res) => cb(null, res))
+                        .catch((err) => cb(_errorToJson(err)));
+                });
+
+                // Execute scan on node and return full result to browser.
+                socket.on('node:scan:getAll', (nid, cacheName, filter, regEx, caseSensitive, near, local, cb) => {
+                    // Set page size for query.
+                    const pageSize = 1024;
+
+                    agentMgr.findAgent(accountId())
+                        .then((agent) => {
+                            const firstPage = agent.queryScan(demo, nid, cacheName, filter, regEx, caseSensitive, near, local, pageSize)
+                                .then(({result}) => {
+                                    if (result.error)
+                                        return Promise.reject(result.error);
+
+                                    return result.result;
+                                });
+
+                            return firstPage
+                                .then(fetchResult);
+                        })
+                        .then((res) => cb(null, res))
+                        .catch((err) => cb(_errorToJson(err)));
+                });
+
                 // Return cache metadata from all nodes in grid.
                 socket.on('node:cache:metadata', (cacheName, cb) => {
                     agentMgr.findAgent(accountId())
@@ -339,19 +368,6 @@ module.exports.factory = (_, socketio, agentMgr, configure) => {
                         .catch((err) => cb(_errorToJson(err)));
                 });
 
-                // Swap backups specified caches on specified node and return result to browser.
-                socket.on('node:cache:swap:backups', (nid, cacheNames, cb) => {
-                    agentMgr.findAgent(accountId())
-                        .then((agent) => agent.cacheSwapBackups(demo, nid, cacheNames))
-                        .then((data) => {
-                            if (data.finished)
-                                return cb(null, data.result);
-
-                            cb(_errorToJson(data.error));
-                        })
-                        .catch((err) => cb(_errorToJson(err)));
-                });
-
                 // Reset metrics specified cache on specified node and return result to browser.
                 socket.on('node:cache:reset:metrics', (nid, cacheName, cb) => {
                     agentMgr.findAgent(accountId())

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/backend/app/mongo.js
----------------------------------------------------------------------
diff --git a/modules/web-console/backend/app/mongo.js b/modules/web-console/backend/app/mongo.js
index f4a62b1..0da9aa9 100644
--- a/modules/web-console/backend/app/mongo.js
+++ b/modules/web-console/backend/app/mongo.js
@@ -144,6 +144,7 @@ module.exports.factory = function(passportMongo, settings, pluginMongo, mongoose
         domains: [{type: ObjectId, ref: 'DomainModel'}],
         cacheMode: {type: String, enum: ['PARTITIONED', 'REPLICATED', 'LOCAL']},
         atomicityMode: {type: String, enum: ['ATOMIC', 'TRANSACTIONAL']},
+        partitionLossPolicy: {type: String, enum: ['READ_ONLY_SAFE', 'READ_ONLY_ALL', 'READ_WRITE_SAFE', 'READ_WRITE_ALL', 'IGNORE']},
 
         affinity: {
             kind: {type: String, enum: ['Default', 'Rendezvous', 'Fair', 'Custom']},
@@ -178,10 +179,9 @@ module.exports.factory = function(passportMongo, settings, pluginMongo, mongoose
         },
 
         backups: Number,
-        memoryMode: {type: String, enum: ['ONHEAP_TIERED', 'OFFHEAP_TIERED', 'OFFHEAP_VALUES']},
-        offHeapMaxMemory: Number,
         startSize: Number,
-        swapEnabled: Boolean,
+
+        onheapCacheEnabled: Boolean,
 
         evictionPolicy: {
             kind: {type: String, enum: ['LRU', 'FIFO', 'SORTED']},
@@ -272,6 +272,7 @@ module.exports.factory = function(passportMongo, settings, pluginMongo, mongoose
         sqlFunctionClasses: [String],
         snapshotableIndex: Boolean,
         queryDetailMetricsSize: Number,
+        queryParallelism: Number,
         statisticsEnabled: Boolean,
         managementEnabled: Boolean,
         readFromBackup: Boolean,
@@ -334,7 +335,7 @@ module.exports.factory = function(passportMongo, settings, pluginMongo, mongoose
         clusters: [{type: ObjectId, ref: 'Cluster'}],
         affinnityGroupSize: Number,
         blockSize: Number,
-        streamBufferSize: Number,
+        bufferSize: Number,
         dataCacheName: String,
         metaCacheName: String,
         defaultMode: {type: String, enum: ['PRIMARY', 'PROXY', 'DUAL_SYNC', 'DUAL_ASYNC']},
@@ -582,8 +583,6 @@ module.exports.factory = function(passportMongo, settings, pluginMongo, mongoose
             }
         },
         marshalLocalJobs: Boolean,
-        marshallerCacheKeepAliveTime: Number,
-        marshallerCacheThreadPoolSize: Number,
         metricsExpireTime: Number,
         metricsHistorySize: Number,
         metricsLogFrequency: Number,
@@ -641,16 +640,6 @@ module.exports.factory = function(passportMongo, settings, pluginMongo, mongoose
         peerClassLoadingMissedResourcesCacheSize: Number,
         peerClassLoadingThreadPoolSize: Number,
         publicThreadPoolSize: Number,
-        swapSpaceSpi: {
-            kind: {type: String, enum: ['FileSwapSpaceSpi']},
-            FileSwapSpaceSpi: {
-                baseDirectory: String,
-                readStripesNumber: Number,
-                maximumSparsity: Number,
-                maxWriteQueueSize: Number,
-                writeBufferSize: Number
-            }
-        },
         systemThreadPoolSize: Number,
         timeServerPortBase: Number,
         timeServerPortRange: Number,

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/frontend/app/modules/agent/agent.module.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/agent/agent.module.js b/modules/web-console/frontend/app/modules/agent/agent.module.js
index 724fc6c..b20a5bc 100644
--- a/modules/web-console/frontend/app/modules/agent/agent.module.js
+++ b/modules/web-console/frontend/app/modules/agent/agent.module.js
@@ -273,10 +273,10 @@ class IgniteAgentMonitor {
     query(nid, cacheName, query, nonCollocatedJoins, enforceJoinOrder, local, pageSize) {
         return this._rest('node:query', nid, maskNull(cacheName), maskNull(query), nonCollocatedJoins, enforceJoinOrder, local, pageSize)
             .then(({result}) => {
-                if (_.isEmpty(result.key))
-                    return result.value;
+                if (_.isEmpty(result.error))
+                    return result.result;
 
-                return Promise.reject(result.key);
+                return Promise.reject(result.error);
             });
     }
 
@@ -295,6 +295,41 @@ class IgniteAgentMonitor {
 
     /**
      * @param {String} nid Node id.
+     * @param {String} cacheName Cache name.
+     * @param {String} filter Optional filter for scan query.
+     * @param {Boolean} regEx Flag whether filter by regexp.
+     * @param {Boolean} caseSensitive Case sensitive filtration.
+     * @param {Boolean} near Scan near cache.
+     * @param {Boolean} local Flag whether to execute query locally.
+     * @param {int} pageSize
+     * @returns {Promise}
+     */
+    scan(nid, cacheName, filter, regEx, caseSensitive, near, local, pageSize) {
+        return this._rest('node:scan', nid, maskNull(cacheName), maskNull(filter), regEx, caseSensitive, near, local, pageSize)
+            .then(({result}) => {
+                if (_.isEmpty(result.error))
+                    return result.result;
+
+                return Promise.reject(result.error);
+            });
+    }
+
+    /**
+     * @param {String} nid Node id.
+     * @param {String} cacheName Cache name.
+     * @param {String} filter Optional filter for scan query.
+     * @param {Boolean} regEx Flag whether filter by regexp.
+     * @param {Boolean} caseSensitive Case sensitive filtration.
+     * @param {Boolean} near Scan near cache.
+     * @param {Boolean} local Flag whether to execute query locally.
+     * @returns {Promise}
+     */
+    scanGetAll(nid, cacheName, filter, regEx, caseSensitive, near, local) {
+        return this._rest('node:scan:getAll', nid, maskNull(cacheName), maskNull(filter), regEx, caseSensitive, near, local);
+    }
+
+    /**
+     * @param {String} nid Node id.
      * @param {int} queryId
      * @param {int} pageSize
      * @returns {Promise}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/web-console/frontend/app/modules/configuration/generator/AbstractTransformer.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/configuration/generator/AbstractTransformer.js b/modules/web-console/frontend/app/modules/configuration/generator/AbstractTransformer.js
index 40d937e..40641d9 100644
--- a/modules/web-console/frontend/app/modules/configuration/generator/AbstractTransformer.js
+++ b/modules/web-console/frontend/app/modules/configuration/generator/AbstractTransformer.js
@@ -150,11 +150,6 @@ export default class AbstractTransformer {
         return this.toSection(this.generator.clusterSsl(cluster));
     }
 
-    // Generate swap group.
-    static clusterSwap(cluster) {
-        return this.toSection(this.generator.clusterSwap(cluster));
-    }
-
     // Generate time group.
     static clusterTime(cluster) {
         return this.toSection(this.generator.clusterTime(cluster));


[04/11] ignite git commit: IGNITE-4988 Cleanup and refactor VisorXxx tasks and DTO for ignite-2.0

Posted by ak...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryArg.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryArg.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryArg.java
index 00587b4..1cb1f0d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryArg.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryArg.java
@@ -17,32 +17,44 @@
 
 package org.apache.ignite.internal.visor.query;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 /**
  * Arguments for {@link VisorQueryTask}.
  */
-public class VisorQueryArg implements Serializable {
+public class VisorQueryArg extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
     /** Cache name for query. */
-    private final String cacheName;
+    private String cacheName;
 
     /** Query text. */
-    private final String qryTxt;
+    private String qryTxt;
 
     /** Distributed joins enabled flag. */
-    private final boolean distributedJoins;
+    private boolean distributedJoins;
 
     /** Enforce join order flag. */
-    private final boolean enforceJoinOrder;
+    private boolean enforceJoinOrder;
 
     /** Flag whether to execute query locally. */
-    private final boolean loc;
+    private boolean loc;
 
     /** Result batch size. */
-    private final int pageSize;
+    private int pageSize;
+
+    /**
+     * Default constructor.
+     */
+    public VisorQueryArg() {
+        // No-op.
+    }
 
     /**
      * @param cacheName Cache name for query.
@@ -65,42 +77,67 @@ public class VisorQueryArg implements Serializable {
     /**
      * @return Cache name.
      */
-    public String cacheName() {
+    public String getCacheName() {
         return cacheName;
     }
 
     /**
      * @return Query txt.
      */
-    public String queryText() {
+    public String getQueryText() {
         return qryTxt;
     }
 
     /**
      * @return Distributed joins enabled flag.
      */
-    public boolean distributedJoins() {
+    public boolean isDistributedJoins() {
         return distributedJoins;
     }
 
     /**
      * @return Enforce join order flag.
      */
-    public boolean enforceJoinOrder() {
+    public boolean isEnforceJoinOrder() {
         return enforceJoinOrder;
     }
 
     /**
      * @return {@code true} if query should be executed locally.
      */
-    public boolean local() {
+    public boolean isLocal() {
         return loc;
     }
 
     /**
      * @return Page size.
      */
-    public int pageSize() {
+    public int getPageSize() {
         return pageSize;
     }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, cacheName);
+        U.writeString(out, qryTxt);
+        out.writeBoolean(distributedJoins);
+        out.writeBoolean(enforceJoinOrder);
+        out.writeBoolean(loc);
+        out.writeInt(pageSize);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        cacheName = U.readString(in);
+        qryTxt = U.readString(in);
+        distributedJoins = in.readBoolean();
+        enforceJoinOrder = in.readBoolean();
+        loc = in.readBoolean();
+        pageSize = in.readInt();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorQueryArg.class, this);
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryCancelTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryCancelTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryCancelTask.java
new file mode 100644
index 0000000..6b81dc4
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryCancelTask.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.query;
+
+import java.util.Collections;
+import java.util.List;
+import org.apache.ignite.IgniteException;
+import org.apache.ignite.compute.ComputeJobResult;
+import org.apache.ignite.internal.processors.task.GridInternal;
+import org.apache.ignite.internal.visor.VisorJob;
+import org.apache.ignite.internal.visor.VisorOneNodeTask;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Task to cancel queries.
+ */
+@GridInternal
+public class VisorQueryCancelTask extends VisorOneNodeTask<Long, Void> {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** {@inheritDoc} */
+    @Override protected VisorCancelQueriesJob job(Long arg) {
+        return new VisorCancelQueriesJob(arg, debug);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable @Override protected Void reduce0(List<ComputeJobResult> results) throws IgniteException {
+        return null;
+    }
+
+    /**
+     * Job to cancel queries on node.
+     */
+    private static class VisorCancelQueriesJob extends VisorJob<Long, Void> {
+        /** */
+        private static final long serialVersionUID = 0L;
+
+        /**
+         * Create job with specified argument.
+         *
+         * @param arg Job argument.
+         * @param debug Flag indicating whether debug information should be printed into node log.
+         */
+        protected VisorCancelQueriesJob(@Nullable Long arg, boolean debug) {
+            super(arg, debug);
+        }
+
+        /** {@inheritDoc} */
+        @Override protected Void run(@Nullable Long queries) throws IgniteException {
+            ignite.context().query().cancelQueries(Collections.singleton(queries));
+
+            return null;
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryCleanupTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryCleanupTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryCleanupTask.java
index c1f06ae..572cf3b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryCleanupTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryCleanupTask.java
@@ -65,10 +65,10 @@ public class VisorQueryCleanupTask extends VisorMultiNodeTask<Map<UUID, Collecti
                     map.put(new VisorQueryCleanupJob(taskArg.get(node.id()), debug), node);
 
             if (map.isEmpty()) {
-                String notFoundNodes = "";
+                StringBuilder notFoundNodes = new StringBuilder();
 
                 for (UUID nid : nodeIds)
-                    notFoundNodes = notFoundNodes + (notFoundNodes.isEmpty() ? "" : ",")  + U.id8(nid);
+                    notFoundNodes.append((notFoundNodes.length() == 0) ? "" : ",").append(U.id8(nid));
 
                 throw new VisorClusterGroupEmptyException("Failed to clear query results. Nodes are not available: [" +
                     notFoundNodes + "]");
@@ -123,4 +123,4 @@ public class VisorQueryCleanupTask extends VisorMultiNodeTask<Map<UUID, Collecti
             return S.toString(VisorQueryCleanupJob.class, this);
         }
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryConfiguration.java
new file mode 100644
index 0000000..92921b2
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryConfiguration.java
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.query;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.List;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+import static org.apache.ignite.internal.visor.util.VisorTaskUtils.compactClasses;
+
+/**
+ * Data transfer object for cache query configuration data.
+ */
+public class VisorQueryConfiguration extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** */
+    private List<String> sqlFuncClss;
+
+    /** */
+    private long longQryWarnTimeout;
+
+    /** */
+    private boolean sqlEscapeAll;
+
+    /** */
+    private List<String> indexedTypes;
+
+    /** */
+    private int sqlOnheapRowCacheSize;
+
+    /** */
+    private String sqlSchema;
+
+    /**
+     * Default constructor.
+     */
+    public VisorQueryConfiguration() {
+        // No-op.
+    }
+
+    /**
+     * Create data transfer object with cache query configuration data.
+     *
+     * @param ccfg Cache configuration.
+     */
+    public VisorQueryConfiguration(CacheConfiguration ccfg) {
+        sqlFuncClss = compactClasses(ccfg.getSqlFunctionClasses());
+        longQryWarnTimeout = ccfg.getLongQueryWarningTimeout();
+        sqlEscapeAll = ccfg.isSqlEscapeAll();
+        indexedTypes = compactClasses(ccfg.getIndexedTypes());
+        sqlSchema = ccfg.getSqlSchema();
+    }
+
+    /**
+     * @return Classes names with SQL functions.
+     */
+    public List<String> getSqlFunctionClasses() {
+        return sqlFuncClss;
+    }
+
+    /**
+     * @return Timeout in milliseconds after which long query warning will be printed.
+     */
+    public long getLongQueryWarningTimeout() {
+        return longQryWarnTimeout;
+    }
+
+    /**
+     * @return {@code true} if SQL engine generate SQL statements with escaped names.
+     */
+    public boolean isSqlEscapeAll() {
+        return sqlEscapeAll;
+    }
+
+    /**
+     * @return Array of key and value classes names to be indexed.
+     */
+    public List<String> getIndexedTypes() {
+        return indexedTypes;
+    }
+
+    /**
+     * @return Number of SQL rows which will be cached onheap to avoid deserialization on each SQL index access.
+     */
+    public int getSqlOnheapRowCacheSize() {
+        return sqlOnheapRowCacheSize;
+    }
+
+    /**
+     * @return Schema name, which is used by SQL engine for SQL statements generation.
+     */
+    public String getSqlSchema() {
+        return sqlSchema;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeCollection(out, sqlFuncClss);
+        out.writeLong(longQryWarnTimeout);
+        out.writeBoolean(sqlEscapeAll);
+        U.writeCollection(out, indexedTypes);
+        out.writeInt(sqlOnheapRowCacheSize);
+        U.writeString(out, sqlSchema);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        sqlFuncClss = U.readList(in);
+        longQryWarnTimeout = in.readLong();
+        sqlEscapeAll = in.readBoolean();
+        indexedTypes = U.readList(in);
+        sqlOnheapRowCacheSize = in.readInt();
+        sqlSchema = U.readString(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorQueryConfiguration.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryDetailMetrics.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryDetailMetrics.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryDetailMetrics.java
new file mode 100644
index 0000000..b747845
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryDetailMetrics.java
@@ -0,0 +1,205 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.query;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.cache.query.QueryDetailMetrics;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Data transfer object for cache query detail metrics.
+ */
+public class VisorQueryDetailMetrics extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Query type. */
+    private String qryType;
+
+    /** Textual query representation. */
+    private String qry;
+
+    /** Cache name. */
+    private String cache;
+
+    /** Number of executions. */
+    private int execs;
+
+    /** Number of completions executions. */
+    private int completions;
+
+    /** Number of failures. */
+    private int failures;
+
+    /** Minimum time of execution. */
+    private long minTime;
+
+    /** Maximum time of execution. */
+    private long maxTime;
+
+    /** Average time of execution. */
+    private double avgTime;
+
+    /** Sum of execution time of completions time. */
+    private long totalTime;
+
+    /** Sum of execution time of completions time. */
+    private long lastStartTime;
+
+    /**
+     * Default constructor
+     */
+    public VisorQueryDetailMetrics() {
+        // No-op.
+    }
+
+    /**
+     * @param m Cache query metrics.
+     */
+    public VisorQueryDetailMetrics(QueryDetailMetrics m) {
+        qryType = m.queryType();
+        qry = m.query();
+        cache = m.cache();
+
+        execs = m.executions();
+        completions = m.completions();
+        failures = m.failures();
+
+        minTime = m.minimumTime();
+        maxTime = m.maximumTime();
+        avgTime = m.averageTime();
+        totalTime = m.totalTime();
+        lastStartTime = m.lastStartTime();
+    }
+
+    /**
+     * @return Query type
+     */
+    public String getQueryType() {
+        return qryType;
+    }
+
+    /**
+     * @return Query type
+     */
+    public String getQuery() {
+        return qry;
+    }
+
+    /**
+     * @return Cache name where query was executed.
+     */
+    public String getCache() {
+        return cache;
+    }
+
+    /**
+     * @return Number of executions.
+     */
+    public int getExecutions() {
+        return execs;
+    }
+
+    /**
+     * @return Number of completed executions.
+     */
+    public int getCompletions() {
+        return completions;
+    }
+
+    /**
+     * @return Total number of times a query execution failed.
+     */
+    public int getFailures() {
+        return failures;
+    }
+
+    /**
+     * @return Minimum execution time of query.
+     */
+    public long getMinimumTime() {
+        return minTime;
+    }
+
+    /**
+     * @return Maximum execution time of query.
+     */
+    public long getMaximumTime() {
+        return maxTime;
+    }
+
+    /**
+     * @return Average execution time of query.
+     */
+    public double getAverageTime() {
+        return avgTime;
+    }
+
+    /**
+     * @return Total time of all query executions.
+     */
+    public long getTotalTime() {
+        return totalTime;
+    }
+
+    /**
+     * @return Latest time query was stared.
+     */
+    public long getLastStartTime() {
+        return lastStartTime;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, qryType);
+        U.writeString(out, qry);
+        U.writeString(out, cache);
+        out.writeInt(execs);
+        out.writeInt(completions);
+        out.writeInt(failures);
+        out.writeLong(minTime);
+        out.writeLong(maxTime);
+        out.writeDouble(avgTime);
+        out.writeLong(totalTime);
+        out.writeLong(lastStartTime);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        qryType = U.readString(in);
+        qry = U.readString(in);
+        cache = U.readString(in);
+        execs = in.readInt();
+        completions = in.readInt();
+        failures = in.readInt();
+        minTime = in.readLong();
+        maxTime = in.readLong();
+        avgTime = in.readDouble();
+        totalTime = in.readLong();
+        lastStartTime = in.readLong();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorQueryDetailMetrics.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryDetailMetricsCollectorTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryDetailMetricsCollectorTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryDetailMetricsCollectorTask.java
new file mode 100644
index 0000000..7c1379f
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryDetailMetricsCollectorTask.java
@@ -0,0 +1,146 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.query;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.ignite.IgniteException;
+import org.apache.ignite.cache.query.QueryDetailMetrics;
+import org.apache.ignite.compute.ComputeJobResult;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.processors.cache.GridCacheProcessor;
+import org.apache.ignite.internal.processors.cache.IgniteInternalCache;
+import org.apache.ignite.internal.processors.cache.query.GridCacheQueryDetailMetricsAdapter;
+import org.apache.ignite.internal.processors.cache.query.GridCacheQueryDetailMetricsKey;
+import org.apache.ignite.internal.processors.task.GridInternal;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.visor.VisorJob;
+import org.apache.ignite.internal.visor.VisorMultiNodeTask;
+import org.jetbrains.annotations.Nullable;
+
+import static org.apache.ignite.internal.processors.cache.GridCacheUtils.isIgfsCache;
+import static org.apache.ignite.internal.processors.cache.GridCacheUtils.isSystemCache;
+
+/**
+ * Task to collect cache query metrics.
+ */
+@GridInternal
+public class VisorQueryDetailMetricsCollectorTask extends VisorMultiNodeTask<Long, Collection<VisorQueryDetailMetrics>,
+    Collection<? extends QueryDetailMetrics>> {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** {@inheritDoc} */
+    @Override protected VisorCacheQueryDetailMetricsCollectorJob job(Long arg) {
+        return new VisorCacheQueryDetailMetricsCollectorJob(arg, debug);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable @Override protected Collection<VisorQueryDetailMetrics> reduce0(List<ComputeJobResult> results)
+        throws IgniteException {
+        Map<GridCacheQueryDetailMetricsKey, GridCacheQueryDetailMetricsAdapter> taskRes = new HashMap<>();
+
+        for (ComputeJobResult res : results) {
+            if (res.getException() != null)
+                throw res.getException();
+
+            Collection<GridCacheQueryDetailMetricsAdapter> metrics = res.getData();
+
+            VisorCacheQueryDetailMetricsCollectorJob.aggregateMetrics(-1, taskRes, metrics);
+        }
+
+        Collection<GridCacheQueryDetailMetricsAdapter> aggMetrics = taskRes.values();
+
+        Collection<VisorQueryDetailMetrics> res = new ArrayList<>(aggMetrics.size());
+
+        for (GridCacheQueryDetailMetricsAdapter m: aggMetrics)
+            res.add(new VisorQueryDetailMetrics(m));
+
+        return res;
+    }
+
+    /**
+     * Job that will actually collect query metrics.
+     */
+    private static class VisorCacheQueryDetailMetricsCollectorJob extends VisorJob<Long, Collection<? extends QueryDetailMetrics>> {
+        /** */
+        private static final long serialVersionUID = 0L;
+
+        /**
+         * Create job with specified argument.
+         *
+         * @param arg Last time when metrics were collected.
+         * @param debug Debug flag.
+         */
+        protected VisorCacheQueryDetailMetricsCollectorJob(@Nullable Long arg, boolean debug) {
+            super(arg, debug);
+        }
+
+        /**
+         * @param since Time when metrics were collected last time.
+         * @param res Response.
+         * @param metrics Metrics.
+         */
+        private static void aggregateMetrics(long since, Map<GridCacheQueryDetailMetricsKey,
+            GridCacheQueryDetailMetricsAdapter> res, Collection<GridCacheQueryDetailMetricsAdapter> metrics) {
+            for (GridCacheQueryDetailMetricsAdapter m : metrics) {
+                if (m.lastStartTime() > since) {
+                    GridCacheQueryDetailMetricsKey key = m.key();
+
+                    GridCacheQueryDetailMetricsAdapter aggMetrics = res.get(key);
+
+                    res.put(key, aggMetrics == null ? m : aggMetrics.aggregate(m));
+                }
+            }
+        }
+
+        /** {@inheritDoc} */
+        @Override protected Collection<? extends QueryDetailMetrics> run(@Nullable Long arg) throws IgniteException {
+            assert arg != null;
+
+            IgniteConfiguration cfg = ignite.configuration();
+
+            GridCacheProcessor cacheProc = ignite.context().cache();
+
+            Collection<String> cacheNames = cacheProc.cacheNames();
+
+            Map<GridCacheQueryDetailMetricsKey, GridCacheQueryDetailMetricsAdapter> aggMetrics = new HashMap<>();
+
+            for (String cacheName : cacheNames) {
+                if (!isSystemCache(cacheName) && !isIgfsCache(cfg, cacheName)) {
+                    IgniteInternalCache<Object, Object> cache = cacheProc.cache(cacheName);
+
+                    if (cache == null || !cache.context().started())
+                        continue;
+
+                    aggregateMetrics(arg, aggMetrics, cache.context().queries().detailMetrics());
+                }
+            }
+
+            return new ArrayList<>(aggMetrics.values());
+        }
+
+        /** {@inheritDoc} */
+        @Override public String toString() {
+            return S.toString(VisorCacheQueryDetailMetricsCollectorJob.class, this);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryEntity.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryEntity.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryEntity.java
new file mode 100644
index 0000000..9f4dfe7
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryEntity.java
@@ -0,0 +1,188 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.query;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.ignite.cache.QueryEntity;
+import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.internal.processors.igfs.IgfsUtils;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Data transfer object for {@link QueryEntity}.
+ */
+public class VisorQueryEntity extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Key class used to store key in cache. */
+    private String keyType;
+
+    /** Value class used to store value in cache. */
+    private String valType;
+
+    /** Fields to be queried, in addition to indexed fields. */
+    private Map<String, String> qryFlds;
+
+    /** Key fields. */
+    private List<String> keyFields;
+
+    /** Aliases. */
+    private Map<String, String> aliases;
+
+    /** Table name. */
+    private String tblName;
+
+    /** Fields to create group indexes for. */
+    private List<VisorQueryIndex> grps;
+
+    /**
+     * @param qryEntities Collection of query entities.
+     * @return Data transfer object for query entities.
+     */
+    public static List<VisorQueryEntity> list(Collection<QueryEntity> qryEntities) {
+        List<VisorQueryEntity> entities = new ArrayList<>();
+
+        // Add query entries.
+        if (!F.isEmpty(qryEntities))
+            for (QueryEntity qryEntity : qryEntities)
+                entities.add(new VisorQueryEntity(qryEntity));
+
+        return entities;
+    }
+
+    /**
+     * Create data transfer object for given cache type metadata.
+     */
+    public VisorQueryEntity() {
+        // No-op.
+    }
+
+    /**
+     * Create data transfer object for given cache type metadata.
+     *
+     * @param q Actual cache query entities.
+     */
+    private VisorQueryEntity(QueryEntity q) {
+        assert q != null;
+
+        keyType = q.getKeyType();
+        valType = q.getValueType();
+
+        keyFields = toList(q.getKeyFields());
+
+        LinkedHashMap<String, String> qryFields = q.getFields();
+
+        qryFlds = new LinkedHashMap<>(qryFields);
+
+        aliases = U.copyMap(q.getAliases());
+
+        Collection<QueryIndex> qryIdxs = q.getIndexes();
+
+        grps = new ArrayList<>(qryIdxs.size());
+
+        for (QueryIndex qryIdx : qryIdxs)
+            grps.add(new VisorQueryIndex(qryIdx));
+    }
+
+    /**
+     * @return Key class used to store key in cache.
+     */
+    public String getKeyType() {
+        return keyType;
+    }
+
+    /**
+     * @return Value class used to store value in cache.
+     */
+    public String getValueType() {
+        return valType;
+    }
+
+    /**
+     * @return Key fields.
+     */
+    public List<String> getKeyFields() {
+        return keyFields;
+    }
+
+    /**
+     * @return Fields to be queried, in addition to indexed fields.
+     */
+    public Map<String, String> getQueryFields() {
+        return qryFlds;
+    }
+
+    /**
+     * @return Field aliases.
+     */
+    public Map<String, String> getAliases() {
+        return aliases;
+    }
+
+    /**
+     * @return Table name.
+     */
+    public String getTableName() {
+        return tblName;
+    }
+
+    /**
+     * @return Fields to create group indexes for.
+     */
+    public List<VisorQueryIndex> getGroups() {
+        return grps;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, keyType);
+        U.writeString(out, valType);
+        U.writeCollection(out, keyFields);
+        IgfsUtils.writeStringMap(out, qryFlds);
+        U.writeMap(out, aliases);
+        U.writeString(out, tblName);
+        U.writeCollection(out, grps);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        keyType = U.readString(in);
+        valType = U.readString(in);
+        keyFields = U.readList(in);
+        qryFlds = IgfsUtils.readStringMap(in);
+        aliases = U.readMap(in);
+        tblName = U.readString(in);
+        grps = U.readList(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorQueryEntity.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryField.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryField.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryField.java
index 18b0d71..ad84dda 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryField.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryField.java
@@ -17,15 +17,18 @@
 
 package org.apache.ignite.internal.visor.query;
 
-import java.io.Serializable;
-import org.apache.ignite.internal.LessNamingBean;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 /**
  * Data transfer object for query field type description.
  */
-public class VisorQueryField implements Serializable, LessNamingBean {
+public class VisorQueryField extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -42,6 +45,13 @@ public class VisorQueryField implements Serializable, LessNamingBean {
     private String fieldTypeName;
 
     /**
+     * Default constructor.
+     */
+    public VisorQueryField() {
+        // No-op.
+    }
+
+    /**
      * Create data transfer object with given parameters.
      *
      * @param schemaName Schema name.
@@ -59,28 +69,28 @@ public class VisorQueryField implements Serializable, LessNamingBean {
     /**
      * @return Schema name.
      */
-    public String schemaName() {
+    public String getSchemaName() {
         return schemaName;
     }
 
     /**
      * @return Type name.
      */
-    public String typeName() {
+    public String getTypeName() {
         return typeName;
     }
 
     /**
      * @return Field name.
      */
-    public String fieldName() {
+    public String getFieldName() {
         return fieldName;
     }
 
     /**
      * @return Field type name.
      */
-    public String fieldTypeName() {
+    public String getFieldTypeName() {
         return fieldTypeName;
     }
 
@@ -88,7 +98,7 @@ public class VisorQueryField implements Serializable, LessNamingBean {
      * @param schema If {@code true} then add schema name to full name.
      * @return Fully qualified field name with type name and schema name.
      */
-    public String fullName(boolean schema) {
+    public String getFullName(boolean schema) {
         if (!F.isEmpty(typeName)) {
             if (schema && !F.isEmpty(schemaName))
                 return schemaName + "." + typeName + "." + fieldName;
@@ -100,6 +110,22 @@ public class VisorQueryField implements Serializable, LessNamingBean {
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, schemaName);
+        U.writeString(out, typeName);
+        U.writeString(out, fieldName);
+        U.writeString(out, fieldTypeName);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        schemaName = U.readString(in);
+        typeName = U.readString(in);
+        fieldName = U.readString(in);
+        fieldTypeName = U.readString(in);
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorQueryField.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryIndex.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryIndex.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryIndex.java
new file mode 100644
index 0000000..d9fa2a4
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryIndex.java
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.query;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.List;
+import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.cache.QueryIndexType;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Data transfer object for {@link QueryIndex}.
+ */
+public class VisorQueryIndex extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Name of index. */
+    private String name;
+
+    /** Type of index. */
+    private QueryIndexType type;
+
+    /** Fields to create group indexes for. */
+    private List<VisorQueryIndexField> fields;
+
+    /**
+     * Create data transfer object for given cache type metadata.
+     */
+    public VisorQueryIndex() {
+        // No-op.
+    }
+
+    /**
+     * Create data transfer object for given cache type metadata.
+     *
+     * @param idx Actual cache query entity index.
+     */
+    public VisorQueryIndex(QueryIndex idx) {
+        assert idx != null;
+
+        name = idx.getName();
+        type = idx.getIndexType();
+        fields = VisorQueryIndexField.list(idx);
+    }
+
+    /**
+     * @return Name of index.
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * @return Type of index.
+     */
+    public QueryIndexType getType() {
+        return type;
+    }
+
+    /**
+     * @return Fields to create group indexes for.
+     */
+    public List<VisorQueryIndexField> getFields() {
+        return fields;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, name);
+        U.writeEnum(out, type);
+        U.writeCollection(out, fields);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        name = U.readString(in);
+        type = QueryIndexType.fromOrdinal(in.readByte());
+        fields = U.readList(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorQueryIndex.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryIndexField.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryIndexField.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryIndexField.java
new file mode 100644
index 0000000..fb32dd1
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryIndexField.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.query;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import org.apache.ignite.cache.QueryEntity;
+import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Data transfer object for {@link QueryEntity}.
+ */
+public class VisorQueryIndexField extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Index field name. */
+    private String fldName;
+
+    /** Index field sort order. */
+    private boolean fldSort;
+
+    /**
+     * Create data transfer object for given cache type metadata.
+     */
+    public VisorQueryIndexField() {
+        // No-op.
+    }
+
+    /**
+     * Create data transfer object for given cache type metadata.
+     *
+     * @param fldName Index field name.
+     * @param fldSort Index field sort order.
+     */
+    public VisorQueryIndexField(String fldName, boolean fldSort) {
+        this.fldName = fldName;
+        this.fldSort = fldSort;
+    }
+
+    /**
+     * @param idx Query entity index.
+     * @return Data transfer object for query entity index fields.
+     */
+    public static List<VisorQueryIndexField> list(QueryIndex idx) {
+        List<VisorQueryIndexField> res = new ArrayList<>();
+
+        for (Map.Entry<String, Boolean> field: idx.getFields().entrySet())
+            res.add(new VisorQueryIndexField(field.getKey(), !field.getValue()));
+
+        return res;
+    }
+
+    /**
+     * @return Index field name.
+     */
+    public String getFieldName() {
+        return fldName;
+    }
+
+    /**
+     * @return Index field sort order.
+     */
+    public boolean isFieldSort() {
+        return fldSort;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, fldName);
+        out.writeBoolean(fldSort);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        fldName = U.readString(in);
+        fldSort = in.readBoolean();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorQueryIndexField.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryJob.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryJob.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryJob.java
deleted file mode 100644
index 61ccac2..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryJob.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.visor.query;
-
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.UUID;
-import java.util.concurrent.ConcurrentMap;
-import javax.cache.Cache;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.cache.CachePeekMode;
-import org.apache.ignite.cache.query.QueryCursor;
-import org.apache.ignite.cache.query.ScanQuery;
-import org.apache.ignite.cache.query.SqlFieldsQuery;
-import org.apache.ignite.internal.processors.cache.GridCacheProcessor;
-import org.apache.ignite.internal.processors.query.GridQueryFieldMetadata;
-import org.apache.ignite.internal.processors.timeout.GridTimeoutObjectAdapter;
-import org.apache.ignite.internal.util.typedef.internal.S;
-import org.apache.ignite.internal.util.typedef.internal.U;
-import org.apache.ignite.internal.visor.VisorJob;
-import org.apache.ignite.internal.visor.util.VisorExceptionWrapper;
-import org.apache.ignite.lang.IgniteBiPredicate;
-import org.apache.ignite.lang.IgniteBiTuple;
-
-import static org.apache.ignite.internal.visor.query.VisorQueryUtils.RMV_DELAY;
-import static org.apache.ignite.internal.visor.query.VisorQueryUtils.SCAN_CACHE_WITH_FILTER;
-import static org.apache.ignite.internal.visor.query.VisorQueryUtils.SCAN_CACHE_WITH_FILTER_CASE_SENSITIVE;
-import static org.apache.ignite.internal.visor.query.VisorQueryUtils.SCAN_COL_NAMES;
-import static org.apache.ignite.internal.visor.query.VisorQueryUtils.SCAN_QRY_NAME;
-import static org.apache.ignite.internal.visor.query.VisorQueryUtils.SCAN_NEAR_CACHE;
-import static org.apache.ignite.internal.visor.query.VisorQueryUtils.SQL_QRY_NAME;
-import static org.apache.ignite.internal.visor.query.VisorQueryUtils.fetchScanQueryRows;
-import static org.apache.ignite.internal.visor.query.VisorQueryUtils.fetchSqlQueryRows;
-
-/**
- * Job for execute SCAN or SQL query and get first page of results.
- */
-public class VisorQueryJob extends VisorJob<VisorQueryArg, IgniteBiTuple<? extends VisorExceptionWrapper, VisorQueryResultEx>> {
-    /** */
-    private static final long serialVersionUID = 0L;
-
-    /**
-     * Create job with specified argument.
-     *
-     * @param arg Job argument.
-     * @param debug Debug flag.
-     */
-    protected VisorQueryJob(VisorQueryArg arg, boolean debug) {
-        super(arg, debug);
-    }
-
-    /**
-     * @param cacheName Cache name.
-     * @return Cache to execute query.
-     */
-    protected IgniteCache<Object, Object> cache(String cacheName) {
-        GridCacheProcessor cacheProcessor = ignite.context().cache();
-
-        return cacheProcessor.jcache(cacheName);
-    }
-
-    /**
-     * Execute scan query.
-     *
-     * @param c Cache to scan.
-     * @param arg Job argument with query parameters.
-     * @return Query cursor.
-     */
-    private QueryCursor<Cache.Entry<Object, Object>> scan(IgniteCache<Object, Object> c, VisorQueryArg arg,
-        IgniteBiPredicate<Object, Object> filter) {
-        ScanQuery<Object, Object> qry = new ScanQuery<>(filter);
-        qry.setPageSize(arg.pageSize());
-        qry.setLocal(arg.local());
-
-        return c.withKeepBinary().query(qry);
-    }
-
-    /**
-     * Scan near cache.
-     *
-     * @param c Cache to scan near entries.
-     * @return Cache entries iterator wrapped with query cursor.
-     */
-    private QueryCursor<Cache.Entry<Object, Object>> near(IgniteCache<Object, Object> c) {
-        return new VisorNearCacheCursor<>(c.localEntries(CachePeekMode.NEAR).iterator());
-    }
-
-    /** {@inheritDoc} */
-    @Override protected IgniteBiTuple<? extends VisorExceptionWrapper, VisorQueryResultEx> run(final VisorQueryArg arg) {
-        try {
-            UUID nid = ignite.localNode().id();
-
-            String qryTxt = arg.queryText();
-
-            boolean scan = qryTxt == null;
-
-            boolean scanWithFilter = qryTxt != null && qryTxt.startsWith(SCAN_CACHE_WITH_FILTER);
-
-            boolean near = qryTxt != null && qryTxt.startsWith(SCAN_NEAR_CACHE);
-
-            boolean scanAny = scan || scanWithFilter || near;
-
-            // Generate query ID to store query cursor in node local storage.
-            String qryId = (scanAny ? SCAN_QRY_NAME : SQL_QRY_NAME) + "-" + UUID.randomUUID();
-
-            IgniteCache<Object, Object> c = cache(arg.cacheName());
-
-            if (scanAny) {
-                long start = U.currentTimeMillis();
-
-                IgniteBiPredicate<Object, Object> filter = null;
-
-                if (scanWithFilter) {
-                    boolean caseSensitive = qryTxt.startsWith(SCAN_CACHE_WITH_FILTER_CASE_SENSITIVE);
-
-                    String ptrn =  qryTxt.substring(caseSensitive
-                        ? SCAN_CACHE_WITH_FILTER_CASE_SENSITIVE.length()
-                        : SCAN_CACHE_WITH_FILTER.length());
-
-                    filter = new VisorQueryScanSubstringFilter(caseSensitive, ptrn);
-                }
-
-                VisorQueryCursor<Cache.Entry<Object, Object>> cur = new VisorQueryCursor<>(near ? near(c) : scan(c, arg, filter));
-
-                List<Object[]> rows = fetchScanQueryRows(cur, arg.pageSize());
-
-                long duration = U.currentTimeMillis() - start; // Scan duration + fetch duration.
-
-                boolean hasNext = cur.hasNext();
-
-                if (hasNext) {
-                    ignite.cluster().<String, VisorQueryCursor>nodeLocalMap().put(qryId, cur);
-
-                    scheduleResultSetHolderRemoval(qryId);
-                }
-                else
-                    cur.close();
-
-                return new IgniteBiTuple<>(null, new VisorQueryResultEx(nid, qryId, SCAN_COL_NAMES, rows, hasNext,
-                    duration));
-            }
-            else {
-                SqlFieldsQuery qry = new SqlFieldsQuery(arg.queryText());
-                qry.setPageSize(arg.pageSize());
-                qry.setDistributedJoins(arg.distributedJoins());
-                qry.setEnforceJoinOrder(arg.enforceJoinOrder());
-                qry.setLocal(arg.local());
-
-                long start = U.currentTimeMillis();
-
-                VisorQueryCursor<List<?>> cur = new VisorQueryCursor<>(c.withKeepBinary().query(qry));
-
-                Collection<GridQueryFieldMetadata> meta = cur.fieldsMeta();
-
-                if (meta == null)
-                    return new IgniteBiTuple<>(
-                        new VisorExceptionWrapper(new SQLException("Fail to execute query. No metadata available.")), null);
-                else {
-                    List<VisorQueryField> names = new ArrayList<>(meta.size());
-
-                    for (GridQueryFieldMetadata col : meta)
-                        names.add(new VisorQueryField(col.schemaName(), col.typeName(),
-                            col.fieldName(), col.fieldTypeName()));
-
-                    List<Object[]> rows = fetchSqlQueryRows(cur, arg.pageSize());
-
-                    long duration = U.currentTimeMillis() - start; // Query duration + fetch duration.
-
-                    boolean hasNext = cur.hasNext();
-
-                    if (hasNext) {
-                        ignite.cluster().<String, VisorQueryCursor<List<?>>>nodeLocalMap().put(qryId, cur);
-
-                        scheduleResultSetHolderRemoval(qryId);
-                    }
-                    else
-                        cur.close();
-
-                    return new IgniteBiTuple<>(null, new VisorQueryResultEx(nid, qryId, names, rows, hasNext, duration));
-                }
-            }
-        }
-        catch (Throwable e) {
-            return new IgniteBiTuple<>(new VisorExceptionWrapper(e), null);
-        }
-    }
-
-    /**
-     * @param qryId Unique query result id.
-     */
-    private void scheduleResultSetHolderRemoval(final String qryId) {
-        ignite.context().timeout().addTimeoutObject(new GridTimeoutObjectAdapter(RMV_DELAY) {
-            @Override public void onTimeout() {
-                ConcurrentMap<String, VisorQueryCursor> storage = ignite.cluster().nodeLocalMap();
-
-                VisorQueryCursor cur = storage.get(qryId);
-
-                if (cur != null) {
-                    // If cursor was accessed since last scheduling, set access flag to false and reschedule.
-                    if (cur.accessed()) {
-                        cur.accessed(false);
-
-                        scheduleResultSetHolderRemoval(qryId);
-                    }
-                    else {
-                        // Remove stored cursor otherwise.
-                        storage.remove(qryId);
-
-                        cur.close();
-                    }
-                }
-            }
-        });
-    }
-
-    /** {@inheritDoc} */
-    @Override public String toString() {
-        return S.toString(VisorQueryJob.class, this);
-    }
-
-    /**
-     * Wrapper for cache iterator to behave like {@link QueryCursor}.
-     */
-    private static class VisorNearCacheCursor<T> implements QueryCursor<T> {
-        /** Wrapped iterator.  */
-        private final Iterator<T> it;
-
-        /**
-         * Wrapping constructor.
-         *
-         * @param it Near cache iterator to wrap.
-         */
-        private VisorNearCacheCursor(Iterator<T> it) {
-            this.it = it;
-        }
-
-        /** {@inheritDoc} */
-        @Override public List<T> getAll() {
-            List<T> all = new ArrayList<>();
-
-            while(it.hasNext())
-                all.add(it.next());
-
-            return all;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void close() {
-            // Nothing to close.
-        }
-
-        /** {@inheritDoc} */
-        @Override public Iterator<T> iterator() {
-            return it;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryMetrics.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryMetrics.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryMetrics.java
new file mode 100644
index 0000000..f878ab6
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryMetrics.java
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.query;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.cache.query.QueryMetrics;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Data transfer object for cache query metrics.
+ */
+public class VisorQueryMetrics extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Minimum execution time of query. */
+    private long minTime;
+
+    /** Maximum execution time of query. */
+    private long maxTime;
+
+    /** Average execution time of query. */
+    private double avgTime;
+
+    /** Number of executions. */
+    private int execs;
+
+    /** Total number of times a query execution failed. */
+    private int fails;
+
+    /**
+     * Default constructor.
+     */
+    public VisorQueryMetrics() {
+        // No-op.
+    }
+
+    /**
+     * Create data transfer object for given cache metrics.
+     * @param m Cache query metrics.
+     */
+    public VisorQueryMetrics(QueryMetrics m) {
+        minTime = m.minimumTime();
+        maxTime = m.maximumTime();
+        avgTime = m.averageTime();
+        execs = m.executions();
+        fails = m.fails();
+    }
+
+    /**
+     * @return Minimum execution time of query.
+     */
+    public long getMinimumTime() {
+        return minTime;
+    }
+
+    /**
+     * @return Maximum execution time of query.
+     */
+    public long getMaximumTime() {
+        return maxTime;
+    }
+
+    /**
+     * @return Average execution time of query.
+     */
+    public double getAverageTime() {
+        return avgTime;
+    }
+
+    /**
+     * @return Number of executions.
+     */
+    public int getExecutions() {
+        return execs;
+    }
+
+    /**
+     * @return Total number of times a query execution failed.
+     */
+    public int getFailures() {
+        return fails;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeLong(minTime);
+        out.writeLong(maxTime);
+        out.writeDouble(avgTime);
+        out.writeInt(execs);
+        out.writeInt(fails);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        minTime = in.readLong();
+        maxTime = in.readLong();
+        avgTime = in.readDouble();
+        execs = in.readInt();
+        fails = in.readInt();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorQueryMetrics.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryNextPageTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryNextPageTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryNextPageTask.java
index 52a167d..4684c49 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryNextPageTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryNextPageTask.java
@@ -26,25 +26,24 @@ import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.internal.visor.VisorJob;
 import org.apache.ignite.internal.visor.VisorOneNodeTask;
-import org.apache.ignite.lang.IgniteBiTuple;
 
 /**
  * Task for collecting next page previously executed SQL or SCAN query.
  */
 @GridInternal
-public class VisorQueryNextPageTask extends VisorOneNodeTask<IgniteBiTuple<String, Integer>, VisorQueryResult> {
+public class VisorQueryNextPageTask extends VisorOneNodeTask<VisorQueryNextPageTaskArg, VisorQueryResult> {
     /** */
     private static final long serialVersionUID = 0L;
 
     /** {@inheritDoc} */
-    @Override protected VisorQueryNextPageJob job(IgniteBiTuple<String, Integer> arg) {
+    @Override protected VisorQueryNextPageJob job(VisorQueryNextPageTaskArg arg) {
         return new VisorQueryNextPageJob(arg, debug);
     }
 
     /**
      * Job for collecting next page previously executed SQL or SCAN query.
      */
-    private static class VisorQueryNextPageJob extends VisorJob<IgniteBiTuple<String, Integer>, VisorQueryResult> {
+    private static class VisorQueryNextPageJob extends VisorJob<VisorQueryNextPageTaskArg, VisorQueryResult> {
         /** */
         private static final long serialVersionUID = 0L;
 
@@ -54,13 +53,13 @@ public class VisorQueryNextPageTask extends VisorOneNodeTask<IgniteBiTuple<Strin
          * @param arg Job argument.
          * @param debug Debug flag.
          */
-        private VisorQueryNextPageJob(IgniteBiTuple<String, Integer> arg, boolean debug) {
+        private VisorQueryNextPageJob(VisorQueryNextPageTaskArg arg, boolean debug) {
             super(arg, debug);
         }
 
         /** {@inheritDoc} */
-        @Override protected VisorQueryResult run(IgniteBiTuple<String, Integer> arg) {
-            return arg.get1().startsWith(VisorQueryUtils.SCAN_QRY_NAME) ? nextScanPage(arg) : nextSqlPage(arg);
+        @Override protected VisorQueryResult run(VisorQueryNextPageTaskArg arg) {
+            return arg.getQueryId().startsWith(VisorQueryUtils.SCAN_QRY_NAME) ? nextScanPage(arg) : nextSqlPage(arg);
         }
 
         /**
@@ -69,19 +68,19 @@ public class VisorQueryNextPageTask extends VisorOneNodeTask<IgniteBiTuple<Strin
          * @param arg Query name and page size.
          * @return Query result with next page.
          */
-        private VisorQueryResult nextSqlPage(IgniteBiTuple<String, Integer> arg) {
+        private VisorQueryResult nextSqlPage(VisorQueryNextPageTaskArg arg) {
             long start = U.currentTimeMillis();
 
             ConcurrentMap<String, VisorQueryCursor<List<?>>> storage = ignite.cluster().nodeLocalMap();
 
-            String qryId = arg.get1();
+            String qryId = arg.getQueryId();
 
             VisorQueryCursor<List<?>> cur = storage.get(qryId);
 
             if (cur == null)
                 throw new IgniteException("SQL query results are expired.");
 
-            List<Object[]> nextRows = VisorQueryUtils.fetchSqlQueryRows(cur, arg.get2());
+            List<Object[]> nextRows = VisorQueryUtils.fetchSqlQueryRows(cur, arg.getPageSize());
 
             boolean hasMore = cur.hasNext();
 
@@ -93,7 +92,8 @@ public class VisorQueryNextPageTask extends VisorOneNodeTask<IgniteBiTuple<Strin
                 cur.close();
             }
 
-            return new VisorQueryResult(nextRows, hasMore, U.currentTimeMillis() - start);
+            return new VisorQueryResult(ignite.localNode().id(), qryId, null, nextRows, hasMore,
+                U.currentTimeMillis() - start);
         }
 
         /**
@@ -102,19 +102,19 @@ public class VisorQueryNextPageTask extends VisorOneNodeTask<IgniteBiTuple<Strin
          * @param arg Query name and page size.
          * @return Next page with data.
          */
-        private VisorQueryResult nextScanPage(IgniteBiTuple<String, Integer> arg) {
+        private VisorQueryResult nextScanPage(VisorQueryNextPageTaskArg arg) {
             long start = U.currentTimeMillis();
 
             ConcurrentMap<String, VisorQueryCursor<Cache.Entry<Object, Object>>> storage = ignite.cluster().nodeLocalMap();
 
-            String qryId = arg.get1();
+            String qryId = arg.getQueryId();
 
             VisorQueryCursor<Cache.Entry<Object, Object>> cur = storage.get(qryId);
 
             if (cur == null)
                 throw new IgniteException("Scan query results are expired.");
 
-            List<Object[]> rows = VisorQueryUtils.fetchScanQueryRows(cur, arg.get2());
+            List<Object[]> rows = VisorQueryUtils.fetchScanQueryRows(cur, arg.getPageSize());
 
             boolean hasMore = cur.hasNext();
 
@@ -126,7 +126,8 @@ public class VisorQueryNextPageTask extends VisorOneNodeTask<IgniteBiTuple<Strin
                 cur.close();
             }
 
-            return new VisorQueryResult(rows, hasMore, U.currentTimeMillis() - start);
+            return new VisorQueryResult(ignite.localNode().id(), qryId, null, rows, hasMore,
+                U.currentTimeMillis() - start);
         }
 
         /** {@inheritDoc} */
@@ -134,4 +135,4 @@ public class VisorQueryNextPageTask extends VisorOneNodeTask<IgniteBiTuple<Strin
             return S.toString(VisorQueryNextPageJob.class, this);
         }
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryNextPageTaskArg.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryNextPageTaskArg.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryNextPageTaskArg.java
new file mode 100644
index 0000000..d0f62b9
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryNextPageTaskArg.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.query;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Arguments for {@link VisorQueryNextPageTask}.
+ */
+public class VisorQueryNextPageTaskArg extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** ID of query execution. */
+    private String qryId;
+
+    /** Number of rows to load. */
+    private int pageSize;
+
+    /**
+     * Default constructor.
+     */
+    public VisorQueryNextPageTaskArg() {
+        // No-op.
+    }
+
+    /**
+     * @param qryId ID of query execution.
+     * @param pageSize Number of rows to load.
+     */
+    public VisorQueryNextPageTaskArg(String qryId, int pageSize) {
+        this.qryId = qryId;
+        this.pageSize = pageSize;
+    }
+
+    /**
+     * @return ID of query execution.
+     */
+    public String getQueryId() {
+        return qryId;
+    }
+
+    /**
+     * @return Number of rows to load.
+     */
+    public int getPageSize() {
+        return pageSize;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, qryId);
+        out.writeInt(pageSize);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        qryId = U.readString(in);
+        pageSize = in.readInt();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorQueryNextPageTaskArg.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryResetDetailMetricsTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryResetDetailMetricsTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryResetDetailMetricsTask.java
new file mode 100644
index 0000000..6d35e32
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryResetDetailMetricsTask.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.query;
+
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.internal.processors.task.GridInternal;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.visor.VisorJob;
+import org.apache.ignite.internal.visor.VisorOneNodeTask;
+
+/**
+ * Reset query detail metrics.
+ */
+@GridInternal
+public class VisorQueryResetDetailMetricsTask extends VisorOneNodeTask<Void, Void> {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** {@inheritDoc} */
+    @Override protected VisorCacheResetQueryDetailMetricsJob job(Void arg) {
+        return new VisorCacheResetQueryDetailMetricsJob(arg, debug);
+    }
+
+    /**
+     * Job that reset query detail metrics.
+     */
+    private static class VisorCacheResetQueryDetailMetricsJob extends VisorJob<Void, Void> {
+        /** */
+        private static final long serialVersionUID = 0L;
+
+        /**
+         * @param arg Task argument.
+         * @param debug Debug flag.
+         */
+        private VisorCacheResetQueryDetailMetricsJob(Void arg, boolean debug) {
+            super(arg, debug);
+        }
+
+        /** {@inheritDoc} */
+        @Override protected Void run(Void arg) {
+            for (String cacheName : ignite.cacheNames()) {
+                IgniteCache cache = ignite.cache(cacheName);
+
+                if (cache != null)
+                    cache.resetQueryDetailMetrics();
+            }
+
+            return null;
+        }
+
+        /** {@inheritDoc} */
+        @Override public String toString() {
+            return S.toString(VisorCacheResetQueryDetailMetricsJob.class, this);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryResetMetricsTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryResetMetricsTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryResetMetricsTask.java
new file mode 100644
index 0000000..3c5c668
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryResetMetricsTask.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.query;
+
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.internal.processors.task.GridInternal;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.visor.VisorJob;
+import org.apache.ignite.internal.visor.VisorOneNodeTask;
+
+/**
+ * Reset compute grid query metrics.
+ */
+@GridInternal
+public class VisorQueryResetMetricsTask extends VisorOneNodeTask<String, Void> {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** {@inheritDoc} */
+    @Override protected VisorQueryResetMetricsJob job(String arg) {
+        return new VisorQueryResetMetricsJob(arg, debug);
+    }
+
+    /**
+     * Job that reset cache query metrics.
+     */
+    private static class VisorQueryResetMetricsJob extends VisorJob<String, Void> {
+        /** */
+        private static final long serialVersionUID = 0L;
+
+        /**
+         * @param arg Cache name to reset query metrics for.
+         * @param debug Debug flag.
+         */
+        private VisorQueryResetMetricsJob(String arg, boolean debug) {
+            super(arg, debug);
+        }
+
+        /** {@inheritDoc} */
+        @Override protected Void run(String cacheName) {
+            IgniteCache cache = ignite.cache(cacheName);
+
+            if (cache != null)
+                cache.resetQueryMetrics();
+
+            return null;
+        }
+
+        /** {@inheritDoc} */
+        @Override public String toString() {
+            return S.toString(VisorQueryResetMetricsJob.class, this);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryResult.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryResult.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryResult.java
index 21d1ed7..f7beae2 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryResult.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryResult.java
@@ -17,62 +17,135 @@
 
 package org.apache.ignite.internal.visor.query;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Collection;
 import java.util.List;
-import org.apache.ignite.internal.LessNamingBean;
+import java.util.UUID;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 /**
  * Result for cache query tasks.
  */
-public class VisorQueryResult implements Serializable, LessNamingBean {
+public class VisorQueryResult extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
+    /** Node where query executed. */
+    private UUID resNodeId;
+
+    /** Query ID to store in node local. */
+    private String qryId;
+
+    /** Query columns descriptors. */
+    private List<VisorQueryField> cols;
+
     /** Rows fetched from query. */
-    private final List<Object[]> rows;
+    private List<Object[]> rows;
 
     /** Whether query has more rows to fetch. */
-    private final boolean hasMore;
+    private boolean hasMore;
 
     /** Query duration */
-    private final long duration;
+    private long duration;
+
+    /**
+     * Default constructor.
+     */
+    public VisorQueryResult() {
+        // No-op.
+    }
 
     /**
-     * Create task result with given parameters
-     *
+     * @param resNodeId Node where query executed.
+     * @param qryId Query ID for future extraction in nextPage() access.
+     * @param cols Columns descriptors.
      * @param rows Rows fetched from query.
      * @param hasMore Whether query has more rows to fetch.
      * @param duration Query duration.
      */
-    public VisorQueryResult(List<Object[]> rows, boolean hasMore, long duration) {
+    public VisorQueryResult(
+        UUID resNodeId,
+        String qryId,
+        List<VisorQueryField> cols,
+        List<Object[]> rows,
+        boolean hasMore,
+        long duration
+    ) {
+        this.resNodeId = resNodeId;
+        this.qryId = qryId;
+        this.cols = cols;
         this.rows = rows;
         this.hasMore = hasMore;
         this.duration = duration;
     }
 
     /**
+     * @return Response node id.
+     */
+    public UUID getResponseNodeId() {
+        return resNodeId;
+    }
+
+    /**
+     * @return Query id.
+     */
+    public String getQueryId() {
+        return qryId;
+    }
+
+    /**
+     * @return Columns.
+     */
+    public Collection<VisorQueryField> getColumns() {
+        return cols;
+    }
+
+    /**
      * @return Rows fetched from query.
      */
-    public List<Object[]> rows() {
+    public List<Object[]> getRows() {
         return rows;
     }
 
     /**
      * @return Whether query has more rows to fetch.
      */
-    public boolean hasMore() {
+    public boolean isHasMore() {
         return hasMore;
     }
 
     /**
      * @return Duration of next page fetching.
      */
-    public long duration() {
+    public long getDuration() {
         return duration;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeUuid(out, resNodeId);
+        U.writeString(out, qryId);
+        U.writeCollection(out, cols);
+        U.writeCollection(out, rows);
+        out.writeBoolean(hasMore);
+        out.writeLong(duration);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        resNodeId = U.readUuid(in);
+        qryId = U.readString(in);
+        cols = U.readList(in);
+        rows = U.readList(in);
+        hasMore = in.readBoolean();
+        duration = in.readLong();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorQueryResult.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryResultEx.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryResultEx.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryResultEx.java
deleted file mode 100644
index 218cb36..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryResultEx.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.visor.query;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.UUID;
-import org.apache.ignite.internal.util.typedef.internal.S;
-
-/**
- * Result for cache query tasks.
- */
-public class VisorQueryResultEx extends VisorQueryResult {
-    /** */
-    private static final long serialVersionUID = 0L;
-
-    /** Node where query executed. */
-    private final UUID resNodeId;
-
-    /** Query ID to store in node local. */
-    private final String qryId;
-
-    /** Query columns descriptors. */
-    private final Collection<VisorQueryField> cols;
-
-    /**
-     * @param resNodeId Node where query executed.
-     * @param qryId Query ID for future extraction in nextPage() access.
-     * @param cols Columns descriptors.
-     * @param rows Rows fetched from query.
-     * @param hasMore Whether query has more rows to fetch.
-     * @param duration Query duration.
-     */
-    public VisorQueryResultEx(
-        UUID resNodeId,
-        String qryId,
-        Collection<VisorQueryField> cols,
-        List<Object[]> rows,
-        boolean hasMore,
-        long duration
-    ) {
-        super(rows, hasMore, duration);
-
-        this.resNodeId = resNodeId;
-        this.qryId = qryId;
-        this.cols = cols;
-    }
-
-    /**
-     * @return Response node id.
-     */
-    public UUID responseNodeId() {
-        return resNodeId;
-    }
-
-    /**
-     * @return Query id.
-     */
-    public String queryId() {
-        return qryId;
-    }
-
-    /**
-     * @return Columns.
-     */
-    public Collection<VisorQueryField> columns() {
-        return cols;
-    }
-
-    /** {@inheritDoc} */
-    @Override public String toString() {
-        return S.toString(VisorQueryResultEx.class, this);
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryScanRegexFilter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryScanRegexFilter.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryScanRegexFilter.java
new file mode 100644
index 0000000..fa4a596
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/query/VisorQueryScanRegexFilter.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.query;
+
+import java.util.regex.Pattern;
+import org.apache.ignite.binary.BinaryObject;
+import org.apache.ignite.lang.IgniteBiPredicate;
+
+/**
+ * Filter scan results by specified substring in string presentation of key or value.
+ */
+public class VisorQueryScanRegexFilter implements IgniteBiPredicate<Object, Object> {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Regex pattern to search data. */
+    private final Pattern ptrn;
+
+    /**
+     * Create filter instance.
+     *
+     * @param caseSensitive Case sensitive flag.
+     * @param regex Regex search flag.
+     * @param ptrn String to search in string presentation of key or value.
+     */
+    public VisorQueryScanRegexFilter(boolean caseSensitive, boolean regex, String ptrn) {
+        int flags = caseSensitive ? 0 : Pattern.CASE_INSENSITIVE;
+
+        this.ptrn = Pattern.compile(regex ? ptrn : ".*?" + Pattern.quote(ptrn) + ".*?", flags);
+    }
+    /**
+     * Check that key or value contains specified string.
+     *
+     * @param key Key object.
+     * @param val Value object.
+     * @return {@code true} when string presentation of key or value contain specified string.
+     */
+    @Override public boolean apply(Object key, Object val) {
+        String k = key instanceof BinaryObject ? VisorQueryUtils.binaryToString((BinaryObject)key) : key.toString();
+        String v = val instanceof BinaryObject ? VisorQueryUtils.binaryToString((BinaryObject)val) : val.toString();
+
+        return ptrn.matcher(k).find() || ptrn.matcher(v).find();
+    }
+}


[06/11] ignite git commit: IGNITE-4988 Cleanup and refactor VisorXxx tasks and DTO for ignite-2.0

Posted by ak...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorAtomicConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorAtomicConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorAtomicConfiguration.java
index a6d8c4c..79b468d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorAtomicConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorAtomicConfiguration.java
@@ -17,16 +17,19 @@
 
 package org.apache.ignite.internal.visor.node;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.apache.ignite.cache.CacheMode;
 import org.apache.ignite.configuration.AtomicConfiguration;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 /**
  * Data transfer object for configuration of atomic data structures.
  */
-public class VisorAtomicConfiguration implements Serializable, LessNamingBean {
+public class VisorAtomicConfiguration extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -40,43 +43,59 @@ public class VisorAtomicConfiguration implements Serializable, LessNamingBean {
     private int backups;
 
     /**
+     * Default constructor.
+     */
+    public VisorAtomicConfiguration() {
+        // No-op.
+    }
+
+    /**
      * Create data transfer object for atomic configuration.
      *
      * @param src Atomic configuration.
-     * @return Data transfer object.
      */
-    public static VisorAtomicConfiguration from(AtomicConfiguration src) {
-        VisorAtomicConfiguration cfg = new VisorAtomicConfiguration();
-
-        cfg.seqReserveSize = src.getAtomicSequenceReserveSize();
-        cfg.cacheMode = src.getCacheMode();
-        cfg.backups = src.getBackups();
-
-        return cfg;
+    public VisorAtomicConfiguration(AtomicConfiguration src) {
+        seqReserveSize = src.getAtomicSequenceReserveSize();
+        cacheMode = src.getCacheMode();
+        backups = src.getBackups();
     }
 
     /**
      * @return Atomic sequence reservation size.
      */
-    public int atomicSequenceReserveSize() {
+    public int getAtomicSequenceReserveSize() {
         return seqReserveSize;
     }
 
     /**
      * @return Cache mode.
      */
-    public CacheMode cacheMode() {
+    public CacheMode getCacheMode() {
         return cacheMode;
     }
 
     /**
      * @return Number of backup nodes.
      */
-    public int backups() {
+    public int getBackups() {
         return backups;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeInt(seqReserveSize);
+        U.writeEnum(out, cacheMode);
+        out.writeInt(backups);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        seqReserveSize = in.readInt();
+        cacheMode = CacheMode.fromOrdinal(in.readByte());
+        backups = in.readInt();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorAtomicConfiguration.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorBasicConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorBasicConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorBasicConfiguration.java
index 0dae4da..a70cfdd 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorBasicConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorBasicConfiguration.java
@@ -17,12 +17,16 @@
 
 package org.apache.ignite.internal.visor.node;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.UUID;
+import org.apache.ignite.configuration.DeploymentMode;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.IgniteEx;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 import org.jetbrains.annotations.Nullable;
 
 import static java.lang.System.getProperty;
@@ -38,12 +42,11 @@ import static org.apache.ignite.IgniteSystemProperties.IGNITE_SUCCESS_FILE;
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_UPDATE_NOTIFIER;
 import static org.apache.ignite.internal.visor.util.VisorTaskUtils.boolValue;
 import static org.apache.ignite.internal.visor.util.VisorTaskUtils.compactClass;
-import static org.apache.ignite.internal.visor.util.VisorTaskUtils.compactObject;
 
 /**
  * Data transfer object for node basic configuration properties.
  */
-public class VisorBasicConfiguration implements Serializable, LessNamingBean {
+public class VisorBasicConfiguration extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -63,7 +66,7 @@ public class VisorBasicConfiguration implements Serializable, LessNamingBean {
     private String marsh;
 
     /** Deployment Mode. */
-    private Object deployMode;
+    private DeploymentMode deployMode;
 
     /** Client mode flag. */
     private Boolean clientMode;
@@ -111,186 +114,240 @@ public class VisorBasicConfiguration implements Serializable, LessNamingBean {
     private boolean updateNtf;
 
     /**
+     * Default constructor.
+     */
+    public VisorBasicConfiguration() {
+        // No-op.
+    }
+
+    /**
+     * Create data transfer object for node basic configuration properties.
+     *
      * @param ignite Grid.
      * @param c Grid configuration.
-     * @return Data transfer object for node basic configuration properties.
      */
-    public static VisorBasicConfiguration from(IgniteEx ignite, IgniteConfiguration c) {
-        VisorBasicConfiguration cfg = new VisorBasicConfiguration();
-
-        cfg.igniteInstanceName = c.getIgniteInstanceName();
-        cfg.ggHome = getProperty(IGNITE_HOME, c.getIgniteHome());
-        cfg.locHost = getProperty(IGNITE_LOCAL_HOST, c.getLocalHost());
-        cfg.nodeId = ignite.localNode().id();
-        cfg.marsh = compactClass(c.getMarshaller());
-        cfg.deployMode = compactObject(c.getDeploymentMode());
-        cfg.clientMode = c.isClientMode();
-        cfg.daemon = boolValue(IGNITE_DAEMON, c.isDaemon());
-        cfg.jmxRemote = ignite.isJmxRemoteEnabled();
-        cfg.restart = ignite.isRestartEnabled();
-        cfg.netTimeout = c.getNetworkTimeout();
-        cfg.log = compactClass(c.getGridLogger());
-        cfg.discoStartupDelay = c.getDiscoveryStartupDelay();
-        cfg.mBeanSrv = compactClass(c.getMBeanServer());
-        cfg.noAscii = boolValue(IGNITE_NO_ASCII, false);
-        cfg.noDiscoOrder = boolValue(IGNITE_NO_DISCO_ORDER, false);
-        cfg.noShutdownHook = boolValue(IGNITE_NO_SHUTDOWN_HOOK, false);
-        cfg.progName = getProperty(IGNITE_PROG_NAME);
-        cfg.quiet = boolValue(IGNITE_QUIET, true);
-        cfg.successFile = getProperty(IGNITE_SUCCESS_FILE);
-        cfg.updateNtf = boolValue(IGNITE_UPDATE_NOTIFIER, true);
-
-        return cfg;
+    public VisorBasicConfiguration(IgniteEx ignite, IgniteConfiguration c) {
+        igniteInstanceName = c.getIgniteInstanceName();
+        ggHome = getProperty(IGNITE_HOME, c.getIgniteHome());
+        locHost = getProperty(IGNITE_LOCAL_HOST, c.getLocalHost());
+        nodeId = ignite.localNode().id();
+        marsh = compactClass(c.getMarshaller());
+        deployMode = c.getDeploymentMode();
+        clientMode = c.isClientMode();
+        daemon = boolValue(IGNITE_DAEMON, c.isDaemon());
+        jmxRemote = ignite.isJmxRemoteEnabled();
+        restart = ignite.isRestartEnabled();
+        netTimeout = c.getNetworkTimeout();
+        log = compactClass(c.getGridLogger());
+        discoStartupDelay = c.getDiscoveryStartupDelay();
+        mBeanSrv = compactClass(c.getMBeanServer());
+        noAscii = boolValue(IGNITE_NO_ASCII, false);
+        noDiscoOrder = boolValue(IGNITE_NO_DISCO_ORDER, false);
+        noShutdownHook = boolValue(IGNITE_NO_SHUTDOWN_HOOK, false);
+        progName = getProperty(IGNITE_PROG_NAME);
+        quiet = boolValue(IGNITE_QUIET, true);
+        successFile = getProperty(IGNITE_SUCCESS_FILE);
+        updateNtf = boolValue(IGNITE_UPDATE_NOTIFIER, true);
     }
 
     /**
      * @return Ignite instance name.
      */
-    @Nullable public String igniteInstanceName() {
+    @Nullable public String getIgniteInstanceName() {
         return igniteInstanceName;
     }
 
     /**
      * @return IGNITE_HOME determined at startup.
      */
-    @Nullable public String ggHome() {
+    @Nullable public String getGgHome() {
         return ggHome;
     }
 
     /**
      * @return Local host value used.
      */
-    @Nullable public String localHost() {
+    @Nullable public String getLocalHost() {
         return locHost;
     }
 
     /**
      * @return Node id.
      */
-    public UUID nodeId() {
+    public UUID getNodeId() {
         return nodeId;
     }
 
     /**
      * @return Marshaller used.
      */
-    public String marshaller() {
+    public String getMarshaller() {
         return marsh;
     }
 
     /**
      * @return Deployment Mode.
      */
-    public Object deploymentMode() {
+    public Object getDeploymentMode() {
         return deployMode;
     }
 
     /**
      * @return Client mode flag.
      */
-    public Boolean clientMode() {
+    public Boolean isClientMode() {
         return clientMode;
     }
 
     /**
      * @return Whether this node daemon or not.
      */
-    public boolean daemon() {
+    public boolean isDaemon() {
         return daemon;
     }
 
     /**
      * @return Whether remote JMX is enabled.
      */
-    public boolean jmxRemote() {
+    public boolean isJmxRemote() {
         return jmxRemote;
     }
 
     /**
      * @return Is node restart enabled.
      */
-    public boolean restart() {
+    public boolean isRestart() {
         return restart;
     }
 
     /**
      * @return Network timeout.
      */
-    public long networkTimeout() {
+    public long getNetworkTimeout() {
         return netTimeout;
     }
 
     /**
      * @return Logger used on node.
      */
-    public String logger() {
+    public String getLogger() {
         return log;
     }
 
     /**
      * @return Discovery startup delay.
      */
-    public long discoStartupDelay() {
+    public long getDiscoStartupDelay() {
         return discoStartupDelay;
     }
 
     /**
      * @return MBean server name
      */
-    @Nullable public String mBeanServer() {
+    @Nullable public String getMBeanServer() {
         return mBeanSrv;
     }
 
     /**
      * @return Whether ASCII logo is disabled.
      */
-    public boolean noAscii() {
+    public boolean isNoAscii() {
         return noAscii;
     }
 
     /**
      * @return Whether no discovery order is allowed.
      */
-    public boolean noDiscoOrder() {
+    public boolean isNoDiscoOrder() {
         return noDiscoOrder;
     }
 
     /**
      * @return Whether shutdown hook is disabled.
      */
-    public boolean noShutdownHook() {
+    public boolean isNoShutdownHook() {
         return noShutdownHook;
     }
 
     /**
      * @return Name of command line program.
      */
-    public String programName() {
+    public String getProgramName() {
         return progName;
     }
 
     /**
      * @return Whether node is in quiet mode.
      */
-    public boolean quiet() {
+    public boolean isQuiet() {
         return quiet;
     }
 
     /**
      * @return Success file name.
      */
-    public String successFile() {
+    public String getSuccessFile() {
         return successFile;
     }
 
     /**
      * @return Whether update checker is enabled.
      */
-    public boolean updateNotifier() {
+    public boolean isUpdateNotifier() {
         return updateNtf;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, igniteInstanceName);
+        U.writeString(out, ggHome);
+        U.writeString(out, locHost);
+        U.writeUuid(out, nodeId);
+        U.writeString(out, marsh);
+        U.writeEnum(out, deployMode);
+        out.writeObject(clientMode);
+        out.writeBoolean(daemon);
+        out.writeBoolean(jmxRemote);
+        out.writeBoolean(restart);
+        out.writeLong(netTimeout);
+        U.writeString(out, log);
+        out.writeLong(discoStartupDelay);
+        U.writeString(out, mBeanSrv);
+        out.writeBoolean(noAscii);
+        out.writeBoolean(noDiscoOrder);
+        out.writeBoolean(noShutdownHook);
+        U.writeString(out, progName);
+        out.writeBoolean(quiet);
+        U.writeString(out, successFile);
+        out.writeBoolean(updateNtf);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        igniteInstanceName = U.readString(in);
+        ggHome = U.readString(in);
+        locHost = U.readString(in);
+        nodeId = U.readUuid(in);
+        marsh = U.readString(in);
+        deployMode = DeploymentMode.fromOrdinal(in.readByte());
+        clientMode = (Boolean)in.readObject();
+        daemon = in.readBoolean();
+        jmxRemote = in.readBoolean();
+        restart = in.readBoolean();
+        netTimeout = in.readLong();
+        log = U.readString(in);
+        discoStartupDelay = in.readLong();
+        mBeanSrv = U.readString(in);
+        noAscii = in.readBoolean();
+        noDiscoOrder = in.readBoolean();
+        noShutdownHook = in.readBoolean();
+        progName = U.readString(in);
+        quiet = in.readBoolean();
+        successFile = U.readString(in);
+        updateNtf = in.readBoolean();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorBasicConfiguration.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorExecutorServiceConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorExecutorServiceConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorExecutorServiceConfiguration.java
index df083f5..0ad9288 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorExecutorServiceConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorExecutorServiceConfiguration.java
@@ -17,16 +17,18 @@
 
 package org.apache.ignite.internal.visor.node;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.apache.ignite.configuration.ConnectorConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 /**
  * Data transfer object for node executors configuration properties.
  */
-public class VisorExecutorServiceConfiguration implements Serializable, LessNamingBean {
+public class VisorExecutorServiceConfiguration extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -45,73 +47,110 @@ public class VisorExecutorServiceConfiguration implements Serializable, LessNami
     /** Peer-to-peer pool size. */
     private int p2pPoolSz;
 
+    /** Rebalance thread pool size. */
+    private int rebalanceThreadPoolSize;
+
     /** REST requests pool size. */
     private int restPoolSz;
 
     /**
-     * @param c Grid configuration.
-     * @return Data transfer object for node executors configuration properties.
+     * Default constructor.
      */
-    public static VisorExecutorServiceConfiguration from(IgniteConfiguration c) {
-        VisorExecutorServiceConfiguration cfg = new VisorExecutorServiceConfiguration();
+    public VisorExecutorServiceConfiguration() {
+        // No-op.
+    }
 
-        cfg.pubPoolSize = c.getPublicThreadPoolSize();
-        cfg.sysPoolSz = c.getSystemThreadPoolSize();
-        cfg.mgmtPoolSize = c.getManagementThreadPoolSize();
-        cfg.p2pPoolSz = c.getPeerClassLoadingThreadPoolSize();
-        cfg.igfsPoolSize = c.getIgfsThreadPoolSize();
+    /**
+     * Create data transfer object for node executors configuration properties.
+     *
+     * @param c Grid configuration.
+     */
+    public VisorExecutorServiceConfiguration(IgniteConfiguration c) {
+        pubPoolSize = c.getPublicThreadPoolSize();
+        sysPoolSz = c.getSystemThreadPoolSize();
+        mgmtPoolSize = c.getManagementThreadPoolSize();
+        p2pPoolSz = c.getPeerClassLoadingThreadPoolSize();
+        igfsPoolSize = c.getIgfsThreadPoolSize();
+        rebalanceThreadPoolSize = c.getRebalanceThreadPoolSize();
 
         ConnectorConfiguration cc = c.getConnectorConfiguration();
 
         if (cc != null)
-            cfg.restPoolSz = cc.getThreadPoolSize();
-
-        return cfg;
+            restPoolSz = cc.getThreadPoolSize();
     }
 
     /**
      * @return Public pool size.
      */
-    public int publicThreadPoolSize() {
+    public int getPublicThreadPoolSize() {
         return pubPoolSize;
     }
 
     /**
      * @return System pool size.
      */
-    public int systemThreadPoolSize() {
+    public int getSystemThreadPoolSize() {
         return sysPoolSz;
     }
 
     /**
      * @return Management pool size.
      */
-    public int managementThreadPoolSize() {
+    public int getManagementThreadPoolSize() {
         return mgmtPoolSize;
     }
 
     /**
      * @return IGFS pool size.
      */
-    public int igfsThreadPoolSize() {
+    public int getIgfsThreadPoolSize() {
         return igfsPoolSize;
     }
 
     /**
      * @return Peer-to-peer pool size.
      */
-    public int peerClassLoadingThreadPoolSize() {
+    public int getPeerClassLoadingThreadPoolSize() {
         return p2pPoolSz;
     }
 
     /**
+     * @return Rebalance thread pool size.
+     */
+    public int getRebalanceThreadPoolSize() {
+        return rebalanceThreadPoolSize;
+    }
+
+    /**
      * @return REST requests pool size.
      */
-    public int restThreadPoolSize() {
+    public int getRestThreadPoolSize() {
         return restPoolSz;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeInt(pubPoolSize);
+        out.writeInt(sysPoolSz);
+        out.writeInt(mgmtPoolSize);
+        out.writeInt(igfsPoolSize);
+        out.writeInt(p2pPoolSz);
+        out.writeInt(rebalanceThreadPoolSize);
+        out.writeInt(restPoolSz);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        pubPoolSize = in.readInt();
+        sysPoolSz = in.readInt();
+        mgmtPoolSize = in.readInt();
+        igfsPoolSize = in.readInt();
+        p2pPoolSz = in.readInt();
+        rebalanceThreadPoolSize = in.readInt();
+        restPoolSz = in.readInt();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorExecutorServiceConfiguration.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorGridConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorGridConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorGridConfiguration.java
index 0ce13df..23a74e7 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorGridConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorGridConfiguration.java
@@ -17,22 +17,26 @@
 
 package org.apache.ignite.internal.visor.node;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import org.apache.ignite.IgniteSystemProperties;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.IgniteEx;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 import static org.apache.ignite.internal.visor.util.VisorTaskUtils.compactArray;
 
 /**
  * Data transfer object for node configuration data.
  */
-public class VisorGridConfiguration implements Serializable, LessNamingBean {
+public class VisorGridConfiguration extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -69,8 +73,8 @@ public class VisorGridConfiguration implements Serializable, LessNamingBean {
     /** User attributes. */
     private Map<String, ?> userAttrs;
 
-    /** Igfss. */
-    private Iterable<VisorIgfsConfiguration> igfss;
+    /** IGFSs. */
+    private List<VisorIgfsConfiguration> igfss;
 
     /** Environment. */
     private Map<String, String> env;
@@ -88,155 +92,205 @@ public class VisorGridConfiguration implements Serializable, LessNamingBean {
     private VisorMemoryConfiguration memCfg;
 
     /**
+     * Default constructor.
+     */
+    public VisorGridConfiguration() {
+        // No-op.
+    }
+
+    /**
+     * Create data transfer object with node configuration data.
+     *
      * @param ignite Grid.
-     * @return Fill data transfer object with node configuration data.
      */
-    public VisorGridConfiguration from(IgniteEx ignite) {
+    public VisorGridConfiguration(IgniteEx ignite) {
         assert ignite != null;
 
         IgniteConfiguration c = ignite.configuration();
 
-        basic = VisorBasicConfiguration.from(ignite, c);
-        metrics = VisorMetricsConfiguration.from(c);
-        spis = VisorSpisConfiguration.from(c);
-        p2p = VisorPeerToPeerConfiguration.from(c);
-        lifecycle = VisorLifecycleConfiguration.from(c);
-        execSvc = VisorExecutorServiceConfiguration.from(c);
-        seg = VisorSegmentationConfiguration.from(c);
+        basic = new VisorBasicConfiguration(ignite, c);
+        metrics = new VisorMetricsConfiguration(c);
+        spis = new VisorSpisConfiguration(c);
+        p2p = new VisorPeerToPeerConfiguration(c);
+        lifecycle = new VisorLifecycleConfiguration(c);
+        execSvc = new VisorExecutorServiceConfiguration(c);
+        seg = new VisorSegmentationConfiguration(c);
         inclProps = compactArray(c.getIncludeProperties());
         inclEvtTypes = c.getIncludeEventTypes();
-        rest = VisorRestConfiguration.from(c);
+        rest = new VisorRestConfiguration(c);
         userAttrs = c.getUserAttributes();
         igfss = VisorIgfsConfiguration.list(c.getFileSystemConfiguration());
         env = new HashMap<>(System.getenv());
         sysProps = IgniteSystemProperties.snapshot();
-        atomic = VisorAtomicConfiguration.from(c.getAtomicConfiguration());
-        txCfg = VisorTransactionConfiguration.from(c.getTransactionConfiguration());
-        memCfg = new VisorMemoryConfiguration(c.getMemoryConfiguration());
+        atomic = new VisorAtomicConfiguration(c.getAtomicConfiguration());
+        txCfg = new VisorTransactionConfiguration(c.getTransactionConfiguration());
 
-        return this;
+        if (c.getMemoryConfiguration() != null)
+            memCfg = new VisorMemoryConfiguration(c.getMemoryConfiguration());
     }
 
     /**
      * @return Basic.
      */
-    public VisorBasicConfiguration basic() {
+    public VisorBasicConfiguration getBasic() {
         return basic;
     }
 
     /**
      * @return Metrics.
      */
-    public VisorMetricsConfiguration metrics() {
+    public VisorMetricsConfiguration getMetrics() {
         return metrics;
     }
 
     /**
      * @return SPIs.
      */
-    public VisorSpisConfiguration spis() {
+    public VisorSpisConfiguration getSpis() {
         return spis;
     }
 
     /**
      * @return P2P.
      */
-    public VisorPeerToPeerConfiguration p2p() {
+    public VisorPeerToPeerConfiguration getP2p() {
         return p2p;
     }
 
     /**
      * @return Lifecycle.
      */
-    public VisorLifecycleConfiguration lifecycle() {
+    public VisorLifecycleConfiguration getLifecycle() {
         return lifecycle;
     }
 
     /**
      * @return Executors service configuration.
      */
-    public VisorExecutorServiceConfiguration executeService() {
+    public VisorExecutorServiceConfiguration getExecutorService() {
         return execSvc;
     }
 
     /**
      * @return Segmentation.
      */
-    public VisorSegmentationConfiguration segmentation() {
+    public VisorSegmentationConfiguration getSegmentation() {
         return seg;
     }
 
     /**
      * @return Include properties.
      */
-    public String includeProperties() {
+    public String getIncludeProperties() {
         return inclProps;
     }
 
     /**
      * @return Include events types.
      */
-    public int[] includeEventTypes() {
+    public int[] getIncludeEventTypes() {
         return inclEvtTypes;
     }
 
     /**
      * @return Rest.
      */
-    public VisorRestConfiguration rest() {
+    public VisorRestConfiguration getRest() {
         return rest;
     }
 
     /**
      * @return User attributes.
      */
-    public Map<String, ?> userAttributes() {
+    public Map<String, ?> getUserAttributes() {
         return userAttrs;
     }
 
     /**
      * @return Igfss.
      */
-    public Iterable<VisorIgfsConfiguration> igfss() {
+    public List<VisorIgfsConfiguration> getIgfss() {
         return igfss;
     }
 
     /**
      * @return Environment.
      */
-    public Map<String, String> env() {
+    public Map<String, String> getEnv() {
         return env;
     }
 
     /**
      * @return System properties.
      */
-    public Properties systemProperties() {
+    public Properties getSystemProperties() {
         return sysProps;
     }
 
     /**
      * @return Configuration of atomic data structures.
      */
-    public VisorAtomicConfiguration atomic() {
+    public VisorAtomicConfiguration getAtomic() {
         return atomic;
     }
 
     /**
      * @return Transactions configuration.
      */
-    public VisorTransactionConfiguration transaction() {
+    public VisorTransactionConfiguration getTransaction() {
         return txCfg;
     }
 
     /**
      * @return Memory configuration.
      */
-    public VisorMemoryConfiguration memoryConfiguration() {
+    public VisorMemoryConfiguration getMemoryConfiguration() {
         return memCfg;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeObject(basic);
+        out.writeObject(metrics);
+        out.writeObject(spis);
+        out.writeObject(p2p);
+        out.writeObject(lifecycle);
+        out.writeObject(execSvc);
+        out.writeObject(seg);
+        U.writeString(out, inclProps);
+        out.writeObject(inclEvtTypes);
+        out.writeObject(rest);
+        U.writeMap(out, userAttrs);
+        U.writeCollection(out, igfss);
+        U.writeMap(out, env);
+        out.writeObject(sysProps);
+        out.writeObject(atomic);
+        out.writeObject(txCfg);
+        out.writeObject(memCfg);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        basic = (VisorBasicConfiguration)in.readObject();
+        metrics = (VisorMetricsConfiguration)in.readObject();
+        spis = (VisorSpisConfiguration)in.readObject();
+        p2p = (VisorPeerToPeerConfiguration)in.readObject();
+        lifecycle = (VisorLifecycleConfiguration)in.readObject();
+        execSvc = (VisorExecutorServiceConfiguration)in.readObject();
+        seg = (VisorSegmentationConfiguration)in.readObject();
+        inclProps = U.readString(in);
+        inclEvtTypes = (int[])in.readObject();
+        rest = (VisorRestConfiguration)in.readObject();
+        userAttrs = U.readMap(in);
+        igfss = U.readList(in);
+        env = U.readMap(in);
+        sysProps = (Properties)in.readObject();
+        atomic = (VisorAtomicConfiguration)in.readObject();
+        txCfg = (VisorTransactionConfiguration)in.readObject();
+        memCfg = (VisorMemoryConfiguration)in.readObject();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorGridConfiguration.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorIgfsConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorIgfsConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorIgfsConfiguration.java
index 664dac1..15c1fc6 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorIgfsConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorIgfsConfiguration.java
@@ -17,16 +17,19 @@
 
 package org.apache.ignite.internal.visor.node;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import org.apache.ignite.configuration.FileSystemConfiguration;
 import org.apache.ignite.igfs.IgfsIpcEndpointConfiguration;
 import org.apache.ignite.igfs.IgfsMode;
-import org.apache.ignite.internal.LessNamingBean;
+import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 import org.jetbrains.annotations.Nullable;
 
 import static org.apache.ignite.internal.visor.util.VisorTaskUtils.compactClass;
@@ -34,7 +37,7 @@ import static org.apache.ignite.internal.visor.util.VisorTaskUtils.compactClass;
 /**
  * Data transfer object for IGFS configuration properties.
  */
-public class VisorIgfsConfiguration implements Serializable, LessNamingBean {
+public class VisorIgfsConfiguration extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -114,44 +117,47 @@ public class VisorIgfsConfiguration implements Serializable, LessNamingBean {
     private long trashPurgeTimeout;
 
     /**
+     * Default constructor.
+     */
+    public VisorIgfsConfiguration() {
+        // No-op.
+    }
+
+    /**
+     * Create data transfer object for IGFS configuration properties.
      * @param igfs IGFS configuration.
-     * @return Data transfer object for IGFS configuration properties.
      */
-    public static VisorIgfsConfiguration from(FileSystemConfiguration igfs) {
-        VisorIgfsConfiguration cfg = new VisorIgfsConfiguration();
-
-        cfg.name = igfs.getName();
-        cfg.metaCacheName = igfs.getMetaCacheConfiguration().getName();
-        cfg.dataCacheName = igfs.getDataCacheConfiguration().getName();
-        cfg.blockSize = igfs.getBlockSize();
-        cfg.prefetchBlocks = igfs.getPrefetchBlocks();
-        cfg.streamBufSize = igfs.getBufferSize();
-        cfg.perNodeBatchSize = igfs.getPerNodeBatchSize();
-        cfg.perNodeParallelBatchCnt = igfs.getPerNodeParallelBatchCount();
-
-        cfg.dfltMode = igfs.getDefaultMode();
-        cfg.pathModes = igfs.getPathModes();
-        cfg.dualModePutExecutorSrvc = compactClass(igfs.getDualModePutExecutorService());
-        cfg.dualModePutExecutorSrvcShutdown = igfs.getDualModePutExecutorServiceShutdown();
-        cfg.dualModeMaxPendingPutsSize = igfs.getDualModeMaxPendingPutsSize();
-        cfg.maxTaskRangeLen = igfs.getMaximumTaskRangeLength();
-        cfg.fragmentizerConcurrentFiles = igfs.getFragmentizerConcurrentFiles();
-        cfg.fragmentizerLocWritesRatio = igfs.getFragmentizerLocalWritesRatio();
-        cfg.fragmentizerEnabled = igfs.isFragmentizerEnabled();
-        cfg.fragmentizerThrottlingBlockLen = igfs.getFragmentizerThrottlingBlockLength();
-        cfg.fragmentizerThrottlingDelay = igfs.getFragmentizerThrottlingDelay();
+    public VisorIgfsConfiguration(FileSystemConfiguration igfs) {
+        name = igfs.getName();
+        metaCacheName = igfs.getMetaCacheConfiguration().getName();
+        dataCacheName = igfs.getDataCacheConfiguration().getName();
+        blockSize = igfs.getBlockSize();
+        prefetchBlocks = igfs.getPrefetchBlocks();
+        streamBufSize = igfs.getBufferSize();
+        perNodeBatchSize = igfs.getPerNodeBatchSize();
+        perNodeParallelBatchCnt = igfs.getPerNodeParallelBatchCount();
+
+        dfltMode = igfs.getDefaultMode();
+        pathModes = igfs.getPathModes();
+        dualModePutExecutorSrvc = compactClass(igfs.getDualModePutExecutorService());
+        dualModePutExecutorSrvcShutdown = igfs.getDualModePutExecutorServiceShutdown();
+        dualModeMaxPendingPutsSize = igfs.getDualModeMaxPendingPutsSize();
+        maxTaskRangeLen = igfs.getMaximumTaskRangeLength();
+        fragmentizerConcurrentFiles = igfs.getFragmentizerConcurrentFiles();
+        fragmentizerLocWritesRatio = igfs.getFragmentizerLocalWritesRatio();
+        fragmentizerEnabled = igfs.isFragmentizerEnabled();
+        fragmentizerThrottlingBlockLen = igfs.getFragmentizerThrottlingBlockLength();
+        fragmentizerThrottlingDelay = igfs.getFragmentizerThrottlingDelay();
 
         IgfsIpcEndpointConfiguration endpointCfg = igfs.getIpcEndpointConfiguration();
 
-        cfg.ipcEndpointCfg = endpointCfg != null ? endpointCfg.toString() : null;
-
-        cfg.ipcEndpointEnabled = igfs.isIpcEndpointEnabled();
-        cfg.maxSpace = igfs.getMaxSpaceSize();
-        cfg.mgmtPort = igfs.getManagementPort();
-        cfg.seqReadsBeforePrefetch = igfs.getSequentialReadsBeforePrefetch();
-        cfg.trashPurgeTimeout = igfs.getTrashPurgeTimeout();
+        ipcEndpointCfg = endpointCfg != null ? endpointCfg.toString() : null;
 
-        return cfg;
+        ipcEndpointEnabled = igfs.isIpcEndpointEnabled();
+        maxSpace = igfs.getMaxSpaceSize();
+        mgmtPort = igfs.getManagementPort();
+        seqReadsBeforePrefetch = igfs.getSequentialReadsBeforePrefetch();
+        trashPurgeTimeout = igfs.getTrashPurgeTimeout();
     }
 
     /**
@@ -160,194 +166,251 @@ public class VisorIgfsConfiguration implements Serializable, LessNamingBean {
      * @param igfss Igfs configurations.
      * @return igfs configurations properties.
      */
-    public static Iterable<VisorIgfsConfiguration> list(FileSystemConfiguration[] igfss) {
-        if (igfss == null)
-            return Collections.emptyList();
-
-        final Collection<VisorIgfsConfiguration> cfgs = new ArrayList<>(igfss.length);
+    public static List<VisorIgfsConfiguration> list(FileSystemConfiguration[] igfss) {
+        List<VisorIgfsConfiguration> res = new ArrayList<>();
 
-        for (FileSystemConfiguration igfs : igfss)
-            cfgs.add(from(igfs));
+        if (!F.isEmpty(igfss)) {
+            for (FileSystemConfiguration igfs : igfss)
+                res.add(new VisorIgfsConfiguration(igfs));
+        }
 
-        return cfgs;
+        return res;
     }
 
     /**
      * @return IGFS instance name.
      */
-    @Nullable public String name() {
+    @Nullable public String getName() {
         return name;
     }
 
     /**
      * @return Cache name to store IGFS meta information.
      */
-    @Nullable public String metaCacheName() {
+    @Nullable public String getMetaCacheName() {
         return metaCacheName;
     }
 
     /**
      * @return Cache name to store IGFS data.
      */
-    @Nullable public String dataCacheName() {
+    @Nullable public String getDataCacheName() {
         return dataCacheName;
     }
 
     /**
      * @return File's data block size.
      */
-    public int blockSize() {
+    public int getBlockSize() {
         return blockSize;
     }
 
     /**
      * @return Number of pre-fetched blocks if specific file's chunk is requested.
      */
-    public int prefetchBlocks() {
+    public int getPrefetchBlocks() {
         return prefetchBlocks;
     }
 
     /**
      * @return Read/write buffer size for IGFS stream operations in bytes.
      */
-    public int streamBufferSize() {
+    public int getStreamBufferSize() {
         return streamBufSize;
     }
 
     /**
      * @return Number of file blocks buffered on local node before sending batch to remote node.
      */
-    public int perNodeBatchSize() {
+    public int getPerNodeBatchSize() {
         return perNodeBatchSize;
     }
 
     /**
      * @return Number of batches that can be concurrently sent to remote node.
      */
-    public int perNodeParallelBatchCount() {
+    public int getPerNodeParallelBatchCount() {
         return perNodeParallelBatchCnt;
     }
 
     /**
      * @return IGFS instance mode.
      */
-    public IgfsMode defaultMode() {
+    public IgfsMode getDefaultMode() {
         return dfltMode;
     }
 
     /**
      * @return Map of paths to IGFS modes.
      */
-    @Nullable public Map<String, IgfsMode> pathModes() {
+    @Nullable public Map<String, IgfsMode> getPathModes() {
         return pathModes;
     }
 
     /**
      * @return Dual mode PUT operations executor service.
      */
-    public String dualModePutExecutorService() {
+    public String getDualModePutExecutorService() {
         return dualModePutExecutorSrvc;
     }
 
     /**
      * @return Dual mode PUT operations executor service shutdown flag.
      */
-    public boolean dualModePutExecutorServiceShutdown() {
+    public boolean getDualModePutExecutorServiceShutdown() {
         return dualModePutExecutorSrvcShutdown;
     }
 
     /**
      * @return Maximum amount of data in pending puts.
      */
-    public long dualModeMaxPendingPutsSize() {
+    public long getDualModeMaxPendingPutsSize() {
         return dualModeMaxPendingPutsSize;
     }
 
     /**
      * @return Maximum range length.
      */
-    public long maxTaskRangeLength() {
+    public long getMaxTaskRangeLength() {
         return maxTaskRangeLen;
     }
 
     /**
      * @return Fragmentizer concurrent files.
      */
-    public int fragmentizerConcurrentFiles() {
+    public int getFragmentizerConcurrentFiles() {
         return fragmentizerConcurrentFiles;
     }
 
     /**
      * @return Fragmentizer local writes ratio.
      */
-    public float fragmentizerLocalWritesRatio() {
+    public float getFragmentizerLocalWritesRatio() {
         return fragmentizerLocWritesRatio;
     }
 
     /**
      * @return Fragmentizer enabled flag.
      */
-    public boolean fragmentizerEnabled() {
+    public boolean isFragmentizerEnabled() {
         return fragmentizerEnabled;
     }
 
     /**
      * @return Fragmentizer throttling block length.
      */
-    public long fragmentizerThrottlingBlockLength() {
+    public long getFragmentizerThrottlingBlockLength() {
         return fragmentizerThrottlingBlockLen;
     }
 
     /**
      * @return Fragmentizer throttling delay.
      */
-    public long fragmentizerThrottlingDelay() {
+    public long getFragmentizerThrottlingDelay() {
         return fragmentizerThrottlingDelay;
     }
 
     /**
      * @return IPC endpoint config to publish IGFS over.
      */
-    @Nullable public String ipcEndpointConfiguration() {
+    @Nullable public String getIpcEndpointConfiguration() {
         return ipcEndpointCfg;
     }
 
     /**
      * @return IPC endpoint enabled flag.
      */
-    public boolean ipcEndpointEnabled() {
+    public boolean isIpcEndpointEnabled() {
         return ipcEndpointEnabled;
     }
 
     /**
      * @return Maximum space.
      */
-    public long maxSpace() {
+    public long getMaxSpace() {
         return maxSpace;
     }
 
     /**
      * @return Management port.
      */
-    public int managementPort() {
+    public int getManagementPort() {
         return mgmtPort;
     }
 
     /**
      * @return Amount of sequential block reads before prefetch is triggered.
      */
-    public int sequenceReadsBeforePrefetch() {
+    public int getSequenceReadsBeforePrefetch() {
         return seqReadsBeforePrefetch;
     }
 
     /**
      * @return Trash purge await timeout.
      */
-    public long trashPurgeTimeout() {
+    public long getTrashPurgeTimeout() {
         return trashPurgeTimeout;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, name);
+        U.writeString(out, metaCacheName);
+        U.writeString(out, dataCacheName);
+        out.writeInt(blockSize);
+        out.writeInt(prefetchBlocks);
+        out.writeInt(streamBufSize);
+        out.writeInt(perNodeBatchSize);
+        out.writeInt(perNodeParallelBatchCnt);
+        U.writeEnum(out, dfltMode);
+        U.writeMap(out, pathModes);
+        U.writeString(out, dualModePutExecutorSrvc);
+        out.writeBoolean(dualModePutExecutorSrvcShutdown);
+        out.writeLong(dualModeMaxPendingPutsSize);
+        out.writeLong(maxTaskRangeLen);
+        out.writeInt(fragmentizerConcurrentFiles);
+        out.writeFloat(fragmentizerLocWritesRatio);
+        out.writeBoolean(fragmentizerEnabled);
+        out.writeLong(fragmentizerThrottlingBlockLen);
+        out.writeLong(fragmentizerThrottlingDelay);
+        U.writeString(out, ipcEndpointCfg);
+        out.writeBoolean(ipcEndpointEnabled);
+        out.writeLong(maxSpace);
+        out.writeInt(mgmtPort);
+        out.writeInt(seqReadsBeforePrefetch);
+        out.writeLong(trashPurgeTimeout);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        name = U.readString(in);
+        metaCacheName = U.readString(in);
+        dataCacheName = U.readString(in);
+        blockSize = in.readInt();
+        prefetchBlocks = in.readInt();
+        streamBufSize = in.readInt();
+        perNodeBatchSize = in.readInt();
+        perNodeParallelBatchCnt = in.readInt();
+        dfltMode = IgfsMode.fromOrdinal(in.readByte());
+        pathModes = U.readMap(in);
+        dualModePutExecutorSrvc = U.readString(in);
+        dualModePutExecutorSrvcShutdown = in.readBoolean();
+        dualModeMaxPendingPutsSize = in.readLong();
+        maxTaskRangeLen = in.readLong();
+        fragmentizerConcurrentFiles = in.readInt();
+        fragmentizerLocWritesRatio = in.readFloat();
+        fragmentizerEnabled = in.readBoolean();
+        fragmentizerThrottlingBlockLen = in.readLong();
+        fragmentizerThrottlingDelay = in.readLong();
+        ipcEndpointCfg = U.readString(in);
+        ipcEndpointEnabled = in.readBoolean();
+        maxSpace = in.readLong();
+        mgmtPort = in.readInt();
+        seqReadsBeforePrefetch = in.readInt();
+        trashPurgeTimeout = in.readLong();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorIgfsConfiguration.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorLifecycleConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorLifecycleConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorLifecycleConfiguration.java
index 838a6cc..5407699 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorLifecycleConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorLifecycleConfiguration.java
@@ -17,10 +17,13 @@
 
 package org.apache.ignite.internal.visor.node;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 import org.jetbrains.annotations.Nullable;
 
 import static org.apache.ignite.internal.visor.util.VisorTaskUtils.compactArray;
@@ -28,7 +31,7 @@ import static org.apache.ignite.internal.visor.util.VisorTaskUtils.compactArray;
 /**
  * Data transfer object for node lifecycle configuration properties.
  */
-public class VisorLifecycleConfiguration implements Serializable, LessNamingBean {
+public class VisorLifecycleConfiguration extends VisorDataTransferObject{
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -36,25 +39,39 @@ public class VisorLifecycleConfiguration implements Serializable, LessNamingBean
     private String beans;
 
     /**
-     * @param c Grid configuration.
-     * @return Data transfer object for node lifecycle configuration properties.
+     * Default constructor.
      */
-    public static VisorLifecycleConfiguration from(IgniteConfiguration c) {
-        VisorLifecycleConfiguration cfg = new VisorLifecycleConfiguration();
-
-        cfg.beans = compactArray(c.getLifecycleBeans());
+    public VisorLifecycleConfiguration() {
+        // No-op.
+    }
 
-        return cfg;
+    /**
+     * Create data transfer object for node lifecycle configuration properties.
+     *
+     * @param c Grid configuration.
+     */
+    public VisorLifecycleConfiguration(IgniteConfiguration c) {
+        beans = compactArray(c.getLifecycleBeans());
     }
 
     /**
      * @return Lifecycle beans.
      */
-    @Nullable public String beans() {
+    @Nullable public String getBeans() {
         return beans;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, beans);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        beans = U.readString(in);
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorLifecycleConfiguration.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorMemoryConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorMemoryConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorMemoryConfiguration.java
index f380394..7a0bc76 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorMemoryConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorMemoryConfiguration.java
@@ -17,25 +17,27 @@
 
 package org.apache.ignite.internal.visor.node;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.ArrayList;
 import java.util.List;
 import org.apache.ignite.configuration.MemoryConfiguration;
 import org.apache.ignite.configuration.MemoryPolicyConfiguration;
 import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 /**
  * Data transfer object for memory configuration.
  */
-public class VisorMemoryConfiguration implements Serializable {
+public class VisorMemoryConfiguration extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
-    /** File cache allocation path. */
-    private String fileCacheAllocationPath;
-
-    /** Amount of memory allocated for the page cache. */
-    private long pageCacheSize;
+    /** Size of memory for system cache. */
+    private long sysCacheMemSize;
 
     /** Page size. */
     private int pageSize;
@@ -50,6 +52,13 @@ public class VisorMemoryConfiguration implements Serializable {
     private List<VisorMemoryPolicyConfiguration> memPlcs;
 
     /**
+     * Default constructor.
+     */
+    public VisorMemoryConfiguration() {
+        // No-op.
+    }
+
+    /**
      * Create data transfer object.
      *
      * @param memCfg Memory configuration.
@@ -57,6 +66,7 @@ public class VisorMemoryConfiguration implements Serializable {
     public VisorMemoryConfiguration(MemoryConfiguration memCfg) {
         assert memCfg != null;
 
+        sysCacheMemSize = memCfg.getSystemCacheMemorySize();
         pageSize = memCfg.getPageSize();
         concLvl = memCfg.getConcurrencyLevel();
         dfltMemPlcName = memCfg.getDefaultMemoryPolicyName();
@@ -79,17 +89,10 @@ public class VisorMemoryConfiguration implements Serializable {
     }
 
     /**
-     * @return File allocation path.
+     * @return Size of memory for system cache.
      */
-    public String fileCacheAllocationPath() {
-        return fileCacheAllocationPath;
-    }
-
-    /**
-     * @return Page cache size, in bytes.
-     */
-    public long pageCacheSize() {
-        return pageCacheSize;
+    public long getSystemCacheMemorySize() {
+        return sysCacheMemSize;
     }
 
     /**
@@ -112,4 +115,27 @@ public class VisorMemoryConfiguration implements Serializable {
     public List<VisorMemoryPolicyConfiguration> getMemoryPolicies() {
         return memPlcs;
     }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeLong(sysCacheMemSize);
+        out.writeInt(pageSize);
+        out.writeInt(concLvl);
+        U.writeString(out, dfltMemPlcName);
+        U.writeCollection(out, memPlcs);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        sysCacheMemSize = in.readLong();
+        pageSize = in.readInt();
+        concLvl = in.readInt();
+        dfltMemPlcName = U.readString(in);
+        memPlcs = U.readList(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorMemoryConfiguration.class, this);
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorMemoryPolicyConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorMemoryPolicyConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorMemoryPolicyConfiguration.java
index 28eebd2..509aa48 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorMemoryPolicyConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorMemoryPolicyConfiguration.java
@@ -17,13 +17,18 @@
 
 package org.apache.ignite.internal.visor.node;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.apache.ignite.configuration.MemoryPolicyConfiguration;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 /**
  * Data transfer object for memory configuration.
  */
-public class VisorMemoryPolicyConfiguration implements Serializable {
+public class VisorMemoryPolicyConfiguration extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -36,6 +41,14 @@ public class VisorMemoryPolicyConfiguration implements Serializable {
     /** Path for memory mapped file. */
     private String swapFilePath;
 
+
+    /**
+     * Default constructor.
+     */
+    public VisorMemoryPolicyConfiguration() {
+        // No-op.
+    }
+
     /**
      * Constructor.
      *
@@ -69,4 +82,24 @@ public class VisorMemoryPolicyConfiguration implements Serializable {
     public String getSwapFilePath() {
         return swapFilePath;
     }
+
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, name);
+        out.writeLong(size);
+        U.writeString(out, swapFilePath);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        name = U.readString(in);
+        size = in.readLong();
+        swapFilePath = U.readString(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorMemoryPolicyConfiguration.class, this);
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorMetricsConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorMetricsConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorMetricsConfiguration.java
index 4e812b7..4ce7b6c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorMetricsConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorMetricsConfiguration.java
@@ -17,15 +17,17 @@
 
 package org.apache.ignite.internal.visor.node;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.internal.LessNamingBean;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 /**
  * Data transfer object for node metrics configuration properties.
  */
-public class VisorMetricsConfiguration implements Serializable, LessNamingBean {
+public class VisorMetricsConfiguration extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -39,41 +41,59 @@ public class VisorMetricsConfiguration implements Serializable, LessNamingBean {
     private long logFreq;
 
     /**
-     * @param c Grid configuration.
-     * @return Data transfer object for node metrics configuration properties.
+     * Default constructor.
      */
-    public static VisorMetricsConfiguration from(IgniteConfiguration c) {
-        VisorMetricsConfiguration cfg = new VisorMetricsConfiguration();
-
-        cfg.expTime = c.getMetricsExpireTime();
-        cfg.histSize = c.getMetricsHistorySize();
-        cfg.logFreq = c.getMetricsLogFrequency();
+    public VisorMetricsConfiguration() {
+        // No-op.
+    }
 
-        return cfg;
+    /**
+     * Create transfer object for node metrics configuration properties.
+     *
+     * @param c Grid configuration.
+     */
+    public VisorMetricsConfiguration(IgniteConfiguration c) {
+        expTime = c.getMetricsExpireTime();
+        histSize = c.getMetricsHistorySize();
+        logFreq = c.getMetricsLogFrequency();
     }
 
     /**
      * @return Metrics expired time.
      */
-    public long expireTime() {
+    public long getExpireTime() {
         return expTime;
     }
 
     /**
      * @return Number of node metrics stored in memory.
      */
-    public int historySize() {
+    public int getHistorySize() {
         return histSize;
     }
 
     /**
      * @return Frequency of metrics log printout.
      */
-    public long loggerFrequency() {
+    public long getLoggerFrequency() {
         return logFreq;
     }
 
     /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeLong(expTime);
+        out.writeInt(histSize);
+        out.writeLong(logFreq);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        expTime = in.readLong();
+        histSize = in.readInt();
+        logFreq = in.readLong();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorMetricsConfiguration.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeConfigurationCollectorJob.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeConfigurationCollectorJob.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeConfigurationCollectorJob.java
index 109b1d8..35b7ad3 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeConfigurationCollectorJob.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeConfigurationCollectorJob.java
@@ -37,11 +37,11 @@ public class VisorNodeConfigurationCollectorJob extends VisorJob<Void, VisorGrid
 
     /** {@inheritDoc} */
     @Override protected VisorGridConfiguration run(Void arg) {
-        return new VisorGridConfiguration().from(ignite);
+        return new VisorGridConfiguration(ignite);
     }
 
     /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorNodeConfigurationCollectorJob.class, this);
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorJob.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorJob.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorJob.java
index 0617e70..125e219 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorJob.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorJob.java
@@ -24,6 +24,8 @@ import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.configuration.FileSystemConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
+import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
+import org.apache.ignite.internal.processors.cache.GridCacheProcessor;
 import org.apache.ignite.internal.processors.igfs.IgfsProcessorAdapter;
 import org.apache.ignite.internal.util.ipc.IpcServerEndpoint;
 import org.apache.ignite.internal.util.typedef.internal.S;
@@ -33,6 +35,7 @@ import org.apache.ignite.internal.visor.cache.VisorCache;
 import org.apache.ignite.internal.visor.compute.VisorComputeMonitoringHolder;
 import org.apache.ignite.internal.visor.igfs.VisorIgfs;
 import org.apache.ignite.internal.visor.igfs.VisorIgfsEndpoint;
+import org.apache.ignite.lang.IgniteProductVersion;
 
 import static org.apache.ignite.internal.processors.cache.GridCacheUtils.isIgfsCache;
 import static org.apache.ignite.internal.processors.cache.GridCacheUtils.isSystemCache;
@@ -70,7 +73,7 @@ public class VisorNodeDataCollectorJob extends VisorJob<VisorNodeDataCollectorTa
      */
     protected void events0(VisorNodeDataCollectorJobResult res, String evtOrderKey, String evtThrottleCntrKey,
         final boolean all) {
-        res.events().addAll(collectEvents(ignite, evtOrderKey, evtThrottleCntrKey, all, EVT_MAPPER));
+        res.getEvents().addAll(collectEvents(ignite, evtOrderKey, evtThrottleCntrKey, all, EVT_MAPPER));
     }
 
     /**
@@ -83,12 +86,12 @@ public class VisorNodeDataCollectorJob extends VisorJob<VisorNodeDataCollectorTa
         try {
             // Visor events explicitly enabled in configuration.
             if (checkExplicitTaskMonitoring(ignite))
-                res.taskMonitoringEnabled(true);
+                res.setTaskMonitoringEnabled(true);
             else {
                 // Get current task monitoring state.
-                res.taskMonitoringEnabled(arg.taskMonitoringEnabled());
+                res.setTaskMonitoringEnabled(arg.isTaskMonitoringEnabled());
 
-                if (arg.taskMonitoringEnabled()) {
+                if (arg.isTaskMonitoringEnabled()) {
                     ConcurrentMap<String, VisorComputeMonitoringHolder> storage = ignite.cluster().nodeLocalMap();
 
                     VisorComputeMonitoringHolder holder = storage.get(COMPUTE_MONITORING_HOLDER_KEY);
@@ -102,21 +105,33 @@ public class VisorNodeDataCollectorJob extends VisorJob<VisorNodeDataCollectorTa
                     }
 
                     // Enable task monitoring for new node in grid.
-                    holder.startCollect(ignite, arg.eventsOrderKey());
+                    holder.startCollect(ignite, arg.getEventsOrderKey());
 
                     // Update current state after change (it may not changed in some cases).
-                    res.taskMonitoringEnabled(ignite.allEventsUserRecordable(VISOR_TASK_EVTS));
+                    res.setTaskMonitoringEnabled(ignite.allEventsUserRecordable(VISOR_TASK_EVTS));
                 }
             }
 
-            events0(res, arg.eventsOrderKey(), arg.eventsThrottleCounterKey(), arg.taskMonitoringEnabled());
+            events0(res, arg.getEventsOrderKey(), arg.getEventsThrottleCounterKey(), arg.isTaskMonitoringEnabled());
         }
         catch (Exception eventsEx) {
-            res.eventsEx(eventsEx);
+            res.setEventsEx(eventsEx);
         }
     }
 
     /**
+     * @param ver Version to check.
+     * @return {@code true} if found at least one compatible node with specified version.
+     */
+    protected boolean compatibleWith(IgniteProductVersion ver) {
+        for (ClusterNode node : ignite.cluster().nodes())
+            if (node.version().compareToIgnoreTimestamp(ver) <= 0)
+                return true;
+
+        return false;
+    }
+
+    /**
      * @param cacheName Cache name to check.
      * @return {@code true} if cache on local node is not a data cache or near cache disabled.
      */
@@ -138,19 +153,22 @@ public class VisorNodeDataCollectorJob extends VisorJob<VisorNodeDataCollectorTa
         try {
             IgniteConfiguration cfg = ignite.configuration();
 
-            for (String cacheName : ignite.context().cache().cacheNames()) {
+            GridCacheProcessor cacheProc = ignite.context().cache();
+
+            for (String cacheName : cacheProc.cacheNames()) {
                 if (proxyCache(cacheName))
                     continue;
 
-                if (arg.systemCaches() ||
-                    !(isSystemCache(cacheName) || isIgfsCache(cfg, cacheName))) {
+                if (arg.getSystemCaches() || !(isSystemCache(cacheName) || isIgfsCache(cfg, cacheName))) {
                     long start0 = U.currentTimeMillis();
 
                     try {
-                        VisorCache cache = new VisorCache().from(ignite, cacheName, arg.sample());
+                        GridCacheAdapter ca = cacheProc.internalCache(cacheName);
+
+                        if (ca == null || !ca.context().started())
+                            continue;
 
-                        if (cache != null)
-                            res.caches().add(cache);
+                        res.getCaches().add(new VisorCache(ignite, ca, arg.getSample()));
                     }
                     catch(IllegalStateException | IllegalArgumentException e) {
                         if (debug && ignite.log() != null)
@@ -164,7 +182,7 @@ public class VisorNodeDataCollectorJob extends VisorJob<VisorNodeDataCollectorTa
             }
         }
         catch (Exception cachesEx) {
-            res.cachesEx(cachesEx);
+            res.setCachesEx(cachesEx);
         }
     }
 
@@ -182,8 +200,7 @@ public class VisorNodeDataCollectorJob extends VisorJob<VisorNodeDataCollectorTa
 
                 FileSystemConfiguration igfsCfg = igfs.configuration();
 
-                if (proxyCache(igfsCfg.getDataCacheConfiguration().getName())
-                    || proxyCache(igfsCfg.getMetaCacheConfiguration().getName()))
+                if (proxyCache(igfsCfg.getDataCacheConfiguration().getName()) || proxyCache(igfsCfg.getMetaCacheConfiguration().getName()))
                     continue;
 
                 try {
@@ -192,11 +209,11 @@ public class VisorNodeDataCollectorJob extends VisorJob<VisorNodeDataCollectorTa
                     if (endPoints != null) {
                         for (IpcServerEndpoint ep : endPoints)
                             if (ep.isManagement())
-                                res.igfsEndpoints().add(new VisorIgfsEndpoint(igfs.name(), ignite.name(),
+                                res.getIgfsEndpoints().add(new VisorIgfsEndpoint(igfs.name(), ignite.name(),
                                     ep.getHost(), ep.getPort()));
                     }
 
-                    res.igfss().add(VisorIgfs.from(igfs));
+                    res.getIgfss().add(new VisorIgfs(igfs));
                 }
                 finally {
                     if (debug)
@@ -205,7 +222,7 @@ public class VisorNodeDataCollectorJob extends VisorJob<VisorNodeDataCollectorTa
             }
         }
         catch (Exception igfssEx) {
-            res.igfssEx(igfssEx);
+            res.setIgfssEx(igfssEx);
         }
     }
 
@@ -223,9 +240,9 @@ public class VisorNodeDataCollectorJob extends VisorJob<VisorNodeDataCollectorTa
      */
     protected VisorNodeDataCollectorJobResult run(VisorNodeDataCollectorJobResult res,
         VisorNodeDataCollectorTaskArg arg) {
-        res.igniteInstanceName(ignite.name());
+        res.setGridName(ignite.name());
 
-        res.topologyVersion(ignite.cluster().topologyVersion());
+        res.setTopologyVersion(ignite.cluster().topologyVersion());
 
         long start0 = U.currentTimeMillis();
 
@@ -244,7 +261,7 @@ public class VisorNodeDataCollectorJob extends VisorJob<VisorNodeDataCollectorTa
         if (debug)
             log(ignite.log(), "Collected igfs", getClass(), start0);
 
-        res.errorCount(ignite.context().exceptionRegistry().errorCount());
+        res.setErrorCount(ignite.context().exceptionRegistry().errorCount());
 
         return res;
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorJobResult.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorJobResult.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorJobResult.java
index d463baa..41f9468 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorJobResult.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorJobResult.java
@@ -17,9 +17,14 @@
 
 package org.apache.ignite.internal.visor.node;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.ArrayList;
-import java.util.Collection;
+import java.util.List;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 import org.apache.ignite.internal.visor.cache.VisorCache;
 import org.apache.ignite.internal.visor.event.VisorGridEvent;
 import org.apache.ignite.internal.visor.igfs.VisorIgfs;
@@ -28,12 +33,12 @@ import org.apache.ignite.internal.visor.igfs.VisorIgfsEndpoint;
 /**
  * Data collector job result.
  */
-public class VisorNodeDataCollectorJobResult implements Serializable {
+public class VisorNodeDataCollectorJobResult extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
-    /** Ignite instance name. */
-    private String igniteInstanceName;
+    /** Grid name. */
+    private String gridName;
 
     /** Node topology version. */
     private long topVer;
@@ -42,22 +47,22 @@ public class VisorNodeDataCollectorJobResult implements Serializable {
     private boolean taskMonitoringEnabled;
 
     /** Node events. */
-    private final Collection<VisorGridEvent> evts = new ArrayList<>();
+    private List<VisorGridEvent> evts = new ArrayList<>();
 
     /** Exception while collecting node events. */
     private Throwable evtsEx;
 
     /** Node caches. */
-    private final Collection<VisorCache> caches = new ArrayList<>();
+    private List<VisorCache> caches = new ArrayList<>();
 
     /** Exception while collecting node caches. */
     private Throwable cachesEx;
 
     /** Node IGFSs. */
-    private final Collection<VisorIgfs> igfss = new ArrayList<>();
+    private List<VisorIgfs> igfss = new ArrayList<>();
 
     /** All IGFS endpoints collected from nodes. */
-    private final Collection<VisorIgfsEndpoint> igfsEndpoints = new ArrayList<>();
+    private List<VisorIgfsEndpoint> igfsEndpoints = new ArrayList<>();
 
     /** Exception while collecting node IGFSs. */
     private Throwable igfssEx;
@@ -66,128 +71,170 @@ public class VisorNodeDataCollectorJobResult implements Serializable {
     private long errCnt;
 
     /**
-     * @return Ignite instance name.
+     * Default constructor.
      */
-    public String igniteInstanceName() {
-        return igniteInstanceName;
+    public VisorNodeDataCollectorJobResult() {
+        // No-op.
     }
 
     /**
-     * @param igniteInstanceName New Ignite instance name.
+     * @return Grid name.
      */
-    public void igniteInstanceName(String igniteInstanceName) {
-        this.igniteInstanceName = igniteInstanceName;
+    public String getGridName() {
+        return gridName;
+    }
+
+    /**
+     * @param gridName New grid name value.
+     */
+    public void setGridName(String gridName) {
+        this.gridName = gridName;
     }
 
     /**
      * @return Current topology version.
      */
-    public long topologyVersion() {
+    public long getTopologyVersion() {
         return topVer;
     }
 
     /**
      * @param topVer New topology version value.
      */
-    public void topologyVersion(long topVer) {
+    public void setTopologyVersion(long topVer) {
         this.topVer = topVer;
     }
 
     /**
      * @return Current task monitoring state.
      */
-    public boolean taskMonitoringEnabled() {
+    public boolean isTaskMonitoringEnabled() {
         return taskMonitoringEnabled;
     }
 
     /**
      * @param taskMonitoringEnabled New value of task monitoring state.
      */
-    public void taskMonitoringEnabled(boolean taskMonitoringEnabled) {
+    public void setTaskMonitoringEnabled(boolean taskMonitoringEnabled) {
         this.taskMonitoringEnabled = taskMonitoringEnabled;
     }
 
     /**
      * @return Collection of collected events.
      */
-    public Collection<VisorGridEvent> events() {
+    public List<VisorGridEvent> getEvents() {
         return evts;
     }
 
     /**
      * @return Exception caught during collecting events.
      */
-    public Throwable eventsEx() {
+    public Throwable getEventsEx() {
         return evtsEx;
     }
 
     /**
      * @param evtsEx Exception caught during collecting events.
      */
-    public void eventsEx(Throwable evtsEx) {
+    public void setEventsEx(Throwable evtsEx) {
         this.evtsEx = evtsEx;
     }
 
     /**
      * @return Collected cache metrics.
      */
-    public Collection<VisorCache> caches() {
+    public List<VisorCache> getCaches() {
         return caches;
     }
 
     /**
      * @return Exception caught during collecting caches metrics.
      */
-    public Throwable cachesEx() {
+    public Throwable getCachesEx() {
         return cachesEx;
     }
 
     /**
      * @param cachesEx Exception caught during collecting caches metrics.
      */
-    public void cachesEx(Throwable cachesEx) {
+    public void setCachesEx(Throwable cachesEx) {
         this.cachesEx = cachesEx;
     }
 
     /**
      * @return Collected IGFSs metrics.
      */
-    public Collection<VisorIgfs> igfss() {
+    public List<VisorIgfs> getIgfss() {
         return igfss;
     }
 
     /**
      * @return Collected IGFSs endpoints.
      */
-    public Collection<VisorIgfsEndpoint> igfsEndpoints() {
+    public List<VisorIgfsEndpoint> getIgfsEndpoints() {
         return igfsEndpoints;
     }
 
     /**
      * @return Exception caught during collecting IGFSs metrics.
      */
-    public Throwable igfssEx() {
+    public Throwable getIgfssEx() {
         return igfssEx;
     }
 
     /**
      * @param igfssEx Exception caught during collecting IGFSs metrics.
      */
-    public void igfssEx(Throwable igfssEx) {
+    public void setIgfssEx(Throwable igfssEx) {
         this.igfssEx = igfssEx;
     }
 
     /**
      * @return Errors count.
      */
-    public long errorCount() {
+    public long getErrorCount() {
         return errCnt;
     }
 
     /**
      * @param errCnt Errors count.
      */
-    public void errorCount(long errCnt) {
+    public void setErrorCount(long errCnt) {
         this.errCnt = errCnt;
     }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, gridName);
+        out.writeLong(topVer);
+        out.writeBoolean(taskMonitoringEnabled);
+        U.writeCollection(out, evts);
+        out.writeObject(evtsEx);
+        U.writeCollection(out, caches);
+        out.writeObject(cachesEx);
+        U.writeCollection(out, igfss);
+        U.writeCollection(out, igfsEndpoints);
+        out.writeObject(igfssEx);
+        out.writeLong(errCnt);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        gridName = U.readString(in);
+        topVer = in.readLong();
+        taskMonitoringEnabled = in.readBoolean();
+        evts = U.readList(in);
+        evtsEx = (Throwable)in.readObject();
+        caches = U.readList(in);
+        cachesEx = (Throwable)in.readObject();
+        igfss = U.readList(in);
+        igfsEndpoints = U.readList(in);
+        igfssEx = (Throwable)in.readObject();
+        errCnt = in.readLong();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorNodeDataCollectorJobResult.class, this);
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorTask.java
index 08d5f9f..af02e34 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorTask.java
@@ -66,11 +66,13 @@ public class VisorNodeDataCollectorTask extends VisorMultiNodeTask<VisorNodeData
                 else {
                     // Ignore nodes that left topology.
                     if (!(unhandledEx instanceof ClusterGroupEmptyException))
-                        taskRes.unhandledEx().put(nid, new VisorExceptionWrapper(unhandledEx));
+                        taskRes.getUnhandledEx().put(nid, new VisorExceptionWrapper(unhandledEx));
                 }
             }
         }
 
+        taskRes.active(true /*ignite.active()*/);
+
         taskRes.active(ignite.active());
 
         return taskRes;
@@ -85,33 +87,33 @@ public class VisorNodeDataCollectorTask extends VisorMultiNodeTask<VisorNodeData
      */
     protected void reduceJobResult(VisorNodeDataCollectorTaskResult taskRes,
         VisorNodeDataCollectorJobResult jobRes, UUID nid) {
-        taskRes.igniteInstanceNames().put(nid, jobRes.igniteInstanceName());
+        taskRes.getGridNames().put(nid, jobRes.getGridName());
 
-        taskRes.topologyVersions().put(nid, jobRes.topologyVersion());
+        taskRes.getTopologyVersions().put(nid, jobRes.getTopologyVersion());
 
-        taskRes.taskMonitoringEnabled().put(nid, jobRes.taskMonitoringEnabled());
+        taskRes.isTaskMonitoringEnabled().put(nid, jobRes.isTaskMonitoringEnabled());
 
-        taskRes.errorCounts().put(nid, jobRes.errorCount());
+        taskRes.getErrorCounts().put(nid, jobRes.getErrorCount());
 
-        if (!jobRes.events().isEmpty())
-            taskRes.events().addAll(jobRes.events());
+        if (!jobRes.getEvents().isEmpty())
+            taskRes.getEvents().addAll(jobRes.getEvents());
 
-        if (jobRes.eventsEx() != null)
-            taskRes.eventsEx().put(nid, new VisorExceptionWrapper(jobRes.eventsEx()));
+        if (jobRes.getEventsEx() != null)
+            taskRes.getEventsEx().put(nid, new VisorExceptionWrapper(jobRes.getEventsEx()));
 
-        if (!jobRes.caches().isEmpty())
-            taskRes.caches().put(nid, jobRes.caches());
+        if (!jobRes.getCaches().isEmpty())
+            taskRes.getCaches().put(nid, jobRes.getCaches());
 
-        if (jobRes.cachesEx() != null)
-            taskRes.cachesEx().put(nid, new VisorExceptionWrapper(jobRes.cachesEx()));
+        if (jobRes.getCachesEx() != null)
+            taskRes.getCachesEx().put(nid, new VisorExceptionWrapper(jobRes.getCachesEx()));
 
-        if (!jobRes.igfss().isEmpty())
-            taskRes.igfss().put(nid, jobRes.igfss());
+        if (!jobRes.getIgfss().isEmpty())
+            taskRes.getIgfss().put(nid, jobRes.getIgfss());
 
-        if (!jobRes.igfsEndpoints().isEmpty())
-            taskRes.igfsEndpoints().put(nid, jobRes.igfsEndpoints());
+        if (!jobRes.getIgfsEndpoints().isEmpty())
+            taskRes.getIgfsEndpoints().put(nid, jobRes.getIgfsEndpoints());
 
-        if (jobRes.igfssEx() != null)
-            taskRes.igfssEx().put(nid, new VisorExceptionWrapper(jobRes.igfssEx()));
+        if (jobRes.getIgfssEx() != null)
+            taskRes.getIgfssEx().put(nid, new VisorExceptionWrapper(jobRes.getIgfssEx()));
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/12dfe9e8/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorTaskArg.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorTaskArg.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorTaskArg.java
index 975dd28..825560b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorTaskArg.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/node/VisorNodeDataCollectorTaskArg.java
@@ -17,12 +17,17 @@
 
 package org.apache.ignite.internal.visor.node;
 
-import java.io.Serializable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
 
 /**
  * Data collector task arguments.
  */
-public class VisorNodeDataCollectorTaskArg implements Serializable {
+public class VisorNodeDataCollectorTaskArg extends VisorDataTransferObject {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -74,70 +79,93 @@ public class VisorNodeDataCollectorTaskArg implements Serializable {
     /**
      * @return {@code true} if Visor should collect information about tasks.
      */
-    public boolean taskMonitoringEnabled() {
+    public boolean isTaskMonitoringEnabled() {
         return taskMonitoringEnabled;
     }
 
     /**
      * @param taskMonitoringEnabled If {@code true} then Visor should collect information about tasks.
      */
-    public void taskMonitoringEnabled(boolean taskMonitoringEnabled) {
+    public void setTaskMonitoringEnabled(boolean taskMonitoringEnabled) {
         this.taskMonitoringEnabled = taskMonitoringEnabled;
     }
 
     /**
      * @return Key for store and read last event order number.
      */
-    public String eventsOrderKey() {
+    public String getEventsOrderKey() {
         return evtOrderKey;
     }
 
     /**
      * @param evtOrderKey Key for store and read last event order number.
      */
-    public void eventsOrderKey(String evtOrderKey) {
+    public void setEventsOrderKey(String evtOrderKey) {
         this.evtOrderKey = evtOrderKey;
     }
 
     /**
      * @return Key for store and read events throttle counter.
      */
-    public String eventsThrottleCounterKey() {
+    public String getEventsThrottleCounterKey() {
         return evtThrottleCntrKey;
     }
 
     /**
      * @param evtThrottleCntrKey Key for store and read events throttle counter.
      */
-    public void eventsThrottleCounterKey(String evtThrottleCntrKey) {
+    public void setEventsThrottleCounterKey(String evtThrottleCntrKey) {
         this.evtThrottleCntrKey = evtThrottleCntrKey;
     }
 
     /**
      * @return Number of items to evaluate cache size.
      */
-    public int sample() {
+    public int getSample() {
         return sample;
     }
 
     /**
      * @param sample Number of items to evaluate cache size.
      */
-    public void sample(int sample) {
+    public void setSample(int sample) {
         this.sample = sample;
     }
 
     /**
      * @return {@code true} if Visor should collect metrics for system caches.
      */
-    public boolean systemCaches() {
+    public boolean getSystemCaches() {
         return sysCaches;
     }
 
     /**
      * @param sysCaches {@code true} if Visor should collect metrics for system caches.
      */
-    public void systemCaches(boolean sysCaches) {
+    public void setSystemCaches(boolean sysCaches) {
         this.sysCaches = sysCaches;
     }
-}
\ No newline at end of file
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        out.writeBoolean(taskMonitoringEnabled);
+        U.writeString(out, evtOrderKey);
+        U.writeString(out, evtThrottleCntrKey);
+        out.writeInt(sample);
+        out.writeBoolean(sysCaches);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        taskMonitoringEnabled = in.readBoolean();
+        evtOrderKey = U.readString(in);
+        evtThrottleCntrKey = U.readString(in);
+        sample = in.readInt();
+        sysCaches = in.readBoolean();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorNodeDataCollectorTaskArg.class, this);
+    }
+}