You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ir...@apache.org on 2019/04/25 18:38:59 UTC

[ignite] branch master updated: IGNITE-11579 Add new commands to deal with garbage in partitions which left after cache destroy in shared cache groups

This is an automated email from the ASF dual-hosted git repository.

irakov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new dd4fa9c  IGNITE-11579 Add new commands to deal with garbage in partitions which left after cache destroy in shared cache groups
dd4fa9c is described below

commit dd4fa9c31d865591d7e683de1e39412535b540d3
Author: EdShangGG <es...@gridgain.com>
AuthorDate: Thu Apr 25 21:34:26 2019 +0300

    IGNITE-11579 Add new commands to deal with garbage in partitions which left after cache destroy in shared cache groups
    
    Signed-off-by: Ivan Rakov <ir...@apache.org>
---
 .../org/apache/ignite/internal/IgniteFeatures.java |   7 +-
 .../internal/commandline/CommandHandler.java       | 145 +++++++--
 .../internal/commandline/cache/CacheArguments.java |  34 +++
 .../internal/commandline/cache/CacheCommand.java   |  38 ++-
 .../cache/argument/FindAndDeleteGarbageArg.java    |  50 ++++
 .../cache/persistence/GridCacheOffheapManager.java |  30 ++
 .../processors/cache/persistence/IndexStorage.java |  16 +
 .../cache/persistence/IndexStorageImpl.java        |  31 +-
 .../processors/cache/tree/CacheDataTree.java       |   7 +-
 .../processors/query/GridQueryIndexing.java        |  25 ++
 .../internal/visor/VisorDataTransferObject.java    |   3 +
 ...orFindAndDeleteGarbageInPersistenceClosure.java | 332 +++++++++++++++++++++
 ...FindAndDeleteGarbageInPersistenceJobResult.java |  83 ++++++
 ...VisorFindAndDeleteGarbageInPersistenceTask.java | 121 ++++++++
 ...orFindAndDeleteGarbageInPersistenceTaskArg.java | 101 +++++++
 ...indAndDeleteGarbageInPersistenceTaskResult.java |  95 ++++++
 .../internal/visor/tx/FetchNearXidVersionTask.java |  11 +
 .../main/resources/META-INF/classnames.properties  | 324 ++++++++++++++------
 .../internal/commandline/CommandArgFactory.java    |   4 +
 .../commandline/CommandHandlerParsingTest.java     | 131 +++++++-
 .../IgniteClientCacheInitializationFailTest.java   |  10 +
 .../testframework/junits/GridAbstractTest.java     |   2 +-
 .../apache/ignite/util/GridCommandHandlerTest.java | 114 ++++---
 .../processors/query/h2/IgniteH2Indexing.java      |  80 +++++
 .../ignite/client/IgniteBinaryQueryTest.java       |   4 -
 .../db/IgniteCacheGroupsWithRestartsTest.java      | 313 +++++++++++++++++++
 .../query/h2/GridIndexFullRebuildTest.java         |   2 +-
 .../IgnitePdsWithIndexingCoreTestSuite.java        |   5 +-
 28 files changed, 1945 insertions(+), 173 deletions(-)

diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java
index f1ac68e..d8277ab 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java
@@ -54,9 +54,12 @@ public enum IgniteFeatures {
      */
     TRANSACTION_OWNER_THREAD_DUMP_PROVIDING(6),
 
-
     /** Displaying versbose transaction information: --info option of --tx control script command. */
-    TX_INFO_COMMAND(7);
+    TX_INFO_COMMAND(7),
+
+    /** Command which allow to detect and cleanup garbage which could left after destroying caches in shared groups */
+    FIND_AND_DELETE_GARBAGE_COMMAND(8);
+
 
     /**
      * Unique feature identifier.
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
index 8f0ec3d..d049d48 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
@@ -64,6 +64,7 @@ import org.apache.ignite.internal.commandline.baseline.BaselineCommand;
 import org.apache.ignite.internal.commandline.cache.CacheArguments;
 import org.apache.ignite.internal.commandline.cache.CacheCommand;
 import org.apache.ignite.internal.commandline.cache.argument.DistributionCommandArg;
+import org.apache.ignite.internal.commandline.cache.argument.FindAndDeleteGarbageArg;
 import org.apache.ignite.internal.commandline.cache.argument.IdleVerifyCommandArg;
 import org.apache.ignite.internal.commandline.cache.argument.ListCommandArg;
 import org.apache.ignite.internal.commandline.cache.argument.ValidateIndexesCommandArg;
@@ -100,6 +101,10 @@ import org.apache.ignite.internal.visor.cache.VisorCacheEvictionConfiguration;
 import org.apache.ignite.internal.visor.cache.VisorCacheNearConfiguration;
 import org.apache.ignite.internal.visor.cache.VisorCacheRebalanceConfiguration;
 import org.apache.ignite.internal.visor.cache.VisorCacheStoreConfiguration;
+import org.apache.ignite.internal.visor.cache.VisorFindAndDeleteGarbageInPersistenceJobResult;
+import org.apache.ignite.internal.visor.cache.VisorFindAndDeleteGarbageInPersistenceTask;
+import org.apache.ignite.internal.visor.cache.VisorFindAndDeleteGarbageInPersistenceTaskArg;
+import org.apache.ignite.internal.visor.cache.VisorFindAndDeleteGarbageInPersistenceTaskResult;
 import org.apache.ignite.internal.visor.misc.VisorClusterNode;
 import org.apache.ignite.internal.visor.misc.VisorWalTask;
 import org.apache.ignite.internal.visor.misc.VisorWalTaskArg;
@@ -164,6 +169,7 @@ import static org.apache.ignite.internal.commandline.OutputFormat.SINGLE_LINE;
 import static org.apache.ignite.internal.commandline.baseline.BaselineCommand.of;
 import static org.apache.ignite.internal.commandline.cache.CacheCommand.CONTENTION;
 import static org.apache.ignite.internal.commandline.cache.CacheCommand.DISTRIBUTION;
+import static org.apache.ignite.internal.commandline.cache.CacheCommand.FIND_AND_DELETE_GARBAGE;
 import static org.apache.ignite.internal.commandline.cache.CacheCommand.HELP;
 import static org.apache.ignite.internal.commandline.cache.CacheCommand.IDLE_VERIFY;
 import static org.apache.ignite.internal.commandline.cache.CacheCommand.LIST;
@@ -814,7 +820,7 @@ public class CommandHandler {
      * @param client Client.
      * @param cacheArgs Cache args.
      */
-    private void cache(GridClient client, CacheArguments cacheArgs) throws Throwable {
+    private Object cache(GridClient client, CacheArguments cacheArgs) throws Throwable {
         switch (cacheArgs.command()) {
             case HELP:
                 printCacheHelp();
@@ -846,11 +852,16 @@ public class CommandHandler {
 
                 break;
 
+            case FIND_AND_DELETE_GARBAGE:
+                return findAndDeleteGarbage(client, cacheArgs);
+
             default:
                 cacheView(client, cacheArgs);
 
                 break;
         }
+
+        return null;
     }
 
     /** */
@@ -873,6 +884,7 @@ public class CommandHandler {
         usageCache(VALIDATE_INDEXES, op(CACHES), OP_NODE_ID, op(or(CHECK_FIRST + " N", CHECK_THROUGH + " K")));
         usageCache(DISTRIBUTION, or(NODE_ID, NULL), op(CACHES), op(USER_ATTRIBUTES, "attrName1,...,attrNameN"));
         usageCache(RESET_LOST_PARTITIONS, CACHES);
+        usageCache(FIND_AND_DELETE_GARBAGE, op(GROUPS), OP_NODE_ID, op(FindAndDeleteGarbageArg.DELETE));
         nl();
     }
 
@@ -920,21 +932,7 @@ public class CommandHandler {
         VisorValidateIndexesTaskResult taskRes = executeTaskByNameOnNode(
             client, VALIDATE_INDEXES_TASK, taskArg, null);
 
-        boolean errors = false;
-
-        if (!F.isEmpty(taskRes.exceptions())) {
-            errors = true;
-
-            log("Index validation failed on nodes:");
-
-            for (Map.Entry<UUID, Exception> e : taskRes.exceptions().entrySet()) {
-                log(i("Node ID: " + e.getKey()));
-
-                log(i("Exception message:"));
-                log(i(e.getValue().getMessage(), 2));
-                nl();
-            }
-        }
+        boolean errors = printErrors(taskRes.exceptions(), "Index validation failed on nodes:");
 
         for (Map.Entry<UUID, VisorValidateIndexesJobResult> nodeEntry : taskRes.results().entrySet()) {
             if (!nodeEntry.getValue().hasIssues())
@@ -1039,6 +1037,79 @@ public class CommandHandler {
      * @param client Client.
      * @param cacheArgs Cache args.
      */
+    private VisorFindAndDeleteGarbageInPersistenceTaskResult findAndDeleteGarbage(
+        GridClient client,
+        CacheArguments cacheArgs
+    ) throws GridClientException {
+        checkFeatureSupportedByCluster(client, IgniteFeatures.FIND_AND_DELETE_GARBAGE_COMMAND, false);
+
+        VisorFindAndDeleteGarbageInPersistenceTaskArg taskArg = new VisorFindAndDeleteGarbageInPersistenceTaskArg(
+            cacheArgs.groups(),
+            cacheArgs.delete(),
+            cacheArgs.nodeId() != null ? Collections.singleton(cacheArgs.nodeId()) : null
+        );
+
+        VisorFindAndDeleteGarbageInPersistenceTaskResult taskRes = executeTask(
+            client, VisorFindAndDeleteGarbageInPersistenceTask.class, taskArg);
+
+        printErrors(taskRes.exceptions(), "Scanning for garbage failed on nodes:");
+
+        for (Map.Entry<UUID, VisorFindAndDeleteGarbageInPersistenceJobResult> nodeEntry : taskRes.result().entrySet()) {
+            if (!nodeEntry.getValue().hasGarbage()) {
+                log("Node "+ nodeEntry.getKey() + " - garbage not found.");
+
+                continue;
+            }
+
+            log("Garbage found on node " + nodeEntry.getKey() + ":");
+
+            VisorFindAndDeleteGarbageInPersistenceJobResult value = nodeEntry.getValue();
+
+            Map<Integer, Map<Integer, Long>> grpPartErrorsCount = value.checkResult();
+
+            if (!grpPartErrorsCount.isEmpty()) {
+                for (Map.Entry<Integer, Map<Integer, Long>> entry : grpPartErrorsCount.entrySet()) {
+                    for (Map.Entry<Integer, Long> e : entry.getValue().entrySet()) {
+                        log(i("Group=" + entry.getKey() +
+                            ", partition=" + e.getKey() +
+                            ", count of keys=" + e.getValue()));
+                    }
+                }
+            }
+
+            nl();
+        }
+
+        return taskRes;
+    }
+
+    /**
+     * @param exceptions Exception per node.
+     * @param msg Message to print before errors if at least one presented.
+     * @return True if found any error.
+     */
+    private boolean printErrors(Map<UUID, Exception> exceptions, String msg) {
+        if (!F.isEmpty(exceptions)) {
+            log(msg);
+
+            for (Map.Entry<UUID, Exception> e : exceptions.entrySet()) {
+                log(i("Node ID: " + e.getKey()));
+
+                log(i("Exception message:"));
+                log(i(e.getValue().getMessage(), 2));
+                nl();
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * @param client Client.
+     * @param cacheArgs Cache args.
+     */
     private void legacyCacheIdleVerify(GridClient client, CacheArguments cacheArgs) throws GridClientException {
         VisorIdleVerifyTaskResult res = executeTask(
             client,
@@ -1951,6 +2022,9 @@ public class CommandHandler {
             case RESET_LOST_PARTITIONS:
                 return "Reset the state of lost partitions for the specified caches.";
 
+            case FIND_AND_DELETE_GARBAGE:
+                return "Find and optionally delete garbage from shared cache groups which could be left after cache destroy.";
+
             default:
                 throw new IllegalArgumentException("Unknown command: " + cmd);
         }
@@ -1982,6 +2056,11 @@ public class CommandHandler {
                 map.put(CHECK_CRC.toString(), "check the CRC-sum of pages stored on disk before verifying data consistency in partitions between primary and backup nodes.");
 
                 break;
+
+            case FIND_AND_DELETE_GARBAGE:
+                map.put(FindAndDeleteGarbageArg.DELETE.toString(), "remove found garbage or not");
+
+                break;
         }
         return map;
     }
@@ -2454,7 +2533,7 @@ public class CommandHandler {
 
                 break;
 
-            case VALIDATE_INDEXES:
+            case VALIDATE_INDEXES: {
                 int argsCnt = 0;
 
                 while (hasNextSubArg() && argsCnt++ < 4) {
@@ -2503,6 +2582,7 @@ public class CommandHandler {
                 }
 
                 break;
+            }
 
             case DISTRIBUTION:
                 String nodeIdStr = nextArg("Node id expected or null");
@@ -2584,6 +2664,35 @@ public class CommandHandler {
 
                 break;
 
+            case FIND_AND_DELETE_GARBAGE: {
+                int argsCnt = 0;
+
+                while (hasNextSubArg() && argsCnt++ < 3) {
+                    String nextArg = nextArg("");
+
+                    FindAndDeleteGarbageArg arg = CommandArgUtils.of(nextArg, FindAndDeleteGarbageArg.class);
+
+                    if (arg == FindAndDeleteGarbageArg.DELETE) {
+                        cacheArgs.delete(true);
+
+                        continue;
+                    }
+
+                    try {
+                        cacheArgs.nodeId(UUID.fromString(nextArg));
+
+                        continue;
+                    }
+                    catch (IllegalArgumentException ignored) {
+                        //No-op.
+                    }
+
+                    cacheArgs.groups(parseCacheNames(nextArg));
+                }
+
+                break;
+            }
+
             default:
                 throw new IllegalArgumentException("Unknown --cache subcommand " + cmd);
         }
@@ -3191,7 +3300,7 @@ public class CommandHandler {
                             break;
 
                         case CACHE:
-                            cache(client, args.cacheArgs());
+                            lastOperationRes = cache(client, args.cacheArgs());
 
                             break;
 
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheArguments.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheArguments.java
index 93bbf76..cd29474 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheArguments.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheArguments.java
@@ -33,6 +33,9 @@ public class CacheArguments {
     /** Caches. */
     private Set<String> caches;
 
+    /** Caches. */
+    private Set<String> groups;
+
     /** Exclude caches or groups. */
     private Set<String> excludeCaches;
 
@@ -81,6 +84,9 @@ public class CacheArguments {
     /** Check CRC sum on idle verify. */
     private boolean idleCheckCrc;
 
+    /** Delete garbage flag. */
+    private boolean delete;
+
     /**
      * @return Gets filter of caches, which will by checked.
      */
@@ -324,4 +330,32 @@ public class CacheArguments {
     public void idleCheckCrc(boolean idleCheckCrc) {
         this.idleCheckCrc = idleCheckCrc;
     }
+
+    /**
+     * @return Set of groups to run operation on.
+     */
+    public Set<String> groups() {
+        return groups;
+    }
+
+    /**
+     * @param groups Set of groups to run operation on.
+     */
+    public void groups(Set<String> groups) {
+        this.groups = groups;
+    }
+
+    /**
+     * @return Delete found garbage or not.
+     */
+    public boolean delete() {
+        return delete;
+    }
+
+    /**
+     * @param delete Delete found garbage or not.
+     */
+    public void delete(boolean delete) {
+        this.delete = delete;
+    }
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheCommand.java
index 63a55d8..2ccaecb 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheCommand.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheCommand.java
@@ -1,19 +1,19 @@
 /*
-* 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.
-*/
+ * 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.commandline.cache;
 
@@ -56,7 +56,13 @@ public enum CacheCommand {
     /**
      * Reset lost partitions
      */
-    RESET_LOST_PARTITIONS("reset_lost_partitions");
+    RESET_LOST_PARTITIONS("reset_lost_partitions"),
+
+    /**
+     * Find and remove garbage.
+     */
+    FIND_AND_DELETE_GARBAGE("find_garbage");
+
 
     /** Enumerated values. */
     private static final CacheCommand[] VALS = values();
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/argument/FindAndDeleteGarbageArg.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/argument/FindAndDeleteGarbageArg.java
new file mode 100644
index 0000000..fa6ed58
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/argument/FindAndDeleteGarbageArg.java
@@ -0,0 +1,50 @@
+/*
+ *
+ *  * 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.commandline.cache.argument;
+
+import org.apache.ignite.internal.commandline.argument.CommandArg;
+
+/**
+ * List of extra arguments.
+ */
+public enum FindAndDeleteGarbageArg implements CommandArg {
+    DELETE("--delete");
+
+    /** Argument name. */
+    private final String name;
+
+    /**
+     * @param name Argument name.
+     */
+    FindAndDeleteGarbageArg(String name) {
+        this.name = name;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String argName() {
+        return name;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return name;
+    }
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheOffheapManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheOffheapManager.java
index 2107d6c..4f02dcf 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheOffheapManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheOffheapManager.java
@@ -1055,6 +1055,36 @@ public class GridCacheOffheapManager extends IgniteCacheOffheapManagerImpl imple
     }
 
     /**
+     * @param cacheId Which was stopped, but its data still presented.
+     * @throws IgniteCheckedException If failed.
+     */
+    public void findAndCleanupLostIndexesForStoppedCache(int cacheId) throws IgniteCheckedException {
+        for (String name : indexStorage.getIndexNames()) {
+            if (indexStorage.nameIsAssosiatedWithCache(name, cacheId)) {
+                ctx.database().checkpointReadLock();
+
+                try {
+                    RootPage page = indexStorage.allocateIndex(name);
+
+                    ctx.kernalContext().query().getIndexing().destroyOrphanIndex(
+                        page,
+                        name,
+                        grp.groupId(),
+                        grp.dataRegion().pageMemory(), globalRemoveId(),
+                        reuseListForIndex(name),
+                        grp.mvccEnabled()
+                    );
+
+                    indexStorage.dropIndex(name);
+                }
+                finally {
+                    ctx.database().checkpointReadUnlock();
+                }
+            }
+        }
+    }
+
+    /**
      *
      */
     private static class WALHistoricalIterator implements IgniteHistoricalIterator {
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IndexStorage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IndexStorage.java
index 295ff00..f9c6031 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IndexStorage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IndexStorage.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.processors.cache.persistence;
 
+import java.util.Collection;
 import org.apache.ignite.IgniteCheckedException;
 
 /**
@@ -70,4 +71,19 @@ public interface IndexStorage {
      * @throws IgniteCheckedException  If failed.
      */
     public void destroy() throws IgniteCheckedException;
+
+    /**
+     * @return Index names of all indexes which this storage keeps.
+     *
+     * @throws IgniteCheckedException  If failed.
+     */
+    public Collection<String> getIndexNames() throws IgniteCheckedException;
+
+    /**
+     *
+     * @param idxName Index name to check.
+     * @param cacheId Cache id to check.
+     * @return True if the given idxName could be assosiated with the given cacheId (existing is not checked).
+     */
+    boolean nameIsAssosiatedWithCache(String idxName, int cacheId);
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IndexStorageImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IndexStorageImpl.java
index b29553c..07a1270 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IndexStorageImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IndexStorageImpl.java
@@ -18,6 +18,8 @@
 package org.apache.ignite.internal.processors.cache.persistence;
 
 import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.concurrent.atomic.AtomicLong;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteException;
@@ -33,6 +35,7 @@ import org.apache.ignite.internal.processors.cache.persistence.tree.io.IOVersion
 import org.apache.ignite.internal.processors.cache.persistence.tree.reuse.ReuseList;
 import org.apache.ignite.internal.processors.cache.persistence.tree.util.PageHandler;
 import org.apache.ignite.internal.processors.failure.FailureProcessor;
+import org.apache.ignite.internal.util.lang.GridCursor;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.jetbrains.annotations.Nullable;
 
@@ -171,6 +174,29 @@ public class IndexStorageImpl implements IndexStorage {
         metaTree.destroy();
     }
 
+    /** {@inheritDoc} */
+    @Override public Collection<String> getIndexNames() throws IgniteCheckedException {
+        assert metaTree != null;
+        
+        GridCursor<IndexItem> cursor = metaTree.find(null, null);
+
+        ArrayList<String> names = new ArrayList<>((int)metaTree.size());
+
+        while (cursor.next()) {
+            IndexItem item = cursor.get();
+            
+            if (item != null)
+                names.add(new String(item.idxName));
+        }
+        
+        return names;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean nameIsAssosiatedWithCache(String idxName, int cacheId) {
+        return !grpShared || idxName.startsWith(Integer.toString(cacheId));
+    }
+
     /**
      * Mask cache index name.
      *
@@ -178,10 +204,7 @@ public class IndexStorageImpl implements IndexStorage {
      * @return Masked name.
      */
     private String maskCacheIndexName(Integer cacheId, String idxName, int segment) {
-        if (grpShared)
-            idxName = Integer.toString(cacheId) + "_" + idxName;
-
-        return idxName + "%" + segment;
+        return (grpShared ? (Integer.toString(cacheId) + "_") : "") + idxName + "%" + segment;
     }
 
     /**
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheDataTree.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheDataTree.java
index b3c1c69..73a6fbb 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheDataTree.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheDataTree.java
@@ -145,8 +145,11 @@ public class CacheDataTree extends BPlusTree<CacheSearchRow, CacheDataRow> {
         Object x
     ) throws IgniteCheckedException {
         // If there is a group of caches, lower and upper bounds will not be null here.
-        if (lower == null && upper == null && grp.persistenceEnabled() && dataPageScanEnabled.get() &&
-            (c == null || c instanceof MvccDataPageClosure))
+        if (lower == null
+                && upper == null
+                && grp.persistenceEnabled()
+                && dataPageScanEnabled.get()
+                && (c == null || c instanceof MvccDataPageClosure))
             return scanDataPages(asRowData(x), (MvccDataPageClosure)c);
 
         lastFindWithDataPageScan = FALSE;
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java
index be775bf..dc2bc0f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java
@@ -29,13 +29,17 @@ import org.apache.ignite.cache.query.SqlQuery;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.IgniteInternalFuture;
 import org.apache.ignite.internal.managers.IgniteMBeansManager;
+import org.apache.ignite.internal.pagemem.PageMemory;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.GridCacheContext;
 import org.apache.ignite.internal.processors.cache.GridCacheContextInfo;
 import org.apache.ignite.internal.processors.cache.mvcc.MvccSnapshot;
 import org.apache.ignite.internal.processors.cache.persistence.CacheDataRow;
+import org.apache.ignite.internal.processors.cache.persistence.RootPage;
+import org.apache.ignite.internal.processors.cache.persistence.tree.reuse.ReuseList;
 import org.apache.ignite.internal.processors.odbc.jdbc.JdbcParameterMeta;
 import org.apache.ignite.internal.processors.query.schema.SchemaIndexCacheVisitor;
+import org.apache.ignite.internal.util.GridAtomicLong;
 import org.apache.ignite.internal.util.GridSpinBusyLock;
 import org.apache.ignite.internal.util.lang.GridCloseableIterator;
 import org.apache.ignite.lang.IgniteBiTuple;
@@ -208,6 +212,27 @@ public interface GridQueryIndexing {
     public void unregisterCache(GridCacheContextInfo cacheInfo, boolean rmvIdx) throws IgniteCheckedException;
 
     /**
+     * Destroy founded index which belongs to stopped cache.
+     *
+     * @param page Root page.
+     * @param indexName Index name.
+     * @param grpId Group id which contains garbage.
+     * @param pageMemory Page memory to work with.
+     * @param removeId Global remove id.
+     * @param reuseList Reuse list where free pages should be stored.
+     * @param mvccEnabled Is mvcc enabled for group or not.
+     * @throws IgniteCheckedException If failed.
+     */
+    public void destroyOrphanIndex(
+        RootPage page,
+        String indexName,
+        int grpId,
+        PageMemory pageMemory,
+        final GridAtomicLong removeId,
+        final ReuseList reuseList,
+        boolean mvccEnabled) throws IgniteCheckedException;
+
+    /**
      *
      * @param cctx Cache context.
      * @param ids Involved cache ids.
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
index 6fd51cd..22863e4 100644
--- 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
@@ -59,6 +59,9 @@ public abstract class VisorDataTransferObject implements Externalizable {
      * @return List based on passed collection.
      */
     @Nullable protected static <T> List<T> toList(Collection<T> col) {
+        if(col instanceof List)
+            return (List<T>)col;
+
         if (col != null)
             return new ArrayList<>(col);
 
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorFindAndDeleteGarbageInPersistenceClosure.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorFindAndDeleteGarbageInPersistenceClosure.java
new file mode 100644
index 0000000..37af676
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorFindAndDeleteGarbageInPersistenceClosure.java
@@ -0,0 +1,332 @@
+/*
+* 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.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.IgniteException;
+import org.apache.ignite.IgniteInterruptedException;
+import org.apache.ignite.IgniteLogger;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.processors.cache.CacheGroupContext;
+import org.apache.ignite.internal.processors.cache.GridCacheContext;
+import org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtLocalPartition;
+import org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionState;
+import org.apache.ignite.internal.processors.cache.persistence.CacheDataRow;
+import org.apache.ignite.internal.processors.cache.persistence.GridCacheOffheapManager;
+import org.apache.ignite.internal.util.lang.GridIterator;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.T2;
+import org.apache.ignite.internal.util.typedef.internal.CU;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.lang.IgniteCallable;
+import org.apache.ignite.resources.IgniteInstanceResource;
+import org.apache.ignite.resources.LoggerResource;
+
+/**
+ * Class contains logic of finding data of already destroyed caches in running cache groups.
+ *
+ * Also, could cleanup this garbage in cache partitions and indexes.
+ */
+public class VisorFindAndDeleteGarbageInPersistenceClosure implements IgniteCallable<VisorFindAndDeleteGarbageInPersistenceJobResult> {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Ignite. */
+    @IgniteInstanceResource
+    private transient IgniteEx ignite;
+
+    /** Injected logger. */
+    @LoggerResource
+    private IgniteLogger log;
+
+    /** Cache group names. */
+    private Set<String> grpNames;
+
+    /** Remove garbage. */
+    private final boolean deleteGarbage;
+
+    /** Counter of processed partitions. */
+    private final AtomicInteger processedPartitions = new AtomicInteger(0);
+
+    /** Total partitions. */
+    private volatile int totalPartitions;
+
+    /** Last progress print timestamp. */
+    private final AtomicLong lastProgressPrintTs = new AtomicLong(0);
+
+    /** Calculation executor. */
+    private volatile ExecutorService calcExecutor;
+
+    /**
+     * @param grpNames Cache group names.
+     * @param deleteGarbage Clean up garbage from partitions.
+     */
+    public VisorFindAndDeleteGarbageInPersistenceClosure(Set<String> grpNames, boolean deleteGarbage) {
+        this.grpNames = grpNames;
+        this.deleteGarbage = deleteGarbage;
+    }
+
+    /** {@inheritDoc} */
+    @Override public VisorFindAndDeleteGarbageInPersistenceJobResult call() throws Exception {
+        calcExecutor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
+
+        try {
+            return call0();
+        }
+        finally {
+            calcExecutor.shutdown();
+        }
+    }
+
+    /**
+     *
+     */
+    private VisorFindAndDeleteGarbageInPersistenceJobResult call0() {
+        Set<Integer> grpIds = calcCacheGroupIds();
+
+        List<T2<CacheGroupContext, GridDhtLocalPartition>> partArgs = calcListOfPartitions(grpIds);
+
+        totalPartitions = partArgs.size();
+
+        List<Future<Map<Integer, Map<Integer, Long>>>> procPartFutures = new ArrayList<>();
+
+        for (final T2<CacheGroupContext, GridDhtLocalPartition> t2 : partArgs)
+            procPartFutures.add(calcExecutor.submit(new Callable<Map<Integer, Map<Integer, Long>>>() {
+                @Override public Map<Integer, Map<Integer, Long>> call() throws Exception {
+                    return processPartition(t2.get1(), t2.get2());
+                }
+            }));
+
+
+        Map<Integer, Map<Integer, Long>> grpIdToPartIdToGarbageCount = new HashMap<>();
+
+        int curPart = 0;
+
+        try {
+            for (; curPart < procPartFutures.size(); curPart++) {
+                Future<Map<Integer, Map<Integer, Long>>> fut = procPartFutures.get(curPart);
+
+                Map<Integer, Map<Integer, Long>> partRes = fut.get();
+
+                for (Map.Entry<Integer, Map<Integer, Long>> e : partRes.entrySet()) {
+                    Map<Integer, Long> map = grpIdToPartIdToGarbageCount.computeIfAbsent(e.getKey(), (x) -> new HashMap<>());
+
+                    for (Map.Entry<Integer, Long> entry : e.getValue().entrySet())
+                        map.compute(entry.getKey(), (k, v) -> (v == null ? 0 : v) + entry.getValue());
+                }
+            }
+
+            if (deleteGarbage)
+                cleanup(grpIdToPartIdToGarbageCount);
+
+            log.warning("VisorFindAndDeleteGarbageInPersistenceClosure finished: processed " + totalPartitions + " partitions.");
+        }
+        catch (InterruptedException | ExecutionException | IgniteCheckedException e) {
+            for (int j = curPart; j < procPartFutures.size(); j++)
+                procPartFutures.get(j).cancel(false);
+
+            throw unwrapFutureException(e);
+        }
+
+        return new VisorFindAndDeleteGarbageInPersistenceJobResult(grpIdToPartIdToGarbageCount);
+    }
+
+    /**
+     * By calling this method we would delete found garbarge in partitions and would try to
+     * cleanup indexes.
+     *
+     * @param grpIdToPartIdToGarbageCount GrpId -&gt; PartId -&gt; Garbage count.
+     */
+    private void cleanup(Map<Integer, Map<Integer, Long>> grpIdToPartIdToGarbageCount) throws IgniteCheckedException {
+        for (Map.Entry<Integer, Map<Integer, Long>> e : grpIdToPartIdToGarbageCount.entrySet()) {
+            int grpId = e.getKey();
+
+            CacheGroupContext groupContext = ignite.context().cache().cacheGroup(grpId);
+
+            assert groupContext != null;
+
+            for (Integer cacheId : e.getValue().keySet()) {
+                groupContext.offheap().stopCache(cacheId, true);
+
+                ((GridCacheOffheapManager)
+                    groupContext.offheap()).findAndCleanupLostIndexesForStoppedCache(cacheId);
+            }
+        }
+    }
+
+   /**
+    * @param grpIds Group ids to generate list of partitions for.
+    */
+   private List<T2<CacheGroupContext, GridDhtLocalPartition>> calcListOfPartitions(Set<Integer> grpIds) {
+        List<T2<CacheGroupContext, GridDhtLocalPartition>> partArgs = new ArrayList<>();
+
+        for (Integer grpId : grpIds) {
+            CacheGroupContext grpCtx = ignite.context().cache().cacheGroup(grpId);
+
+            List<GridDhtLocalPartition> parts = grpCtx.topology().localPartitions();
+
+            for (GridDhtLocalPartition part : parts)
+                partArgs.add(new T2<>(grpCtx, part));
+        }
+
+        // To decrease contention on same group.
+        Collections.shuffle(partArgs);
+        return partArgs;
+    }
+
+    /**
+     * @return Set of cache group ids to scan for garbage on.
+     */
+    private Set<Integer> calcCacheGroupIds() {
+        Set<Integer> grpIds = new HashSet<>();
+
+        Set<String> missingCacheGroups = new HashSet<>();
+
+        if (!F.isEmpty(grpNames)) {
+            for (String grpName : grpNames) {
+                CacheGroupContext groupContext = ignite.context().cache().cacheGroup(CU.cacheId(grpName));
+
+                if (groupContext == null) {
+                    missingCacheGroups.add(grpName);
+
+                    continue;
+                }
+
+                if (groupContext.sharedGroup())
+                    grpIds.add(groupContext.groupId());
+                else
+                    log.warning("Group[name=" + grpName + "] is not shared one, it couldn't contain garbage from destroyed caches.");
+            }
+
+            if (!missingCacheGroups.isEmpty()) {
+                StringBuilder strBuilder = new StringBuilder("The following cache groups do not exist: ");
+
+                for (String name : missingCacheGroups)
+                    strBuilder.append(name).append(", ");
+
+                strBuilder.delete(strBuilder.length() - 2, strBuilder.length());
+
+                throw new IgniteException(strBuilder.toString());
+            }
+        }
+        else {
+            Collection<CacheGroupContext> groups = ignite.context().cache().cacheGroups();
+
+            for (CacheGroupContext grp : groups) {
+                if (!grp.systemCache() && !grp.isLocal())
+                    grpIds.add(grp.groupId());
+            }
+        }
+
+        return grpIds;
+    }
+
+    /**
+     * @param grpCtx Group context.
+     * @param part Local partition.
+     */
+    private Map<Integer, Map<Integer, Long>> processPartition(
+        CacheGroupContext grpCtx,
+        GridDhtLocalPartition part
+    ) {
+        if (!part.reserve())
+            return Collections.emptyMap();
+
+        Map<Integer, Map<Integer, Long>> stoppedCachesForGrpId = new HashMap<>();
+
+        try {
+            if (part.state() != GridDhtPartitionState.OWNING)
+                return Collections.emptyMap();
+
+            GridIterator<CacheDataRow> it = grpCtx.offheap().partitionIterator(part.id());
+
+            while (it.hasNextX()) {
+                CacheDataRow row = it.nextX();
+
+                if (row.cacheId() == 0)
+                    break;
+
+                int cacheId = row.cacheId();
+
+                GridCacheContext cacheCtx = grpCtx.shared().cacheContext(row.cacheId());
+
+                if (cacheCtx == null)
+                    stoppedCachesForGrpId
+                        .computeIfAbsent(grpCtx.groupId(), (x) -> new HashMap<>())
+                        .compute(cacheId, (x, y) -> y == null? 1 : y + 1);
+            }
+        }
+        catch (IgniteCheckedException e) {
+            U.error(log, "Failed to process partition [grpId=" + grpCtx.groupId() +
+                ", partId=" + part.id() + "]", e);
+
+            return Collections.emptyMap();
+        }
+        finally {
+            part.release();
+        }
+
+        processedPartitions.incrementAndGet();
+
+        printProgressIfNeeded();
+
+        return stoppedCachesForGrpId;
+    }
+
+    /**
+     *
+     */
+    private void printProgressIfNeeded() {
+        long curTs = U.currentTimeMillis();
+        long lastTs = lastProgressPrintTs.get();
+
+        if (curTs - lastTs >= 60_000 && lastProgressPrintTs.compareAndSet(lastTs, curTs))
+            log.warning("Current progress of VisorFindAndDeleteGarbageInPersistenceClosure: checked "
+                + processedPartitions.get() + " partitions out of " + totalPartitions);
+    }
+
+    /**
+     * @param e Future result exception.
+     * @return Unwrapped exception.
+     */
+    private IgniteException unwrapFutureException(Exception e) {
+        assert e instanceof InterruptedException || e instanceof ExecutionException : "Expecting either InterruptedException " +
+                "or ExecutionException";
+
+        if (e instanceof InterruptedException)
+            return new IgniteInterruptedException((InterruptedException)e);
+        else if (e.getCause() instanceof IgniteException)
+            return  (IgniteException)e.getCause();
+        else
+            return new IgniteException(e.getCause());
+    }
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorFindAndDeleteGarbageInPersistenceJobResult.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorFindAndDeleteGarbageInPersistenceJobResult.java
new file mode 100644
index 0000000..1c557cd
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorFindAndDeleteGarbageInPersistenceJobResult.java
@@ -0,0 +1,83 @@
+/*
+* 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.dto.IgniteDataTransferObject;
+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.jetbrains.annotations.NotNull;
+
+/**
+ * Result of job work which is sent between nodes.
+ */
+public class VisorFindAndDeleteGarbageInPersistenceJobResult extends IgniteDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Results of indexes validation from node. */
+    @GridToStringInclude
+    private Map<Integer, Map<Integer, Long>> result;
+
+
+    /**
+     * @param result Results with founded garbage (GroupId -> (CacheId, Count of keys)).
+     */
+    public VisorFindAndDeleteGarbageInPersistenceJobResult(@NotNull Map<Integer, Map<Integer, Long>> result) {
+        this.result = result;
+    }
+
+    /**
+     * For externalization only.
+     */
+    public VisorFindAndDeleteGarbageInPersistenceJobResult() {
+    }
+
+    /**
+     * @return Results of indexes validation from node.
+     */
+    public Map<Integer, Map<Integer, Long>> checkResult() {
+        return result;
+    }
+
+    /**
+     * @return {@code true} If any indexes issues found on node, otherwise returns {@code false}.
+     */
+    public boolean hasGarbage() {
+        return result != null && !result.isEmpty();
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeMap(out, result);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        result = U.readMap(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorFindAndDeleteGarbageInPersistenceJobResult.class, this);
+    }
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorFindAndDeleteGarbageInPersistenceTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorFindAndDeleteGarbageInPersistenceTask.java
new file mode 100644
index 0000000..ad167e3
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorFindAndDeleteGarbageInPersistenceTask.java
@@ -0,0 +1,121 @@
+/*
+* 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 java.util.Set;
+import java.util.UUID;
+import org.apache.ignite.IgniteException;
+import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.compute.ComputeJobResult;
+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.internal.visor.VisorTaskArgument;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Compute task which are part of 'find and delete garbage' functionality.
+ */
+@GridInternal
+public class VisorFindAndDeleteGarbageInPersistenceTask extends VisorMultiNodeTask<VisorFindAndDeleteGarbageInPersistenceTaskArg,
+    VisorFindAndDeleteGarbageInPersistenceTaskResult, VisorFindAndDeleteGarbageInPersistenceJobResult> {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** {@inheritDoc} */
+    @Nullable @Override protected VisorFindAndDeleteGarbageInPersistenceTaskResult reduce0(List<ComputeJobResult> list) throws IgniteException {
+        Map<UUID, Exception> exceptions = new HashMap<>();
+        Map<UUID, VisorFindAndDeleteGarbageInPersistenceJobResult> jobResults = new HashMap<>();
+
+        for (ComputeJobResult res : list) {
+            if (res.getException() != null)
+                exceptions.put(res.getNode().id(), res.getException());
+            else
+                jobResults.put(res.getNode().id(), res.getData());
+        }
+
+        return new VisorFindAndDeleteGarbageInPersistenceTaskResult(jobResults, exceptions);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected VisorJob<VisorFindAndDeleteGarbageInPersistenceTaskArg, VisorFindAndDeleteGarbageInPersistenceJobResult> job(VisorFindAndDeleteGarbageInPersistenceTaskArg arg) {
+        return new FindAndDeleteGarbageInPersistenceJob(arg, debug);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected Collection<UUID> jobNodes(VisorTaskArgument<VisorFindAndDeleteGarbageInPersistenceTaskArg> arg) {
+        Collection<ClusterNode> srvNodes = ignite.cluster().forServers().nodes();
+        Collection<UUID> ret = new ArrayList<>(srvNodes.size());
+
+        Set<UUID> nodeIds = arg.getArgument().getNodes();
+
+        if (nodeIds == null) {
+            for (ClusterNode node : srvNodes)
+                ret.add(node.id());
+        }
+        else {
+            for (ClusterNode node : srvNodes) {
+                if (nodeIds.contains(node.id()))
+                    ret.add(node.id());
+            }
+        }
+
+        return ret;
+    }
+
+    /**
+     *
+     */
+    private static class FindAndDeleteGarbageInPersistenceJob extends VisorJob<VisorFindAndDeleteGarbageInPersistenceTaskArg, VisorFindAndDeleteGarbageInPersistenceJobResult> {
+        /** */
+        private static final long serialVersionUID = 0L;
+
+        /**
+         * @param arg Argument.
+         * @param debug Debug.
+         */
+        protected FindAndDeleteGarbageInPersistenceJob(@Nullable VisorFindAndDeleteGarbageInPersistenceTaskArg arg, boolean debug) {
+            super(arg, debug);
+        }
+
+        /** {@inheritDoc} */
+        @Override protected VisorFindAndDeleteGarbageInPersistenceJobResult run(@Nullable VisorFindAndDeleteGarbageInPersistenceTaskArg arg) throws IgniteException {
+            try {
+                VisorFindAndDeleteGarbageInPersistenceClosure closure = new VisorFindAndDeleteGarbageInPersistenceClosure(arg.getGrpNames(), arg.deleteFoundGarbage());
+
+                ignite.context().resource().injectGeneric(closure);
+
+                return closure.call();
+            }
+            catch (Exception e) {
+                throw new IgniteException(e);
+            }
+        }
+
+        /** {@inheritDoc} */
+        @Override public String toString() {
+            return S.toString(FindAndDeleteGarbageInPersistenceJob.class, this);
+        }
+    }
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorFindAndDeleteGarbageInPersistenceTaskArg.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorFindAndDeleteGarbageInPersistenceTaskArg.java
new file mode 100644
index 0000000..0fad3cf
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorFindAndDeleteGarbageInPersistenceTaskArg.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 java.util.UUID;
+import org.apache.ignite.internal.dto.IgniteDataTransferObject;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+
+/**
+ * {@link VisorFindAndDeleteGarbageInPersistenceTask} arguments.
+ */
+public class VisorFindAndDeleteGarbageInPersistenceTaskArg extends IgniteDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Group names. */
+    private Set<String> grpNames;
+
+    /** Would be used  */
+    private boolean deleteFoundGarbage;
+
+    /** Nodes on which task will run. */
+    private Set<UUID> nodes;
+
+    /**
+     * Default constructor.
+     */
+    public VisorFindAndDeleteGarbageInPersistenceTaskArg() {
+        // No-op.
+    }
+
+    /**
+     * @param grpNames Cache group names.
+     */
+    public VisorFindAndDeleteGarbageInPersistenceTaskArg(Set<String> grpNames, boolean deleteFoundGarbage, Set<UUID> nodes) {
+        this.grpNames = grpNames;
+        this.deleteFoundGarbage = deleteFoundGarbage;
+        this.nodes = nodes;
+    }
+
+    /**
+     * @return Caches.
+     */
+    public Set<String> getGrpNames() {
+        return grpNames;
+    }
+
+    /**
+     * @return Nodes on which task will run. If {@code null}, task will run on all server nodes.
+     */
+    public Set<UUID> getNodes() {
+        return nodes;
+    }
+
+    /**
+     * @return True if need to delete garbage as it found.
+     */
+    public boolean deleteFoundGarbage() {
+        return deleteFoundGarbage;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeCollection(out, grpNames);
+        out.writeBoolean(deleteFoundGarbage);
+        U.writeCollection(out, nodes);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        grpNames = U.readSet(in);
+        deleteFoundGarbage = in.readBoolean();
+
+        nodes = U.readSet(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorFindAndDeleteGarbageInPersistenceTaskArg.class, this);
+    }
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorFindAndDeleteGarbageInPersistenceTaskResult.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorFindAndDeleteGarbageInPersistenceTaskResult.java
new file mode 100644
index 0000000..e4e1411
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorFindAndDeleteGarbageInPersistenceTaskResult.java
@@ -0,0 +1,95 @@
+/*
+* 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 java.util.UUID;
+import org.apache.ignite.internal.dto.IgniteDataTransferObject;
+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;
+
+/**
+ * Result of running {@link VisorFindAndDeleteGarbageInPersistenceTask} which would contain result
+ * from all participating nodes.
+ */
+public class VisorFindAndDeleteGarbageInPersistenceTaskResult extends IgniteDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Results of indexes validation from node. */
+    @GridToStringInclude
+    private Map<UUID, VisorFindAndDeleteGarbageInPersistenceJobResult> result;
+
+    /** Exceptions while indexes validation from node. */
+    @GridToStringInclude
+    private Map<UUID, Exception> exceptions;
+
+    /**
+     *
+     */
+    public VisorFindAndDeleteGarbageInPersistenceTaskResult() {
+    }
+
+    /**
+     * For externalization only.
+     * @param jobResults Per node job result.
+     * @param exceptions Per node execution problems.
+     */
+    public VisorFindAndDeleteGarbageInPersistenceTaskResult(
+        Map<UUID, VisorFindAndDeleteGarbageInPersistenceJobResult> jobResults,
+        Map<UUID, Exception> exceptions
+    ) {
+        this.result = jobResults;
+        this.exceptions = exceptions;
+    }
+
+    /**
+     * @return Results of indexes validation from node.
+     */
+    public Map<UUID, VisorFindAndDeleteGarbageInPersistenceJobResult> result() {
+        return result;
+    }
+
+    /**
+     * @return Exception of execution on nodes.
+     */
+    public Map<UUID, Exception> exceptions() {
+        return exceptions;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeMap(out, result);
+        U.writeMap(out, exceptions);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        result = U.readMap(in);
+        exceptions = U.readMap(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorFindAndDeleteGarbageInPersistenceTaskResult.class, this);
+    }
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/tx/FetchNearXidVersionTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/tx/FetchNearXidVersionTask.java
index c2b3e2b..0bfa5f7 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/tx/FetchNearXidVersionTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/tx/FetchNearXidVersionTask.java
@@ -18,7 +18,10 @@ package org.apache.ignite.internal.visor.tx;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
 import org.apache.ignite.IgniteException;
+import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.compute.ComputeJobResult;
 import org.apache.ignite.internal.processors.cache.transactions.IgniteInternalTx;
 import org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager;
@@ -26,6 +29,7 @@ import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
 import org.apache.ignite.internal.processors.task.GridInternal;
 import org.apache.ignite.internal.visor.VisorJob;
 import org.apache.ignite.internal.visor.VisorMultiNodeTask;
+import org.apache.ignite.internal.visor.VisorTaskArgument;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -83,4 +87,11 @@ public class FetchNearXidVersionTask extends VisorMultiNodeTask<TxVerboseId, Gri
             return null;
         }
     }
+
+    /** {@inheritDoc} */
+    @Override protected Collection<UUID> jobNodes(VisorTaskArgument<TxVerboseId> arg) {
+        return ignite.cluster().nodes().stream()
+            .map(ClusterNode::id)
+            .collect(Collectors.toList());
+    }
 }
diff --git a/modules/core/src/main/resources/META-INF/classnames.properties b/modules/core/src/main/resources/META-INF/classnames.properties
index 49f3843..8dc231c 100644
--- a/modules/core/src/main/resources/META-INF/classnames.properties
+++ b/modules/core/src/main/resources/META-INF/classnames.properties
@@ -51,6 +51,7 @@ 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.rendezvous.ClusterNodeAttributeAffinityBackupFilter
 org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction
 org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction$HashComparator
 org.apache.ignite.cache.eviction.AbstractEvictionPolicy
@@ -73,6 +74,7 @@ org.apache.ignite.cache.query.ContinuousQuery
 org.apache.ignite.cache.query.ContinuousQueryWithTransformer
 org.apache.ignite.cache.query.Query
 org.apache.ignite.cache.query.QueryCancelledException
+org.apache.ignite.cache.query.QueryRetryException
 org.apache.ignite.cache.query.ScanQuery
 org.apache.ignite.cache.query.SpiQuery
 org.apache.ignite.cache.query.SqlFieldsQuery
@@ -153,6 +155,7 @@ org.apache.ignite.configuration.DataPageEvictionMode
 org.apache.ignite.configuration.DataRegionConfiguration
 org.apache.ignite.configuration.DataStorageConfiguration
 org.apache.ignite.configuration.DeploymentMode
+org.apache.ignite.configuration.DiskPageCompression
 org.apache.ignite.configuration.IgniteReflectionFactory
 org.apache.ignite.configuration.MemoryConfiguration
 org.apache.ignite.configuration.MemoryPolicyConfiguration
@@ -166,6 +169,7 @@ org.apache.ignite.events.CacheQueryExecutedEvent
 org.apache.ignite.events.CacheQueryReadEvent
 org.apache.ignite.events.CacheRebalancingEvent
 org.apache.ignite.events.CheckpointEvent
+org.apache.ignite.events.ClusterActivationEvent
 org.apache.ignite.events.DeploymentEvent
 org.apache.ignite.events.DiscoveryEvent
 org.apache.ignite.events.Event
@@ -249,6 +253,7 @@ org.apache.ignite.internal.IgniteDiagnosticPrepareContext$1
 org.apache.ignite.internal.IgniteDiagnosticPrepareContext$CompoundInfoClosure
 org.apache.ignite.internal.IgniteEventsImpl
 org.apache.ignite.internal.IgniteEventsImpl$1
+org.apache.ignite.internal.IgniteFeatures
 org.apache.ignite.internal.IgniteFutureCancelledCheckedException
 org.apache.ignite.internal.IgniteFutureTimeoutCheckedException
 org.apache.ignite.internal.IgniteInterruptedCheckedException
@@ -262,10 +267,10 @@ org.apache.ignite.internal.IgniteServicesImpl
 org.apache.ignite.internal.IgnitionEx$IgniteNamedInstance$2
 org.apache.ignite.internal.IgnitionEx$IgniteNamedInstance$3
 org.apache.ignite.internal.IgnitionEx$IgniteNamedInstance$4
+org.apache.ignite.internal.IgnitionEx$IgniteNamedInstance$5
 org.apache.ignite.internal.NodeStoppingException
 org.apache.ignite.internal.SecurityCredentialsAttrFilterPredicate
 org.apache.ignite.internal.TransactionMetricsMxBeanImpl
-org.apache.ignite.internal.TransactionsMXBeanImpl$1
 org.apache.ignite.internal.UnregisteredBinaryTypeException
 org.apache.ignite.internal.UnregisteredClassException
 org.apache.ignite.internal.binary.BinaryEnumObjectImpl
@@ -330,32 +335,38 @@ org.apache.ignite.internal.cluster.IgniteKillTask$IgniteKillJob
 org.apache.ignite.internal.cluster.NodeOrderComparator
 org.apache.ignite.internal.cluster.NodeOrderLegacyComparator
 org.apache.ignite.internal.commandline.Command
-org.apache.ignite.internal.commandline.CommandHandler$1
-org.apache.ignite.internal.commandline.CommandHandler$2
+org.apache.ignite.internal.commandline.OutputFormat
+org.apache.ignite.internal.commandline.baseline.AutoAdjustCommandArg
+org.apache.ignite.internal.commandline.baseline.BaselineCommand
 org.apache.ignite.internal.commandline.cache.CacheCommand
+org.apache.ignite.internal.commandline.cache.argument.DistributionCommandArg
+org.apache.ignite.internal.commandline.cache.argument.FindAndDeleteGarbageArg
+org.apache.ignite.internal.commandline.cache.argument.IdleVerifyCommandArg
+org.apache.ignite.internal.commandline.cache.argument.ListCommandArg
+org.apache.ignite.internal.commandline.cache.argument.ValidateIndexesCommandArg
 org.apache.ignite.internal.commandline.cache.distribution.CacheDistributionGroup
 org.apache.ignite.internal.commandline.cache.distribution.CacheDistributionNode
 org.apache.ignite.internal.commandline.cache.distribution.CacheDistributionPartition
-org.apache.ignite.internal.commandline.cache.distribution.CacheDistributionTask$CacheDistributionJob
 org.apache.ignite.internal.commandline.cache.distribution.CacheDistributionTask
+org.apache.ignite.internal.commandline.cache.distribution.CacheDistributionTask$CacheDistributionJob
 org.apache.ignite.internal.commandline.cache.distribution.CacheDistributionTaskArg
-org.apache.ignite.internal.commandline.cache.distribution.CacheDistributionTaskResult$1
-org.apache.ignite.internal.commandline.cache.distribution.CacheDistributionTaskResult$Row
 org.apache.ignite.internal.commandline.cache.distribution.CacheDistributionTaskResult
-org.apache.ignite.internal.commandline.cache.reset_lost_partitions.CacheResetLostPartitionsTaskResult
-org.apache.ignite.internal.commandline.cache.reset_lost_partitions.CacheResetLostPartitionsTask$CacheResetLostPartitionsJob
 org.apache.ignite.internal.commandline.cache.reset_lost_partitions.CacheResetLostPartitionsTask
+org.apache.ignite.internal.commandline.cache.reset_lost_partitions.CacheResetLostPartitionsTask$CacheResetLostPartitionsJob
 org.apache.ignite.internal.commandline.cache.reset_lost_partitions.CacheResetLostPartitionsTaskArg
+org.apache.ignite.internal.commandline.cache.reset_lost_partitions.CacheResetLostPartitionsTaskResult
 org.apache.ignite.internal.compute.ComputeTaskCancelledCheckedException
 org.apache.ignite.internal.compute.ComputeTaskTimeoutCheckedException
 org.apache.ignite.internal.direct.DirectMessageReader$1
 org.apache.ignite.internal.direct.DirectMessageWriter$1
+org.apache.ignite.internal.dto.IgniteDataTransferObject
 org.apache.ignite.internal.events.DiscoveryCustomEvent
 org.apache.ignite.internal.executor.GridExecutorService
 org.apache.ignite.internal.executor.GridExecutorService$1
 org.apache.ignite.internal.executor.GridExecutorService$TaskTerminateListener
 org.apache.ignite.internal.igfs.common.IgfsIpcCommand
 org.apache.ignite.internal.jdbc.thin.ConnectionPropertiesImpl
+org.apache.ignite.internal.jdbc.thin.ConnectionPropertiesImpl$1
 org.apache.ignite.internal.jdbc.thin.ConnectionPropertiesImpl$BooleanProperty
 org.apache.ignite.internal.jdbc.thin.ConnectionPropertiesImpl$ConnectionProperty
 org.apache.ignite.internal.jdbc.thin.ConnectionPropertiesImpl$IntegerProperty
@@ -374,7 +385,6 @@ org.apache.ignite.internal.jdbc2.JdbcQueryTaskV3
 org.apache.ignite.internal.managers.GridManagerAdapter$1$1
 org.apache.ignite.internal.managers.checkpoint.GridCheckpointManager$CheckpointSet
 org.apache.ignite.internal.managers.checkpoint.GridCheckpointRequest
-org.apache.ignite.internal.managers.communication.GridIoManager$1
 org.apache.ignite.internal.managers.communication.GridIoManager$ConcurrentHashMap0
 org.apache.ignite.internal.managers.communication.GridIoMessage
 org.apache.ignite.internal.managers.communication.GridIoUserMessage
@@ -396,6 +406,9 @@ org.apache.ignite.internal.managers.discovery.GridDiscoveryManager$6
 org.apache.ignite.internal.managers.discovery.GridDiscoveryManager$8
 org.apache.ignite.internal.managers.discovery.GridDiscoveryManager$9
 org.apache.ignite.internal.managers.discovery.GridLocalMetrics
+org.apache.ignite.internal.managers.encryption.GenerateEncryptionKeyRequest
+org.apache.ignite.internal.managers.encryption.GenerateEncryptionKeyResponse
+org.apache.ignite.internal.managers.encryption.GridEncryptionManager$NodeEncryptionKeys
 org.apache.ignite.internal.managers.eventstorage.GridEventStorageMessage
 org.apache.ignite.internal.managers.indexing.GridIndexingManager$1
 org.apache.ignite.internal.managers.loadbalancer.GridLoadBalancerAdapter
@@ -403,20 +416,22 @@ org.apache.ignite.internal.managers.loadbalancer.GridLoadBalancerManager$1
 org.apache.ignite.internal.marshaller.optimized.OptimizedFieldType
 org.apache.ignite.internal.mem.IgniteOutOfMemoryException
 org.apache.ignite.internal.pagemem.impl.PageMemoryNoStoreImpl$Segment
-org.apache.ignite.internal.processors.cache.persistence.StorageException
 org.apache.ignite.internal.pagemem.wal.WALIterator
 org.apache.ignite.internal.pagemem.wal.WALPointer
 org.apache.ignite.internal.pagemem.wal.record.ExchangeRecord$Type
+org.apache.ignite.internal.pagemem.wal.record.RolloverType
+org.apache.ignite.internal.pagemem.wal.record.WALRecord$RecordPurpose
 org.apache.ignite.internal.pagemem.wal.record.WALRecord$RecordType
 org.apache.ignite.internal.pagemem.wal.record.delta.DeltaApplicationException
 org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion
 org.apache.ignite.internal.processors.affinity.GridAffinityAssignment
+org.apache.ignite.internal.processors.affinity.GridAffinityAssignmentV2
 org.apache.ignite.internal.processors.affinity.GridAffinityMessage
+org.apache.ignite.internal.processors.affinity.GridAffinityProcessor$2
+org.apache.ignite.internal.processors.affinity.GridAffinityProcessor$AffinityFuture$1
 org.apache.ignite.internal.processors.affinity.GridAffinityUtils$AffinityJob
 org.apache.ignite.internal.processors.authentication.IgniteAccessControlException
-org.apache.ignite.internal.processors.authentication.IgniteAuthenticationProcessor$3
 org.apache.ignite.internal.processors.authentication.IgniteAuthenticationProcessor$InitialUsersData
-org.apache.ignite.internal.processors.authentication.IgniteAuthenticationProcessor$RefreshUsersStorageWorker$1
 org.apache.ignite.internal.processors.authentication.User
 org.apache.ignite.internal.processors.authentication.UserAcceptedMessage
 org.apache.ignite.internal.processors.authentication.UserAuthenticateRequestMessage
@@ -438,22 +453,20 @@ org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager$14
 org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager$15
 org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager$16
 org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager$17
+org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager$17$1
 org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager$18
-org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager$18$1
-org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager$18$2
 org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager$19
 org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager$2
 org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager$20
-org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager$21
-org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager$22
 org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager$4
-org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager$5
+org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager$6
 org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager$7
 org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager$8
 org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager$9
 org.apache.ignite.internal.processors.cache.CacheClientReconnectDiscoveryData
 org.apache.ignite.internal.processors.cache.CacheClientReconnectDiscoveryData$CacheGroupInfo
 org.apache.ignite.internal.processors.cache.CacheClientReconnectDiscoveryData$CacheInfo
+org.apache.ignite.internal.processors.cache.CacheConfigurationEnrichment
 org.apache.ignite.internal.processors.cache.CacheData
 org.apache.ignite.internal.processors.cache.CacheDefaultBinaryAffinityKeyMapper
 org.apache.ignite.internal.processors.cache.CacheEntryImpl
@@ -467,7 +480,6 @@ org.apache.ignite.internal.processors.cache.CacheEntryPredicateNoValue
 org.apache.ignite.internal.processors.cache.CacheEntrySerializablePredicate
 org.apache.ignite.internal.processors.cache.CacheEvictionEntry
 org.apache.ignite.internal.processors.cache.CacheGroupContext$2
-org.apache.ignite.internal.processors.cache.CacheGroupContext$3
 org.apache.ignite.internal.processors.cache.CacheGroupData
 org.apache.ignite.internal.processors.cache.CacheInvalidStateException
 org.apache.ignite.internal.processors.cache.CacheInvokeDirectResult
@@ -502,6 +514,7 @@ org.apache.ignite.internal.processors.cache.DynamicCacheChangeRequest
 org.apache.ignite.internal.processors.cache.EntryProcessorResourceInjectorProxy
 org.apache.ignite.internal.processors.cache.ExchangeActions$1
 org.apache.ignite.internal.processors.cache.ExchangeActions$2
+org.apache.ignite.internal.processors.cache.FetchActiveTxOwnerTraceClosure
 org.apache.ignite.internal.processors.cache.GatewayProtectedCacheProxy
 org.apache.ignite.internal.processors.cache.GridCacheAdapter
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$10
@@ -521,14 +534,12 @@ org.apache.ignite.internal.processors.cache.GridCacheAdapter$3
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$30
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$32
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$4
+org.apache.ignite.internal.processors.cache.GridCacheAdapter$47
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$48
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$49
-org.apache.ignite.internal.processors.cache.GridCacheAdapter$50
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$51
+org.apache.ignite.internal.processors.cache.GridCacheAdapter$52
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$53
-org.apache.ignite.internal.processors.cache.GridCacheAdapter$54
-org.apache.ignite.internal.processors.cache.GridCacheAdapter$55
-org.apache.ignite.internal.processors.cache.GridCacheAdapter$56
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$6
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$8
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$AsyncOp$1
@@ -545,6 +556,7 @@ org.apache.ignite.internal.processors.cache.GridCacheAdapter$LoadCacheClosure
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$LoadCacheJob
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$LoadCacheJobV2
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$LoadKeysCallable
+org.apache.ignite.internal.processors.cache.GridCacheAdapter$PartitionPreloadJob
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$PartitionSizeLongJob
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$PartitionSizeLongTask
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$SizeJob
@@ -585,13 +597,17 @@ org.apache.ignite.internal.processors.cache.GridCacheLoaderWriterStoreFactory
 org.apache.ignite.internal.processors.cache.GridCacheLockTimeoutException
 org.apache.ignite.internal.processors.cache.GridCacheLogger
 org.apache.ignite.internal.processors.cache.GridCacheMapEntry$1
+org.apache.ignite.internal.processors.cache.GridCacheMapEntry$MvccAcquireLockListener
+org.apache.ignite.internal.processors.cache.GridCacheMapEntry$MvccRemoveLockListener
+org.apache.ignite.internal.processors.cache.GridCacheMapEntry$MvccUpdateLockListener
 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$5
+org.apache.ignite.internal.processors.cache.GridCacheMvccEntryInfo
 org.apache.ignite.internal.processors.cache.GridCacheMvccManager$6
 org.apache.ignite.internal.processors.cache.GridCacheMvccManager$7
+org.apache.ignite.internal.processors.cache.GridCacheMvccManager$8
 org.apache.ignite.internal.processors.cache.GridCacheMvccManager$FinishLockFuture$1
 org.apache.ignite.internal.processors.cache.GridCacheOperation
 org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$2
@@ -599,7 +615,8 @@ org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$2$
 org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$3
 org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$4
 org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$5
-org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$6
+org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$7
+org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$9
 org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$ExchangeFutureSet
 org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$MessageHandler
 org.apache.ignite.internal.processors.cache.GridCacheProcessor$1
@@ -610,6 +627,8 @@ org.apache.ignite.internal.processors.cache.GridCacheProcessor$3
 org.apache.ignite.internal.processors.cache.GridCacheProcessor$4
 org.apache.ignite.internal.processors.cache.GridCacheProcessor$5
 org.apache.ignite.internal.processors.cache.GridCacheProcessor$6
+org.apache.ignite.internal.processors.cache.GridCacheProcessor$7
+org.apache.ignite.internal.processors.cache.GridCacheProcessor$7$1
 org.apache.ignite.internal.processors.cache.GridCacheProcessor$8
 org.apache.ignite.internal.processors.cache.GridCacheProcessor$9
 org.apache.ignite.internal.processors.cache.GridCacheProcessor$LocalAffinityFunction
@@ -632,7 +651,8 @@ org.apache.ignite.internal.processors.cache.GridCacheUtils$18
 org.apache.ignite.internal.processors.cache.GridCacheUtils$19
 org.apache.ignite.internal.processors.cache.GridCacheUtils$2
 org.apache.ignite.internal.processors.cache.GridCacheUtils$20
-org.apache.ignite.internal.processors.cache.GridCacheUtils$22
+org.apache.ignite.internal.processors.cache.GridCacheUtils$21
+org.apache.ignite.internal.processors.cache.GridCacheUtils$23
 org.apache.ignite.internal.processors.cache.GridCacheUtils$3
 org.apache.ignite.internal.processors.cache.GridCacheUtils$4
 org.apache.ignite.internal.processors.cache.GridCacheUtils$5
@@ -663,12 +683,12 @@ org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl$4
 org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl$6
 org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl$7
 org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl$8
-org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl$9
 org.apache.ignite.internal.processors.cache.IgniteRebalanceIterator
 org.apache.ignite.internal.processors.cache.KeyCacheObject
 org.apache.ignite.internal.processors.cache.KeyCacheObjectImpl
 org.apache.ignite.internal.processors.cache.QueryCursorImpl$State
 org.apache.ignite.internal.processors.cache.StoredCacheData
+org.apache.ignite.internal.processors.cache.TxOwnerDumpRequestAllowedSettingClosure
 org.apache.ignite.internal.processors.cache.TxTimeoutOnPartitionMapExchangeChangeMessage
 org.apache.ignite.internal.processors.cache.WalStateAbstractMessage
 org.apache.ignite.internal.processors.cache.WalStateAckMessage
@@ -680,7 +700,7 @@ org.apache.ignite.internal.processors.cache.affinity.GridCacheAffinityProxy
 org.apache.ignite.internal.processors.cache.binary.BinaryMetadataHolder
 org.apache.ignite.internal.processors.cache.binary.BinaryMetadataKey
 org.apache.ignite.internal.processors.cache.binary.BinaryMetadataTransport$2
-org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl$3
+org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl$2
 org.apache.ignite.internal.processors.cache.binary.MetadataRequestMessage
 org.apache.ignite.internal.processors.cache.binary.MetadataResponseMessage
 org.apache.ignite.internal.processors.cache.binary.MetadataResponseMessage$ClientResponseStatus
@@ -714,6 +734,10 @@ org.apache.ignite.internal.processors.cache.distributed.GridDistributedTxPrepare
 org.apache.ignite.internal.processors.cache.distributed.GridDistributedTxRemoteAdapter
 org.apache.ignite.internal.processors.cache.distributed.GridDistributedUnlockRequest
 org.apache.ignite.internal.processors.cache.distributed.IgniteExternalizableExpiryPolicy
+org.apache.ignite.internal.processors.cache.distributed.dht.CacheDistributedGetFutureAdapter$1
+org.apache.ignite.internal.processors.cache.distributed.dht.CacheDistributedGetFutureAdapter$AbstractMiniFuture$1
+org.apache.ignite.internal.processors.cache.distributed.dht.CacheDistributedGetFutureAdapter$AbstractMiniFuture$2
+org.apache.ignite.internal.processors.cache.distributed.dht.CacheDistributedGetFutureAdapter$AbstractMiniFuture$2$1
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtAffinityAssignmentRequest
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtAffinityAssignmentResponse
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtCache
@@ -732,15 +756,13 @@ org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtGetFuture$3
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtGetSingleFuture$1
 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.GridDhtLockFuture$1
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLockFuture$2
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLockFuture$3
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLockFuture$4
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLockRequest
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLockResponse
-org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionState
-org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionsReservation$1
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTopologyFutureAdapter$OperationType
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$1
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$10
@@ -748,7 +770,16 @@ org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactional
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$12
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$13
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$14
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$15
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$16
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$17
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$18
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$19
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$2
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$20
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$21
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$22
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$23
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$3
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$4
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$5
@@ -756,6 +787,8 @@ org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactional
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$7
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$8
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$9
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxAbstractEnlistFuture$1
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxAbstractEnlistFuture$2
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxFinishFuture$1
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxFinishRequest
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxFinishResponse
@@ -773,18 +806,16 @@ org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFutu
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture$4
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareRequest
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareResponse
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxQueryEnlistRequest
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxQueryEnlistResponse
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxQueryFirstEnlistRequest
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxRemote
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtUnlockRequest
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtUnreservedPartitionException
-org.apache.ignite.internal.processors.cache.distributed.dht.GridPartitionedGetFuture$1
-org.apache.ignite.internal.processors.cache.distributed.dht.GridPartitionedGetFuture$2
-org.apache.ignite.internal.processors.cache.distributed.dht.GridPartitionedGetFuture$MiniFuture$1
-org.apache.ignite.internal.processors.cache.distributed.dht.GridPartitionedGetFuture$MiniFuture$2
-org.apache.ignite.internal.processors.cache.distributed.dht.GridPartitionedGetFuture$MiniFuture$3
-org.apache.ignite.internal.processors.cache.distributed.dht.GridPartitionedGetFuture$MiniFuture$3$1
-org.apache.ignite.internal.processors.cache.distributed.dht.GridPartitionedSingleGetFuture$1
-org.apache.ignite.internal.processors.cache.distributed.dht.GridPartitionedSingleGetFuture$2
-org.apache.ignite.internal.processors.cache.distributed.dht.GridPartitionedSingleGetFuture$3
+org.apache.ignite.internal.processors.cache.distributed.dht.GridInvokeValue
+org.apache.ignite.internal.processors.cache.distributed.dht.NearTxQueryEnlistResultHandler
+org.apache.ignite.internal.processors.cache.distributed.dht.NearTxResultHandler
+org.apache.ignite.internal.processors.cache.distributed.dht.PartitionUpdateCountersMessage
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicAbstractUpdateFuture$1
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicAbstractUpdateRequest
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache
@@ -845,18 +876,18 @@ org.apache.ignite.internal.processors.cache.distributed.dht.atomic.NearCacheUpda
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.UpdateErrors
 org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedCache
 org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedCache$1
+org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedCache$10
 org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedCache$2
 org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedCache$3
 org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedCache$4$1
-org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedCache$6
+org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedCache$5
 org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedCache$7
 org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedCache$8
+org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedCache$9
 org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedLockFuture$1
 org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedLockFuture$2
 org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedLockFuture$3
-org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedLockFuture$4
 org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedLockFuture$LockTimeoutObject$1
-org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedLockFuture$MiniFuture$1
 org.apache.ignite.internal.processors.cache.distributed.dht.preloader.CacheGroupAffinityMessage
 org.apache.ignite.internal.processors.cache.distributed.dht.preloader.CachePartitionFullCountersMap
 org.apache.ignite.internal.processors.cache.distributed.dht.preloader.CachePartitionPartialCountersMap
@@ -873,6 +904,7 @@ org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPar
 org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap
 org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap
 org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionSupplyMessage
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionSupplyMessageV2
 org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsAbstractMessage
 org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture$2
 org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture$3
@@ -881,11 +913,12 @@ org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPar
 org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture$6
 org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture$7
 org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture$8
-org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture$9
-org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture$9$1$1
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture$8$1$1
 org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture$ExchangeLocalState
 org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture$ExchangeType
 org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsFullMessage
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsFullMessage$1
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsFullMessage$2
 org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsSingleMessage
 org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsSingleRequest
 org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPreloader$1
@@ -899,6 +932,9 @@ org.apache.ignite.internal.processors.cache.distributed.dht.preloader.IgniteDhtP
 org.apache.ignite.internal.processors.cache.distributed.dht.preloader.IgniteHistoricalIterator
 org.apache.ignite.internal.processors.cache.distributed.dht.preloader.IgniteRebalanceIteratorImpl
 org.apache.ignite.internal.processors.cache.distributed.dht.preloader.latch.LatchAckMessage
+org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtInvalidPartitionException
+org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionState
+org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionsReservation$1
 org.apache.ignite.internal.processors.cache.distributed.near.CacheVersionedValue
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearAtomicCache
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearAtomicCache$1
@@ -906,12 +942,6 @@ org.apache.ignite.internal.processors.cache.distributed.near.GridNearCacheAdapte
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearCacheAdapter$2
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearCacheAdapter$3
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearCacheAdapter$EntrySet$1
-org.apache.ignite.internal.processors.cache.distributed.near.GridNearGetFuture$1
-org.apache.ignite.internal.processors.cache.distributed.near.GridNearGetFuture$2
-org.apache.ignite.internal.processors.cache.distributed.near.GridNearGetFuture$MiniFuture$1
-org.apache.ignite.internal.processors.cache.distributed.near.GridNearGetFuture$MiniFuture$2
-org.apache.ignite.internal.processors.cache.distributed.near.GridNearGetFuture$MiniFuture$3
-org.apache.ignite.internal.processors.cache.distributed.near.GridNearGetFuture$MiniFuture$3$1
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearGetRequest
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearGetResponse
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearLockFuture$1
@@ -924,7 +954,6 @@ org.apache.ignite.internal.processors.cache.distributed.near.GridNearLockRequest
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearLockResponse
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearOptimisticSerializableTxPrepareFuture$1
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearOptimisticSerializableTxPrepareFuture$2
-org.apache.ignite.internal.processors.cache.distributed.near.GridNearOptimisticSerializableTxPrepareFuture$3
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearOptimisticSerializableTxPrepareFuture$ClientRemapFutureReducer
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearOptimisticSerializableTxPrepareFuture$MiniFuture$1
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearOptimisticSerializableTxPrepareFuture$MiniFuture$1$1
@@ -933,8 +962,6 @@ org.apache.ignite.internal.processors.cache.distributed.near.GridNearOptimisticT
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearOptimisticTxPrepareFuture$3
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearOptimisticTxPrepareFuture$4
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearOptimisticTxPrepareFuture$5
-org.apache.ignite.internal.processors.cache.distributed.near.GridNearOptimisticTxPrepareFuture$MiniFuture$1
-org.apache.ignite.internal.processors.cache.distributed.near.GridNearOptimisticTxPrepareFutureAdapter$1
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearPessimisticTxPrepareFuture$1
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearPessimisticTxPrepareFuture$2
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearSingleGetRequest
@@ -942,6 +969,11 @@ org.apache.ignite.internal.processors.cache.distributed.near.GridNearSingleGetRe
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTransactionalCache
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTransactionalCache$1
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTransactionalCache$2
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxAbstractEnlistFuture$1
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxEnlistFuture$1
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxEnlistFuture$2
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxEnlistRequest
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxEnlistResponse
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxFinishFuture$1
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxFinishFuture$2
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxFinishFuture$3
@@ -951,24 +983,30 @@ org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxFinishRes
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$1
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$10
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$11
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$12
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$13
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$14
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$15
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$16
-org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$17
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$18
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$19
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$2
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$20
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$21
-org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$21$1
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$22
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$23
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$24
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$25
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$26
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$27
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$27$1
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$28
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$29
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$3
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$30
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$31
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$32
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$4
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$5
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$6
@@ -979,6 +1017,14 @@ org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$Fin
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxPrepareFutureAdapter$1
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxPrepareRequest
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxPrepareResponse
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxQueryEnlistFuture$1
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxQueryEnlistFuture$2
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxQueryEnlistRequest
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxQueryEnlistResponse
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxQueryResultsEnlistFuture$1
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxQueryResultsEnlistFuture$2
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxQueryResultsEnlistRequest
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxQueryResultsEnlistResponse
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxRemote
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearUnlockRequest
 org.apache.ignite.internal.processors.cache.dr.GridCacheDrExpirationInfo
@@ -991,18 +1037,45 @@ org.apache.ignite.internal.processors.cache.local.atomic.GridLocalAtomicCache$4
 org.apache.ignite.internal.processors.cache.local.atomic.GridLocalAtomicCache$5
 org.apache.ignite.internal.processors.cache.local.atomic.GridLocalAtomicCache$8
 org.apache.ignite.internal.processors.cache.local.atomic.GridLocalAtomicCache$9
+org.apache.ignite.internal.processors.cache.mvcc.DeadlockProbe
+org.apache.ignite.internal.processors.cache.mvcc.MvccCoordinator
+org.apache.ignite.internal.processors.cache.mvcc.MvccProcessorImpl$2
+org.apache.ignite.internal.processors.cache.mvcc.MvccProcessorImpl$4
+org.apache.ignite.internal.processors.cache.mvcc.MvccProcessorImpl$4$1
+org.apache.ignite.internal.processors.cache.mvcc.MvccProcessorImpl$MvccMessageListener$1
+org.apache.ignite.internal.processors.cache.mvcc.MvccSnapshot
+org.apache.ignite.internal.processors.cache.mvcc.MvccSnapshotWithoutTxs
+org.apache.ignite.internal.processors.cache.mvcc.MvccVersionImpl
+org.apache.ignite.internal.processors.cache.mvcc.ProbedTx
+org.apache.ignite.internal.processors.cache.mvcc.VacuumMetricsReducer
+org.apache.ignite.internal.processors.cache.mvcc.msg.MvccAckRequestQueryCntr
+org.apache.ignite.internal.processors.cache.mvcc.msg.MvccAckRequestQueryId
+org.apache.ignite.internal.processors.cache.mvcc.msg.MvccAckRequestTx
+org.apache.ignite.internal.processors.cache.mvcc.msg.MvccAckRequestTxAndQueryCntr
+org.apache.ignite.internal.processors.cache.mvcc.msg.MvccAckRequestTxAndQueryId
+org.apache.ignite.internal.processors.cache.mvcc.msg.MvccActiveQueriesMessage
+org.apache.ignite.internal.processors.cache.mvcc.msg.MvccFutureResponse
+org.apache.ignite.internal.processors.cache.mvcc.msg.MvccMessage
+org.apache.ignite.internal.processors.cache.mvcc.msg.MvccQuerySnapshotRequest
+org.apache.ignite.internal.processors.cache.mvcc.msg.MvccRecoveryFinishedMessage
+org.apache.ignite.internal.processors.cache.mvcc.msg.MvccSnapshotResponse
+org.apache.ignite.internal.processors.cache.mvcc.msg.MvccTxSnapshotRequest
+org.apache.ignite.internal.processors.cache.mvcc.msg.PartitionCountersNeighborcastRequest
+org.apache.ignite.internal.processors.cache.mvcc.msg.PartitionCountersNeighborcastResponse
 org.apache.ignite.internal.processors.cache.persistence.CacheDataRowAdapter$RowData
-org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager$2
 org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager$4
-org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager$7
+org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager$8
+org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager$CheckpointReadLockTimeoutException
 org.apache.ignite.internal.processors.cache.persistence.GridCacheOffheapManager$WALHistoricalIterator
 org.apache.ignite.internal.processors.cache.persistence.IgniteCacheDatabaseSharedManager$1
+org.apache.ignite.internal.processors.cache.persistence.StorageException
 org.apache.ignite.internal.processors.cache.persistence.checkpoint.CheckpointEntryType
 org.apache.ignite.internal.processors.cache.persistence.file.AsyncFileIOFactory
-org.apache.ignite.internal.processors.cache.persistence.file.FileDownloader$1
+org.apache.ignite.internal.processors.cache.persistence.file.EncryptedFileIOFactory
 org.apache.ignite.internal.processors.cache.persistence.file.FileIOFactory
-org.apache.ignite.internal.processors.cache.persistence.file.PersistentStorageIOException
+org.apache.ignite.internal.processors.cache.persistence.file.FilePageStoreManager$IdxCacheStores
 org.apache.ignite.internal.processors.cache.persistence.file.RandomAccessFileIOFactory
+org.apache.ignite.internal.processors.cache.persistence.freelist.CorruptedFreeListException
 org.apache.ignite.internal.processors.cache.persistence.migration.UpgradePendingTreeToPerPartitionTask
 org.apache.ignite.internal.processors.cache.persistence.pagemem.PageMemoryImpl$Segment
 org.apache.ignite.internal.processors.cache.persistence.pagemem.PageMemoryImpl$ThrottlingPolicy
@@ -1012,15 +1085,16 @@ org.apache.ignite.internal.processors.cache.persistence.snapshot.SnapshotOperati
 org.apache.ignite.internal.processors.cache.persistence.snapshot.TrackingPageIsCorruptedException
 org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree$Bool
 org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree$Result
+org.apache.ignite.internal.processors.cache.persistence.tree.CorruptedTreeException
 org.apache.ignite.internal.processors.cache.persistence.tree.io.DataPageIO$EntryPart
 org.apache.ignite.internal.processors.cache.persistence.tree.reuse.LongListReuseBag
 org.apache.ignite.internal.processors.cache.persistence.wal.AbstractWalRecordsIterator
 org.apache.ignite.internal.processors.cache.persistence.wal.AbstractWalRecordsIterator$StartSeekingFilter
 org.apache.ignite.internal.processors.cache.persistence.wal.FileWALPointer
-org.apache.ignite.internal.processors.cache.persistence.wal.FileWriteAheadLogManager$7
+org.apache.ignite.internal.processors.cache.persistence.wal.FileWriteAheadLogManager$6
 org.apache.ignite.internal.processors.cache.persistence.wal.FileWriteAheadLogManager$FileArchiver$1
 org.apache.ignite.internal.processors.cache.persistence.wal.FileWriteAheadLogManager$FileArchiver$2
-org.apache.ignite.internal.processors.cache.persistence.wal.FileWriteAheadLogManager$FileCompressor$1
+org.apache.ignite.internal.processors.cache.persistence.wal.FileWriteAheadLogManager$FileCompressorWorker$1
 org.apache.ignite.internal.processors.cache.persistence.wal.FileWriteAheadLogManager$RecordsIterator
 org.apache.ignite.internal.processors.cache.persistence.wal.SegmentEofException
 org.apache.ignite.internal.processors.cache.persistence.wal.SegmentedRingByteBuffer$BufferMode
@@ -1029,6 +1103,7 @@ org.apache.ignite.internal.processors.cache.persistence.wal.SingleSegmentLogical
 org.apache.ignite.internal.processors.cache.persistence.wal.WalSegmentTailReachedException
 org.apache.ignite.internal.processors.cache.persistence.wal.crc.IgniteDataIntegrityViolationException
 org.apache.ignite.internal.processors.cache.persistence.wal.reader.StandaloneWalRecordsIterator
+org.apache.ignite.internal.processors.cache.persistence.wal.reader.StrictBoundsCheckException
 org.apache.ignite.internal.processors.cache.query.CacheQueryEntry
 org.apache.ignite.internal.processors.cache.query.CacheQueryType
 org.apache.ignite.internal.processors.cache.query.GridCacheDistributedQueryFuture$1
@@ -1038,6 +1113,7 @@ org.apache.ignite.internal.processors.cache.query.GridCacheDistributedQueryManag
 org.apache.ignite.internal.processors.cache.query.GridCacheDistributedQueryManager$5
 org.apache.ignite.internal.processors.cache.query.GridCacheDistributedQueryManager$6
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryAdapter$1
+org.apache.ignite.internal.processors.cache.query.GridCacheQueryAdapter$MvccTrackingIterator
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryAdapter$ScanQueryFallbackClosableIterator
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryDetailMetricsAdapter
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryFutureAdapter$1
@@ -1049,7 +1125,6 @@ org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$5
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$6
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$7
 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$QueueIterator
@@ -1082,7 +1157,6 @@ org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQuer
 org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryEvent
 org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryHandler
 org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryHandler$1
-org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryHandler$2$1
 org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryHandler$ContinuousQueryAsyncClosure$1
 org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryHandlerV2
 org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryHandlerV3
@@ -1125,6 +1199,7 @@ org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$15
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$16
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$17
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$18
+org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$19
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$2
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$3
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$4
@@ -1150,7 +1225,6 @@ org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager$4
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager$5
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager$CommitListener
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager$CommittedVersion
-org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager$NodeFailureTimeoutObject$1
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxMap
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxMap$1
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxMap$1$1
@@ -1168,13 +1242,17 @@ org.apache.ignite.internal.processors.cache.transactions.TxLock
 org.apache.ignite.internal.processors.cache.transactions.TxLockList
 org.apache.ignite.internal.processors.cache.transactions.TxLocksRequest
 org.apache.ignite.internal.processors.cache.transactions.TxLocksResponse
+org.apache.ignite.internal.processors.cache.tree.mvcc.data.ResultType
 org.apache.ignite.internal.processors.cache.verify.CacheInfo
 org.apache.ignite.internal.processors.cache.verify.CollectConflictPartitionKeysTask
 org.apache.ignite.internal.processors.cache.verify.CollectConflictPartitionKeysTask$CollectPartitionEntryHashesJob
 org.apache.ignite.internal.processors.cache.verify.ContentionClosure
 org.apache.ignite.internal.processors.cache.verify.ContentionInfo
+org.apache.ignite.internal.processors.cache.verify.GridNotIdleException
 org.apache.ignite.internal.processors.cache.verify.IdleVerifyDumpResult
+org.apache.ignite.internal.processors.cache.verify.IdleVerifyException
 org.apache.ignite.internal.processors.cache.verify.IdleVerifyResultV2
+org.apache.ignite.internal.processors.cache.verify.NoMatchingCachesException
 org.apache.ignite.internal.processors.cache.verify.PartitionEntryHashRecord
 org.apache.ignite.internal.processors.cache.verify.PartitionHashRecord
 org.apache.ignite.internal.processors.cache.verify.PartitionHashRecordV2
@@ -1214,6 +1292,7 @@ org.apache.ignite.internal.processors.closure.GridClosureProcessor$T8
 org.apache.ignite.internal.processors.closure.GridClosureProcessor$T9
 org.apache.ignite.internal.processors.closure.GridClosureProcessor$TaskNoReduceAdapter
 org.apache.ignite.internal.processors.closure.GridPeerDeployAwareTaskAdapter
+org.apache.ignite.internal.processors.cluster.BaselineAdjustForbiddenException
 org.apache.ignite.internal.processors.cluster.BaselineTopology
 org.apache.ignite.internal.processors.cluster.BaselineTopologyHistory
 org.apache.ignite.internal.processors.cluster.BaselineTopologyHistoryItem
@@ -1234,6 +1313,10 @@ org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor$7
 org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor$BaselineStateAndHistoryData
 org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor$CheckGlobalStateComputeRequest
 org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor$ClientChangeGlobalStateComputeRequest
+org.apache.ignite.internal.processors.cluster.baseline.autoadjust.BaselineAutoAdjustStatus$TaskState
+org.apache.ignite.internal.processors.configuration.distributed.DetachedPropertyException
+org.apache.ignite.internal.processors.configuration.distributed.DistributedConfigurationProcessor$AllowableAction
+org.apache.ignite.internal.processors.configuration.distributed.NotWritablePropertyException
 org.apache.ignite.internal.processors.continuous.AbstractContinuousMessage
 org.apache.ignite.internal.processors.continuous.ContinuousRoutineInfo
 org.apache.ignite.internal.processors.continuous.ContinuousRoutineStartResultMessage
@@ -1438,8 +1521,18 @@ org.apache.ignite.internal.processors.marshaller.MappingProposedMessage$Proposal
 org.apache.ignite.internal.processors.marshaller.MarshallerMappingItem
 org.apache.ignite.internal.processors.marshaller.MissingMappingRequestMessage
 org.apache.ignite.internal.processors.marshaller.MissingMappingResponseMessage
+org.apache.ignite.internal.processors.metastorage.persistence.DistributedMetaStorageCasAckMessage
+org.apache.ignite.internal.processors.metastorage.persistence.DistributedMetaStorageCasMessage
+org.apache.ignite.internal.processors.metastorage.persistence.DistributedMetaStorageClusterNodeData
+org.apache.ignite.internal.processors.metastorage.persistence.DistributedMetaStorageHistoryItem
+org.apache.ignite.internal.processors.metastorage.persistence.DistributedMetaStorageJoiningNodeData
+org.apache.ignite.internal.processors.metastorage.persistence.DistributedMetaStorageKeyValuePair
+org.apache.ignite.internal.processors.metastorage.persistence.DistributedMetaStorageUpdateAckMessage
+org.apache.ignite.internal.processors.metastorage.persistence.DistributedMetaStorageUpdateMessage
+org.apache.ignite.internal.processors.metastorage.persistence.DistributedMetaStorageVersion
 org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequestHandler$1
 org.apache.ignite.internal.processors.odbc.jdbc.JdbcStatementType
+org.apache.ignite.internal.processors.odbc.odbc.OdbcRequestHandler$1
 org.apache.ignite.internal.processors.odbc.odbc.escape.OdbcEscapeType
 org.apache.ignite.internal.processors.platform.PlatformAbstractConfigurationClosure
 org.apache.ignite.internal.processors.platform.PlatformAbstractPredicate
@@ -1514,23 +1607,26 @@ org.apache.ignite.internal.processors.platform.utils.PlatformFutureUtils$FutureL
 org.apache.ignite.internal.processors.platform.utils.PlatformFutureUtils$InternalFutureListenable$1
 org.apache.ignite.internal.processors.platform.websession.PlatformDotNetSessionLockProcessor
 org.apache.ignite.internal.processors.platform.websession.PlatformDotNetSessionSetAndUnlockProcessor
+org.apache.ignite.internal.processors.query.EnlistOperation
 org.apache.ignite.internal.processors.query.GridQueryFieldMetadata
+org.apache.ignite.internal.processors.query.GridQueryProcessor$3
 org.apache.ignite.internal.processors.query.GridQueryProcessor$4
 org.apache.ignite.internal.processors.query.GridQueryProcessor$5
-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.GridQueryProcessor$9
 org.apache.ignite.internal.processors.query.GridQueryProcessor$SchemaOperation$1
 org.apache.ignite.internal.processors.query.IgniteSQLException
+org.apache.ignite.internal.processors.query.NestedTxMode
 org.apache.ignite.internal.processors.query.QueryEntityEx
 org.apache.ignite.internal.processors.query.QueryField
 org.apache.ignite.internal.processors.query.QueryIndexKey
 org.apache.ignite.internal.processors.query.QuerySchema
+org.apache.ignite.internal.processors.query.UpdateSourceIterator
 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
 org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQueryNextPageResponse
+org.apache.ignite.internal.processors.query.messages.GridQueryKillRequest
+org.apache.ignite.internal.processors.query.messages.GridQueryKillResponse
 org.apache.ignite.internal.processors.query.schema.SchemaOperationException
 org.apache.ignite.internal.processors.query.schema.SchemaOperationManager$1
 org.apache.ignite.internal.processors.query.schema.SchemaOperationWorker$1
@@ -1604,6 +1700,7 @@ org.apache.ignite.internal.processors.rest.handlers.cache.GridCacheCommandHandle
 org.apache.ignite.internal.processors.rest.handlers.cache.GridCacheCommandHandler$SizeCommand
 org.apache.ignite.internal.processors.rest.handlers.cache.GridCacheCommandHandler$UpdateTllCommand
 org.apache.ignite.internal.processors.rest.handlers.cache.GridCacheRestResponse
+org.apache.ignite.internal.processors.rest.handlers.cluster.GridBaselineCommandResponse
 org.apache.ignite.internal.processors.rest.handlers.datastructures.DataStructuresCommandHandler$1
 org.apache.ignite.internal.processors.rest.handlers.query.CacheQueryFieldsMetaResult
 org.apache.ignite.internal.processors.rest.handlers.query.CacheQueryResult
@@ -1613,7 +1710,6 @@ org.apache.ignite.internal.processors.rest.handlers.redis.exception.GridRedisGen
 org.apache.ignite.internal.processors.rest.handlers.redis.exception.GridRedisTypeException
 org.apache.ignite.internal.processors.rest.handlers.task.GridTaskCommandHandler$2
 org.apache.ignite.internal.processors.rest.handlers.task.GridTaskCommandHandler$ExeCallable
-org.apache.ignite.internal.processors.rest.handlers.task.GridTaskCommandHandler$TaskDescriptor
 org.apache.ignite.internal.processors.rest.handlers.task.GridTaskResultRequest
 org.apache.ignite.internal.processors.rest.handlers.task.GridTaskResultResponse
 org.apache.ignite.internal.processors.rest.handlers.top.GridTopologyCommandHandler$1
@@ -1640,20 +1736,44 @@ org.apache.ignite.internal.processors.service.GridServiceProxy
 org.apache.ignite.internal.processors.service.GridServiceProxy$ServiceProxyCallable
 org.apache.ignite.internal.processors.service.GridServiceProxy$ServiceProxyException
 org.apache.ignite.internal.processors.service.LazyServiceConfiguration
+org.apache.ignite.internal.processors.service.ServiceChangeAbstractRequest
+org.apache.ignite.internal.processors.service.ServiceChangeBatchRequest
+org.apache.ignite.internal.processors.service.ServiceClusterDeploymentResult
+org.apache.ignite.internal.processors.service.ServiceClusterDeploymentResultBatch
 org.apache.ignite.internal.processors.service.ServiceContextImpl
+org.apache.ignite.internal.processors.service.ServiceDeploymentProcessId
+org.apache.ignite.internal.processors.service.ServiceDeploymentRequest
 org.apache.ignite.internal.processors.service.ServiceDescriptorImpl
+org.apache.ignite.internal.processors.service.ServiceInfo
+org.apache.ignite.internal.processors.service.ServiceProcessorCommonDiscoveryData
+org.apache.ignite.internal.processors.service.ServiceProcessorJoinNodeDiscoveryData
+org.apache.ignite.internal.processors.service.ServiceSingleNodeDeploymentResult
+org.apache.ignite.internal.processors.service.ServiceSingleNodeDeploymentResultBatch
+org.apache.ignite.internal.processors.service.ServiceUndeploymentRequest
 org.apache.ignite.internal.processors.task.GridTaskProcessor$1
 org.apache.ignite.internal.processors.task.GridTaskThreadContextKey
 org.apache.ignite.internal.processors.task.GridTaskWorker$3
 org.apache.ignite.internal.processors.task.GridTaskWorker$5
 org.apache.ignite.internal.processors.task.GridTaskWorker$State
+org.apache.ignite.internal.processors.timeout.GridTimeoutProcessor$2
 org.apache.ignite.internal.sql.SqlLexerTokenType
 org.apache.ignite.internal.sql.SqlParseException
 org.apache.ignite.internal.sql.SqlStrictParseException
+org.apache.ignite.internal.sql.optimizer.affinity.PartitionAffinityFunctionType
+org.apache.ignite.internal.sql.optimizer.affinity.PartitionCompositeNodeOperator
+org.apache.ignite.internal.sql.optimizer.affinity.PartitionParameterType
+org.apache.ignite.internal.stat.IndexPageType
+org.apache.ignite.internal.stat.IoStatisticsType
+org.apache.ignite.internal.transactions.IgniteTxAlreadyCompletedCheckedException
+org.apache.ignite.internal.transactions.IgniteTxDuplicateKeyCheckedException
 org.apache.ignite.internal.transactions.IgniteTxHeuristicCheckedException
 org.apache.ignite.internal.transactions.IgniteTxOptimisticCheckedException
 org.apache.ignite.internal.transactions.IgniteTxRollbackCheckedException
+org.apache.ignite.internal.transactions.IgniteTxSerializationCheckedException
 org.apache.ignite.internal.transactions.IgniteTxTimeoutCheckedException
+org.apache.ignite.internal.transactions.IgniteTxUnexpectedStateCheckedException
+org.apache.ignite.internal.transactions.TransactionCheckedException
+org.apache.ignite.internal.util.BitSetIntSet
 org.apache.ignite.internal.util.F0$1
 org.apache.ignite.internal.util.F0$2
 org.apache.ignite.internal.util.F0$3
@@ -1728,14 +1848,17 @@ org.apache.ignite.internal.util.IgniteUtils$12
 org.apache.ignite.internal.util.IgniteUtils$13
 org.apache.ignite.internal.util.IgniteUtils$14
 org.apache.ignite.internal.util.IgniteUtils$15
+org.apache.ignite.internal.util.IgniteUtils$16
 org.apache.ignite.internal.util.IgniteUtils$17
-org.apache.ignite.internal.util.IgniteUtils$23
-org.apache.ignite.internal.util.IgniteUtils$24
-org.apache.ignite.internal.util.IgniteUtils$25
+org.apache.ignite.internal.util.IgniteUtils$18
+org.apache.ignite.internal.util.IgniteUtils$20
 org.apache.ignite.internal.util.IgniteUtils$26
 org.apache.ignite.internal.util.IgniteUtils$27
 org.apache.ignite.internal.util.IgniteUtils$28
+org.apache.ignite.internal.util.IgniteUtils$29
 org.apache.ignite.internal.util.IgniteUtils$3
+org.apache.ignite.internal.util.IgniteUtils$30
+org.apache.ignite.internal.util.IgniteUtils$31
 org.apache.ignite.internal.util.IgniteUtils$4
 org.apache.ignite.internal.util.IgniteUtils$5
 org.apache.ignite.internal.util.IgniteUtils$6
@@ -1809,6 +1932,8 @@ 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.IgniteThrowableConsumer
+org.apache.ignite.internal.util.lang.IgniteThrowableFunction
 org.apache.ignite.internal.util.lang.gridfunc.AlwaysFalsePredicate
 org.apache.ignite.internal.util.lang.gridfunc.AlwaysTruePredicate
 org.apache.ignite.internal.util.lang.gridfunc.AlwaysTrueReducer
@@ -1877,13 +2002,6 @@ org.apache.ignite.internal.util.offheap.unsafe.GridUnsafeMap$Segment$2
 org.apache.ignite.internal.util.offheap.unsafe.GridUnsafePartitionedMap$2
 org.apache.ignite.internal.util.offheap.unsafe.GridUnsafePartitionedMap$3
 org.apache.ignite.internal.util.offheap.unsafe.GridUnsafePartitionedMap$PartitionedMapCloseableIterator
-org.apache.ignite.internal.util.snaptree.CopyOnWriteManager$COWEpoch
-org.apache.ignite.internal.util.snaptree.CopyOnWriteManager$Latch
-org.apache.ignite.internal.util.snaptree.Epoch$Root
-org.apache.ignite.internal.util.snaptree.EpochNode
-org.apache.ignite.internal.util.snaptree.EpochNode$Child
-org.apache.ignite.internal.util.snaptree.SnapTreeMap
-org.apache.ignite.internal.util.snaptree.SnapTreeMap$SubMap
 org.apache.ignite.internal.util.tostring.SBLimitedLength
 org.apache.ignite.internal.util.typedef.C1
 org.apache.ignite.internal.util.typedef.C2
@@ -1925,6 +2043,7 @@ 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.baseline.VisorBaselineAutoAdjustSettings
 org.apache.ignite.internal.visor.baseline.VisorBaselineNode
 org.apache.ignite.internal.visor.baseline.VisorBaselineOperation
 org.apache.ignite.internal.visor.baseline.VisorBaselineTask
@@ -2005,6 +2124,15 @@ org.apache.ignite.internal.visor.cache.VisorCacheStopTask
 org.apache.ignite.internal.visor.cache.VisorCacheStopTask$VisorCacheStopJob
 org.apache.ignite.internal.visor.cache.VisorCacheStopTaskArg
 org.apache.ignite.internal.visor.cache.VisorCacheStoreConfiguration
+org.apache.ignite.internal.visor.cache.VisorCacheToggleStatisticsTask
+org.apache.ignite.internal.visor.cache.VisorCacheToggleStatisticsTask$VisorCachesToggleStatisticsJob
+org.apache.ignite.internal.visor.cache.VisorCacheToggleStatisticsTaskArg
+org.apache.ignite.internal.visor.cache.VisorFindAndDeleteGarbageInPersistenceClosure
+org.apache.ignite.internal.visor.cache.VisorFindAndDeleteGarbageInPersistenceJobResult
+org.apache.ignite.internal.visor.cache.VisorFindAndDeleteGarbageInPersistenceTask
+org.apache.ignite.internal.visor.cache.VisorFindAndDeleteGarbageInPersistenceTask$FindAndDeleteGarbageInPersistenceJob
+org.apache.ignite.internal.visor.cache.VisorFindAndDeleteGarbageInPersistenceTaskArg
+org.apache.ignite.internal.visor.cache.VisorFindAndDeleteGarbageInPersistenceTaskResult
 org.apache.ignite.internal.visor.cache.VisorMemoryMetrics
 org.apache.ignite.internal.visor.cache.VisorModifyCacheMode
 org.apache.ignite.internal.visor.cache.VisorPartitionMap
@@ -2090,6 +2218,11 @@ org.apache.ignite.internal.visor.node.VisorBasicConfiguration
 org.apache.ignite.internal.visor.node.VisorBinaryConfiguration
 org.apache.ignite.internal.visor.node.VisorBinaryTypeConfiguration
 org.apache.ignite.internal.visor.node.VisorCacheKeyConfiguration
+org.apache.ignite.internal.visor.node.VisorCacheRebalanceCollectorJobResult
+org.apache.ignite.internal.visor.node.VisorCacheRebalanceCollectorTask
+org.apache.ignite.internal.visor.node.VisorCacheRebalanceCollectorTask$VisorCacheRebalanceCollectorJob
+org.apache.ignite.internal.visor.node.VisorCacheRebalanceCollectorTaskArg
+org.apache.ignite.internal.visor.node.VisorCacheRebalanceCollectorTaskResult
 org.apache.ignite.internal.visor.node.VisorClientConnectorConfiguration
 org.apache.ignite.internal.visor.node.VisorDataRegionConfiguration
 org.apache.ignite.internal.visor.node.VisorDataStorageConfiguration
@@ -2102,6 +2235,8 @@ org.apache.ignite.internal.visor.node.VisorLifecycleConfiguration
 org.apache.ignite.internal.visor.node.VisorMemoryConfiguration
 org.apache.ignite.internal.visor.node.VisorMemoryPolicyConfiguration
 org.apache.ignite.internal.visor.node.VisorMetricsConfiguration
+org.apache.ignite.internal.visor.node.VisorMvccConfiguration
+org.apache.ignite.internal.visor.node.VisorNodeBaselineStatus
 org.apache.ignite.internal.visor.node.VisorNodeConfigurationCollectorJob
 org.apache.ignite.internal.visor.node.VisorNodeConfigurationCollectorTask
 org.apache.ignite.internal.visor.node.VisorNodeDataCollectorJob
@@ -2151,6 +2286,8 @@ org.apache.ignite.internal.visor.query.VisorQueryDetailMetricsCollectorTask
 org.apache.ignite.internal.visor.query.VisorQueryDetailMetricsCollectorTask$VisorCacheQueryDetailMetricsCollectorJob
 org.apache.ignite.internal.visor.query.VisorQueryDetailMetricsCollectorTaskArg
 org.apache.ignite.internal.visor.query.VisorQueryEntity
+org.apache.ignite.internal.visor.query.VisorQueryFetchFirstPageTask
+org.apache.ignite.internal.visor.query.VisorQueryFetchFirstPageTask$VisorQueryFetchFirstPageJob
 org.apache.ignite.internal.visor.query.VisorQueryField
 org.apache.ignite.internal.visor.query.VisorQueryIndex
 org.apache.ignite.internal.visor.query.VisorQueryIndexField
@@ -2158,6 +2295,9 @@ 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.VisorQueryPingTask
+org.apache.ignite.internal.visor.query.VisorQueryPingTask$VisorQueryFetchFirstPageJob
+org.apache.ignite.internal.visor.query.VisorQueryPingTaskResult
 org.apache.ignite.internal.visor.query.VisorQueryResetDetailMetricsTask
 org.apache.ignite.internal.visor.query.VisorQueryResetDetailMetricsTask$VisorCacheResetQueryDetailMetricsJob
 org.apache.ignite.internal.visor.query.VisorQueryResetMetricsTask
@@ -2181,7 +2321,16 @@ org.apache.ignite.internal.visor.service.VisorCancelServiceTaskArg
 org.apache.ignite.internal.visor.service.VisorServiceDescriptor
 org.apache.ignite.internal.visor.service.VisorServiceTask
 org.apache.ignite.internal.visor.service.VisorServiceTask$VisorServiceJob
+org.apache.ignite.internal.visor.tx.FetchNearXidVersionTask
+org.apache.ignite.internal.visor.tx.FetchNearXidVersionTask$FetchNearXidVersionJob
+org.apache.ignite.internal.visor.tx.TxKeyLockType
+org.apache.ignite.internal.visor.tx.TxMappingType
+org.apache.ignite.internal.visor.tx.TxVerboseId
+org.apache.ignite.internal.visor.tx.TxVerboseInfo
+org.apache.ignite.internal.visor.tx.TxVerboseKey
 org.apache.ignite.internal.visor.tx.VisorTxInfo
+org.apache.ignite.internal.visor.tx.VisorTxInfo$1
+org.apache.ignite.internal.visor.tx.VisorTxInfo$2
 org.apache.ignite.internal.visor.tx.VisorTxOperation
 org.apache.ignite.internal.visor.tx.VisorTxProjection
 org.apache.ignite.internal.visor.tx.VisorTxSortOrder
@@ -2191,6 +2340,7 @@ org.apache.ignite.internal.visor.tx.VisorTxTask$2
 org.apache.ignite.internal.visor.tx.VisorTxTask$3
 org.apache.ignite.internal.visor.tx.VisorTxTask$4
 org.apache.ignite.internal.visor.tx.VisorTxTask$5
+org.apache.ignite.internal.visor.tx.VisorTxTask$LocalKillClosure
 org.apache.ignite.internal.visor.tx.VisorTxTask$NearKillClosure
 org.apache.ignite.internal.visor.tx.VisorTxTask$RemoteKillClosure
 org.apache.ignite.internal.visor.tx.VisorTxTask$TxKillClosure
@@ -2201,8 +2351,9 @@ org.apache.ignite.internal.visor.util.VisorClusterGroupEmptyException
 org.apache.ignite.internal.visor.util.VisorEventMapper
 org.apache.ignite.internal.visor.util.VisorExceptionWrapper
 org.apache.ignite.internal.visor.util.VisorTaskUtils$4
-org.apache.ignite.internal.visor.verify.IndexValidationIssue
+org.apache.ignite.internal.visor.verify.CacheFilterEnum
 org.apache.ignite.internal.visor.verify.IndexIntegrityCheckIssue
+org.apache.ignite.internal.visor.verify.IndexValidationIssue
 org.apache.ignite.internal.visor.verify.ValidateIndexesPartitionResult
 org.apache.ignite.internal.visor.verify.VisorContentionJobResult
 org.apache.ignite.internal.visor.verify.VisorContentionTask
@@ -2218,15 +2369,12 @@ org.apache.ignite.internal.visor.verify.VisorIdleAnalyzeTaskResult
 org.apache.ignite.internal.visor.verify.VisorIdleVerifyDumpTask
 org.apache.ignite.internal.visor.verify.VisorIdleVerifyDumpTaskArg
 org.apache.ignite.internal.visor.verify.VisorIdleVerifyJob
-org.apache.ignite.internal.visor.verify.VisorIdleVerifyJob$1
 org.apache.ignite.internal.visor.verify.VisorIdleVerifyTask
 org.apache.ignite.internal.visor.verify.VisorIdleVerifyTask$VisorIdleVerifyJob
 org.apache.ignite.internal.visor.verify.VisorIdleVerifyTask$VisorIdleVerifyJob$1
 org.apache.ignite.internal.visor.verify.VisorIdleVerifyTaskArg
 org.apache.ignite.internal.visor.verify.VisorIdleVerifyTaskResult
 org.apache.ignite.internal.visor.verify.VisorIdleVerifyTaskV2
-org.apache.ignite.internal.visor.verify.VisorIdleVerifyTaskV2$VisorIdleVerifyJobV2
-org.apache.ignite.internal.visor.verify.VisorIdleVerifyTaskV2$VisorIdleVerifyJobV2$1
 org.apache.ignite.internal.visor.verify.VisorValidateIndexesJobResult
 org.apache.ignite.internal.visor.verify.VisorValidateIndexesTaskArg
 org.apache.ignite.internal.visor.verify.VisorValidateIndexesTaskResult
@@ -2294,6 +2442,7 @@ org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi$1
 org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi$10
 org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi$2$1
 org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi$2$2
+org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi$2$3
 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
@@ -2302,11 +2451,11 @@ org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi$3
 org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi$4
 org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi$9
 org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi$HandshakeClosure
-org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi$HandshakeException
-org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi$HandshakeTimeoutException
+org.apache.ignite.spi.communication.tcp.internal.HandshakeException
 org.apache.ignite.spi.communication.tcp.internal.TcpCommunicationConnectionCheckFuture$SingleAddressConnectFuture$1
 org.apache.ignite.spi.communication.tcp.messages.HandshakeMessage
 org.apache.ignite.spi.communication.tcp.messages.HandshakeMessage2
+org.apache.ignite.spi.communication.tcp.messages.HandshakeWaitMessage
 org.apache.ignite.spi.communication.tcp.messages.NodeIdMessage
 org.apache.ignite.spi.communication.tcp.messages.RecoveryLastReceivedMessage
 org.apache.ignite.spi.discovery.DiscoverySpiCustomMessage
@@ -2332,6 +2481,7 @@ org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryClientReconnectMessage
 org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryConnectionCheckMessage
 org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryCustomEventMessage
 org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryDiscardMessage
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryDummyWakeupMessage
 org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryDuplicateIdMessage
 org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryHandshakeRequest
 org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryHandshakeResponse
@@ -2349,6 +2499,7 @@ org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryPingResponse
 org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryRingLatencyCheckMessage
 org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryServerOnlyCustomEventMessage
 org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryStatusCheckMessage
+org.apache.ignite.spi.encryption.keystore.KeystoreEncryptionKey
 org.apache.ignite.ssl.SslContextFactory
 org.apache.ignite.startup.BasicWarmupClosure
 org.apache.ignite.startup.cmdline.AboutDialog
@@ -2359,14 +2510,19 @@ org.apache.ignite.stream.StreamTransformer$1
 org.apache.ignite.stream.StreamTransformer$EntryProcessorWrapper
 org.apache.ignite.stream.StreamVisitor
 org.apache.ignite.stream.StreamVisitor$1
+org.apache.ignite.transactions.TransactionAlreadyCompletedException
 org.apache.ignite.transactions.TransactionConcurrency
 org.apache.ignite.transactions.TransactionDeadlockException
+org.apache.ignite.transactions.TransactionDuplicateKeyException
 org.apache.ignite.transactions.TransactionException
 org.apache.ignite.transactions.TransactionHeuristicException
 org.apache.ignite.transactions.TransactionIsolation
 org.apache.ignite.transactions.TransactionMetrics
+org.apache.ignite.transactions.TransactionMixedModeException
 org.apache.ignite.transactions.TransactionOptimisticException
 org.apache.ignite.transactions.TransactionRollbackException
+org.apache.ignite.transactions.TransactionSerializationException
 org.apache.ignite.transactions.TransactionState
 org.apache.ignite.transactions.TransactionTimeoutException
+org.apache.ignite.transactions.TransactionUnsupportedConcurrencyException
 org.apache.ignite.util.AttributeNodeFilter
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandArgFactory.java b/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandArgFactory.java
index 2ea98cd..b7cd1cc 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandArgFactory.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandArgFactory.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.commandline;
 import org.apache.ignite.internal.commandline.argument.CommandArg;
 import org.apache.ignite.internal.commandline.cache.CacheCommand;
 import org.apache.ignite.internal.commandline.cache.argument.DistributionCommandArg;
+import org.apache.ignite.internal.commandline.cache.argument.FindAndDeleteGarbageArg;
 import org.apache.ignite.internal.commandline.cache.argument.IdleVerifyCommandArg;
 import org.apache.ignite.internal.commandline.cache.argument.ListCommandArg;
 import org.apache.ignite.internal.commandline.cache.argument.ValidateIndexesCommandArg;
@@ -50,6 +51,9 @@ public class CommandArgFactory {
 
             case VALIDATE_INDEXES:
                 return ValidateIndexesCommandArg.values();
+
+            case FIND_AND_DELETE_GARBAGE:
+                return FindAndDeleteGarbageArg.values();
         }
 
         throw new IllegalArgumentException("Unknown cache command " + cmd);
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java b/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java
index 3239171..02453dc 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java
@@ -17,10 +17,15 @@
 
 package org.apache.ignite.internal.commandline;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.List;
 import java.util.UUID;
+import java.util.function.Predicate;
 import org.apache.ignite.internal.commandline.cache.CacheArguments;
+import org.apache.ignite.internal.commandline.cache.argument.FindAndDeleteGarbageArg;
+import org.apache.ignite.internal.util.typedef.T2;
 import org.apache.ignite.internal.visor.tx.VisorTxOperation;
 import org.apache.ignite.internal.visor.tx.VisorTxProjection;
 import org.apache.ignite.internal.visor.tx.VisorTxSortOrder;
@@ -412,9 +417,8 @@ public class CommandHandlerParsingTest {
     @Test
     public void testTransactionArguments() {
         CommandHandler hnd = new CommandHandler();
-        Arguments args;
 
-        args = hnd.parseAndValidate(asList("--tx"));
+        hnd.parseAndValidate(asList("--tx"));
 
         try {
             hnd.parseAndValidate(asList("--tx", "minDuration"));
@@ -472,7 +476,7 @@ public class CommandHandlerParsingTest {
         catch (IllegalArgumentException ignored) {
         }
 
-        args = hnd.parseAndValidate(asList("--tx", "--min-duration", "120", "--min-size", "10", "--limit", "100", "--order", "SIZE",
+        Arguments args = hnd.parseAndValidate(asList("--tx", "--min-duration", "120", "--min-size", "10", "--limit", "100", "--order", "SIZE",
             "--servers"));
 
         VisorTxTaskArg arg = args.transactionArguments();
@@ -501,4 +505,125 @@ public class CommandHandlerParsingTest {
         assertNull(arg.getProjection());
         assertEquals(Arrays.asList("1", "2", "3"), arg.getConsistentIds());
     }
+
+    /**
+     * Test parsing arguments by find_garbage command.
+     */
+    @Test
+    public void testFindAndDeleteGarbage() {
+        CommandHandler hnd = new CommandHandler();
+
+        String nodeId = UUID.randomUUID().toString();
+        String delete = FindAndDeleteGarbageArg.DELETE.toString();
+        String groups = "group1,grpoup2,group3";
+
+        List<List<String>> lists = generateArgumentList(
+            "find_garbage",
+            new T2<>(nodeId, false),
+            new T2<>(delete, false),
+            new T2<>(groups, false)
+        );
+
+        for (List<String> list : lists) {
+            Arguments arg = hnd.parseAndValidate(list);
+
+            CacheArguments args = arg.cacheArgs();
+
+            if (list.contains(nodeId))
+                assertEquals("nodeId parameter unexpected value", nodeId, args.nodeId().toString());
+            else
+                assertNull(args.nodeId());
+
+            assertEquals(list.contains(delete), args.delete());
+
+            if (list.contains(groups))
+                assertEquals(3, args.groups().size());
+            else
+                assertNull(args.groups());
+        }
+    }
+
+    /**
+     * @param subcommand Cache subcommand.
+     * @param optional List of arguments, where second param is this argument is stopping one or not.
+     *  Every argument treated as optional.
+     *
+     * @return List of every possible combinations of the arguments {[], [1], [2], [3], [1,2], [2,1], [1.3], [3,1], [1,2,3]...}.
+     */
+    private List<List<String>> generateArgumentList(String subcommand, T2<String, Boolean>...optional) {
+        List<List<T2<String, Boolean>>> lists = generateAllCombinations(Arrays.asList(optional), (x) -> x.get2());
+
+        ArrayList<List<String>> res = new ArrayList<>();
+
+        ArrayList<String> empty = new ArrayList<>();
+
+        empty.add(CACHE.text());
+        empty.add(subcommand);
+
+        res.add(empty);
+
+        for (List<T2<String, Boolean>> list : lists) {
+            ArrayList<String> arg = new ArrayList<>(empty);
+
+            list.forEach(x -> arg.add(x.get1()));
+
+            res.add(arg);
+        }
+
+        return res;
+    }
+
+    /**
+     * @param source Source of elements.
+     * @param stopFunc Stop function.
+     */
+    private <T> List<List<T>> generateAllCombinations(List<T> source, Predicate<T> stopFunc) {
+        List<List<T>> res = new ArrayList<>();
+
+        for (int i = 0; i < source.size(); i++) {
+            List<T> sourceCopy = new ArrayList<>(source);
+
+            T removed = sourceCopy.remove(i);
+
+            generateAllCombinations(Collections.singletonList(removed), sourceCopy, stopFunc, res);
+        }
+
+        return res;
+    }
+
+
+    /**
+     * @param res Intermidiate result.
+     * @param source Source of left elements.
+     * @param stopFunc Stop function.
+     * @param acc Ready result accumulator.
+     */
+    private <T> void generateAllCombinations(List<T> res, List<T> source, Predicate<T> stopFunc, List<List<T>> acc) {
+        acc.add(res);
+
+        if (stopFunc != null && stopFunc.test(res.get(res.size() - 1)))
+            return;
+
+        if (source.size() == 1) {
+            List<T> list = new ArrayList<>(res);
+
+            list.add(source.get(0));
+
+            acc.add(list);
+
+            return;
+        }
+
+        for (int i = 0; i < source.size(); i++) {
+            ArrayList<T> res0 = new ArrayList<>(res);
+
+            List<T> sourceCopy = new ArrayList<>(source);
+
+            T removed = sourceCopy.remove(i);
+
+            res0.add(removed);
+
+            generateAllCombinations(res0, sourceCopy, stopFunc, acc);
+        }
+    }
 }
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteClientCacheInitializationFailTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteClientCacheInitializationFailTest.java
index 4165dfe..1424a25 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteClientCacheInitializationFailTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteClientCacheInitializationFailTest.java
@@ -40,9 +40,12 @@ import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.IgniteInternalFuture;
 import org.apache.ignite.internal.IgniteKernal;
 import org.apache.ignite.internal.managers.IgniteMBeansManager;
+import org.apache.ignite.internal.pagemem.PageMemory;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.mvcc.MvccSnapshot;
 import org.apache.ignite.internal.processors.cache.persistence.CacheDataRow;
+import org.apache.ignite.internal.processors.cache.persistence.RootPage;
+import org.apache.ignite.internal.processors.cache.persistence.tree.reuse.ReuseList;
 import org.apache.ignite.internal.processors.odbc.jdbc.JdbcParameterMeta;
 import org.apache.ignite.internal.processors.query.GridQueryCancel;
 import org.apache.ignite.internal.processors.query.GridQueryFieldMetadata;
@@ -56,6 +59,7 @@ import org.apache.ignite.internal.processors.query.QueryIndexDescriptorImpl;
 import org.apache.ignite.internal.processors.query.SqlClientContext;
 import org.apache.ignite.internal.processors.query.UpdateSourceIterator;
 import org.apache.ignite.internal.processors.query.schema.SchemaIndexCacheVisitor;
+import org.apache.ignite.internal.util.GridAtomicLong;
 import org.apache.ignite.internal.util.GridSpinBusyLock;
 import org.apache.ignite.internal.util.lang.GridCloseableIterator;
 import org.apache.ignite.lang.IgniteBiTuple;
@@ -327,6 +331,12 @@ public class IgniteClientCacheInitializationFailTest extends GridCommonAbstractT
         }
 
         /** {@inheritDoc} */
+        @Override public void destroyOrphanIndex(RootPage page, String indexName, int grpId, PageMemory pageMemory,
+            GridAtomicLong removeId, ReuseList reuseList, boolean mvccEnabled) throws IgniteCheckedException {
+            // No-op
+        }
+
+        /** {@inheritDoc} */
         @Override public void dynamicAddColumn(String schemaName, String tblName, List<QueryField> cols,
                                                boolean ifTblExists, boolean ifColNotExists)
             throws IgniteCheckedException {
diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
index d30a2d6..09d2a39 100755
--- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
@@ -1393,7 +1393,7 @@ public abstract class GridAbstractTest extends JUnitAssertAware {
      * @param idx Index.
      * @return Ignite instance.
      */
-    protected Ignite ignite(int idx) {
+    protected IgniteEx ignite(int idx) {
         return grid(idx);
     }
 
diff --git a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
index 8d49622..b953fa7 100644
--- a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
@@ -28,6 +28,7 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
@@ -224,7 +225,7 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
 
     /** {@inheritDoc} */
     @Override public String getTestIgniteInstanceName() {
-        return "bltTest";
+        return "gridCommandHandlerTest";
     }
 
     /** {@inheritDoc} */
@@ -435,6 +436,42 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
     }
 
     /**
+     * Very basic tests for running the command in different enviroment which other command are running in.
+     *
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testFindAndDeleteGarbage() throws Exception {
+        Ignite ignite = startGrids(2);
+
+        ignite.cluster().active(true);
+
+        injectTestSystemOut();
+
+        ignite.createCaches(Arrays.asList(
+            new CacheConfiguration<>("garbage1").setGroupName("groupGarbage"),
+            new CacheConfiguration<>("garbage2").setGroupName("groupGarbage")));
+
+        assertEquals(EXIT_CODE_OK, execute("--cache", "find_garbage", "--port", "11212"));
+
+        assertTrue(testOut.toString().contains("garbage not found"));
+
+        testOut.reset();
+
+        assertEquals(EXIT_CODE_OK, execute("--cache", "find_garbage",
+            ignite(0).localNode().id().toString(), "--port", "11212"));
+
+        assertTrue(testOut.toString().contains("garbage not found"));
+
+        testOut.reset();
+
+        assertEquals(EXIT_CODE_OK, execute("--cache", "find_garbage",
+            "groupGarbage", "--port", "11212"));
+
+        assertTrue(testOut.toString().contains("garbage not found"));
+    }
+
+    /**
      * @return utility information about coordinator
      */
     private String findCrdInfo() {
@@ -735,7 +772,7 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
         CountDownLatch lockLatch = new CountDownLatch(1);
         CountDownLatch unlockLatch = new CountDownLatch(1);
 
-        IgniteInternalFuture<?> fut = startTransactions(lockLatch, unlockLatch, true);
+        IgniteInternalFuture<?> fut = startTransactions("testActiveTransactions", lockLatch, unlockLatch, true);
 
         U.awaitQuiet(lockLatch);
 
@@ -893,36 +930,39 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
         CountDownLatch lockLatch = new CountDownLatch(1);
         CountDownLatch unlockLatch = new CountDownLatch(1);
 
-        IgniteInternalFuture<?> fut = startTransactions(lockLatch, unlockLatch, false);
+        IgniteInternalFuture<?> fut = startTransactions("testTransactionInfo", lockLatch, unlockLatch, false);
 
-        U.awaitQuiet(lockLatch);
-
-        doSleep(3000); // Should be more than enough for all transactions to appear in contexts.
+        try {
+            U.awaitQuiet(lockLatch);
 
-        Set<GridCacheVersion> nearXids = new HashSet<>();
+            doSleep(3000); // Should be more than enough for all transactions to appear in contexts.
 
-        for (int i = 0; i < 5; i++) {
-            IgniteEx grid = grid(i);
+            Set<GridCacheVersion> nearXids = new HashSet<>();
 
-            IgniteTxManager tm = grid.context().cache().context().tm();
+            for (int i = 0; i < 5; i++) {
+                IgniteEx grid = grid(i);
 
-            for (IgniteInternalTx tx : tm.activeTransactions())
-                nearXids.add(tx.nearXidVersion());
-        }
+                IgniteTxManager tm = grid.context().cache().context().tm();
 
-        injectTestSystemOut();
+                for (IgniteInternalTx tx : tm.activeTransactions())
+                    nearXids.add(tx.nearXidVersion());
+            }
 
-        for (GridCacheVersion nearXid : nearXids)
-            assertEquals(EXIT_CODE_OK, execute("--tx", "--info", nearXid.toString()));
+            injectTestSystemOut();
 
-        String out = testOut.toString();
+            for (GridCacheVersion nearXid : nearXids)
+                assertEquals(EXIT_CODE_OK, execute("--tx", "--info", nearXid.toString()));
 
-        for (GridCacheVersion nearXid : nearXids)
-            assertTrue(out.contains(nearXid.toString()));
+            String out = testOut.toString();
 
-        unlockLatch.countDown();
+            for (GridCacheVersion nearXid : nearXids)
+                assertTrue(nearXid.toString(), out.contains(nearXid.toString()));
+        }
+        finally {
+            unlockLatch.countDown();
 
-        fut.get();
+            fut.get();
+        }
     }
 
     /**
@@ -945,7 +985,7 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
         CountDownLatch lockLatch = new CountDownLatch(1);
         CountDownLatch unlockLatch = new CountDownLatch(1);
 
-        IgniteInternalFuture<?> fut = startTransactions(lockLatch, unlockLatch, false);
+        IgniteInternalFuture<?> fut = startTransactions("testTransactionHistoryInfo", lockLatch, unlockLatch, false);
 
         U.awaitQuiet(lockLatch);
 
@@ -1166,8 +1206,7 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
                 if (m instanceof GridDhtTxFinishRequest) {
                     GridDhtTxFinishRequest r = (GridDhtTxFinishRequest)m;
 
-                    if (r.nearNodeId().equals(clients[0].cluster().localNode().id()))
-                        return false;
+                    return !r.nearNodeId().equals(clients[0].cluster().localNode().id());
                 }
 
                 return true;
@@ -1273,7 +1312,8 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
 
         assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute("--baseline", "add", consistentIDs));
 
-        assertTrue(testOut.toString().contains("Node not found for consistent ID: bltTest2"));
+        assertTrue(testOut.toString(), testOut.toString().contains("Node not found for consistent ID:"));
+        assertFalse(testOut.toString(), testOut.toString().contains(getTestIgniteInstanceName() + "1"));
     }
 
     /**
@@ -1776,9 +1816,8 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
 
         injectTestSystemOut();
 
-        IgniteInternalFuture fut = GridTestUtils.runAsync(() -> {
-            assertEquals(EXIT_CODE_OK, execute("--cache", "idle_verify", "--dump"));
-        });
+        IgniteInternalFuture fut = GridTestUtils.runAsync(() ->
+            assertEquals(EXIT_CODE_OK, execute("--cache", "idle_verify", "--dump")));
 
         TestRecordingCommunicationSpi.spi(unstable).waitForBlocked();
 
@@ -1869,8 +1908,8 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
 
         String outputStr = testOut.toString();
 
-        assertTrue(outputStr.contains("idle_verify failed on 1 node."));
-        assertTrue(outputStr.contains("idle_verify check has finished, no conflicts have been found."));
+        assertTrue(outputStr, outputStr.contains("idle_verify failed on 1 node."));
+        assertTrue(outputStr, outputStr.contains("idle_verify check has finished, no conflicts have been found."));
     }
 
     /** */
@@ -1968,7 +2007,7 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
             .setAffinity(new RendezvousAffinityFunction(false, parts))
             .setBackups(2);
 
-        IgniteEx ignite = (IgniteEx)startGrids(3);
+        IgniteEx ignite = startGrids(3);
 
         ignite.cluster().active(true);
 
@@ -2023,7 +2062,7 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
      */
     @Test
     public void testCacheIdleVerifyDumpForCorruptedDataOnPersistenceClientCache() throws Exception {
-        IgniteEx ignite = (IgniteEx)startGrids(3);
+        IgniteEx ignite = startGrids(3);
 
         ignite.cluster().active(true);
 
@@ -2044,7 +2083,7 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
         dataRegionConfiguration = new DataRegionConfiguration()
             .setName("none-persistence-region");
 
-        IgniteEx ignite = (IgniteEx)startGrids(3);
+        IgniteEx ignite = startGrids(3);
 
         ignite.cluster().active(true);
 
@@ -2090,7 +2129,7 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
      */
     @Test
     public void testCacheIdleVerifyDumpExcludedCacheGrp() throws Exception {
-        IgniteEx ignite = (IgniteEx)startGrids(3);
+        IgniteEx ignite = startGrids(3);
 
         ignite.cluster().active(true);
 
@@ -2130,7 +2169,7 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
      */
     @Test
     public void testCacheIdleVerifyDumpExcludedCaches() throws Exception {
-        IgniteEx ignite = (IgniteEx)startGrids(3);
+        IgniteEx ignite = startGrids(3);
 
         ignite.cluster().active(true);
 
@@ -2185,7 +2224,7 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
      */
     @Test
     public void testCacheIdleVerifyMovingParts() throws Exception {
-        IgniteEx ignite = (IgniteEx)startGrids(2);
+        IgniteEx ignite = startGrids(2);
 
         ignite.cluster().active(true);
 
@@ -2649,6 +2688,7 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
      * @return Future to be completed after finish of all started transactions.
      */
     private IgniteInternalFuture<?> startTransactions(
+        String testName,
         CountDownLatch lockLatch,
         CountDownLatch unlockLatch,
         boolean topChangeBeforeUnlock
@@ -2717,7 +2757,7 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
                         break;
                 }
             }
-        }, 4, "tx-thread");
+        }, 4, "tx-thread-" + testName);
     }
 
     /** */
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
index 02d00b8..10f71c2 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
@@ -55,6 +55,7 @@ import org.apache.ignite.internal.managers.communication.GridMessageListener;
 import org.apache.ignite.internal.managers.eventstorage.GridLocalEventListener;
 import org.apache.ignite.internal.mxbean.SqlQueryMXBean;
 import org.apache.ignite.internal.mxbean.SqlQueryMXBeanImpl;
+import org.apache.ignite.internal.pagemem.PageMemory;
 import org.apache.ignite.internal.pagemem.store.IgnitePageStoreManager;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.CacheObjectValueContext;
@@ -71,7 +72,12 @@ import org.apache.ignite.internal.processors.cache.mvcc.MvccSnapshot;
 import org.apache.ignite.internal.processors.cache.mvcc.MvccUtils;
 import org.apache.ignite.internal.processors.cache.mvcc.StaticMvccQueryTracker;
 import org.apache.ignite.internal.processors.cache.persistence.CacheDataRow;
+import org.apache.ignite.internal.processors.cache.persistence.RootPage;
+import org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree;
+import org.apache.ignite.internal.processors.cache.persistence.tree.io.BPlusIO;
+import org.apache.ignite.internal.processors.cache.persistence.tree.io.BPlusMetaIO;
 import org.apache.ignite.internal.processors.cache.persistence.tree.io.PageIO;
+import org.apache.ignite.internal.processors.cache.persistence.tree.reuse.ReuseList;
 import org.apache.ignite.internal.processors.cache.query.GridCacheQueryMarshallable;
 import org.apache.ignite.internal.processors.cache.query.GridCacheQueryType;
 import org.apache.ignite.internal.processors.cache.query.GridCacheTwoStepQuery;
@@ -116,6 +122,7 @@ import org.apache.ignite.internal.processors.query.h2.dml.UpdateMode;
 import org.apache.ignite.internal.processors.query.h2.dml.UpdatePlan;
 import org.apache.ignite.internal.processors.query.h2.opt.GridH2IndexBase;
 import org.apache.ignite.internal.processors.query.h2.opt.GridH2Table;
+import org.apache.ignite.internal.processors.query.h2.opt.H2Row;
 import org.apache.ignite.internal.processors.query.h2.opt.QueryContext;
 import org.apache.ignite.internal.processors.query.h2.opt.QueryContextRegistry;
 import org.apache.ignite.internal.processors.query.h2.sql.GridSqlStatement;
@@ -136,6 +143,7 @@ import org.apache.ignite.internal.sql.command.SqlCommand;
 import org.apache.ignite.internal.sql.command.SqlCommitTransactionCommand;
 import org.apache.ignite.internal.sql.command.SqlRollbackTransactionCommand;
 import org.apache.ignite.internal.sql.optimizer.affinity.PartitionResult;
+import org.apache.ignite.internal.util.GridAtomicLong;
 import org.apache.ignite.internal.util.GridEmptyCloseableIterator;
 import org.apache.ignite.internal.util.GridSpinBusyLock;
 import org.apache.ignite.internal.util.IgniteUtils;
@@ -2197,6 +2205,78 @@ public class IgniteH2Indexing implements GridQueryIndexing {
         clearPlanCache();
     }
 
+    /** {@inheritDoc} */
+    @Override public void destroyOrphanIndex(
+        RootPage page,
+        String indexName,
+        int grpId,
+        PageMemory pageMemory,
+        final GridAtomicLong removeId,
+        final ReuseList reuseList,
+        boolean mvccEnabled
+    ) throws IgniteCheckedException {
+        assert ctx.cache().context().database().checkpointLockIsHeldByThread();
+
+        long metaPageId = page.pageId().pageId();
+
+        int inlineSize = getInlineSize(page, grpId, pageMemory);
+
+        BPlusTree<H2Row, H2Row> tree = new BPlusTree<H2Row, H2Row>(
+            indexName,
+            grpId,
+            pageMemory,
+            ctx.cache().context().wal(),
+            removeId,
+            metaPageId,
+            reuseList,
+            H2ExtrasInnerIO.getVersions(inlineSize, mvccEnabled),
+            H2ExtrasLeafIO.getVersions(inlineSize, mvccEnabled),
+            ctx.failure()
+        ) {
+            @Override protected int compare(BPlusIO io, long pageAddr, int idx, H2Row row) {
+                throw new AssertionError();
+            }
+
+            @Override public H2Row getRow(BPlusIO io, long pageAddr, int idx, Object x) {
+                throw new AssertionError();
+            }
+        };
+
+        tree.destroy();
+    }
+
+    /**
+     * @param page Root page.
+     * @param grpId Cache group id.
+     * @param pageMemory Page memory.
+     * @return Inline size.
+     * @throws IgniteCheckedException If something went wrong.
+     */
+    private int getInlineSize(RootPage page, int grpId, PageMemory pageMemory) throws IgniteCheckedException {
+        long metaPageId = page.pageId().pageId();
+
+        final long metaPage = pageMemory.acquirePage(grpId, metaPageId);
+
+        try {
+            long pageAddr = pageMemory.readLock(grpId, metaPageId, metaPage); // Meta can't be removed.
+
+            assert pageAddr != 0 : "Failed to read lock meta page [metaPageId=" +
+                U.hexLong(metaPageId) + ']';
+
+            try {
+                BPlusMetaIO io = BPlusMetaIO.VERSIONS.forPage(pageAddr);
+
+                return io.getInlineSize(pageAddr);
+            }
+            finally {
+                pageMemory.readUnlock(grpId, metaPageId, metaPage);
+            }
+        }
+        finally {
+            pageMemory.releasePage(grpId, metaPageId, metaPage);
+        }
+    }
+
     /**
      * Remove all cached queries from cached two-steps queries.
      */
diff --git a/modules/indexing/src/test/java/org/apache/ignite/client/IgniteBinaryQueryTest.java b/modules/indexing/src/test/java/org/apache/ignite/client/IgniteBinaryQueryTest.java
index a524394..d470de4 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/client/IgniteBinaryQueryTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/client/IgniteBinaryQueryTest.java
@@ -33,10 +33,6 @@ import org.apache.ignite.binary.BinaryType;
 import org.apache.ignite.cache.QueryEntity;
 import org.apache.ignite.cache.QueryIndex;
 import org.apache.ignite.cache.query.SqlQuery;
-import org.apache.ignite.client.ClientCache;
-import org.apache.ignite.client.ClientCacheConfiguration;
-import org.apache.ignite.client.Config;
-import org.apache.ignite.client.IgniteClient;
 import org.apache.ignite.configuration.ClientConfiguration;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.junit.Rule;
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgniteCacheGroupsWithRestartsTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgniteCacheGroupsWithRestartsTest.java
new file mode 100644
index 0000000..1f940a7
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgniteCacheGroupsWithRestartsTest.java
@@ -0,0 +1,313 @@
+/*
+ * 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.processors.cache.persistence.db;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.function.BiFunction;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.cache.QueryEntity;
+import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.cache.QueryIndexType;
+import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.ConnectorConfiguration;
+import org.apache.ignite.configuration.DataRegionConfiguration;
+import org.apache.ignite.configuration.DataStorageConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.commandline.CommandHandler;
+import org.apache.ignite.internal.commandline.cache.argument.FindAndDeleteGarbageArg;
+import org.apache.ignite.internal.util.typedef.internal.CU;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.visor.VisorTaskArgument;
+import org.apache.ignite.internal.visor.cache.VisorFindAndDeleteGarbageInPersistenceJobResult;
+import org.apache.ignite.internal.visor.cache.VisorFindAndDeleteGarbageInPersistenceTask;
+import org.apache.ignite.internal.visor.cache.VisorFindAndDeleteGarbageInPersistenceTaskArg;
+import org.apache.ignite.internal.visor.cache.VisorFindAndDeleteGarbageInPersistenceTaskResult;
+import org.apache.ignite.testframework.junits.WithSystemProperty;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.apache.ignite.testframework.junits.multijvm.IgniteProcessProxy;
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import static org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager.IGNITE_PDS_SKIP_CHECKPOINT_ON_NODE_STOP;
+
+/**
+ * Testing corner cases in cache group functionality:
+ * -stopping cache in shared group and immediate node leaving;
+ * -starting cache in shared group with the same name as destroyed one;
+ * -etc.
+ */
+@WithSystemProperty(key=IGNITE_PDS_SKIP_CHECKPOINT_ON_NODE_STOP, value="true")
+@SuppressWarnings({"unchecked", "ThrowableNotThrown"})
+public class IgniteCacheGroupsWithRestartsTest extends GridCommonAbstractTest {
+    /** Group name. */
+    public static final String GROUP = "group";
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
+        IgniteConfiguration configuration = super.getConfiguration(gridName);
+
+        configuration.setConnectorConfiguration(new ConnectorConfiguration());
+
+        DataStorageConfiguration cfg = new DataStorageConfiguration();
+
+        cfg.setDefaultDataRegionConfiguration(new DataRegionConfiguration()
+            .setPersistenceEnabled(true)
+            .setMaxSize(256 * 1024 * 1024));
+
+        configuration.setDataStorageConfiguration(cfg);
+
+        return configuration;
+    }
+
+    /**
+     * @param i Cache index number.
+     * @return Cache configuration with the given number in name.
+     */
+    private CacheConfiguration<Object, Object> getCacheConfiguration(int i) {
+        CacheConfiguration ccfg = new CacheConfiguration();
+
+        LinkedHashMap<String, String> fields = new LinkedHashMap<>();
+
+        fields.put("updateDate", "java.lang.Date");
+        fields.put("amount", "java.lang.Long");
+        fields.put("name", "java.lang.String");
+
+        Set<QueryIndex> indices = Collections.singleton(new QueryIndex("name", QueryIndexType.SORTED));
+
+        ccfg.setName(getCacheName(i))
+            .setGroupName("group")
+            .setQueryEntities(Collections.singletonList(
+                new QueryEntity(Long.class, Account.class)
+                    .setFields(fields)
+                    .setIndexes(indices)
+            ))
+            .setAffinity(new RendezvousAffinityFunction(false, 64));
+
+        return ccfg;
+    }
+
+    /**
+     * @param i Index.
+     * @return Generated cache name for index.
+     */
+    private String getCacheName(int i) {
+        return "cache-" + i;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        afterTest();
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        super.afterTest();
+
+        stopAllGrids();
+
+        cleanPersistenceDir();
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Ignore("https://issues.apache.org/jira/browse/IGNITE-8717")
+    @Test
+    public void testNodeRestartRightAfterCacheStop() throws Exception {
+        IgniteEx ex = startGrids(3);
+
+        prepareCachesAndData(ex);
+
+        ex.destroyCache(getCacheName(0));
+
+        assertNull(ex.cachex(getCacheName(0)));
+
+        IgniteProcessProxy.kill(grid(2).configuration().getIgniteInstanceName());
+
+        startGrid(2);
+
+        assertNull(ex.cachex(getCacheName(0)));
+
+        IgniteCache<Object, Object> cache = ex.createCache(getCacheConfiguration(0));
+
+        awaitPartitionMapExchange();
+
+        assertEquals(0, cache.size());
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testDeletingGarbageAfterCacheDestroyedAndNodeStop() throws Exception {
+        testFindAndDeleteGarbage(this::executeTask);
+    }
+
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    public void testDeletingGarbageAfterCacheDestroyedAndNodeStop_ControlConsoleUtil() throws Exception {
+        testFindAndDeleteGarbage(this::executeTaskViaControlConsoleUtil);
+    }
+
+    /**
+     * @param doFindAndRemove Do find and remove.
+     */
+    private void testFindAndDeleteGarbage(
+        BiFunction<IgniteEx, Boolean, VisorFindAndDeleteGarbageInPersistenceTaskResult> doFindAndRemove
+    ) throws Exception {
+        IgniteEx ignite = startGrids(3);
+
+        prepareCachesAndData(ignite);
+
+        ignite.destroyCache(getCacheName(0));
+
+        assertNull(ignite.cachex(getCacheName(0)));
+
+        Thread.sleep(5_000); // waiting for cache.dat deletion
+
+        stopGrid(2, true);
+
+        IgniteEx ex1 = startGrid(2);
+
+        assertNull(ignite.cachex(getCacheName(0)));
+
+        awaitPartitionMapExchange();
+
+        VisorFindAndDeleteGarbageInPersistenceTaskResult taskResult = doFindAndRemove.apply(ex1, false);
+
+        VisorFindAndDeleteGarbageInPersistenceJobResult result = taskResult.result().get(ex1.localNode().id());
+
+        Assert.assertTrue(result.hasGarbage());
+
+        Assert.assertTrue(result.checkResult()
+            .get(CU.cacheId("group"))
+            .get(CU.cacheId(getCacheName(0))) > 0);
+
+        //removing garbage
+        result = doFindAndRemove.apply(ex1, true).result().get(ex1.localNode().id());
+
+        Assert.assertTrue(result.hasGarbage());
+
+        result = doFindAndRemove.apply(ex1, false).result().get(ex1.localNode().id());
+
+        Assert.assertFalse(result.hasGarbage());
+    }
+
+    /**
+     * @param ignite Ignite to execute task on.
+     * @param deleteFoundGarbage If clearing mode should be used.
+     * @return Result of task run.
+     */
+    private VisorFindAndDeleteGarbageInPersistenceTaskResult executeTask(
+        IgniteEx ignite,
+        boolean deleteFoundGarbage
+    ) {
+        VisorFindAndDeleteGarbageInPersistenceTaskArg group = new VisorFindAndDeleteGarbageInPersistenceTaskArg(
+            Collections.singleton(GROUP), deleteFoundGarbage, null);
+
+        UUID id = ignite.localNode().id();
+
+        VisorTaskArgument arg = new VisorTaskArgument(id, group, true);
+
+        VisorFindAndDeleteGarbageInPersistenceTaskResult result =
+            ignite.compute().execute(VisorFindAndDeleteGarbageInPersistenceTask.class, arg);
+
+        return result;
+    }
+
+    /**
+     * @param ignite Ignite to execute task on.
+     * @param deleteFoundGarbage If clearing mode should be used.
+     * @return Result of task run.
+     */
+    private VisorFindAndDeleteGarbageInPersistenceTaskResult executeTaskViaControlConsoleUtil(
+        IgniteEx ignite,
+        boolean deleteFoundGarbage
+    ) {
+        CommandHandler handler = new CommandHandler();
+
+        List<String> args = new ArrayList<>(Arrays.asList("--yes", "--port", "11212", "--cache", "find_garbage",
+            ignite.localNode().id().toString()));
+
+        if (deleteFoundGarbage)
+            args.add(FindAndDeleteGarbageArg.DELETE.argName());
+
+        handler.execute(args);
+
+        return handler.getLastOperationResult();
+    }
+
+    /**
+     * @param ignite Ignite instance.
+     */
+    private void prepareCachesAndData(IgniteEx ignite) {
+        ignite.cluster().active(true);
+
+        for (int j = 0; j < 3; j++) {
+            for (int i = 0; i < 64 * 10; i++) {
+                IgniteCache<Object, Object> cache = ignite.getOrCreateCache(getCacheConfiguration(j));
+
+                byte[] val = new byte[ThreadLocalRandom.current().nextInt(8148)];
+
+                Arrays.fill(val, (byte)i);
+
+                cache.put((long)i, new Account(i));
+            }
+        }
+    }
+
+    /**
+     *
+     */
+    static class Account {
+        /** */
+        private final int val;
+
+        /**
+         * @param val Value.
+         */
+        public Account(int val) {
+            this.val = val;
+        }
+
+        /**
+         * @return Value.
+         */
+        public int value() {
+            return val;
+        }
+
+        /** {@inheritDoc} */
+        @Override public String toString() {
+            return S.toString(Account.class, this);
+        }
+    }
+}
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexFullRebuildTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexFullRebuildTest.java
index 2facb65..02fca0f 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexFullRebuildTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexFullRebuildTest.java
@@ -209,7 +209,7 @@ public class GridIndexFullRebuildTest extends GridCommonAbstractTest {
 
         VisorTaskArgument<VisorValidateIndexesTaskArg> argument = new VisorTaskArgument<>(nodes, arg, true);
 
-        ComputeTaskInternalFuture<VisorValidateIndexesTaskResult> execute = ((IgniteEx)grid1).context().task().execute(new VisorValidateIndexesTask(), argument);
+        ComputeTaskInternalFuture<VisorValidateIndexesTaskResult> execute = grid1.context().task().execute(new VisorValidateIndexesTask(), argument);
 
         VisorValidateIndexesTaskResult result = execute.get();
 
diff --git a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgnitePdsWithIndexingCoreTestSuite.java b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgnitePdsWithIndexingCoreTestSuite.java
index e52f7ec..539f5aa 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgnitePdsWithIndexingCoreTestSuite.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgnitePdsWithIndexingCoreTestSuite.java
@@ -26,6 +26,7 @@ import org.apache.ignite.internal.processors.cache.persistence.IgnitePdsTxCacheR
 import org.apache.ignite.internal.processors.cache.persistence.IgnitePdsTxHistoricalRebalancingTest;
 import org.apache.ignite.internal.processors.cache.persistence.IgnitePersistentStoreCacheGroupsTest;
 import org.apache.ignite.internal.processors.cache.persistence.PersistenceDirectoryWarningLoggingTest;
+import org.apache.ignite.internal.processors.cache.persistence.db.IgniteCacheGroupsWithRestartsTest;
 import org.apache.ignite.internal.processors.cache.persistence.db.IgniteLogicalRecoveryTest;
 import org.apache.ignite.internal.processors.cache.persistence.db.IgnitePdsMultiNodePutGetRestartTest;
 import org.apache.ignite.internal.processors.cache.persistence.db.IgnitePdsPageEvictionTest;
@@ -87,7 +88,9 @@ import org.junit.runners.Suite;
 
     IgniteLogicalRecoveryTest.class,
 
-    IgniteSequentialNodeCrashRecoveryTest.class
+    IgniteSequentialNodeCrashRecoveryTest.class,
+
+    IgniteCacheGroupsWithRestartsTest.class
 })
 public class IgnitePdsWithIndexingCoreTestSuite {
 }