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

NSAmelchev 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 c69a109ca5b IGNITE-28351 Refactor DiscoveryCustomMessage#id (#13078)
c69a109ca5b is described below

commit c69a109ca5befd31fc9740f514a4ea7bd6d0769a
Author: Dmitry Werner <[email protected]>
AuthorDate: Wed Apr 29 00:27:37 2026 +0500

    IGNITE-28351 Refactor DiscoveryCustomMessage#id (#13078)
---
 .../internal/events/DiscoveryCustomEvent.java      |  6 +--
 .../managers/discovery/DiscoveryCustomMessage.java | 36 +++++++++----
 .../DiscoveryServerOnlyCustomMessage.java          | 15 +++++-
 .../managers/discovery/GridDiscoveryManager.java   |  2 +-
 .../authentication/UserAcceptedMessage.java        | 19 ++-----
 .../authentication/UserProposedMessage.java        | 16 ++----
 .../cache/CacheAffinityChangeMessage.java          | 30 +++++------
 .../cache/CacheStatisticsClearMessage.java         | 23 +++-----
 .../cache/CacheStatisticsModeChangeMessage.java    | 28 ++++------
 .../cache/ClientCacheChangeDiscoveryMessage.java   | 18 ++-----
 .../ClientCacheChangeDummyDiscoveryMessage.java    | 36 ++-----------
 .../cache/ClientCacheChangeDummyDiscoveryTask.java | 54 +++++++++++++++++++
 .../processors/cache/DynamicCacheChangeBatch.java  | 63 ++--------------------
 .../processors/cache/ExchangeFailureMessage.java   | 18 ++-----
 .../cache/GridCachePartitionExchangeManager.java   |  6 +--
 .../processors/cache/GridCacheProcessor.java       | 14 ++---
 ...TimeoutOnPartitionMapExchangeChangeMessage.java | 25 ++++-----
 .../processors/cache/WalStateAbstractMessage.java  | 20 +++----
 .../binary/MetadataRemoveAcceptedMessage.java      | 16 ++----
 .../binary/MetadataRemoveProposedMessage.java      | 22 +++-----
 .../binary/MetadataUpdateAcceptedMessage.java      | 20 +++----
 .../binary/MetadataUpdateProposedMessage.java      | 26 ++++-----
 .../preloader/GridDhtPartitionsExchangeFuture.java | 12 ++---
 .../snapshot/SnapshotDiscoveryMessage.java         | 38 -------------
 .../snapshot/SnapshotStartDiscoveryMessage.java    | 14 +++--
 .../cluster/ChangeGlobalStateFinishMessage.java    | 25 +++------
 .../cluster/ChangeGlobalStateMessage.java          | 28 ++++------
 .../continuous/AbstractContinuousMessage.java      | 14 ++---
 .../marshaller/MappingAcceptedMessage.java         | 16 ++----
 .../marshaller/MappingProposedMessage.java         | 29 ++++------
 .../DistributedMetaStorageUpdateAckMessage.java    | 16 ++----
 .../DistributedMetaStorageUpdateMessage.java       | 19 ++-----
 .../message/SchemaAbstractDiscoveryMessage.java    | 20 +++----
 .../service/ServiceChangeBatchRequest.java         | 17 ++----
 .../ServiceClusterDeploymentResultBatch.java       | 25 ++++-----
 .../internal/util/distributed/FullMessage.java     | 22 +++-----
 .../internal/util/distributed/InitMessage.java     | 22 +++-----
 .../TcpConnectionRequestDiscoveryMessage.java      | 20 +++----
 .../main/resources/META-INF/classnames.properties  |  1 -
 .../snapshot/IgniteClusterSnapshotSelfTest.java    |  2 +-
 .../security/TestDiscoveryAcknowledgeMessage.java  | 14 +----
 .../processors/security/TestDiscoveryMessage.java  | 14 +----
 .../ignite/spi/discovery/MessageForServer.java     | 14 +----
 .../discovery/tcp/DummyCustomDiscoveryMessage.java | 14 +----
 44 files changed, 307 insertions(+), 602 deletions(-)

diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/events/DiscoveryCustomEvent.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/events/DiscoveryCustomEvent.java
index 51498969729..739c94a84f6 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/events/DiscoveryCustomEvent.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/events/DiscoveryCustomEvent.java
@@ -22,7 +22,7 @@ import 
org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
 import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.DynamicCacheChangeBatch;
-import 
org.apache.ignite.internal.processors.cache.persistence.snapshot.SnapshotDiscoveryMessage;
+import 
org.apache.ignite.internal.processors.cache.persistence.snapshot.SnapshotStartDiscoveryMessage;
 import org.apache.ignite.internal.processors.cluster.ChangeGlobalStateMessage;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.jetbrains.annotations.Nullable;
