Index: lemon/edge_set.h
===================================================================
--- lemon/edge_set.h	(revision 1979)
+++ lemon/edge_set.h	(revision 1990)
@@ -21,4 +21,5 @@
 
 
+#include <lemon/bits/default_map.h>
 #include <lemon/bits/edge_set_extender.h>
 
@@ -46,5 +47,5 @@
     };
 
-    typedef typename Graph::template NodeMap<NodeT> NodesImplBase;
+    typedef DefaultMap<Graph, Node, NodeT> NodesImplBase;
 
     NodesImplBase* nodes;
@@ -197,4 +198,10 @@
     Node target(const Edge& edge) const { return edges[edge.id].target;}
 
+    typedef typename ItemSetTraits<Graph, Node>::ItemNotifier NodeNotifier;
+
+    NodeNotifier& getNotifier(Node) const {
+      return graph->getNotifier(Node());
+    } 
+
     template <typename _Value>
     class NodeMap : public Graph::template NodeMap<_Value> {
@@ -405,5 +412,5 @@
     };
 
-    typedef typename Graph::template NodeMap<NodeT> NodesImplBase;
+    typedef DefaultMap<Graph, Node, NodeT> NodesImplBase;
 
     NodesImplBase* nodes;
@@ -506,4 +513,10 @@
     Node target(const Edge& edge) const { return edges[edge.id].target;}
 
