You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tamaya.apache.org by an...@apache.org on 2018/11/18 21:20:38 UTC

[20/20] incubator-tamaya-extensions git commit: TAMAYA-354 Support atomic configuration, similar to config JSR.

TAMAYA-354 Support atomic configuration, similar to config JSR.


Project: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/commit/e190b34f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/tree/e190b34f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/diff/e190b34f

Branch: refs/heads/master
Commit: e190b34f24fc45f16c14442db81ae8f6c72d34dc
Parents: 9f38f77
Author: Anatole Tresch <at...@gmail.com>
Authored: Sun Nov 18 22:17:15 2018 +0100
Committer: Anatole Tresch <at...@gmail.com>
Committed: Sun Nov 18 22:17:15 2018 +0100

----------------------------------------------------------------------
 .../consul/AbstractConsulPropertySource.java    |   6 +
 .../tamaya/consul/ConsulPropertySource.java     |   2 +
 .../tamaya/etcd/AbstractEtcdPropertySource.java |   6 +
 .../tamaya/events/ConfigurationChange.java      |   9 +-
 .../tamaya/events/FrozenConfiguration.java      | 189 ++++++++-----------
 .../tamaya/events/FrozenPropertySource.java     |  82 ++++----
 .../tamaya/events/PropertySourceChange.java     |   5 +-
 .../internal/DefaultConfigChangeObserver.java   |   9 +-
 .../tamaya/events/ConfigurationChangeTest.java  |   5 +-
 .../tamaya/events/FrozenConfigurationTest.java  |  24 +--
 .../tamaya/events/RandomPropertySource.java     |   8 +-
 .../apache/tamaya/events/TestConfigView.java    |  26 +--
 .../ObservingPropertySourceProvider.java        |   2 +-
 .../DefaultConfigChangeObserverTest.java        |   6 +-
 .../tamaya/functions/CombinedConfiguration.java |   7 +
 .../functions/ConfigWrappingPropertySource.java |   5 -
 .../tamaya/functions/EnrichedConfiguration.java |  19 +-
 .../tamaya/functions/FilteredConfiguration.java |   7 +
 .../tamaya/functions/MappedConfiguration.java   |   7 +
 .../functions/PropertySourceFunctions.java      |   5 -
 .../functions/CombinedConfigurationTest.java    |   6 +-
 .../functions/EnrichedConfigurationTest.java    |   4 +-
 .../functions/MappedConfigurationTest.java      |   2 +-
 .../tamaya/microprofile/MicroprofileConfig.java |   2 +-
 .../microprofile/TamayaConfiguration.java       |  11 ++
 25 files changed, 208 insertions(+), 246 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/consul/src/main/java/org/apache/tamaya/consul/AbstractConsulPropertySource.java
----------------------------------------------------------------------
diff --git a/modules/consul/src/main/java/org/apache/tamaya/consul/AbstractConsulPropertySource.java b/modules/consul/src/main/java/org/apache/tamaya/consul/AbstractConsulPropertySource.java
index f07fb68..e5a91b7 100644
--- a/modules/consul/src/main/java/org/apache/tamaya/consul/AbstractConsulPropertySource.java
+++ b/modules/consul/src/main/java/org/apache/tamaya/consul/AbstractConsulPropertySource.java
@@ -25,6 +25,7 @@ import com.orbitz.consul.KeyValueClient;
 import com.orbitz.consul.model.kv.Value;
 import org.apache.tamaya.mutableconfig.ConfigChangeRequest;
 import org.apache.tamaya.mutableconfig.spi.MutablePropertySource;
+import org.apache.tamaya.spi.ChangeSupport;
 import org.apache.tamaya.spi.PropertyValue;
 import org.apache.tamaya.spisupport.propertysource.BasePropertySource;
 
@@ -206,6 +207,11 @@ implements MutablePropertySource{
     }
 
     @Override
