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

ibessonov pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 3043bec6c0 IGNITE-19181 ConfigurationNotificationEvent API modified to 
include both old and new node/name values. (#1883)
3043bec6c0 is described below

commit 3043bec6c010b5ebd897ea2f2346b8c3308f9a00
Author: Ivan Bessonov <[email protected]>
AuthorDate: Mon Apr 3 15:30:37 2023 +0300

    IGNITE-19181 ConfigurationNotificationEvent API modified to include both 
old and new node/name values. (#1883)
---
 .../ignite/configuration/NamedListChange.java      |   2 +-
 .../ConfigurationNamedListListener.java            |   8 +-
 .../ConfigurationNotificationEvent.java            |  36 +-
 .../configuration/DynamicConfiguration.java        |  17 -
 .../asm/ConfigurationImplAsmGenerator.java         |  19 +-
 .../notifications/ConfigurationContainer.java      |  86 +++--
 .../ConfigurationNotificationContext.java          |  21 +-
 .../ConfigurationNotificationEventImpl.java        |  39 +--
 .../notifications/ConfigurationNotifier.java       |  55 ++-
 .../ConfigurationAnyListenerTest.java              | 162 ++++-----
 .../notifications/ConfigurationListenerTest.java   | 373 ++++++++++-----------
 .../ConfigurationListenerTestUtils.java            |   2 +-
 .../testframework/ConfigurationExtension.java      |   2 +
 .../distributionzones/DistributionZoneManager.java |   8 +-
 .../apache/ignite/internal/index/IndexManager.java |   2 -
 .../placementdriver/AssignmentsTracker.java        |   7 +-
 .../StubAuthenticationViewEvent.java               |  17 +-
 .../ignite/internal/schema/SchemaManager.java      |   2 +-
 .../PersistentPageMemoryStorageEngine.java         |  15 +-
 .../VolatilePageMemoryStorageEngine.java           |  15 +-
 .../storage/rocksdb/RocksDbStorageEngine.java      |  12 +-
 .../internal/table/distributed/TableManager.java   |  13 +-
 22 files changed, 446 insertions(+), 467 deletions(-)

diff --git 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/NamedListChange.java
 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/NamedListChange.java
index 912a56572a..1c3e819be7 100644
--- 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/NamedListChange.java
+++ 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/NamedListChange.java
@@ -103,7 +103,7 @@ public interface NamedListChange<VIEWT, CHANGET extends 
VIEWT> extends NamedList
      * Element with key {@code oldKey} must exist and key {@code newKey} must 
not.
      * Error will occur if {@code newKey} has just been deleted on the same
      * {@link NamedListChange} instance (to distinguish between
-     * {@link ConfigurationNamedListListener#onRename(String, String, 
ConfigurationNotificationEvent)} and
+     * {@link 
ConfigurationNamedListListener#onRename(ConfigurationNotificationEvent)} and
      * {@link 
ConfigurationNamedListListener#onUpdate(ConfigurationNotificationEvent)} on 
{@code newKey}).
      *
      * @param oldKey Key for the value to be updated.
diff --git 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/notifications/ConfigurationNamedListListener.java
 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/notifications/ConfigurationNamedListListener.java
index 3d9986f5ad..667bbbd51f 100644
--- 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/notifications/ConfigurationNamedListListener.java
+++ 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/notifications/ConfigurationNamedListListener.java
@@ -40,14 +40,12 @@ public interface ConfigurationNamedListListener<VIEWT> 
extends ConfigurationList
     /**
      * Called when a named list element is renamed. Semantically equivalent to 
{@link #onUpdate(ConfigurationNotificationEvent)} with the
      * difference that the content of the element might have not been changed. 
No separate {@link #onUpdate(ConfigurationNotificationEvent)}
-     * call is performed when {@link #onRename(String, String, 
ConfigurationNotificationEvent)} is already invoked.
+     * call is performed when {@link 
#onRename(ConfigurationNotificationEvent)} is already invoked.
      *
-     * @param oldName Name, previously assigned to the element.
-     * @param newName New name of the element.
-     * @param ctx     Notification context.
+     * @param ctx Notification context.
      * @return Future that signifies the end of the listener execution.
      */
-    default CompletableFuture<?> onRename(String oldName, String newName, 
ConfigurationNotificationEvent<VIEWT> ctx) {
+    default CompletableFuture<?> 
onRename(ConfigurationNotificationEvent<VIEWT> ctx) {
         return completedFuture(null);
     }
 
diff --git 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/notifications/ConfigurationNotificationEvent.java
 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/notifications/ConfigurationNotificationEvent.java
index 3d61d65c39..d5dca3f68f 100644
--- 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/notifications/ConfigurationNotificationEvent.java
+++ 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/notifications/ConfigurationNotificationEvent.java
@@ -35,11 +35,31 @@ public interface ConfigurationNotificationEvent<VIEWT> {
      */
     @Nullable VIEWT oldValue();
 
+    /**
+     * Returns old value of the parent (any from the root) or current 
configuration.
+     *
+     * <p>For example, if we changed the child configuration, then we can get 
both the parent and the current child configuration.
+     *
+     * @param viewClass Configuration interface, for example {@code 
RootView.class}.
+     * @param <T> Configuration type.
+     */
+    @Nullable <T> T oldValue(Class<T> viewClass);
+
     /**
      * Returns updated value of the configuration.
      */
     @Nullable VIEWT newValue();
 
+    /**
+     * Returns new value of the parent (any from the root) or current 
configuration.
+     *
+     * <p>For example, if we changed the child configuration, then we can get 
both the parent and the current child configuration.
+     *
+     * @param viewClass Configuration interface, for example {@code 
RootView.class}.
+     * @param <T> Configuration type.
+     */
+    @Nullable <T> T newValue(Class<T> viewClass);
+
     /**
      * Returns monotonously increasing counter, linked to the specific storage 
for current configuration values. Gives a unique change
      * identifier inside a specific configuration storage.
@@ -49,22 +69,22 @@ public interface ConfigurationNotificationEvent<VIEWT> {
     long storageRevision();
 
     /**
-     * Returns the parent (any from the root) or current configuration.
+     * Returns old value of the key of a named list item for the parent (any 
from the root) or current configuration.
      *
-     * <p>For example, if we changed the child configuration, then we can get 
both the parent and the current child configuration.
+     * <p>For example, if a column of a table has changed, then we can get the 
name of the table and columns for which the changes have
+     * occurred.
      *
-     * @param configClass Configuration interface, for example {@code 
RootConfiguration}.
-     * @param <T> Configuration type.
+     * @param viewClass Configuration interface, for example {@code 
TableView.class}.
      */
-    @Nullable <T extends ConfigurationProperty> T config(Class<T> configClass);
+    @Nullable String oldName(Class<?> viewClass);
 
     /**
-     * Returns the key of a named list item for the parent (any from the root) 
or current configuration.
+     * Returns new value of the key of a named list item for the parent (any 
from the root) or current configuration.
      *
      * <p>For example, if a column of a table has changed, then we can get the 
name of the table and columns for which the changes have
      * occurred.
      *
-     * @param configClass Configuration interface, for example {@code 
TableConfiguration}.
+     * @param viewClass Configuration interface, for example {@code 
TableView.class}.
      */
-    @Nullable String name(Class<? extends ConfigurationProperty> configClass);
+    @Nullable String newName(Class<?> viewClass);
 }
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/DynamicConfiguration.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/DynamicConfiguration.java
index a94ecf5132..fc56103149 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/DynamicConfiguration.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/DynamicConfiguration.java
@@ -47,9 +47,6 @@ public abstract class DynamicConfiguration<VIEWT, CHANGET 
extends VIEWT> extends
     /** Configuration members (leaves and nodes). */
     protected volatile Map<String, ConfigurationProperty<?>> members = new 
LinkedHashMap<>();
 
-    /** Removed from the named list. */
-    protected boolean removedFromNamedList;
-
     /**
      * Constructor.
      *
@@ -265,18 +262,4 @@ public abstract class DynamicConfiguration<VIEWT, CHANGET 
extends VIEWT> extends
     ) {
         members.remove(member.key());
     }
-
-    /**
-     * Mark that the configuration has been removed from the named list.
-     */
-    public void removedFromNamedList() {
-        removedFromNamedList = true;
-    }
-
-    /**
-     * Return {@code true} if the configuration has been removed from the 
named list.
-     */
-    public boolean isRemovedFromNamedList() {
-        return removedFromNamedList;
-    }
 }
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/asm/ConfigurationImplAsmGenerator.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/asm/ConfigurationImplAsmGenerator.java
index 6f982dfe69..3dc8e89d3c 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/asm/ConfigurationImplAsmGenerator.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/asm/ConfigurationImplAsmGenerator.java
@@ -29,7 +29,6 @@ import static 
com.facebook.presto.bytecode.expression.BytecodeExpressions.consta
 import static 
com.facebook.presto.bytecode.expression.BytecodeExpressions.constantClass;
 import static 
com.facebook.presto.bytecode.expression.BytecodeExpressions.constantInt;
 import static 
com.facebook.presto.bytecode.expression.BytecodeExpressions.constantString;
-import static 
com.facebook.presto.bytecode.expression.BytecodeExpressions.inlineIf;
 import static 
com.facebook.presto.bytecode.expression.BytecodeExpressions.invokeDynamic;
 import static 
com.facebook.presto.bytecode.expression.BytecodeExpressions.newArray;
 import static 
com.facebook.presto.bytecode.expression.BytecodeExpressions.newInstance;
@@ -115,12 +114,6 @@ class ConfigurationImplAsmGenerator extends 
AbstractAsmGenerator {
     /** {@link DynamicConfiguration#specificConfigTree} method. */
     private static final Method SPECIFIC_CONFIG_TREE_MTD;
 
-    /** {@code ConfigurationNode#currentValue}. */
-    private static final Method CURRENT_VALUE_MTD;
-
-    /** {@link DynamicConfiguration#isRemovedFromNamedList}. */
-    private static final Method IS_REMOVED_FROM_NAMED_LIST_MTD;
-
     /** Field name for method {@link 
DynamicConfiguration#internalConfigTypes}. */
     private static final String INTERNAL_CONFIG_TYPES_FIELD_NAME = 
"_internalConfigTypes";
 
@@ -146,10 +139,6 @@ class ConfigurationImplAsmGenerator extends 
AbstractAsmGenerator {
             REMOVE_MEMBER_MTD = 
DynamicConfiguration.class.getDeclaredMethod("removeMember", Map.class, 
ConfigurationProperty.class);
 
             SPECIFIC_CONFIG_TREE_MTD = 
DynamicConfiguration.class.getDeclaredMethod("specificConfigTree");
-
-            CURRENT_VALUE_MTD = 
ConfigurationNode.class.getDeclaredMethod("currentValue");
-
-            IS_REMOVED_FROM_NAMED_LIST_MTD = 
DynamicConfiguration.class.getDeclaredMethod("isRemovedFromNamedList");
         } catch (NoSuchMethodException nsme) {
             throw new ExceptionInInitializerError(nsme);
         }
@@ -687,15 +676,11 @@ class ConfigurationImplAsmGenerator extends 
AbstractAsmGenerator {
         // this;
         Variable thisVar = polymorphicInstanceConfigTypeMtd.getThis();
 
-        // tmpObj = this.isRemovedFromNamedList() ? this.currentValue() : 
this.refreshValue();
+        // tmpObj = this.refreshValue();
         // tmpStr = ((ConfigNode) tmpObj).typeId;
         // switch(tmpStr) ...
         polymorphicInstanceConfigTypeMtd.getBody()
-                .append(tmpObjVar.set(inlineIf(
-                        thisVar.invoke(IS_REMOVED_FROM_NAMED_LIST_MTD),
-                        thisVar.invoke(CURRENT_VALUE_MTD),
-                        thisVar.invoke(REFRESH_VALUE_MTD))
-                ))
+                .append(tmpObjVar.set(thisVar.invoke(REFRESH_VALUE_MTD)))
                 
.append(tmpStrVar.set(tmpObjVar.cast(nodeType).getField(polymorphicTypeIdFieldDef.getName(),
 String.class)))
                 .append(switchBuilder.build())
                 .ret();
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/notifications/ConfigurationContainer.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/notifications/ConfigurationContainer.java
index c688a64138..3d8a58c688 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/notifications/ConfigurationContainer.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/notifications/ConfigurationContainer.java
@@ -17,60 +17,92 @@
 
 package org.apache.ignite.internal.configuration.notifications;
 
-import org.apache.ignite.configuration.ConfigurationProperty;
 import 
org.apache.ignite.configuration.notifications.ConfigurationNotificationEvent;
-import org.apache.ignite.internal.configuration.DynamicConfiguration;
 import org.apache.ignite.internal.configuration.tree.InnerNode;
 import org.jetbrains.annotations.Nullable;
 
 /**
- * Configuration container for {@link ConfigurationNotificationEvent}.
+ * Configuration container for {@link ConfigurationNotificationEvent}. Stores 
old and new nodes for the event, as well as their names.
+ * Represents a stack, where current pair of nodes is at the top, and roots 
pair is at the bottom.
  */
 class ConfigurationContainer {
-    /**
-     * Configuration.
-     *
-     * <p>For {@link ConfigurationNotificationEvent#config} use {@link 
this#specificConfig()}.
-     */
-    final DynamicConfiguration<InnerNode, ?> config;
+    /** Parent container. */
+    public final @Nullable ConfigurationContainer prev;
 
-    /** Key in named list, for {@link ConfigurationNotificationEvent#name}. */
+    /** {@link InnerNode#specificNode()} for the old value. */
     @Nullable
-    final String name;
+    private final Object oldNode;
 
-    /** Previous container. */
+    /** {@link InnerNode#specificNode()} for the new value. */
     @Nullable
-    final ConfigurationContainer prev;
+    private final Object newNode;
+
+    /** Old name, if the node is a part of named list. */
+    private final String oldName;
+
+    /** New name, if the node is a part of named list. */
+    private final String newName;
 
     /**
      * Constructor.
      *
-     * @param config Configuration.
-     * @param name Key in named list.
+     * @param prev Parent container.
+     * @param oldNode Old inner node value.
+     * @param newNode New inner node value.
+     * @param oldName Name of the old value, if part of the named list.
+     * @param newName Name of the new value, if part of the named list.
      */
     ConfigurationContainer(
-            DynamicConfiguration<InnerNode, ?> config,
-            @Nullable String name,
-            @Nullable ConfigurationContainer prev
+            @Nullable ConfigurationContainer prev,
+            @Nullable InnerNode oldNode,
+            @Nullable InnerNode newNode,
+            @Nullable String oldName,
+            @Nullable String newName
     ) {
-        this.config = config;
-        this.name = name;
         this.prev = prev;
+        this.oldNode = oldNode == null ? null : oldNode.specificNode();
+        this.newNode = newNode == null ? null : newNode.specificNode();
+        this.oldName = oldName;
+        this.newName = newName;
     }
 
     /**
-     * Returns the configuration for {@link 
ConfigurationNotificationEvent#config}.
+     * Finds a node value that corresponds to a given {@code View} class.
+     *
+     * @param clazz Class instance of the {@code *View} type.
+     * @param old Whether an old or a new value is asked.
      */
-    @Nullable ConfigurationProperty<InnerNode> specificConfig() {
-        return config.isRemovedFromNamedList() ? null : 
config.specificConfigTree();
+    public @Nullable <T> T find(Class<T> clazz, boolean old) {
+        Object specificNode = node(old);
+
+        if (clazz.isInstance(specificNode)) {
+            return (T) specificNode;
+        }
+
+        return prev == null ? null : prev.find(clazz, old);
     }
 
     /**
-     * Returns the configuration class.
+     * Finds a name of the value that corresponds to a given {@code View} 
class.
+     *
+     * @param clazz Class instance of the {@code *View} type.
+     * @param old Whether an old or a new value is asked.
      */
-    Class<?> configClass() {
-        Class<?> polymorphicInstanceConfigType = 
config.polymorphicInstanceConfigType();
+    public @Nullable String name(Class<?> clazz, boolean old) {
+        Object specificNode = node(old);
+
+        if (clazz.isInstance(specificNode)) {
+            return name(old);
+        }
+
+        return prev == null ? null : prev.name(clazz, old);
+    }
+
+    private @Nullable String name(boolean old) {
+        return old ? oldName : newName;
+    }
 
-        return polymorphicInstanceConfigType != null ? 
polymorphicInstanceConfigType : config.getClass();
+    private @Nullable Object node(boolean old) {
+        return old ? oldNode : newNode;
     }
 }
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/notifications/ConfigurationNotificationContext.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/notifications/ConfigurationNotificationContext.java
index c9ed0cb1e5..ae5858d930 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/notifications/ConfigurationNotificationContext.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/notifications/ConfigurationNotificationContext.java
@@ -21,7 +21,6 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.concurrent.CompletableFuture;
 import 
org.apache.ignite.configuration.notifications.ConfigurationNotificationEvent;
-import org.apache.ignite.internal.configuration.DynamicConfiguration;
 import org.apache.ignite.internal.configuration.tree.InnerNode;
 import org.jetbrains.annotations.Nullable;
 
@@ -56,21 +55,25 @@ class ConfigurationNotificationContext {
     /**
      * Adds {@link ConfigurationContainer container}.
      *
-     * @param config Configuration.
-     * @param name Key in named list.
+     * @param oldNode Old node value.
+     * @param newNode New node value.
+     * @param oldName Old name of the node, only applicable to named list 
elements.
+     * @param newName New name of the node, only applicable to named list 
elements.
      */
-    void addContainer(DynamicConfiguration<InnerNode, ?> config, @Nullable 
String name) {
-        tailContainers = new ConfigurationContainer(config, name, 
tailContainers);
+    void addContainer(
+            @Nullable InnerNode oldNode,
+            @Nullable InnerNode newNode,
+            @Nullable String oldName,
+            @Nullable String newName
+    ) {
+        tailContainers = new ConfigurationContainer(tailContainers, oldNode, 
newNode, oldName, newName);
     }
 
     /**
      * Removes {@link ConfigurationContainer container}.
-     *
-     * @param config Configuration.
      */
-    void removeContainer(DynamicConfiguration<InnerNode, ?> config) {
+    void removeContainer() {
         assert tailContainers != null;
-        assert tailContainers.config == config;
 
         tailContainers = tailContainers.prev;
     }
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/notifications/ConfigurationNotificationEventImpl.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/notifications/ConfigurationNotificationEventImpl.java
index 91e8dc99f5..6ebc14e7cb 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/notifications/ConfigurationNotificationEventImpl.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/notifications/ConfigurationNotificationEventImpl.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.configuration.notifications;
 
-import org.apache.ignite.configuration.ConfigurationProperty;
 import 
org.apache.ignite.configuration.notifications.ConfigurationNotificationEvent;
 import org.jetbrains.annotations.Nullable;
 
@@ -67,45 +66,35 @@ class ConfigurationNotificationEventImpl<VIEWT> implements 
ConfigurationNotifica
         return oldValue;
     }
 
+    @Override
+    public <T> @Nullable T oldValue(Class<T> viewClass) {
+        return tail.find(viewClass, true);
+    }
+
     /** {@inheritDoc} */
     @Override
     public @Nullable VIEWT newValue() {
         return newValue;
     }
 
-    /** {@inheritDoc} */
     @Override
-    public long storageRevision() {
-        return storageRevision;
+    public <T> @Nullable T newValue(Class<T> viewClass) {
+        return tail.find(viewClass, false);
     }
 
     /** {@inheritDoc} */
     @Override
-    public <T extends ConfigurationProperty> @Nullable T config(Class<T> 
configClass) {
-        ConfigurationContainer container = findContainer(configClass);
-
-        return container == null ? null : (T) container.specificConfig();
+    public long storageRevision() {
+        return storageRevision;
     }
 
-    /** {@inheritDoc} */
     @Override
-    public @Nullable String name(Class<? extends ConfigurationProperty> 
configClass) {
-        ConfigurationContainer container = findContainer(configClass);
-
-        return container == null ? null : container.name;
+    public @Nullable String oldName(Class<?> viewClass) {
+        return tail.name(viewClass, true);
     }
 
-    private @Nullable ConfigurationContainer findContainer(Class<?> 
configClass) {
-        ConfigurationContainer curr = tail;
-
-        while (curr != null) {
-            if (configClass.isAssignableFrom(curr.configClass())) {
-                return curr;
-            } else {
-                curr = curr.prev;
-            }
-        }
-
-        return null;
+    @Override
+    public @Nullable String newName(Class<?> viewClass) {
+        return tail.name(viewClass, false);
     }
 }
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/notifications/ConfigurationNotifier.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/notifications/ConfigurationNotifier.java
index 2d255c914e..fe17e37fc0 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/notifications/ConfigurationNotifier.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/notifications/ConfigurationNotifier.java
@@ -80,19 +80,19 @@ public class ConfigurationNotifier {
             return List.of();
         }
 
-        ConfigurationNotificationContext notificationCtx = new 
ConfigurationNotificationContext(storageRevision, notificationNumber);
+        ConfigurationNotificationContext ctx = new 
ConfigurationNotificationContext(storageRevision, notificationNumber);
 
-        notificationCtx.addContainer(config, null);
+        ctx.addContainer(oldInnerNode, newInnerNode, null, null);
 
         if (oldInnerNode == null) {
-            notifyListeners(newInnerNode, config, List.of(), notificationCtx);
+            notifyListeners(newInnerNode, config, List.of(), ctx);
         } else {
-            notifyListeners(oldInnerNode, newInnerNode, config, List.of(), 
notificationCtx);
+            notifyListeners(oldInnerNode, newInnerNode, config, List.of(), 
ctx);
         }
 
-        notificationCtx.removeContainer(config);
+        ctx.removeContainer();
 
-        return notificationCtx.futures;
+        return ctx.futures;
     }
 
     private static void notifyListeners(
@@ -152,7 +152,7 @@ public class ConfigurationNotifier {
 
                 DynamicConfiguration<InnerNode, ?> newConfig = 
dynamicConfig(config, key);
 
-                ctx.addContainer(newConfig, null);
+                ctx.addContainer(oldNode, newNode, null, null);
 
                 notifyListeners(
                         oldNode,
@@ -162,7 +162,7 @@ public class ConfigurationNotifier {
                         ctx
                 );
 
-                ctx.removeContainer(newConfig);
+                ctx.removeContainer();
 
                 return null;
             }
@@ -198,10 +198,10 @@ public class ConfigurationNotifier {
 
                         touch(newNodeCfg);
 
-                        ctx.addContainer(newNodeCfg, name);
-
                         InnerNode newVal = newNamedList.getInnerNode(name);
 
+                        ctx.addContainer(null, newVal, null, name);
+
                         notifyPublicListeners(
                                 extendedListeners(namedDynamicConfig(config, 
key), ctx.notificationNum),
                                 concat(viewReadOnly(
@@ -228,19 +228,17 @@ public class ConfigurationNotifier {
                                 ctx
                         );
 
-                        ctx.removeContainer(newNodeCfg);
+                        ctx.removeContainer();
                     }
 
                     for (String name : namedListChanges.deleted) {
                         DynamicConfiguration<InnerNode, ?> delNodeCfg =
                                 (DynamicConfiguration<InnerNode, ?>) 
namedListCfgMembers.get(name);
 
-                        delNodeCfg.removedFromNamedList();
-
-                        ctx.addContainer(delNodeCfg, name);
-
                         InnerNode oldVal = oldNamedList.getInnerNode(name);
 
+                        ctx.addContainer(oldVal, null, name, null);
+
                         notifyPublicListeners(
                                 extendedListeners(namedDynamicConfig(config, 
key), ctx.notificationNum),
                                 concat(viewReadOnly(
@@ -267,18 +265,15 @@ public class ConfigurationNotifier {
                                 ConfigurationListener::onUpdate
                         );
 
-                        ctx.removeContainer(delNodeCfg);
+                        ctx.removeContainer();
                     }
 
                     for (Map.Entry<String, String> entry : 
namedListChanges.renamed.entrySet()) {
-                        DynamicConfiguration<InnerNode, ?> renNodeCfg =
-                                (DynamicConfiguration<InnerNode, ?>) 
namedListCfg.members().get(entry.getValue());
-
-                        ctx.addContainer(renNodeCfg, entry.getValue());
-
                         InnerNode oldVal = 
oldNamedList.getInnerNode(entry.getKey());
                         InnerNode newVal = 
newNamedList.getInnerNode(entry.getValue());
 
+                        ctx.addContainer(oldVal, newVal, entry.getKey(), 
entry.getValue());
+
                         notifyPublicListeners(
                                 extendedListeners(namedDynamicConfig(config, 
key), ctx.notificationNum),
                                 concat(viewReadOnly(
@@ -288,10 +283,10 @@ public class ConfigurationNotifier {
                                 oldVal.specificNode(),
                                 newVal.specificNode(),
                                 ctx,
-                                (listener, event) -> 
listener.onRename(entry.getKey(), entry.getValue(), event)
+                                (listener, event) -> listener.onRename(event)
                         );
 
-                        ctx.removeContainer(renNodeCfg);
+                        ctx.removeContainer();
                     }
 
                     for (String name : namedListChanges.updated) {
@@ -305,7 +300,7 @@ public class ConfigurationNotifier {
                         DynamicConfiguration<InnerNode, ?> updNodeCfg =
                                 (DynamicConfiguration<InnerNode, ?>) 
namedListCfgMembers.get(name);
 
-                        ctx.addContainer(updNodeCfg, name);
+                        ctx.addContainer(oldVal, newVal, name, name);
 
                         notifyPublicListeners(
                                 extendedListeners(namedDynamicConfig(config, 
key), ctx.notificationNum),
@@ -334,7 +329,7 @@ public class ConfigurationNotifier {
                                 ctx
                         );
 
-                        ctx.removeContainer(updNodeCfg);
+                        ctx.removeContainer();
                     }
                 }
 
@@ -391,7 +386,7 @@ public class ConfigurationNotifier {
             public Void visitInnerNode(String key, InnerNode nestedInnerNode) {
                 DynamicConfiguration<InnerNode, ?> nestedNodeConfig = 
dynamicConfig(config, key);
 
-                ctx.addContainer(nestedNodeConfig, null);
+                ctx.addContainer(null, nestedInnerNode, null, null);
 
                 notifyListeners(
                         nestedInnerNode,
@@ -400,7 +395,7 @@ public class ConfigurationNotifier {
                         ctx
                 );
 
-                ctx.removeContainer(nestedNodeConfig);
+                ctx.removeContainer();
 
                 return null;
             }
@@ -434,10 +429,10 @@ public class ConfigurationNotifier {
                     DynamicConfiguration<InnerNode, ?> namedNodeConfig =
                             (DynamicConfiguration<InnerNode, ?>) 
namedListCfg.getConfig(name);
 
-                    ctx.addContainer(namedNodeConfig, name);
-
                     InnerNode namedInnerNode = newNamedList.getInnerNode(name);
 
+                    ctx.addContainer(null, namedInnerNode, null, name);
+
                     notifyPublicListeners(
                             extendedListeners(namedDynamicConfig(config, key), 
ctx.notificationNum),
                             concat(viewReadOnly(
@@ -464,7 +459,7 @@ public class ConfigurationNotifier {
                             ctx
                     );
 
-                    ctx.removeContainer(namedNodeConfig);
+                    ctx.removeContainer();
                 }
 
                 return null;
diff --git 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationAnyListenerTest.java
 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationAnyListenerTest.java
index 259f89ad27..ddcc821e1f 100644
--- 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationAnyListenerTest.java
+++ 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationAnyListenerTest.java
@@ -39,6 +39,7 @@ import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Consumer;
 import org.apache.ignite.configuration.ConfigurationListenOnlyException;
 import org.apache.ignite.configuration.NamedConfigurationTree;
 import org.apache.ignite.configuration.annotation.Config;
@@ -51,6 +52,7 @@ import 
org.apache.ignite.configuration.annotation.PolymorphicId;
 import org.apache.ignite.configuration.annotation.Value;
 import org.apache.ignite.configuration.notifications.ConfigurationListener;
 import 
org.apache.ignite.configuration.notifications.ConfigurationNamedListListener;
+import 
org.apache.ignite.configuration.notifications.ConfigurationNotificationEvent;
 import org.apache.ignite.internal.configuration.ConfigurationRegistry;
 import 
org.apache.ignite.internal.configuration.storage.TestConfigurationStorage;
 import org.junit.jupiter.api.AfterEach;
@@ -539,27 +541,22 @@ public class ConfigurationAnyListenerTest {
         String key1 = UUID.randomUUID().toString();
 
         rootConfig.elements().any().listen(configListener(ctx -> {
-            assertNotNull(ctx.config(FirstSubConfiguration.class));
-            assertEquals(key0, ctx.name(FirstSubConfiguration.class));
+            assertNotNull(ctx.newValue(FirstSubView.class));
+            assertEquals(key0, ctx.newName(FirstSubView.class));
         }));
 
         rootConfig.elements().change(c -> c.create(key0, 
doNothingConsumer())).get(1, SECONDS);
 
-        
rootConfig.elements().any().elements2().listenElements(configNamedListenerOnCreate(ctx
 -> {
-            assertNotNull(ctx.config(FirstSubConfiguration.class));
-            assertEquals(key0, ctx.name(FirstSubConfiguration.class));
+        Consumer<ConfigurationNotificationEvent<SecondSubView>> assertions = 
ctx -> {
+            assertNotNull(ctx.newValue(FirstSubView.class));
+            assertEquals(key0, ctx.newName(FirstSubView.class));
 
-            assertNotNull(ctx.config(SecondSubConfiguration.class));
-            assertEquals(key1, ctx.name(SecondSubConfiguration.class));
-        }));
-
-        
rootConfig.elements().any().elements2().any().listen(configListener(ctx -> {
-            assertNotNull(ctx.config(FirstSubConfiguration.class));
-            assertEquals(key0, ctx.name(FirstSubConfiguration.class));
+            assertNotNull(ctx.newValue(SecondSubView.class));
+            assertEquals(key1, ctx.newName(SecondSubView.class));
+        };
 
-            assertNotNull(ctx.config(SecondSubConfiguration.class));
-            assertEquals(key1, ctx.name(SecondSubConfiguration.class));
-        }));
+        
rootConfig.elements().any().elements2().listenElements(configNamedListenerOnCreate(assertions));
+        
rootConfig.elements().any().elements2().any().listen(configListener(assertions));
 
         rootConfig.elements().get(key0).elements2().change(c -> c.create(key1, 
doNothingConsumer())).get(1, SECONDS);
     }
@@ -571,29 +568,25 @@ public class ConfigurationAnyListenerTest {
         String newKey1 = UUID.randomUUID().toString();
 
         rootConfig.elements().any().listen(configListener(ctx -> {
-            assertNotNull(ctx.config(FirstSubConfiguration.class));
-            assertEquals(key0, ctx.name(FirstSubConfiguration.class));
+            assertNotNull(ctx.newValue(FirstSubView.class));
+            assertEquals(key0, ctx.newName(FirstSubView.class));
         }));
 
         rootConfig.elements()
                 .change(c -> c.create(key0, c1 -> c1.changeElements2(c2 -> 
c2.create(oldKey1, doNothingConsumer()))))
                 .get(1, SECONDS);
 
-        
rootConfig.elements().get(key0).elements2().listenElements(configNamedListenerOnRename(ctx
 -> {
-            assertNotNull(ctx.config(FirstSubConfiguration.class));
-            assertEquals(key0, ctx.name(FirstSubConfiguration.class));
+        Consumer<ConfigurationNotificationEvent<SecondSubView>> assertions = 
ctx -> {
+            assertNotNull(ctx.newValue(FirstSubView.class));
+            assertEquals(key0, ctx.newName(FirstSubView.class));
 
-            assertNotNull(ctx.config(SecondSubConfiguration.class));
-            assertEquals(newKey1, ctx.name(SecondSubConfiguration.class));
-        }));
+            assertNotNull(ctx.newValue(SecondSubView.class));
+            assertEquals(oldKey1, ctx.oldName(SecondSubView.class));
+            assertEquals(newKey1, ctx.newName(SecondSubView.class));
+        };
 
-        
rootConfig.elements().any().elements2().listenElements(configNamedListenerOnRename(ctx
 -> {
-            assertNotNull(ctx.config(FirstSubConfiguration.class));
-            assertEquals(key0, ctx.name(FirstSubConfiguration.class));
-
-            assertNotNull(ctx.config(SecondSubConfiguration.class));
-            assertEquals(newKey1, ctx.name(SecondSubConfiguration.class));
-        }));
+        
rootConfig.elements().get(key0).elements2().listenElements(configNamedListenerOnRename(assertions));
+        
rootConfig.elements().any().elements2().listenElements(configNamedListenerOnRename(assertions));
 
         rootConfig.elements().get(key0).elements2().change(c -> 
c.rename(oldKey1, newKey1)).get(1, SECONDS);
     }
@@ -604,45 +597,28 @@ public class ConfigurationAnyListenerTest {
         String key1 = UUID.randomUUID().toString();
 
         rootConfig.elements().any().listen(configListener(ctx -> {
-            assertNotNull(ctx.config(FirstSubConfiguration.class));
-            assertEquals(key0, ctx.name(FirstSubConfiguration.class));
+            assertNotNull(ctx.newValue(FirstSubView.class));
+            assertEquals(key0, ctx.newName(FirstSubView.class));
         }));
 
         rootConfig.elements()
                 .change(c -> c.create(key0, c1 -> c1.changeElements2(c2 -> 
c2.create(key1, doNothingConsumer()))))
                 .get(1, SECONDS);
 
-        
rootConfig.elements().any().elements2().listenElements(configNamedListenerOnDelete(ctx
 -> {
-            assertNotNull(ctx.config(FirstSubConfiguration.class));
-            assertEquals(key0, ctx.name(FirstSubConfiguration.class));
-
-            assertNull(ctx.config(SecondSubConfiguration.class));
-            assertEquals(key1, ctx.name(SecondSubConfiguration.class));
-        }));
-
-        
rootConfig.elements().get(key0).elements2().listenElements(configNamedListenerOnDelete(ctx
 -> {
-            assertNotNull(ctx.config(FirstSubConfiguration.class));
-            assertEquals(key0, ctx.name(FirstSubConfiguration.class));
+        Consumer<ConfigurationNotificationEvent<SecondSubView>> assertions = 
ctx -> {
+            assertNotNull(ctx.newValue(FirstSubView.class));
+            assertEquals(key0, ctx.newName(FirstSubView.class));
 
-            assertNull(ctx.config(SecondSubConfiguration.class));
-            assertEquals(key1, ctx.name(SecondSubConfiguration.class));
-        }));
+            assertNotNull(ctx.oldValue(SecondSubView.class));
+            assertNull(ctx.newValue(SecondSubView.class));
+            assertEquals(key1, ctx.oldName(SecondSubView.class));
+            assertNull(ctx.newName(SecondSubView.class));
+        };
 
-        
rootConfig.elements().any().elements2().any().listen(configListener(ctx -> {
-            assertNotNull(ctx.config(FirstSubConfiguration.class));
-            assertEquals(key0, ctx.name(FirstSubConfiguration.class));
-
-            assertNull(ctx.config(SecondSubConfiguration.class));
-            assertEquals(key1, ctx.name(SecondSubConfiguration.class));
-        }));
-
-        
rootConfig.elements().get(key0).elements2().any().listen(configListener(ctx -> {
-            assertNotNull(ctx.config(FirstSubConfiguration.class));
-            assertEquals(key0, ctx.name(FirstSubConfiguration.class));
-
-            assertNull(ctx.config(SecondSubConfiguration.class));
-            assertEquals(key1, ctx.name(SecondSubConfiguration.class));
-        }));
+        
rootConfig.elements().any().elements2().listenElements(configNamedListenerOnDelete(assertions));
+        
rootConfig.elements().get(key0).elements2().listenElements(configNamedListenerOnDelete(assertions));
+        
rootConfig.elements().any().elements2().any().listen(configListener(assertions));
+        
rootConfig.elements().get(key0).elements2().any().listen(configListener(assertions));
 
         rootConfig.elements().get(key0).elements2().change(c -> 
c.delete(key1)).get(1, SECONDS);
     }
@@ -657,41 +633,21 @@ public class ConfigurationAnyListenerTest {
                 .change(c -> c.create(key0, c1 -> c1.changeElements2(c2 -> 
c2.create(key1, doNothingConsumer()))))
                 .get(1, SECONDS);
 
-        
rootConfig.elements().any().elements2().listenElements(configNamedListenerOnUpdate(ctx
 -> {
-            assertNotNull(ctx.config(FirstSubConfiguration.class));
-            assertEquals(key0, ctx.name(FirstSubConfiguration.class));
+        Consumer<ConfigurationNotificationEvent<SecondSubView>> assertions = 
ctx -> {
+            assertNotNull(ctx.newValue(FirstSubView.class));
+            assertEquals(key0, ctx.newName(FirstSubView.class));
 
-            SecondSubConfiguration second = 
ctx.config(SecondSubConfiguration.class);
+            SecondSubView second = ctx.newValue(SecondSubView.class);
 
             assertNotNull(second);
-            assertEquals(key1, ctx.name(SecondSubConfiguration.class));
-
-            assertEquals(newVal, second.intVal().value());
-        }));
-
-        
rootConfig.elements().any().elements2().any().listen(configListener(ctx -> {
-            assertNotNull(ctx.config(FirstSubConfiguration.class));
-            assertEquals(key0, ctx.name(FirstSubConfiguration.class));
+            assertEquals(key1, ctx.newName(SecondSubView.class));
 
-            SecondSubConfiguration second = 
ctx.config(SecondSubConfiguration.class);
+            assertEquals(newVal, second.intVal());
+        };
 
-            assertNotNull(second);
-            assertEquals(key1, ctx.name(SecondSubConfiguration.class));
-
-            assertEquals(newVal, second.intVal().value());
-        }));
-
-        
rootConfig.elements().get(key0).elements2().any().listen(configListener(ctx -> {
-            assertNotNull(ctx.config(FirstSubConfiguration.class));
-            assertEquals(key0, ctx.name(FirstSubConfiguration.class));
-
-            SecondSubConfiguration second = 
ctx.config(SecondSubConfiguration.class);
-
-            assertNotNull(second);
-            assertEquals(key1, ctx.name(SecondSubConfiguration.class));
-
-            assertEquals(newVal, second.intVal().value());
-        }));
+        
rootConfig.elements().any().elements2().listenElements(configNamedListenerOnUpdate(assertions));
+        
rootConfig.elements().any().elements2().any().listen(configListener(assertions));
+        
rootConfig.elements().get(key0).elements2().any().listen(configListener(assertions));
 
         
rootConfig.elements().get(key0).elements2().get(key1).intVal().update(newVal).get(1,
 SECONDS);
     }
@@ -708,15 +664,15 @@ public class ConfigurationAnyListenerTest {
 
             assertNull(ctx.oldValue());
 
-            assertEquals("0", ctx.name(PolyAnyConfiguration.class));
-            assertEquals("0", ctx.name(FirstPolyAnyConfiguration.class));
+            assertEquals("0", ctx.newName(PolyAnyView.class));
+            assertEquals("0", ctx.newName(FirstPolyAnyView.class));
 
-            assertNull(ctx.name(SecondPolyAnyConfiguration.class));
+            assertNull(ctx.newName(SecondPolyAnyView.class));
 
-            assertInstanceOf(PolyAnyConfiguration.class, 
ctx.config(PolyAnyConfiguration.class));
-            assertInstanceOf(FirstPolyAnyConfiguration.class, 
ctx.config(FirstPolyAnyConfiguration.class));
+            assertInstanceOf(PolyAnyView.class, 
ctx.newValue(PolyAnyView.class));
+            assertInstanceOf(FirstPolyAnyView.class, 
ctx.newValue(FirstPolyAnyView.class));
 
-            assertNull(ctx.config(SecondPolyAnyConfiguration.class));
+            assertNull(ctx.newValue(SecondPolyAnyView.class));
         }));
 
         rootConfig.polyNamed()
@@ -743,15 +699,15 @@ public class ConfigurationAnyListenerTest {
             assertInstanceOf(FirstPolyAnyView.class, ctx.oldValue());
             assertInstanceOf(PolyAnyView.class, ctx.oldValue());
 
-            assertEquals("0", ctx.name(PolyAnyConfiguration.class));
-            assertEquals("0", ctx.name(SecondPolyAnyConfiguration.class));
+            assertEquals("0", ctx.newName(PolyAnyView.class));
+            assertEquals("0", ctx.newName(SecondPolyAnyView.class));
 
-            assertNull(ctx.name(FirstPolyAnyConfiguration.class));
+            assertNull(ctx.newName(FirstPolyAnyView.class));
 
-            assertInstanceOf(PolyAnyConfiguration.class, 
ctx.config(PolyAnyConfiguration.class));
-            assertInstanceOf(SecondPolyAnyConfiguration.class, 
ctx.config(SecondPolyAnyConfiguration.class));
+            assertInstanceOf(PolyAnyView.class, 
ctx.newValue(PolyAnyView.class));
+            assertInstanceOf(SecondPolyAnyView.class, 
ctx.newValue(SecondPolyAnyView.class));
 
-            assertNull(ctx.config(FirstPolyAnyConfiguration.class));
+            assertNull(ctx.newValue(FirstPolyAnyView.class));
         }));
 
         rootConfig.polyNamed()
diff --git 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTest.java
 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTest.java
index 6101732fad..f331b925da 100644
--- 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTest.java
+++ 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTest.java
@@ -56,6 +56,7 @@ import java.util.concurrent.Future;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Consumer;
 import org.apache.ignite.configuration.annotation.Config;
 import org.apache.ignite.configuration.annotation.ConfigValue;
 import org.apache.ignite.configuration.annotation.ConfigurationRoot;
@@ -284,8 +285,6 @@ public class ConfigurationListenerTest {
             /** {@inheritDoc} */
             @Override
             public CompletableFuture<?> onRename(
-                    String oldName,
-                    String newName,
                     ConfigurationNotificationEvent<ChildView> ctx
             ) {
                 log.add("rename");
@@ -381,8 +380,6 @@ public class ConfigurationListenerTest {
             /** {@inheritDoc} */
             @Override
             public CompletableFuture<?> onRename(
-                    String oldName,
-                    String newName,
                     ConfigurationNotificationEvent<ChildView> ctx
             ) {
                 log.add("rename");
@@ -469,12 +466,10 @@ public class ConfigurationListenerTest {
             /** {@inheritDoc} */
             @Override
             public CompletableFuture<?> onRename(
-                    String oldName,
-                    String newName,
                     ConfigurationNotificationEvent<ChildView> ctx
             ) {
-                assertEquals("name", oldName);
-                assertEquals("newName", newName);
+                assertEquals("name", ctx.oldName(ChildView.class));
+                assertEquals("newName", ctx.newName(ChildView.class));
 
                 ChildView oldValue = ctx.oldValue();
 
@@ -570,12 +565,10 @@ public class ConfigurationListenerTest {
             /** {@inheritDoc} */
             @Override
             public CompletableFuture<?> onRename(
-                    String oldName,
-                    String newName,
                     ConfigurationNotificationEvent<ChildView> ctx
             ) {
-                assertEquals("name", oldName);
-                assertEquals("newName", newName);
+                assertEquals("name", ctx.oldName(ChildView.class));
+                assertEquals("newName", ctx.newName(ChildView.class));
 
                 ChildView oldValue = ctx.oldValue();
 
@@ -668,8 +661,6 @@ public class ConfigurationListenerTest {
             /** {@inheritDoc} */
             @Override
             public CompletableFuture<?> onRename(
-                    String oldName,
-                    String newName,
                     ConfigurationNotificationEvent<ChildView> ctx
             ) {
                 log.add("rename");
@@ -739,7 +730,7 @@ public class ConfigurationListenerTest {
             return completedFuture(null);
         });
 
-        final Future<Void> fut = config.change(parent -> 
parent.changeChildren(elements ->
+        Future<Void> fut = config.change(parent -> 
parent.changeChildren(elements ->
                 elements.delete("name"))
         );
 
@@ -762,7 +753,7 @@ public class ConfigurationListenerTest {
         ConfigurationListener<ParentView> listener1 = configListener(ctx -> 
events.add("1"));
 
         ConfigurationNamedListListener<ChildView> listener2 = 
configNamedListenerOnUpdate(ctx -> events.add("2"));
-        final ConfigurationNamedListListener<ChildView> listener3 = 
configNamedListenerOnUpdate(ctx -> events.add("3"));
+        ConfigurationNamedListListener<ChildView> listener3 = 
configNamedListenerOnUpdate(ctx -> events.add("3"));
 
         config.listen(listener0);
         config.listen(listener1);
@@ -805,34 +796,34 @@ public class ConfigurationListenerTest {
         String newVal = randomUuid();
 
         config.listen(configListener(ctx -> {
-            ParentConfiguration parent = ctx.config(ParentConfiguration.class);
+            ParentView parent = ctx.newValue(ParentView.class);
 
             assertNotNull(parent);
-            assertNull(ctx.name(ParentConfiguration.class));
+            assertNull(ctx.newName(ParentView.class));
 
-            assertEquals(newVal, parent.child().str().value());
+            assertEquals(newVal, parent.child().str());
         }));
 
         config.child().listen(configListener(ctx -> {
-            assertNotNull(ctx.config(ParentConfiguration.class));
+            assertNotNull(ctx.newValue(ParentView.class));
 
-            ChildConfiguration child = ctx.config(ChildConfiguration.class);
+            ChildView child = ctx.newValue(ChildView.class);
 
             assertNotNull(child);
-            assertNull(ctx.name(ChildConfiguration.class));
+            assertNull(ctx.newName(ChildView.class));
 
-            assertEquals(newVal, child.str().value());
+            assertEquals(newVal, child.str());
         }));
 
         config.child().str().listen(configListener(ctx -> {
-            assertNotNull(ctx.config(ParentConfiguration.class));
+            assertNotNull(ctx.newValue(ParentView.class));
 
-            ChildConfiguration child = ctx.config(ChildConfiguration.class);
+            ChildView child = ctx.newValue(ChildView.class);
 
             assertNotNull(child);
-            assertNull(ctx.name(ChildConfiguration.class));
+            assertNull(ctx.newName(ChildView.class));
 
-            assertEquals(newVal, child.str().value());
+            assertEquals(newVal, child.str());
         }));
 
         config.change(c0 -> c0.changeChild(c1 -> c1.changeStr(newVal))).get(1, 
SECONDS);
@@ -844,27 +835,27 @@ public class ConfigurationListenerTest {
         String key = randomUuid();
 
         config.children().listen(configListener(ctx -> {
-            ParentConfiguration parent = ctx.config(ParentConfiguration.class);
+            ParentView parent = ctx.newValue(ParentView.class);
 
             assertNotNull(parent);
-            assertNull(ctx.name(ParentConfiguration.class));
+            assertNull(ctx.newName(ParentView.class));
 
-            assertNull(ctx.config(ChildConfiguration.class));
-            assertNull(ctx.name(ChildConfiguration.class));
+            assertNull(ctx.newValue(ChildView.class));
+            assertNull(ctx.newName(ChildView.class));
 
-            assertEquals(newVal, parent.children().get(key).str().value());
+            assertEquals(newVal, parent.children().get(key).str());
         }));
 
         config.children().listenElements(configNamedListenerOnCreate(ctx -> {
-            assertNotNull(ctx.config(ParentConfiguration.class));
-            assertNull(ctx.name(ParentConfiguration.class));
+            assertNotNull(ctx.newValue(ParentView.class));
+            assertNull(ctx.newName(ParentView.class));
 
-            ChildConfiguration child = ctx.config(ChildConfiguration.class);
+            ChildView child = ctx.newValue(ChildView.class);
 
             assertNotNull(child);
-            assertEquals(key, ctx.name(ChildConfiguration.class));
+            assertEquals(key, ctx.newName(ChildView.class));
 
-            assertEquals(newVal, child.str().value());
+            assertEquals(newVal, child.str());
         }));
 
         config.children().change(c -> c.create(key, c1 -> 
c1.changeStr(newVal))).get(1, SECONDS);
@@ -879,28 +870,28 @@ public class ConfigurationListenerTest {
         config.children().change(c -> c.create(oldKey, 
doNothingConsumer())).get(1, SECONDS);
 
         config.children().listen(configListener(ctx -> {
-            ParentConfiguration parent = ctx.config(ParentConfiguration.class);
+            ParentView parent = ctx.newValue(ParentView.class);
 
             assertNotNull(parent);
-            assertNull(ctx.name(ParentConfiguration.class));
+            assertNull(ctx.newName(ParentView.class));
 
-            assertNull(ctx.config(ChildConfiguration.class));
-            assertNull(ctx.name(ChildConfiguration.class));
+            assertNull(ctx.newValue(ChildView.class));
+            assertNull(ctx.newName(ChildView.class));
 
             assertNull(parent.children().get(oldKey));
-            assertEquals(val, parent.children().get(newKey).str().value());
+            assertEquals(val, parent.children().get(newKey).str());
         }));
 
         config.children().listenElements(configNamedListenerOnRename(ctx -> {
-            assertNotNull(ctx.config(ParentConfiguration.class));
-            assertNull(ctx.name(ParentConfiguration.class));
+            assertNotNull(ctx.newValue(ParentView.class));
+            assertNull(ctx.newName(ParentView.class));
 
-            ChildConfiguration child = ctx.config(ChildConfiguration.class);
+            ChildView child = ctx.newValue(ChildView.class);
 
             assertNotNull(child);
-            assertEquals(newKey, ctx.name(ChildConfiguration.class));
+            assertEquals(newKey, ctx.newName(ChildView.class));
 
-            assertEquals(val, child.str().value());
+            assertEquals(val, child.str());
         }));
 
         config.children().change(c -> c.rename(oldKey, newKey));
@@ -913,32 +904,33 @@ public class ConfigurationListenerTest {
         config.children().change(c -> c.create(key, 
doNothingConsumer())).get(1, SECONDS);
 
         config.children().listen(configListener(ctx -> {
-            ParentConfiguration parent = ctx.config(ParentConfiguration.class);
+            ParentView parent = ctx.newValue(ParentView.class);
 
             assertNotNull(parent);
-            assertNull(ctx.name(ParentConfiguration.class));
+            assertNull(ctx.newName(ParentView.class));
 
-            assertNull(ctx.config(ChildConfiguration.class));
-            assertNull(ctx.name(ChildConfiguration.class));
+            assertNull(ctx.oldValue(ChildView.class));
+            assertNull(ctx.oldName(ChildView.class));
+
+            assertNull(ctx.newValue(ChildView.class));
+            assertNull(ctx.newName(ChildView.class));
 
             assertNull(parent.children().get(key));
         }));
 
-        config.children().listenElements(configNamedListenerOnDelete(ctx -> {
-            assertNotNull(ctx.config(ParentConfiguration.class));
-            assertNull(ctx.name(ParentConfiguration.class));
+        Consumer<ConfigurationNotificationEvent<ChildView>> assertions = ctx 
-> {
+            assertNotNull(ctx.newValue(ParentView.class));
+            assertNull(ctx.newName(ParentView.class));
 
-            assertNull(ctx.config(ChildConfiguration.class));
-            assertEquals(key, ctx.name(ChildConfiguration.class));
-        }));
+            assertNotNull(ctx.oldValue(ChildView.class));
+            assertEquals(key, ctx.oldName(ChildView.class));
 
-        config.children().get(key).listen(configListener(ctx -> {
-            assertNotNull(ctx.config(ParentConfiguration.class));
-            assertNull(ctx.name(ParentConfiguration.class));
+            assertNull(ctx.newValue(ChildView.class));
+            assertNull(ctx.newName(ChildView.class));
+        };
 
-            assertNull(ctx.config(ChildConfiguration.class));
-            assertEquals(key, ctx.name(ChildConfiguration.class));
-        }));
+        
config.children().listenElements(configNamedListenerOnDelete(assertions));
+        config.children().get(key).listen(configListener(assertions));
 
         config.children().change(c -> c.delete(key)).get(1, SECONDS);
     }
@@ -951,40 +943,34 @@ public class ConfigurationListenerTest {
         config.children().change(c -> c.create(key, 
doNothingConsumer())).get(1, SECONDS);
 
         config.children().listen(configListener(ctx -> {
-            ParentConfiguration parent = ctx.config(ParentConfiguration.class);
+            ParentView parent = ctx.newValue(ParentView.class);
 
             assertNotNull(parent);
-            assertNull(ctx.name(ParentConfiguration.class));
-
-            assertNull(ctx.config(ChildConfiguration.class));
-            assertNull(ctx.name(ChildConfiguration.class));
-
-            assertEquals(newVal, parent.children().get(key).str().value());
-        }));
+            assertNull(ctx.newName(ParentView.class));
 
-        config.children().listenElements(configNamedListenerOnUpdate(ctx -> {
-            assertNotNull(ctx.config(ParentConfiguration.class));
-            assertNull(ctx.name(ParentConfiguration.class));
+            assertNull(ctx.oldValue(ChildView.class));
+            assertNull(ctx.oldName(ChildView.class));
 
-            ChildConfiguration child = ctx.config(ChildConfiguration.class);
+            assertNull(ctx.newValue(ChildView.class));
+            assertNull(ctx.newName(ChildView.class));
 
-            assertNotNull(child);
-            assertEquals(key, ctx.name(ChildConfiguration.class));
-
-            assertEquals(newVal, child.str().value());
+            assertEquals(newVal, parent.children().get(key).str());
         }));
 
-        config.children().get(key).listen(configListener(ctx -> {
-            assertNotNull(ctx.config(ParentConfiguration.class));
-            assertNull(ctx.name(ParentConfiguration.class));
+        Consumer<ConfigurationNotificationEvent<ChildView>> assertions = ctx 
-> {
+            assertNotNull(ctx.newValue(ParentView.class));
+            assertNull(ctx.newName(ParentView.class));
 
-            ChildConfiguration child = ctx.config(ChildConfiguration.class);
+            ChildView child = ctx.newValue(ChildView.class);
 
             assertNotNull(child);
-            assertEquals(key, ctx.name(ChildConfiguration.class));
+            assertEquals(key, ctx.newName(ChildView.class));
 
-            assertEquals(newVal, child.str().value());
-        }));
+            assertEquals(newVal, child.str());
+        };
+
+        
config.children().listenElements(configNamedListenerOnUpdate(assertions));
+        config.children().get(key).listen(configListener(assertions));
 
         config.children().get(key).str().update(newVal).get(1, SECONDS);
     }
@@ -995,7 +981,7 @@ public class ConfigurationListenerTest {
 
         config.polyChild().commonIntVal().listen(event -> {
             intHolder.set(event.newValue());
-            return CompletableFuture.completedFuture(null);
+            return completedFuture(null);
         });
 
         config.polyChild().commonIntVal().update(42).get(1, SECONDS);
@@ -1006,13 +992,13 @@ public class ConfigurationListenerTest {
     @Test
     void testNotificationEventConfigForNestedConfiguration() throws Exception {
         config.child().listen(ctx -> {
-            assertInstanceOf(ChildConfiguration.class, 
ctx.config(ChildConfiguration.class));
-            assertInstanceOf(InternalChildConfiguration.class, 
ctx.config(InternalChildConfiguration.class));
+            assertInstanceOf(ChildView.class, ctx.newValue(ChildView.class));
+            assertInstanceOf(InternalChildView.class, 
ctx.newValue(InternalChildView.class));
 
-            assertNull(ctx.name(ChildConfiguration.class));
-            assertNull(ctx.name(InternalChildConfiguration.class));
+            assertNull(ctx.newName(ChildView.class));
+            assertNull(ctx.newName(InternalChildView.class));
 
-            return CompletableFuture.completedFuture(null);
+            return completedFuture(null);
         });
 
         config.child().str().update(randomUuid()).get(1, SECONDS);
@@ -1024,49 +1010,52 @@ public class ConfigurationListenerTest {
             /** {@inheritDoc} */
             @Override
             public CompletableFuture<?> 
onCreate(ConfigurationNotificationEvent<ChildView> ctx) {
-                assertInstanceOf(ChildConfiguration.class, 
ctx.config(ChildConfiguration.class));
-                assertInstanceOf(InternalChildConfiguration.class, 
ctx.config(InternalChildConfiguration.class));
+                assertInstanceOf(ChildView.class, 
ctx.newValue(ChildView.class));
+                assertInstanceOf(InternalChildView.class, 
ctx.newValue(InternalChildView.class));
 
-                assertEquals("0", ctx.name(ChildConfiguration.class));
-                assertEquals("0", ctx.name(InternalChildConfiguration.class));
+                assertEquals("0", ctx.newName(ChildView.class));
+                assertEquals("0", ctx.newName(InternalChildView.class));
 
-                return CompletableFuture.completedFuture(null);
+                return completedFuture(null);
             }
 
             /** {@inheritDoc} */
             @Override
-            public CompletableFuture<?> onRename(String oldName, String 
newName, ConfigurationNotificationEvent<ChildView> ctx) {
-                assertInstanceOf(ChildConfiguration.class, 
ctx.config(ChildConfiguration.class));
-                assertInstanceOf(InternalChildConfiguration.class, 
ctx.config(InternalChildConfiguration.class));
+            public CompletableFuture<?> 
onRename(ConfigurationNotificationEvent<ChildView> ctx) {
+                assertInstanceOf(ChildView.class, 
ctx.newValue(ChildView.class));
+                assertInstanceOf(InternalChildView.class, 
ctx.newValue(InternalChildView.class));
 
-                assertEquals("1", ctx.name(ChildConfiguration.class));
-                assertEquals("1", ctx.name(InternalChildConfiguration.class));
+                assertEquals("1", ctx.newName(ChildView.class));
+                assertEquals("1", ctx.newName(InternalChildView.class));
 
-                return CompletableFuture.completedFuture(null);
+                return completedFuture(null);
             }
 
             /** {@inheritDoc} */
             @Override
             public CompletableFuture<?> 
onDelete(ConfigurationNotificationEvent<ChildView> ctx) {
-                assertNull(ctx.config(ChildConfiguration.class));
-                assertNull(ctx.config(InternalChildConfiguration.class));
+                assertNull(ctx.newValue(ChildView.class));
+                assertNull(ctx.newValue(InternalChildView.class));
+
+                assertEquals("1", ctx.oldName(ChildView.class));
+                assertEquals("1", ctx.oldName(InternalChildView.class));
 
-                assertEquals("1", ctx.name(ChildConfiguration.class));
-                assertEquals("1", ctx.name(InternalChildConfiguration.class));
+                assertNull(ctx.newName(ChildView.class));
+                assertNull(ctx.newName(InternalChildView.class));
 
-                return CompletableFuture.completedFuture(null);
+                return completedFuture(null);
             }
 
             /** {@inheritDoc} */
             @Override
             public CompletableFuture<?> 
onUpdate(ConfigurationNotificationEvent<ChildView> ctx) {
-                assertInstanceOf(ChildConfiguration.class, 
ctx.config(ChildConfiguration.class));
-                assertInstanceOf(InternalChildConfiguration.class, 
ctx.config(InternalChildConfiguration.class));
+                assertInstanceOf(ChildView.class, 
ctx.newValue(ChildView.class));
+                assertInstanceOf(InternalChildView.class, 
ctx.newValue(InternalChildView.class));
 
-                assertEquals("1", ctx.name(ChildConfiguration.class));
-                assertEquals("1", ctx.name(InternalChildConfiguration.class));
+                assertEquals("1", ctx.newName(ChildView.class));
+                assertEquals("1", ctx.newName(InternalChildView.class));
 
-                return CompletableFuture.completedFuture(null);
+                return completedFuture(null);
             }
         });
 
@@ -1079,16 +1068,16 @@ public class ConfigurationListenerTest {
     @Test
     void testNotificationEventConfigForNestedPolymorphicConfiguration() throws 
Exception {
         config.polyChild().listen(ctx -> {
-            assertInstanceOf(PolyConfiguration.class, 
ctx.config(PolyConfiguration.class));
-            assertInstanceOf(StringPolyConfiguration.class, 
ctx.config(StringPolyConfiguration.class));
+            assertInstanceOf(PolyView.class, ctx.newValue(PolyView.class));
+            assertInstanceOf(StringPolyView.class, 
ctx.newValue(StringPolyView.class));
 
-            assertNull(ctx.config(LongPolyConfiguration.class));
+            assertNull(ctx.newValue(LongPolyView.class));
 
-            assertNull(ctx.name(PolyConfiguration.class));
-            assertNull(ctx.name(StringPolyConfiguration.class));
-            assertNull(ctx.name(LongPolyConfiguration.class));
+            assertNull(ctx.newName(PolyView.class));
+            assertNull(ctx.newName(StringPolyView.class));
+            assertNull(ctx.newName(LongPolyView.class));
 
-            return CompletableFuture.completedFuture(null);
+            return completedFuture(null);
         });
 
         config.polyChild().commonIntVal().update(22).get(1, SECONDS);
@@ -1100,64 +1089,67 @@ public class ConfigurationListenerTest {
             /** {@inheritDoc} */
             @Override
             public CompletableFuture<?> 
onCreate(ConfigurationNotificationEvent<PolyView> ctx) {
-                assertInstanceOf(PolyConfiguration.class, 
ctx.config(PolyConfiguration.class));
-                assertInstanceOf(StringPolyConfiguration.class, 
ctx.config(StringPolyConfiguration.class));
+                assertInstanceOf(PolyView.class, ctx.newValue(PolyView.class));
+                assertInstanceOf(StringPolyView.class, 
ctx.newValue(StringPolyView.class));
 
-                assertNull(ctx.config(LongPolyConfiguration.class));
+                assertNull(ctx.newValue(LongPolyView.class));
 
-                assertEquals("0", ctx.name(PolyConfiguration.class));
-                assertEquals("0", ctx.name(StringPolyConfiguration.class));
+                assertEquals("0", ctx.newName(PolyView.class));
+                assertEquals("0", ctx.newName(StringPolyView.class));
 
-                assertNull(ctx.name(LongPolyConfiguration.class));
+                assertNull(ctx.newName(LongPolyView.class));
 
-                return CompletableFuture.completedFuture(null);
+                return completedFuture(null);
             }
 
             /** {@inheritDoc} */
             @Override
-            public CompletableFuture<?> onRename(String oldName, String 
newName, ConfigurationNotificationEvent<PolyView> ctx) {
-                assertInstanceOf(PolyConfiguration.class, 
ctx.config(PolyConfiguration.class));
-                assertInstanceOf(StringPolyConfiguration.class, 
ctx.config(StringPolyConfiguration.class));
+            public CompletableFuture<?> 
onRename(ConfigurationNotificationEvent<PolyView> ctx) {
+                assertInstanceOf(PolyView.class, ctx.newValue(PolyView.class));
+                assertInstanceOf(StringPolyView.class, 
ctx.newValue(StringPolyView.class));
 
-                assertNull(ctx.config(LongPolyConfiguration.class));
+                assertNull(ctx.newValue(LongPolyView.class));
 
-                assertEquals("1", ctx.name(PolyConfiguration.class));
-                assertEquals("1", ctx.name(StringPolyConfiguration.class));
+                assertEquals("1", ctx.newName(PolyView.class));
+                assertEquals("1", ctx.newName(StringPolyView.class));
 
-                assertNull(ctx.name(LongPolyConfiguration.class));
+                assertNull(ctx.newName(LongPolyView.class));
 
-                return CompletableFuture.completedFuture(null);
+                return completedFuture(null);
             }
 
             /** {@inheritDoc} */
             @Override
             public CompletableFuture<?> 
onDelete(ConfigurationNotificationEvent<PolyView> ctx) {
-                assertNull(ctx.config(PolyConfiguration.class));
-                assertNull(ctx.config(StringPolyConfiguration.class));
-                assertNull(ctx.config(LongPolyConfiguration.class));
+                assertNull(ctx.newValue(PolyView.class));
+                assertNull(ctx.newValue(StringPolyView.class));
+                assertNull(ctx.newValue(LongPolyView.class));
+
+                assertNull(ctx.newName(PolyView.class));
+                assertNull(ctx.newName(StringPolyView.class));
 
-                assertEquals("1", ctx.name(PolyConfiguration.class));
-                assertEquals("1", ctx.name(StringPolyConfiguration.class));
+                assertEquals("1", ctx.oldName(PolyView.class));
+                assertEquals("1", ctx.oldName(StringPolyView.class));
 
-                assertNull(ctx.name(LongPolyConfiguration.class));
+                assertNull(ctx.newName(LongPolyView.class));
 
-                return CompletableFuture.completedFuture(null);
+                return completedFuture(null);
             }
 
             /** {@inheritDoc} */
             @Override
             public CompletableFuture<?> 
onUpdate(ConfigurationNotificationEvent<PolyView> ctx) {
-                assertInstanceOf(PolyConfiguration.class, 
ctx.config(PolyConfiguration.class));
-                assertInstanceOf(StringPolyConfiguration.class, 
ctx.config(StringPolyConfiguration.class));
+                assertInstanceOf(PolyView.class, ctx.newValue(PolyView.class));
+                assertInstanceOf(StringPolyView.class, 
ctx.newValue(StringPolyView.class));
 
-                assertNull(ctx.config(LongPolyConfiguration.class));
+                assertNull(ctx.newValue(LongPolyView.class));
 
-                assertEquals("1", ctx.name(PolyConfiguration.class));
-                assertEquals("1", ctx.name(StringPolyConfiguration.class));
+                assertEquals("1", ctx.newName(PolyView.class));
+                assertEquals("1", ctx.newName(StringPolyView.class));
 
-                assertNull(ctx.name(LongPolyConfiguration.class));
+                assertNull(ctx.newName(LongPolyView.class));
 
-                return CompletableFuture.completedFuture(null);
+                return completedFuture(null);
             }
         });
 
@@ -1180,14 +1172,14 @@ public class ConfigurationListenerTest {
             assertInstanceOf(PolyView.class, ctx.oldValue());
             assertInstanceOf(StringPolyView.class, ctx.oldValue());
 
-            assertInstanceOf(PolyConfiguration.class, 
ctx.config(PolyConfiguration.class));
-            assertInstanceOf(LongPolyConfiguration.class, 
ctx.config(LongPolyConfiguration.class));
+            assertInstanceOf(PolyView.class, ctx.newValue(PolyView.class));
+            assertInstanceOf(LongPolyView.class, 
ctx.newValue(LongPolyView.class));
 
-            assertNull(ctx.config(StringPolyConfiguration.class));
+            assertNull(ctx.newValue(StringPolyView.class));
 
-            assertNull(ctx.name(PolyConfiguration.class));
-            assertNull(ctx.name(LongPolyConfiguration.class));
-            assertNull(ctx.name(StringPolyConfiguration.class));
+            assertNull(ctx.newName(PolyView.class));
+            assertNull(ctx.newName(LongPolyView.class));
+            assertNull(ctx.newName(StringPolyView.class));
         }));
 
         config.polyChild()
@@ -1209,15 +1201,15 @@ public class ConfigurationListenerTest {
 
             assertNull(ctx.oldValue());
 
-            assertInstanceOf(PolyConfiguration.class, 
ctx.config(PolyConfiguration.class));
-            assertInstanceOf(StringPolyConfiguration.class, 
ctx.config(StringPolyConfiguration.class));
+            assertInstanceOf(PolyView.class, ctx.newValue(PolyView.class));
+            assertInstanceOf(StringPolyView.class, 
ctx.newValue(StringPolyView.class));
 
-            assertNull(ctx.config(LongPolyConfiguration.class));
+            assertNull(ctx.newValue(LongPolyView.class));
 
-            assertEquals("0", ctx.name(PolyConfiguration.class));
-            assertEquals("0", ctx.name(StringPolyConfiguration.class));
+            assertEquals("0", ctx.newName(PolyView.class));
+            assertEquals("0", ctx.newName(StringPolyView.class));
 
-            assertNull(ctx.name(LongPolyConfiguration.class));
+            assertNull(ctx.newName(LongPolyView.class));
         }));
 
         config.polyChildren()
@@ -1244,15 +1236,15 @@ public class ConfigurationListenerTest {
             assertInstanceOf(PolyView.class, ctx.oldValue());
             assertInstanceOf(StringPolyView.class, ctx.oldValue());
 
-            assertInstanceOf(PolyConfiguration.class, 
ctx.config(PolyConfiguration.class));
-            assertInstanceOf(LongPolyConfiguration.class, 
ctx.config(LongPolyConfiguration.class));
+            assertInstanceOf(PolyView.class, ctx.newValue(PolyView.class));
+            assertInstanceOf(LongPolyView.class, 
ctx.newValue(LongPolyView.class));
 
-            assertNull(ctx.config(StringPolyConfiguration.class));
+            assertNull(ctx.newValue(StringPolyView.class));
 
-            assertEquals("0", ctx.name(PolyConfiguration.class));
-            assertEquals("0", ctx.name(LongPolyConfiguration.class));
+            assertEquals("0", ctx.newName(PolyView.class));
+            assertEquals("0", ctx.newName(LongPolyView.class));
 
-            assertNull(ctx.name(StringPolyConfiguration.class));
+            assertNull(ctx.newName(StringPolyView.class));
         }));
 
         config.polyChildren()
@@ -1279,15 +1271,15 @@ public class ConfigurationListenerTest {
             assertInstanceOf(PolyView.class, ctx.oldValue());
             assertInstanceOf(StringPolyView.class, ctx.oldValue());
 
-            assertInstanceOf(PolyConfiguration.class, 
ctx.config(PolyConfiguration.class));
-            assertInstanceOf(StringPolyConfiguration.class, 
ctx.config(StringPolyConfiguration.class));
+            assertInstanceOf(PolyView.class, ctx.newValue(PolyView.class));
+            assertInstanceOf(StringPolyView.class, 
ctx.newValue(StringPolyView.class));
 
-            assertNull(ctx.config(LongPolyConfiguration.class));
+            assertNull(ctx.newValue(LongPolyView.class));
 
-            assertEquals("1", ctx.name(PolyConfiguration.class));
-            assertEquals("1", ctx.name(StringPolyConfiguration.class));
+            assertEquals("1", ctx.newName(PolyView.class));
+            assertEquals("1", ctx.newName(StringPolyView.class));
 
-            assertNull(ctx.name(LongPolyConfiguration.class));
+            assertNull(ctx.newName(LongPolyView.class));
         }));
 
         config.polyChildren()
@@ -1313,14 +1305,17 @@ public class ConfigurationListenerTest {
             assertInstanceOf(PolyView.class, ctx.oldValue());
             assertInstanceOf(StringPolyView.class, ctx.oldValue());
 
-            assertNull(ctx.config(PolyConfiguration.class));
-            assertNull(ctx.config(StringPolyConfiguration.class));
-            assertNull(ctx.config(LongPolyConfiguration.class));
+            assertNull(ctx.newValue(PolyView.class));
+            assertNull(ctx.newValue(StringPolyView.class));
+            assertNull(ctx.newValue(LongPolyView.class));
+
+            assertNull(ctx.newName(PolyView.class));
+            assertNull(ctx.newName(StringPolyView.class));
 
-            assertEquals("0", ctx.name(PolyConfiguration.class));
-            assertEquals("0", ctx.name(StringPolyConfiguration.class));
+            assertEquals("0", ctx.oldName(PolyView.class));
+            assertEquals("0", ctx.oldName(StringPolyView.class));
 
-            assertNull(ctx.name(LongPolyConfiguration.class));
+            assertNull(ctx.newName(LongPolyView.class));
         }));
 
         config.polyChildren()
@@ -1348,13 +1343,13 @@ public class ConfigurationListenerTest {
         assertInstanceOf(ChildView.class, event.oldValue());
         assertInstanceOf(InternalChildView.class, event.oldValue());
 
-        assertInstanceOf(ChildConfiguration.class, 
event.config(ChildConfiguration.class));
-        assertInstanceOf(InternalChildConfiguration.class, 
event.config(InternalChildConfiguration.class));
+        assertInstanceOf(ChildView.class, event.newValue(ChildView.class));
+        assertInstanceOf(InternalChildView.class, 
event.newValue(InternalChildView.class));
 
-        assertInstanceOf(ParentConfiguration.class, 
event.config(ParentConfiguration.class));
+        assertInstanceOf(ParentView.class, event.newValue(ParentView.class));
 
-        assertNull(event.name(ChildConfiguration.class));
-        assertNull(event.name(InternalChildConfiguration.class));
+        assertNull(event.newName(ChildView.class));
+        assertNull(event.newName(InternalChildView.class));
     }
 
     @Test
@@ -1374,13 +1369,13 @@ public class ConfigurationListenerTest {
 
         assertNull(event.oldValue());
 
-        assertInstanceOf(ChildConfiguration.class, 
event.config(ChildConfiguration.class));
-        assertInstanceOf(InternalChildConfiguration.class, 
event.config(InternalChildConfiguration.class));
+        assertInstanceOf(ChildView.class, event.newValue(ChildView.class));
+        assertInstanceOf(InternalChildView.class, 
event.newValue(InternalChildView.class));
 
-        assertInstanceOf(ParentConfiguration.class, 
event.config(ParentConfiguration.class));
+        assertInstanceOf(ParentView.class, event.newValue(ParentView.class));
 
-        assertEquals("0", event.name(ChildConfiguration.class));
-        assertEquals("0", event.name(InternalChildConfiguration.class));
+        assertEquals("0", event.newName(ChildView.class));
+        assertEquals("0", event.newName(InternalChildView.class));
     }
 
     @Test
diff --git 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTestUtils.java
 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTestUtils.java
index da96c0c6fe..cbeca66d81 100644
--- 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTestUtils.java
+++ 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTestUtils.java
@@ -151,7 +151,7 @@ class ConfigurationListenerTestUtils {
         return new ConfigurationNamedListListener<>() {
             /** {@inheritDoc} */
             @Override
-            public CompletableFuture<?> onRename(String oldName, String 
newName, ConfigurationNotificationEvent<T> ctx) {
+            public CompletableFuture<?> 
onRename(ConfigurationNotificationEvent<T> ctx) {
                 try {
                     consumer.accept(ctx);
                 } catch (Throwable t) {
diff --git 
a/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtension.java
 
b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtension.java
index 7e2967b84d..d1d20213e4 100644
--- 
a/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtension.java
+++ 
b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtension.java
@@ -296,6 +296,8 @@ public class ConfigurationExtension implements 
BeforeEachCallback, AfterEachCall
             root.setInjectedNameFieldValue(annotation.name());
         }
 
+        superRoot.makeImmutable();
+
         // Reference to the super root is required to make 
DynamicConfigurationChanger#change method atomic.
         var superRootRef = new AtomicReference<>(superRoot);
 
diff --git 
a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/DistributionZoneManager.java
 
b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/DistributionZoneManager.java
index 1d87f04024..acb0b31747 100644
--- 
a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/DistributionZoneManager.java
+++ 
b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/DistributionZoneManager.java
@@ -547,13 +547,13 @@ public class DistributionZoneManager implements 
IgniteComponent {
      */
     private ConfigurationListener<Integer> onUpdateScaleUp() {
         return ctx -> {
-            int zoneId = 
ctx.config(DistributionZoneConfiguration.class).zoneId().value();
-
             if (ctx.oldValue() == null) {
                 // zone creation, already handled in a separate listener.
                 return completedFuture(null);
             }
 
+            int zoneId = ctx.newValue(DistributionZoneView.class).zoneId();
+
             int newScaleUp = ctx.newValue().intValue();
 
             // It is safe to zonesTimers.get(zoneId) in term of NPE because 
meta storage notifications are one-threaded
@@ -585,13 +585,13 @@ public class DistributionZoneManager implements 
IgniteComponent {
      */
     private ConfigurationListener<Integer> onUpdateScaleDown() {
         return ctx -> {
-            int zoneId = 
ctx.config(DistributionZoneConfiguration.class).zoneId().value();
-
             if (ctx.oldValue() == null) {
                 // zone creation, already handled in a separate listener.
                 return completedFuture(null);
             }
 
+            int zoneId = ctx.newValue(DistributionZoneView.class).zoneId();
+
             int newScaleDown = ctx.newValue().intValue();
 
             // It is safe to zonesTimers.get(zoneId) in term of NPE because 
meta storage notifications are one-threaded
diff --git 
a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexManager.java
 
b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexManager.java
index d06ec3f143..4408b5ffc0 100644
--- 
a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexManager.java
+++ 
b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexManager.java
@@ -572,8 +572,6 @@ public class IndexManager extends Producer<IndexEvent, 
IndexEventParameters> imp
         /** {@inheritDoc} */
         @Override
         public @NotNull CompletableFuture<?> onRename(
-                String oldName,
-                String newName,
                 ConfigurationNotificationEvent<TableIndexView> ctx
         ) {
             return failedFuture(new 
UnsupportedOperationException("https://issues.apache.org/jira/browse/IGNITE-16196";));
diff --git 
a/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/AssignmentsTracker.java
 
b/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/AssignmentsTracker.java
index 71ce16672b..9d7389b2f4 100644
--- 
a/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/AssignmentsTracker.java
+++ 
b/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/AssignmentsTracker.java
@@ -41,6 +41,7 @@ import org.apache.ignite.internal.metastorage.WatchEvent;
 import org.apache.ignite.internal.metastorage.WatchListener;
 import org.apache.ignite.internal.replicator.ReplicationGroupId;
 import 
org.apache.ignite.internal.schema.configuration.ExtendedTableConfiguration;
+import org.apache.ignite.internal.schema.configuration.ExtendedTableView;
 import org.apache.ignite.internal.schema.configuration.TablesConfiguration;
 import 
org.apache.ignite.internal.table.distributed.replicator.TablePartitionId;
 import org.apache.ignite.internal.util.ByteUtils;
@@ -152,12 +153,12 @@ public class AssignmentsTracker {
     private class AssignmentsCfgListener implements 
ConfigurationListener<byte[]> {
         @Override
         public CompletableFuture<?> 
onUpdate(ConfigurationNotificationEvent<byte[]> assignmentsCtx) {
-            ExtendedTableConfiguration tblCfg = 
assignmentsCtx.config(ExtendedTableConfiguration.class);
+            ExtendedTableView tblCfg = 
assignmentsCtx.newValue(ExtendedTableView.class);
 
             DistributionZoneView distributionZoneView =
-                    getZoneById(distributionZonesConfiguration, 
tblCfg.zoneId().value()).value();
+                    getZoneById(distributionZonesConfiguration, 
tblCfg.zoneId()).value();
 
-            UUID tblId = tblCfg.id().value();
+            UUID tblId = tblCfg.id();
 
             LOG.debug("Table assignments configuration update for placement 
driver [revision={}, tblId={}]",
                     assignmentsCtx.storageRevision(), tblId);
diff --git 
a/modules/rest/src/test/java/org/apache/ignite/internal/rest/authentication/StubAuthenticationViewEvent.java
 
b/modules/rest/src/test/java/org/apache/ignite/internal/rest/authentication/StubAuthenticationViewEvent.java
index 7aa17380e3..bb1b1edfbd 100644
--- 
a/modules/rest/src/test/java/org/apache/ignite/internal/rest/authentication/StubAuthenticationViewEvent.java
+++ 
b/modules/rest/src/test/java/org/apache/ignite/internal/rest/authentication/StubAuthenticationViewEvent.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.rest.authentication;
 
-import org.apache.ignite.configuration.ConfigurationProperty;
 import 
org.apache.ignite.configuration.notifications.ConfigurationNotificationEvent;
 import org.apache.ignite.internal.configuration.AuthenticationView;
 import org.jetbrains.annotations.Nullable;
@@ -38,26 +37,34 @@ public class StubAuthenticationViewEvent implements 
ConfigurationNotificationEve
         return oldValue;
     }
 
+    @Override
+    public <T> @Nullable T oldValue(Class<T> viewClass) {
+        return null;
+    }
+
     @Override
     @Nullable
     public AuthenticationView newValue() {
         return newValue;
     }
 
+    @Override
+    public <T> @Nullable T newValue(Class<T> viewClass) {
+        return null;
+    }
+
     @Override
     public long storageRevision() {
         return 0;
     }
 
     @Override
-    @Nullable
-    public <T extends ConfigurationProperty> T config(Class<T> configClass) {
+    public @Nullable String oldName(Class<?> viewClass) {
         return null;
     }
 
     @Override
-    @Nullable
-    public String name(Class<? extends ConfigurationProperty> configClass) {
+    public @Nullable String newName(Class<?> viewClass) {
         return null;
     }
 }
diff --git 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/SchemaManager.java
 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/SchemaManager.java
index e76941a418..5554f229a3 100644
--- 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/SchemaManager.java
+++ 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/SchemaManager.java
@@ -118,7 +118,7 @@ public class SchemaManager extends Producer<SchemaEvent, 
SchemaEventParameters>
         }
 
         try {
-            ExtendedTableView tblCfg = (ExtendedTableView) 
ctx.config(ExtendedTableConfiguration.class).value();
+            ExtendedTableView tblCfg = ctx.newValue(ExtendedTableView.class);
 
             int newSchemaVersion = tblCfg.schemaId();
 
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryStorageEngine.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryStorageEngine.java
index 5ecc7f854e..2c210fc62d 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryStorageEngine.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryStorageEngine.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.storage.pagememory;
 
 import static java.util.concurrent.CompletableFuture.completedFuture;
+import static 
org.apache.ignite.internal.storage.pagememory.configuration.schema.BasePageMemoryStorageEngineConfigurationSchema.DEFAULT_DATA_REGION_NAME;
 import static org.apache.ignite.internal.util.IgniteUtils.closeAll;
 
 import java.nio.file.Path;
@@ -153,13 +154,13 @@ public class PersistentPageMemoryStorageEngine implements 
StorageEngine {
             throw new StorageException("Error starting checkpoint manager", e);
         }
 
-        addDataRegion(engineConfig.defaultRegion());
+        addDataRegion(DEFAULT_DATA_REGION_NAME);
 
         // TODO: IGNITE-17066 Add handling deleting/updating data regions 
configuration
         engineConfig.regions().listenElements(new 
ConfigurationNamedListListener<>() {
             @Override
             public CompletableFuture<?> 
onCreate(ConfigurationNotificationEvent<PersistentPageMemoryDataRegionView> 
ctx) {
-                
addDataRegion(ctx.config(PersistentPageMemoryDataRegionConfiguration.class));
+                
addDataRegion(ctx.newName(PersistentPageMemoryDataRegionView.class));
 
                 return completedFuture(null);
             }
@@ -205,12 +206,14 @@ public class PersistentPageMemoryStorageEngine implements 
StorageEngine {
     /**
      * Creates, starts and adds a new data region to the engine.
      *
-     * @param dataRegionConfig Data region configuration.
+     * @param name Data region name.
      */
-    private void addDataRegion(PersistentPageMemoryDataRegionConfiguration 
dataRegionConfig) {
-        int pageSize = engineConfig.pageSize().value();
+    private void addDataRegion(String name) {
+        PersistentPageMemoryDataRegionConfiguration dataRegionConfig = 
DEFAULT_DATA_REGION_NAME.equals(name)
+                ? engineConfig.defaultRegion()
+                : engineConfig.regions().get(name);
 
-        String name = dataRegionConfig.name().value();
+        int pageSize = engineConfig.pageSize().value();
 
         PersistentPageMemoryDataRegion dataRegion = new 
PersistentPageMemoryDataRegion(
                 dataRegionConfig,
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryStorageEngine.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryStorageEngine.java
index 99322031c3..de4d80907c 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryStorageEngine.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryStorageEngine.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.storage.pagememory;
 
 import static java.util.concurrent.CompletableFuture.completedFuture;
+import static 
org.apache.ignite.internal.storage.pagememory.configuration.schema.BasePageMemoryStorageEngineConfigurationSchema.DEFAULT_DATA_REGION_NAME;
 import static org.apache.ignite.internal.util.IgniteUtils.closeAll;
 
 import java.util.Map;
@@ -92,14 +93,14 @@ public class VolatilePageMemoryStorageEngine implements 
StorageEngine {
     /** {@inheritDoc} */
     @Override
     public void start() throws StorageException {
-        addDataRegion(engineConfig.defaultRegion());
+        addDataRegion(DEFAULT_DATA_REGION_NAME);
 
         // TODO: IGNITE-17066 Add handling deleting/updating data regions 
configuration
         engineConfig.regions().listenElements(new 
ConfigurationNamedListListener<>() {
             /** {@inheritDoc} */
             @Override
             public CompletableFuture<?> 
onCreate(ConfigurationNotificationEvent<VolatilePageMemoryDataRegionView> ctx) {
-                
addDataRegion(ctx.config(VolatilePageMemoryDataRegionConfiguration.class));
+                
addDataRegion(ctx.newName(VolatilePageMemoryDataRegionView.class));
 
                 return completedFuture(null);
             }
@@ -142,12 +143,14 @@ public class VolatilePageMemoryStorageEngine implements 
StorageEngine {
     /**
      * Creates, starts and adds a new data region to the engine.
      *
-     * @param dataRegionConfig Data region configuration.
+     * @param name Data region name.
      */
-    private void addDataRegion(VolatilePageMemoryDataRegionConfiguration 
dataRegionConfig) {
-        int pageSize = engineConfig.pageSize().value();
+    private void addDataRegion(String name) {
+        VolatilePageMemoryDataRegionConfiguration dataRegionConfig = 
DEFAULT_DATA_REGION_NAME.equals(name)
+                ? engineConfig.defaultRegion()
+                : engineConfig.regions().get(name);
 
-        String name = dataRegionConfig.name().value();
+        int pageSize = engineConfig.pageSize().value();
 
         VolatilePageMemoryDataRegion dataRegion = new 
VolatilePageMemoryDataRegion(
                 dataRegionConfig,
diff --git 
a/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/RocksDbStorageEngine.java
 
b/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/RocksDbStorageEngine.java
index 2e595b343b..66e09efe10 100644
--- 
a/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/RocksDbStorageEngine.java
+++ 
b/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/RocksDbStorageEngine.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.storage.rocksdb;
 
+import static 
org.apache.ignite.internal.storage.rocksdb.configuration.schema.RocksDbStorageEngineConfigurationSchema.DEFAULT_DATA_REGION_NAME;
+
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -115,20 +117,24 @@ public class RocksDbStorageEngine implements 
StorageEngine {
     /** {@inheritDoc} */
     @Override
     public void start() throws StorageException {
-        registerDataRegion(engineConfig.defaultRegion());
+        registerDataRegion(DEFAULT_DATA_REGION_NAME);
 
         // TODO: IGNITE-17066 Add handling deleting/updating data regions 
configuration
         engineConfig.regions().listenElements(new 
ConfigurationNamedListListener<>() {
             @Override
             public CompletableFuture<?> 
onCreate(ConfigurationNotificationEvent<RocksDbDataRegionView> ctx) {
-                
registerDataRegion(ctx.config(RocksDbDataRegionConfiguration.class));
+                registerDataRegion(ctx.newName(RocksDbDataRegionView.class));
 
                 return CompletableFuture.completedFuture(null);
             }
         });
     }
 
-    private void registerDataRegion(RocksDbDataRegionConfiguration 
dataRegionConfig) {
+    private void registerDataRegion(String name) {
+        RocksDbDataRegionConfiguration dataRegionConfig = 
DEFAULT_DATA_REGION_NAME.equals(name)
+                ? engineConfig.defaultRegion()
+                : engineConfig.regions().get(name);
+
         var region = new RocksDbDataRegion(dataRegionConfig);
 
         region.start();
diff --git 
a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
 
b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
index 430c8ebcf3..ea43056438 100644
--- 
a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
+++ 
b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
@@ -121,6 +121,7 @@ import 
org.apache.ignite.internal.schema.configuration.TableConfiguration;
 import org.apache.ignite.internal.schema.configuration.TableView;
 import org.apache.ignite.internal.schema.configuration.TablesConfiguration;
 import org.apache.ignite.internal.schema.configuration.index.TableIndexView;
+import 
org.apache.ignite.internal.schema.configuration.storage.DataStorageConfiguration;
 import org.apache.ignite.internal.schema.event.SchemaEvent;
 import org.apache.ignite.internal.schema.event.SchemaEventParameters;
 import org.apache.ignite.internal.storage.DataStorageManager;
@@ -451,7 +452,7 @@ public class TableManager extends Producer<TableEvent, 
TableEventParameters> imp
             }
 
             @Override
-            public CompletableFuture<?> onRename(String oldName, String 
newName, ConfigurationNotificationEvent<TableView> ctx) {
+            public CompletableFuture<?> 
onRename(ConfigurationNotificationEvent<TableView> ctx) {
                 // TODO: IGNITE-15485 Support table rename operation.
 
                 return completedFuture(null);
@@ -591,7 +592,7 @@ public class TableManager extends Producer<TableEvent, 
TableEventParameters> imp
 
         try {
             if (replicasCtx.oldValue() != null && replicasCtx.oldValue() > 0) {
-                DistributionZoneView zoneCfg = 
replicasCtx.config(DistributionZoneConfiguration.class).value();
+                DistributionZoneView zoneCfg = 
replicasCtx.newValue(DistributionZoneView.class);
 
                 List<TableConfiguration> tblsCfg = new ArrayList<>();
 
@@ -666,9 +667,11 @@ public class TableManager extends Producer<TableEvent, 
TableEventParameters> imp
      * @param assignmentsCtx Change assignment event.
      */
     private CompletableFuture<?> 
updateAssignmentInternal(ConfigurationNotificationEvent<byte[]> assignmentsCtx) 
{
-        ExtendedTableConfiguration tblCfg = 
assignmentsCtx.config(ExtendedTableConfiguration.class);
+        ExtendedTableView tblCfg = 
assignmentsCtx.newValue(ExtendedTableView.class);
 
-        UUID tblId = tblCfg.id().value();
+        UUID tblId = tblCfg.id();
+
+        DataStorageConfiguration dsCfg = 
tablesCfg.tables().get(tblId).dataStorage();
 
         long causalityToken = assignmentsCtx.storageRevision();
 
@@ -732,7 +735,7 @@ public class TableManager extends Producer<TableEvent, 
TableEventParameters> imp
                                     partId,
                                     storage,
                                     table.indexStorageAdapters(partId),
-                                    tblCfg.dataStorage()
+                                    dsCfg
                             );
 
                             mvGc.addStorage(replicaGrpId, 
storageUpdateHandler);

Reply via email to