+    typedef typename ItemSetTraits<Graph, Node>::ItemNotifier NodeNotifier;
+
+    NodeNotifier& getNotifier(Node) const {
+      return graph->getNotifier(Node());
+    } 
+
     template <typename _Value>
     class NodeMap : public Graph::template NodeMap<_Value> {
Index: lemon/graph_utils.h
===================================================================
--- lemon/graph_utils.h	(revision 1981)
+++ lemon/graph_utils.h	(revision 1990)
@@ -29,5 +29,7 @@
 #include <lemon/maps.h>
 #include <lemon/traits.h>
+
 #include <lemon/bits/alteration_notifier.h>
+#include <lemon/bits/default_map.h>
 
 ///\ingroup gutils
@@ -901,6 +903,6 @@
   /// \param _Map A ReadWriteMap mapping from the item type to integer.
   template <
-    typename _Graph, typename _Item, typename _Value, typename _Map 
-    = typename ItemSetTraits<_Graph, _Item>::template Map<_Value>::Parent 
+    typename _Graph, typename _Item, typename _Value, 
+    typename _Map = DefaultMap<_Graph, _Item, _Value>
   >
 #else
@@ -1106,6 +1108,6 @@
   /// \param _Map A ReadWriteMap mapping from the item type to integer.
   template <
-    typename _Graph, typename _Item, typename _Map 
-    = typename ItemSetTraits<_Graph, _Item>::template Map<int>::Parent 
+    typename _Graph, typename _Item,
+    typename _Map = DefaultMap<_Graph, _Item, int>
   >
 #else
@@ -1506,12 +1508,9 @@
   private:
 
-    class AutoNodeMap : public Graph::template NodeMap<int> {
+    class AutoNodeMap : public DefaultMap<_Graph, Key, int> {
     public:
 
-      typedef typename Graph::template NodeMap<int> Parent;
-
-      typedef typename Parent::Key Key;
-      typedef typename Parent::Value Value;
-      
+      typedef DefaultMap<_Graph, Key, int> Parent;
+
       AutoNodeMap(const Graph& graph) : Parent(graph, 0) {}
       
@@ -1623,12 +1622,9 @@
   private:
 
-    class AutoNodeMap : public Graph::template NodeMap<int> {
+    class AutoNodeMap : public DefaultMap<_Graph, Key, int> {
     public:
 
-      typedef typename Graph::template NodeMap<int> Parent;
-
-      typedef typename Parent::Key Key;
-      typedef typename Parent::Value Value;
-      
+      typedef DefaultMap<_Graph, Key, int> Parent;
+
       AutoNodeMap(const Graph& graph) : Parent(graph, 0) {}
       
@@ -1664,5 +1660,5 @@
     }
     
-    /// Gives back the in-degree of a Node.
+    /// Gives back the out-degree of a Node.
     int operator[](const Key& key) const {
       return deg[key];
Index: lemon/iterable_maps.h
===================================================================
--- lemon/iterable_maps.h	(revision 1956)
+++ lemon/iterable_maps.h	(revision 1990)
@@ -20,4 +20,6 @@
 #include <lemon/invalid.h>
 
+#include <lemon/bits/default_map.h>
+
 #include <vector>
 #include <map>
@@ -48,12 +50,10 @@
   /// \param _Item One of the graph's item type, the key of the map.
   template <typename _Graph, typename _Item>
-  class IterableBoolMap 
-    : protected ItemSetTraits<_Graph, _Item>::template Map<int>::Parent {
+  class IterableBoolMap : protected DefaultMap<_Graph, _Item, int> {
   private:
     typedef _Graph Graph;
     
     typedef typename ItemSetTraits<Graph, _Item>::ItemIt KeyIt;
-    typedef typename ItemSetTraits<Graph, _Item>
-    ::template Map<int>::Parent Parent;
+    typedef DefaultMap<_Graph, _Item, int> Parent;
     
     std::vector<_Item> array;
@@ -400,10 +400,11 @@
   /// \param _Item One of the graph's item type, the key of the map.
   template <typename _Graph, typename _Item>
-  class IterableIntMap : protected ItemSetTraits<_Graph, _Item> 
-  ::template Map<_iterable_maps_bits::IterableIntMapNode<_Item> >::Parent {
+  class IterableIntMap 
+    : protected DefaultMap<_Graph, _Item, _iterable_maps_bits::
+                           IterableIntMapNode<_Item> > {
   public:
-    typedef typename ItemSetTraits<_Graph, _Item> 
-    ::template Map<_iterable_maps_bits::IterableIntMapNode<_Item> >
-    ::Parent Parent;
+    typedef DefaultMap<_Graph, _Item, _iterable_maps_bits::
+                       IterableIntMapNode<_Item> >
+    Parent;
 
     /// The key type
@@ -688,11 +689,10 @@
   /// \param _Value Any comparable value type.
   template <typename _Graph, typename _Item, typename _Value>
-  class IterableValueMap : protected ItemSetTraits<_Graph, _Item> 
-  ::template Map<_iterable_maps_bits::IterableValueMapNode<_Item, _Value> >
-  ::Parent {
+  class IterableValueMap 
+    : protected DefaultMap<_Graph, _Item, _iterable_maps_bits::
+                           IterableValueMapNode<_Item, _Value> > {
   public:
-    typedef typename ItemSetTraits<_Graph, _Item> 
-    ::template Map<_iterable_maps_bits::IterableValueMapNode<_Item, _Value> >
-    ::Parent Parent;
+    typedef DefaultMap<_Graph, _Item, _iterable_maps_bits::
+                       IterableValueMapNode<_Item, _Value> > Parent;
 
     /// The key type
@@ -703,4 +703,10 @@
     typedef _Graph Graph;
 
+  protected:
+
+    typedef typename ItemSetTraits<_Graph, Key>::ItemIt KeyIt; 
+
+  public:
+
     /// \brief Constructor of the Map with a given value.
     ///
@@ -708,12 +714,12 @@
     explicit IterableValueMap(const Graph& graph, 
                               const Value& value = Value()) 
-      : Parent(graph, _iterable_maps_bits::IterableValueMapNode<_Item, 
-               _Value>(value)) {
-      for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
+      : Parent(graph, _iterable_maps_bits::
+               IterableValueMapNode<_Item, _Value>(value)) {
+      for (KeyIt it(*Parent::getGraph()); it != INVALID; ++it) {
         lace(it);
       }
     }
 
-  private:
+  protected:
     
     void unlace(const Key& key) {
@@ -872,4 +878,16 @@
   protected:
     
+    virtual void add(const Key& key) {
+      Parent::add(key);
+      unlace(key);
+    }
+
+    virtual void add(const std::vector<Key>& keys) {
+      Parent::add(keys);
+      for (int i = 0; i < (int)keys.size(); ++i) {
+        lace(keys[i]);
+      }
+    }
+
     virtual void erase(const Key& key) {
       unlace(key);
@@ -884,4 +902,11 @@
     }
 
+    virtual void build() {
+      Parent::build();
+      for (KeyIt it(*Parent::getGraph()); it != INVALID; ++it) {
+        lace(it);
+      }
+    }
+
     virtual void clear() {
       first.clear();
Index: lemon/sub_graph.h
===================================================================
--- lemon/sub_graph.h	(revision 1979)
+++ lemon/sub_graph.h	(revision 1990)
@@ -21,4 +21,6 @@
 
 #include <lemon/graph_adaptor.h>
+#include <lemon/bits/graph_adaptor_extender.h>
+#include <lemon/bits/default_map.h>
 
 namespace lemon {
@@ -243,8 +245,8 @@
       Edge firstIn, firstOut;
     };
-    class NodesImpl : public Graph::template NodeMap<NodeT> {
+    class NodesImpl : public DefaultMap<Graph, Node, NodeT> {
       friend class SubGraphBase;
     public:
-      typedef typename Graph::template NodeMap<NodeT> Parent;
+      typedef DefaultMap<Graph, Node, NodeT> Parent;
 
       NodesImpl(SubGraph& _adaptor, const Graph& _graph) 
@@ -306,8 +308,8 @@
       Edge prevIn, nextIn;
     };
-    class EdgesImpl : public Graph::template EdgeMap<EdgeT> {
+    class EdgesImpl : public DefaultMap<Graph, Edge, EdgeT> {
       friend class SubGraphBase;
     public:
-      typedef typename Graph::template EdgeMap<EdgeT> Parent;
+      typedef DefaultMap<Graph, Edge, EdgeT> Parent;
 
       EdgesImpl(SubGraph& _adaptor, const Graph& _graph) 
@@ -561,8 +563,8 @@
       Edge firstIn, firstOut;
     };
-    class NodesImpl : public Graph::template NodeMap<NodeT> {
+    class NodesImpl : public DefaultMap<Graph, Node, NodeT> {
       friend class EdgeSubGraphBase;
     public:
-      typedef typename Graph::template NodeMap<NodeT> Parent;
+      typedef DefaultMap<Graph, Node, NodeT> Parent;
 
       NodesImpl(SubGraph& _adaptor, const Graph& _graph) 
@@ -604,8 +606,8 @@
       Edge prevIn, nextIn;
     };
-    class EdgesImpl : public Graph::template EdgeMap<EdgeT> {
+    class EdgesImpl : public DefaultMap<Graph, Edge, EdgeT> {
       friend class EdgeSubGraphBase;
     public:
-      typedef typename Graph::template EdgeMap<EdgeT> Parent;
+      typedef DefaultMap<Graph, Edge, EdgeT> Parent;
 
       EdgesImpl(SubGraph& _adaptor, const Graph& _graph) 
Index: test/edge_set_test.cc
===================================================================
--- test/edge_set_test.cc	(revision 1962)
+++ test/edge_set_test.cc	(revision 1990)
@@ -18,5 +18,5 @@
 using namespace lemon::concept;
 
-typedef StaticGraph Graph;
+typedef SmartGraph Graph;
 
 int main() {