+    public ChangeSupport getChangeSupport(){
+        return ChangeSupport.UNSUPPORTED;
+    }
+
+    @Override
     public void applyChange(ConfigChangeRequest configChange) {
         for(HostAndPort hostAndPort: this.consulBackends){
             try{

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/consul/src/main/java/org/apache/tamaya/consul/ConsulPropertySource.java
----------------------------------------------------------------------
diff --git a/modules/consul/src/main/java/org/apache/tamaya/consul/ConsulPropertySource.java b/modules/consul/src/main/java/org/apache/tamaya/consul/ConsulPropertySource.java
index ce92a95..84612b3 100644
--- a/modules/consul/src/main/java/org/apache/tamaya/consul/ConsulPropertySource.java
+++ b/modules/consul/src/main/java/org/apache/tamaya/consul/ConsulPropertySource.java
@@ -25,6 +25,7 @@ import com.orbitz.consul.KeyValueClient;
 import com.orbitz.consul.model.kv.Value;
 import org.apache.tamaya.mutableconfig.ConfigChangeRequest;
 import org.apache.tamaya.mutableconfig.spi.MutablePropertySource;
+import org.apache.tamaya.spi.ChangeSupport;
 import org.apache.tamaya.spi.PropertyValue;
 import org.apache.tamaya.spisupport.propertysource.BasePropertySource;
 
@@ -63,4 +64,5 @@ public class ConsulPropertySource extends AbstractConsulPropertySource{
         setServer(Arrays.asList(backends));
     }
 
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/etcd/src/main/java/org/apache/tamaya/etcd/AbstractEtcdPropertySource.java
----------------------------------------------------------------------
diff --git a/modules/etcd/src/main/java/org/apache/tamaya/etcd/AbstractEtcdPropertySource.java b/modules/etcd/src/main/java/org/apache/tamaya/etcd/AbstractEtcdPropertySource.java
index 3388b8e..6213d8e 100644
--- a/modules/etcd/src/main/java/org/apache/tamaya/etcd/AbstractEtcdPropertySource.java
+++ b/modules/etcd/src/main/java/org/apache/tamaya/etcd/AbstractEtcdPropertySource.java
@@ -20,6 +20,7 @@ package org.apache.tamaya.etcd;
 
 import org.apache.tamaya.mutableconfig.ConfigChangeRequest;
 import org.apache.tamaya.mutableconfig.spi.MutablePropertySource;
+import org.apache.tamaya.spi.ChangeSupport;
 import org.apache.tamaya.spi.PropertyValue;
 import org.apache.tamaya.spisupport.propertysource.BasePropertySource;
 
@@ -182,6 +183,11 @@ public abstract class AbstractEtcdPropertySource extends BasePropertySource
         return configMap;
     }
 
+    @Override
+    public ChangeSupport getChangeSupport(){
+        return ChangeSupport.SUPPORTED;
+    }
+
     private Map<String, PropertyValue> mapPrefix(Map<String, String> props) {
 
         Map<String, PropertyValue> values = new HashMap<>();

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/events/src/main/java/org/apache/tamaya/events/ConfigurationChange.java
----------------------------------------------------------------------
diff --git a/modules/events/src/main/java/org/apache/tamaya/events/ConfigurationChange.java b/modules/events/src/main/java/org/apache/tamaya/events/ConfigurationChange.java
index 0ec7e1e..3daaa10 100644
--- a/modules/events/src/main/java/org/apache/tamaya/events/ConfigurationChange.java
+++ b/modules/events/src/main/java/org/apache/tamaya/events/ConfigurationChange.java
@@ -19,6 +19,7 @@
 package org.apache.tamaya.events;
 
 import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationSnapshot;
 
 import java.beans.PropertyChangeEvent;
 import java.io.Serializable;
@@ -39,7 +40,7 @@ public final class ConfigurationChange implements ConfigEvent<Configuration>, Se
 
     private static final long serialVersionUID = 1L;
     /** The base property provider/configuration. */
-    private final FrozenConfiguration configuration;
+    private final ConfigurationSnapshot snapshot;
     /** The base version, usable for optimistic locking. */
     private String version = UUID.randomUUID().toString();
     /** The timestamp of the change setCurrent in millis from the epoch. */
@@ -61,7 +62,7 @@ public final class ConfigurationChange implements ConfigEvent<Configuration>, Se
      * @param builder The builder used, not null.
      */
     ConfigurationChange(ConfigurationChangeBuilder builder) {
-        this.configuration = FrozenConfiguration.of(builder.source);
+        this.snapshot = builder.source.getSnapshot();
         for(PropertyChangeEvent ev:builder.delta.values()){
             this.changes.put(ev.getPropertyName(), ev);
         }
@@ -84,7 +85,7 @@ public final class ConfigurationChange implements ConfigEvent<Configuration>, Se
      */
     @Override
     public Configuration getResource(){
-        return this.configuration;
+        return this.snapshot;
     }
 
     /**
@@ -219,7 +220,7 @@ public final class ConfigurationChange implements ConfigEvent<Configuration>, Se
     @Override
     public String toString() {
         return "ConfigurationChange{" +
-                "\n configuration-id = " + configuration.getOrDefault("_id", "-") +
+                "\n snapshot-id = " + snapshot.getOrDefault("_id", "-") +
                 "\n change-id        = " + version +
                 "\n timestamp        = " + timestamp +
                 "\n added            = " + this.getAddedSize() +

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/events/src/main/java/org/apache/tamaya/events/FrozenConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/events/src/main/java/org/apache/tamaya/events/FrozenConfiguration.java b/modules/events/src/main/java/org/apache/tamaya/events/FrozenConfiguration.java
index f53bc1c..81183b1 100644
--- a/modules/events/src/main/java/org/apache/tamaya/events/FrozenConfiguration.java
+++ b/modules/events/src/main/java/org/apache/tamaya/events/FrozenConfiguration.java
@@ -18,44 +18,50 @@
  */
 package org.apache.tamaya.events;
 
-import org.apache.tamaya.ConfigException;
-import org.apache.tamaya.ConfigOperator;
-import org.apache.tamaya.ConfigQuery;
 import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationSnapshot;
 import org.apache.tamaya.TypeLiteral;
-import org.apache.tamaya.functions.ConfigurationFunctions;
-import org.apache.tamaya.spi.ConfigurationContext;
-import org.apache.tamaya.spi.ConversionContext;
-import org.apache.tamaya.spi.PropertyConverter;
+import org.apache.tamaya.spi.*;
+import org.apache.tamaya.spisupport.*;
 
 import java.io.Serializable;
 import java.util.*;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 /**
  * /**
  * Configuration implementation that stores all current values of a given (possibly dynamic, contextual and non server
  * capable instance) and is fully serializable. Note that hereby only the scannable key/createValue pairs are considered.
+ * @deprecated Use {@link DefaultConfigurationSnapshot}
  */
+@Deprecated
 public final class FrozenConfiguration implements Configuration, Serializable {
-    private static final long serialVersionUID = -6373137316556444171L;
+    private static final long serialVersionUID = -6373137316556444172L;
 
     /**
      * The properties frozen.
      */
-    private Map<String, String> properties = new HashMap<>();
-    private long frozenAt = System.nanoTime();
+    private ConfigurationSnapshot snapshot;
+
     private UUID id = UUID.randomUUID();
 
     /**
      * Constructor.
      *
-     * @param config The base configuration.
+     * @param snapshot The snapshot.
+     */
+    private FrozenConfiguration(ConfigurationSnapshot snapshot) {
+        this.snapshot = snapshot;
+    }
+
+
+    /**
+     * Creates a new FrozenConfiguration instance based on the current Configuration.
+     *
+     * @return the frozen Configuration.
+     * @see Configuration#current()
      */
-    private FrozenConfiguration(Configuration config) {
-        this.properties.putAll(config.getProperties());
-        this.properties = Collections.unmodifiableMap(this.properties);
+    public static FrozenConfiguration ofCurrent(String... keys) {
+        return new FrozenConfiguration(Configuration.current().getSnapshot(Arrays.asList(keys)));
     }
 
     /**
@@ -64,106 +70,93 @@ public final class FrozenConfiguration implements Configuration, Serializable {
      * @param config the configuration to be frozen, not null.
      * @return the frozen Configuration.
      */
-    public static FrozenConfiguration of(Configuration config) {
-        if (config instanceof FrozenConfiguration) {
-            return (FrozenConfiguration) config;
-        }
-        return new FrozenConfiguration(config);
+    public static FrozenConfiguration of(Configuration config, String... keys) {
+        return new FrozenConfiguration(config.getSnapshot(Arrays.asList(keys)));
+    }
+
+    /**
+     * Creates a new FrozenConfiguration instance based on a Configuration given.
+     *
+     * @param config the configuration to be frozen, not null.
+     * @return the frozen Configuration.
+     */
+    public static FrozenConfiguration of(Configuration config, Set<String> keys) {
+        return new FrozenConfiguration(config.getSnapshot(keys));
+    }
+
+    /**
+     * Get the evaluated keys of this frozen coinfiguration.
+     * @return the keys, not null.
+     */
+    public Set<String> getKeys() {
+        return snapshot.getKeys();
     }
 
     @Override
     public String get(String key) {
-        return this.properties.get(key);
+        return this.snapshot.get(key);
     }
 
     @Override
     public String getOrDefault(String key, String defaultValue) {
-        String val = get(key);
-        if(val==null){
-            return defaultValue;
-        }
-        return val;
+        return this.snapshot.getOrDefault(key, defaultValue);
     }
 
     @Override
     public <T> T getOrDefault(String key, Class<T> type, T defaultValue) {
-        T val = get(key, type);
-        if(val==null){
-            return defaultValue;
-        }
-        return val;
+        return this.snapshot.getOrDefault(key, type, defaultValue);
     }
 
     @SuppressWarnings("unchecked")
 	@Override
     public <T> T get(String key, Class<T> type) {
-        return (T) get(key, TypeLiteral.of(type));
+        return snapshot.get(key, type);
     }
 
-    /**
-     * Accesses the current String createValue for the given key and tries to convert it
-     * using the {@link org.apache.tamaya.spi.PropertyConverter} instances provided by the current
-     * {@link org.apache.tamaya.spi.ConfigurationContext}.
-     *
-     * @param key  the property's absolute, or relative path, e.g. @code
-     *             a/b/c/d.myProperty}.
-     * @param type The target type required, not null.
-     * @param <T>  the createValue type
-     * @return the converted createValue, never null.
-     */
     @Override
     public <T> T get(String key, TypeLiteral<T> type) {
-        String value = get(key);
-        if (value != null) {
-            List<PropertyConverter<T>> converters = getContext()
-                    .getPropertyConverters(type);
-            ConversionContext context = new ConversionContext.Builder(this, key,type).build();
-            for (PropertyConverter<T> converter : converters) {
-                try {
-                    T t = converter.convert(value, context);
-                    if (t != null) {
-                        return t;
-                    }
-                } catch (Exception e) {
-                    Logger.getLogger(getClass().getName())
-                            .log(Level.FINEST, "PropertyConverter: " + converter + " failed to convert createValue: " + value,
-                                    e);
-                }
-            }
-            throw new ConfigException("Unparseable config createValue for type: " + type.getRawType().getName() + ": " + key
-                    + ", supported formats: " + context.getSupportedFormats());
-        }
-
-        return null;
+        return snapshot.get(key, type);
     }
 
     @Override
     public <T> T getOrDefault(String key, TypeLiteral<T> type, T defaultValue) {
-        T val = get(key, type);
-        if(val==null){
-            return defaultValue;
-        }
-        return val;
+        return snapshot.getOrDefault(key, type, defaultValue);
     }
 
     @Override
     public Map<String, String> getProperties() {
-        return properties;
+        return snapshot.getProperties();
     }
 
     @Override
-    public Configuration with(ConfigOperator operator) {
-        return operator.operate(this);
+    public ConfigurationContext getContext() {
+        return snapshot.getContext();
     }
 
     @Override
-    public <T> T query(ConfigQuery<T> query) {
-        return query.query(this);
+    public ConfigurationSnapshot getSnapshot(Iterable<String> keys) {
+        return this.snapshot.getSnapshot(keys);
     }
 
-    @Override
-    public ConfigurationContext getContext() {
-        return ConfigurationFunctions.emptyConfigurationContext();
+    /**
+     * <p>Returns the moment in time when this frozen configuration has been created.</p>
+     *
+     * <p>The time is taken from {@linkplain System#currentTimeMillis()}</p>
+     *
+     * @see System#currentTimeMillis()
+     * @return the moment in time when this configuration has been created
+     */
+    public long getFrozenAt() {
+        return snapshot.getTimestamp();
+    }
+
+    /**
+     * <p>Returns the unique id of this frozen configuration.</p>
+     *
+     * @return the unique id of this frozen configuration, never {@code null}
+     */
+    public UUID getId() {
+        return id;
     }
 
     @Override
@@ -177,50 +170,18 @@ public final class FrozenConfiguration implements Configuration, Serializable {
 
         FrozenConfiguration that = (FrozenConfiguration) o;
 
-        if (frozenAt != that.frozenAt) {
-            return false;
-        }
-        if (properties != null ? !properties.equals(that.properties) : that.properties != null) {
-            return false;
-        }
-        return id != null ? id.equals(that.id) : that.id == null;
+        return Objects.equals(id, that.id);
     }
 
     @Override
     public int hashCode() {
-        int result = properties != null ? properties.hashCode() : 0;
-        result = 31 * result + (int) (frozenAt ^ (frozenAt >>> 32));
-        result = 31 * result + (id != null ? id.hashCode() : 0);
-        return result;
+        return Objects.hash(snapshot);
     }
 
     @Override
     public String toString() {
         return "FrozenConfiguration{" +
-                "id=" + getId() + "," +
-                "frozenAt=" + getFrozenAt() + "," +
-                "properties=" + properties +
+                "snapshot=" + snapshot + "," +
                 '}';
     }
-
-    /**
-     * <p>Returns the moment in time when this frozen configuration has been created.</p>
-     *
-     * <p>The time is taken from {@linkplain System#currentTimeMillis()}</p>
-     *
-     * @see System#currentTimeMillis()
-     * @return the moment in time when this configuration has been created
-     */
-    public long getFrozenAt() {
-        return frozenAt;
-    }
-
-    /**
-     * <p>Returns the unique id of this frozen configuration.</p>
-     *
-     * @return the unique id of this frozen configuration, never {@code null}
-     */
-    public UUID getId() {
-        return id;
-    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/events/src/main/java/org/apache/tamaya/events/FrozenPropertySource.java
----------------------------------------------------------------------
diff --git a/modules/events/src/main/java/org/apache/tamaya/events/FrozenPropertySource.java b/modules/events/src/main/java/org/apache/tamaya/events/FrozenPropertySource.java
index 65da582..f5a3086 100644
--- a/modules/events/src/main/java/org/apache/tamaya/events/FrozenPropertySource.java
+++ b/modules/events/src/main/java/org/apache/tamaya/events/FrozenPropertySource.java
@@ -20,66 +20,65 @@ package org.apache.tamaya.events;
 
 import org.apache.tamaya.spi.PropertySource;
 import org.apache.tamaya.spi.PropertyValue;
-import org.apache.tamaya.spisupport.PropertySourceComparator;
+import org.apache.tamaya.spisupport.DefaultPropertySourceSnapshot;
 
 import java.io.Serializable;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 
 /**
  * PropertySource implementation that stores all current values of a given (possibly dynamic, contextual and non server
  * capable instance) and is fully serializable. Note that hereby only the scannable key/createValue pairs are considered.
+ * @deprecated
  */
+@Deprecated
 public final class FrozenPropertySource implements PropertySource, Serializable {
-    private static final long serialVersionUID = -6373137316556444171L;
-    /**
-     * The ordinal.
-     */
-    private final int ordinal;
-    /**
-     * The properties read.
-     */
-    private Map<String, PropertyValue> properties = new HashMap<>();
-    /**
-     * The PropertySource's name.
-     */
-    private final String name;
+    private static final long serialVersionUID = -6373137316556444172L;
 
-    private long frozenAt = System.currentTimeMillis();
+    private DefaultPropertySourceSnapshot snapshot;
 
     /**
      * Constructor.
      *
-     * @param propertySource The base PropertySource.
+     * @param snapshot The base snapshot.
      */
-    private FrozenPropertySource(PropertySource propertySource) {
-        this.properties.putAll(propertySource.getProperties());
-        this.properties = Collections.unmodifiableMap(this.properties);
-        this.ordinal = PropertySourceComparator.getOrdinal(propertySource);
-        this.name = propertySource.getName();
+    private FrozenPropertySource(DefaultPropertySourceSnapshot snapshot) {
+        this.snapshot = snapshot;
     }
 
     /**
-     * Creates a new FrozenPropertySource instance based on a PropertySource given.
+     * Creates a new FrozenPropertySource instance based on a PropertySource and the target key set given. This method
+     * uses all keys available in the property map.
      *
      * @param propertySource the property source to be frozen, not null.
      * @return the frozen property source.
      */
     public static FrozenPropertySource of(PropertySource propertySource) {
-        if (propertySource instanceof FrozenPropertySource) {
-            return (FrozenPropertySource) propertySource;
-        }
-        return new FrozenPropertySource(propertySource);
+        return new FrozenPropertySource(DefaultPropertySourceSnapshot.of(propertySource));
+    }
+
+    /**
+     * Creates a new FrozenPropertySource instance based on a PropertySource and the target key set given.
+     *
+     * @param propertySource the property source to be frozen, not null.
+     * @param keys the keys to be evaluated for the snapshot. Only these keys will be contained in the resulting
+     *             snapshot.
+     * @return the frozen property source.
+     */
+    public static FrozenPropertySource of(PropertySource propertySource, Iterable<String> keys) {
+        return new FrozenPropertySource(DefaultPropertySourceSnapshot.of(propertySource, keys));
+    }
+
+    public Set<String> getKeys() {
+        return snapshot.getKeys();
     }
 
     @Override
     public String getName() {
-        return this.name;
+        return this.snapshot.getName();
     }
 
     public int getOrdinal() {
-        return this.ordinal;
+        return this.snapshot.getOrdinal();
     }
 
     /**
@@ -87,22 +86,17 @@ public final class FrozenPropertySource implements PropertySource, Serializable
      * @return the creation timestamp
      */
     public long getFrozenAt(){
-        return frozenAt;
+        return snapshot.getFrozenAt();
     }
 
     @Override
     public PropertyValue get(String key) {
-        return this.properties.get(key);
+        return snapshot.get(key);
     }
 
     @Override
     public Map<String, PropertyValue> getProperties() {
-        return properties;
-    }
-
-    @Override
-    public boolean isScannable() {
-        return true;
+        return snapshot.getProperties();
     }
 
     @Override
@@ -114,22 +108,18 @@ public final class FrozenPropertySource implements PropertySource, Serializable
             return false;
         }
         FrozenPropertySource that = (FrozenPropertySource) o;
-        return ordinal == that.ordinal && properties.equals(that.properties);
+        return Objects.equals(snapshot, that.snapshot);
     }
 
     @Override
     public int hashCode() {
-        int result = ordinal;
-        result = 31 * result + properties.hashCode();
-        return result;
+        return snapshot.hashCode();
     }
 
     @Override
     public String toString() {
         return "FrozenPropertySource{" +
-                "name=" + name +
-                ", ordinal=" + ordinal +
-                ", properties=" + properties +
+                "snapshot=" + snapshot +
                 '}';
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/events/src/main/java/org/apache/tamaya/events/PropertySourceChange.java
----------------------------------------------------------------------
diff --git a/modules/events/src/main/java/org/apache/tamaya/events/PropertySourceChange.java b/modules/events/src/main/java/org/apache/tamaya/events/PropertySourceChange.java
index d256713..d7804f1 100644
--- a/modules/events/src/main/java/org/apache/tamaya/events/PropertySourceChange.java
+++ b/modules/events/src/main/java/org/apache/tamaya/events/PropertySourceChange.java
@@ -19,6 +19,7 @@
 package org.apache.tamaya.events;
 
 import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spisupport.DefaultPropertySourceSnapshot;
 
 import java.beans.PropertyChangeEvent;
 import java.io.Serializable;
@@ -39,7 +40,7 @@ public final class PropertySourceChange implements ConfigEvent<PropertySource>,
 
     private static final long serialVersionUID = 1L;
     /** The base property provider/configuration. */
-    private final FrozenPropertySource propertySource;
+    private final DefaultPropertySourceSnapshot propertySource;
     /** The base version, usable for optimistic locking. */
     private String version = UUID.randomUUID().toString();
     /** The timestamp of the change setCurrent in millis from the epoch. */
@@ -52,7 +53,7 @@ public final class PropertySourceChange implements ConfigEvent<PropertySource>,
      * @param builder The builder used, not null.
      */
     PropertySourceChange(PropertySourceChangeBuilder builder) {
-        this.propertySource = FrozenPropertySource.of(builder.source);
+        this.propertySource = new DefaultPropertySourceSnapshot(builder.source);
         for (PropertyChangeEvent c : builder.delta.values()) {
             this.changes.put(c.getPropertyName(), c);
         }

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/events/src/main/java/org/apache/tamaya/events/internal/DefaultConfigChangeObserver.java
----------------------------------------------------------------------
diff --git a/modules/events/src/main/java/org/apache/tamaya/events/internal/DefaultConfigChangeObserver.java b/modules/events/src/main/java/org/apache/tamaya/events/internal/DefaultConfigChangeObserver.java
index ebfa356..b6aa9cd 100644
--- a/modules/events/src/main/java/org/apache/tamaya/events/internal/DefaultConfigChangeObserver.java
+++ b/modules/events/src/main/java/org/apache/tamaya/events/internal/DefaultConfigChangeObserver.java
@@ -19,6 +19,7 @@
 package org.apache.tamaya.events.internal;
 
 import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationSnapshot;
 import org.apache.tamaya.events.ConfigEventManager;
 import org.apache.tamaya.events.ConfigurationChange;
 import org.apache.tamaya.events.ConfigurationChangeBuilder;
@@ -40,7 +41,7 @@ public class DefaultConfigChangeObserver {
 
     private long checkPeriod = 2000L;
 
-    private volatile FrozenConfiguration lastConfig;
+    private volatile ConfigurationSnapshot lastConfig;
 
     private volatile boolean running;
 
@@ -64,7 +65,7 @@ public class DefaultConfigChangeObserver {
 
     public void checkConfigurationUpdate() {
         LOG.finest("Checking configuration for changes...");
-        FrozenConfiguration frozenConfig = FrozenConfiguration.of(Configuration.current(classLoader));
+        ConfigurationSnapshot frozenConfig = Configuration.current(classLoader).getSnapshot();
         ConfigurationChange changes;
 
         if (getLastConfig() != null) {
@@ -78,11 +79,11 @@ public class DefaultConfigChangeObserver {
         setLastConfig(frozenConfig);
     }
 
-    protected FrozenConfiguration getLastConfig() {
+    protected ConfigurationSnapshot getLastConfig() {
         return lastConfig;
     }
 
-    protected void setLastConfig(FrozenConfiguration newConfiguration) {
+    protected void setLastConfig(ConfigurationSnapshot newConfiguration) {
         lastConfig = newConfiguration;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/events/src/test/java/org/apache/tamaya/events/ConfigurationChangeTest.java
----------------------------------------------------------------------
diff --git a/modules/events/src/test/java/org/apache/tamaya/events/ConfigurationChangeTest.java b/modules/events/src/test/java/org/apache/tamaya/events/ConfigurationChangeTest.java
index fd7fb0b..203f058 100644
--- a/modules/events/src/test/java/org/apache/tamaya/events/ConfigurationChangeTest.java
+++ b/modules/events/src/test/java/org/apache/tamaya/events/ConfigurationChangeTest.java
@@ -19,7 +19,6 @@
 package org.apache.tamaya.events;
 
 import org.apache.tamaya.Configuration;
-import org.apache.tamaya.ConfigurationProvider;
 import org.junit.Test;
 
 import java.util.Map;
@@ -48,7 +47,7 @@ public class ConfigurationChangeTest {
         assertTrue(change.getRemovedSize()==0);
         assertTrue(change.getChanges().size()==0);
         for (Map.Entry<String, String> en : config.getProperties().entrySet()) {
-            if (!"[getMeta]frozenAt".equals(en.getKey())) {
+            if (!"[meta]frozenAt".equals(en.getKey())) {
                 if(en.getKey().contains("random.new")){ // dynamic generated createValue!
                     continue;
                 }
@@ -156,7 +155,7 @@ public class ConfigurationChangeTest {
                 change.toString();
         assertTrue(toString.contains("timestamp"));
         assertTrue(toString.contains("change-id"));
-        assertTrue(toString.contains("configuration-id"));
+        assertTrue(toString.contains("snapshot-id"));
         assertFalse(toString.contains("key1"));
         assertFalse(toString.contains("key2"));
     }

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/events/src/test/java/org/apache/tamaya/events/FrozenConfigurationTest.java
----------------------------------------------------------------------
diff --git a/modules/events/src/test/java/org/apache/tamaya/events/FrozenConfigurationTest.java b/modules/events/src/test/java/org/apache/tamaya/events/FrozenConfigurationTest.java
index 3ad8f12..568350a 100644
--- a/modules/events/src/test/java/org/apache/tamaya/events/FrozenConfigurationTest.java
+++ b/modules/events/src/test/java/org/apache/tamaya/events/FrozenConfigurationTest.java
@@ -19,9 +19,14 @@
 package org.apache.tamaya.events;
 
 import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationSnapshot;
+import org.apache.tamaya.spi.ConfigurationContext;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.mockito.Mockito;
+import org.omg.CORBA.Any;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -31,24 +36,12 @@ import static org.mockito.Mockito.doReturn;
 public class FrozenConfigurationTest {
 
     @Test
-    public void getFrozenAtReturnsTheCorrectTimestamp() {
-        Configuration source = Mockito.mock(Configuration.class);
-
-        long poiStart = System.nanoTime();
-
-        FrozenConfiguration fc = FrozenConfiguration.of(source);
-
-        long poiEnd = System.nanoTime();
-
-        assertThat(fc.getFrozenAt()).isGreaterThan(poiStart)
-                                    .isLessThan(poiEnd);
-    }
-
-
-    @Test
     public void idMustBeNotNull() {
         Configuration source = Mockito.mock(Configuration.class);
 
+        Mockito.when(source.getContext()).thenReturn(ConfigurationContext.EMPTY);
+        Mockito.when(source.getProperties()).thenReturn(Collections.emptyMap());
+
         FrozenConfiguration fc = FrozenConfiguration.of(source);
 
         assertThat(fc.getId()).isNotNull();
@@ -63,6 +56,7 @@ public class FrozenConfigurationTest {
         properties.put("key", "createValue");
 
         Configuration configuration = Mockito.mock(Configuration.class);
+        Mockito.when(configuration.getContext()).thenReturn(ConfigurationContext.EMPTY);
         doReturn(properties).when(configuration).getProperties();
 
         FrozenConfiguration fcA = FrozenConfiguration.of(configuration);

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/events/src/test/java/org/apache/tamaya/events/RandomPropertySource.java
----------------------------------------------------------------------
diff --git a/modules/events/src/test/java/org/apache/tamaya/events/RandomPropertySource.java b/modules/events/src/test/java/org/apache/tamaya/events/RandomPropertySource.java
index 36bcaaa..6b77d07 100644
--- a/modules/events/src/test/java/org/apache/tamaya/events/RandomPropertySource.java
+++ b/modules/events/src/test/java/org/apache/tamaya/events/RandomPropertySource.java
@@ -44,7 +44,7 @@ public class RandomPropertySource implements PropertySource{
     @Override
     public PropertyValue get(String key) {
         if(key.equals("random.new")){
-            return PropertyValue.of(key, String.valueOf(Math.random()),getName());
+            return PropertyValue.createValue(key, String.valueOf(Math.random()));
         }
         return null;
     }
@@ -52,14 +52,10 @@ public class RandomPropertySource implements PropertySource{
     @Override
     public Map<String, PropertyValue> getProperties() {
         synchronized(data) {
-            data.put("random.new", PropertyValue.of("random.new", String.valueOf(Math.random()), getName())
+            data.put("random.new", PropertyValue.createValue("random.new", String.valueOf(Math.random()))
             .setMeta("_random.new.timestamp", String.valueOf(System.currentTimeMillis())));
             return new HashMap<>(data);
         }
     }
 
-    @Override
-    public boolean isScannable() {
-        return true;
-    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/events/src/test/java/org/apache/tamaya/events/TestConfigView.java
----------------------------------------------------------------------
diff --git a/modules/events/src/test/java/org/apache/tamaya/events/TestConfigView.java b/modules/events/src/test/java/org/apache/tamaya/events/TestConfigView.java
index 0e9c340..8019796 100644
--- a/modules/events/src/test/java/org/apache/tamaya/events/TestConfigView.java
+++ b/modules/events/src/test/java/org/apache/tamaya/events/TestConfigView.java
@@ -18,11 +18,7 @@
  */
 package org.apache.tamaya.events;
 
-import org.apache.tamaya.ConfigException;
-import org.apache.tamaya.ConfigOperator;
-import org.apache.tamaya.ConfigQuery;
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.TypeLiteral;
+import org.apache.tamaya.*;
 import org.apache.tamaya.spi.ConfigurationContext;
 import org.apache.tamaya.spi.ConversionContext;
 import org.apache.tamaya.spi.PropertyConverter;
@@ -30,24 +26,25 @@ import org.apache.tamaya.spi.PropertyConverter;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.function.UnaryOperator;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
 /**
  * Created by Anatole on 24.03.2015.
  */
-public class TestConfigView implements ConfigOperator{
+public class TestConfigView implements UnaryOperator<Configuration> {
 
     private static final TestConfigView INSTANCE = new TestConfigView();
 
     private TestConfigView(){}
 
-    public static ConfigOperator of(){
+    public static TestConfigView of(){
         return INSTANCE;
     }
 
     @Override
-    public Configuration operate(final Configuration config) {
+    public Configuration apply(final Configuration config) {
         return new Configuration() {
             @Override
             public Map<String, String> getProperties() {
@@ -58,26 +55,19 @@ public class TestConfigView implements ConfigOperator{
                     }
                 }
                 return result;
-//                return config.getProperties().entrySet().stream().filter(e -> e.getKey().startsWith("test")).collect(
-//                        Collectors.toMap(en -> en.getKey(), en -> en.getProperty()));
             }
 
             @Override
-            public Configuration with(ConfigOperator operator) {
-                return null;
+            public ConfigurationContext getContext() {
+                return config.getContext();
             }
 
             @Override
-            public <T> T query(ConfigQuery<T> query) {
+            public ConfigurationSnapshot getSnapshot(Iterable<String> keys) {
                 return null;
             }
 
             @Override
-            public ConfigurationContext getContext() {
-                return config.getContext();
-            }
-
-            @Override
             public String get(String key) {
                 return getProperties().get(key);
             }

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/events/src/test/java/org/apache/tamaya/events/folderobserver/ObservingPropertySourceProvider.java
----------------------------------------------------------------------
diff --git a/modules/events/src/test/java/org/apache/tamaya/events/folderobserver/ObservingPropertySourceProvider.java b/modules/events/src/test/java/org/apache/tamaya/events/folderobserver/ObservingPropertySourceProvider.java
index 8cb4d8d..c1393ad 100644
--- a/modules/events/src/test/java/org/apache/tamaya/events/folderobserver/ObservingPropertySourceProvider.java
+++ b/modules/events/src/test/java/org/apache/tamaya/events/folderobserver/ObservingPropertySourceProvider.java
@@ -137,7 +137,7 @@ public class ObservingPropertySourceProvider implements PropertySourceProvider,
             final Map<String,PropertyValue> result = new HashMap<>();
             for(final Map.Entry<Object,Object> en:props.entrySet()){
                 String key = String.valueOf(en.getKey());
-                result.put(key, PropertyValue.of(key, String.valueOf(en.getValue()), file.toString()));
+                result.put(key, PropertyValue.createValue(key, String.valueOf(en.getValue())).setMeta("source", file.toString()));
             }
             return result;
         } catch (final Exception e) {

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/events/src/test/java/org/apache/tamaya/events/internal/DefaultConfigChangeObserverTest.java
----------------------------------------------------------------------
diff --git a/modules/events/src/test/java/org/apache/tamaya/events/internal/DefaultConfigChangeObserverTest.java b/modules/events/src/test/java/org/apache/tamaya/events/internal/DefaultConfigChangeObserverTest.java
index 4aab1b8..b5d7f69 100644
--- a/modules/events/src/test/java/org/apache/tamaya/events/internal/DefaultConfigChangeObserverTest.java
+++ b/modules/events/src/test/java/org/apache/tamaya/events/internal/DefaultConfigChangeObserverTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tamaya.events.internal;
 
-import org.apache.tamaya.events.FrozenConfiguration;
+import org.apache.tamaya.ConfigurationSnapshot;
 import org.apache.tamaya.spi.ServiceContextManager;
 import org.junit.Test;
 
@@ -74,9 +74,9 @@ public class DefaultConfigChangeObserverTest {
 
         observer.checkConfigurationUpdate();
 
-        FrozenConfiguration config1 = observer.getLastConfig();
+        ConfigurationSnapshot config1 = observer.getLastConfig();
         observer.checkConfigurationUpdate();
-        FrozenConfiguration config2 = observer.getLastConfig();
+        ConfigurationSnapshot config2 = observer.getLastConfig();
 
         assertThat(config1).describedAs("After the firt check last configuration must be setCurrent.")
                                             .isNotEqualTo(config2);

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/functions/src/main/java/org/apache/tamaya/functions/CombinedConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/functions/src/main/java/org/apache/tamaya/functions/CombinedConfiguration.java b/modules/functions/src/main/java/org/apache/tamaya/functions/CombinedConfiguration.java
index 28fed46..16e6825 100644
--- a/modules/functions/src/main/java/org/apache/tamaya/functions/CombinedConfiguration.java
+++ b/modules/functions/src/main/java/org/apache/tamaya/functions/CombinedConfiguration.java
@@ -19,8 +19,10 @@
 package org.apache.tamaya.functions;
 
 import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationSnapshot;
 import org.apache.tamaya.TypeLiteral;
 import org.apache.tamaya.spi.ConfigurationContext;
+import org.apache.tamaya.spisupport.DefaultConfigurationSnapshot;
 
 import java.util.*;
 
@@ -150,6 +152,11 @@ class CombinedConfiguration implements Configuration{
     }
 
     @Override
+    public ConfigurationSnapshot getSnapshot(Iterable<String> keys) {
+        return new DefaultConfigurationSnapshot(this, keys);
+    }
+
+    @Override
     public String toString() {
         return "CombinedConfiguration{" +
                 "name='" + name + '\'' +

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigWrappingPropertySource.java
----------------------------------------------------------------------
diff --git a/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigWrappingPropertySource.java b/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigWrappingPropertySource.java
index dbad205..17c2ffb 100644
--- a/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigWrappingPropertySource.java
+++ b/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigWrappingPropertySource.java
@@ -73,11 +73,6 @@ final class ConfigWrappingPropertySource implements PropertySource {
     }
 
     @Override
-    public boolean isScannable() {
-        return true;
-    }
-
-    @Override
     public String toString(){
         return "ConfigWrappingPropertySource(name="+name+", ordinal="+ordinal+", config="+config+")";
     }

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/functions/src/main/java/org/apache/tamaya/functions/EnrichedConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/functions/src/main/java/org/apache/tamaya/functions/EnrichedConfiguration.java b/modules/functions/src/main/java/org/apache/tamaya/functions/EnrichedConfiguration.java
index 2b6aac1..ace5dec 100644
--- a/modules/functions/src/main/java/org/apache/tamaya/functions/EnrichedConfiguration.java
+++ b/modules/functions/src/main/java/org/apache/tamaya/functions/EnrichedConfiguration.java
@@ -18,11 +18,9 @@
  */
 package org.apache.tamaya.functions;
 
-import org.apache.tamaya.ConfigOperator;
-import org.apache.tamaya.ConfigQuery;
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.TypeLiteral;
+import org.apache.tamaya.*;
 import org.apache.tamaya.spi.ConfigurationContext;
+import org.apache.tamaya.spisupport.DefaultConfigurationSnapshot;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -155,18 +153,13 @@ class EnrichedConfiguration implements Configuration {
     }
 
     @Override
-    public Configuration with(ConfigOperator operator) {
-        return operator.operate(this);
-    }
-
-    @Override
-    public <T> T query(ConfigQuery<T> query) {
-        return query.query(this);
+    public ConfigurationContext getContext() {
+        return baseConfiguration.getContext();
     }
 
     @Override
-    public ConfigurationContext getContext() {
-        return baseConfiguration.getContext();
+    public ConfigurationSnapshot getSnapshot(Iterable<String> keys) {
+        return new DefaultConfigurationSnapshot(this, keys);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/functions/src/main/java/org/apache/tamaya/functions/FilteredConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/functions/src/main/java/org/apache/tamaya/functions/FilteredConfiguration.java b/modules/functions/src/main/java/org/apache/tamaya/functions/FilteredConfiguration.java
index 2f441dc..bf6401e 100644
--- a/modules/functions/src/main/java/org/apache/tamaya/functions/FilteredConfiguration.java
+++ b/modules/functions/src/main/java/org/apache/tamaya/functions/FilteredConfiguration.java
@@ -19,8 +19,10 @@
 package org.apache.tamaya.functions;
 
 import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationSnapshot;
 import org.apache.tamaya.TypeLiteral;
 import org.apache.tamaya.spi.ConfigurationContext;
+import org.apache.tamaya.spisupport.DefaultConfigurationSnapshot;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -104,6 +106,11 @@ class FilteredConfiguration implements Configuration {
     }
 
     @Override
+    public ConfigurationSnapshot getSnapshot(Iterable<String> keys) {
+        return new DefaultConfigurationSnapshot(this, keys);
+    }
+
+    @Override
     public String toString() {
         return "FilteredConfiguration{" +
                 "baseConfiguration=" + baseConfiguration +

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/functions/src/main/java/org/apache/tamaya/functions/MappedConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/functions/src/main/java/org/apache/tamaya/functions/MappedConfiguration.java b/modules/functions/src/main/java/org/apache/tamaya/functions/MappedConfiguration.java
index 49125ed..71b73a1 100644
--- a/modules/functions/src/main/java/org/apache/tamaya/functions/MappedConfiguration.java
+++ b/modules/functions/src/main/java/org/apache/tamaya/functions/MappedConfiguration.java
@@ -19,8 +19,10 @@
 package org.apache.tamaya.functions;
 
 import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationSnapshot;
 import org.apache.tamaya.TypeLiteral;
 import org.apache.tamaya.spi.ConfigurationContext;
+import org.apache.tamaya.spisupport.DefaultConfigurationSnapshot;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -113,6 +115,11 @@ class MappedConfiguration implements Configuration {
     }
 
     @Override
+    public ConfigurationSnapshot getSnapshot(Iterable<String> keys) {
+        return new DefaultConfigurationSnapshot(this, keys);
+    }
+
+    @Override
     public String toString() {
         return "FilteredConfiguration{" +
                 "baseConfiguration=" + baseConfiguration +

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/functions/src/main/java/org/apache/tamaya/functions/PropertySourceFunctions.java
----------------------------------------------------------------------
diff --git a/modules/functions/src/main/java/org/apache/tamaya/functions/PropertySourceFunctions.java b/modules/functions/src/main/java/org/apache/tamaya/functions/PropertySourceFunctions.java
index c349370..bed38f1 100644
--- a/modules/functions/src/main/java/org/apache/tamaya/functions/PropertySourceFunctions.java
+++ b/modules/functions/src/main/java/org/apache/tamaya/functions/PropertySourceFunctions.java
@@ -57,11 +57,6 @@ public final class PropertySourceFunctions {
         }
 
         @Override
-        public boolean isScannable() {
-            return true;
-        }
-
-        @Override
         public String toString() {
             return "PropertySource<empty>";
         }

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/functions/src/test/java/org/apache/tamaya/functions/CombinedConfigurationTest.java
----------------------------------------------------------------------
diff --git a/modules/functions/src/test/java/org/apache/tamaya/functions/CombinedConfigurationTest.java b/modules/functions/src/test/java/org/apache/tamaya/functions/CombinedConfigurationTest.java
index a850493..cac3e51 100644
--- a/modules/functions/src/test/java/org/apache/tamaya/functions/CombinedConfigurationTest.java
+++ b/modules/functions/src/test/java/org/apache/tamaya/functions/CombinedConfigurationTest.java
@@ -122,7 +122,7 @@ public class CombinedConfigurationTest {
         assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
             @Override
             public void call() throws Throwable {
-                cc.getOrDefault(null, "d");
+                cc.getOrDefault((String)null, "d");
             }
         }).isInstanceOf(NullPointerException.class)
           .hasMessage("Key must be given.");
@@ -176,7 +176,7 @@ public class CombinedConfigurationTest {
         assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
             @Override
             public void call() throws Throwable {
-                cc.getOrDefault(null, TypeLiteral.of(Integer.class), 1);
+                cc.getOrDefault((String)null, TypeLiteral.of(Integer.class), 1);
             }
         }).isInstanceOf(NullPointerException.class)
           .hasMessage("Key must be given.");
@@ -252,7 +252,7 @@ public class CombinedConfigurationTest {
         assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
             @Override
             public void call() throws Throwable {
-                cc.getOrDefault(null, Integer.class, 1);
+                cc.getOrDefault((String)null, Integer.class, 1);
             }
         }).isInstanceOf(NullPointerException.class)
           .hasMessage("Key must be given.");

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/functions/src/test/java/org/apache/tamaya/functions/EnrichedConfigurationTest.java
----------------------------------------------------------------------
diff --git a/modules/functions/src/test/java/org/apache/tamaya/functions/EnrichedConfigurationTest.java b/modules/functions/src/test/java/org/apache/tamaya/functions/EnrichedConfigurationTest.java
index 6c9a3ce..a66376b 100644
--- a/modules/functions/src/test/java/org/apache/tamaya/functions/EnrichedConfigurationTest.java
+++ b/modules/functions/src/test/java/org/apache/tamaya/functions/EnrichedConfigurationTest.java
@@ -53,7 +53,7 @@ public class EnrichedConfigurationTest {
         assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
             @Override
             public void call() throws Throwable {
-                sut.get(null);
+                sut.get((String)null);
             }
         }).isInstanceOf(NullPointerException.class)
           .hasMessage("Key must be given.");
@@ -186,7 +186,7 @@ public class EnrichedConfigurationTest {
         assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
             @Override
             public void call() throws Throwable {
-                sut.getOrDefault(null, "v");
+                sut.getOrDefault((String)null, "v");
             }
         }).isInstanceOf(NullPointerException.class)
           .hasMessage("Key must be given.");

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/functions/src/test/java/org/apache/tamaya/functions/MappedConfigurationTest.java
----------------------------------------------------------------------
diff --git a/modules/functions/src/test/java/org/apache/tamaya/functions/MappedConfigurationTest.java b/modules/functions/src/test/java/org/apache/tamaya/functions/MappedConfigurationTest.java
index 2a470a2..02fee55 100644
--- a/modules/functions/src/test/java/org/apache/tamaya/functions/MappedConfigurationTest.java
+++ b/modules/functions/src/test/java/org/apache/tamaya/functions/MappedConfigurationTest.java
@@ -45,7 +45,7 @@ public class MappedConfigurationTest {
         MappedConfiguration mc = mock(MappedConfiguration.class);
         doCallRealMethod().when(mc).getOrDefault(anyString(), anyString());
 
-        mc.getOrDefault(null, "z");
+        mc.getOrDefault((String)null, "z");
     }
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfig.java
----------------------------------------------------------------------
diff --git a/modules/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfig.java b/modules/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfig.java
index 103a8af..9ff395e 100644
--- a/modules/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfig.java
+++ b/modules/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfig.java
@@ -88,7 +88,7 @@ public class MicroprofileConfig implements Config, Serializable {
 
     private void writeObject(ObjectOutputStream out) throws IOException{
         if(!(this.delegate instanceof Serializable)){
-            out.writeObject(FrozenConfiguration.of(this.delegate));
+            out.writeObject(this.delegate.getSnapshot());
         }else {
             out.writeObject(this.delegate);
         }

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/e190b34f/modules/microprofile/src/main/java/org/apache/tamaya/microprofile/TamayaConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/microprofile/src/main/java/org/apache/tamaya/microprofile/TamayaConfiguration.java b/modules/microprofile/src/main/java/org/apache/tamaya/microprofile/TamayaConfiguration.java
index c16aa63..8d202cb 100644
--- a/modules/microprofile/src/main/java/org/apache/tamaya/microprofile/TamayaConfiguration.java
+++ b/modules/microprofile/src/main/java/org/apache/tamaya/microprofile/TamayaConfiguration.java
@@ -20,6 +20,7 @@ package org.apache.tamaya.microprofile;
 
 import org.apache.tamaya.*;
 import org.apache.tamaya.spi.ConfigurationContext;
+import org.apache.tamaya.spisupport.DefaultConfigurationSnapshot;
 import org.eclipse.microprofile.config.Config;
 
 import java.util.*;
@@ -80,4 +81,14 @@ public class TamayaConfiguration implements Configuration{
     public ConfigurationContext getContext() {
         return ConfigurationContext.EMPTY;
     }
+
+    @Override
+    public ConfigurationSnapshot getSnapshot(Iterable<String> keys) {
+        return new DefaultConfigurationSnapshot(this, keys);
+    }
+
+    @Override
+    public ConfigurationSnapshot getSnapshot() {
+        return new DefaultConfigurationSnapshot(this);
+    }
 }