Index: lemon/list_graph.h
===================================================================
--- lemon/list_graph.h	(revision 1702)
+++ lemon/list_graph.h	(revision 1718)
@@ -309,9 +309,4 @@
   };
 
-  typedef AlterableGraphExtender<ListGraphBase> AlterableListGraphBase;
-  typedef IterableGraphExtender<AlterableListGraphBase> IterableListGraphBase;
-  typedef MappableGraphExtender<IterableListGraphBase> MappableListGraphBase;
-  typedef ExtendableGraphExtender<MappableListGraphBase> ExtendableListGraphBase;
-  typedef ClearableGraphExtender<ExtendableListGraphBase> ClearableListGraphBase;
   typedef ErasableGraphExtender<
     ClearableGraphExtender<
@@ -321,6 +316,6 @@
     AlterableGraphExtender<ListGraphBase> > > > > > ExtendedListGraphBase;
 
-/// \addtogroup graphs
-/// @{
+  /// \addtogroup graphs
+  /// @{
 
   ///A list graph class.
@@ -343,5 +338,9 @@
     ///referencing the changed edge remain
     ///valid. However <tt>InEdge</tt>'s are invalidated.
-    void changeTarget(Edge e, Node n) { _changeTarget(e,n); }
+    void changeTarget(Edge e, Node n) { 
+      getNotifier(Edge()).signalChange(e); 
+      _changeTarget(e,n); 
+      getNotifier(Edge()).commitChange(e); 
+    }
     /// Changes the source of \c e to \c n
 
@@ -351,5 +350,9 @@
     ///referencing the changed edge remain
     ///valid. However <tt>OutEdge</tt>'s are invalidated.
-    void changeSource(Edge e, Node n) { _changeSource(e,n); }
+    void changeSource(Edge e, Node n) { 
+      getNotifier(Edge()).signalChange(e); 
+      _changeSource(e,n);
+      getNotifier(Edge()).commitChange(e); 
+    }
 
     /// Invert the direction of an edge.
@@ -360,6 +363,8 @@
     void reverseEdge(Edge e) {
       Node t=target(e);
+      getNotifier(Edge()).signalChange(e); 
       _changeTarget(e,source(e));
       _changeSource(e,t);
+      getNotifier(Edge()).commitChange(e); 
     }
 
@@ -383,5 +388,5 @@
     ///valid. However <tt>InEdge</tt>'s and <tt>OutEdge</tt>'s
     ///may be invalidated.
-    void contract(Node a,Node b,bool r=true) 
+    void contract(Node a, Node b, bool r = true) 
     {
       for(OutEdgeIt e(*this,b);e!=INVALID;) {
@@ -563,6 +568,6 @@
     UndirGraphExtender<ListGraphBase> > > > > > > ExtendedUndirListGraphBase;
 
-/// \addtogroup graphs
-/// @{
+  /// \addtogroup graphs
+  /// @{
 
   ///An undirected list graph class.
@@ -579,4 +584,64 @@
   ///
   class UndirListGraph : public ExtendedUndirListGraphBase {
+  public:
+    typedef ExtendedUndirListGraphBase Parent;
+    /// \brief Changes the target of \c e to \c n
+    ///
+    /// Changes the target of \c e to \c n
+    ///
+    /// \note The <tt>Edge</tt>'s and <tt>OutEdge</tt>'s
+    /// referencing the changed edge remain
+    /// valid. However <tt>InEdge</tt>'s are invalidated.
+    void changeTarget(UndirEdge e, Node n) { 
+      getNotifier(UndirEdge()).signalChange(e); 
+      getNotifier(Edge()).signalChange(direct(e, true)); 
+      getNotifier(Edge()).signalChange(direct(e, false)); 
+      _changeTarget(e,n); 
+      getNotifier(UndirEdge()).commitChange(e);
+      getNotifier(Edge()).commitChange(direct(e, true)); 
+      getNotifier(Edge()).commitChange(direct(e, false)); 
+    }
+    /// Changes the source of \c e to \c n
+    ///
+    /// Changes the source of \c e to \c n
+    ///
+    ///\note The <tt>Edge</tt>'s and <tt>InEdge</tt>'s
+    ///referencing the changed edge remain
+    ///valid. However <tt>OutEdge</tt>'s are invalidated.
+    void changeSource(UndirEdge e, Node n) { 
+      getNotifier(UndirEdge()).signalChange(e); 
+      getNotifier(Edge()).signalChange(direct(e, true)); 
+      getNotifier(Edge()).signalChange(direct(e, false)); 
+      _changeSource(e,n); 
+      getNotifier(UndirEdge()).commitChange(e);
+      getNotifier(Edge()).commitChange(direct(e, true)); 
+      getNotifier(Edge()).commitChange(direct(e, false)); 
+    }
+    /// \brief Contract two nodes.
+    ///
+    /// This function contracts two nodes.
+    ///
+    /// Node \p b will be removed but instead of deleting
+    /// its neighboring edges, they will be joined to \p a.
+    /// The last parameter \p r controls whether to remove loops. \c true
+    /// means that loops will be removed.
+    ///
+    /// \note The <tt>Edge</tt>s
+    /// referencing a moved edge remain
+    /// valid.
+    void contract(Node a, Node b, bool r = true) {
+      for(IncEdgeIt e(*this, b); e!=INVALID;) {
+	IncEdgeIt f = e; ++f;
+	if (r && runningNode(e) == a) {
+	  erase(e);
+	} else if (source(e) == b) {
+	  changeSource(e, a);
+	} else {
+	  changeTarget(e, a);
+	}
+	e = f;
+      }
+      erase(b);
+    }
   };
 
