diff --git a/observable/pom.xml b/observable/pom.xml
index 0c99b05..372944b 100644
--- a/observable/pom.xml
+++ b/observable/pom.xml
@@ -1,25 +1,29 @@
-
-
- 4.0.0
-
- io.github.m-m-m
- mmm-value-parent
- ${revision}
-
- mmm-value-observable
- jar
- ${project.artifactId}
- Java module providing observable values.
-
-
-
- ${project.groupId}
- mmm-value
-
-
- ${project.groupId}
- mmm-event
-
-
-
+
+
+ 4.0.0
+
+ io.github.m-m-m
+ mmm-value-parent
+ ${revision}
+
+ mmm-value-observable
+ jar
+ ${project.artifactId}
+ Java module providing observable values.
+
+
+
+ ${project.groupId}
+ mmm-value
+
+
+ ${project.groupId}
+ mmm-event
+
+
+ ${project.groupId}
+ mmm-base
+
+
+
diff --git a/observable/src/main/java/io/github/mmm/value/observable/container/list/ChangeAwareLists.java b/observable/src/main/java/io/github/mmm/value/observable/container/list/ChangeAwareLists.java
index af194d0..5588984 100644
--- a/observable/src/main/java/io/github/mmm/value/observable/container/list/ChangeAwareLists.java
+++ b/observable/src/main/java/io/github/mmm/value/observable/container/list/ChangeAwareLists.java
@@ -1,79 +1,94 @@
-/* Copyright (c) The m-m-m Team, Licensed under the Apache License, Version 2.0
- * http://www.apache.org/licenses/LICENSE-2.0 */
-package io.github.mmm.value.observable.container.list;
-
-import java.util.List;
-
-import io.github.mmm.value.observable.container.list.impl.ChangeAwareListImpl;
-import io.github.mmm.value.observable.container.list.impl.EmptyChangeAwareList;
-import io.github.mmm.value.observable.container.list.impl.ImmutableChangeAwareList;
-
-/**
- * Factory for {@link ChangeAwareList}.
- *
- * @since 1.0.0
- */
-public final class ChangeAwareLists {
-
- private ChangeAwareLists() {
-
- super();
- }
-
- /**
- * @param the type of the elements.
- * @return an empty, immutable {@link ChangeAwareList}.
- */
- public static ChangeAwareList empty() {
-
- return EmptyChangeAwareList.INSTANCE;
- }
-
- /**
- * @param the type of the elements.
- * @return a new empty mutable {@link ChangeAwareList}.
- */
- public static ChangeAwareList of() {
-
- return new ChangeAwareListImpl<>();
- }
-
- /**
- * @param the type of the elements.
- * @param capacity the initial capacity of the list.
- * @return a new empty mutable {@link ChangeAwareList}.
- */
- public static ChangeAwareList of(int capacity) {
-
- return new ChangeAwareListImpl<>(capacity);
- }
-
- /**
- * @param the type of the elements.
- * @param list the existing {@link List} implementation to wrap as {@link ChangeAwareList}. Please avoid to modify
- * this {@link List} afterwards, as this will not trigger modification events.
- * @return a new empty mutable {@link ChangeAwareList}.
- */
- public static ChangeAwareList of(List list) {
-
- if (list instanceof ChangeAwareList) {
- return (ChangeAwareList) list;
- }
- return new ChangeAwareListImpl<>(list);
- }
-
- /**
- * @param the type of the elements.
- * @param list the existing {@link List} implementation to wrap as {@link ChangeAwareList}. Please avoid to modify
- * this {@link List} afterwards, as this will not trigger modification events.
- * @return a new empty mutable {@link ChangeAwareList}.
- */
- public static ChangeAwareList ofUnmodifiable(List list) {
-
- if (list instanceof ImmutableChangeAwareList) {
- return (ChangeAwareList) list;
- }
- return new ImmutableChangeAwareList<>(list);
- }
-
-}
+/* Copyright (c) The m-m-m Team, Licensed under the Apache License, Version 2.0
+ * http://www.apache.org/licenses/LICENSE-2.0 */
+package io.github.mmm.value.observable.container.list;
+
+import java.util.List;
+import java.util.function.Supplier;
+
+import io.github.mmm.value.observable.container.list.impl.ChangeAwareListImpl;
+import io.github.mmm.value.observable.container.list.impl.EmptyChangeAwareList;
+import io.github.mmm.value.observable.container.list.impl.ImmutableChangeAwareList;
+import io.github.mmm.value.observable.container.list.impl.ImmutableChangeAwareListView;
+
+/**
+ * Factory for {@link ChangeAwareList}.
+ *
+ * @since 1.0.0
+ */
+public final class ChangeAwareLists {
+
+ private ChangeAwareLists() {
+
+ super();
+ }
+
+ /**
+ * @param the type of the elements.
+ * @return an empty, immutable {@link ChangeAwareList}.
+ */
+ public static ChangeAwareList empty() {
+
+ return EmptyChangeAwareList.INSTANCE;
+ }
+
+ /**
+ * @param the type of the elements.
+ * @return a new empty mutable {@link ChangeAwareList}.
+ */
+ public static ChangeAwareList of() {
+
+ return new ChangeAwareListImpl<>();
+ }
+
+ /**
+ * @param the type of the elements.
+ * @param capacity the initial capacity of the list.
+ * @return a new empty mutable {@link ChangeAwareList}.
+ */
+ public static ChangeAwareList of(int capacity) {
+
+ return new ChangeAwareListImpl<>(capacity);
+ }
+
+ /**
+ * @param the type of the elements.
+ * @param list the existing {@link List} implementation to wrap as {@link ChangeAwareList}. Please avoid to modify
+ * this {@link List} afterwards, as this will not trigger modification events.
+ * @return a new empty mutable {@link ChangeAwareList}.
+ */
+ public static ChangeAwareList of(List list) {
+
+ if (list instanceof ChangeAwareList) {
+ return (ChangeAwareList) list;
+ }
+ return new ChangeAwareListImpl<>(list);
+ }
+
+ /**
+ * @param the type of the elements.
+ * @param list the existing {@link List} implementation to wrap as {@link ChangeAwareList}. Modifying such
+ * {@link List} afterwards will not trigger modification events in the read-only view returned by this method.
+ * @return a unmodifiable {@link ChangeAwareList} that acts as a view on the given {@link List}.
+ */
+ public static ChangeAwareList ofUnmodifiable(List list) {
+
+ if (list instanceof ImmutableChangeAwareList result) {
+ return result;
+ }
+ return new ImmutableChangeAwareList<>(list);
+ }
+
+ /**
+ * @param the type of the elements.
+ * @param listSupplier the {@link Supplier} to the (mutable) {@link List} implementation to wrap as
+ * {@link ChangeAwareList}. Modifying such {@link List} afterwards will not trigger modification events in the
+ * read-only view returned by this method.
+ * @return a unmodifiable {@link ChangeAwareList} that acts as a view on the {@link Supplier#get() supplied}
+ * {@link List}.
+ */
+ public static ChangeAwareList ofUnmodifiable(Supplier> listSupplier) {
+
+ return new ImmutableChangeAwareListView<>(listSupplier);
+ }
+
+}
diff --git a/observable/src/main/java/io/github/mmm/value/observable/container/list/impl/ImmutableChangeAwareList.java b/observable/src/main/java/io/github/mmm/value/observable/container/list/impl/ImmutableChangeAwareList.java
index 5190a49..7a2b494 100644
--- a/observable/src/main/java/io/github/mmm/value/observable/container/list/impl/ImmutableChangeAwareList.java
+++ b/observable/src/main/java/io/github/mmm/value/observable/container/list/impl/ImmutableChangeAwareList.java
@@ -1,65 +1,65 @@
-/* Copyright (c) The m-m-m Team, Licensed under the Apache License, Version 2.0
- * http://www.apache.org/licenses/LICENSE-2.0 */
-package io.github.mmm.value.observable.container.list.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Immutable implementation of {@link io.github.mmm.value.observable.container.list.ChangeAwareList}.
- *
- * @param the type of the elements in the container.
- * @since 1.0.0
- */
-public class ImmutableChangeAwareList extends ReadOnlyChangeAwareList {
-
- private final List list;
-
- /**
- * The constructor.
- *
- * @param list the internal {@link List} to adopt.
- */
- public ImmutableChangeAwareList(List list) {
-
- super();
- this.list = list;
- }
-
- @Override
- public E get(int index) {
-
- return this.list.get(index);
- }
-
- @Override
- public int size() {
-
- return this.list.size();
- }
-
- @Override
- public int indexOf(Object element) {
-
- return this.list.indexOf(element);
- }
-
- @Override
- public int lastIndexOf(Object element) {
-
- return this.list.lastIndexOf(element);
- }
-
- @Override
- public boolean contains(Object element) {
-
- return this.list.contains(element);
- }
-
- @Override
- public boolean containsAll(Collection> collection) {
-
- return this.list.containsAll(collection);
- }
-
-}
+/* Copyright (c) The m-m-m Team, Licensed under the Apache License, Version 2.0
+ * http://www.apache.org/licenses/LICENSE-2.0 */
+package io.github.mmm.value.observable.container.list.impl;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Immutable implementation of {@link io.github.mmm.value.observable.container.list.ChangeAwareList}.
+ *
+ * @param the type of the elements in the container.
+ * @since 1.0.0
+ */
+public class ImmutableChangeAwareList extends ReadOnlyChangeAwareList {
+
+ private final List list;
+
+ /**
+ * The constructor.
+ *
+ * @param list the internal {@link List} to adopt.
+ */
+ public ImmutableChangeAwareList(List list) {
+
+ super();
+ this.list = list;
+ }
+
+ @Override
+ public E get(int index) {
+
+ return this.list.get(index);
+ }
+
+ @Override
+ public int size() {
+
+ return this.list.size();
+ }
+
+ @Override
+ public int indexOf(Object element) {
+
+ return this.list.indexOf(element);
+ }
+
+ @Override
+ public int lastIndexOf(Object element) {
+
+ return this.list.lastIndexOf(element);
+ }
+
+ @Override
+ public boolean contains(Object element) {
+
+ return this.list.contains(element);
+ }
+
+ @Override
+ public boolean containsAll(Collection> collection) {
+
+ return this.list.containsAll(collection);
+ }
+
+}
diff --git a/observable/src/main/java/io/github/mmm/value/observable/container/list/impl/ImmutableChangeAwareListView.java b/observable/src/main/java/io/github/mmm/value/observable/container/list/impl/ImmutableChangeAwareListView.java
new file mode 100644
index 0000000..8d87c5e
--- /dev/null
+++ b/observable/src/main/java/io/github/mmm/value/observable/container/list/impl/ImmutableChangeAwareListView.java
@@ -0,0 +1,66 @@
+/* Copyright (c) The m-m-m Team, Licensed under the Apache License, Version 2.0
+ * http://www.apache.org/licenses/LICENSE-2.0 */
+package io.github.mmm.value.observable.container.list.impl;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.function.Supplier;
+
+/**
+ * Immutable implementation of {@link io.github.mmm.value.observable.container.list.ChangeAwareList}.
+ *
+ * @param the type of the elements in the container.
+ * @since 1.0.0
+ */
+public class ImmutableChangeAwareListView extends ReadOnlyChangeAwareList {
+
+ private final Supplier> listSupplier;
+
+ /**
+ * The constructor.
+ *
+ * @param listSupplied the {@link Supplier} of the internal (mutable) {@link List} to adopt.
+ */
+ public ImmutableChangeAwareListView(Supplier> listSupplied) {
+
+ super();
+ this.listSupplier = listSupplied;
+ }
+
+ @Override
+ public E get(int index) {
+
+ return this.listSupplier.get().get(index);
+ }
+
+ @Override
+ public int size() {
+
+ return this.listSupplier.get().size();
+ }
+
+ @Override
+ public int indexOf(Object element) {
+
+ return this.listSupplier.get().indexOf(element);
+ }
+
+ @Override
+ public int lastIndexOf(Object element) {
+
+ return this.listSupplier.get().lastIndexOf(element);
+ }
+
+ @Override
+ public boolean contains(Object element) {
+
+ return this.listSupplier.get().contains(element);
+ }
+
+ @Override
+ public boolean containsAll(Collection> collection) {
+
+ return this.listSupplier.get().containsAll(collection);
+ }
+
+}
diff --git a/observable/src/main/java/io/github/mmm/value/observable/container/map/ChangeAwareMaps.java b/observable/src/main/java/io/github/mmm/value/observable/container/map/ChangeAwareMaps.java
index 775add1..249fdde 100644
--- a/observable/src/main/java/io/github/mmm/value/observable/container/map/ChangeAwareMaps.java
+++ b/observable/src/main/java/io/github/mmm/value/observable/container/map/ChangeAwareMaps.java
@@ -1,86 +1,101 @@
-/* Copyright (c) The m-m-m Team, Licensed under the Apache License, Version 2.0
- * http://www.apache.org/licenses/LICENSE-2.0 */
-package io.github.mmm.value.observable.container.map;
-
-import java.util.Map;
-import java.util.Set;
-
-import io.github.mmm.value.observable.container.list.ChangeAwareList;
-import io.github.mmm.value.observable.container.map.impl.ChangeAwareMapImpl;
-import io.github.mmm.value.observable.container.map.impl.EmptyChangeAwareMap;
-import io.github.mmm.value.observable.container.map.impl.ImmutableChangeAwareMap;
-
-/**
- * Factory for {@link ChangeAwareMap}.
- *
- * @since 1.0.0
- */
-public final class ChangeAwareMaps {
-
- private ChangeAwareMaps() {
-
- super();
- }
-
- /**
- * @param type of the {@link Map#containsKey(Object) keys}.
- * @param type of the {@link Map#containsValue(Object) values}.
- * @return an empty, immutable {@link ChangeAwareMap}.
- */
- public static ChangeAwareMap empty() {
-
- return EmptyChangeAwareMap.INSTANCE;
- }
-
- /**
- * @param type of the {@link Map#containsKey(Object) keys}.
- * @param type of the {@link Map#containsValue(Object) values}.
- * @return a new empty mutable {@link ChangeAwareMap}.
- */
- public static ChangeAwareMap of() {
-
- return new ChangeAwareMapImpl<>();
- }
-
- /**
- * @param type of the {@link Map#containsKey(Object) keys}.
- * @param type of the {@link Map#containsValue(Object) values}.
- * @param capacity the initial capacity of the map.
- * @return a new empty mutable {@link ChangeAwareMap}.
- */
- public static ChangeAwareMap of(int capacity) {
-
- return new ChangeAwareMapImpl<>(capacity);
- }
-
- /**
- * @param type of the {@link Map#containsKey(Object) keys}.
- * @param type of the {@link Map#containsValue(Object) values}.
- * @param map the existing {@link Set} implementation to wrap as {@link ChangeAwareMap}. Please avoid to modify this
- * {@link Map} afterwards, as this will not trigger modification events.
- * @return a new empty mutable {@link ChangeAwareMap}.
- */
- public static ChangeAwareMap of(Map map) {
-
- if (map instanceof ChangeAwareMap) {
- return (ChangeAwareMap) map;
- }
- return new ChangeAwareMapImpl<>(map);
- }
-
- /**
- * @param type of the {@link Map#containsKey(Object) keys}.
- * @param type of the {@link Map#containsValue(Object) values}.
- * @param map the existing {@link Map} implementation to wrap as {@link ChangeAwareMap}. Please avoid to modify this
- * {@link Map} afterwards, as this will not trigger modification events.
- * @return a new empty mutable {@link ChangeAwareList}.
- */
- public static ChangeAwareMap ofUnmodifiable(Map map) {
-
- if (map instanceof ImmutableChangeAwareMap) {
- return (ChangeAwareMap) map;
- }
- return new ImmutableChangeAwareMap<>(map);
- }
-
-}
+/* Copyright (c) The m-m-m Team, Licensed under the Apache License, Version 2.0
+ * http://www.apache.org/licenses/LICENSE-2.0 */
+package io.github.mmm.value.observable.container.map;
+
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Supplier;
+
+import io.github.mmm.value.observable.container.map.impl.ChangeAwareMapImpl;
+import io.github.mmm.value.observable.container.map.impl.EmptyChangeAwareMap;
+import io.github.mmm.value.observable.container.map.impl.ImmutableChangeAwareMap;
+import io.github.mmm.value.observable.container.map.impl.ImmutableChangeAwareMapView;
+
+/**
+ * Factory for {@link ChangeAwareMap}.
+ *
+ * @since 1.0.0
+ */
+public final class ChangeAwareMaps {
+
+ private ChangeAwareMaps() {
+
+ super();
+ }
+
+ /**
+ * @param type of the {@link Map#containsKey(Object) keys}.
+ * @param type of the {@link Map#containsValue(Object) values}.
+ * @return an empty, immutable {@link ChangeAwareMap}.
+ */
+ public static ChangeAwareMap empty() {
+
+ return EmptyChangeAwareMap.INSTANCE;
+ }
+
+ /**
+ * @param type of the {@link Map#containsKey(Object) keys}.
+ * @param type of the {@link Map#containsValue(Object) values}.
+ * @return a new empty mutable {@link ChangeAwareMap}.
+ */
+ public static ChangeAwareMap of() {
+
+ return new ChangeAwareMapImpl<>();
+ }
+
+ /**
+ * @param type of the {@link Map#containsKey(Object) keys}.
+ * @param type of the {@link Map#containsValue(Object) values}.
+ * @param capacity the initial capacity of the map.
+ * @return a new empty mutable {@link ChangeAwareMap}.
+ */
+ public static ChangeAwareMap of(int capacity) {
+
+ return new ChangeAwareMapImpl<>(capacity);
+ }
+
+ /**
+ * @param type of the {@link Map#containsKey(Object) keys}.
+ * @param type of the {@link Map#containsValue(Object) values}.
+ * @param map the existing {@link Set} implementation to wrap as {@link ChangeAwareMap}. Please avoid to modify this
+ * {@link Map} afterwards, as this will not trigger modification events.
+ * @return a new empty mutable {@link ChangeAwareMap}.
+ */
+ public static ChangeAwareMap of(Map map) {
+
+ if (map instanceof ChangeAwareMap) {
+ return (ChangeAwareMap) map;
+ }
+ return new ChangeAwareMapImpl<>(map);
+ }
+
+ /**
+ * @param type of the {@link Map#containsKey(Object) keys}.
+ * @param type of the {@link Map#containsValue(Object) values}.
+ * @param map the existing {@link Map} implementation to wrap as {@link ChangeAwareMap}. Modifying such {@link Map}
+ * afterwards will not trigger modification events in the read-only view returned by this method.
+ * @return a unmodifiable {@link ChangeAwareMap} that acts as a view on the given {@link Map}.
+ */
+ public static ChangeAwareMap ofUnmodifiable(Map map) {
+
+ if (map instanceof ImmutableChangeAwareMap) {
+ return (ChangeAwareMap) map;
+ }
+ return new ImmutableChangeAwareMap<>(map);
+ }
+
+ /**
+ * @param type of the {@link Map#containsKey(Object) keys}.
+ * @param type of the {@link Map#containsValue(Object) values}.
+ * @param mapSupplier the {@link Supplier} to the (mutable) {@link Map} implementation to wrap as
+ * {@link ChangeAwareMap}. Modifying such {@link Map} afterwards will not trigger modification events in the
+ * read-only view returned by this method.
+ * @return a unmodifiable {@link ChangeAwareMap} that acts as a view on the {@link Supplier#get() supplied}
+ * {@link Map}.
+ */
+ public static ChangeAwareMap ofUnmodifiable(Supplier