diff --git a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/MutableMetaView.kt b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/MutableMetaView.kt
new file mode 100644
index 00000000..6a601940
--- /dev/null
+++ b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/MutableMetaView.kt
@@ -0,0 +1,40 @@
+package space.kscience.dataforge.meta
+
+import space.kscience.dataforge.names.Name
+import space.kscience.dataforge.names.NameToken
+import space.kscience.dataforge.names.plus
+
+/**
+ * A [Meta] child proxy that creates required nodes on write
+ */
+public class MutableMetaView(
+    public val origin: MutableMeta,
+    public val path: Name
+) : MutableMeta {
+
+    override val items: Map<NameToken, MutableMeta>
+        get() = origin[path]?.items ?: emptyMap()
+
+    override var value: Value?
+        get() = origin[path]?.value
+        set(value) {
+            origin[path] = value
+        }
+
+    override fun getOrCreate(name: Name): MutableMeta = MutableMetaView(origin, path + name)
+
+
+    override fun set(name: Name, node: Meta?) {
+        set(path + name, node)
+    }
+
+
+    override fun equals(other: Any?): Boolean = Meta.equals(this, other as? Meta)
+
+
+    override fun hashCode(): Int  = Meta.hashCode(this)
+
+    override fun toString(): String = Meta.toString(this)
+}
+
+public fun MutableMeta.view(name: Name): MutableMetaView = MutableMetaView(this, name)
\ No newline at end of file