Index: lemon/graph_utils.h
===================================================================
--- lemon/graph_utils.h	(revision 1811)
+++ lemon/graph_utils.h	(revision 1829)
@@ -111,6 +111,5 @@
 
   template <typename Graph>
-  inline
-  typename enable_if<typename Graph::NodeNumTag, int>::type
+  inline typename enable_if<typename Graph::NodeNumTag, int>::type
   _countNodes(const Graph &g) {
     return g.nodeNum();
@@ -138,6 +137,5 @@
 
   template <typename Graph>
-  inline
-  typename enable_if<typename Graph::EdgeNumTag, int>::type
+  inline typename enable_if<typename Graph::EdgeNumTag, int>::type
   _countEdges(const Graph &g) {
     return g.edgeNum();
@@ -421,5 +419,5 @@
     ConUndirEdgeIt& operator++() {
       Parent::operator=(findUndirEdge(graph, graph.source(*this), 
-				 graph.target(*this), *this));
+				      graph.target(*this), *this));
       return *this;
     }
@@ -939,12 +937,4 @@
   protected:
 
-    /// \brief Add a new key to the map.
-    ///
-    /// Add a new key to the map. It is called by the
-    /// \c AlterationNotifier.
-    virtual void add(const Key& key) {
-      Map::add(key);
-    }
-
     /// \brief Erase the key from the map.
     ///
@@ -958,4 +948,19 @@
       }
       Map::erase(key);
+    }
+
+    /// \brief Erase more keys from the map.
+    ///
+    /// Erase more keys from the map. It is called by the
+    /// \c AlterationNotifier.
+    virtual void erase(const std::vector<Key>& keys) {
+      for (int i = 0; i < (int)keys.size(); ++i) {
+	Value val = Map::operator[](keys[i]);
+	typename Container::iterator it = invMap.find(val);
+	if (it != invMap.end() && it->second == keys[i]) {
+	  invMap.erase(it);
+	}
+      }
+      Map::erase(keys);
     }
 
@@ -1071,7 +1076,19 @@
     }
 
+    /// \brief Add more new keys to the map.
+    ///
+    /// Add more new keys to the map. It is called by the
+    /// \c AlterationNotifier.
+    virtual void add(const std::vector<Item>& items) {
+      Map::add(items);
+      for (int i = 0; i < (int)items.size(); ++i) {
+	Map::set(items[i], invMap.size());
+	invMap.push_back(items[i]);
+      }
+    }
+
     /// \brief Erase the key from the map.
     ///
-    /// Erase the key to the map. It is called by the
+    /// Erase the key from the map. It is called by the
     /// \c AlterationNotifier.
     virtual void erase(const Item& item) {
@@ -1080,4 +1097,17 @@
       invMap.pop_back();
       Map::erase(item);
+    }
+
+    /// \brief Erase more keys from the map.
+    ///
+    /// Erase more keys from the map. It is called by the
+    /// \c AlterationNotifier.
+    virtual void erase(const std::vector<Item>& items) {
+      for (int i = 0; i < (int)items.size(); ++i) {
+	Map::set(invMap.back(), Map::operator[](items[i]));
+	invMap[Map::operator[](items[i])] = invMap.back();
+	invMap.pop_back();
+      }
+      Map::erase(items);
     }
 
@@ -1380,6 +1410,6 @@
   /// \warning Besides addNode() and addEdge(), a graph structure may provide
   /// alternative ways to modify the graph. The correct behavior of InDegMap
-  /// is not guarantied if these additional featureas are used. For example
-  /// the funstions \ref ListGraph::changeSource() "changeSource()",
+  /// is not guarantied if these additional features are used. For example
+  /// the functions \ref ListGraph::changeSource() "changeSource()",
   /// \ref ListGraph::changeTarget() "changeTarget()" and
   /// \ref ListGraph::reverseEdge() "reverseEdge()"
@@ -1410,7 +1440,13 @@
       AutoNodeMap(const Graph& graph) : Parent(graph, 0) {}
       
-      void add(const Key& key) {
+      virtual void add(const Key& key) {
 	Parent::add(key);
 	Parent::set(key, 0);
+      }
+      virtual void add(const std::vector<Key>& keys) {
+	Parent::add(keys);
+	for (int i = 0; i < (int)keys.size(); ++i) {
+	  Parent::set(keys[i], 0);
+	}
       }
     };
@@ -1452,12 +1488,4 @@
     }
 
-    virtual void signalChange(const Edge& edge) {
-      erase(edge);
-    }
-
-    virtual void commitChange(const Edge& edge) {
-      add(edge);
-    }
-
     virtual void build() {
       for(typename _Graph::NodeIt it(graph); it != INVALID; ++it) {
@@ -1486,6 +1514,6 @@
   /// \warning Besides addNode() and addEdge(), a graph structure may provide
   /// alternative ways to modify the graph. The correct behavior of OutDegMap
-  /// is not guarantied if these additional featureas are used. For example
-  /// the funstions \ref ListGraph::changeSource() "changeSource()",
+  /// is not guarantied if these additional features are used. For example
+  /// the functions \ref ListGraph::changeSource() "changeSource()",
   /// \ref ListGraph::changeTarget() "changeTarget()" and
   /// \ref ListGraph::reverseEdge() "reverseEdge()"
@@ -1516,7 +1544,13 @@
       AutoNodeMap(const Graph& graph) : Parent(graph, 0) {}
       
-      void add(const Key& key) {
+      virtual void add(const Key& key) {
 	Parent::add(key);
 	Parent::set(key, 0);
+      }
+      virtual void add(const std::vector<Key>& keys) {
+	Parent::add(keys);
+	for (int i = 0; i < (int)keys.size(); ++i) {
+	  Parent::set(keys[i], 0);
+	}
       }
     };
@@ -1558,13 +1592,4 @@
     }
 
-    virtual void signalChange(const Edge& edge) {
-      erase(edge);
-    }
-
-    virtual void commitChange(const Edge& edge) {
-      add(edge);
-    }
-
-
     virtual void build() {
       for(typename _Graph::NodeIt it(graph); it != INVALID; ++it) {
