Index: lemon/bellman_ford.h
===================================================================
--- lemon/bellman_ford.h	(revision 2111)
+++ lemon/bellman_ford.h	(revision 2151)
@@ -193,5 +193,5 @@
     class UninitializedParameter : public lemon::UninitializedParameter {
     public:
-      virtual const char* exceptionName() const {
+      virtual const char* what() const throw() {
 	return "lemon::BellmanFord::UninitializedParameter";
       }
Index: lemon/bfs.h
===================================================================
--- lemon/bfs.h	(revision 2033)
+++ lemon/bfs.h	(revision 2151)
@@ -143,5 +143,5 @@
     class UninitializedParameter : public lemon::UninitializedParameter {
     public:
-      virtual const char* exceptionName() const {
+      virtual const char* what() const throw() {
 	return "lemon::Bfs::UninitializedParameter";
       }
Index: lemon/bipartite_matching.h
===================================================================
--- lemon/bipartite_matching.h	(revision 2136)
+++ lemon/bipartite_matching.h	(revision 2151)
@@ -594,5 +594,5 @@
     class UninitializedParameter : public lemon::UninitializedParameter {
     public:
-      virtual const char* exceptionName() const {
+      virtual const char* what() const throw() {
 	return "lemon::MaxWeightedBipartiteMatching::UninitializedParameter";
       }
@@ -1165,5 +1165,5 @@
     class UninitializedParameter : public lemon::UninitializedParameter {
     public:
-      virtual const char* exceptionName() const {
+      virtual const char* what() const throw() {
 	return "lemon::MinCostMaxBipartiteMatching::UninitializedParameter";
       }
Index: lemon/bits/utility.h
===================================================================
--- lemon/bits/utility.h	(revision 2078)
+++ lemon/bits/utility.h	(revision 2151)
@@ -162,5 +162,5 @@
     struct WrongStateError : public lemon::LogicError {
     public:
-      virtual const char* exceptionName() const {
+      virtual const char* what() const throw() {
         return "lemon::BiVariant::WrongStateError";
       }
Index: lemon/dag_shortest_path.h
===================================================================
--- lemon/dag_shortest_path.h	(revision 2111)
+++ lemon/dag_shortest_path.h	(revision 2151)
@@ -303,5 +303,5 @@
     class UninitializedParameter : public lemon::UninitializedParameter {
     public:
-      virtual const char* exceptionName() const {
+      virtual const char* what() const throw() {
 	return "lemon::DagShortestPath::UninitializedParameter";
       }
Index: lemon/dfs.h
===================================================================
--- lemon/dfs.h	(revision 2092)
+++ lemon/dfs.h	(revision 2151)
@@ -144,5 +144,5 @@
     class UninitializedParameter : public lemon::UninitializedParameter {
     public:
-      virtual const char* exceptionName() const {
+      virtual const char* what() const throw() {
 	return "lemon::Dfs::UninitializedParameter";
       }
@@ -1224,5 +1224,5 @@
     class UninitializedParameter : public lemon::UninitializedParameter {
     public:
-      virtual const char* exceptionName() const {
+      virtual const char* what() const throw() 
 	return "lemon::DfsVisit::UninitializedParameter";
       }
Index: lemon/dijkstra.h
===================================================================
--- lemon/dijkstra.h	(revision 2111)
+++ lemon/dijkstra.h	(revision 2151)
@@ -188,5 +188,5 @@
     class UninitializedParameter : public lemon::UninitializedParameter {
     public:
-      virtual const char* exceptionName() const {
+      virtual const char* what() const throw() {
 	return "lemon::Dijkstra::UninitializedParameter";
       }
Index: lemon/edge_set.h
===================================================================
--- lemon/edge_set.h	(revision 2116)
+++ lemon/edge_set.h	(revision 2151)
@@ -587,5 +587,5 @@
     class UnsupportedOperation : public LogicError {
     public:
-      virtual const char* exceptionName() const {
+      virtual const char* what() const throw() {
         return "lemon::SmartEdgeSet::UnsupportedOperation";
       }
@@ -684,5 +684,5 @@
     class UnsupportedOperation : public LogicError {
     public:
-      virtual const char* exceptionName() const {
+      virtual const char* what() const throw() {
         return "lemon::SmartUEdgeSet::UnsupportedOperation";
       }
Index: lemon/edmonds_karp.h
===================================================================
--- lemon/edmonds_karp.h	(revision 2113)
+++ lemon/edmonds_karp.h	(revision 2151)
@@ -71,5 +71,5 @@
     class InvalidArgument : public lemon::LogicError {
     public:
-      virtual const char* exceptionName() const {
+      virtual const char* what() const throw() {
 	return "lemon::EdmondsKarp::InvalidArgument";
       }
Index: lemon/error.h
===================================================================
--- lemon/error.h	(revision 2150)
+++ lemon/error.h	(revision 2151)
@@ -177,13 +177,7 @@
     ///\e 
     virtual ~Exception() throw() {}
-
-    ///\e
-    virtual const char* exceptionName() const {
+    ///\e 
+    virtual const char* what() const throw() {
       return "lemon::Exception";
-    }
-    
-    ///\e 
-    virtual const char* what() const throw() {
-      return exceptionName();
     }
   };
@@ -200,5 +194,5 @@
   class LogicError : public Exception {
   public:
-    virtual const char* exceptionName() const {
+    virtual const char* what() const throw() {
       return "lemon::LogicError";
     }
@@ -213,5 +207,5 @@
   class UninitializedParameter : public LogicError {
   public:
-    virtual const char* exceptionName() const {
+    virtual const char* what() const throw() {
       return "lemon::UninitializedParameter";
     }
@@ -228,5 +222,5 @@
   class RuntimeError : public Exception {
   public:
-    virtual const char* exceptionName() const {
+    virtual const char* what() const throw() {
       return "lemon::RuntimeError";
     }
@@ -236,5 +230,5 @@
   class RangeError : public RuntimeError {
   public:
-    virtual const char* exceptionName() const {
+    virtual const char* what() const throw() {
       return "lemon::RangeError";
     }
@@ -244,5 +238,5 @@
   class IOError : public RuntimeError {
   public:
-    virtual const char* exceptionName() const {
+    virtual const char* what() const throw() {
       return "lemon::IOError";
     }
@@ -305,5 +299,5 @@
       try {
 	std::ostringstream ostr;
-	ostr << exceptionName() << ": ";
+	ostr << "lemon:DataFormatError" << ": ";
 	if (message()) ostr << message();
 	if( file() || line() != 0 ) {
@@ -318,9 +312,5 @@
       catch (...) {}
       if( _message_holder.valid()) return _message_holder.get().c_str();
-      return exceptionName();
-    }
-
-    virtual const char* exceptionName() const {
-      return "lemon::DataFormatError";
+      return "lemon:DataFormatError";
     }
 
@@ -362,5 +352,5 @@
       try {
 	std::ostringstream ostr;
-	ostr << exceptionName() << ": ";
+	ostr << "lemon::FileOpenError" << ": ";
 	ostr << "Cannot open file - " << file();
 	_message_holder.set(ostr.str());
@@ -368,11 +358,6 @@
       catch (...) {}
       if( _message_holder.valid()) return _message_holder.get().c_str();
-      return exceptionName();
-    }
-
-    virtual const char* exceptionName() const {
       return "lemon::FileOpenError";
     }
-
     virtual ~FileOpenError() throw() {}
   };
@@ -432,11 +417,6 @@
       catch (...) {}
       if( _message_holder.valid() ) return _message_holder.get().c_str();
-      return exceptionName();
-    }
-
-    virtual const char* exceptionName() const {
-      return "lemon::IOParameterError";
-    }
-
+      return "lemon:IOParameterError";
+    }
     virtual ~IOParameterError() throw() {}
   };
@@ -486,12 +466,7 @@
       catch(...) {}
       if( _message_holder.valid() ) return _message_holder.get().c_str();
-      return exceptionName();
-    }
-
-    virtual const char* exceptionName() const {
       return "lemon::AssertionFailedError";
     }
-
-    virtual ~AssertionFailedError() throw() {}
+   virtual ~AssertionFailedError() throw() {}
   };
 
Index: lemon/floyd_warshall.h
===================================================================
--- lemon/floyd_warshall.h	(revision 2111)
+++ lemon/floyd_warshall.h	(revision 2151)
@@ -200,5 +200,5 @@
     class UninitializedParameter : public lemon::UninitializedParameter {
     public:
-      virtual const char* exceptionName() const {
+      virtual const char* what() const throw() {
 	return "lemon::FloydWarshall::UninitializedParameter";
       }
Index: lemon/fredman_tarjan.h
===================================================================
--- lemon/fredman_tarjan.h	(revision 2050)
+++ lemon/fredman_tarjan.h	(revision 2151)
@@ -133,5 +133,5 @@
     class UninitializedParameter : public lemon::UninitializedParameter {
     public:
-      virtual const char* exceptionName() const {
+      virtual const char* what() const throw() {
 	return "lemon::FredmanTarjan::UninitializedParameter";
       }
Index: lemon/full_graph.h
===================================================================
--- lemon/full_graph.h	(revision 2116)
+++ lemon/full_graph.h	(revision 2151)
@@ -500,5 +500,5 @@
 
     class NodeSetError : public LogicError {
-      virtual const char* exceptionName() const { 
+      virtual const char* what() const throw() { 
 	return "lemon::FullBpUGraph::NodeSetError";
       }
Index: lemon/grid_ugraph.h
===================================================================
--- lemon/grid_ugraph.h	(revision 2116)
+++ lemon/grid_ugraph.h	(revision 2151)
@@ -118,5 +118,5 @@
     class IndexError : public RuntimeError {
     public:
-      virtual const char* exceptionName() const {
+      virtual const char* what() const throw() {
         return "lemon::GridUGraph::IndexError";
       }  
Index: lemon/johnson.h
===================================================================
--- lemon/johnson.h	(revision 2111)
+++ lemon/johnson.h	(revision 2151)
@@ -235,5 +235,5 @@
     class UninitializedParameter : public lemon::UninitializedParameter {
     public:
-      virtual const char* exceptionName() const {
+      virtual const char* what() const throw() {
 	return "lemon::Johnson::UninitializedParameter";
       }
Index: lemon/list_graph.h
===================================================================
--- lemon/list_graph.h	(revision 2132)
+++ lemon/list_graph.h	(revision 2151)
@@ -509,5 +509,5 @@
       class UnsupportedOperation : public LogicError {
       public:
-	virtual const char* exceptionName() const {
+	virtual const char* what() const throw() {
 	  return "lemon::ListGraph::Snapshot::UnsupportedOperation";
 	}
@@ -842,5 +842,5 @@
 
     class NodeSetError : public LogicError {
-      virtual const char* exceptionName() const { 
+      virtual const char* what() const throw() { 
 	return "lemon::ListBpUGraph::NodeSetError";
       }
Index: lemon/min_cost_arborescence.h
===================================================================
--- lemon/min_cost_arborescence.h	(revision 2111)
+++ lemon/min_cost_arborescence.h	(revision 2151)
@@ -139,5 +139,5 @@
     class UninitializedParameter : public lemon::UninitializedParameter {
     public:
-      virtual const char* exceptionName() const {
+      virtual const char* what() const throw() {
 	return "lemon::MinCostArborescence::UninitializedParameter";
       }
Index: lemon/min_cut.h
===================================================================
--- lemon/min_cut.h	(revision 2116)
+++ lemon/min_cut.h	(revision 2151)
@@ -208,5 +208,5 @@
     class UninitializedParameter : public lemon::UninitializedParameter {
     public:
-      virtual const char* exceptionName() const {
+      virtual const char* what() const throw() {
 	return "lemon::MaxCardinalitySearch::UninitializedParameter";
       }
@@ -859,5 +859,5 @@
     class UninitializedParameter : public lemon::UninitializedParameter {
     public:
-      virtual const char* exceptionName() const {
+      virtual const char* what() const throw() {
 	return "lemon::MinCut::UninitializedParameter";
       }
Index: lemon/preflow.h
===================================================================
--- lemon/preflow.h	(revision 2033)
+++ lemon/preflow.h	(revision 2151)
@@ -103,5 +103,5 @@
     class InvalidArgument : public lemon::LogicError {
     public:
-      virtual const char* exceptionName() const {
+      virtual const char* what() const throw() {
 	return "lemon::Preflow::InvalidArgument";
       }
Index: lemon/prim.h
===================================================================
--- lemon/prim.h	(revision 2042)
+++ lemon/prim.h	(revision 2151)
@@ -188,5 +188,5 @@
     class UninitializedParameter : public lemon::UninitializedParameter {
     public:
-      virtual const char* exceptionName() const {
+      virtual const char* what() const throw() {
 	return "lemon::Prim::UninitializedParameter";
       }
Index: lemon/radix_heap.h
===================================================================
--- lemon/radix_heap.h	(revision 2050)
+++ lemon/radix_heap.h	(revision 2151)
@@ -38,5 +38,5 @@
   class UnderFlowPriorityError : public RuntimeError {
   public:
-    virtual const char* exceptionName() const {
+    virtual const char* what() const throw() {
       return "lemon::UnderFlowPriorityError";
     }  
Index: lemon/refptr.h
===================================================================
--- lemon/refptr.h	(revision 1977)
+++ lemon/refptr.h	(revision 2151)
@@ -46,6 +46,8 @@
     void attach(RefPtr &r) 
     {
-      prev=&r; next=r.next; ref=r.ref;
-      r.next=this;
+      if(r.ref) {
+	prev=&r; next=r.next; ref=r.ref;
+	r.next=this;
+      }
     }
     void attach(const T *p) 
@@ -140,4 +142,28 @@
     operator bool() const { return ref; }
 
+    ///\e
+    const RefPtr &borrow(const T* &p) { 
+      lock();
+      if(ref==p) {
+	if(prev) prev->next=next;
+	if(next) next->prev=prev;
+      }
+      else release();
+      ref=p;
+      next=prev=this;
+      unlock();
+      return *this;
+    }
+    
+    ///\e
+    const RefPtr &borrow() { 
+      lock();
+      if(prev) prev->next=next;
+      if(next) next->prev=prev;
+      next=prev=this;
+      unlock();
+      return *this;
+    }
+    
   };  //END OF CLASS REFPTR
   
Index: lemon/smart_graph.h
===================================================================
--- lemon/smart_graph.h	(revision 2132)
+++ lemon/smart_graph.h	(revision 2151)
@@ -432,5 +432,5 @@
 
     class NodeSetError : public LogicError {
-      virtual const char* exceptionName() const { 
+      virtual const char* what() const throw() { 
 	return "lemon::SmartBpUGraph::NodeSetError";
       }
Index: lemon/tabu_search.h
===================================================================
--- lemon/tabu_search.h	(revision 2067)
+++ lemon/tabu_search.h	(revision 2151)
@@ -342,5 +342,5 @@
     class BadParameterError : public lemon::LogicError {
     public:
-      virtual const char* exceptionName() const {
+      virtual const char* what() const throw() {
         return "lemon::TabuSearch::BadParameterError";
       }