@@ -112,8 +112,8 @@ public class DiscoveryCustomEvent extends DiscoveryEvent {
         if (msg instanceof ChangeGlobalStateMessage && 
((ChangeGlobalStateMessage)msg).activate())
             return true;
 
-        if (msg instanceof SnapshotDiscoveryMessage) {
-            SnapshotDiscoveryMessage snapMsg = (SnapshotDiscoveryMessage)msg;
+        if (msg instanceof SnapshotStartDiscoveryMessage) {
+            SnapshotStartDiscoveryMessage snapMsg = 
(SnapshotStartDiscoveryMessage)msg;
 
             return snapMsg.needExchange() && snapMsg.needAssignPartitions();
         }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryCustomMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryCustomMessage.java
index 6ac15e57702..e68b0688549 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryCustomMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryCustomMessage.java
@@ -17,22 +17,24 @@
 
 package org.apache.ignite.internal.managers.discovery;
 
+import org.apache.ignite.internal.Order;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.GridCacheProcessor;
 import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.plugin.extensions.communication.MessageFactory;
 import org.apache.ignite.spi.discovery.DiscoverySpiCustomMessage;
 import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeAddFinishedMessage;
 import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeAddedMessage;
 
 /**
  * <b>DiscoveryCustomMessage</b> messages are handled by discovery protocol 
which provides some guarantees around them.
- *
+ * <p>
  * When some node sends <b>DiscoveryCustomMessage</b> with {@link 
GridDiscoveryManager#sendCustomEvent(DiscoveryCustomMessage)}
  * call, message firstly goes to current coordinator, is verified there and 
after that gets sent to the cluster.
  * Only after verification it is delivered to listeners on all nodes starting 
from coordinator.
- *
+ * <p>
  * To register a listener {@link 
GridDiscoveryManager#setCustomEventListener(Class, CustomEventListener)} method 
is used.
- *
+ * <p>
  * Discovery protocol guarantees include:
  * <ol>
  *     <li>
@@ -53,7 +55,7 @@ import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeAddedMessage
  *     <li>
  *         Guarantee #2 doesn't encompass <b>DiscoveryCustomMessage</b>s 
created automatically on
  *         {@link DiscoveryCustomMessage#ackMessage()} method call.
- *
+ * <p>
  *         If there were messages of this type in between 
<b>TcpDiscoveryNodeAddedMessage</b> and
  *         <b>TcpDiscoveryNodeAddFinishedMessage</b> messages, they won't be 
delivered to new joiner node.
  *     </li>
@@ -73,11 +75,25 @@ import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeAddedMessage
  *     </li>
  * </ol>
  */
-public interface DiscoveryCustomMessage extends DiscoverySpiCustomMessage {
-    /**
-     * @return Unique custom message ID.
-     */
-    IgniteUuid id();
+public abstract class DiscoveryCustomMessage implements 
DiscoverySpiCustomMessage {
+    /** Unique custom message ID. */
+    @Order(0)
+    public IgniteUuid id;
+
+    /** Constructor for {@link MessageFactory}. */
+    protected DiscoveryCustomMessage() {
+        // No-op.
+    }
+
+    /** @param id Message ID. */
+    protected DiscoveryCustomMessage(IgniteUuid id) {
+        this.id = id;
+    }
+
+    /** @return Unique custom message ID. */
+    public IgniteUuid id() {
+        return id;
+    }
 
     /**
      * Creates new discovery cache if message caused topology version change.
@@ -88,7 +104,7 @@ public interface DiscoveryCustomMessage extends 
DiscoverySpiCustomMessage {
      * @return Reused discovery cache.
      * @see GridCacheProcessor#onCustomEvent
      */
-    default DiscoCache createDiscoCache(GridDiscoveryManager mgr, 
AffinityTopologyVersion topVer, DiscoCache discoCache) {
+    public DiscoCache createDiscoCache(GridDiscoveryManager mgr, 
AffinityTopologyVersion topVer, DiscoCache discoCache) {
         throw new UnsupportedOperationException();
     }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryServerOnlyCustomMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryServerOnlyCustomMessage.java
index 7c341a08360..bfae3ee84e9 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryServerOnlyCustomMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryServerOnlyCustomMessage.java
@@ -17,10 +17,21 @@
 
 package org.apache.ignite.internal.managers.discovery;
 
+import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.plugin.extensions.communication.MessageFactory;
+
 /**
  * <b>DiscoveryServerOnlyCustomMessage</b> is the special subtype of the 
<b>DiscoveryCustomMessage</b> message
  * that is delivered only on server nodes of the cluster.
  */
-public interface DiscoveryServerOnlyCustomMessage extends 
DiscoveryCustomMessage {
-    // No-op.
+public abstract class DiscoveryServerOnlyCustomMessage extends 
DiscoveryCustomMessage {
+    /** Constructor for {@link MessageFactory}. */
+    protected DiscoveryServerOnlyCustomMessage() {
+        // No-op.
+    }
+
+    /** @param id Message ID. */
+    protected DiscoveryServerOnlyCustomMessage(IgniteUuid id) {
+        super(id);
+    }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
index 119d53d7847..1e06d65b538 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
@@ -2365,7 +2365,7 @@ public class GridDiscoveryManager extends 
GridManagerAdapter<DiscoverySpi> {
                     localNode(),
                     null,
                     Collections.<ClusterNode>emptyList(),
-                    new 
ClientCacheChangeDummyDiscoveryMessage(remoteSecurityContext(ctx), reqId, 
startReqs, cachesToClose),
+                    new ClientCacheChangeDummyDiscoveryMessage(reqId, 
startReqs, cachesToClose),
                     null,
                     remoteSecurityContext(ctx)
                 )
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserAcceptedMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserAcceptedMessage.java
index 141928b0571..5194620d026 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserAcceptedMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserAcceptedMessage.java
@@ -29,18 +29,14 @@ import org.jetbrains.annotations.Nullable;
  * Is sent as an acknowledgement for end (with success or error) of user 
management operation on the cluster
  * (see {@link UserProposedMessage} and {@link UserManagementOperation}).
  */
-public class UserAcceptedMessage implements DiscoveryCustomMessage {
-    /** */
-    @Order(0)
-    IgniteUuid id;
-
+public class UserAcceptedMessage extends DiscoveryCustomMessage {
     /** Operation ID. */
-    @Order(1)
+    @Order(0)
     @GridToStringInclude
     IgniteUuid opId;
 
     /** Error message. */
-    @Order(2)
+    @Order(1)
     ErrorMessage errMsg;
 
     /** Constructor. */
@@ -53,9 +49,9 @@ public class UserAcceptedMessage implements 
DiscoveryCustomMessage {
      * @param error Error.
      */
     UserAcceptedMessage(IgniteUuid opId, Throwable error) {
-        assert opId != null || error != null;
+        super(IgniteUuid.randomUuid());
 
-        id = IgniteUuid.randomUuid();
+        assert opId != null || error != null;
 
         this.opId = opId;
 
@@ -63,11 +59,6 @@ public class UserAcceptedMessage implements 
DiscoveryCustomMessage {
             errMsg = new ErrorMessage(error);
     }
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
-    }
-
     /** {@inheritDoc} */
     @Nullable @Override public DiscoveryCustomMessage ackMessage() {
         return null;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserProposedMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserProposedMessage.java
index 201ced99a1c..6c41920d481 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserProposedMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserProposedMessage.java
@@ -32,13 +32,9 @@ import org.jetbrains.annotations.Nullable;
  * <p>
  * {@link UserAcceptedMessage} is sent as an acknowledgement that operation is 
finished on the all nodes of the cluster.
  */
-public class UserProposedMessage implements DiscoveryServerOnlyCustomMessage {
+public class UserProposedMessage extends DiscoveryServerOnlyCustomMessage {
     /** */
     @Order(0)
-    IgniteUuid id;
-
-    /** */
-    @Order(1)
     @GridToStringInclude
     UserManagementOperation op;
 
@@ -51,20 +47,14 @@ public class UserProposedMessage implements 
DiscoveryServerOnlyCustomMessage {
      * @param op User action.
      */
     UserProposedMessage(UserManagementOperation op) {
+        super(IgniteUuid.randomUuid());
+
         assert op != null;
 
         this.op = op;
-        id = IgniteUuid.randomUuid();
     }
 
     /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
     @Nullable @Override public DiscoveryCustomMessage ackMessage() {
         return null;
     }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinityChangeMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinityChangeMessage.java
index f4be696ae3c..a7c807649e7 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinityChangeMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinityChangeMessage.java
@@ -36,33 +36,29 @@ import org.jetbrains.annotations.Nullable;
  * CacheAffinityChangeMessage represent a message that switches to a new 
affinity assignmentafter rebalance is finished.
  * This message should not be mutated  in any way outside the 
"disco-notifier-worker" thread.
  */
-public class CacheAffinityChangeMessage implements DiscoveryCustomMessage {
+public class CacheAffinityChangeMessage extends DiscoveryCustomMessage {
     /** */
     @Order(0)
-    IgniteUuid id;
-
-    /** */
-    @Order(1)
     AffinityTopologyVersion topVer;
 
     /** */
-    @Order(2)
+    @Order(1)
     GridDhtPartitionExchangeId exchId;
 
     /** */
-    @Order(3)
+    @Order(2)
     Map<Integer, Map<Integer, List<UUID>>> assignmentChange;
 
     /** */
-    @Order(4)
+    @Order(3)
     Map<Integer, IgniteUuid> cacheDeploymentIds;
 
     /** */
-    @Order(5)
+    @Order(4)
     GridDhtPartitionsFullMessage partsMsg;
 
     /** If this flag is {@code true} then this message should lead to 
partition map exchnage. */
-    @Order(6)
+    @Order(5)
     boolean exchangeNeeded;
 
     /**
@@ -85,7 +81,8 @@ public class CacheAffinityChangeMessage implements 
DiscoveryCustomMessage {
      * @param cacheDeploymentIds Cache deployment ID.
      */
     public CacheAffinityChangeMessage(AffinityTopologyVersion topVer, 
Map<Integer, IgniteUuid> cacheDeploymentIds) {
-        id = IgniteUuid.randomUuid();
+        super(IgniteUuid.randomUuid());
+
         this.topVer = topVer;
         this.cacheDeploymentIds = cacheDeploymentIds;
     }
@@ -100,8 +97,10 @@ public class CacheAffinityChangeMessage implements 
DiscoveryCustomMessage {
     public CacheAffinityChangeMessage(
         GridDhtPartitionExchangeId exchId,
         GridDhtPartitionsFullMessage partsMsg,
-        Map<Integer, Map<Integer, List<UUID>>> assignmentChange) {
-        id = IgniteUuid.randomUuid();
+        Map<Integer, Map<Integer, List<UUID>>> assignmentChange
+    ) {
+        super(IgniteUuid.randomUuid());
+
         this.exchId = exchId;
         this.partsMsg = partsMsg;
         this.assignmentChange = assignmentChange;
@@ -156,11 +155,6 @@ public class CacheAffinityChangeMessage implements 
DiscoveryCustomMessage {
         return topVer;
     }
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
-    }
-
     /** {@inheritDoc} */
     @Nullable @Override public DiscoveryCustomMessage ackMessage() {
         if (!stopProc)
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheStatisticsClearMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheStatisticsClearMessage.java
index bd4601648e6..b20d1f16972 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheStatisticsClearMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheStatisticsClearMessage.java
@@ -28,24 +28,20 @@ import org.jetbrains.annotations.Nullable;
 /**
  * Cache statistics clear discovery message.
  */
-public class CacheStatisticsClearMessage implements DiscoveryCustomMessage {
+public class CacheStatisticsClearMessage extends DiscoveryCustomMessage {
     /** Initial message flag mask. */
     private static final byte INITIAL_MSG_MASK = 0x01;
 
-    /** Custom message ID. */
-    @Order(0)
-    IgniteUuid id;
-
     /** Request id. */
-    @Order(1)
+    @Order(0)
     UUID reqId;
 
     /** Cache names. */
-    @Order(2)
+    @Order(1)
     Collection<String> caches;
 
     /** Flags. */
-    @Order(3)
+    @Order(2)
     byte flags;
 
     /**
@@ -61,10 +57,11 @@ public class CacheStatisticsClearMessage implements 
DiscoveryCustomMessage {
      * @param caches Collection of cache names.
      */
     public CacheStatisticsClearMessage(UUID reqId, Collection<String> caches) {
+        super(IgniteUuid.randomUuid());
+
         this.reqId = reqId;
         this.caches = caches;
 
-        id = IgniteUuid.randomUuid();
         flags = INITIAL_MSG_MASK;
     }
 
@@ -74,17 +71,13 @@ public class CacheStatisticsClearMessage implements 
DiscoveryCustomMessage {
      * @param msg Request message.
      */
     private CacheStatisticsClearMessage(CacheStatisticsClearMessage msg) {
-        id = IgniteUuid.randomUuid();
+        super(IgniteUuid.randomUuid());
+
         reqId = msg.reqId;
         caches = null;
         flags = 0;
     }
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
-    }
-
     /** {@inheritDoc} */
     @Nullable @Override public DiscoveryCustomMessage ackMessage() {
         return initial() ? new CacheStatisticsClearMessage(this) : null;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheStatisticsModeChangeMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheStatisticsModeChangeMessage.java
index b660f2048cc..b5c9ade3d65 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheStatisticsModeChangeMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheStatisticsModeChangeMessage.java
@@ -30,27 +30,23 @@ import org.jetbrains.annotations.Nullable;
 /**
  * Cache statistics mode change discovery message.
  */
-public class CacheStatisticsModeChangeMessage implements 
DiscoveryCustomMessage {
+public class CacheStatisticsModeChangeMessage extends DiscoveryCustomMessage {
     /** Initial message flag mask. */
     private static final byte INITIAL_MSG_MASK = 0x01;
 
     /** Statistics enabled flag mask. */
     private static final byte ENABLED_MASK = 0x02;
 
-    /** Custom message ID. */
-    @Order(0)
-    IgniteUuid id;
-
     /** Request id. */
-    @Order(1)
+    @Order(0)
     UUID reqId;
 
     /** Cache names. */
-    @Order(2)
+    @Order(1)
     Collection<String> caches;
 
     /** Flags. */
-    @Order(3)
+    @Order(2)
     byte flags;
 
     /**
@@ -66,14 +62,12 @@ public class CacheStatisticsModeChangeMessage implements 
DiscoveryCustomMessage
      * @param req Request message.
      */
     private CacheStatisticsModeChangeMessage(CacheStatisticsModeChangeMessage 
req) {
-        id = IgniteUuid.randomUuid();
+        super(IgniteUuid.randomUuid());
+
         reqId = req.reqId;
         caches = null;
 
-        if (req.enabled())
-            flags = ENABLED_MASK;
-        else
-            flags = 0;
+        flags = req.enabled() ? ENABLED_MASK : 0;
     }
 
     /**
@@ -82,7 +76,8 @@ public class CacheStatisticsModeChangeMessage implements 
DiscoveryCustomMessage
      * @param caches Collection of cache names.
      */
     public CacheStatisticsModeChangeMessage(Collection<String> caches, boolean 
enabled) {
-        id = IgniteUuid.randomUuid();
+        super(IgniteUuid.randomUuid());
+
         reqId = UUID.randomUUID();
         this.caches = Collections.unmodifiableCollection(caches);
 
@@ -94,11 +89,6 @@ public class CacheStatisticsModeChangeMessage implements 
DiscoveryCustomMessage
         this.flags = flags;
     }
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
-    }
-
     /** {@inheritDoc} */
     @Nullable @Override public DiscoveryCustomMessage ackMessage() {
         return initial() ? new CacheStatisticsModeChangeMessage(this) : null;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClientCacheChangeDiscoveryMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClientCacheChangeDiscoveryMessage.java
index 165807bc85f..f96e9665af5 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClientCacheChangeDiscoveryMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClientCacheChangeDiscoveryMessage.java
@@ -33,19 +33,15 @@ import org.jetbrains.annotations.Nullable;
 /**
  * Sent from cache client node to asynchronously notify about started.closed 
client caches.
  */
-public class ClientCacheChangeDiscoveryMessage implements 
DiscoveryCustomMessage {
-    /** */
-    @Order(0)
-    IgniteUuid id;
-
+public class ClientCacheChangeDiscoveryMessage extends DiscoveryCustomMessage {
     /** */
     @GridToStringInclude
-    @Order(1)
+    @Order(0)
     Map<Integer, Boolean> startedCaches;
 
     /** */
     @GridToStringInclude
-    @Order(2)
+    @Order(1)
     Set<Integer> closedCaches;
 
     /** Update timeout object, used to batch multiple starts/close into single 
discovery message. */
@@ -59,7 +55,8 @@ public class ClientCacheChangeDiscoveryMessage implements 
DiscoveryCustomMessage
      * @param closedCaches Closed caches.
      */
     public ClientCacheChangeDiscoveryMessage(Map<Integer, Boolean> 
startedCaches, Set<Integer> closedCaches) {
-        id = IgniteUuid.randomUuid();
+        super(IgniteUuid.randomUuid());
+
         this.startedCaches = startedCaches;
         this.closedCaches = closedCaches;
     }
@@ -159,11 +156,6 @@ public class ClientCacheChangeDiscoveryMessage implements 
DiscoveryCustomMessage
         return closedCaches;
     }
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
-    }
-
     /** {@inheritDoc} */
     @Nullable @Override public DiscoveryCustomMessage ackMessage() {
         return null;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClientCacheChangeDummyDiscoveryMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClientCacheChangeDummyDiscoveryMessage.java
index 824cb7822ff..b7cf7ad99c5 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClientCacheChangeDummyDiscoveryMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClientCacheChangeDummyDiscoveryMessage.java
@@ -20,33 +20,24 @@ package org.apache.ignite.internal.processors.cache;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
-import org.apache.ignite.IgniteCheckedException;
-import org.apache.ignite.internal.MarshallableMessage;
 import org.apache.ignite.internal.Order;
 import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
-import org.apache.ignite.internal.processors.security.SecurityContext;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.internal.S;
-import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteUuid;
-import org.apache.ignite.marshaller.Marshaller;
 import org.jetbrains.annotations.Nullable;
 
 /**
  * Dummy discovery message which is not really sent via ring, it is just added 
in local discovery worker queue.
  */
-public class ClientCacheChangeDummyDiscoveryMessage extends 
AbstractCachePartitionExchangeWorkerTask
-    implements DiscoveryCustomMessage, MarshallableMessage {
+public class ClientCacheChangeDummyDiscoveryMessage extends 
DiscoveryCustomMessage {
     /** */
     @Order(0)
     UUID reqId;
 
     /** */
-    Map<String, DynamicCacheChangeRequest> startReqs;
-
-    /** JDK Serialized version of startReqs. */
     @Order(1)
-    byte[] startRequestsBytes;
+    Map<String, DynamicCacheChangeRequest> startReqs;
 
     /** */
     @GridToStringInclude
@@ -55,23 +46,19 @@ public class ClientCacheChangeDummyDiscoveryMessage extends 
AbstractCachePartiti
 
     /** */
     public ClientCacheChangeDummyDiscoveryMessage() {
-        super(null);
+        // No-op.
     }
 
     /**
-     * @param secCtx Security context in which current task must be executed.
      * @param reqId Start request ID.
      * @param startReqs Caches start requests.
      * @param cachesToClose Cache to close.
      */
     public ClientCacheChangeDummyDiscoveryMessage(
-        SecurityContext secCtx,
         UUID reqId,
         @Nullable Map<String, DynamicCacheChangeRequest> startReqs,
         @Nullable Set<String> cachesToClose
     ) {
-        super(secCtx);
-
         assert reqId != null;
         assert startReqs != null ^ cachesToClose != null;
 
@@ -80,11 +67,6 @@ public class ClientCacheChangeDummyDiscoveryMessage extends 
AbstractCachePartiti
         this.cachesToClose = cachesToClose;
     }
 
-    /** {@inheritDoc} */
-    @Override public boolean skipForExchangeMerge() {
-        return true;
-    }
-
     /**
      * @return Start request ID.
      */
@@ -116,18 +98,6 @@ public class ClientCacheChangeDummyDiscoveryMessage extends 
AbstractCachePartiti
         throw new UnsupportedOperationException();
     }
 
-    /** {@inheritDoc} */
-    @Override public void prepareMarshal(Marshaller marsh) throws 
IgniteCheckedException {
-        if (startReqs != null)
-            startRequestsBytes = U.marshal(marsh, startReqs);
-    }
-
-    /** {@inheritDoc} */
-    @Override public void finishUnmarshal(Marshaller marsh, ClassLoader 
clsLdr) throws IgniteCheckedException {
-        if (startRequestsBytes != null)
-            startReqs = U.unmarshal(marsh, startRequestsBytes, clsLdr);
-    }
-
     /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(ClientCacheChangeDummyDiscoveryMessage.class, this,
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClientCacheChangeDummyDiscoveryTask.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClientCacheChangeDummyDiscoveryTask.java
new file mode 100644
index 00000000000..e7c6165ebbc
--- /dev/null
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClientCacheChangeDummyDiscoveryTask.java
@@ -0,0 +1,54 @@
+/*
+ * 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;
+
+import org.apache.ignite.internal.processors.security.SecurityContext;
+import org.apache.ignite.internal.util.typedef.internal.S;
+
+/** Client cache change dummy task for exchange worker. */
+public class ClientCacheChangeDummyDiscoveryTask extends 
AbstractCachePartitionExchangeWorkerTask {
+    /** Discovery message. */
+    private final ClientCacheChangeDummyDiscoveryMessage msg;
+
+    /**
+     * @param secCtx Security context in which current task must be executed.
+     * @param msg Message.
+     */
+    public ClientCacheChangeDummyDiscoveryTask(SecurityContext secCtx, 
ClientCacheChangeDummyDiscoveryMessage msg) {
+        super(secCtx);
+
+        assert msg != null;
+
+        this.msg = msg;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean skipForExchangeMerge() {
+        return true;
+    }
+
+    /** @return Message. */
+    public ClientCacheChangeDummyDiscoveryMessage message() {
+        return msg;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(ClientCacheChangeDummyDiscoveryTask.class, this);
+    }
+}
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeBatch.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeBatch.java
index c90c02aa79b..9aaa37acf0a 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeBatch.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeBatch.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.internal.processors.cache;
 
 import java.util.Collection;
-import java.util.Set;
 import org.apache.ignite.internal.Order;
 import org.apache.ignite.internal.managers.discovery.DiscoCache;
 import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
@@ -30,33 +29,20 @@ import 
org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.lang.IgniteUuid;
-import org.apache.ignite.plugin.extensions.communication.Message;
 import org.jetbrains.annotations.Nullable;
 
 /**
  * Cache change batch.
  */
-public class DynamicCacheChangeBatch implements DiscoveryCustomMessage, 
Message {
-    /** Discovery custom message ID. */
-    @Order(0)
-    IgniteUuid id;
-
+public class DynamicCacheChangeBatch extends DiscoveryCustomMessage {
     /** Change requests. */
     @GridToStringInclude
-    @Order(1)
+    @Order(0)
     Collection<DynamicCacheChangeRequest> reqs;
 
     /** Cache updates to be executed on exchange. */
     private ExchangeActions exchangeActions;
 
-    /** */
-    @Order(2)
-    boolean startCaches;
-
-    /** Restarting caches. */
-    @Order(3)
-    Set<String> restartingCaches;
-
     /** Affinity (cache related) services updates to be processed on services 
deployment process. */
     @GridToStringExclude
     @Nullable private ServiceDeploymentActions serviceDeploymentActions;
@@ -70,17 +56,13 @@ public class DynamicCacheChangeBatch implements 
DiscoveryCustomMessage, Message
      * @param reqs Requests.
      */
     public DynamicCacheChangeBatch(Collection<DynamicCacheChangeRequest> reqs) 
{
+        super(IgniteUuid.randomUuid());
+
         assert !F.isEmpty(reqs) : reqs;
 
-        id = IgniteUuid.randomUuid();
         this.reqs = reqs;
     }
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
-    }
-
     /** {@inheritDoc} */
     @Nullable @Override public DiscoveryCustomMessage ackMessage() {
         return null;
@@ -99,13 +81,6 @@ public class DynamicCacheChangeBatch implements 
DiscoveryCustomMessage, Message
         return reqs;
     }
 
-    /**
-     * @return {@code True} if request should trigger partition exchange.
-     */
-    public boolean exchangeNeeded() {
-        return exchangeActions != null;
-    }
-
     /**
      * @return Cache updates to be executed on exchange.
      */
@@ -136,36 +111,6 @@ public class DynamicCacheChangeBatch implements 
DiscoveryCustomMessage, Message
         this.serviceDeploymentActions = serviceDeploymentActions;
     }
 
-    /**
-     * @return {@code True} if required to start all caches on client node.
-     */
-    public boolean startCaches() {
-        return startCaches;
-    }
-
-    /**
-     * @param restartingCaches Restarting caches.
-     */
-    public DynamicCacheChangeBatch restartingCaches(Set<String> 
restartingCaches) {
-        this.restartingCaches = restartingCaches;
-
-        return this;
-    }
-
-    /**
-     * @return Set of restarting caches.
-     */
-    public Set<String> restartingCaches() {
-        return restartingCaches;
-    }
-
-    /**
-     * @param startCaches {@code True} if required to start all caches on 
client node.
-     */
-    public void startCaches(boolean startCaches) {
-        this.startCaches = startCaches;
-    }
-
     /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(DynamicCacheChangeBatch.class, this);
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ExchangeFailureMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ExchangeFailureMessage.java
index 9393474d938..a555186e97c 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ExchangeFailureMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ExchangeFailureMessage.java
@@ -42,23 +42,19 @@ import org.jetbrains.annotations.Nullable;
 /**
  * This class represents discovery message that is used to provide information 
about dynamic cache start failure.
  */
-public class ExchangeFailureMessage implements DiscoveryCustomMessage {
+public class ExchangeFailureMessage extends DiscoveryCustomMessage {
     /** Cache names. */
     @GridToStringInclude
     @Order(0)
     Collection<String> cacheNames;
 
-    /** Custom message ID. */
-    @Order(1)
-    IgniteUuid id;
-
     /** */
-    @Order(2)
+    @Order(1)
     GridDhtPartitionExchangeId exchId;
 
     /** */
     @GridToStringInclude
-    @Order(3)
+    @Order(2)
     Map<UUID, ErrorMessage> exchangeErrors;
 
     /** Actions to be done to rollback changes done before the exchange 
failure. */
@@ -82,22 +78,18 @@ public class ExchangeFailureMessage implements 
DiscoveryCustomMessage {
         Map<UUID, Throwable> exchangeErrors,
         Collection<String> cacheNames
     ) {
+        super(IgniteUuid.randomUuid());
+
         assert exchId != null;
         assert !F.isEmpty(exchangeErrors);
         assert !F.isEmpty(cacheNames) : cacheNames;
 
-        this.id = IgniteUuid.fromUuid(locNode.id());
         this.exchId = exchId;
         this.cacheNames = cacheNames;
         this.exchangeErrors = exchangeErrors.entrySet().stream().collect(
             Collectors.toMap(Map.Entry::getKey, e -> new 
ErrorMessage(e.getValue()), (a, b) -> a, HashMap::new));
     }
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
-    }
-
     /**
      * @return Collection of failed caches.
      */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
index a8e4981dbef..a49cadcbb19 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
@@ -95,7 +95,7 @@ import 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.lat
 import 
org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridClientPartitionTopology;
 import 
org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionTopology;
 import 
org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal;
-import 
org.apache.ignite.internal.processors.cache.persistence.snapshot.SnapshotDiscoveryMessage;
+import 
org.apache.ignite.internal.processors.cache.persistence.snapshot.SnapshotStartDiscoveryMessage;
 import 
org.apache.ignite.internal.processors.cache.transactions.IgniteInternalTx;
 import 
org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
@@ -617,8 +617,8 @@ public class GridCachePartitionExchangeManager<K, V> 
extends GridCacheSharedMana
                 if (exchangeTopVer >= locNodeJoinTopVer)
                     exchangeFuture(msg.exchangeId(), null, null, null, 
null).onExchangeFailureMessage(evt.eventNode(), msg);
             }
-            else if (customMsg instanceof SnapshotDiscoveryMessage
-                && ((SnapshotDiscoveryMessage)customMsg).needExchange()) {
+            else if (customMsg instanceof SnapshotStartDiscoveryMessage
+                && ((SnapshotStartDiscoveryMessage)customMsg).needExchange()) {
                 exchId = exchangeId(n.id(), affinityTopologyVersion(evt), evt);
 
                 exchFut = exchangeFuture(exchId, evt, null, null, null);
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
index 369e3627a94..298c69cd767 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
@@ -121,7 +121,7 @@ import 
org.apache.ignite.internal.processors.cache.persistence.metastorage.Metas
 import 
org.apache.ignite.internal.processors.cache.persistence.metastorage.ReadOnlyMetastorage;
 import 
org.apache.ignite.internal.processors.cache.persistence.partstate.GroupPartitionId;
 import 
org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteSnapshotManager;
-import 
org.apache.ignite.internal.processors.cache.persistence.snapshot.SnapshotDiscoveryMessage;
+import 
org.apache.ignite.internal.processors.cache.persistence.snapshot.SnapshotStartDiscoveryMessage;
 import 
org.apache.ignite.internal.processors.cache.persistence.tree.reuse.ReuseList;
 import 
org.apache.ignite.internal.processors.cache.persistence.wal.FileWriteAheadLogManager;
 import 
org.apache.ignite.internal.processors.cache.query.GridCacheDistributedQueryManager;
@@ -398,7 +398,7 @@ public class GridCacheProcessor extends 
GridProcessorAdapter {
         else if (msg instanceof ClientCacheChangeDummyDiscoveryMessage) {
             ClientCacheChangeDummyDiscoveryMessage msg0 = 
(ClientCacheChangeDummyDiscoveryMessage)msg;
 
-            return msg0;
+            return new 
ClientCacheChangeDummyDiscoveryTask(remoteSecurityContext(ctx), msg0);
         }
         else if (msg instanceof CacheStatisticsModeChangeMessage) {
             CacheStatisticsModeChangeMessage msg0 = 
(CacheStatisticsModeChangeMessage)msg;
@@ -432,10 +432,10 @@ public class GridCacheProcessor extends 
GridProcessorAdapter {
 
             ctx.query().onNodeLeave(task0.node());
         }
-        else if (task instanceof ClientCacheChangeDummyDiscoveryMessage) {
-            ClientCacheChangeDummyDiscoveryMessage task0 = 
(ClientCacheChangeDummyDiscoveryMessage)task;
+        else if (task instanceof ClientCacheChangeDummyDiscoveryTask) {
+            ClientCacheChangeDummyDiscoveryTask task0 = 
(ClientCacheChangeDummyDiscoveryTask)task;
 
-            sharedCtx.affinity().processClientCachesRequests(task0);
+            sharedCtx.affinity().processClientCachesRequests(task0.message());
         }
         else if (task instanceof ClientCacheUpdateTimeout) {
             ClientCacheUpdateTimeout task0 = (ClientCacheUpdateTimeout)task;
@@ -4237,8 +4237,8 @@ public class GridCacheProcessor extends 
GridProcessorAdapter {
         if (msg instanceof CacheAffinityChangeMessage)
             return 
sharedCtx.affinity().onCustomEvent(((CacheAffinityChangeMessage)msg));
 
-        if (msg instanceof SnapshotDiscoveryMessage &&
-            ((SnapshotDiscoveryMessage)msg).needExchange())
+        if (msg instanceof SnapshotStartDiscoveryMessage &&
+            ((SnapshotStartDiscoveryMessage)msg).needExchange())
             return true;
 
         if (msg instanceof WalStateAbstractMessage) {
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/TxTimeoutOnPartitionMapExchangeChangeMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/TxTimeoutOnPartitionMapExchangeChangeMessage.java
index 224762cceca..6cfeb6afa15 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/TxTimeoutOnPartitionMapExchangeChangeMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/TxTimeoutOnPartitionMapExchangeChangeMessage.java
@@ -27,21 +27,17 @@ import org.jetbrains.annotations.Nullable;
 /**
  * Discovery message for changing transaction timeout on partition map 
exchange.
  */
-public class TxTimeoutOnPartitionMapExchangeChangeMessage implements 
DiscoveryCustomMessage {
-    /** */
-    @Order(0)
-    IgniteUuid id;
-
+public class TxTimeoutOnPartitionMapExchangeChangeMessage extends 
DiscoveryCustomMessage {
     /** Request ID. */
-    @Order(1)
+    @Order(0)
     UUID reqId;
 
     /** Transaction timeout on partition map exchange in milliseconds. */
-    @Order(2)
+    @Order(1)
     long timeout;
 
     /** Init flag. */
-    @Order(3)
+    @Order(2)
     boolean isInit;
 
     /** */
@@ -54,8 +50,9 @@ public class TxTimeoutOnPartitionMapExchangeChangeMessage 
implements DiscoveryCu
      *
      * @param req Request message.
      */
-    public 
TxTimeoutOnPartitionMapExchangeChangeMessage(TxTimeoutOnPartitionMapExchangeChangeMessage
 req) {
-        id = IgniteUuid.randomUuid();
+    private 
TxTimeoutOnPartitionMapExchangeChangeMessage(TxTimeoutOnPartitionMapExchangeChangeMessage
 req) {
+        super(IgniteUuid.randomUuid());
+
         reqId = req.reqId;
         timeout = req.timeout;
         isInit = false;
@@ -68,17 +65,13 @@ public class TxTimeoutOnPartitionMapExchangeChangeMessage 
implements DiscoveryCu
      * @param timeout Transaction timeout on partition map exchange in 
milliseconds.
      */
     public TxTimeoutOnPartitionMapExchangeChangeMessage(UUID reqId, long 
timeout) {
-        id = IgniteUuid.randomUuid();
+        super(IgniteUuid.randomUuid());
+
         this.reqId = reqId;
         this.timeout = timeout;
         isInit = true;
     }
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
-    }
-
     /** {@inheritDoc} */
     @Nullable @Override public DiscoveryCustomMessage ackMessage() {
         return isInit() ? new 
TxTimeoutOnPartitionMapExchangeChangeMessage(this) : null;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/WalStateAbstractMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/WalStateAbstractMessage.java
index e2d4b786d42..700b4f865fa 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/WalStateAbstractMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/WalStateAbstractMessage.java
@@ -32,24 +32,20 @@ import org.jetbrains.annotations.Nullable;
 /**
  * WAL state change abstract message.
  */
-public abstract class WalStateAbstractMessage implements 
DiscoveryCustomMessage, Serializable {
+public abstract class WalStateAbstractMessage extends DiscoveryCustomMessage 
implements Serializable {
     /** */
     private static final long serialVersionUID = 0L;
 
-    /** Message ID */
-    @Order(0)
-    IgniteUuid id;
-
     /** Unique operation ID. */
-    @Order(1)
+    @Order(0)
     UUID opId;
 
     /** Group ID. */
-    @Order(2)
+    @Order(1)
     int grpId;
 
     /** Group deployment ID. */
-    @Order(3)
+    @Order(2)
     IgniteUuid grpDepId;
 
     /** Message that should be processed through exchange thread. */
@@ -69,7 +65,8 @@ public abstract class WalStateAbstractMessage implements 
DiscoveryCustomMessage,
      * @param grpDepId Group deployment ID.
      */
     protected WalStateAbstractMessage(UUID opId, int grpId, IgniteUuid 
grpDepId) {
-        id = IgniteUuid.randomUuid();
+        super(IgniteUuid.randomUuid());
+
         this.opId = opId;
         this.grpId = grpId;
         this.grpDepId = grpDepId;
@@ -121,11 +118,6 @@ public abstract class WalStateAbstractMessage implements 
DiscoveryCustomMessage,
         this.exchangeMsg = exchangeMsg;
     }
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
-    }
-
     /** {@inheritDoc} */
     @Nullable @Override public DiscoveryCustomMessage ackMessage() {
         return null;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataRemoveAcceptedMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataRemoveAcceptedMessage.java
index 3ff707ee477..9919779a5fe 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataRemoveAcceptedMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataRemoveAcceptedMessage.java
@@ -29,17 +29,13 @@ import org.jetbrains.annotations.Nullable;
  * As discovery messaging doesn't guarantee that message makes only one pass 
across the cluster
  * <b>MetadataRemoveAcceptedMessage</b> enables to mark it as duplicated so 
other nodes won't process it but skip.
  */
-public class MetadataRemoveAcceptedMessage implements DiscoveryCustomMessage {
+public class MetadataRemoveAcceptedMessage extends DiscoveryCustomMessage {
     /** */
     @Order(0)
-    IgniteUuid id;
-
-    /** */
-    @Order(1)
     int typeId;
 
     /** */
-    @Order(2)
+    @Order(1)
     boolean duplicated;
 
     /** Constructor. */
@@ -51,13 +47,9 @@ public class MetadataRemoveAcceptedMessage implements 
DiscoveryCustomMessage {
      * @param typeId Type id.
      */
     MetadataRemoveAcceptedMessage(int typeId) {
-        id = IgniteUuid.randomUuid();
-        this.typeId = typeId;
-    }
+        super(IgniteUuid.randomUuid());
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
+        this.typeId = typeId;
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataRemoveProposedMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataRemoveProposedMessage.java
index 87bec077f47..246594d1b3b 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataRemoveProposedMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataRemoveProposedMessage.java
@@ -30,25 +30,21 @@ import org.jetbrains.annotations.Nullable;
  * discovery-based protocol for manage {@link BinaryMetadata metadata} 
describing objects in binary format
  * stored in Ignite caches.
  */
-public final class MetadataRemoveProposedMessage implements 
DiscoveryCustomMessage {
-    /** */
-    @Order(0)
-    IgniteUuid id;
-
+public final class MetadataRemoveProposedMessage extends 
DiscoveryCustomMessage {
     /** Node UUID which initiated metadata update. */
-    @Order(1)
+    @Order(0)
     UUID origNodeId;
 
     /** Metadata type id. */
-    @Order(2)
+    @Order(1)
     int typeId;
 
     /** Message received on coordinator. */
-    @Order(3)
+    @Order(2)
     boolean onCoordinator = true;
 
     /** */
-    @Order(4)
+    @Order(3)
     String errMsg;
 
     /** Constructor. */
@@ -61,18 +57,14 @@ public final class MetadataRemoveProposedMessage implements 
DiscoveryCustomMessa
      * @param origNodeId ID of node requested update.
      */
     public MetadataRemoveProposedMessage(int typeId, UUID origNodeId) {
+        super(IgniteUuid.randomUuid());
+
         assert origNodeId != null;
 
-        id = IgniteUuid.randomUuid();
         this.origNodeId = origNodeId;
         this.typeId = typeId;
     }
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
-    }
-
     /** {@inheritDoc} */
     @Nullable @Override public DiscoveryCustomMessage ackMessage() {
         return !rejected() ? new MetadataRemoveAcceptedMessage(typeId) : null;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataUpdateAcceptedMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataUpdateAcceptedMessage.java
index 1f2c2ebbd48..c18c424dcd6 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataUpdateAcceptedMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataUpdateAcceptedMessage.java
@@ -24,25 +24,21 @@ import org.jetbrains.annotations.Nullable;
 
 /**
  * Acknowledge message for {@link MetadataUpdateProposedMessage}: see its 
javadoc for detailed description of protocol.
- *
+ * <p>
  * As discovery messaging doesn't guarantee that message makes only one pass 
across the cluster
  * <b>MetadataUpdateAcceptedMessage</b> enables to mark it as duplicated so 
other nodes won't process it but skip.
  */
-public class MetadataUpdateAcceptedMessage implements DiscoveryCustomMessage {
+public class MetadataUpdateAcceptedMessage extends DiscoveryCustomMessage {
     /** */
     @Order(0)
-    IgniteUuid id;
-
-    /** */
-    @Order(1)
     int typeId;
 
     /** */
-    @Order(2)
+    @Order(1)
     int acceptedVer;
 
     /** */
-    @Order(3)
+    @Order(2)
     boolean duplicated;
 
     /** */
@@ -53,16 +49,12 @@ public class MetadataUpdateAcceptedMessage implements 
DiscoveryCustomMessage {
      * @param acceptedVer Accepted version.
      */
     MetadataUpdateAcceptedMessage(int typeId, int acceptedVer) {
-        id = IgniteUuid.randomUuid();
+        super(IgniteUuid.randomUuid());
+
         this.typeId = typeId;
         this.acceptedVer = acceptedVer;
     }
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
-    }
-
     /** {@inheritDoc} */
     @Nullable @Override public DiscoveryCustomMessage ackMessage() {
         return null;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataUpdateProposedMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataUpdateProposedMessage.java
index c06b6e92a36..90820675c62 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataUpdateProposedMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataUpdateProposedMessage.java
@@ -73,36 +73,32 @@ import org.jetbrains.annotations.Nullable;
  * it gets blocked until {@link MetadataUpdateAcceptedMessage} arrives with 
<b>accepted version</b>
  * equals to <b>pending version</b> of this metadata to the moment when is was 
initially read by the thread.
  */
-public final class MetadataUpdateProposedMessage implements 
DiscoveryCustomMessage, MarshallableMessage {
-    /** */
-    @Order(0)
-    IgniteUuid id;
-
+public final class MetadataUpdateProposedMessage extends 
DiscoveryCustomMessage implements MarshallableMessage {
     /** Node UUID which initiated metadata update. */
-    @Order(1)
+    @Order(0)
     UUID origNodeId;
 
     /** */
     private BinaryMetadata metadata;
 
     /** Serialized {@link #metadata}. */
-    @Order(2)
+    @Order(1)
     byte[] metadataBytes;
 
     /** Metadata type id. */
-    @Order(3)
+    @Order(2)
     int typeId;
 
     /** Metadata version which is pending for update. */
-    @Order(4)
+    @Order(3)
     int pendingVer;
 
     /** Metadata version which is already accepted by entire cluster. */
-    @Order(5)
+    @Order(4)
     int acceptedVer;
 
     /** */
-    @Order(6)
+    @Order(5)
     @Nullable ErrorMessage errMsg;
 
     /** Constructor. */
@@ -115,21 +111,17 @@ public final class MetadataUpdateProposedMessage 
implements DiscoveryCustomMessa
      * @param origNodeId ID of node requested update.
      */
     public MetadataUpdateProposedMessage(BinaryMetadata metadata, UUID 
origNodeId) {
+        super(IgniteUuid.randomUuid());
+
         assert origNodeId != null;
         assert metadata != null;
 
-        id = IgniteUuid.randomUuid();
         this.origNodeId = origNodeId;
 
         this.metadata = metadata;
         typeId = metadata.typeId();
     }
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
-    }
-
     /** {@inheritDoc} */
     @Nullable @Override public DiscoveryCustomMessage ackMessage() {
         return !rejected() ? new MetadataUpdateAcceptedMessage(typeId, 
pendingVer) : null;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
index 3c821355173..50c3286208f 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
@@ -99,7 +99,7 @@ import 
org.apache.ignite.internal.processors.cache.distributed.dht.topology.Grid
 import 
org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionsStateValidator;
 import 
org.apache.ignite.internal.processors.cache.persistence.DatabaseLifecycleListener;
 import 
org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager;
-import 
org.apache.ignite.internal.processors.cache.persistence.snapshot.SnapshotDiscoveryMessage;
+import 
org.apache.ignite.internal.processors.cache.persistence.snapshot.SnapshotStartDiscoveryMessage;
 import org.apache.ignite.internal.processors.cache.transactions.IgniteTxKey;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
 import org.apache.ignite.internal.processors.cluster.BaselineTopology;
@@ -988,7 +988,7 @@ public class GridDhtPartitionsExchangeFuture extends 
GridDhtTopologyFutureAdapte
 
                     exchange = onCacheChangeRequest(crdNode);
                 }
-                else if (msg instanceof SnapshotDiscoveryMessage)
+                else if (msg instanceof SnapshotStartDiscoveryMessage)
                     exchange = onCustomMessageNoAffinityChange();
                 else if (msg instanceof WalStateAbstractMessage)
                     exchange = onCustomMessageNoAffinityChange();
@@ -3824,8 +3824,8 @@ public class GridDhtPartitionsExchangeFuture extends 
GridDhtTopologyFutureAdapte
                             finalizePartitionCounters();
                     }
                 }
-                else if (discoveryCustomMsg instanceof SnapshotDiscoveryMessage
-                    && 
((SnapshotDiscoveryMessage)discoveryCustomMsg).needAssignPartitions()) {
+                else if (discoveryCustomMsg instanceof 
SnapshotStartDiscoveryMessage
+                    && 
((SnapshotStartDiscoveryMessage)discoveryCustomMsg).needAssignPartitions()) {
                     markAffinityReassign();
 
                     assignPartitionsStates(null);
@@ -4636,8 +4636,8 @@ public class GridDhtPartitionsExchangeFuture extends 
GridDhtTopologyFutureAdapte
             if (firstDiscoEvt.type() == EVT_DISCOVERY_CUSTOM_EVT) {
                 DiscoveryCustomMessage discoveryCustomMsg = 
((DiscoveryCustomEvent)firstDiscoEvt).customMessage();
 
-                if (discoveryCustomMsg instanceof SnapshotDiscoveryMessage
-                    && 
((SnapshotDiscoveryMessage)discoveryCustomMsg).needAssignPartitions())
+                if (discoveryCustomMsg instanceof SnapshotStartDiscoveryMessage
+                    && 
((SnapshotStartDiscoveryMessage)discoveryCustomMsg).needAssignPartitions())
                     markAffinityReassign();
             }
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotDiscoveryMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotDiscoveryMessage.java
deleted file mode 100644
index bcad7df3876..00000000000
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotDiscoveryMessage.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.apache.ignite.internal.processors.cache.persistence.snapshot;
-
-import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
-
-/**
- * Initial snapshot discovery message with possibility to trigger exchange.
- */
-public interface SnapshotDiscoveryMessage extends DiscoveryCustomMessage {
-    /**
-     * Is exchange needed after receiving this message.
-     *
-     * @return True if exchange is needed, false in other case.
-     */
-    public boolean needExchange();
-
-    /**
-     *
-     */
-    public boolean needAssignPartitions();
-}
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotStartDiscoveryMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotStartDiscoveryMessage.java
index 0f08587315a..a16d88e9ac5 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotStartDiscoveryMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotStartDiscoveryMessage.java
@@ -26,7 +26,7 @@ import 
org.apache.ignite.plugin.extensions.communication.MessageFactory;
 import static 
org.apache.ignite.internal.util.distributed.DistributedProcess.DistributedProcessType.START_SNAPSHOT;
 
 /** Snapshot operation start message. */
-public class SnapshotStartDiscoveryMessage extends 
InitMessage<SnapshotOperationRequest> implements SnapshotDiscoveryMessage {
+public class SnapshotStartDiscoveryMessage extends 
InitMessage<SnapshotOperationRequest> {
     /** */
     @Order(0)
     boolean needExchange;
@@ -46,13 +46,17 @@ public class SnapshotStartDiscoveryMessage extends 
InitMessage<SnapshotOperation
         needExchange = !req.incremental();
     }
 
-    /** {@inheritDoc} */
-    @Override public boolean needExchange() {
+    /**
+     * Is exchange needed after receiving this message.
+     *
+     * @return True if exchange is needed, false in other case.
+     */
+    public boolean needExchange() {
         return needExchange;
     }
 
-    /** {@inheritDoc} */
-    @Override public boolean needAssignPartitions() {
+    /** */
+    public boolean needAssignPartitions() {
         return false;
     }
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateFinishMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateFinishMessage.java
index b12847a04e1..046af0d1d11 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateFinishMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateFinishMessage.java
@@ -25,24 +25,18 @@ import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.lang.IgniteUuid;
 import org.jetbrains.annotations.Nullable;
 
-/**
- *
- */
-public class ChangeGlobalStateFinishMessage implements DiscoveryCustomMessage {
-    /** Custom message ID. */
-    @Order(0)
-    IgniteUuid id;
-
+/** */
+public class ChangeGlobalStateFinishMessage extends DiscoveryCustomMessage {
     /** State change request ID. */
-    @Order(1)
+    @Order(0)
     UUID reqId;
 
     /** New cluster state. */
-    @Order(2)
+    @Order(1)
     ClusterState state;
 
     /** State change error. */
-    @Order(3)
+    @Order(2)
     boolean transitionRes;
 
     /** Constructor. */
@@ -60,10 +54,11 @@ public class ChangeGlobalStateFinishMessage implements 
DiscoveryCustomMessage {
         ClusterState state,
         boolean transitionRes
     ) {
+        super(IgniteUuid.randomUuid());
+
         assert reqId != null;
         assert state != null;
 
-        id = IgniteUuid.randomUuid();
         this.reqId = reqId;
         this.state = state;
         this.transitionRes = transitionRes;
@@ -99,11 +94,6 @@ public class ChangeGlobalStateFinishMessage implements 
DiscoveryCustomMessage {
         return state;
     }
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
-    }
-
     /** {@inheritDoc} */
     @Nullable @Override public DiscoveryCustomMessage ackMessage() {
         return null;
@@ -113,5 +103,4 @@ public class ChangeGlobalStateFinishMessage implements 
DiscoveryCustomMessage {
     @Override public String toString() {
         return S.toString(ChangeGlobalStateFinishMessage.class, this);
     }
-
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java
index 2056a0692da..7d60b92e077 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java
@@ -40,39 +40,35 @@ import org.jetbrains.annotations.Nullable;
 /**
  * Message represent request for change cluster global state.
  */
-public class ChangeGlobalStateMessage implements DiscoveryCustomMessage, 
MarshallableMessage {
-    /** Custom message ID. */
-    @Order(0)
-    IgniteUuid id;
-
+public class ChangeGlobalStateMessage extends DiscoveryCustomMessage 
implements MarshallableMessage {
     /** Request ID */
-    @Order(1)
+    @Order(0)
     UUID reqId;
 
     /** Initiator node ID. */
-    @Order(2)
+    @Order(1)
     UUID initiatingNodeId;
 
     /** Cluster state */
-    @Order(3)
+    @Order(2)
     ClusterState state;
 
     /** Configurations read from persistent store. */
     private List<StoredCacheData> storedCfgs;
 
     /** JDK Serialized version of storedCfgs. */
-    @Order(4)
+    @Order(3)
     byte[] storedCfgsBytes;
 
     /** */
     @Nullable private BaselineTopology baselineTopology;
 
     /** JDK Serialized version of baselineTopology. */
-    @Order(5)
+    @Order(4)
     byte[] baselineTopologyBytes;
 
     /** */
-    @Order(6)
+    @Order(5)
     boolean forceChangeBaselineTopology;
 
     /** */
@@ -84,7 +80,7 @@ public class ChangeGlobalStateMessage implements 
DiscoveryCustomMessage, Marshal
     @Nullable private ServiceDeploymentActions serviceDeploymentActions;
 
     /** If {@code true}, cluster deactivation will be forced. */
-    @Order(7)
+    @Order(6)
     boolean forceDeactivation;
 
     /** No-arg constructor for deserialization. */
@@ -111,10 +107,11 @@ public class ChangeGlobalStateMessage implements 
DiscoveryCustomMessage, Marshal
         boolean forceChangeBaselineTopology,
         long timestamp
     ) {
+        super(IgniteUuid.randomUuid());
+
         assert reqId != null;
         assert initiatingNodeId != null;
 
-        id = IgniteUuid.randomUuid();
         this.reqId = reqId;
         this.initiatingNodeId = initiatingNodeId;
         this.storedCfgs = storedCfgs;
@@ -161,11 +158,6 @@ public class ChangeGlobalStateMessage implements 
DiscoveryCustomMessage, Marshal
         this.serviceDeploymentActions = serviceDeploymentActions;
     }
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
-    }
-
     /** {@inheritDoc} */
     @Nullable @Override public DiscoveryCustomMessage ackMessage() {
         return null;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/AbstractContinuousMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/AbstractContinuousMessage.java
index e82c8ca30bd..d16ef9f59d7 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/AbstractContinuousMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/AbstractContinuousMessage.java
@@ -25,15 +25,11 @@ import org.apache.ignite.lang.IgniteUuid;
 /**
  *
  */
-public abstract class AbstractContinuousMessage implements 
DiscoveryCustomMessage {
+public abstract class AbstractContinuousMessage extends DiscoveryCustomMessage 
{
     /** Routine ID. */
     @Order(0)
     UUID routineId;
 
-    /** Custom message ID. */
-    @Order(1)
-    IgniteUuid id;
-
     /** */
     protected AbstractContinuousMessage() {
         // No-op.
@@ -43,13 +39,9 @@ public abstract class AbstractContinuousMessage implements 
DiscoveryCustomMessag
      * @param id Id.
      */
     protected AbstractContinuousMessage(UUID id) {
-        routineId = id;
-        this.id = IgniteUuid.randomUuid();
-    }
+        super(IgniteUuid.randomUuid());
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
+        routineId = id;
     }
 
     /**
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MappingAcceptedMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MappingAcceptedMessage.java
index f943e3bd928..048b6186571 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MappingAcceptedMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MappingAcceptedMessage.java
@@ -25,16 +25,12 @@ import org.jetbrains.annotations.Nullable;
 
 /**
  * Is sent as an acknowledgement for successfully proposed new mapping (see 
{@link MappingProposedMessage}).
- *
+ * <p>
  * If any nodes were waiting for this mapping to be accepted they will be 
unblocked on receiving this message.
  */
-public class MappingAcceptedMessage implements DiscoveryCustomMessage {
+public class MappingAcceptedMessage extends DiscoveryCustomMessage {
     /** */
     @Order(0)
-    IgniteUuid id;
-
-    /** */
-    @Order(1)
     MarshallerMappingItem item;
 
     /** */
@@ -46,13 +42,9 @@ public class MappingAcceptedMessage implements 
DiscoveryCustomMessage {
      * @param item Item.
      */
     MappingAcceptedMessage(MarshallerMappingItem item) {
-        id = IgniteUuid.randomUuid();
-        this.item = item;
-    }
+        super(IgniteUuid.randomUuid());
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
+        this.item = item;
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MappingProposedMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MappingProposedMessage.java
index 757dc7b7207..a585dd8873b 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MappingProposedMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MappingProposedMessage.java
@@ -27,13 +27,13 @@ import org.jetbrains.annotations.Nullable;
 /**
  * Node sends this message when it wants to propose new marshaller mapping and 
to ensure that there are no conflicts
  * with this mapping on other nodes in cluster.
- *
+ * <p>
  * After sending this message to the cluster sending node gets blocked until 
mapping is either accepted or rejected.
- *
+ * <p>
  * When it completes a pass around the cluster ring with no conflicts observed,
  * {@link MappingAcceptedMessage} is sent as an acknowledgement that 
everything is fine.
  */
-public class MappingProposedMessage implements DiscoveryCustomMessage {
+public class MappingProposedMessage extends DiscoveryCustomMessage {
     /** */
     enum ProposalStatus {
         /** */
@@ -46,22 +46,18 @@ public class MappingProposedMessage implements 
DiscoveryCustomMessage {
 
     /** */
     @Order(0)
-    IgniteUuid id;
-
-    /** */
-    @Order(1)
     UUID origNodeId;
 
     /** */
-    @Order(2)
+    @Order(1)
     MarshallerMappingItem mappingItem;
 
     /** */
-    @Order(3)
+    @Order(2)
     ProposalStatus status;
 
     /** */
-    @Order(4)
+    @Order(3)
     String conflictingClsName;
 
     /** */
@@ -74,27 +70,20 @@ public class MappingProposedMessage implements 
DiscoveryCustomMessage {
      * @param origNodeId Orig node id.
      */
     MappingProposedMessage(MarshallerMappingItem mappingItem, UUID origNodeId) 
{
+        super(IgniteUuid.randomUuid());
+
         assert origNodeId != null;
 
-        id = IgniteUuid.randomUuid();
         this.mappingItem = mappingItem;
         this.origNodeId = origNodeId;
         status = ProposalStatus.SUCCESSFUL;
     }
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
-    }
-
     /**
      * {@inheritDoc}
      */
     @Nullable @Override public DiscoveryCustomMessage ackMessage() {
-        if (status == ProposalStatus.SUCCESSFUL)
-            return new MappingAcceptedMessage(mappingItem());
-        else
-            return null;
+        return status == ProposalStatus.SUCCESSFUL ? new 
MappingAcceptedMessage(mappingItem()) : null;
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageUpdateAckMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageUpdateAckMessage.java
index 7b99dbf1876..0b3e3b57266 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageUpdateAckMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageUpdateAckMessage.java
@@ -26,13 +26,9 @@ import org.apache.ignite.lang.IgniteUuid;
 import org.jetbrains.annotations.Nullable;
 
 /** */
-public class DistributedMetaStorageUpdateAckMessage implements 
DiscoveryCustomMessage {
-    /** */
-    @Order(0)
-    IgniteUuid id;
-
+public class DistributedMetaStorageUpdateAckMessage extends 
DiscoveryCustomMessage {
     /** Request ID. */
-    @Order(1)
+    @Order(0)
     UUID reqId;
 
     /** Empty constructor of {@link CoreMessagesProvider}. */
@@ -42,13 +38,9 @@ public class DistributedMetaStorageUpdateAckMessage 
implements DiscoveryCustomMe
 
     /** */
     public DistributedMetaStorageUpdateAckMessage(UUID reqId) {
-        id = IgniteUuid.randomUuid();
-        this.reqId = reqId;
-    }
+        super(IgniteUuid.randomUuid());
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
+        this.reqId = reqId;
     }
 
     /** */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageUpdateMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageUpdateMessage.java
index 3b1f2f02c9a..b836fec1032 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageUpdateMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageUpdateMessage.java
@@ -31,26 +31,22 @@ import 
org.apache.ignite.plugin.extensions.communication.MessageFactory;
 import org.jetbrains.annotations.Nullable;
 
 /** */
-public class DistributedMetaStorageUpdateMessage implements 
DiscoveryCustomMessage {
-    /** */
-    @Order(0)
-    IgniteUuid id;
-
+public class DistributedMetaStorageUpdateMessage extends 
DiscoveryCustomMessage {
     /** Request ID. */
     @GridToStringInclude
-    @Order(1)
+    @Order(0)
     UUID reqId;
 
     /** */
     @GridToStringInclude
-    @Order(2)
+    @Order(1)
     String key;
 
     /** */
     private @Nullable Serializable val;
 
     /** */
-    @Order(3)
+    @Order(2)
     byte[] valBytes;
 
     /** Empty constructor for {@link MessageFactory}. */
@@ -60,18 +56,13 @@ public class DistributedMetaStorageUpdateMessage implements 
DiscoveryCustomMessa
 
     /** */
     public DistributedMetaStorageUpdateMessage(UUID reqId, String key, 
@Nullable Serializable val) {
-        id = IgniteUuid.randomUuid();
+        super(IgniteUuid.randomUuid());
 
         this.reqId = reqId;
         this.key = key;
         this.val = val;
     }
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
-    }
-
     /** */
     public String key() {
         return key;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaAbstractDiscoveryMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaAbstractDiscoveryMessage.java
index 04223b930aa..1b832abab0f 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaAbstractDiscoveryMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaAbstractDiscoveryMessage.java
@@ -30,25 +30,21 @@ import org.jetbrains.annotations.Nullable;
 /**
  * Abstract discovery message for schema operations.
  */
-public abstract class SchemaAbstractDiscoveryMessage implements 
DiscoveryCustomMessage, Serializable {
+public abstract class SchemaAbstractDiscoveryMessage extends 
DiscoveryCustomMessage implements Serializable {
     /** */
     private static final long serialVersionUID = 0L;
 
-    /** ID */
-    @Order(0)
-    IgniteUuid id;
-
     /** Operation. */
     @GridToStringInclude
-    @Order(1)
+    @Order(0)
     SchemaAbstractOperation op;
 
     /** Error message. */
-    @Order(2)
+    @Order(1)
     transient String errMsg;
 
     /** Error code. */
-    @Order(3)
+    @Order(2)
     transient int errCode;
 
     /** Error. */
@@ -67,17 +63,13 @@ public abstract class SchemaAbstractDiscoveryMessage 
implements DiscoveryCustomM
      * @param op Operation.
      */
     protected SchemaAbstractDiscoveryMessage(SchemaAbstractOperation op) {
-        id = IgniteUuid.randomUuid();
+        super(IgniteUuid.randomUuid());
+
         errCode = -1;
 
         this.op = op;
     }
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
-    }
-
     /**
      * @return Operation.
      */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceChangeBatchRequest.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceChangeBatchRequest.java
index 9a8c69748b3..e75908494f3 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceChangeBatchRequest.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceChangeBatchRequest.java
@@ -32,14 +32,10 @@ import org.jetbrains.annotations.Nullable;
 /**
  * Service change batch request discovery message.
  */
-public class ServiceChangeBatchRequest implements DiscoveryCustomMessage {
-    /** Unique custom message ID. */
-    @Order(0)
-    IgniteUuid id;
-
+public class ServiceChangeBatchRequest extends DiscoveryCustomMessage {
     /** Change requests. */
     @GridToStringInclude
-    @Order(1)
+    @Order(0)
     Collection<ServiceChangeAbstractRequest> reqs;
 
     /** Services deployment actions to be processed on services deployment 
process. */
@@ -54,9 +50,10 @@ public class ServiceChangeBatchRequest implements 
DiscoveryCustomMessage {
      * @param reqs Change requests.
      */
     public ServiceChangeBatchRequest(Collection<ServiceChangeAbstractRequest> 
reqs) {
+        super(IgniteUuid.randomUuid());
+
         assert !F.isEmpty(reqs);
 
-        id = IgniteUuid.randomUuid();
         this.reqs = reqs;
     }
 
@@ -81,14 +78,8 @@ public class ServiceChangeBatchRequest implements 
DiscoveryCustomMessage {
         this.serviceDeploymentActions = serviceDeploymentActions;
     }
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
-    }
-
     /** {@inheritDoc} */
     @Nullable @Override public DiscoveryCustomMessage ackMessage() {
-        // No-op.
         return null;
     }
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceClusterDeploymentResultBatch.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceClusterDeploymentResultBatch.java
index fcd23e89063..84a71aadee7 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceClusterDeploymentResultBatch.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceClusterDeploymentResultBatch.java
@@ -33,17 +33,13 @@ import org.jetbrains.annotations.Nullable;
  * <p/>
  * Contains collection of {@link ServiceClusterDeploymentResult}.
  */
-public class ServiceClusterDeploymentResultBatch implements 
DiscoveryCustomMessage {
-    /** Unique custom message ID. */
-    @Order(0)
-    IgniteUuid id;
-
+public class ServiceClusterDeploymentResultBatch extends 
DiscoveryCustomMessage {
     /** Deployment process id. */
-    @Order(1)
+    @Order(0)
     ServiceDeploymentProcessId depId;
 
     /** Services deployments results. */
-    @Order(2)
+    @Order(1)
     @GridToStringInclude
     Collection<ServiceClusterDeploymentResult> results;
 
@@ -59,9 +55,12 @@ public class ServiceClusterDeploymentResultBatch implements 
DiscoveryCustomMessa
      * @param depId Deployment process id.
      * @param results Services deployments results.
      */
-    public ServiceClusterDeploymentResultBatch(@NotNull 
ServiceDeploymentProcessId depId,
-        @NotNull Collection<ServiceClusterDeploymentResult> results) {
-        this.id = IgniteUuid.randomUuid();
+    public ServiceClusterDeploymentResultBatch(
+        @NotNull ServiceDeploymentProcessId depId,
+        @NotNull Collection<ServiceClusterDeploymentResult> results
+    ) {
+        super(IgniteUuid.randomUuid());
+
         this.depId = depId;
         this.results = results;
     }
@@ -94,14 +93,8 @@ public class ServiceClusterDeploymentResultBatch implements 
DiscoveryCustomMessa
         this.serviceDeploymentActions = serviceDeploymentActions;
     }
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
-    }
-
     /** {@inheritDoc} */
     @Nullable @Override public DiscoveryCustomMessage ackMessage() {
-        // No-op.
         return null;
     }
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/FullMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/FullMessage.java
index 3106bacc6f1..d54ddafeabb 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/FullMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/FullMessage.java
@@ -39,25 +39,21 @@ import org.jetbrains.annotations.Nullable;
  * @see InitMessage
  * @see SingleNodeMessage
  */
-public class FullMessage<R extends Message> implements DiscoveryCustomMessage {
-    /** Custom message ID. */
-    @Order(0)
-    IgniteUuid id;
-
+public class FullMessage<R extends Message> extends DiscoveryCustomMessage {
     /** Process id. */
-    @Order(1)
+    @Order(0)
     UUID processId;
 
     /** Process type. */
-    @Order(2)
+    @Order(1)
     int type;
 
     /** Results. */
-    @Order(3)
+    @Order(2)
     Map<UUID, R> res;
 
     /** Errors. */
-    @Order(4)
+    @Order(3)
     Map<UUID, ErrorMessage> err;
 
     /** Default constructor for {@link MessageFactory}. */
@@ -72,7 +68,8 @@ public class FullMessage<R extends Message> implements 
DiscoveryCustomMessage {
      * @param err Errors
      */
     public FullMessage(UUID processId, DistributedProcessType type, Map<UUID, 
R> res, Map<UUID, Throwable> err) {
-        this.id = IgniteUuid.randomUuid();
+        super(IgniteUuid.randomUuid());
+
         this.processId = processId;
         this.type = type.ordinal();
         this.res = res;
@@ -86,11 +83,6 @@ public class FullMessage<R extends Message> implements 
DiscoveryCustomMessage {
         }
     }
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
-    }
-
     /** {@inheritDoc} */
     @Nullable @Override public DiscoveryCustomMessage ackMessage() {
         return null;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/InitMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/InitMessage.java
index aee4e3b3b00..2369db5df46 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/InitMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/InitMessage.java
@@ -38,25 +38,21 @@ import org.jetbrains.annotations.Nullable;
  * @see FullMessage
  * @see SingleNodeMessage
  */
-public class InitMessage<I extends Message> implements DiscoveryCustomMessage {
-    /** Custom message ID. */
-    @Order(0)
-    public IgniteUuid id;
-
+public class InitMessage<I extends Message> extends DiscoveryCustomMessage {
     /** Process id. */
-    @Order(1)
+    @Order(0)
     public UUID procId;
 
     /** Process type. */
-    @Order(2)
+    @Order(1)
     public int type;
 
     /** Request. */
-    @Order(3)
+    @Order(2)
     public Message req;
 
     /** Whether coordinator waits client nodes results. */
-    @Order(4)
+    @Order(3)
     public boolean waitClnRes;
 
     /** Default constructor for {@link MessageFactory}. */
@@ -70,18 +66,14 @@ public class InitMessage<I extends Message> implements 
DiscoveryCustomMessage {
      * @param req Request.
      */
     public InitMessage(UUID procId, DistributedProcessType type, I req, 
boolean waitClnRes) {
-        this.id = IgniteUuid.randomUuid();
+        super(IgniteUuid.randomUuid());
+
         this.procId = procId;
         this.type = type.ordinal();
         this.req = req;
         this.waitClnRes = waitClnRes;
     }
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
-    }
-
     /** {@inheritDoc} */
     @Nullable @Override public DiscoveryCustomMessage ackMessage() {
         return null;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/TcpConnectionRequestDiscoveryMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/TcpConnectionRequestDiscoveryMessage.java
index f873143e8a8..27a49becca9 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/TcpConnectionRequestDiscoveryMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/TcpConnectionRequestDiscoveryMessage.java
@@ -28,24 +28,20 @@ import org.jetbrains.annotations.Nullable;
 
 /**
  * Message is part of communication via discovery protocol.
- *
+ * <p>
  * It is used when a node (say node A) cannot establish a communication 
connection to other node (node B) in topology
  * due to firewall or network configuration and sends this message requesting 
inverse connection:
  * node B receives request and opens communication connection to node A
  * thus allowing both nodes to communicate to each other.
  */
-public class TcpConnectionRequestDiscoveryMessage implements 
DiscoveryCustomMessage {
-    /** Message id. */
-    @Order(0)
-    IgniteUuid id;
-
+public class TcpConnectionRequestDiscoveryMessage extends 
DiscoveryCustomMessage {
     /** Receiver node id. */
-    @Order(1)
+    @Order(0)
     @GridToStringInclude
     UUID receiverNodeId;
 
     /** Connection index. */
-    @Order(2)
+    @Order(1)
     @GridToStringInclude
     int connIdx;
 
@@ -54,7 +50,8 @@ public class TcpConnectionRequestDiscoveryMessage implements 
DiscoveryCustomMess
      * @param connIdx Connection index.
      */
     public TcpConnectionRequestDiscoveryMessage(UUID receiverNodeId, int 
connIdx) {
-        id = IgniteUuid.randomUuid();
+        super(IgniteUuid.randomUuid());
+
         this.receiverNodeId = receiverNodeId;
         this.connIdx = connIdx;
     }
@@ -64,11 +61,6 @@ public class TcpConnectionRequestDiscoveryMessage implements 
DiscoveryCustomMess
         // No-op.
     }
 
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
-    }
-
     /** */
     public UUID receiverNodeId() {
         return receiverNodeId;
diff --git a/modules/core/src/main/resources/META-INF/classnames.properties 
b/modules/core/src/main/resources/META-INF/classnames.properties
index 977f9ddbf68..370d18525b1 100644
--- a/modules/core/src/main/resources/META-INF/classnames.properties
+++ b/modules/core/src/main/resources/META-INF/classnames.properties
@@ -1295,7 +1295,6 @@ 
org.apache.ignite.internal.processors.cache.persistence.snapshot.IncrementalSnap
 
org.apache.ignite.internal.processors.cache.persistence.snapshot.IncrementalSnapshotMetadata
 
org.apache.ignite.internal.processors.cache.persistence.snapshot.IncrementalSnapshotVerify
 
org.apache.ignite.internal.processors.cache.persistence.snapshot.IncrementalSnapshotVerifyResult
-org.apache.ignite.internal.processors.cache.persistence.snapshot.SnapshotDiscoveryMessage
 
org.apache.ignite.internal.processors.cache.persistence.snapshot.SnapshotFilesFailureMessage
 
org.apache.ignite.internal.processors.cache.persistence.snapshot.SnapshotFilesRequestMessage
 
org.apache.ignite.internal.processors.cache.persistence.snapshot.SnapshotHandlerResult
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteClusterSnapshotSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteClusterSnapshotSelfTest.java
index a3a4a244ad7..ee23e278a7d 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteClusterSnapshotSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteClusterSnapshotSelfTest.java
@@ -196,7 +196,7 @@ public class IgniteClusterSnapshotSelfTest extends 
AbstractSnapshotSelfTest {
 
                 assertNotNull(msg);
 
-                if (msg instanceof SnapshotDiscoveryMessage)
+                if (msg instanceof SnapshotStartDiscoveryMessage)
                     loadLatch.countDown();
             }
         });
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/TestDiscoveryAcknowledgeMessage.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/TestDiscoveryAcknowledgeMessage.java
index 58012184bed..a67feac9c7b 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/TestDiscoveryAcknowledgeMessage.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/TestDiscoveryAcknowledgeMessage.java
@@ -17,26 +17,16 @@
 
 package org.apache.ignite.internal.processors.security;
 
-import org.apache.ignite.internal.Order;
 import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
 import org.apache.ignite.lang.IgniteUuid;
 import org.apache.ignite.plugin.extensions.communication.MessageFactory;
 import org.jetbrains.annotations.Nullable;
 
 /** */
-public class TestDiscoveryAcknowledgeMessage implements DiscoveryCustomMessage 
{
-    /** */
-    @Order(0)
-    IgniteUuid id = IgniteUuid.randomUuid();
-
+public class TestDiscoveryAcknowledgeMessage extends DiscoveryCustomMessage {
     /** Constructor for {@link MessageFactory}. */
     public TestDiscoveryAcknowledgeMessage() {
-        // No-op.
-    }
-
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
+        super(IgniteUuid.randomUuid());
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/TestDiscoveryMessage.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/TestDiscoveryMessage.java
index a1322699ae5..f7fda4035c7 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/TestDiscoveryMessage.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/TestDiscoveryMessage.java
@@ -17,26 +17,16 @@
 
 package org.apache.ignite.internal.processors.security;
 
-import org.apache.ignite.internal.Order;
 import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
 import org.apache.ignite.lang.IgniteUuid;
 import org.apache.ignite.plugin.extensions.communication.MessageFactory;
 import org.jetbrains.annotations.Nullable;
 
 /** */
-public class TestDiscoveryMessage implements DiscoveryCustomMessage {
-    /** */
-    @Order(0)
-    IgniteUuid id = IgniteUuid.randomUuid();
-
+public class TestDiscoveryMessage extends DiscoveryCustomMessage {
     /** Constructor for {@link MessageFactory}. */
     public TestDiscoveryMessage() {
-        // No-op.
-    }
-
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
+        super(IgniteUuid.randomUuid());
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/core/src/test/java/org/apache/ignite/spi/discovery/MessageForServer.java
 
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/MessageForServer.java
index 01d9a62014b..68306d9b66d 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/spi/discovery/MessageForServer.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/MessageForServer.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.spi.discovery;
 
-import org.apache.ignite.internal.Order;
 import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
 import 
org.apache.ignite.internal.managers.discovery.DiscoveryServerOnlyCustomMessage;
 import org.apache.ignite.lang.IgniteUuid;
@@ -25,19 +24,10 @@ import 
org.apache.ignite.plugin.extensions.communication.MessageFactory;
 import org.jetbrains.annotations.Nullable;
 
 /** */
-public class MessageForServer implements DiscoveryServerOnlyCustomMessage {
-    /** */
-    @Order(0)
-    IgniteUuid id = IgniteUuid.randomUuid();
-
+public class MessageForServer extends DiscoveryServerOnlyCustomMessage {
     /** Constructor for {@link MessageFactory}. */
     public MessageForServer() {
-        // No-op.
-    }
-
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
+        super(IgniteUuid.randomUuid());
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/DummyCustomDiscoveryMessage.java
 
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/DummyCustomDiscoveryMessage.java
index c742ab8efbd..028f41ec589 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/DummyCustomDiscoveryMessage.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/DummyCustomDiscoveryMessage.java
@@ -17,26 +17,16 @@
 
 package org.apache.ignite.spi.discovery.tcp;
 
-import org.apache.ignite.internal.Order;
 import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
 import org.apache.ignite.lang.IgniteUuid;
 import org.apache.ignite.plugin.extensions.communication.MessageFactory;
 import org.jetbrains.annotations.Nullable;
 
 /** */
-public class DummyCustomDiscoveryMessage implements DiscoveryCustomMessage {
-    /** */
-    @Order(0)
-    IgniteUuid id = IgniteUuid.randomUuid();
-
+public class DummyCustomDiscoveryMessage extends DiscoveryCustomMessage {
     /** Constructor for {@link MessageFactory}. */
     public DummyCustomDiscoveryMessage() {
-        // No-op.
-    }
-
-    /** {@inheritDoc} */
-    @Override public IgniteUuid id() {
-        return id;
+        super(IgniteUuid.randomUuid());
     }
 
     /** {@inheritDoc} */


Reply via email to