diff --git a/nested/src/index/buffer.rs b/nested/src/index/buffer.rs
new file mode 100644
index 0000000..d48537b
--- /dev/null
+++ b/nested/src/index/buffer.rs
@@ -0,0 +1,81 @@
+
+use {
+    std::{
+        sync::Arc,
+        collections::HashMap,
+        hash::Hash
+    },
+    std::sync::RwLock,
+    crate::{
+        core::{
+            Observer,
+            ObserverBroadcast,
+            View,
+            InnerViewPort
+        },
+        index::IndexView
+    }
+};
+
+pub struct IndexBufferView<Key, Item>(Arc<RwLock<HashMap<Key, Item>>>)
+where Key: Clone + Hash + Eq + Send + Sync + 'static,
+      Item: Clone + Send + Sync + 'static;
+
+impl<Key, Item> View for IndexBufferView<Key, Item>
+where Key: Clone + Hash + Eq + Send + Sync + 'static,
+      Item: Clone + Send + Sync + 'static
+{
+    type Msg = Key;
+}
+
+impl<Key, Item> IndexView<Key> for IndexBufferView<Key, Item>
+where Key: Clone + Hash + Eq + Send + Sync + 'static,
+      Item: Clone + Send + Sync + 'static
+{
+    type Item = Item;
+
+    fn get(&self, key: &Key) -> Option<Self::Item> {
+        self.0.read().unwrap().get(key).cloned()
+    }
+
+    fn area(&self) -> Option<Vec<Key>> {
+        Some(self.0.read().unwrap().keys().cloned().collect())
+    }
+}
+
+
+pub struct IndexBuffer<Key, Item>
+where Key: Clone + Hash + Eq + Send + Sync + 'static,
+      Item: Clone + Send + Sync + 'static
+{
+    data: Arc<RwLock<HashMap<Key, Item>>>,
+    cast: Arc<RwLock<ObserverBroadcast<dyn IndexView<Key, Item = Item>>>>
+}
+
+impl<Key, Item> IndexBuffer<Key, Item>
+where Key: Clone + Hash + Eq + Send + Sync + 'static,
+      Item: Clone + Send + Sync + 'static
+{
+    pub fn new(port: InnerViewPort<dyn IndexView<Key, Item = Item>>) -> Self {
+        let data = Arc::new(RwLock::new(HashMap::<Key, Item>::new()));
+        port.set_view(Some(Arc::new(IndexBufferView(data.clone()))));
+
+        IndexBuffer {
+            data,
+            cast: port.get_broadcast()
+        }
+    }
+
+    pub fn insert(&mut self, key: Key, item: Item) {
+        self.data.write().unwrap().insert(key.clone(), item);
+        self.cast.notify(&key);
+    }
+
+    pub fn insert_iter<T>(&mut self, iter: T)
+    where T: IntoIterator<Item = (Key, Item)> {
+        for (key, item) in iter {
+            self.insert(key, item);
+        }
+    }
+}
+
diff --git a/nested/src/index/mod.rs b/nested/src/index/mod.rs
index 51d42cf..f639ef7 100644
--- a/nested/src/index/mod.rs
+++ b/nested/src/index/mod.rs
@@ -1,6 +1,7 @@
 
 pub mod map_item;
 pub mod map_key;
+pub mod buffer;
 
 use {
     std::{
@@ -46,7 +47,6 @@ impl<Key, V> IndexView<Key> for Arc<V>
 where Key: Send + Sync,
       V: IndexView<Key> + ?Sized
 {
-
     type Item = V::Item;
 
     fn get(&self, key: &Key) -> Option<Self::Item> {